@skillfm/local 2.7.9 → 2.7.11

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 (172) hide show
  1. package/dist/_vendored-contracts/beacon-assets-v1.d.ts +160 -0
  2. package/dist/_vendored-contracts/beacon-assets-v1.d.ts.map +1 -0
  3. package/dist/_vendored-contracts/beacon-assets-v1.js +29 -0
  4. package/dist/_vendored-contracts/beacon-assets-v1.js.map +1 -0
  5. package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  6. package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  7. package/dist/_vendored-contracts/beacon-mcp-tools-v1.js +131 -0
  8. package/dist/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  9. package/dist/_vendored-contracts/beacon-preferences-v1.d.ts +68 -0
  10. package/dist/_vendored-contracts/beacon-preferences-v1.d.ts.map +1 -0
  11. package/dist/_vendored-contracts/beacon-preferences-v1.js +26 -0
  12. package/dist/_vendored-contracts/beacon-preferences-v1.js.map +1 -0
  13. package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts +208 -0
  14. package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts.map +1 -0
  15. package/dist/_vendored-contracts/beacon-rule-protocol-v1.js +25 -0
  16. package/dist/_vendored-contracts/beacon-rule-protocol-v1.js.map +1 -0
  17. package/dist/_vendored-contracts/beacon-usage-v1.d.ts +88 -0
  18. package/dist/_vendored-contracts/beacon-usage-v1.d.ts.map +1 -0
  19. package/dist/_vendored-contracts/beacon-usage-v1.js +27 -0
  20. package/dist/_vendored-contracts/beacon-usage-v1.js.map +1 -0
  21. package/dist/_vendored-contracts/index.d.ts +29 -0
  22. package/dist/_vendored-contracts/index.d.ts.map +1 -1
  23. package/dist/_vendored-contracts/index.js.map +1 -1
  24. package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts +149 -0
  25. package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts.map +1 -0
  26. package/dist/_vendored-contracts/safe-skill-observation-v1.js +23 -0
  27. package/dist/_vendored-contracts/safe-skill-observation-v1.js.map +1 -0
  28. package/dist/_vendored-contracts/skill-distribution.d.ts +16 -0
  29. package/dist/_vendored-contracts/skill-distribution.d.ts.map +1 -1
  30. package/dist/_vendored-contracts/skill-distribution.js.map +1 -1
  31. package/dist/agent-forcing/claude-code-skill-v2.d.ts +4 -1
  32. package/dist/agent-forcing/claude-code-skill-v2.d.ts.map +1 -1
  33. package/dist/agent-forcing/claude-code-skill-v2.js +5 -6
  34. package/dist/agent-forcing/claude-code-skill-v2.js.map +1 -1
  35. package/dist/agent-forcing/forcing-rules.d.ts +0 -9
  36. package/dist/agent-forcing/forcing-rules.d.ts.map +1 -1
  37. package/dist/agent-forcing/forcing-rules.js +61 -9
  38. package/dist/agent-forcing/forcing-rules.js.map +1 -1
  39. package/dist/agent-forcing/injectors.d.ts.map +1 -1
  40. package/dist/agent-forcing/injectors.js +11 -0
  41. package/dist/agent-forcing/injectors.js.map +1 -1
  42. package/dist/agent-forcing/slash-commands.d.ts +49 -0
  43. package/dist/agent-forcing/slash-commands.d.ts.map +1 -0
  44. package/dist/agent-forcing/slash-commands.js +166 -0
  45. package/dist/agent-forcing/slash-commands.js.map +1 -0
  46. package/dist/beacon/apprentice-capabilities.d.ts +10 -0
  47. package/dist/beacon/apprentice-capabilities.d.ts.map +1 -0
  48. package/dist/beacon/apprentice-capabilities.js +34 -0
  49. package/dist/beacon/apprentice-capabilities.js.map +1 -0
  50. package/dist/checkup/dimension-1-usage.d.ts +8 -1
  51. package/dist/checkup/dimension-1-usage.d.ts.map +1 -1
  52. package/dist/checkup/dimension-1-usage.js +3 -2
  53. package/dist/checkup/dimension-1-usage.js.map +1 -1
  54. package/dist/checkup/dimension-2-context.d.ts +12 -0
  55. package/dist/checkup/dimension-2-context.d.ts.map +1 -0
  56. package/dist/checkup/dimension-2-context.js +56 -0
  57. package/dist/checkup/dimension-2-context.js.map +1 -0
  58. package/dist/checkup/dimension-5-behavior.d.ts +12 -0
  59. package/dist/checkup/dimension-5-behavior.d.ts.map +1 -0
  60. package/dist/checkup/dimension-5-behavior.js +40 -0
  61. package/dist/checkup/dimension-5-behavior.js.map +1 -0
  62. package/dist/checkup/dimension-6-injection.d.ts +41 -0
  63. package/dist/checkup/dimension-6-injection.d.ts.map +1 -0
  64. package/dist/checkup/dimension-6-injection.js +74 -0
  65. package/dist/checkup/dimension-6-injection.js.map +1 -0
  66. package/dist/checkup/index.d.ts +3 -0
  67. package/dist/checkup/index.d.ts.map +1 -1
  68. package/dist/checkup/index.js +3 -0
  69. package/dist/checkup/index.js.map +1 -1
  70. package/dist/checkup/last-report.d.ts +32 -0
  71. package/dist/checkup/last-report.d.ts.map +1 -0
  72. package/dist/checkup/last-report.js +91 -0
  73. package/dist/checkup/last-report.js.map +1 -0
  74. package/dist/checkup/report.d.ts +13 -1
  75. package/dist/checkup/report.d.ts.map +1 -1
  76. package/dist/checkup/report.js +5 -3
  77. package/dist/checkup/report.js.map +1 -1
  78. package/dist/forcing-cli.d.ts +1 -1
  79. package/dist/forcing-cli.d.ts.map +1 -1
  80. package/dist/forcing-cli.js +1 -52
  81. package/dist/forcing-cli.js.map +1 -1
  82. package/dist/guard/bin.js +0 -0
  83. package/dist/guard/prompt-context.d.ts +2 -2
  84. package/dist/guard/prompt-context.d.ts.map +1 -1
  85. package/dist/guard/prompt-context.js +16 -21
  86. package/dist/guard/prompt-context.js.map +1 -1
  87. package/dist/index.js +15 -8
  88. package/dist/index.js.map +1 -1
  89. package/dist/mcp/brain-client.d.ts.map +1 -1
  90. package/dist/mcp/brain-client.js +3 -0
  91. package/dist/mcp/brain-client.js.map +1 -1
  92. package/dist/mcp/index.d.ts +1 -0
  93. package/dist/mcp/index.d.ts.map +1 -1
  94. package/dist/mcp/index.js +5 -0
  95. package/dist/mcp/index.js.map +1 -1
  96. package/dist/mcp/tools/checkup.d.ts +17 -2
  97. package/dist/mcp/tools/checkup.d.ts.map +1 -1
  98. package/dist/mcp/tools/checkup.js +41 -3
  99. package/dist/mcp/tools/checkup.js.map +1 -1
  100. package/dist/mcp/tools/index.d.ts.map +1 -1
  101. package/dist/mcp/tools/index.js +42 -4
  102. package/dist/mcp/tools/index.js.map +1 -1
  103. package/dist/mcp/tools/install-module.d.ts +25 -0
  104. package/dist/mcp/tools/install-module.d.ts.map +1 -0
  105. package/dist/mcp/tools/install-module.js +87 -0
  106. package/dist/mcp/tools/install-module.js.map +1 -0
  107. package/dist/mcp/tools/send-daily-report.d.ts +29 -0
  108. package/dist/mcp/tools/send-daily-report.d.ts.map +1 -0
  109. package/dist/mcp/tools/send-daily-report.js +61 -0
  110. package/dist/mcp/tools/send-daily-report.js.map +1 -0
  111. package/dist/mcp/tools/setup-gateway.d.ts +2 -1
  112. package/dist/mcp/tools/setup-gateway.d.ts.map +1 -1
  113. package/dist/mcp/tools/setup-gateway.js +24 -6
  114. package/dist/mcp/tools/setup-gateway.js.map +1 -1
  115. package/dist/mcp/tools/setup-safe.d.ts +2 -0
  116. package/dist/mcp/tools/setup-safe.d.ts.map +1 -0
  117. package/dist/mcp/tools/setup-safe.js +2 -0
  118. package/dist/mcp/tools/setup-safe.js.map +1 -0
  119. package/dist/mcp-stdio/bin.js +0 -0
  120. package/dist/mcp-stdio/server.d.ts.map +1 -1
  121. package/dist/mcp-stdio/server.js +89 -1
  122. package/dist/mcp-stdio/server.js.map +1 -1
  123. package/dist/safe/index.d.ts +5 -0
  124. package/dist/safe/index.d.ts.map +1 -0
  125. package/dist/safe/index.js +9 -0
  126. package/dist/safe/index.js.map +1 -0
  127. package/dist/safe-cli.d.ts +8 -0
  128. package/dist/safe-cli.d.ts.map +1 -0
  129. package/dist/safe-cli.js +61 -0
  130. package/dist/safe-cli.js.map +1 -0
  131. package/dist/safe-observation/collector.d.ts +21 -0
  132. package/dist/safe-observation/collector.d.ts.map +1 -0
  133. package/dist/safe-observation/collector.js +101 -0
  134. package/dist/safe-observation/collector.js.map +1 -0
  135. package/dist/safe-observation/store.d.ts +34 -0
  136. package/dist/safe-observation/store.d.ts.map +1 -0
  137. package/dist/safe-observation/store.js +80 -0
  138. package/dist/safe-observation/store.js.map +1 -0
  139. package/dist/save-token/gateway-setup.d.ts +33 -3
  140. package/dist/save-token/gateway-setup.d.ts.map +1 -1
  141. package/dist/save-token/gateway-setup.js +165 -18
  142. package/dist/save-token/gateway-setup.js.map +1 -1
  143. package/dist/scheduler/brain-push-client.d.ts.map +1 -1
  144. package/dist/scheduler/brain-push-client.js +53 -3
  145. package/dist/scheduler/brain-push-client.js.map +1 -1
  146. package/dist/scheduler/types.d.ts +5 -0
  147. package/dist/scheduler/types.d.ts.map +1 -1
  148. package/dist/scheduler/types.js +3 -1
  149. package/dist/scheduler/types.js.map +1 -1
  150. package/dist/setup-safe.d.ts +20 -0
  151. package/dist/setup-safe.d.ts.map +1 -0
  152. package/dist/setup-safe.js +93 -0
  153. package/dist/setup-safe.js.map +1 -0
  154. package/dist/skill-installer/index.d.ts +9 -0
  155. package/dist/skill-installer/index.d.ts.map +1 -1
  156. package/dist/skill-installer/index.js +20 -1
  157. package/dist/skill-installer/index.js.map +1 -1
  158. package/dist/skill-runner/discovery.d.ts.map +1 -1
  159. package/dist/skill-runner/discovery.js +8 -5
  160. package/dist/skill-runner/discovery.js.map +1 -1
  161. package/dist/skill-tunnel/cli.d.ts.map +1 -1
  162. package/dist/skill-tunnel/cli.js +22 -0
  163. package/dist/skill-tunnel/cli.js.map +1 -1
  164. package/dist/skill-tunnel/client.d.ts +5 -0
  165. package/dist/skill-tunnel/client.d.ts.map +1 -1
  166. package/dist/skill-tunnel/client.js +2 -0
  167. package/dist/skill-tunnel/client.js.map +1 -1
  168. package/dist/skill-tunnel/local-bridge.d.ts +9 -0
  169. package/dist/skill-tunnel/local-bridge.d.ts.map +1 -1
  170. package/dist/skill-tunnel/local-bridge.js +24 -1
  171. package/dist/skill-tunnel/local-bridge.js.map +1 -1
  172. package/package.json +3 -3
