@framers/agentos-ext-gmail-source

中文文档
0.6.4发布于 2026/11/01Apache-2.0TypeScriptES Module零依赖构建来源已验证近 30 天下载 6518

仅读 OAuth 和绑定的个人 Gmail 源代码助手

中文使用文档
文档目录4 节
  1. 文字摄取
  2. 线索文档
  3. 只读 API
  4. 连接器和持久同步

Gmail 来源

这个库在 AgentOS 重定向和被封存的合同上提供只读的 Gmail 授权,在存储前将邮件进行分解和修剪的文本助手(见下文文本摄入),将一线响应转换为分解源文件的受限映射器(见下文线索文档),通过主机配额和分解服务(见下文只读API)发送每通呼叫的受限读取API客户端,以及连接器将它们绑入持久账户-源同步(见下文连接器和持久同步). 它要求唯一的Gmail只读范围,离线访问和递增同意. 它不导出发送、回复、标签修改或附件下载工具.

在旁边安装 @framers/agentos 0.13.146 或以后,其 HTML 装载器以线性时间来条纹标记,以及 @framers/agentos-ext-account-sources 在地板上或上面,这个包 peerDependencies 名称; npm view @framers/agentos-ext-gmail-source peerDependencies 打印最新发布的版本。 两者都是对等依赖性,都有下限,没有上限. 22号节点或以后需要,因为它是用于 @framers/agentos。 。 。 .

import { GmailOAuthFlow } from '@framers/agentos-ext-gmail-source';

const callback = 'https://app.example.com/sources/gmail/callback';
const client = { clientId, clientSecret, redirectUris: [callback] };

// The request that sends the person to Google: keep the state and the verifier in a short-lived, single-use record.
const begun = new GmailOAuthFlow(client, null).begin({ redirectUri: callback });

// The request Google sends the person back to. `store` is a SealedTokenStore under the connection's namespace.
const flow = new GmailOAuthFlow(client, store);
const grant = await flow.complete({
  code,
  state,
  expectedState: begun.state,
  codeVerifier: begun.codeVerifier,
  redirectUri: callback,
});
// After the host has consumed the start and rechecked the account: the store receives the refresh token and scope.
await flow.keep(connectionId, grant);

构造 GmailOAuthFlow(client, store, options) 在服务器上. client 包含专用客户端代号,客户端秘密和准确注册的回调URI列表. 通过主机的秘密机制装入证书. 默认终点为Google的HTTPS终点. endpoint 超接被限制在 CI 站入;从未从浏览器请求中获取它们或调回 URI .

begin({ redirectUri }) 返回授权 URL、状态和 PKCE 验证器。 将状态和核查员保存在与签入账户挂钩的短寿命单用途记录下. complete(input) 检查状态,交换代码并核实授予的范围和更新材料。 它将证书还原为记忆,而不延续这些证书。 主机在安装被封存的赠款之前,必须在解剖学上消耗启动并重新检查账户活度和生成. 不要从任意提供者中间软件中日志回调的 URL、 证书或错误 .

构造每次预定的令牌操作的流量, 并附带该操作的密封商店和中止信号, 呼叫 accessToken,然后在操作结束时丢弃流量。 绝不能为另一工人保留一个业务的仓库。 宿主的耐用寿命周期拥有断开,清洗,刷新工人之间的排斥和吊销. forget 独立控制的流动不是跨工人生命周期的操作. accessToken 在Google被问及之前, 请检查只读范围, 在按键转弯时, 给它自己的呼叫, 一个刷新, 因此, 无法在读取或调取其他按键时改变结果 ; 仅当商店持有它带来的赠款时, 才使用内存中持有的符, 刷新符和范围 .

