@skillfm/local 2.6.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/_vendored-contracts/index.d.ts +256 -0
  2. package/dist/_vendored-contracts/index.d.ts.map +1 -0
  3. package/dist/_vendored-contracts/index.js +47 -0
  4. package/dist/_vendored-contracts/index.js.map +1 -0
  5. package/dist/_vendored-contracts/skill-distribution.d.ts +207 -0
  6. package/dist/_vendored-contracts/skill-distribution.d.ts.map +1 -0
  7. package/dist/_vendored-contracts/skill-distribution.js +159 -0
  8. package/dist/_vendored-contracts/skill-distribution.js.map +1 -0
  9. package/dist/_vendored-contracts/skill-tunnel.d.ts +172 -0
  10. package/dist/_vendored-contracts/skill-tunnel.d.ts.map +1 -0
  11. package/dist/_vendored-contracts/skill-tunnel.js +58 -0
  12. package/dist/_vendored-contracts/skill-tunnel.js.map +1 -0
  13. package/dist/guard/bin.js +0 -0
  14. package/dist/index.js +0 -0
  15. package/dist/mcp-stdio/bin.js +0 -0
  16. package/dist/mcp-stdio/render-pending-llm-tasks.d.ts +66 -0
  17. package/dist/mcp-stdio/render-pending-llm-tasks.d.ts.map +1 -0
  18. package/dist/mcp-stdio/render-pending-llm-tasks.js +98 -0
  19. package/dist/mcp-stdio/render-pending-llm-tasks.js.map +1 -0
  20. package/dist/mcp-stdio/server.d.ts.map +1 -1
  21. package/dist/mcp-stdio/server.js +11 -22
  22. package/dist/mcp-stdio/server.js.map +1 -1
  23. package/dist/skill-installer/bundle-fetcher.d.ts +2 -2
  24. package/dist/skill-installer/bundle-fetcher.d.ts.map +1 -1
  25. package/dist/skill-installer/bundle-fetcher.js +29 -4
  26. package/dist/skill-installer/bundle-fetcher.js.map +1 -1
  27. package/dist/skill-installer/errors.d.ts +2 -2
  28. package/dist/skill-installer/errors.d.ts.map +1 -1
  29. package/dist/skill-installer/errors.js +1 -1
  30. package/dist/skill-installer/errors.js.map +1 -1
  31. package/dist/skill-installer/index.d.ts +1 -1
  32. package/dist/skill-installer/index.d.ts.map +1 -1
  33. package/dist/skill-installer/index.js +1 -1
  34. package/dist/skill-installer/index.js.map +1 -1
  35. package/dist/skill-installer/npm-installer.js +1 -1
  36. package/dist/skill-installer/npm-installer.js.map +1 -1
  37. package/dist/skill-installer/paths.d.ts +1 -1
  38. package/dist/skill-installer/paths.d.ts.map +1 -1
  39. package/dist/skill-installer/tar-extractor.d.ts +1 -1
  40. package/dist/skill-installer/tar-extractor.d.ts.map +1 -1
  41. package/dist/skill-installer/tar-extractor.js +1 -1
  42. package/dist/skill-installer/tar-extractor.js.map +1 -1
  43. package/dist/skill-runner/discovery.d.ts.map +1 -1
  44. package/dist/skill-runner/discovery.js +16 -16
  45. package/dist/skill-runner/discovery.js.map +1 -1
  46. package/dist/skill-tunnel/client.d.ts +2 -2
  47. package/dist/skill-tunnel/client.d.ts.map +1 -1
  48. package/dist/skill-tunnel/client.js +1 -1
  49. package/dist/skill-tunnel/client.js.map +1 -1
  50. package/dist/skill-tunnel/handshake.d.ts +1 -1
  51. package/dist/skill-tunnel/handshake.d.ts.map +1 -1
  52. package/dist/skill-tunnel/heartbeat.d.ts +1 -1
  53. package/dist/skill-tunnel/heartbeat.d.ts.map +1 -1
  54. package/dist/skill-tunnel/heartbeat.js +1 -1
  55. package/dist/skill-tunnel/heartbeat.js.map +1 -1
  56. package/dist/skill-tunnel/local-bridge.d.ts +1 -1
  57. package/dist/skill-tunnel/local-bridge.d.ts.map +1 -1
  58. package/dist/skill-tunnel/local-bridge.js +1 -1
  59. package/dist/skill-tunnel/local-bridge.js.map +1 -1
  60. package/dist/skill-tunnel/reconnect.js +1 -1
  61. package/dist/skill-tunnel/reconnect.js.map +1 -1
  62. package/package.json +7 -5
