@absolutejs/manifest

中文文档
0.10.0发布于 2026/08/23MITTypeScriptES Module零依赖近 30 天下载 2.4万

绝对JS包单合同. 每个@absolutejs/* 包都从它的./ 明显子路径输出出一个打入的列表(设置 schema, env 要求, 适配器插槽, 接线配方, AI 工具) ; 此包是这些列表是拼写的合同

中文使用文档
文档目录7 节
  1. 代理行动授权(合同2)
  2. 无代码集成作用
  3. 为什么类型框
  4. 撰写一份清单
  5. 包装管道
  6. 消费清单
  7. 适应器槽

@absolutejs/manifest(绝对)

0.4版本通过构建使远程工具安全. 合同表2 宣布足够的策略元数据,供主机或无代码控制平面解释, 批准、租赁、执行、审计,并在可能情况下对每一项行动给予补偿. Contract-1显示仍装入目录和升级工具,但其工具 故意省略AI和MCP桥.

代理行动授权(合同2)

合同2增加了语义工具效应和执行要求。 这些是 政策投入,而不是模式提示:

send_email: tool.runtime({
  authorization: {
    approval: "policy",
    audience: "owner",
    destinationFields: ["to"],
    effects: ["send", "external-network"],
    idempotency: { mode: "host" },
    requiredScopes: ["email:send"],
    reversible: false,
  },
  // input, handler, description…
});

桥梁被关闭: 工具被省略,除非清单是合同2 工具具有有效的授权元数据、运行时间或工作空间能力 以及东道方用品 ToolBindings.enforce。执行者得到 深冻,验证,默认的论据, 他们的犬科SHA-256摘要, 软件包/工具身份,以及单用途执行关闭。 结 论 执行返回时过期, 关闭批准- 现在/ 执行- 不同- 输入间隙。 一个主机可以包 批准,授权, idepotency租赁, 并记录收货情况.

inspectManifestSecurity 返回每个工具的姿态和可操作的问题代码 用于目录和无编码的 UI。 它检查范围,公众曝光,目的地, (c) 资源与开支约束、一能性、可逆性/补偿, 破坏性提示,只读提示,以及每个引用的输入字段.

绝对JS包单合同. 每个 @absolutejs/* 软件包 出口其类型 ./manifest 描述什么 软件包是,它需要什么, 它如何连接到一个应用程序, 什么AI工具 提供。 这个包是合同 那些清单被写反 - 加上将任何显示变成AI工具地图的桥梁 (单位:千美元)@absolutejs/ai)或远程MCP工具登记册(@absolutejs/mcp),这样 任何人都可以在生态系统的顶端建立AI工具或MCP服务器 不只是绝对JS自己的产品.

麻省理工学院有执照 单一对等依赖 : @sinclair/typebox。 。 。 .

无代码集成作用

软件包明确描述无码主机如何集成它们:

  • integration: { mode: "recipe" } 拥有可执行线条,必须发布于 至少一张接线菜谱.
  • integration: { mode: "adapter" } 填补一个命名的生态系统位置并必须 至少发布一个 implements 输入.
  • integration: { mode: "code-first", description: "…" } 仍然可以搜索 并且可以解释 但东道主不能假装可以自动组装 特定生产商店、政策、签字人、召回或身份.

没有此字段的旧表对于兼容性仍然有效 。 消费者 可能保留对这些套件的历史推论,但目前 清单应明确宣布该角色.

为什么类型框

TypeBox 计划同时是 TypeScript 类型(通过 Static<>)和a 数据 plain JSON Schema 运行时的对象。 这才成为真相的唯一来源 用于工具的输入: 相同的计数器在编译时键入处理器, 并且是 将逐字记录交给AI供应商(input_schema)和MCP(inputSchema) (中文(简体) ). 没有 手写出JSON Schema,没有漂移.

撰写一份清单

// src/manifest.ts of @absolutejs/dispatch
import { Type } from "@sinclair/typebox";
import { defineManifest, toolFactory } from "@absolutejs/manifest";
import type { Dispatcher, DispatcherOptions } from "./types";

const tool = toolFactory<Dispatcher>();

export const manifest = defineManifest<DispatcherOptions, Dispatcher>()({
  contract: 2,
  identity: {
    category: "messaging",
    name: "@absolutejs/dispatch",
    tagline: "Send email, texts, and push notifications from your site.",
  },
  settings: Type.Object({
    defaultFrom: Type.Optional(
      Type.Object(
        { email: Type.Optional(Type.String({ format: "email" })) },
        { title: "Default sender" },
      ),
    ),
  }),
  slots: {
    email: {
      configPath: "email",
      contract: "dispatch/email-adapter",
      description: "Email transport",
      known: ["@absolutejs/dispatch-resend", "@absolutejs/dispatch-postmark"],
    },
  },
  tools: {
    send_email: tool.runtime({
      annotations: { openWorldHint: true },
      authorization: {
        approval: "policy",
        audience: "owner",
        destinationFields: ["to"],
        effects: ["send", "external-network"],
        idempotency: { mode: "host" },
        requiredScopes: ["email:send"],
        reversible: false,
      },
      description: "Send a transactional email through the configured adapter.",
      handler: async (input, dispatcher) => {
        const result = await dispatcher.email(input);

        return `sent via ${result.provider}`;
      },
      input: Type.Object({
        subject: Type.String(),
        text: Type.String(),
        to: Type.String({ format: "email" }),
      }),
    }),
  },
  wiring: [
    {
      id: "default",
      server: {
        code: "const dispatcher = createDispatcher({ email: ${slot.email}, ...${settings} });",
        imports: [
          { from: "@absolutejs/dispatch", names: ["createDispatcher"] },
        ],
        placement: "module-scope",
      },
      title: "Create the dispatcher",
    },
  ],
});

defineManifest<TConfig, TRuntime>() 是断流者: settings schema 与软件包的真实导出配置类型相匹配 。 重命名一个 不更新清单和软件包本身的配置密钥 tsc 失败 此模块。 类型安全在升级中存活下来,因为它在 类型存在.

服务器接线使用放置来保存生命周期语义: server-boundary 在第一个路径( 错误抓取, 请求) 之前挂载 上下文,以及必须观察每个处理器的其他钩; server-plugin 加入普通插件链; module-scope 创造顶级资源 server-factory 保留给主机厂组成。 客户食谱的使用 client-entry。 。 。 .

包装管道

// package.json
{
  "absolutejs": {
    "manifestContract": 2,
  },
  "exports": {
    "./manifest": {
      "types": "./dist/manifest.d.ts",
      "import": "./dist/manifest.js",
    },
    "./manifest.json": "./dist/manifest.json",
  },
  "scripts": {
    "build": "… && absolute-manifest emit",
  },
}

absolute-manifest emit 验证运算表(schema,工具键命名, 预设值、 package.json 协议和同伴依赖关系)并写入 dist/manifest.json - 可序列投影(剥去手)用于 无法执行软件包代码的消费者. 它是衍生出来的, 从来没有手写, 所以这两种形式是不能分开的. absolute-manifest scaffold 生成一个 启动 src/manifest.ts。 。 。 .

标准包元数据是唯一的依赖合同. 安装主机 运行时间 peerDependencies中,可选性 peerDependenciesMeta,则 测试所用的版本 devDependencies在软件包中配置外部 实际构建命令或构建 API。 没有平行的绝对JS依赖地图 所需经费.

absolute-manifest verify-package 检查衍生的同行关系,例如 拒绝复制到的同位素 dependencies。 。 。 . absolute-manifest verify-tree [directory] 连续应用相同的检查 但不包括生成和依赖目录.

消费清单

import { loadManifest, toAIToolMap, toMcpToolRegistry } from '@absolutejs/manifest';

const result = await loadManifest('@absolutejs/dispatch');
if (!result.ok) throw new Error(result.details);

// AI tool loop (@absolutejs/ai)
const enforce = async (request, execute) => {
    await agency.authorizeAndLease(request);
    const toolResult = await execute();
    await agency.recordReceipt(request, toolResult);

    return toolResult;
};
const tools = toAIToolMap(result.manifest, { enforce, runtime: dispatcher });
streamAIToSSE({ tools, ... });

// Remote MCP server (@absolutejs/mcp)
new Elysia().use(mcpServer({
    path: '/mcp',
    tools: () => toMcpToolRegistry(result.manifest, { enforce, runtime: dispatcher })
}));

桥梁验证和默认执行前的每一次呼叫 关闭失败。 。 。 . 合同-1工具、无人看守工具、缺少运行时间、没有工作空间 没有执行者的主机从不出现在登记册中.

搬运工得不到任何环境——没有 process.env没有主持人的秘密。 A 类 runtime 工具获得构建主机的软件包实例; a workspace 工具会让主机被囚禁 Workspace (阅读/glob/write/exec,各获批) (第1行,第2行,第3行) 运行不可信运算表的主机应另编 @absolutejs/ai是因为 hardenUntrustedTool 越过了桥梁地图.

适应器槽

核心软件包声明 插槽 (单位:千美元)contract: 'dispatch/email-adapter'(三); 声明适配软件包 implements 使用同一合同编号的条目. 消费者通过扫描安装的货单来解决问题 所以发布新的 销售商适配器点亮每个消费者,没有核心发布. 保留编号 而被冻结的接线占位符语法 合同(md)。 。 。 .

版本与发布记录

@absolutejs/manifest 共发布 17 个版本,首次发布于 2026/07/13;过去 12 个月发布了 17 个版本。

版本发布日期距今
0.10.0latest2026/08/232 个月前
0.9.02026/08/202 个月前
0.8.02026/07/273 个月前
0.7.32026/07/273 个月前
0.7.22026/07/253 个月前
0.7.12026/07/253 个月前

关于 @absolutejs/manifest 的常见问题

@absolutejs/manifest 是什么?

绝对JS包单合同. 每个@absolutejs/* 包都从它的./ 明显子路径输出出一个打入的列表(设置 schema, env 要求, 适配器插槽, 接线配方, AI 工具) ; 此包是这些列表是拼写的合同

如何安装 @absolutejs/manifest?

在项目目录运行 npm install @absolutejs/manifest,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:typebox(>=1.3.0 <2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 absolute-manifest,可以用 npx absolute-manifest 直接运行。

@absolutejs/manifest 支持 TypeScript 吗?

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

@absolutejs/manifest 支持 ESM 还是 CommonJS?

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

@absolutejs/manifest 可以商用吗?

@absolutejs/manifest 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@absolutejs/manifest 的下载量有多少?

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

@absolutejs/manifest 还在维护吗?

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