OAuth响应被封顶为65,536字节并必须在15秒内完成. 一次拒绝通过封顶的答案:Google的其余流被取消而不等待取消和解,Gmail API的答案被读取相同. 父母取消则停止发送和身体消耗. revoke(token) 解决当Google撤销了该令牌,当Google回答该令牌已经过期或被撤销时: Google以400美元回答这样的信使 invalid_token,其中RFC 7009 第2.2节回答200, 无论是哪种方式,符号都不再起作用。 因此,只取消的队列确认取消在Google上已经取消的被授予,而不是重新尝试到其最后期限,然后要求取消许可. Google以同样方式回答一个过期的访问令牌, 每一个不成功的答案 OAuthGrantRefused 有理无据 revoke固定 GmailOAuthFault 理由不包含提供者消息或证书。 当交换成功时 complete 不退还补助金,因为补助金没有支付,或者因为父母以前取消了 complete 返回时,流量要求Google在放弃之前取消赠款. 撤销的字节上限和15秒的最后期限相同,父母的取消并没有阻止。 错在 cleanup 字段后读取 confirmed 或者说 unconfirmed; Google 关于赠款已经过期或被撤销的回答为 confirmed未经证实的结果需要一份提供者/许可清除指示。 它不授权保留补助金.

东道方提供知情同意、缓存许可、保留政策、账户隔离和真实可用状态。 单凭授权并不能确定允许存储或发送信箱内容给模型. 不要从这个包的成功测试中推断出这些权限.

参考议定书: https://developers.google.com/identity/protocols/oauth2/web-server 互联网档案馆的存檔,存档日期2013-12-22 财务报告和审定财务报表 https://developers.google.com/workspace/gmail/api/auth/scopes (中文(简体) )。 。 。 .

文字摄取

import { messageText, sanitizeMailHeaders, sanitizeMailMetadata } from '@framers/agentos-ext-gmail-source';

const policy = { maxInputCharacters: 2_097_152, maxLineCharacters: 65_536, maxOutputCharacters: 20_000 };

// Strings the host's MIME reader has already decoded within its byte and structure bounds.
const headers = sanitizeMailHeaders(decodedHeaders, policy); // { subject, date, from, to, cc }
const body = messageText(decodedPlainText, policy);
const filename = sanitizeMailMetadata(decodedFilename, { ...policy, maxOutputCharacters: 200 }).text;
// body.text is sanitized and trimmed; body.trimmedQuote, body.trimmedSignature and body.truncated report omissions.

sanitizeMailText(input, policy) 移除地址符和证书形状的内容,无需网络呼叫. sanitizeMailMetadata 对文件名、标签名和显示字段应用相同的规则并折叠白空间. sanitizeMailHeaders 只保留主题,日期,从,到和Cc;其主题输出被封为200个字符. MIME发头解码和结构验证必须在这些函数收到发头值和文件名之前进行;一个标签名是从标签响应中取出并按原样被传递的JSON文本,从未被解码. BCC从不返回.

policy 用品 maxInputCharacters, (中文(简体) ), maxLineCharacters 财务报告和审定财务报表 maxOutputCharacters 作为 UTF-16 代码单位的正数。 投入上限为2,097,152个,线路上限为65,536个. 输出封顶不能超过输入封顶. 过度大小的输入抛出 GmailTextFault 有固定的理由; 超长线被压制。 处理从不只扫描证书的切换前缀. 百分数和字符引用解码最多重复了四次,其中HTML标准的每个被命名的引用和数字引用;一行被去除后仍然持有被编码的字节或已知的引用. 平板,是一跑一跑的空格和隐形字符,除了ASCII空格和分页之外,还持有其他任何东西,例如"不断"空格,"零相"非"相接"相接",将"石墨相接"和"盲文相接"的邮件模板相接后重复,成为一跑一跑的空格,或者当它完全没有空格时就一去不复返,所以字母相接的零相接. 保留隐形字符并结束一行的平板画没有留下空格;一跑的不断空格单独保留了一行,所以写着一个仍然读取的签名分隔符 -- 。运行的 ASCII 空格和标签保持不变。 输出截取可以避免分取一对代位子,并在结果中标出.