@@ -9,11 +9,48 @@
9
9
  // 3. revertGateway() — 1 行 unset 命令让用户随时回滚
10
10
  //
11
11
  // 透明性: 改任何文件前 surface 给用户 + 提供 revert 命令.
12
- // MVP: gateway 端 URL 用 placeholder (https://gateway.skillfm.ai), 真 gateway 服务 2.7.5 上线.
12
+ // Safety contract:
13
+ // This setup path may only point agents at a public LLM provider proxy.
14
+ // The internal platform/gateway service is a Brain→Skill RPC gateway and must
15
+ // never be written into ANTHROPIC_BASE_URL / OPENAI_API_BASE.
13
16
  import * as fs from 'node:fs';
14
17
  import * as path from 'node:path';
15
18
  import { homedir } from 'node:os';
16
19
  export const SKILLFM_GATEWAY_BASE_URL = process.env.SKILLFM_GATEWAY_BASE_URL ?? 'https://gateway.skillfm.ai';
20
+ const DEFAULT_GATEWAY_TIMEOUT_MS = 2_000;
21
+ const GATEWAY_BLOCK_BEGIN = '# === SkillFM Gateway (added by skillfm_setup_gateway) ===';
22
+ const GATEWAY_BLOCK_END = '# === SkillFM Gateway end ===';
23
+ const GATEWAY_BLOCK_RE = new RegExp(`\\n?${escapeRegExp(GATEWAY_BLOCK_BEGIN)}[\\s\\S]*?${escapeRegExp(GATEWAY_BLOCK_END)}\\n?`, 'g');
24
+ function escapeRegExp(s) {
25
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
26
+ }
27
+ function stripTrailingSlash(s) {
28
+ return s.replace(/\/+$/, '');
29
+ }
30
+ function gatewayProviderUrl(provider, gatewayBaseUrl = SKILLFM_GATEWAY_BASE_URL) {
31
+ return `${stripTrailingSlash(gatewayBaseUrl)}/${provider}`;
32
+ }
33
+ function gatewayHealthUrl(gatewayBaseUrl = SKILLFM_GATEWAY_BASE_URL) {
34
+ return `${stripTrailingSlash(gatewayBaseUrl)}/health`;
35
+ }
36
+ function buildGatewayShellBlock(gatewayBaseUrl = SKILLFM_GATEWAY_BASE_URL) {
37
+ return [
38
+ '',
39
+ GATEWAY_BLOCK_BEGIN,
40
+ `export ANTHROPIC_BASE_URL="${gatewayProviderUrl('anthropic', gatewayBaseUrl)}"`,
41
+ `export OPENAI_API_BASE="${gatewayProviderUrl('openai', gatewayBaseUrl)}"`,
42
+ GATEWAY_BLOCK_END,
43
+ '',
44
+ ].join('\n');
45
+ }
46
+ export function normalizeShellGatewayBlocks(content, gatewayBaseUrl = SKILLFM_GATEWAY_BASE_URL) {
47
+ const matches = content.match(GATEWAY_BLOCK_RE) ?? [];
48
+ const withoutBlocks = content.replace(GATEWAY_BLOCK_RE, '\n').replace(/\n{3,}/g, '\n\n').trimEnd();
49
+ return {
50
+ content: `${withoutBlocks}${buildGatewayShellBlock(gatewayBaseUrl)}`,
51
+ removed_count: matches.length,
52
+ };
53
+ }
17
54
  /**
18
55
  * 检测各 IDE 的配置 + 当前 BASE_URL
19
56
  */
