@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)。 。 。 .