持有证书任务的行( E)password: x, (中文(简体) ), API_KEY=x成为 [secret removed];一个带有空值,块scalar或未关闭的引文的任务也会去除文本的其余部分. 替换后仍然带有证书提示的行,例如密码词,API密钥,访问或刷新令牌,客户端秘密,私钥或 bearer,成为 [line removed by the secret gate]当该行引入一个值时,以 : 或者说 =,或与 is, (中文(简体) ), are, (中文(简体) ), was, (中文(简体) ), were, (中文(简体) ), be, (中文(简体) ), below, (中文(简体) ), follows 或者说 set, (中文(简体) ), reset, (中文(简体) ), changed 或者说 updated 接下来是 to (单位:千美元)below 财务报告和审定财务报表 follows 也加上一整站),值也随之而去:下一行在引文深度处保留了文字,经过了任何空白行,再经过其段落后行,一个空白行或引文深度的更改会结束. 这么说吧 Your password is:, (中文(简体) ), Your new password is 或者说 Your temporary password is below. 在此之前 hunter2 删除 hunter2邮件 <p>Your temporary password is:</p> 在段落中标出值之前。 以提示、提示和全站结束的一行,如同其价值之上的标签一样(Temporary password 或者说 Here is your new password. 上文 Xy7kP2),取下一行,当该行在标签的引号深度为一字时,该行将保留文本;其下保留了多个单词的正文. 在另一个引文深度中保留文字的行结束规则和保留,所以在引文下未引用的答复 Your password is: 保留。 一条以其他方式结束的有门线,例如 Reset your password from Settings. 或者说 Your password was changed.,离开线 之后单独。 每个标记都保留其行引用标记(>),其中每行空格和制表符被缩短为一个字符,所以引用的以去掉的行结尾的历史仍然被引用 messageText 仍然在修剪,一个标记 没有任何它替换的线的垫子.

一次性代码是证书. 四到八位数的跑步,作为一跑或以等同的二、三或四组,加上一个空格或连字符(482 913, (中文(简体) ), 482-913),除了命名一个登录,登录,验证,安全,认证,确认,一次性或双因子代码或密码,一次性密码或PIN等词外, passcode, (中文(简体) ), OTP,或 your … code 之间最多有两个字:Your Apple ID Code, (中文(简体) ), Your WhatsApp code;ZIP、邮政、地区、国家或拨号代码为零) [secret removed] 已经就位, 和字留下。 数字可能跟随字,过去 is、结肠、等号、破折号或开口引号或括号(Your sign-in code is 482913, (中文(简体) ), Security code: 4821)或先于他们(482913 is your Instagram code, (中文(简体) ), Use 482913 as your sign-in code) (中文(简体) ). 在一行上的数字,当一个HTML邮件的代码框被剥去后,它就会变成一个在六行内保存文字的代码,在一行取出一个名字后,在该行的引号深度;一行取出文字在另一个深度结束计数。 较长的位数,如电话号码,不是一个代码,其他单词的位数留下(40 people, (中文(简体) ), 24 October 2026, (中文(简体) ), $1,200.00, (中文(简体) ), 2831 St Rose Parkway, (中文(简体) ), ZIP code 89052) (中文(简体) ). Verification code: 482913 财务报告和审定财务报表 one time code: 482913 和以前一样 是认证任务 失去整行.

messageText(input, policy) 先进行消毒,修剪识别回覆历史和短签名,再应用输出封顶. 明确转交的内容和含糊的口语保留下来。 内容 trimmedQuote, (中文(简体) ), trimmedSignature 财务报告和审定财务报表 truncated 旗帜描述遗漏。 引文跨度必须指其返回的字符串,而不用插入摘要或椭圆显示为源文本. 主机应当披露附件被列出,且其映射器执行该边界时其内容不被读取.

