922a57fe34
Self-hosted 開源:WASM 零件 + recipe + cypher-executor,跑在你自己的 Cloudflare。 此為重建的乾淨歷史起點(移除曾誤 commit 的 GCP SA 金鑰,舊歷史保留在 richblack/arcrun 與本地 backup 分支)。含: - acr init --self-hosted installer(建 KV/R2 + codeload 拉預編譯 wasm + wrangler deploy + seed recipe) - recipe push 把關(資料外流提醒 + 打通檢查) - 19 個正當零件預編譯 wasm(claude_api/km_writer/kbdb_upsert_block 排除:違反 DECISIONS §1) - CLI / cypher-executor / registry / 完整 SDD Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
307 lines
10 KiB
TypeScript
307 lines
10 KiB
TypeScript
export const OPENAPI_SPEC = {
|
||
openapi: '3.0.3',
|
||
info: {
|
||
title: 'arcrun cypher-executor API',
|
||
description: 'AI Workflow Execution Engine — 透過三元組 Triplet 或圖 Graph 定義工作流,系統執行並回傳結果',
|
||
version: '1.0.0',
|
||
contact: {
|
||
name: 'arcrun',
|
||
url: 'https://github.com/arcrun/arcrun',
|
||
},
|
||
},
|
||
servers: [
|
||
{ url: 'https://cypher.arcrun.dev', description: 'arcrun.dev Hosted' },
|
||
{ url: 'http://localhost:8787', description: 'Local Development' },
|
||
],
|
||
paths: {
|
||
'/': {
|
||
get: {
|
||
summary: 'Health Check',
|
||
tags: ['Health'],
|
||
responses: {
|
||
'200': {
|
||
description: 'Service is running',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
service: { type: 'string' },
|
||
version: { type: 'string' },
|
||
status: { type: 'string' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
'/cypher/search': {
|
||
post: {
|
||
summary: '搜尋工作流需要的零件',
|
||
tags: ['Cypher'],
|
||
description: '用三元組描述工作流,系統解析並從 Registry 查詢對應零件',
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
triplets: {
|
||
type: 'array',
|
||
items: { type: 'string' },
|
||
example: ['start >> 完成後 >> get-data', 'get-data >> 完成後 >> done'],
|
||
description: '三元組陣列,格式:\"FROM >> ACTION >> TO\"',
|
||
},
|
||
auto_publish: {
|
||
type: 'boolean',
|
||
default: true,
|
||
description: '缺失的零件是否自動產生發佈',
|
||
},
|
||
},
|
||
required: ['triplets'],
|
||
},
|
||
},
|
||
},
|
||
},
|
||
responses: {
|
||
'200': {
|
||
description: '零件搜尋成功(含版本號和時戳,適合 Markdown 文檔追蹤)',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
version: { type: 'string', example: 'search-v1-20260327-143022', description: '版本號(endpoint-v{major}-{timestamp})' },
|
||
timestamp: { type: 'string', format: 'date-time', description: 'ISO 8601 時戳' },
|
||
triplets: { type: 'array', items: { type: 'string' }, description: '回送的三元組列表' },
|
||
nodes: { type: 'object', description: '搜尋到的零件及其狀態' },
|
||
cypher: { type: 'object', description: '工作流圖(null 若有缺失零件)' },
|
||
missing: { type: 'array', items: { type: 'string' }, description: '缺失零件列表' },
|
||
auto_published: { type: 'object', description: '自動發佈的零件(若 auto_publish=true)' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
'400': { description: '無法解析三元組' },
|
||
},
|
||
},
|
||
},
|
||
'/cypher/execute': {
|
||
post: {
|
||
summary: '執行工作流',
|
||
tags: ['Cypher'],
|
||
description: '直接執行 triplets,回傳完整執行結果。支援自動發佈缺失零件。',
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
triplets: {
|
||
type: 'array',
|
||
items: { type: 'string' },
|
||
description: '三元組陣列,格式:"FROM >> ACTION >> TO"',
|
||
},
|
||
context: {
|
||
type: 'object',
|
||
description: '執行上下文,傳入各節點作為初始參數',
|
||
},
|
||
auto_publish: {
|
||
type: 'boolean',
|
||
default: true,
|
||
description: '缺失的零件是否自動產生臨時實作',
|
||
},
|
||
},
|
||
required: ['triplets'],
|
||
},
|
||
},
|
||
},
|
||
},
|
||
responses: {
|
||
'200': {
|
||
description: '執行成功(含版本號和時戳)',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
version: { type: 'string', example: 'execute-v1-20260327-143022', description: '版本號(endpoint-v{major}-{timestamp})' },
|
||
timestamp: { type: 'string', format: 'date-time', description: 'ISO 8601 時戳' },
|
||
success: { type: 'boolean', enum: [true] },
|
||
data: { type: 'object', description: '執行結果' },
|
||
trace: { type: 'array', description: '執行跟蹤' },
|
||
duration_ms: { type: 'number' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
'500': {
|
||
description: '執行失敗或部份零件缺失(含版本號和時戳)',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
version: { type: 'string', example: 'execute-v1-20260327-143022', description: '版本號(endpoint-v{major}-{timestamp})' },
|
||
timestamp: { type: 'string', format: 'date-time', description: 'ISO 8601 時戳' },
|
||
success: { type: 'boolean', enum: [false] },
|
||
error: { type: 'string' },
|
||
missing: { type: 'array', items: { type: 'string' }, description: '無法自動發佈的缺失零件' },
|
||
auto_published: {
|
||
type: 'object',
|
||
description: '自動發佈的零件資訊',
|
||
additionalProperties: {
|
||
type: 'object',
|
||
properties: {
|
||
ok: { type: 'boolean' },
|
||
componentId: { type: 'string' },
|
||
temporary_endpoint: { type: 'string', format: 'uri', description: '臨時實作的 URL' },
|
||
implement_by: { type: 'string', format: 'date-time', description: '實作截止時間' },
|
||
},
|
||
},
|
||
},
|
||
duration_ms: { type: 'number' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
'/webhooks': {
|
||
post: {
|
||
summary: '建立 Webhook',
|
||
tags: ['Webhooks'],
|
||
description: '將工作流註冊成 Webhook,得到公開 URL',
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
triplets: {
|
||
type: 'array',
|
||
items: { type: 'string' },
|
||
},
|
||
description: { type: 'string' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
responses: {
|
||
'201': {
|
||
description: 'Webhook 建立成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
token: { type: 'string' },
|
||
webhook_url: { type: 'string', format: 'uri' },
|
||
description: { type: 'string' },
|
||
created_at: { type: 'string', format: 'date-time' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
get: {
|
||
summary: '列出所有 Webhooks',
|
||
tags: ['Webhooks'],
|
||
parameters: [
|
||
{
|
||
name: 'Authorization',
|
||
in: 'header',
|
||
required: true,
|
||
schema: { type: 'string', example: 'Bearer u6u_xxxxx' },
|
||
description: 'API Key 認證',
|
||
},
|
||
],
|
||
responses: {
|
||
'200': {
|
||
description: 'Webhooks 列表',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
webhooks: {
|
||
type: 'array',
|
||
items: {
|
||
type: 'object',
|
||
properties: {
|
||
token: { type: 'string' },
|
||
description: { type: 'string' },
|
||
created_at: { type: 'string', format: 'date-time' },
|
||
},
|
||
},
|
||
},
|
||
total: { type: 'number' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
},
|
||
'401': { description: '未授權' },
|
||
},
|
||
},
|
||
},
|
||
'/webhooks/{token}': {
|
||
get: {
|
||
summary: '查詢單個 Webhook',
|
||
tags: ['Webhooks'],
|
||
parameters: [
|
||
{
|
||
name: 'token',
|
||
in: 'path',
|
||
required: true,
|
||
schema: { type: 'string' },
|
||
},
|
||
],
|
||
responses: {
|
||
'200': {
|
||
description: 'Webhook 資訊',
|
||
},
|
||
'404': { description: 'Webhook 不存在' },
|
||
},
|
||
},
|
||
delete: {
|
||
summary: '刪除 Webhook',
|
||
tags: ['Webhooks'],
|
||
parameters: [
|
||
{
|
||
name: 'token',
|
||
in: 'path',
|
||
required: true,
|
||
schema: { type: 'string' },
|
||
},
|
||
],
|
||
responses: {
|
||
'200': { description: 'Webhook 已刪除' },
|
||
'404': { description: 'Webhook 不存在' },
|
||
},
|
||
},
|
||
},
|
||
},
|
||
components: {
|
||
securitySchemes: {
|
||
ApiKeyAuth: {
|
||
type: 'apiKey',
|
||
in: 'header',
|
||
name: 'Authorization',
|
||
},
|
||
},
|
||
},
|
||
};
|