@framers/agentos-ext-document-export

中文文档
0.3.10发布于 2026/11/11Apache-2.0TypeScriptES Module构建来源已验证近 30 天下载 2.4万

生成带有图表、表格和主题的 PDF、DOCX、PPTX、 CSV 和 XLSX 文件

中文使用文档
文档目录11 节
  1. 安装
  2. 扩展包
  3. 标记导出( 浏览器安全)
  4. 通过条目写入归档条目
  5. 档案(浏览器安全)
  6. 多么开放的读取
  7. 名称和种类
  8. 档案必须保存什么
  9. 读取
  10. 日历事件( 浏览器安全)
  11. 标记下体文本( 浏览器安全)

文档导出

从代理结构化内容中生成PDF,DOCX,PPTX,CSV和XLSX等文档. 第二个条目, ./transcript,将笔录写为Markdown、纯文本、JSON、CSV、SRT、VTT、DOCX、HTML碎片或拉链;第三, ./archive,同时读取 ZIP 条目, ./calendar,将一个事件写成 iCalendar 文件和 Google Calendar 的模板地址。 三个运行在浏览器以及节点.

安装

npm install @framers/agentos-ext-document-export

扩展包

import { createExtensionPack } from '@framers/agentos-ext-document-export';

const pack = createExtensionPack({ options: { workspaceDir: '/srv/agent' } });
工具它会做什么
document_export结构化内容(有段落、表格、图表和图像的部分)改为 pdf, (中文(简体) ), docx, (中文(简体) ), pptx, (中文(简体) ), csv 或者说 xlsx,将文件保存在 <workspaceDir>/exports/ 并回答其下载和预览链接
document_suggest读取回复的长度、表格和章节,并说是否提供导出,以及哪种格式,没有模式调用

选项 : workspaceDir (默认:进程的工作文件夹), serverPort (违约377), publicBaseUrl 财务报告和审定财务报表 priority (默认50). 本条目运行于节点:它会将文件写入磁盘并用pdfkit使PDF.

标记导出( 浏览器安全)

@framers/agentos-ext-document-export/transcript 写一个记录和时间, 一个会后包 其行带他们的引文, 和显示在行边的支票。 它只进口 倾销 并且从不触及一个文件系统:每个编剧回答一个字符串或字节,被呼叫者保存.

import type { TranscriptExport } from '@framers/agentos-ext-document-export/transcript';

const doc: TranscriptExport = {
  title: 'Budget review',
  startedAt: '2026-10-08T14:05:00.000Z',
  durationSeconds: 754,
  tags: ['q3'],
  pack: {
    summary: 'The team agreed the budget.',
    decisions: [{ text: 'Budget grows ten percent.', quotes: [{ seq: 2, text: 'we grow the budget by ten percent' }] }],
    actionItems: [{ text: 'Send the slides.', owner: 'Ann', quotes: [{ seq: 3, text: "I'll send the slides" }] }],
    openQuestions: [],
  },
  checks: [{ seq: 2, label: 'Matches your notes', source: 'Note: Budget', sentence: 'Budget up ten percent.' }],
  turns: [
    { seq: 1, startMs: 0, endMs: 2_000, text: 'Shall we start?', speaker: 'You' },
    { seq: 2, startMs: 65_000, endMs: 69_500, text: 'Yes, we grow the budget by ten percent.', speaker: 'Other' },
    { seq: 3, startMs: 70_000, endMs: null, text: "I'll send the slides." },
  ],
};

时间是毫秒 从会话开始。 一个引号 轮到它了 seq作家们也印出时间在旁边 转弯 speaker 是可选的,在显示时会打印.