函数返回文本并只计数 。 它们不存储原始值或反编辑映射,日志匹配,获取 URL,将邮件解释为指令或引用模型. 卫生化可以去除良性文字,无法识别每一个可能的秘密. 它不使个人邮件匿名或授权模型处理、分享或保留。 主机必须维护来源的隐私,对文本和衍生结果的过期和删除规则.

线索文档

import { GmailThreadMapper } from '@framers/agentos-ext-gmail-source';

const mapper = new GmailThreadMapper({
  maxResponseBytes: 2_097_152, maxDecodedBytes: 2_097_152, maxMimeDepth: 20, maxMimeParts: 1_000,
  maxMessages: 100, maxMessageCharacters: 20_000, maxThreadCharacters: 200_000,
  maxMetadataCharacters: 200_000, maxInputCharacters: 2_097_152, maxLineCharacters: 65_536,
  maximumCacheMs: 86_400_000,
});

// `response` is the parsed threads.get (format=full) body from a transport that capped its bytes.
const result = await mapper.map(response, {
  sourceId: response.id,
  sourceDetailUrl: detailPath, // the host's authenticated source-detail route, never a Gmail link
  cutoff, windowMs: 30 * 86_400_000, readStartedAt, receivedAt,
  permission, cacheHeaders, labelNames, labelCache, signal,
});
// result.kind is 'document' (text, message spans, metadata, cache expiry) or 'skipped' with a fixed reason.

构造 GmailThreadMapper(bounds) 有明确响应,解码字节,MIME深度/部分,保留消息,消息/线索文本,元数据,消毒器和缓存天花板. map(thread, options) 返回账户源 SourceSyncReadResult 工会。 输入是JSON解码前已经执行它的字节封顶的传输器的解析响应. 映射器在解码任何被选中的正文之前,分别检查识别的MIME数据和整个部分树. 单是解析对象无法确定其原始电线大小 .

提供固定的选取截断,消息窗口,原始读取开始和完成时间,实际的响应缓存头,独立建立的缓存权限和由主机生成的相对细节路径. 路径必须在主机中解决认证和当前源生成问题. 它从来不是Gmail的深层链接或请求产生的外部URL. 成功的 OAuth 赠款不会建立缓存或模型处理权限. 过 labelCache 作为单独标签的响应缓存决定。 缺少、拒绝或过期的标签许可保留了无名的ID。 允许使用的姓名缩短整个文件的有效期,当允许使用的期限首先结束。 一个标签名称是标签响应的JSON文本,而不是MIME头值:映射器将它按写法进行消毒,从不将它解码为RFC 2047字,所以一个名字如 Research =? backlog 保留为书面,并保存所携带的信件。 名字中一跑被编码的单词只被解码到里面去查看:一个其文本有地址或证书的被取而代之的是它的消毒器所留下的东西,因此一个读者无法解码回的被存储,一个不解码的单词被保留为已写.

每个信件都通过内部时间戳、排除的标签(垃圾、垃圾和草稿)和 excludedCategories 选项:带有被排除类别标签的信件(CATEGORY_PROMOTIONS 页:1 promotions,等等)被忽略,计算如下: excluded_category; 默认情况下没有排除。 保留的信件首先在明确封顶内被选中,并按时间顺序提供稳定的ID联系。 纯文本在 MIME 选项中获胜 。 其他多部分集装箱按MIME订单保留其非附着文本儿童。 HTML 使用公共代理OS HtmlLoader 带有内嵌缓冲;每个字符引用加载器的叶被解码后被垫起倒塌并再次被白空间倒塌,段落之间最多有一行空白. 没有载入浏览器或远程资源 。 由此产生的文本、结构化标题、文件名、媒体类型和标签名称均通过文本消毒器.