@@ -98,11 +135,21 @@ async function detectContinue() {
98
135
  async function detectShellEnv() {
99
136
  const current_anthropic = process.env.ANTHROPIC_BASE_URL;
100
137
  const current_openai = process.env.OPENAI_API_BASE;
101
- const isConfigured = !!(current_anthropic?.includes('skillfm') || current_openai?.includes('skillfm'));
102
138
  // 检测 shell rc
103
139
  const zshrc = path.join(homedir(), '.zshrc');
104
140
  const bashrc = path.join(homedir(), '.bashrc');
105
141
  const cfgPath = fs.existsSync(zshrc) ? zshrc : fs.existsSync(bashrc) ? bashrc : undefined;
142
+ let hasGatewayBlock = false;
143
+ if (cfgPath) {
144
+ try {
145
+ const rc = await fs.promises.readFile(cfgPath, 'utf-8');
146
+ hasGatewayBlock = rc.includes(GATEWAY_BLOCK_BEGIN) && rc.includes(GATEWAY_BLOCK_END);
147
+ }
148
+ catch {
149
+ hasGatewayBlock = false;
150
+ }
151
+ }
152
+ const isConfigured = hasGatewayBlock || !!(current_anthropic?.includes('skillfm') || current_openai?.includes('skillfm'));
106
153
  return {
107
154
  ide: 'shell-env',
108
155
  detected: !!cfgPath,
@@ -111,9 +158,106 @@ async function detectShellEnv() {
111
158
  setup_status: isConfigured ? 'configured' : 'not_configured',
112
159
  };
113
160
  }
114
- export async function setupClaudeCodeGateway() {
161
+ export async function checkGatewayReadiness(opts = {}) {
162
+ const gatewayBaseUrl = opts.gatewayBaseUrl ?? SKILLFM_GATEWAY_BASE_URL;
163
+ const checkedUrl = gatewayHealthUrl(gatewayBaseUrl);
164
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
165
+ if (!fetchImpl) {
166
+ return {
167
+ ok: false,
168
+ gateway_base_url: gatewayBaseUrl,
169
+ checked_url: checkedUrl,
170
+ error: 'fetch unavailable in this runtime',
171
+ };
172
+ }
173
+ const controller = new AbortController();
174
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_GATEWAY_TIMEOUT_MS);
175
+ if (typeof timer.unref === 'function')
176
+ timer.unref();
177
+ try {
178
+ const res = await fetchImpl(checkedUrl, { method: 'GET', signal: controller.signal });
179
+ if (!res.ok) {
180
+ return {
181
+ ok: false,
182
+ gateway_base_url: gatewayBaseUrl,
183
+ checked_url: checkedUrl,
184
+ status: res.status,
185
+ error: `health returned HTTP ${res.status}`,
186
+ };
187
+ }
188
+ const health = await readGatewayHealthJson(res);
189
+ const data = healthData(health);
190
+ const gatewayKind = typeof data.gateway_kind === 'string' ? data.gateway_kind : undefined;
191
+ const capabilities = normalizeCapabilities(data.capabilities);
192
+ const providerProxy = gatewayKind === 'llm_provider_proxy' && capabilities.includes('provider_proxy');
193
+ if (!providerProxy) {
194
+ return {
195
+ ok: false,
196
+ gateway_base_url: gatewayBaseUrl,
197
+ checked_url: checkedUrl,
198
+ status: res.status,
199
+ gateway_kind: gatewayKind,
200
+ capabilities,
201
+ error: gatewayKind === 'skill_rpc_gateway'
202
+ ? 'health endpoint belongs to SkillFM internal skill RPC gateway, not the LLM provider proxy'
203
+ : 'health endpoint does not advertise llm_provider_proxy/provider_proxy capability',
204
+ };
205
+ }
206
+ return {
207
+ ok: true,
208
+ gateway_base_url: gatewayBaseUrl,
209
+ checked_url: checkedUrl,
210
+ status: res.status,
211
+ gateway_kind: gatewayKind,
212
+ capabilities,
213
+ };
214
+ }
215
+ catch (e) {
216
+ return {
217
+ ok: false,
218
+ gateway_base_url: gatewayBaseUrl,
219
+ checked_url: checkedUrl,
220
+ error: e.message,
221
+ };
222
+ }
223
+ finally {
224
+ clearTimeout(timer);
225
+ }
226
+ }
227
+ async function readGatewayHealthJson(res) {
228
+ if (!res.json)
229
+ return undefined;
230
+ try {
231
+ return await res.json();
232
+ }
233
+ catch {
234
+ return undefined;
235
+ }
236
+ }
237
+ function healthData(payload) {
238
+ if (!payload || typeof payload !== 'object')
239
+ return {};
240
+ const root = payload;
241
+ const nested = root.data;
242
+ if (nested && typeof nested === 'object')
243
+ return nested;
244
+ return root;
245
+ }
246
+ function normalizeCapabilities(value) {
247
+ if (Array.isArray(value)) {
248
+ return value.filter((v) => typeof v === 'string');
249
+ }
250
+ if (value && typeof value === 'object') {
251
+ return Object.entries(value)
252
+ .filter(([, enabled]) => enabled === true)
253
+ .map(([name]) => name);
254
+ }
255
+ return [];
256
+ }
257
+ export async function setupClaudeCodeGateway(opts = {}) {
115
258
  const settingsPath = path.join(homedir(), '.claude', 'settings.json');
116
259
  const ide = 'claude-code';
260
+ const gatewayBaseUrl = opts.gatewayBaseUrl ?? SKILLFM_GATEWAY_BASE_URL;
117
261
  if (!fs.existsSync(settingsPath)) {
118
262
  // Claude Code 不存在 → skip
119
263
  return { ide, applied: false, error: 'Claude Code not detected' };
@@ -128,7 +272,7 @@ export async function setupClaudeCodeGateway() {
128
272
  const content = await fs.promises.readFile(settingsPath, 'utf-8');
129
273
  const settings = JSON.parse(content);
130
274
  settings.env = settings.env ?? {};
131
- settings.env.ANTHROPIC_BASE_URL = SKILLFM_GATEWAY_BASE_URL;
275
+ settings.env.ANTHROPIC_BASE_URL = gatewayProviderUrl('anthropic', gatewayBaseUrl);
132
276
  await fs.promises.writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
133
277
  return {
134
278
  ide,
@@ -142,8 +286,9 @@ export async function setupClaudeCodeGateway() {
142
286
  return { ide, applied: false, error: e.message };
143
287
  }
144
288
  }
145
- export async function setupShellEnvGateway() {
289
+ export async function setupShellEnvGateway(opts = {}) {
146
290
  const ide = 'shell-env';
291
+ const gatewayBaseUrl = opts.gatewayBaseUrl ?? SKILLFM_GATEWAY_BASE_URL;
147
292
  const zshrc = path.join(homedir(), '.zshrc');
148
293
  const bashrc = path.join(homedir(), '.bashrc');
149
294
  const rcPath = fs.existsSync(zshrc) ? zshrc : fs.existsSync(bashrc) ? bashrc : null;
@@ -154,16 +299,10 @@ export async function setupShellEnvGateway() {
154
299
  await fs.promises.mkdir(backupDir, { recursive: true, mode: 0o700 });
155
300
  const backupPath = path.join(backupDir, path.basename(rcPath));
156
301
  await fs.promises.copyFile(rcPath, backupPath);
157
- const block = [
158
- '',
159
- '# === SkillFM Gateway (added by skillfm_setup_gateway) ===',
160
- `export ANTHROPIC_BASE_URL="${SKILLFM_GATEWAY_BASE_URL}/anthropic"`,
161
- `export OPENAI_API_BASE="${SKILLFM_GATEWAY_BASE_URL}/openai"`,
162
- '# === SkillFM Gateway end ===',
163
- '',
164
- ].join('\n');
165
302
  try {
166
- await fs.promises.appendFile(rcPath, block, 'utf-8');
303
+ const current = await fs.promises.readFile(rcPath, 'utf-8').catch(() => '');
304
+ const normalized = normalizeShellGatewayBlocks(current, gatewayBaseUrl);
305
+ await fs.promises.writeFile(rcPath, normalized.content, 'utf-8');
167
306
  return {
168
307
  ide,
169
308
  applied: true,
@@ -179,9 +318,17 @@ export async function setupShellEnvGateway() {
179
318
  /**
180
319
  * 一键配 — 所有检测到的 IDE
181
320
  */
182
- export async function setupAllDetectedGateways() {
183
- const detections = await detectIDEs();
321
+ export async function setupAllDetectedGateways(opts = {}) {
322
+ const detections = opts.detections ?? await detectIDEs();
323
+ const readiness = opts.gatewayReadiness ?? await checkGatewayReadiness(opts);
184
324
  const results = [];
325
+ if (!readiness.ok) {
326
+ return [{
327
+ ide: 'gateway',
328
+ applied: false,
329
+ error: `gateway unavailable (${readiness.checked_url}): ${readiness.error ?? `HTTP ${readiness.status ?? 'unknown'}`}`,
330
+ }];
331
+ }
185
332
  for (const d of detections) {
186
333
  if (!d.detected)
187
334
  continue;
@@ -190,9 +337,9 @@ export async function setupAllDetectedGateways() {
190
337
  continue;
191
338
  }
192
339
  if (d.ide === 'claude-code')
193
- results.push(await setupClaudeCodeGateway());
340
+ results.push(await setupClaudeCodeGateway(opts));
194
341
  else if (d.ide === 'shell-env')
195
- results.push(await setupShellEnvGateway());
342
+ results.push(await setupShellEnvGateway(opts));
196
343
  // Cursor / Codex / Aider / Continue: MVP 仅 surface 提示用户手动配 (UI 复杂)
197
344
  }
198
345
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-setup.js","sourceRoot":"","sources":["../../src/save-token/gateway-setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway-setup.js","sourceRoot":"","sources":["../../src/save-token/gateway-setup.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"brain-push-client.d.ts","sourceRoot":"","sources":["../../src/scheduler/brain-push-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAsCnF"}
1
+ {"version":3,"file":"brain-push-client.d.ts","sourceRoot":"","sources":["../../src/scheduler/brain-push-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,MAAM,WAAW,sBAAsB;IACrC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAsDnF"}
@@ -2,8 +2,41 @@
2
2
  //
3
3
  // Default BrainPushClient — POST 到 brain /v1/beacon/usage/snapshot + /v1/beacon/assets/registry
4
4
  // 用于 sidecar 启动时 wire 自动 monitoring (Phase 2 走通 Beacon)。
5
- const USAGE_PATH = '/v1/beacon/usage/snapshot';
6
- const ASSETS_PATH = '/v1/beacon/assets/registry';
5
+ import { BEACON_ASSETS_REGISTRY_PATH } from '../_vendored-contracts/beacon-assets-v1.js';
6
+ import { BEACON_USAGE_SNAPSHOT_PATH } from '../_vendored-contracts/beacon-usage-v1.js';
7
+ import { SAFE_SKILL_OBSERVATION_PATH } from '../_vendored-contracts/safe-skill-observation-v1.js';
8
+ const USAGE_PATH = BEACON_USAGE_SNAPSHOT_PATH;
9
+ const ASSETS_PATH = BEACON_ASSETS_REGISTRY_PATH;
10
+ function normalizeAssetForBeacon(asset) {
11
+ if (!asset || typeof asset !== 'object')
12
+ return null;
13
+ const obj = asset;
14
+ const rawType = obj.asset_type;
15
+ const rawExpiresAt = obj.expires_at;
16
+ if (typeof rawType !== 'string' || typeof rawExpiresAt !== 'string' || rawExpiresAt.length === 0) {
17
+ return null;
18
+ }
19
+ const mappedType = rawType === 'api_credit' || rawType === 'cdn_credit' ? 'api_balance' : rawType;
20
+ if (!['domain', 'ssl', 'vps', 'card', 'api_balance', 'subscription'].includes(mappedType)) {
21
+ return null;
22
+ }
23
+ const displayName = obj.display_name ?? obj.identifier ?? obj.asset_name;
24
+ if (typeof displayName !== 'string' || displayName.length === 0)
25
+ return null;
26
+ const provider = typeof obj.provider === 'string' ? obj.provider : undefined;
27
+ return {
28
+ asset_type: mappedType,
29
+ asset_name: displayName,
30
+ expires_at: rawExpiresAt,
31
+ provider,
32
+ metadata: {
33
+ identifier: typeof obj.identifier === 'string' ? obj.identifier : undefined,
34
+ status: typeof obj.status === 'string' ? obj.status : undefined,
35
+ days_left: typeof obj.days_left === 'number' ? obj.days_left : undefined,
36
+ balance_usd: typeof obj.balance_usd === 'number' ? obj.balance_usd : undefined,
37
+ },
38
+ };
39
+ }
7
40
  export function createBrainPushClient(opts) {
8
41
  const { apiRoot, agentToken, userAgent, timeoutMs = 30_000 } = opts;
9
42
  const headers = {
@@ -39,7 +72,24 @@ export function createBrainPushClient(opts) {
39
72
  return postJson(USAGE_PATH, { snapshots: records, client_timestamp: new Date().toISOString() });
40
73
  },
41
74
  async pushAssetRegistry(assets) {
42
- return postJson(ASSETS_PATH, { assets, client_timestamp: new Date().toISOString() });
75
+ const normalized = assets.map(normalizeAssetForBeacon).filter((asset) => asset !== null);
76
+ if (normalized.length === 0)
77
+ return { ok: true };
78
+ const errors = [];
79
+ for (const asset of normalized) {
80
+ const result = await postJson(ASSETS_PATH, asset);
81
+ if (!result.ok)
82
+ errors.push(result.error ?? 'unknown asset push error');
83
+ }
84
+ return errors.length === 0 ? { ok: true } : { ok: false, error: errors.join(' | ') };
85
+ },
86
+ async pushSafeSkillObservations(observations) {
87
+ if (observations.length === 0)
88
+ return { ok: true };
89
+ return postJson(SAFE_SKILL_OBSERVATION_PATH, {
90
+ observations,
91
+ client_timestamp: new Date().toISOString(),
92
+ });
43
93
  },
44
94
  };
45
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brain-push-client.js","sourceRoot":"","sources":["../../src/scheduler/brain-push-client.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,gGAAgG;AAChG,yDAAyD;AAezD,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAC/C,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,IAA4B;IAChE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACpE,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU;QAC3B,YAAY,EAAE,SAAS;KACxB,CAAC;IAEF,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAa;QACjD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;gBAC3C,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,iBAAiB,CAAC,OAAO;YAC7B,OAAO,QAAQ,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,MAAM;YAC5B,OAAO,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"brain-push-client.js","sourceRoot":"","sources":["../../src/scheduler/brain-push-client.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,11 @@ export interface BrainPushClient {
35
35
  ok: boolean;
36
36
  error?: string;
37
37
  }>;
38
+ /** push SAFE skill observations 到 brain /v1/beacon/safe/skill-observations */
39
+ pushSafeSkillObservations(observations: unknown[]): Promise<{
40
+ ok: boolean;
41
+ error?: string;
42
+ }>;
38
43
  }
39
44
  export interface SchedulerConfig {
40
45
  /** 每次轮询间隔 (default: 30 min) */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,6DAA6D;IAC7D,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oCAAoC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,6DAA6D;IAC7D,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,8EAA8E;IAC9E,yBAAyB,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9F;AAID,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oCAAoC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -10,5 +10,7 @@
10
10
  // 4. connector.fetchUsage(key, period) → UsageRecord[]
11
11
  // 5. 聚合 + push 到 brain /v1/beacon/usage/snapshot (经 reverse tunnel)
12
12
  // 6. 失败重试 + 单条 connector 失败不影响其他
13
- export {};
13
+ import { BEACON_ASSETS_REGISTRY_PATH } from '../_vendored-contracts/beacon-assets-v1.js';
14
+ import { BEACON_USAGE_SNAPSHOT_PATH } from '../_vendored-contracts/beacon-usage-v1.js';
15
+ void [BEACON_USAGE_SNAPSHOT_PATH, BEACON_ASSETS_REGISTRY_PATH];
14
16
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,yCAAyC;AACzC,kEAAkE;AAClE,EAAE;AACF,kBAAkB;AAClB,gDAAgD;AAChD,+BAA+B;AAC/B,0DAA0D;AAC1D,yDAAyD;AACzD,sEAAsE;AACtE,mCAAmC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,yCAAyC;AACzC,kEAAkE;AAClE,EAAE;AACF,kBAAkB;AAClB,gDAAgD;AAChD,+BAA+B;AAC/B,0DAA0D;AAC1D,yDAAyD;AACzD,sEAAsE;AACtE,mCAAmC;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAkCvF,KAAK,CAAC,0BAA0B,EAAE,2BAA2B,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { HarnessDetection, SafeContextResult } from './safe/index.js';
2
+ import type { SkillFmToolResult } from './mcp/_vendored-contracts/beacon-mcp-tools-v1.js';
3
+ export interface SkillFmSetupSafeInput {
4
+ /** dry_run=true 仅 detect 不真改 */
5
+ dry_run?: boolean;
6
+ /** uninstall=true 移除已注入的 (跟 install 互斥) */
7
+ uninstall?: boolean;
8
+ /** Sidecar URL 注入到 guide */
9
+ sidecar_url?: string;
10
+ /** 包版本写入 guide header */
11
+ version?: string;
12
+ }
13
+ export interface SkillFmSetupSafeOutput {
14
+ detections: HarnessDetection[];
15
+ results: SafeContextResult[];
16
+ rendered: string;
17
+ }
18
+ export declare function handleSetupSafe(input: SkillFmSetupSafeInput): Promise<SkillFmToolResult<SkillFmSetupSafeOutput>>;
19
+ export declare const handleSetupAgentForcing: typeof handleSetupSafe;
20
+ //# sourceMappingURL=setup-safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-safe.d.ts","sourceRoot":"","sources":["../src/setup-safe.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAE1F,MAAM,WAAW,qBAAqB;IACpC,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAuBpD;AA8ED,eAAO,MAAM,uBAAuB,wBAAkB,CAAC"}
@@ -0,0 +1,93 @@
1
+ // sdk/skillfm-local/src/setup-safe.ts
2
+ //
3
+ // SAFE wrapper around the legacy agent-forcing setup tool.
4
+ import { detectAllHarnesses, injectAllDetected, removeAllInjections, } from './safe/index.js';
5
+ export async function handleSetupSafe(input) {
6
+ const dry_run = input.dry_run ?? false;
7
+ const uninstall = input.uninstall ?? false;
8
+ try {
9
+ const detections = await detectAllHarnesses();
10
+ let results = [];
11
+ if (uninstall) {
12
+ results = await removeAllInjections();
13
+ }
14
+ else if (!dry_run) {
15
+ results = await injectAllDetected({
16
+ sidecar_url: input.sidecar_url,
17
+ version: input.version,
18
+ });
19
+ }
20
+ const rendered = renderReport(dry_run, uninstall, detections, results);
21
+ return { ok: true, data: { detections, results, rendered } };
22
+ }
23
+ catch (e) {
24
+ return {
25
+ ok: false,
26
+ error: { code: 'SAFE_SETUP.FAILED', message: e.message, retryable: false },
27
+ };
28
+ }
29
+ }
30
+ function renderReport(dry_run, uninstall, detections, results) {
31
+ const lines = [];
32
+ const mode = uninstall ? '🗑 卸载模式' : dry_run ? '🔍 dry run' : '🔧 真注入';
33
+ lines.push(`🤖 SkillFM SAFE Setup ${mode}`);
34
+ lines.push('━━━━━━━━━━━━━━━━━━━━━━━━');
35
+ lines.push('');
36
+ lines.push('检测到的 Agent Harness:');
37
+ let detectedCount = 0;
38
+ for (const d of detections) {
39
+ if (!d.detected) {
40
+ lines.push(` · ${d.harness}: ❌ 未装`);
41
+ continue;
42
+ }
43
+ detectedCount += 1;
44
+ const status = d.already_injected ? '✅ 已注入 SkillFM SAFE' : '⚠️ 未注入';
45
+ lines.push(` · ${d.harness}: ${status} (${d.inject_path ?? ''})`);
46
+ }
47
+ if (detectedCount === 0) {
48
+ lines.push('');
49
+ lines.push('❌ 没检测到任何支持的 agent harness — 请确认装了 OpenClaw / Claude Code / Cursor / Codex');
50
+ return lines.join('\n');
51
+ }
52
+ if (dry_run) {
53
+ lines.push('');
54
+ lines.push('⚠️ dry run — 没真改任何文件');
55
+ lines.push('调 skillfm_setup_safe({dry_run: false}) 真注入');
56
+ return lines.join('\n');
57
+ }
58
+ if (uninstall) {
59
+ lines.push('');
60
+ lines.push('卸载结果:');
61
+ for (const r of results) {
62
+ lines.push(r.applied ? ` ✅ ${r.harness}: 移除完成` : ` ⚠️ ${r.harness}: ${r.error ?? 'no marker block'}`);
63
+ }
64
+ return lines.join('\n');
65
+ }
66
+ lines.push('');
67
+ lines.push('注入结果:');
68
+ for (const r of results) {
69
+ if (r.applied) {
70
+ lines.push(` ✅ ${r.harness}: 注入 ${r.bytes_injected} 字节 → ${r.inject_path}`);
71
+ if (r.revert_command) {
72
+ lines.push(` 回滚: ${r.revert_command}`);
73
+ }
74
+ }
75
+ else {
76
+ lines.push(` ⚠️ ${r.harness}: ${r.error ?? 'skip'}`);
77
+ }
78
+ }
79
+ lines.push('');
80
+ lines.push('🎉 完成! Agent 重启后会读到 SkillFM SAFE rules,');
81
+ lines.push(' 下次用户提到 "SkillFM/体检/省 token" 类关键词时, agent 必调 SkillFM MCP tool');
82
+ lines.push(' 而不是凭空 hallucinate 或走 generic exec.');
83
+ // Tell Claude Code users about the slash command we just installed.
84
+ const claudeCodeInjected = results.some((r) => r.harness === 'claude-code' && r.applied);
85
+ if (claudeCodeInjected) {
86
+ lines.push('');
87
+ lines.push('💡 Claude Code 用户: 可输入 `/skillfm` (或 `/sf` 别名) 一键扫描');
88
+ lines.push(' → 跑 Beacon 全面体检, 扫描期间 = 上次报告到现在');
89
+ }
90
+ return lines.join('\n');
91
+ }
92
+ export const handleSetupAgentForcing = handleSetupSafe;
93
+ //# sourceMappingURL=setup-safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-safe.js","sourceRoot":"","sources":["../src/setup-safe.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { SkillInstallResult } from '../_vendored-contracts/skill-distribution.js';
2
+ import type { SafeShareScope } from '../safe-observation/store.js';
2
3
  export interface InstallSkillOptions {
3
4
  slug: string;
4
5
  version?: string;
@@ -8,6 +9,14 @@ export interface InstallSkillOptions {
8
9
  agentToken?: string;
9
10
  /** Override skills root directory (defaults to ~/.skillfm/skills/) — useful in tests */
10
11
  skillsRoot?: string;
12
+ /** Override ~/.skillfm root for tests */
13
+ skillfmHome?: string;
14
+ /** Install-time SAFE observation consent. Omitted means local-only observation. */
15
+ safeObservationConsent?: {
16
+ decision: 'accepted' | 'declined';
17
+ uploadScope?: SafeShareScope;
18
+ rewardPolicyRef?: string;
19
+ };
11
20
  }
12
21
  /**
13
22
  * Install a SkillFM official skill bundle.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill-installer/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AASvF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8KzF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill-installer/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AASvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,sBAAsB,CAAC,EAAE;QACvB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;QAClC,WAAW,CAAC,EAAE,cAAc,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkMzF"}
@@ -9,6 +9,7 @@ import { extractBundle } from './tar-extractor.js';
9
9
  import { runNpmCi, verifyServerJs } from './npm-installer.js';
10
10
  import { buildInstallPaths, DEFAULT_SKILLS_ROOT } from './paths.js';
11
11
  import { INSTALL_ERROR_HINTS } from './errors.js';
12
+ import { createInstallConsentGrant } from '../safe-observation/store.js';
12
13
  /**
13
14
  * Install a SkillFM official skill bundle.
14
15
  * Implements B1-B12 from SKILL-INSTALL-CALL-SEQUENCE.md §2.2.
@@ -130,12 +131,30 @@ export async function installSkill(opts) {
130
131
  // Not fatal — log a warning but don't fail install
131
132
  process.stderr.write(`[skill-installer] warn: failed to create versionless link ${versionlessLink}: ${linkErr.message}\n`);
132
133
  }
134
+ const consentGrant = await createInstallConsentGrant({
135
+ skillSlug: slug,
136
+ skillVersion: resolvedVersion,
137
+ decision: opts.safeObservationConsent?.decision ?? 'declined',
138
+ uploadScope: opts.safeObservationConsent?.uploadScope,
139
+ rewardPolicyRef: opts.safeObservationConsent?.rewardPolicyRef,
140
+ skillfmHome: opts.skillfmHome ?? (opts.skillsRoot ? resolvedSkillsRoot : undefined),
141
+ });
142
+ const uploadHint = consentGrant.status === 'accepted'
143
+ ? `SAFE 经验回流已按安装授权开启 (${consentGrant.upload_scope}),贡献奖励规则: ${consentGrant.reward_policy_ref ?? 'none'}。`
144
+ : 'SAFE 经验只会本地记录;如需贡献经验换抵扣券,可重新安装时开启匿名回流授权。';
133
145
  return {
134
146
  ok: true,
135
147
  slug,
136
148
  version: resolvedVersion,
137
149
  install_dir: installDir,
138
- hint_for_agent: 'skill 已就绪。下一步 run-skill 起 daemon',
150
+ safe_observation_consent: {
151
+ consent_grant_id: consentGrant.consent_grant_id,
152
+ upload_scope: consentGrant.upload_scope,
153
+ reward_policy_ref: consentGrant.reward_policy_ref,
154
+ consented_at: consentGrant.consented_at,
155
+ user_can_revoke: true,
156
+ },
157
+ hint_for_agent: `skill 已就绪。下一步 run-skill 起 daemon。${uploadHint}`,
139
158
  };
140
159
  }
141
160
  finally {