@c轨道/艺术
为交换代理商及其用户提供版本文件和文件:在Hono路由上架的轨道中心模块 @intx/hub-api,在可插件中保留 Postgres 和字节中的版本 ContentStore以及辅助车的船舶代理工具.
为什么?
- 每个版本都保留. 文件或上传文件的每个版本都是新版本,其内容,字节和SHA-256摘要.
expectedVersion将修改变为比较和设定. - 就像任何枢纽路线一样.
createArtifactRoutes返回 aHono<TenantEnv>子应用程序。 读者只能是来电的房客 书写在中心requireGrant。 。 。 . - 探员通过同一家商店写作. 一个运行扫描的路由集和一个侧车工具包让一个工作流程运行来创建,读取和修改其用户所看到的文物.
- 移民安全回放. 每个SQL文件都具有"一能"性,在一个咨询锁下运行在每个靴子上,因此可以同时从几个复制品开始.
它没有UI,也没有物品商店: 宿主制造出文物,带来自己的 ContentStore 用于大型文件.
安装
bun add @corbits/artifacts \
@intx/agent @intx/authz @intx/db @intx/hub-api @intx/types \
drizzle-orm hono hono-openapi postgres
添加 @intx/agent 只有代理人使用侧车工具。 运行于节点QQ24.
快速启动
与 DATABASE_URL 指向运行过的中枢数据库 runArtifactMigrations (见 使用互换:
import {
createArtifact,
createArtifactDb,
getArtifact,
} from "@corbits/artifacts";
const { db, close } = createArtifactDb(process.env.DATABASE_URL!);
const created = await db.transaction((tx) =>
createArtifact(tx, {
scope: { tenantId: "acme", principalId: "alice" },
ownerPrincipalId: "alice",
kind: "document",
title: "Notes",
content: "Hello",
source: { origin: "manual" },
}),
);
console.log(await getArtifact(db, created.id));
await close();
acme 财务报告和审定财务报表 alice 必须是中心的租户和校长。 它在第一版打印文物.
合适的话
互换 由AI代理作为委托人:拥有自己身份、权限和证书的账户。 其枢纽是多租户控制平面,它持有租户、本金和赠款(允许在资源上持有本金);其侧车是代理运行时间.
- 运行于 : 中心,作为其Hono应用的路线及其Postgres的桌子
artifacts计划. - 插入到 :
@intx/hub-api路线和赠款,@intx/db(数量)DBConfig,以及tenant财务报告和审定财务报表principal作为FK目标的表格),以及@intx/agent工具在侧车. - 与 :
@corbits/mailbox财务报告和审定财务报表@corbits/memory,其他轨道中心模块,以及@corbits/agent-token为代理无记名标志.
参考文献
createArtifactRoutes(deps)
deps | 类型 | 主机提供的东西 |
|---|---|---|
db | ArtifactDb | 例如,枢纽的细雨柄 createDB。 。 。 . |
contentStore | ContentStore | 文件字节去的地方 . InlineContentStore 将其保存在 Postgres; 执行端口以保存对象. |
requireGrant | RequireGrant | 从 @intx/hub-api是因为 createRequireGrant。 。 。 . |
onArtifactCreated | (tx, row, scope) => Promise<void> | 可选的 在创建交易中运行以获取其他创建副效果 。 创造者 write 财务报告和审定财务报表 archive 补助金是给你的. |
decorate | (tenantId, rows) => Promise<void> | 可选的 在序列行中添加只显示字段。 它不能改变返回的行. |
uploadPolicy | UploadPolicy | 可选的 MIME 类型 POST /artifacts/upload 接受这个建议。 默认为 ARTIFACT_UPLOAD_POLICY。 。 。 . |
countSegments | ArtifactCountSegments | 可选的 名为上游 GET /artifacts/counts。 。 。 . |
| 路线 | 赠款 | 对 |
|---|---|---|
GET /artifacts | 无(租户范围) | 列出文物,被活化. 空 200 没有校长. |
GET /artifacts/counts | 无(租户范围) | 每起计数 countSegments 桶,还有 all。 。 。 . |
POST /artifacts | create 打开 artifact:* | 在 1 版本创建文本或 URL 文物 . |
POST /artifacts/upload | create 打开 artifact:* | 上传一个或多个文件( E)multipart/form-data),各有一件文物. |
GET /artifacts/:id | 无(租户范围) | 最新版本. |
GET /artifacts/:id/versions | 无(租户范围) | 版本历史. |
GET /artifacts/:id/versions/:version | 无(租户范围) | 一个版本,有其内容. |
POST /artifacts/:id/versions | write 打开 artifact:<id> | 添加 JSON 或新版本 file 用于上传文件. |
POST /artifacts/:id/archive, (中文(简体) ), unarchive | archive 打开 artifact:<id> | 存档或恢复. |
GET /artifacts/:id/download?version=N | 无(租户范围) | 一个版本的字节,默认最新. |
GET /artifacts/:id/preview | 无(租户范围) | A 类 text/html 沙盒式CSP下工艺品; 415 否则. |
没有主, 除了列表和数答之外, 每一个路线 403另一个租户的文物,或者一个身份不明的,回答 404。在主机上设置一个上传和重审路径的请求-机构限制;在检查前缓冲机构 MAX_UPLOAD_BYTES。 。 。 .
每次写报告 contentSha256,与新版本存储的hex sha256:在UTF-8文本上,或者在文件的字节上传. POST /artifacts 财务报告和审定财务报表 POST /artifacts/upload 每件文物都带着它 POST /artifacts/:id/versions 返回旁边 artifactId 财务报告和审定财务报表 version这是 null 仅针对摘要存在前所写的版本.
createWorkflowArtifactRoutes(deps)
用于工作流程运行的运行范围路由,该路由以无记名符号和 x-workflow-run-address 标题而不是会话 .
deps | 类型 | 主机提供的东西 |
|---|---|---|
db | ArtifactDb | 与上同为相. |
contentStore | ContentStore | 与上同为相. |
resolveRunScope | WorkflowRunResolver | (bearerToken, runAddress) => ResolvedWorkflowRunScope | null。 。 。 . null 答题 401。 。 。 . |
agentToken | AgentTokenAuth | 可选的 接受经纪人自己的中枢标志作为第二条入站方式. |
uploadPolicy | UploadPolicy | 可选的 MIME 类型 POST /artifacts/binary 接受这个建议。 默认为 ARTIFACT_UPLOAD_POLICY。 。 。 . |
maxBinaryBytes | number | 可选的 字节上限 POST /artifacts/binary默认为 MAX_UPLOAD_BYTES。 。 。 . |
maxContentChars | number | 可选的 由此产生的内容的字符上限——全文或经编辑的文本,用于 POST /artifacts 财务报告和审定财务报表 PATCH /artifacts/:id/versions默认为64 000. |
beforeWrite | WorkflowBeforeWrite | 可选的 检查每个文本创建( N)POST /artifacts)和修订(PATCH /artifacts/:id)作文前. 所有的写法都有效. |
beforeWrite({ scope, kind, write, content }) 得到运行范围, 文物种类, write 作为 { op: "create" } 或者说 { op: "revise", artifactId },且该版本在任何编辑后将保留内容。 它返回一个:
{ action: "allow" }照常写作.{ action: "refuse", code, message }答题422与{ code, message },而代理工具错误是message。 。 。 .code必须匹配/^[a-z0-9_]+$/· ;message必须是 1 到 1 000 个字符.{ action: "redirect", artifactId, expectedVersion? }将创作变成对文物的修改 必须是同类的 在跑的房客,回答200联合国{ id, version }。该修订取了创建的名称。 丢失、存档或其他租户的文物答案404和一个 staleexpectedVersion答题409告诉经纪人读读现有文物并修改.
任何其它决定, 重定向返回修改, 或重定向到另一类解答 500 写什么? 未检查二进制上传和链接文件 .
一个创造的检查不是连环化的:两个并发的创造都可以同时允许,因此,像"每个租户一个计划"这样的政策在跑步时仍然可以用两个计划来结束. 修改后的检查在持有文物行锁的交易内部进行,所以应当迅速,不得写出文物.
每笔笔写作POST /artifacts, (中文(简体) ), POST /artifacts/binary, (中文(简体) ), POST /artifacts/link-file, (中文(简体) ), PATCH /artifacts/:id回答问题 { data: { id, version, contentSha256 } },同一份摘要 租户路线报告。 对于 link-file 文摘覆盖存储 preview 文本( 当没有给出时为空),而不是工作空间文件 path。 。 。 .
runArtifactMigrations(config, { schema })
取同样的 DBConfig 财务报告和审定财务报表 schema 作为交换 runMigrations。 。 。 . schema 持有主机 tenant 财务报告和审定财务报表 principal 表格; 此软件包的表格总是输入 artifacts。 。 。 .
@corbits/artifacts/sidecar-bundle
artifacts 是一个 @intx/agent 3个工具的工具包。 他们把扫描过的路线叫做特工的 hub 证书.
artifact_write在未给出标识时, 从内容或工作空间文件路径创建 。 用一个ID来修改,或者用全文,或者用edits:准确的段落,每个段落必须出现一次,否则没有文字.expectedVersion如果新版本存在,则拒绝写入。 它回来了{ id, version, contentSha256 }。 。 。 .artifact_read返回内容,一个过去版本version区域offset财务报告和审定财务报表limit。 。 。 .artifact_search列出最新的文物,由kind由aquery与标题和内容相匹配.
使用互换
在互换后运行迁移, 挂载两套路由, 赠款 create 打开 artifact:* 给创造文物的负责人 给特工们工具包.
import { timeWindowEvaluator } from "@intx/authz";
import { createDB, createGrantStore, runMigrations } from "@intx/db";
import { createRequireGrant } from "@intx/hub-api";
import {
createArtifactRoutes,
InlineContentStore,
runArtifactMigrations,
} from "@corbits/artifacts";
const dbConfig = {
host: "localhost",
port: 5432,
user: "postgres",
password: "postgres",
database: "interchange",
};
await runMigrations(dbConfig, { schema: "public" });
await runArtifactMigrations(dbConfig, { schema: "public" });
const { db } = createDB(dbConfig);
const requireGrant = createRequireGrant({
grantStore: createGrantStore(db),
conditionRegistry: { time_window: timeWindowEvaluator },
});
export const artifactRoutes = createArtifactRoutes({
db,
contentStore: InlineContentStore,
requireGrant,
});
挂载 artifactRoutes 在中枢应用程序 /api在枢纽的认证 和租户中间的软件.
对于特工,挂载 createWorkflowArtifactRoutes({ db, contentStore: InlineContentStore, resolveRunScope }) 时间 /api/workflow-artifacts。 。 。 . resolveRunScope 这是主机的 (bearerToken, runAddress) 从中心的工作流程中返回租户和校长的查询,或者 null。侧车工具呼叫 /api/workflow-artifacts添加到代理中并绑定其 hub 在您部署时, 证书为代理的中枢符 :
import { defineAgent, type InferencePreference } from "@intx/agent";
import { artifacts } from "@corbits/artifacts/sidecar-bundle";
export function buildAssistant(sources: readonly InferencePreference[]) {
return defineAgent({
id: "assistant",
systemPrompt: "You help the team read and write shared artifacts.",
capabilities: [],
inference: { sources },
tools: [artifacts],
});
}
从0.1升级
mountArtifacts(app, opts)现在createArtifactRoutes(deps),以及mountWorkflowArtifacts(app, opts)现在createWorkflowArtifactRoutes(deps)双向挂载app.route。 。 。 .POST /artifacts财务报告和审定财务报表POST /artifacts/upload需求create打开artifact:*升级将它授予每个已经在其租户中创造出文物的校长;将它授予新的校长.runArtifactMigrations(db)现在runArtifactMigrations(dbConfig, { schema }). 现有0.1.0数据升级在第一个靴子上.- 那靴子掉了0.1.0的迁移分类账. 你不能回滚到0.1.0,0.1.0和0.2.0复制品不得共享数据库.
- 细细的桌子
web_site援助者,SKILL_DRAFT_KIND, (中文(简体) ),windowContent并拆除邮递路线和助手。 这个mail_attachment_ref表格已删除. - 需要24号节点或更新.
从0.2升级
由地表分隔:AGENTS(侧车工具包)和HOSTS(路线和出口)的变化.
代理工具
侧车工具包倒塌了 5个更精细的涂装工具变成了3个. artifact_write 现在涵盖创建和链接(通过 edits编号 :content 其定义如下: { artifactId, version } 结果是一样的.
| 0.2 工具 | 0.3 (韩语) | 怎么样 |
|---|---|---|
artifact_create | artifact_write | 没有就叫吧 artifactId,通过 title, (中文(简体) ), kind, (中文(简体) ), content。 。 。 . |
artifact_link_file | artifact_write | 没有就叫吧 artifactId,通过工作空间 path。 。 。 . |
artifact_read_chunk | artifact_read | 传送范围为 offset编号 :limit 改为 start编号 :end。 。 。 . |
artifact_list | artifact_search | 首先命令对结果进行最新更新. |
artifact_find_by_title | artifact_search | 没有一滴一滴——见下文的告诫. |
artifact_find_by_title 这不是一个滴入. 在0.2中它和标题相符 没错,只匹配标题,最多返回一个 { artifactId, version } (或作无. 在 0.3 时 artifact_search 对大小写不敏感的子字符串(ILKE)匹配 标题和内容,然后返回匹配的列表。 需要旧的准确标题、单结果语义的调用者必须在过滤结果后进行(比较) title 案件不敏感,并进行第一次精确的匹配.
搜索结果上限为每次呼叫50件文物. artifact_search 接受一个 cursor 财产(加) limit,上限为50),通过所有匹配的页面;回转先前的呼叫 nextCursor (保持相同的查询和类型)直到不返回.
主机
角色不变,但去掉了两条路线和一条出口:
GET /artifacts/find→GET /artifacts?query=…时query是标题和内容上相同的对大小写不敏感的子字符串.GET /artifacts/:id/chunk→GET /artifacts/:id/read?offset&limit。 。 。 .readArtifactChunk删除.findArtifactByTitle财务报告和审定财务报表linkFileArtifact继续出口.README.md是因为Reference一节描述当前的路线和工具.
现在从软件包条目导出两个错误类别: VersionConflictError 答题 409 当 expectedVersion 已经僵化 ArtifactEditError 答题 400 当修改被拒绝时。 把它们找出来 准确的失败给用户.