在 MIME 选项中,一个持有文本的平版分支胜过 HTML 。 一个文本是空白的分支,除了白空间, 粘贴, 以及解码它们的百分比和字符引用, 就像在空的平地部分, 一些邮件发送到 HTML 旁边, 返回到下一个分支, 所以 HTML 会被读取 。 后一分支,其字节或字符集不能被读取被相接而过,当每个分支为空白时,首选的一站. 每个保留信件都保留自己的切口、头部前缀和正文 maxMessageCharacters (或 maxThreadCharacters 当它更小的时候,不管它是什么. maxThreadCharacters 首先,第一个与所剩内容不完全一致的信息,以及每一个较旧的信息,被省略并计入以下 thread_limit,则没有缩短消息的剪接时间。 因此,在封顶附近的答复会留下存储副本所持有的每封信件的文本,而账户来源商店只需要对所改变的内容收取费用:它只收取所持有信件的散列、剪切和长度不变时的任何费用.

附件列出,内容不读取。 外部机构或附件只提供已消毒的文件名、媒体类型和大小。 内置附件字节和附件编号被丢弃 。 Bcc,生载荷,片段和未知的球场不返回. 地图员从不调用 Gmail 端点 。 不支持的字符集, 无效的字节和被省略的内容都有固定的计数理由 。 无效的协议形状是失败而非空的成功源 .

返回的文档有匹配项目/ref版本、正常内容散列、消息编号和正文跨度、允许最早的过期和明确省略/调用元数据。 Spans在返回的文本中计算出UTF-16代码单位并排除了头前缀. 引文三进制保留了正则源文本;在引文中不插入已生成摘要或椭圆. 只信头的信息可以有一个空体跨度. 将结构化的元数据作为逃出文本,并将所有邮件作为不信任的数据处理.

该版本是线条的历史 ID和 contentHash,普通文本的SHA-256,元数据和消息的跨度,所以散列是改变文本正常化方式的字段. 使文本正常化的发布会以不同方式改变正则文本、元数据或跨度变化的线条的散列。 在下一次读取这样的线程时,当历史名称或调和扫描列出时,账户-源代码商店会找到新版本并再写入副本. 其历史 ID 、 普通文本、 元数据及信件横跨的线程( 每条信件的窗口在其中结束, 所以更改) windowMs 更改版本也不变)保留了它的版本,商店,给一个主机 refresh 装订,保留复制件,不再嵌入。 没有保存单独的正常化版本 .

仅基于历史的更改不会延长缓存寿命或改变已规范的散列. 存储仍需要账户来源的交易围栏、新的到期检查和宿主津贴。 衍生结果保留了整个来源的个人用途,过期和删除限制. 永远不要坚持短暂的 MIME 类型, 也不要以映射结果绕过账户源存储 .

只读 API

import { GmailApi } from '@framers/agentos-ext-gmail-source';

// `revocations` is the host's SourceRevocations and `quota` its SourceQuota, on the tables its coordinator uses.
const api = new GmailApi({
  client, revocations, quota,
  currentHandle: () => handle, // the sync handle that holds this connection's lease now
  projectKey: 'project-1', mailboxKey, // a stable keyed hash for the mailbox, never its address
  bounds, // the thread mapper's bounds (see Thread documents)
  limits: { timeoutMs: 15_000, maxLabels: 1_000, maxHistoryReferences: 10_000, maxPageTokenCharacters: 4_096 },
});

const profile = await api.profile(signal); // compare profile.emailAddress privately; keep profile.historyId
const labels = await api.labels(permission, signal);
const page = await api.list(cutoff, 30 * 86_400_000, 100, null, signal); // { kind: 'scan', ids, nextPageToken }
for (const id of page.ids) {
  const result = await api.readThread(id, {
    cutoff, windowMs: 30 * 86_400_000, sourceDetailUrl: detailPath(id), permission, labels, signal,
  });
}
const changes = await api.history(profile.historyId, 100, null, signal); // { kind: 'history', ids, nextPageToken, cursor }
// A failure is a SourceSyncFault with a fixed code and, for a wait, the time to try again in retryAt.