@@ -0,0 +1,159 @@
1
+ // ⚠️ AUTO-GENERATED — do not edit. Source: shared/contracts/envelope-v2/skill-distribution.ts
2
+ // Re-generate via `node sdk/skillfm-local/scripts/inline-contracts.ts`.
3
+ // Edit the source file in shared/contracts/envelope-v2/ instead.
4
+ // @skillfm/contracts — Skill Bundle Distribution(v0.2.1-draft)
5
+ //
6
+ // 本文件是 brain endpoint `GET /v1/skills/<slug>/bundle.tar.gz`、CI artifact pipeline
7
+ // 写入的 `skills.index.json`、@skillfm/local `skill_install` MCP tool input/output
8
+ // 三处的 CANONICAL 契约。三个 subagent 并行实现时严格按此 import。
9
+ //
10
+ // 权威来源:
11
+ // docs/prd/BRAIN-SKILL-CONTRACT-DELTA-2026-04-25-v0.2.1-skill-distribution.md
12
+ //
13
+ // 跟 v0.2 tunnel 的关系:
14
+ // - v0.2 (skill-tunnel.ts) 解决 "brain 怎么调到 agent 本地 skill"
15
+ // - v0.2.1 (本文件) 解决 "skill 代码怎么先到 agent 节点上"
16
+ // - 两者无 schema 冲突,前后衔接:bundle 装好 → run-skill → tunnel 注册
17
+ // ============================================================================
18
+ // §1 路径常量
19
+ // ============================================================================
20
+ /** brain endpoint base path(namespace 预留 v0.3 第三方 skill)*/
21
+ export const SKILL_BUNDLE_PATH = '/v1/skills/:slug/bundle.tar.gz';
22
+ export const SKILL_BUNDLE_PATH_NAMESPACED = '/v1/skills/:owner/:slug/bundle.tar.gz';
23
+ /** v0.2.1 默认 owner,路径上省略 */
24
+ export const DEFAULT_BUNDLE_OWNER = 'skillfm-official';
25
+ /** slug 校验正则(path param + tool input 共用)*/
26
+ export const SKILL_SLUG_REGEX = /^[a-z0-9-]{2,64}$/;
27
+ /** 赵云 bundle store 落盘路径(CI 写、brain 读)*/
28
+ export const ZHAOYUN_BUNDLE_STORE_DIR = '/opt/skill-bundles';
29
+ export const ZHAOYUN_BUNDLE_INDEX_FILENAME = 'skills.index.json';
30
+ // ============================================================================
31
+ // §4 错误码(统一前缀 SKILL.BUNDLE.*)
32
+ // ============================================================================
33
+ /**
34
+ * brain endpoint + @skillfm/local 共用错误码。
35
+ * 跨工作空间稳定字符串,禁止悄悄改名。
36
+ */
37
+ export const SKILL_BUNDLE_ERROR_CODES = {
38
+ // 4xx
39
+ BAD_SLUG: 'SKILL.BUNDLE.BAD_SLUG',
40
+ AUTH_MISSING_TOKEN: 'SKILL.BUNDLE.AUTH.MISSING_TOKEN',
41
+ AUTH_BAD_TOKEN: 'SKILL.BUNDLE.AUTH.BAD_TOKEN',
42
+ AUTH_TOKEN_REVOKED: 'SKILL.BUNDLE.AUTH.TOKEN_REVOKED',
43
+ /** alias for AUTH_MISSING_TOKEN — used by middleware code */
44
+ MISSING_TOKEN: 'SKILL.BUNDLE.AUTH.MISSING_TOKEN',
45
+ /** alias for AUTH_BAD_TOKEN — used by middleware code */
46
+ INVALID_TOKEN: 'SKILL.BUNDLE.AUTH.BAD_TOKEN',
47
+ /** alias for AUTH_TOKEN_REVOKED — used by middleware code */
48
+ TOKEN_REVOKED: 'SKILL.BUNDLE.AUTH.TOKEN_REVOKED',
49
+ ACCESS_DENIED: 'SKILL.BUNDLE.ACCESS.DENIED',
50
+ NOT_FOUND: 'SKILL.BUNDLE.NOT_FOUND',
51
+ VERSION_NOT_FOUND: 'SKILL.BUNDLE.VERSION_NOT_FOUND',
52
+ CHECKSUM_MISMATCH: 'SKILL.BUNDLE.CHECKSUM_MISMATCH',
53
+ // 5xx
54
+ NOT_READY: 'SKILL.BUNDLE.NOT_READY',
55
+ INTERNAL: 'SKILL.BUNDLE.INTERNAL',
56
+ };
57
+ /** HTTP status mapping(brain handler 用查表,client 错误处理也用)*/
58
+ export const SKILL_BUNDLE_ERROR_HTTP_STATUS = {
59
+ 'SKILL.BUNDLE.BAD_SLUG': 400,
60
+ 'SKILL.BUNDLE.AUTH.MISSING_TOKEN': 401,
61
+ 'SKILL.BUNDLE.AUTH.BAD_TOKEN': 401,
62
+ 'SKILL.BUNDLE.AUTH.TOKEN_REVOKED': 401,
63
+ 'SKILL.BUNDLE.ACCESS.DENIED': 403,
64
+ 'SKILL.BUNDLE.NOT_FOUND': 404,
65
+ 'SKILL.BUNDLE.VERSION_NOT_FOUND': 404,
66
+ 'SKILL.BUNDLE.CHECKSUM_MISMATCH': 409,
67
+ 'SKILL.BUNDLE.NOT_READY': 503,
68
+ 'SKILL.BUNDLE.INTERNAL': 500,
69
+ };
70
+ // ============================================================================
71
+ // §6 @skillfm/local skill_install MCP tool I/O
72
+ // ============================================================================
73
+ /** MCP tool name — 跨工作空间共用常量 */
74
+ export const SKILL_INSTALL_TOOL_NAME = 'skill_install';
75
+ /**
76
+ * client 侧 error codes — 比服务端错误码多几个本地步骤错误。
77
+ * 服务端错误(SKILL.BUNDLE.*)会被 client 重命名为更短的本地形式,
78
+ * 见 mapServerErrorToInstallError() 实现约束(每个 subagent 必须遵守)。
79
+ */
80
+ export const SKILL_INSTALL_ERROR_CODES = {
81
+ // 服务端错误归并
82
+ NETWORK_UNREACHABLE: 'NETWORK.UNREACHABLE',
83
+ AGENT_NOT_BOUND: 'AGENT.NOT_BOUND',
84
+ SKILL_NOT_FOUND: 'SKILL.NOT_FOUND',
85
+ SKILL_ACCESS_DENIED: 'SKILL.ACCESS.DENIED',
86
+ SKILL_NOT_READY: 'SKILL.NOT_READY',
87
+ // 本地步骤错误
88
+ BUNDLE_CHECKSUM_MISMATCH: 'BUNDLE.CHECKSUM_MISMATCH',
89
+ BUNDLE_EXTRACT_FAILED: 'BUNDLE.EXTRACT_FAILED',
90
+ BUNDLE_NPM_CI_FAILED: 'BUNDLE.NPM_CI_FAILED',
91
+ BUNDLE_MISSING_SERVER_JS: 'BUNDLE.MISSING_SERVER_JS',
92
+ BUNDLE_DISK_FULL: 'BUNDLE.DISK_FULL',
93
+ BUNDLE_LOCK_BUSY: 'BUNDLE.LOCK_BUSY',
94
+ // 配置 / 校验
95
+ INPUT_BAD_SLUG: 'INPUT.BAD_SLUG',
96
+ INTERNAL: 'INSTALL.INTERNAL',
97
+ };
98
+ // ============================================================================
99
+ // §8 bundle tarball 内容约束(CI 产 + client 校验)
100
+ // ============================================================================
101
+ /**
102
+ * tarball 解压后**必须存在**的入口文件。client 校验缺即 BUNDLE_MISSING_SERVER_JS。
103
+ *
104
+ * Phase 4 (2026-04-26 esbuild bundle 化, audit 簇 1 解):
105
+ * - 删 `package-lock.json` — esbuild bundle 已 inline workspace deps,
106
+ * user 节点 npm ci 只装 yaml/playwright 等真 npm 包, 不需要 per-skill lock
107
+ * - entry 改 `dist/bundle/server.js` — esbuild output, 0 @skillfm/* bare imports
108
+ *
109
+ * 历史 (P4 之前): ['skill.manifest.yaml', 'package.json', 'package-lock.json', 'dist/runtime/server.js']
110
+ * - lock 在 monorepo workspace 模式下根本生不出 (workspace * 不在 npm registry)
111
+ * - dist/runtime/server.js 含 bare @skillfm/* import → user 节点 npm ci 必爆 R-3
112
+ */
113
+ export const BUNDLE_REQUIRED_ENTRY_FILES = [
114
+ 'skill.manifest.yaml',
115
+ 'package.json',
116
+ 'dist/bundle/server.js',
117
+ ];
118
+ /**
119
+ * tarball 故意排除的目录/glob。Subagent C tar 命令 --exclude 用此清单。
120
+ * 注:runtime 必须保留(里面的 server.js 是入口)。
121
+ */
122
+ export const BUNDLE_EXCLUDE_GLOBS = [
123
+ 'node_modules',
124
+ '*.test.*',
125
+ '*.test.ts',
126
+ '__tests__',
127
+ '__mocks__',
128
+ 'src',
129
+ '.storage',
130
+ '.git*',
131
+ '.env*',
132
+ '*.local.*',
133
+ '.DS_Store',
134
+ ];
135
+ // ============================================================================
136
+ // §9 helper: server error → install error 映射
137
+ //
138
+ // 三个 subagent 看的同一份映射表,客户端 + 测试都按此实现。
139
+ // ============================================================================
140
+ export function mapServerErrorToInstallError(serverCode) {
141
+ switch (serverCode) {
142
+ case 'SKILL.BUNDLE.NOT_FOUND':
143
+ case 'SKILL.BUNDLE.VERSION_NOT_FOUND':
144
+ return SKILL_INSTALL_ERROR_CODES.SKILL_NOT_FOUND;
145
+ case 'SKILL.BUNDLE.ACCESS.DENIED':
146
+ return SKILL_INSTALL_ERROR_CODES.SKILL_ACCESS_DENIED;
147
+ case 'SKILL.BUNDLE.AUTH.MISSING_TOKEN':
148
+ case 'SKILL.BUNDLE.AUTH.BAD_TOKEN':
149
+ case 'SKILL.BUNDLE.AUTH.TOKEN_REVOKED':
150
+ return SKILL_INSTALL_ERROR_CODES.AGENT_NOT_BOUND;
151
+ case 'SKILL.BUNDLE.NOT_READY':
152
+ return SKILL_INSTALL_ERROR_CODES.SKILL_NOT_READY;
153
+ case 'SKILL.BUNDLE.CHECKSUM_MISMATCH':
154
+ return SKILL_INSTALL_ERROR_CODES.BUNDLE_CHECKSUM_MISMATCH;
155
+ default:
156
+ return SKILL_INSTALL_ERROR_CODES.INTERNAL;
157
+ }
158
+ }
159
+ //# sourceMappingURL=skill-distribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-distribution.js","sourceRoot":"","sources":["../../src/_vendored-contracts/skill-distribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /** 所有 frame 共享字段 */
2
+ export interface JsonRpcBase {
3
+ jsonrpc: '2.0';
4
+ /** ULID 或 UUID。每条 request 全局唯一。response 回传同一 id */
5
+ id: string;
6
+ }
7
+ /** Brain → Agent 请求 / Agent → Brain 心跳等主动消息 */
8
+ export interface JsonRpcRequest<M extends SkillTunnelMethod = SkillTunnelMethod, P = unknown> extends JsonRpcBase {
9
+ method: M;
10
+ params: P;
11
+ /** DELTA §5.4: HMAC-SHA256(id || method || JSON.stringify(params), SKILLFM_SKILL_AUTH_SECRET) */
12
+ meta?: {
13
+ hmac: string;
14
+ };
15
+ }
16
+ export interface JsonRpcSuccessResponse<R = unknown> extends JsonRpcBase {
17
+ result: R;
18
+ meta?: {
19
+ hmac: string;
20
+ };
21
+ }
22
+ export interface JsonRpcErrorResponse extends JsonRpcBase {
23
+ error: JsonRpcError;
24
+ meta?: {
25
+ hmac: string;
26
+ };
27
+ }
28
+ export type JsonRpcResponse<R = unknown> = JsonRpcSuccessResponse<R> | JsonRpcErrorResponse;
29
+ export type JsonRpcFrame = JsonRpcRequest | JsonRpcResponse;
30
+ /** JSON-RPC 2.0 错误结构 */
31
+ export interface JsonRpcError {
32
+ code: number;
33
+ message: string;
34
+ data?: {
35
+ /** 应用层 skill 错误码(映射到 brain 侧 §3.0 错误表) */
36
+ skill_error_code?: string;
37
+ retryable?: boolean;
38
+ skill_meta?: SkillMetaContract;
39
+ [k: string]: unknown;
40
+ };
41
+ }
42
+ export declare const TUNNEL_ERROR_CODES: {
43
+ /** JSON-RPC 2.0 standard */
44
+ readonly INVALID_REQUEST: -32600;
45
+ readonly METHOD_NOT_FOUND: -32601;
46
+ readonly INVALID_PARAMS: -32602;
47
+ readonly INTERNAL_ERROR: -32603;
48
+ /** 应用层: skill 业务错误(agent 本地 skill 抛出的已知业务错)*/
49
+ readonly SKILL_APP_ERROR: -32000;
50
+ /** Tunnel 层: agent 本地 skill daemon 不可达(brain 已连到 agent,但 agent→127.0.0.1:78xx 失败)*/
51
+ readonly TUNNEL_DEGRADED: -32100;
52
+ };
53
+ export type TunnelErrorCode = (typeof TUNNEL_ERROR_CODES)[keyof typeof TUNNEL_ERROR_CODES];
54
+ /**
55
+ * Brain → Agent(brain 主调,agent 被调)
56
+ * 对齐 BRAIN-SKILL-CONTRACT §3 的 5 接口 + abort + health
57
+ */
58
+ export type SkillTunnelServerMethod = 'skill.run' | 'skill.contribute_ctx' | 'skill.declare_must_relay' | 'skill.manifest' | 'skill.tool.invoke' | 'skill.continuation.abort' | 'skill.health';
59
+ /** Agent → Brain(agent 主调,保留给 heartbeat / 状态上报)*/
60
+ export type SkillTunnelClientMethod = 'tunnel.heartbeat' | 'tunnel.skill_update' | 'tunnel.log';
61
+ export type SkillTunnelMethod = SkillTunnelServerMethod | SkillTunnelClientMethod;
62
+ /** WebSocket 子协议 ID —— 两端必须匹配 */
63
+ export declare const TUNNEL_SUBPROTOCOL: "skillfm.skill-tunnel.v1";
64
+ /** agent → brain: handshake 阶段携带的 headers(除 WS 标准头外的 SkillFM 私有头)*/
65
+ export interface TunnelHandshakeHeaders {
66
+ /** 长期 agent_token(同 BRAIN §3 auth) */
67
+ 'x-agent-token': string;
68
+ /** SHA-256(agent_token) 的 hex,避免 token 原文多处出现 */
69
+ 'x-agent-id': string;
70
+ /** 逗号分隔 `slug@version`,告诉 brain 本节点起了哪些 skill daemon */
71
+ 'x-local-skills': string;
72
+ /** 逗号分隔 `slug=http://127.0.0.1:<port>`,本地 skill server 的 loopback URL */
73
+ 'x-local-skill-endpoints': string;
74
+ /** 16 byte 随机 hex(5 分钟滑窗防重放)*/
75
+ 'x-tunnel-nonce': string;
76
+ /** HMAC-SHA256(agent_token || nonce, SKILLFM_SKILL_AUTH_SECRET) */
77
+ 'x-tunnel-signature': string;
78
+ /** @skillfm/local 运行时版本,brain 可拒绝过低版本 */
79
+ 'x-skillfm-local-version': string;
80
+ }
81
+ /** Handshake 失败时 brain 返回 HTTP 响应 body */
82
+ export interface TunnelHandshakeRejectBody {
83
+ ok: false;
84
+ error: 'TUNNEL.AUTH.BAD_SIGNATURE' | 'TUNNEL.AUTH.AGENT_TOKEN_REVOKED' | 'TUNNEL.AUTH.NONCE_REUSED' | 'TUNNEL.CONN.ALREADY_CONNECTED' | 'TUNNEL.VERSION.UNSUPPORTED';
85
+ message: string;
86
+ /** 仅 VERSION.UNSUPPORTED 时返回 */
87
+ min_local_version?: string;
88
+ }
89
+ /** params for `skill.run` —— 封装现有 SkillRunRequest(见 platform/api types)*/
90
+ export interface SkillRunTunnelParams {
91
+ skill_slug: string;
92
+ /** 完整 SkillRunRequest(§3.1),由 brain 侧 SkillRpcClient 序列化透传。
93
+ * 本契约不重复列字段,避免 double-source-of-truth;unknown 是有意的 —— platform/api 内部
94
+ * 有详细 SkillRunRequest type,客户端透传时不需要知道每个字段。*/
95
+ request: unknown;
96
+ }
97
+ /** result for `skill.run` */
98
+ export interface SkillRunTunnelResult {
99
+ /** SkillRunResult 或 SkillRunLlmTasks union(§3.1 v0.1.1)*/
100
+ data: unknown;
101
+ skill_meta: SkillMetaContract;
102
+ }
103
+ export interface SkillMetaContract {
104
+ skill_slug: string;
105
+ skill_version: string;
106
+ processing_ms: number;
107
+ }
108
+ /** params for `skill.tool.invoke` */
109
+ export interface SkillToolInvokeTunnelParams {
110
+ skill_slug: string;
111
+ tool_name: string;
112
+ args: Record<string, unknown>;
113
+ /** §3.5 私有工具调用上下文(部分 SkillRunContext 字段)*/
114
+ context: unknown;
115
+ request_id: string;
116
+ }
117
+ /** params for `tunnel.heartbeat`(agent → brain)*/
118
+ export interface HeartbeatTunnelParams {
119
+ /** 本地 Unix ms 时间戳 */
120
+ ts: number;
121
+ /** 本地 skill daemon 状态快照 —— 每个 slug 的 pid + 内存 + 上次 health check */
122
+ local_skill_status: Record<string, {
123
+ pid: number;
124
+ rss_mb: number;
125
+ healthy: boolean;
126
+ last_check_at: number;
127
+ }>;
128
+ }
129
+ export interface HeartbeatTunnelResult {
130
+ /** brain 侧 Unix ms 时间戳,用于 agent 校准时钟 */
131
+ server_ts: number;
132
+ }
133
+ /** params for `tunnel.skill_update`(agent → brain,skill daemon 生命周期事件)*/
134
+ export interface SkillUpdateTunnelParams {
135
+ event: 'started' | 'stopped' | 'upgraded' | 'crashed';
136
+ skill_slug: string;
137
+ skill_version: string;
138
+ /** stopped / crashed 时填 */
139
+ endpoint: string | null;
140
+ occurred_at: number;
141
+ }
142
+ /** close code 4xxx 段 —— 应用层定义,agent 据此决定是否重连 */
143
+ export declare const TUNNEL_CLOSE_CODES: {
144
+ /** 心跳超时,agent 应重连 */
145
+ readonly HEARTBEAT_TIMEOUT: 4000;
146
+ /** 认证签名失败,agent 不应重连 */
147
+ readonly AUTH_BAD_SIGNATURE: 4001;
148
+ /** nonce 重用检测,agent 不应重连 */
149
+ readonly AUTH_NONCE_REUSED: 4002;
150
+ /** agent_token 已吊销,agent 不应重连 */
151
+ readonly AGENT_TOKEN_REVOKED: 4003;
152
+ /** 协议版本不兼容,agent 应升级 @skillfm/local */
153
+ readonly VERSION_UNSUPPORTED: 4101;
154
+ };
155
+ export type TunnelCloseCode = (typeof TUNNEL_CLOSE_CODES)[keyof typeof TUNNEL_CLOSE_CODES];
156
+ export declare const TUNNEL_CONSTANTS: {
157
+ /** Heartbeat 发送周期(agent 侧)*/
158
+ readonly HEARTBEAT_INTERVAL_MS: 25000;
159
+ /** Heartbeat 超时(brain 或 agent 侧任一未在此时间内收到对方 → 断线)*/
160
+ readonly HEARTBEAT_TIMEOUT_MS: 60000;
161
+ /** handshake nonce 滑动窗口(brain 侧 Redis sorted set TTL)*/
162
+ readonly HANDSHAKE_NONCE_WINDOW_MS: 300000;
163
+ /** nonce 轮转周期(agent 主动 refresh_nonce)*/
164
+ readonly NONCE_ROTATION_MS: 600000;
165
+ /** Reconnect 指数退避上限 */
166
+ readonly RECONNECT_MAX_DELAY_MS: 30000;
167
+ /** Reconnect 初始延迟 */
168
+ readonly RECONNECT_INITIAL_DELAY_MS: 1000;
169
+ /** JSON-RPC request timeout(< WS keepalive,Q8 决议)*/
170
+ readonly RPC_REQUEST_TIMEOUT_MS: 90000;
171
+ };
172
+ //# sourceMappingURL=skill-tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-tunnel.d.ts","sourceRoot":"","sources":["../../src/_vendored-contracts/skill-tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ // ⚠️ AUTO-GENERATED — do not edit. Source: shared/contracts/envelope-v2/skill-tunnel.ts
2
+ // Re-generate via `node sdk/skillfm-local/scripts/inline-contracts.ts`.
3
+ // Edit the source file in shared/contracts/envelope-v2/ instead.
4
+ // ============================================================================
5
+ // 错误码常量(DELTA §5.3)
6
+ // ============================================================================
7
+ export const TUNNEL_ERROR_CODES = {
8
+ /** JSON-RPC 2.0 standard */
9
+ INVALID_REQUEST: -32600,
10
+ METHOD_NOT_FOUND: -32601,
11
+ INVALID_PARAMS: -32602,
12
+ INTERNAL_ERROR: -32603,
13
+ /** 应用层: skill 业务错误(agent 本地 skill 抛出的已知业务错)*/
14
+ SKILL_APP_ERROR: -32000,
15
+ /** Tunnel 层: agent 本地 skill daemon 不可达(brain 已连到 agent,但 agent→127.0.0.1:78xx 失败)*/
16
+ TUNNEL_DEGRADED: -32100,
17
+ };
18
+ // ============================================================================
19
+ // Handshake(DELTA §5.1)
20
+ // ============================================================================
21
+ /** WebSocket 子协议 ID —— 两端必须匹配 */
22
+ export const TUNNEL_SUBPROTOCOL = 'skillfm.skill-tunnel.v1';
23
+ // ============================================================================
24
+ // Close codes(WebSocket close frame)
25
+ // ============================================================================
26
+ /** close code 4xxx 段 —— 应用层定义,agent 据此决定是否重连 */
27
+ export const TUNNEL_CLOSE_CODES = {
28
+ /** 心跳超时,agent 应重连 */
29
+ HEARTBEAT_TIMEOUT: 4000,
30
+ /** 认证签名失败,agent 不应重连 */
31
+ AUTH_BAD_SIGNATURE: 4001,
32
+ /** nonce 重用检测,agent 不应重连 */
33
+ AUTH_NONCE_REUSED: 4002,
34
+ /** agent_token 已吊销,agent 不应重连 */
35
+ AGENT_TOKEN_REVOKED: 4003,
36
+ /** 协议版本不兼容,agent 应升级 @skillfm/local */
37
+ VERSION_UNSUPPORTED: 4101,
38
+ };
39
+ // ============================================================================
40
+ // 协议级常量(供两端共用,避免 magic number 漂移)
41
+ // ============================================================================
42
+ export const TUNNEL_CONSTANTS = {
43
+ /** Heartbeat 发送周期(agent 侧)*/
44
+ HEARTBEAT_INTERVAL_MS: 25_000,
45
+ /** Heartbeat 超时(brain 或 agent 侧任一未在此时间内收到对方 → 断线)*/
46
+ HEARTBEAT_TIMEOUT_MS: 60_000,
47
+ /** handshake nonce 滑动窗口(brain 侧 Redis sorted set TTL)*/
48
+ HANDSHAKE_NONCE_WINDOW_MS: 300_000,
49
+ /** nonce 轮转周期(agent 主动 refresh_nonce)*/
50
+ NONCE_ROTATION_MS: 600_000,
51
+ /** Reconnect 指数退避上限 */
52
+ RECONNECT_MAX_DELAY_MS: 30_000,
53
+ /** Reconnect 初始延迟 */
54
+ RECONNECT_INITIAL_DELAY_MS: 1_000,
55
+ /** JSON-RPC request timeout(< WS keepalive,Q8 决议)*/
56
+ RPC_REQUEST_TIMEOUT_MS: 90_000,
57
+ };
58
+ //# sourceMappingURL=skill-tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-tunnel.js","sourceRoot":"","sources":["../../src/_vendored-contracts/skill-tunnel.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,4EAA4E;AAC5E,qEAAqE;AAwErE,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,4BAA4B;IAC5B,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;IACtB,8CAA8C;IAC9C,eAAe,EAAE,CAAC,KAAK;IACvB,oFAAoF;IACpF,eAAe,EAAE,CAAC,KAAK;CACf,CAAC;AAgCX,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,iCAAiC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAkC,CAAC;AAsGrE,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E,gDAAgD;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,qBAAqB;IACrB,iBAAiB,EAAE,IAAI;IACvB,wBAAwB;IACxB,kBAAkB,EAAE,IAAI;IACxB,4BAA4B;IAC5B,iBAAiB,EAAE,IAAI;IACvB,iCAAiC;IACjC,mBAAmB,EAAE,IAAI;IACzB,uCAAuC;IACvC,mBAAmB,EAAE,IAAI;CACjB,CAAC;AAKX,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,6BAA6B;IAC7B,qBAAqB,EAAE,MAAM;IAC7B,oDAAoD;IACpD,oBAAoB,EAAE,MAAM;IAC5B,wDAAwD;IACxD,yBAAyB,EAAE,OAAO;IAClC,wCAAwC;IACxC,iBAAiB,EAAE,OAAO;IAC1B,uBAAuB;IACvB,sBAAsB,EAAE,MAAM;IAC9B,qBAAqB;IACrB,0BAA0B,EAAE,KAAK;IACjC,oDAAoD;IACpD,sBAAsB,EAAE,MAAM;CACtB,CAAC"}
package/dist/guard/bin.js CHANGED
File without changes
package/dist/index.js CHANGED
File without changes
File without changes
@@ -0,0 +1,66 @@
1
+ /**
2
+ * §3.6 LlmTask 渲染器 — 把 brain.run 返回的 pending_llm_tasks 渲染成 agent 可执行的文本指令
3
+ *
4
+ * 协议: BRAIN-SKILL-CONTRACT-v1 §3.6 LlmTask Protocol
5
+ *
6
+ * 关键分支:
7
+ * - kind === 'image_generation' → 引导 agent 调本地 image provider, 返回 output_images[]
8
+ * - kind === 'text' (或缺省) → 原有文本 LLM 任务路径
9
+ *
10
+ * 抽出此文件原因 (2026-04-25 工程债清理窗口):
11
+ * - mcp-stdio/server.ts brain_run handler 内嵌渲染逻辑没法单测
12
+ * - 抽成纯函数后契约一致性可机器验证 (render-pending-llm-tasks.test.ts)
13
+ */
14
+ export type ImageGenParams = {
15
+ prompt: string;
16
+ style_refs?: string[];
17
+ subject_ref?: string;
18
+ aspect_ratio?: '1:1' | '4:3' | '3:4' | '16:9' | '9:16';
19
+ n?: number;
20
+ image_model_hint?: 'seedream' | 'minimax_image' | 'dalle' | 'midjourney' | string | null;
21
+ };
22
+ export type PendingLlmTask = {
23
+ task_id: string;
24
+ prompt: string;
25
+ system?: string;
26
+ schema?: object;
27
+ max_tokens?: number;
28
+ temperature?: number;
29
+ visibility: string;
30
+ kind?: 'text' | 'image_generation';
31
+ image_params?: ImageGenParams;
32
+ narration_pre_zh?: string;
33
+ narration_pre_en?: string;
34
+ narration_post_zh?: string;
35
+ narration_post_en?: string;
36
+ expected_seconds?: number;
37
+ };
38
+ export type PipelineProgress = {
39
+ current_round: number;
40
+ total_estimate: number;
41
+ hard_cap: number;
42
+ };
43
+ /**
44
+ * 渲染单个 image_generation task — 对应 §3.6 image_params 字段
45
+ */
46
+ export declare function renderImageGenerationTask(task: PendingLlmTask): string[];
47
+ /**
48
+ * 渲染单个 text task — 原有文本 LLM 任务路径
49
+ */
50
+ export declare function renderTextTask(task: PendingLlmTask): string[];
51
+ /**
52
+ * 渲染整个 pending_llm_tasks 块 — 含 progress + continuation_token + 多 task 列表
53
+ *
54
+ * 输出格式:
55
+ * [pipeline 进度: 1/3 轮, 上限 8] (可选)
56
+ * 需要你执行 N 个 LLM 任务,完成后用 continuation_token 续跑:
57
+ * continuation_token: <token>
58
+ *
59
+ * --- task_id: T1 ---
60
+ * <text task 渲染 OR image_generation 渲染>
61
+ *
62
+ * --- task_id: T2 ---
63
+ * ...
64
+ */
65
+ export declare function renderPendingLlmTasks(tasks: PendingLlmTask[], contToken: string, progress?: PipelineProgress): string;
66
+ //# sourceMappingURL=render-pending-llm-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-pending-llm-tasks.d.ts","sourceRoot":"","sources":["../../src/mcp-stdio/render-pending-llm-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,gBAAgB,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,OAAO,GAAG,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;CAC1F,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IAEnB,IAAI,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACnC,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,EAAE,CA+BxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,EAAE,CAO7D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,MAAM,CAoBR"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * §3.6 LlmTask 渲染器 — 把 brain.run 返回的 pending_llm_tasks 渲染成 agent 可执行的文本指令
3
+ *
4
+ * 协议: BRAIN-SKILL-CONTRACT-v1 §3.6 LlmTask Protocol
5
+ *
6
+ * 关键分支:
7
+ * - kind === 'image_generation' → 引导 agent 调本地 image provider, 返回 output_images[]
8
+ * - kind === 'text' (或缺省) → 原有文本 LLM 任务路径
9
+ *
10
+ * 抽出此文件原因 (2026-04-25 工程债清理窗口):
11
+ * - mcp-stdio/server.ts brain_run handler 内嵌渲染逻辑没法单测
12
+ * - 抽成纯函数后契约一致性可机器验证 (render-pending-llm-tasks.test.ts)
13
+ */
14
+ /**
15
+ * 渲染单个 image_generation task — 对应 §3.6 image_params 字段
16
+ */
17
+ export function renderImageGenerationTask(task) {
18
+ const lines = [];
19
+ if (!task.image_params) {
20
+ // 异常: kind 是 image_generation 但没 image_params,fallback 到原 prompt 渲染 + 警告
21
+ lines.push('[task type] image_generation (⚠️ 缺 image_params 字段, fallback 文本渲染)');
22
+ lines.push(task.prompt);
23
+ return lines;
24
+ }
25
+ lines.push('[task type] image_generation');
26
+ lines.push('');
27
+ lines.push('⚠️ 这是图像生成任务,不是文本任务。');
28
+ lines.push('你需要调用你本地配置的 image provider (火山方舟 Seedream / MiniMax image-01 / DALL-E 等) 出图,');
29
+ lines.push('返回 `output_images: [{ url, ttl_seconds?, model_used?, metadata? }]` 数组到 LlmTaskResult。');
30
+ lines.push('');
31
+ lines.push('[image_params]');
32
+ lines.push(` prompt: ${task.image_params.prompt}`);
33
+ if (task.image_params.style_refs?.length) {
34
+ lines.push(` style_refs (风格参考图,可多张): ${task.image_params.style_refs.join(', ')}`);
35
+ }
36
+ if (task.image_params.subject_ref) {
37
+ lines.push(` subject_ref (主体参考图,人物一致性): ${task.image_params.subject_ref}`);
38
+ }
39
+ lines.push(` aspect_ratio: ${task.image_params.aspect_ratio ?? '1:1'}`);
40
+ lines.push(` n (生成张数): ${task.image_params.n ?? 1}`);
41
+ if (task.image_params.image_model_hint) {
42
+ lines.push(` image_model_hint (建议模型,可不理): ${task.image_params.image_model_hint}`);
43
+ }
44
+ if (task.system)
45
+ lines.push(`[system] ${task.system}`);
46
+ if (task.expected_seconds)
47
+ lines.push(`[expected_seconds: ${task.expected_seconds}]`);
48
+ return lines;
49
+ }
50
+ /**
51
+ * 渲染单个 text task — 原有文本 LLM 任务路径
52
+ */
53
+ export function renderTextTask(task) {
54
+ const lines = [];
55
+ if (task.system)
56
+ lines.push(`[system] ${task.system}`);
57
+ lines.push(task.prompt);
58
+ if (task.schema)
59
+ lines.push(`[期望输出 schema] ${JSON.stringify(task.schema)}`);
60
+ if (task.max_tokens)
61
+ lines.push(`[max_tokens: ${task.max_tokens}]`);
62
+ return lines;
63
+ }
64
+ /**
65
+ * 渲染整个 pending_llm_tasks 块 — 含 progress + continuation_token + 多 task 列表
66
+ *
67
+ * 输出格式:
68
+ * [pipeline 进度: 1/3 轮, 上限 8] (可选)
69
+ * 需要你执行 N 个 LLM 任务,完成后用 continuation_token 续跑:
70
+ * continuation_token: <token>
71
+ *
72
+ * --- task_id: T1 ---
73
+ * <text task 渲染 OR image_generation 渲染>
74
+ *
75
+ * --- task_id: T2 ---
76
+ * ...
77
+ */
78
+ export function renderPendingLlmTasks(tasks, contToken, progress) {
79
+ const lines = [];
80
+ if (progress) {
81
+ lines.push(`[pipeline 进度: ${progress.current_round}/${progress.total_estimate} 轮, 上限 ${progress.hard_cap}]`);
82
+ }
83
+ lines.push(`需要你执行 ${tasks.length} 个 LLM 任务,完成后用 continuation_token 续跑:`);
84
+ lines.push(`continuation_token: ${contToken}`);
85
+ lines.push('');
86
+ for (const task of tasks) {
87
+ lines.push(`--- task_id: ${task.task_id} ---`);
88
+ if (task.kind === 'image_generation') {
89
+ lines.push(...renderImageGenerationTask(task));
90
+ }
91
+ else {
92
+ lines.push(...renderTextTask(task));
93
+ }
94
+ lines.push('');
95
+ }
96
+ return lines.join('\n');
97
+ }
98
+ //# sourceMappingURL=render-pending-llm-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-pending-llm-tasks.js","sourceRoot":"","sources":["../../src/mcp-stdio/render-pending-llm-tasks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp-stdio/server.ts"],"names":[],"mappings":";AAyBA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAOtF,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGzF,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ5E;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0CjH;AAWD,yCAAyC;AACzC,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAEtE;AAuCD,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,KAAK,cAAc,CAAC;AAEpG;;;GAGG;AACH,iBAAS,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,CA8zB9D;AA4BD,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAU1C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp-stdio/server.ts"],"names":[],"mappings":";AAyBA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAQtF,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAMzF,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ5E;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0CjH;AAWD,yCAAyC;AACzC,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAEtE;AAuCD,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,SAAS,KAAK,cAAc,CAAC;AAEpG;;;GAGG;AACH,iBAAS,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,CAmzB9D;AA4BD,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAU1C"}