作家答复
toMarkdown(doc)标记:标题、一行事实、摘要、决定、行动项目和开口问题及其引文、时间和发言者的笔录、每行核对、笔记
toPlainText(doc)同样的没有Markdown标记
toJson(doc)每个记录,与 format: 'transcript-export' 财务报告和审定财务报表 v: 1
toHtml(doc)剪贴板的 HTML 片段: 标题、 有引文的包、 记录和注释、 每行换行符 <br>
actionItemsCsv(doc)作为 CSV 的动作项: 项, 其所有者, 其第一个引用和该引用的时间, 在一个 UTF-8 字节顺序标记之后
toSrt(doc)子里普提示,按其起始数列出,编号从 1 起
toVtt(doc)一个WebVTT文件, 它的提示在其启动时列出
toDocx(doc)带有标题、段落和引用的 Word 文档的字节,每行换行符写为 <w:br/> 每个标签为 <w:tab/>
writeArchive(entries, options?), (中文(简体) ), readArchive(bytes, options?)数个文件的拉链,其文件按顺序读取,文件夹条目被忽略,不超过 maxInflatedBytes (50米B,除非你们经过另一圈),确是膨胀的。 有选项onEntry, (中文(简体) ), signal, (中文(简体) ), mtime, (中文(简体) ), writeArchive 回答承诺并逐项写入条目(下级(中文(简体) )

在"Markdown","plain-text","HTML"和"Word"编剧中,一个没有内容的章节被忽略了:摘要的标题需要一个摘要,列出其条目,注释标题是一些笔记,笔录标题是一转,所以 { ...doc, turns: [] } 在没有记录的情况下写记录.

在这四个作者中,一个文本保留了自己的行间断,包括空行. 在Markdown和纯文本中,一行空白将两行相隔开来,文本起端的行间间断被忽略.

上文记录的每个作者的一个例子:

import {
  actionItemsCsv,
  readArchive,
  toDocx,
  toHtml,
  toJson,
  toMarkdown,
  toPlainText,
  toSrt,
  toVtt,
  writeArchive,
} from '@framers/agentos-ext-document-export/transcript';

toMarkdown(doc);
// # Budget review
//
// Thu, 08 Oct 2026 14:05:00 GMT | 13 minutes | q3
//
// ## Summary
//
// The team agreed the budget.
//
// ## Decisions
//
// - Budget grows ten percent.
//   > "we grow the budget by ten percent" (01:05)
// ...
// **[01:05] Other:** Yes, we grow the budget by ten percent.
//   - Matches your notes: Budget up ten percent. (Note: Budget)

toPlainText(doc);
// ...
// [01:05] Other: Yes, we grow the budget by ten percent.
//   Matches your notes: Budget up ten percent. (Note: Budget)

JSON.parse(toJson(doc)).format;
// 'transcript-export'

toHtml(doc);
// '<h1>Budget review</h1><h2>Summary</h2><p>The team agreed the budget.</p><h2>Decisions</h2><ul><li>...'

actionItemsCsv(doc);
// U+FEFF, the byte order mark, then:
// "Action item","Owner","Quote","Time"
// "Send the slides.","Ann","I'll send the slides","01:10"

toSrt(doc);
// 1
// 00:00:00,000 --> 00:00:02,000
// You: Shall we start?
// ...

toVtt(doc);
// WEBVTT
//
// 00:00:00.000 --> 00:00:02.000
// You: Shall we start?
// ...

const docx: Uint8Array = toDocx(doc);

const zip = writeArchive([
  { path: 'sessions/budget-review.md', data: toMarkdown(doc) },
  { path: 'sessions/budget-review.docx', data: docx },
]);
readArchive(zip).map((entry) => entry.path);
// ['sessions/budget-review.md', 'sessions/budget-review.docx']

CSV以字节顺序标记(U+FEFF,字节EF BB BF曾被编码为UTF-8)开始: Excel 打开 UTF-8 CSV 文件时通常使用一个文件保存,如果没有一个,它就可以在ASCII之外误读文本,包括一个人的名字。 不剥去标记的阅读器会在第一个标题前发现.

字幕会留下一个没有开始的转弯 WebVTT 要求 每一个提示开始时间都不要早于它之前的提示. 同样的开始转动 保持他们的秩序。 一个没有终点的转弯 在下一个提示的开始 或2秒后,它自己的开始, 以哪个开头.

每种格式都加以防范, 帮助输入输出 :

  • XML 和 HTML 文本 (xmlText: XML 1.0 外的字符 Char 生产减少,以及 &, (中文(简体) ), <, (中文(简体) ), >, (中文(简体) ), " 财务报告和审定财务报表 ' 被逃脱.
  • 一个WebVTT提示 (vttText: & 财务报告和审定财务报表 < 被逃脱,每一个 --> 已断开,提示内没有空行。 一个 SRT 提示( A)cueText) 里面没有空行.
  • 一个 CSV 字段 (csvField:每个字段的引文翻了一番,开头的字段是: =, (中文(简体) ), +, (中文(简体) ), -, (中文(简体) ), @、标签、车厢返回、线路信号或全线 =, (中文(简体) ), +, (中文(简体) ), - 或者说 @ 获得一个主引用,所以电子表格不会把它读作公式.
  • 标记下正文文本( N)markdownText:标记被逃脱,而GitHub的提及和引用被打破,作为 标出正文文本 描述.
  • 归档路径: 相对的, 没有空的, 没有 .. 并且没有反弹. writeArchive 拒绝任何其它路径 readArchive 拒绝一个文件的归档。 文件夹条目( 结束于 /,用于文件夹的 zip 工具) readArchive 答对.
  • 归档大小( A)readArchive:在文件被夸大之前,每个文件的大小被添加到一个运行中的总和中,和一个过去的总和 maxInflatedBytes 丢出一个 RangeError,所以一个小的档案 宣布或持有千兆字节 从来没有充气。 默认值为 52,428,800 字节( 50 MiB); 传递一个更大的链接, 用于一个已知保存较多的档案, 如 readArchive(bytes, { maxInflatedBytes: 512 * 1024 * 1024 })。其文件声称其压缩字节比它所持有的更压缩的档案,像共享一个数据段的文件那样,将丢出一个 RangeError 我也一样。 约束在所持的字节上,而不是在读取的时间.

通过条目写入归档条目

有选择, writeArchive(entries, options) 回答一个承诺, 并一次写一个 zip 条目, 因此一个长的导出可以显示其进展并被停止 :

import { ArchiveError } from '@framers/agentos-ext-document-export/archive';
import { writeArchive } from '@framers/agentos-ext-document-export/transcript';

const controller = new AbortController(); // controller.abort() from a Stop key
try {
  const zip = await writeArchive(entries, {
    onEntry: (index, path) => console.log(`${index + 1} of ${entries.length}: ${path}`),
    signal: controller.signal,
  });
} catch (error) {
  if (!(error instanceof ArchiveError && error.reason === 'stopped')) throw error;
  // Stopped after the entry in hand; no archive was handed back.
}
选项它会做什么
onEntry(index, path)每个条目的编号为: entries 及其路径,依次
signal每条前读取,后读取一次. 一旦它被中止, 写到手头的输入后就会停止, 而承诺拒绝使用 ArchiveError,原因 stopped,没有归档
mtime每个条目、毫秒或秒的修改时间 Date 从1980年到2099年,所以同样的条目给出了相同的字节. 默认: 时钟, 如 writeArchive(entries) 写入

在两个条目之间, 写入等待计时器( T)setTimeout(fn, 0))),所以发送到线条上的信息,其中工人的停站,是在手入后处理的. 每个路径在第一个条目被写入之前都会被检查,一个坏路径,或者一个两次,拒绝之前的承诺 onEntry 称为; writeArchive(entries) 保存上次输入的路径数据两次。 没有选择, writeArchive(entries) 是上面同步调用, 不变 。 两种表格为相同的条目写出不同的字节:逐个入项表格在数据描述符(APPNOTE 4.3.9)后在数据描述符中给出了每个条目的大小,如流线作家所做的那样,以及 readArchive 财务报告和审定财务报表 openArchive 读两个都一样.

档案(浏览器安全)

@framers/agentos-ext-document-export/archive 读取一个过于庞大的 ZIP 以放大整个, 如一个在手机浏览器中选择的注释文件夹 . openArchive 列出档案中心目录中的条目,并充公其任何数据 bytes() 单从它自己的片段读取 Blob。 。 。 .

import { ArchiveError, openArchive } from '@framers/agentos-ext-document-export/archive';

const archive = await openArchive(file, { maxEntries: 10_000, signal });
try {
  for (const entry of archive.entries) {
    if (entry.kind !== 'file' || entry.unsafe) continue;
    const bytes = await entry.bytes({ maxBytes: 10 * 1024 * 1024, signal });
    // one entry's bytes, checked against its recorded length and CRC-32
  }
} catch (error) {
  if (error instanceof ArchiveError && error.reason === 'size') {
    // the entry's recorded size is more than maxBytes
  }
  throw error;
} finally {
  archive.close();
}
选项何处它的束缚
maxEntriesopenArchive存档的条目可能列出, 在目录读取前在尾端记录上检查 。 默认: 无
maxDirectoryBytesopenArchive目录大小, 在读取前检查 。 默认: 64 MiB (MAX_DIRECTORY_BYTES(中文(简体) )
maxBytesbytes()条目的字节. 过去的记录大小被拒绝为 size 在任何读取之前。 然后在保留前计算出每个 8 KiB 步骤的输出, 将输出超过记录大小的步骤拒绝 format,因此输出永远不会通过 maxBytes。默认:无;仅记录大小即可限制读取内容
workerbytes()充气于fflate的工人(违约)或 false在电话线上 工人只有在采取之前的下一步工作。 它的工人来自 blob: URL,所以其内容安全政策不允许的页面 blob: 工人阅读 false
signal两者停止打开或读取,即使读取 Blob 正在等待,或者正在向工人迈出一步

多么开放的读取

开放阅读存档的结尾及其目录,并充公并返回没有条目的数据:

  • 没有归档注释:最后的22个字节(末端记录),前面的20个字节,一个ZIP64定位器坐在那里(当少于20个字节的字节出现在末端记录之前,如空归档),以及目录.
  • 有评论:最后的22个字节,然后最多是最后的65,557个字节(最长的注释和最终记录),最后的记录和目录之前的20个字节. 一个短于65,557字节的归档在第二个读取时被读取全数,包含条目的数据.
  • A ZIP64存档增加了其ZIP64端记录的前56个字节.

在检查目录大小后, 其内容以切片形式读取 maxDirectoryBytes。 。 。 .

名称和种类

每个列名都 path, (中文(简体) ), size, (中文(简体) ), compressedSize, (中文(简体) ), method (0个储存,8个DEFLATE), encrypted, (中文(简体) ), kind 财务报告和审定财务报表 unsafe。 。 。 .

  • path 是条目的名称作为文本: 当条目的通用比特 11 设定时的 UTF-8。 没有它, 信息- ZIP Unicode 路径的额外字段的名称(0x7075)其CRC-32与所存储的名称相匹配;而如果其字节为有效的UTF-8,则所存储的名称为UTF-8,因为许多写作者没有旗子就存储了它;否则IBM代码页437,ZIP格式的原字符集. path 显示文本,绝不是解决问题的路径.
  • kind 实值 directory 以斜线或文件夹中的属性发誓, link 从 Unix 符号链接比特, 否则 file。 。 。 .
  • encrypted 当条目的目录记录设置了通用比特 0(加密)或比特 6(强加密)时,是真实的。 拒绝这种入境,因为 method 当读取。 作为 Info-ZIP 的传统加密 zip -e 写它,将数据的方法保存在它下面,所以它的条目列表方法8与 encrypted 真实: 在读完之前, 读完两本书后.
  • unsafe 标记一条有空白部分的路径, ., (中文(简体) ), ..,反弹,无效字符或驱动器前缀:已列出,从未读取.

档案必须保存什么

ZIP64档案被读取;一个以上磁盘上的档案不是. ZIP64的收尾记录在定位器正坐在收尾记录之前时被读取,它本身的大小必须至少是44字节并结束于定位器开始或之前的地方. 没有定位器, 最终记录的号码被记为书面, 所以存档 准确 65,535项条目 zipfile 记录为 0xFFFF 没有ZIP64,打开.

该目录持有记录端记录,然后没有记录或一个数字签名记录;其中的任何其他字节拒绝归档. 一个条目的本地头必须重复其目录记录的压缩方法,加密比特和名称,字节的字节,或者在读取其任何数据之前拒绝该条目.

读取

一个档案的条目一次被读取. close() 停止活动读取,结束它的工人 并拒绝以后的读取。 然而读取的结尾(它的最后一步,拒绝,信号, close() 或未读取 Blob它的工人以它结束。 在一个步骤被读取之后的一站,在给工人读取之前它拒绝读取 stopped,而结束的工人 没有得到更多的。 读取的信号停止了保存, 所以下一个读取运行 close(),每个后期读取被拒绝作为 stopped。 。 。 .

在调用线条上,一个读取停止在结束条目的DEFLATE流的阶梯上:fflate的充气器显示每个阶梯之后的终点,该阶梯之后没有任何读取或充气.

fflate的工人无法显示终点,所以一个工人读到的步子一连16次(128 KiB)无所作为,使工人不再进场,工人最多只能得到16步并经过一字节,结束一行:

  • 当输出是然后输入的全部记录长度时,工人会被给输入的下个字节作为最后一步. 结束了的溪流没有读取它,读取完成的溪流一次被充气,无论在条目的压缩尺寸内随它而去. 一条溪流仍然拒绝字节作为截断,除非该字节完成工人持有的块和与之相接的溪流:一个字节没有保留DEFLATE块整体. 最后一个步骤是空的,它不会将两者分开:一个没有输入的充气器会随着流的结束,结束或不结束而采取一个空的最后步骤,每当它结束之前的步骤完全在字节边界上结束时,它就没有任何步骤.
  • 否则,或当工人因为溪流还去而拒绝该字节时,工人就结束,并在调用线上再读出条目.

有效的流被读取任何空块, 并拒绝提供超过记录大小的流为 format 无论是线条。 如果安装的fflate充气器没有显示其状态为fflate0.8.3的充气器,那么一条连续16次无所事事的流在调用线条上也已完成了,该入段的下个字节是其最后一步,一个仍然在行的流被拒绝,因为 format。 。 。 .

每一次拒绝都是 ArchiveError 其信息是固定的,从未带有条目名称或 Blob自己的错误 :

reason何时
format不是一个 ZIP 此读取器打开: 没有结束记录, 错误的 ZIP64 端记录, 不符合归档的数字, 目录中除了一个数字签名以外的字节, 数据重叠的条目, 缺失的本地标题或不重复其目录记录的条目, 无效的 DEFLATE, 不符合记录长度或 CRC-32 的字节, 或 a Blob 无法还原其字节
method存储或DEFLATE以外的压缩或加密条目
size该条目记录的大小大于 maxBytes
path条目是 unsafe
entries条目多于 maxEntries
directory_size大于 maxDirectoryBytes
busy正在读取同一档案的另一个条目
stopped信号发射,或者归档关闭,读取 Blob 仍待处理 writeArchive 有选项的,其信号在进入之前或最后一个之后发射

负数或不数的绑定 RangeError。 。 。 .

日历事件( 浏览器安全)

@framers/agentos-ext-document-export/calendar 将一个事件写为 iCalendar 文件, 并作为 Google Calendar 新事件页面的地址 。 它导入了已内置的无节点和没有软件包,所以一个页面同时构建了下行. 也没有写给任何人的日历:人物打开文件,或者在Google的页面上保存事件.

import { googleCalendarAddress, icsEvent } from '@framers/agentos-ext-document-export/calendar';

const ics = icsEvent({
  uid: '[email protected]',
  title: 'Send the slides',
  description: 'From the budget review: "I\'ll send the slides"',
  start: '2026-11-12',
  allDay: true,
  stamp: new Date(),
});
const href = URL.createObjectURL(new Blob([ics], { type: 'text/calendar' }));
// a link with this href and download="send-the-slides.ics" saves the file

window.open(googleCalendarAddress({ title: 'Send the slides', start: '2026-11-12', allDay: true }), '_blank', 'noopener');
// https://calendar.google.com/calendar/render?action=TEMPLATE&text=Send%20the%20slides&dates=20261112/20261113
外地icsEventgoogleCalendarAddress随你便
uidUID事件标识符. 对于一个事件制作的每个文件都保持相同的状态,所以打开第二个文件的日历会更新事件,而不是添加另一个
titleSUMMARYtext标题
description, (中文(简体) ), detailsDESCRIPTIONdetails笔记, 当不是空时写出, 换行符保留
startDTSTARTdates对于一个定时事件,瞬间:a Date,或 ISO 8601日期时间及其冲抵(2026-11-12T10:00:00-05:00),任何长度的一分之一的切到写作时的第二分之一(2026-11-12T15:00:00.123456+00:00) (中文(简体) ). 一日之事,其一日为: YYYY-MM-DD
endDTENDdates形式 start 拿着 一个定时事件结束于它,当它开始时没有它,或者当它掉入第二起事件时结束. 一个全天活动把它当作最后一天, 并且只覆盖第一天没有它
allDay整日而无一日. 默认 false
stampDTSTAMP当文件制作时, 瞬间
productIdPRODID制作文件的产品. 默认 -//Framers//AgentOS Document Export//EN

文件如下 RFC 5545 (法语)数字 :

  • 行以 CRLF 为终点并折叠为75octets,每行从一个空格开始(第3.1节). 一个折叠倒在了字符之间,从不在一个人的UTF-8字节内,所以每行都是有效的UTF-8并正在流出,还原了整个文本.
  • 文本逃逸处 \, (中文(简体) ), ; 财务报告和审定财务报表 , 用回击键写出每行换行符 \n (第3.3.11节)。 控制字符 TEXT 不允许丢弃; 保留标签 .
  • 一个定时事件的时间是世界协调时的日期时间(DTSTART:20261112T150000Z页:1 一个没有结束的定时事件, 或者在它开始的第二秒结束, 没有结束 DTEND,RFC 5545读作在开始时结束(第3.6.1节),因为a DTEND 必须晚于 DTSTART (第3.8.2.2节).
  • 全天活动的时间是日期(DTSTART;VALUE=DATE:20261112,第3.3.4节),第3.3.4节 DTEND 是它最后一天的后天,因为 DTEND 没有包容性(第3.6.1节).

模板地址写入 action=TEMPLATE, (中文(简体) ), text, (中文(简体) ), dates 财务报告和审定财务报表 details,与 text 财务报告和审定财务报表 details 百分之百的编码. dates 世界协调时两次日期( UTC:20261112T150000Z/20261112T153000Z),在未结束或未结束的第二时间开始一次定时活动两次,或全天活动两次日期,即其最后一天后第二天的第二次日期(20261112/20261113) (中文(简体) ). Google没有出版这些参数的参考文献. 他们写成 将事件添加到日历文件 记录,2026年11月10日读取;那些文件也称Google使基本的HTML在 details。 。 。 .

每个助手都会投出 RangeError 当某个时间不是该事件所用的形式时, 命名字段, 时间在 0 到 9999 年以外, 或者 end 跌倒在一秒钟之前 start 坠入,和 icsEvent 当 uid 或者说 productId 是空的或只持有白色空间和控件字符,而TEXT值会下降。 文本中的独一代孕被写作U+FFFD.

标记下体文本( 浏览器安全)

markdownText(text)从软件包中导出并从中导出 ./transcript,使纯文本安全地放入马克下体,比如一个问题,它读作:

import { markdownText } from '@framers/agentos-ext-document-export/transcript';

markdownText('# x [y](z) @a #12');
// '\\# x \\[y\\](z) @​a #​12'
// GitHub shows "# x [y](z) @a #12" with no heading, link, mention or reference
  • 普通马克 标记被反弹所逃脱: \ ` * _ [ ] < & ~ | 在任何地方, 和一行的第一个 #, (中文(简体) ), >, (中文(简体) ), +, (中文(简体) ), = 或者说 - 和命令的列表标记(1., (中文(简体) ), 12)) (中文(简体) ). 没有开始标题,列表,引文,主题分页,表格,链接,图像,HTML,实体,代码跨度或强调.
  • GitHub 链接 提及和参考 在读了Markdown之后,无论是反弹还是HTML实体都没有阻止它,作为它的 标记下 API 于2026年11月10日下达. 零宽空格( U+200B) , 它没有显示什么, 在后面 @ 提及或地址 # 联 合 国 #12 财务报告和审定财务报表 owner/repo#12,则 GH- 联 合 国 GH-12,则 issues/, (中文(简体) ), pull/ 或者说 discussions/ 在数字之前 https://,则 www 联 合 国 www. 和emoji短码的开口结肠(:tada:GitHub画成一种情感, 他们中没有人会连结或画画,也没有人被通知.
  • 换行符被写为 LF,每行的缩进被丢弃,因为有四个空格开始一个代码块,其中出逃会显示.

GitHub身上还有两件事 当存储器持有一个时,一个赤裸的承诺散列与它的承诺相关联。 两个美元符号之间的文字可以做为数学,反弹不能阻止它: GitHub's 数学页面 请求一个 <span> 围绕这样一个美元标志。 一个复制文本的读者用它复制了零宽空格.

版本与发布记录

@framers/agentos-ext-document-export 共发布 15 个版本,首次发布于 2026/05/02;过去 12 个月发布了 15 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.10latest2026/11/114 天前
0.3.92026/11/096 天前
0.3.82026/11/0510 天前
0.3.72026/11/0114 天前
0.3.62026/10/2818 天前
0.3.52026/10/2125 天前

关于 @framers/agentos-ext-document-export 的常见问题

@framers/agentos-ext-document-export 是什么?

生成带有图表、表格和主题的 PDF、DOCX、PPTX、 CSV 和 XLSX 文件

如何安装 @framers/agentos-ext-document-export?

在项目目录运行 npm install @framers/agentos-ext-document-export,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@framers/agentos(>=0.10.40)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@framers/agentos-ext-document-export 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@framers/agentos-ext-document-export 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@framers/agentos-ext-document-export 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@framers/agentos-ext-document-export 可以商用吗?

@framers/agentos-ext-document-export 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@framers/agentos-ext-document-export 的下载量有多少?

根据 npm 官方下载统计,@framers/agentos-ext-document-export 在 2026/10/16 – 2026/11/14 这 30 天内被下载 24,076 次,日均约 803 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@framers/agentos-ext-document-export 还在维护吗?

最新版本 0.3.10 发布于 2026/11/11(4 天前);至今共发布 15 个版本,其中过去 12 个月发布了 15 个;首次发布于 2026/05/02。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。