GmailApi(options) 使用宿主提供的账户来源配额和赠款服务. 传活来 currentHandle getter),稳定的不透明项目/邮箱配额密钥,专用的OAuth客户端,映射极限和明确的传输限制. 客户端构建每个OAuth流在赠款服务的回调内. 它在操作间不保留流量或密封存储回调. 制作使用固定的Google出自并仅使用配置,标签,线程列表/get和历史列表. CI 可能配置回放或保留固定来源; HTTP 重定向和任意路径被拒绝 .

profile(signal?) 返回用于私人账户绑定的服务器-记忆地址和历史代码。 永远不要将其地址存储在源或日志中. list(cutoff, windowMs, pageSize, pageToken, signal?) 返回有边框的扫描页。 查询使用划时代秒并排除垃圾邮件,垃圾和草稿;准确的信息资格仍然是地图员的责任. history(fromCursor, pageSize, pageToken, signal?) 返回已更改的线程 ID 和字符串响应光标。 主机必须坚持待发工作,并在所有工作完成后方投入终端光标. 这两种方法都主张整个邮箱的完整性.

excludedCategories 指定要删除的收件箱标签, 按其 category: 搜索名称( e)promotions, (中文(简体) ), social, (中文(简体) ), updates, (中文(简体) ), forums; 无默认: 扫描查询带 -category:<name> ; 历史记录,添加其标签带有该类别的信息(CATEGORY_PROMOTIONS 或更改信件的标签,同时在更改前后保留在被排除在外的标签内(在一个记录中两个被排除在外的标签之间的移动,在一个信件中一个恒星),名称不为该事件读取线索,一个通用 messages 条目 Gmail 列表旁边由它决定,而删除时,标签更改会将一条消息带入或带出被排除的标签,加起来的半个移动 Gmail 将分割成两个记录,仍然将线索命名(读取后发现副本没有变化,没有充值);映射器将此类信件从副本中留下 excluded_category。在排除的信息添加后读取的线索保留了文本,并赶上其遗漏的计数和版本,不收费。 排除物会留下的线程复制件,在选项设定前被存储,一直停留到其过期或主机重设连接,因为一个有界扫描对线程的沉默绝不是它的删除. 一个只保留主标签的东道主通过 GMAIL_CATEGORIES,四个名字。 名称和标签是Google的:搜索操作员 https://support.google.com/mail/answer/7190 页面存档备份,存于互联网档案馆 和系统标签 https://developers.google.com/workspace/gmail/api/指向/标签。 。 。 .

labels(permission, signal?) 返回已消毒名称和标签回复的缓存决定。 一个被拒绝的决定没有名字. readThread(sourceId, options) 接受截取/窗口、可信任的私人细节路径、缓存权限、独立的标签快照和可选信号。 它将实际的线程响应头和时间传递到映射器,只返回账户-源读-结果结合. 它永远不会返回原始的MIME。 标签响应不能借用线索响应较长的缓存寿命.

一个供应商进行一次尝试,在401后允许进行一次新鲜的重试。 每一次HTTP发送都是单独计分的. Token刷新器也使用一个单位的配置保留作为保守的地方会计;这并不能断言OAuth端点的Gmail配额成本. 持久账户-源协调者拥有重试事件,指数回放和耗尽. 客户坚持供应商通过配额服务等待,从不睡觉或购买容量. 配额推迟,或者一个错过配额发送窗口的开始,不发送任何信息并丢弃 rate_limited 再次尝试的时间; 仅重复尝试 id invalid_response。重试时,客户端的手总是在自己的时钟之后,即使配额数据库的时钟滞后;让客户端看到主机同步商店读取的时钟(Date.now 除非给出,否则两者均适用)。 未知错误成为固定的失败而不保留其消息或原因.

除非客户有 tokenHolder: 仅存 { current: null } 一个同步租赁共享的客户端的插槽 。 所持访问符只在 currentHandle 解答它是根据(相同的连接、生成和租赁令牌)获得的租约,而且租约没有被客户的时钟所到期;一个401将它下降,重复的刷新像以前一样. 一个再利用的令牌跳过赠款操作,因此在每次通话前后检查同步控件,就像连接器那样. 给每份租约都换个新持有人 永远不要坚持或登录. GmailSourceConnector 给每个连接器做一个,所以一个同步周期可以刷新一次赠款.

犬行线404表示已去. 历史404指历史锚地已过期并需要有界恢复. 域政策是固定的失败. 赠款缺失或明显无效,而且范围不够,被转给协调员的有栅栏的赠款损失生命周期。 客户端配置错误和瞬态网络/提供者故障不报告为被撤销的邮箱. 超大小的成功线程响应被计为跳过;超大小的控制页面在不提前光标的情况下会失败. 响应流在解码前被封顶,并在大小,截止日期或呼叫者取消时被取消.

客户端不执行存储写入,清洗,日志,模型请求或附件获取等功能. 它的成功结果仍然是不信任的来源材料,在储存、准备或交付之前需要东道主的新主人/一代/过期检查。 限制是防御性库政策,而不是提供者最大;主机在更改之前必须记录任何活的相容性失败.

连接器和持久同步

import { runGmailSourceSync, verifyGmailSource } from '@framers/agentos-ext-gmail-source';

const options = {
  scope, // the connection's tenant, owner and connection ids
  coordinator: { store, prepare, clock }, // the released AccountSourceSync options without provider and lifecycle
  revocations, // the host's SourceRevocations on the same tables
  connector: {
    api: { client, quota, projectKey: 'project-1', bounds, limits }, // as for GmailApi, without the handle and keys
    mailbox, // the host's private identity binding: key(handle) and accept(handle, address)
    bootstrapQuotaKey, // a stable keyed hash for the owner, never an address
    permission: async (request) => cachePermission, // the evidenced permission for a read, or null
    sourceDetailUrl: (scope, sourceId) => detailPath(sourceId), // an authenticated relative path, never a Gmail link
  },
};

// Once, after the host installed the grant and recorded its generation as grant-ready.
const verification = await verifyGmailSource(options, generation, signal); // { kind: 'verified' }, or why not
// Each scheduled or requested sync. The run's connector is disposed when the run ends.
const result = await runGmailSourceSync(options, 'scheduled', signal);

GmailSourceConnector(options) 执行最初选定的账户-源接口并曝光添加剂 sync 供养. 它没有履行文件承诺。 提供已发布的SQL同步存储,撤销服务,API配置,动态流处理取取器,私人邮箱绑定,缓存-permission回调,可信任的相对细节-路径构建器和稳定的不透明所有者探测键. 每个网络业务都使用现有的赠款和配额服务。 它为一个租借地搭建的API客户端共享一个内存中的访问令牌,所以一个同步周期刷新一次赠款;一个401或一个新的租借地再次刷新,而被处理后放弃. 永远不要在获取器中抓取第一个手柄:源程序可以刷新所有者票.

邮箱装订只使用服务器 。 这两起回调都通过已放行的商店在确切的控股下进行交易. key(handle) 读取现有的稳定邮箱密钥,或在初始接受前返回无效. accept(handle, address) 比较或解剖地创建主机的私人身份绑定并返回其稳定的密钥; 无效拒绝该身份. 它不能在重新连接时替换已有的身份 。 存储任何被封存的显示地址, 绝不在源、 遥测字段或 URL 中 。 初始剖面由稳定的所有者探测键充值;所有内容都使用被接受的邮箱键. 共同项目预算适用于两者.

连接器在邮箱首次内容操作前进行验证, 即使恢复的协调员跳过 begin。新鲜的 begin 在计数前读取新配置文件主标。 Raw profile 身份只传递给私人绑定 。 连接器没有保留配置地址 。 每个周期都可以在其独立响应到期后持有一个已消毒的标签快照. 过期或被拒绝的名字在不重复标签要求的情况下被省略. 取消、失败、周期/生成变化和处置清除快照。 打电话 dispose() 最终被直接使用.

原画 list, (中文(简体) ), read 财务报告和审定财务报表 changesSince 方法只在选定的身份证上运作,以较小的留存额和每期租赁变更项目津贴和100个硬上限为界限。 空的ID从未列出过一个邮箱. 初始选择的更改在读取选择之前抓取一个锁定 。 递增的选定更改会排出被限制的历史,然后只重新读取所选择的已更改的 ID 。 部分历史、 已过期的锚地、 重试、 跳过或 Stale 栅栏未返回任何成功的光标 。 只有一条峡谷缺失的线被报告为去除. 空选择带一无所有光标返回一个空字符串的监视器, 绝对不能使用非空选择, 或者坚持作为提供者历史 ID .

使用 runGmailSourceSync(options, trigger, signal?) 耐用摄入。 它的选项提供范围,没有提供者/生命周期的协调员配置,没有商店/当前手提/小时/撤销服务的撤销服务和连接器配置. 该函数构造了已释放的账户-源协调器,提供了这个连接器的同步提供者,并在运行结束时处理连接器. 它让协调员 operationTimeoutMs 90,000 除非协调员选项指定一个值,否则连接器自己在一个操作上绑定:一个恢复队列读取的跑步从一个新连接器上开始,所以它的第一个读取刷新了赠与,然后按顺序读取剖面图,标签和线程,每个在最长为15秒的最后期限内,一个401增加了刷新和重复. 作为协调员的30秒缺省,在总数下方划出这样一行: network 失败,并且每次重试都会建立另一个连接符并重复序列. 它也给 runBudgetMs 18万,除非选项指定一个值:运行中的预算从运行开始算起,并在运行结束时削减每次呼叫,所以它必须坚持运行的设置,读取和准备一起进行,它留下的准备太少的时间被削减为: storage_unavailable 而线程在下一跑的连接器上再次被读取. 协调员独自拥有候选人的界限、工作坚持、重试、历史完成、和解和世代申请。 退回的文件总是通过被放行的商店的现行政策和过期支票传递. 不要直接坚持一个外观源代码, 并丢失完整同步文档的缓存/ 证明信封 .

在一个东道主在经过认证的一次性使用开始后,在进行解剖后安装了密封候选人补助金,将同一代人转换为准备补助金,并在身份核实前进行记录后,可以称为 verifyGmailSource(options, expectedGeneration, signal?)。这要求实际租赁、核实特征、绑定身份并释放租赁,而不获取内容或推进任何光标。 繁忙意味着另一种租约存在,而不是身份批准. 预定工作者在内容之前还要核实身份。 授权失败或取消, 无法在生成后安装赠款 。 主办方必须清理无法安装的交换赠款。 永远不要创建可绕过赠款服务的合成手柄.

revoke() 引用被放出的直接围栏/清洗生命周期并处置连接器. 提供者确认与撤销服务是分开的状态;账户独立的排队工人履行这一请求。 即使暂停投票,也要进行维护和期满。 所有来源成果都保留私人所有权和删除/过期限制。 此软件包会显示没有发送、 回复、 附加下载或普通 URL 获取 .

版本与发布记录

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

版本发布日期距今
0.6.4latest2026/11/0115 天前
0.6.32026/10/2521 天前
0.6.22026/10/2224 天前
0.6.12026/10/2125 天前
0.6.02026/10/2026 天前
0.5.22026/10/1928 天前

关于 @framers/agentos-ext-gmail-source 的常见问题

@framers/agentos-ext-gmail-source 是什么?

仅读 OAuth 和绑定的个人 Gmail 源代码助手

如何安装 @framers/agentos-ext-gmail-source?

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

@framers/agentos-ext-gmail-source 支持 TypeScript 吗?

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

@framers/agentos-ext-gmail-source 支持 ESM 还是 CommonJS?

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

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

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

@framers/agentos-ext-gmail-source 可以商用吗?

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

@framers/agentos-ext-gmail-source 的下载量有多少?

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

@framers/agentos-ext-gmail-source 还在维护吗?

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