@skillfm/local 2.7.10 → 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 (219) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendored-contracts/beacon-assets-v1.d.ts +160 -0
  3. package/dist/_vendored-contracts/beacon-assets-v1.d.ts.map +1 -0
  4. package/dist/_vendored-contracts/beacon-assets-v1.js +29 -0
  5. package/dist/_vendored-contracts/beacon-assets-v1.js.map +1 -0
  6. package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  7. package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  8. package/dist/_vendored-contracts/beacon-mcp-tools-v1.js +131 -0
  9. package/dist/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  10. package/dist/_vendored-contracts/beacon-preferences-v1.d.ts +68 -0
  11. package/dist/_vendored-contracts/beacon-preferences-v1.d.ts.map +1 -0
  12. package/dist/_vendored-contracts/beacon-preferences-v1.js +26 -0
  13. package/dist/_vendored-contracts/beacon-preferences-v1.js.map +1 -0
  14. package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts +208 -0
  15. package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts.map +1 -0
  16. package/dist/_vendored-contracts/beacon-rule-protocol-v1.js +25 -0
  17. package/dist/_vendored-contracts/beacon-rule-protocol-v1.js.map +1 -0
  18. package/dist/_vendored-contracts/beacon-usage-v1.d.ts +88 -0
  19. package/dist/_vendored-contracts/beacon-usage-v1.d.ts.map +1 -0
  20. package/dist/_vendored-contracts/beacon-usage-v1.js +27 -0
  21. package/dist/_vendored-contracts/beacon-usage-v1.js.map +1 -0
  22. package/dist/_vendored-contracts/index.d.ts +29 -0
  23. package/dist/_vendored-contracts/index.d.ts.map +1 -1
  24. package/dist/_vendored-contracts/index.js.map +1 -1
  25. package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts +149 -0
  26. package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts.map +1 -0
  27. package/dist/_vendored-contracts/safe-skill-observation-v1.js +23 -0
  28. package/dist/_vendored-contracts/safe-skill-observation-v1.js.map +1 -0
  29. package/dist/_vendored-contracts/skill-distribution.d.ts +16 -0
  30. package/dist/_vendored-contracts/skill-distribution.d.ts.map +1 -1
  31. package/dist/_vendored-contracts/skill-distribution.js.map +1 -1
  32. package/dist/{safe → agent-forcing}/claude-code-skill-v2.d.ts +7 -4
  33. package/dist/agent-forcing/claude-code-skill-v2.d.ts.map +1 -0
  34. package/dist/{safe → agent-forcing}/claude-code-skill-v2.js +21 -19
  35. package/dist/agent-forcing/claude-code-skill-v2.js.map +1 -0
  36. package/dist/{safe/safe-rules.d.ts → agent-forcing/forcing-rules.d.ts} +6 -15
  37. package/dist/agent-forcing/forcing-rules.d.ts.map +1 -0
  38. package/dist/agent-forcing/forcing-rules.js +203 -0
  39. package/dist/agent-forcing/forcing-rules.js.map +1 -0
  40. package/dist/agent-forcing/index.d.ts +5 -0
  41. package/dist/agent-forcing/index.d.ts.map +1 -0
  42. package/dist/agent-forcing/index.js +6 -0
  43. package/dist/agent-forcing/index.js.map +1 -0
  44. package/dist/{safe → agent-forcing}/injectors.d.ts +7 -7
  45. package/dist/agent-forcing/injectors.d.ts.map +1 -0
  46. package/dist/{safe → agent-forcing}/injectors.js +24 -21
  47. package/dist/agent-forcing/injectors.js.map +1 -0
  48. package/dist/agent-forcing/slash-commands.d.ts +49 -0
  49. package/dist/agent-forcing/slash-commands.d.ts.map +1 -0
  50. package/dist/agent-forcing/slash-commands.js +166 -0
  51. package/dist/agent-forcing/slash-commands.js.map +1 -0
  52. package/dist/{safe → agent-forcing}/types.d.ts +1 -1
  53. package/dist/agent-forcing/types.d.ts.map +1 -0
  54. package/dist/{safe → agent-forcing}/types.js +4 -4
  55. package/dist/agent-forcing/types.js.map +1 -0
  56. package/dist/agent-hints.d.ts +1 -1
  57. package/dist/agent-hints.d.ts.map +1 -1
  58. package/dist/agent-hints.js +35 -41
  59. package/dist/agent-hints.js.map +1 -1
  60. package/dist/beacon/apprentice-capabilities.d.ts +10 -0
  61. package/dist/beacon/apprentice-capabilities.d.ts.map +1 -0
  62. package/dist/beacon/apprentice-capabilities.js +34 -0
  63. package/dist/beacon/apprentice-capabilities.js.map +1 -0
  64. package/dist/checkup/dimension-1-usage.d.ts +8 -1
  65. package/dist/checkup/dimension-1-usage.d.ts.map +1 -1
  66. package/dist/checkup/dimension-1-usage.js +3 -2
  67. package/dist/checkup/dimension-1-usage.js.map +1 -1
  68. package/dist/checkup/dimension-2-context.d.ts +12 -0
  69. package/dist/checkup/dimension-2-context.d.ts.map +1 -0
  70. package/dist/checkup/dimension-2-context.js +56 -0
  71. package/dist/checkup/dimension-2-context.js.map +1 -0
  72. package/dist/checkup/dimension-5-behavior.d.ts +12 -0
  73. package/dist/checkup/dimension-5-behavior.d.ts.map +1 -0
  74. package/dist/checkup/dimension-5-behavior.js +40 -0
  75. package/dist/checkup/dimension-5-behavior.js.map +1 -0
  76. package/dist/checkup/dimension-6-injection.d.ts +41 -0
  77. package/dist/checkup/dimension-6-injection.d.ts.map +1 -0
  78. package/dist/checkup/dimension-6-injection.js +74 -0
  79. package/dist/checkup/dimension-6-injection.js.map +1 -0
  80. package/dist/checkup/index.d.ts +3 -0
  81. package/dist/checkup/index.d.ts.map +1 -1
  82. package/dist/checkup/index.js +3 -0
  83. package/dist/checkup/index.js.map +1 -1
  84. package/dist/checkup/last-report.d.ts +32 -0
  85. package/dist/checkup/last-report.d.ts.map +1 -0
  86. package/dist/checkup/last-report.js +91 -0
  87. package/dist/checkup/last-report.js.map +1 -0
  88. package/dist/checkup/report.d.ts +13 -1
  89. package/dist/checkup/report.d.ts.map +1 -1
  90. package/dist/checkup/report.js +5 -3
  91. package/dist/checkup/report.js.map +1 -1
  92. package/dist/forcing-cli.d.ts +2 -0
  93. package/dist/forcing-cli.d.ts.map +1 -0
  94. package/dist/forcing-cli.js +2 -0
  95. package/dist/forcing-cli.js.map +1 -0
  96. package/dist/guard/bin.js +0 -0
  97. package/dist/guard/cli.js +2 -2
  98. package/dist/guard/cli.js.map +1 -1
  99. package/dist/guard/prompt-context.d.ts +3 -3
  100. package/dist/guard/prompt-context.d.ts.map +1 -1
  101. package/dist/guard/prompt-context.js +24 -42
  102. package/dist/guard/prompt-context.js.map +1 -1
  103. package/dist/harness/templates.d.ts +1 -1
  104. package/dist/harness/templates.js +1 -1
  105. package/dist/harness/templates.js.map +1 -1
  106. package/dist/index.js +14 -20
  107. package/dist/index.js.map +1 -1
  108. package/dist/mcp/brain-client.d.ts.map +1 -1
  109. package/dist/mcp/brain-client.js +3 -0
  110. package/dist/mcp/brain-client.js.map +1 -1
  111. package/dist/mcp/index.d.ts +1 -0
  112. package/dist/mcp/index.d.ts.map +1 -1
  113. package/dist/mcp/index.js +5 -0
  114. package/dist/mcp/index.js.map +1 -1
  115. package/dist/mcp/tools/_sentry-descriptions.js +2 -2
  116. package/dist/mcp/tools/_sentry-descriptions.js.map +1 -1
  117. package/dist/mcp/tools/checkup.d.ts +17 -2
  118. package/dist/mcp/tools/checkup.d.ts.map +1 -1
  119. package/dist/mcp/tools/checkup.js +41 -3
  120. package/dist/mcp/tools/checkup.js.map +1 -1
  121. package/dist/mcp/tools/index.d.ts +3 -16
  122. package/dist/mcp/tools/index.d.ts.map +1 -1
  123. package/dist/mcp/tools/index.js +40 -228
  124. package/dist/mcp/tools/index.js.map +1 -1
  125. package/dist/mcp/tools/install-module.d.ts +25 -0
  126. package/dist/mcp/tools/install-module.d.ts.map +1 -0
  127. package/dist/mcp/tools/install-module.js +87 -0
  128. package/dist/mcp/tools/install-module.js.map +1 -0
  129. package/dist/mcp/tools/send-daily-report.d.ts +29 -0
  130. package/dist/mcp/tools/send-daily-report.d.ts.map +1 -0
  131. package/dist/mcp/tools/send-daily-report.js +61 -0
  132. package/dist/mcp/tools/send-daily-report.js.map +1 -0
  133. package/dist/mcp/tools/setup-agent-forcing.d.ts +19 -0
  134. package/dist/mcp/tools/setup-agent-forcing.d.ts.map +1 -0
  135. package/dist/mcp/tools/setup-agent-forcing.js +86 -0
  136. package/dist/mcp/tools/setup-agent-forcing.js.map +1 -0
  137. package/dist/mcp/tools/setup-gateway.d.ts +2 -1
  138. package/dist/mcp/tools/setup-gateway.d.ts.map +1 -1
  139. package/dist/mcp/tools/setup-gateway.js +24 -6
  140. package/dist/mcp/tools/setup-gateway.js.map +1 -1
  141. package/dist/mcp/tools/setup-safe.d.ts +1 -18
  142. package/dist/mcp/tools/setup-safe.d.ts.map +1 -1
  143. package/dist/mcp/tools/setup-safe.js +1 -89
  144. package/dist/mcp/tools/setup-safe.js.map +1 -1
  145. package/dist/mcp/tools/unlock.d.ts +2 -2
  146. package/dist/mcp/tools/unlock.d.ts.map +1 -1
  147. package/dist/mcp/tools/unlock.js +40 -27
  148. package/dist/mcp/tools/unlock.js.map +1 -1
  149. package/dist/mcp-stdio/bin.js +0 -0
  150. package/dist/mcp-stdio/server.d.ts.map +1 -1
  151. package/dist/mcp-stdio/server.js +108 -265
  152. package/dist/mcp-stdio/server.js.map +1 -1
  153. package/dist/safe/index.d.ts +4 -4
  154. package/dist/safe/index.d.ts.map +1 -1
  155. package/dist/safe/index.js +7 -4
  156. package/dist/safe/index.js.map +1 -1
  157. package/dist/safe-cli.d.ts +6 -0
  158. package/dist/safe-cli.d.ts.map +1 -1
  159. package/dist/safe-cli.js +13 -5
  160. package/dist/safe-cli.js.map +1 -1
  161. package/dist/safe-observation/collector.d.ts +21 -0
  162. package/dist/safe-observation/collector.d.ts.map +1 -0
  163. package/dist/safe-observation/collector.js +101 -0
  164. package/dist/safe-observation/collector.js.map +1 -0
  165. package/dist/safe-observation/store.d.ts +34 -0
  166. package/dist/safe-observation/store.d.ts.map +1 -0
  167. package/dist/safe-observation/store.js +80 -0
  168. package/dist/safe-observation/store.js.map +1 -0
  169. package/dist/save-token/gateway-setup.d.ts +33 -3
  170. package/dist/save-token/gateway-setup.d.ts.map +1 -1
  171. package/dist/save-token/gateway-setup.js +165 -18
  172. package/dist/save-token/gateway-setup.js.map +1 -1
  173. package/dist/scheduler/brain-push-client.d.ts.map +1 -1
  174. package/dist/scheduler/brain-push-client.js +13 -2
  175. package/dist/scheduler/brain-push-client.js.map +1 -1
  176. package/dist/scheduler/types.d.ts +5 -0
  177. package/dist/scheduler/types.d.ts.map +1 -1
  178. package/dist/scheduler/types.js +3 -1
  179. package/dist/scheduler/types.js.map +1 -1
  180. package/dist/setup-safe.d.ts +20 -0
  181. package/dist/setup-safe.d.ts.map +1 -0
  182. package/dist/setup-safe.js +93 -0
  183. package/dist/setup-safe.js.map +1 -0
  184. package/dist/skill-installer/index.d.ts +9 -0
  185. package/dist/skill-installer/index.d.ts.map +1 -1
  186. package/dist/skill-installer/index.js +20 -1
  187. package/dist/skill-installer/index.js.map +1 -1
  188. package/dist/skill-md/template.d.ts +18 -4
  189. package/dist/skill-md/template.d.ts.map +1 -1
  190. package/dist/skill-md/template.js +253 -59
  191. package/dist/skill-md/template.js.map +1 -1
  192. package/dist/skill-runner/discovery.d.ts.map +1 -1
  193. package/dist/skill-runner/discovery.js +8 -5
  194. package/dist/skill-runner/discovery.js.map +1 -1
  195. package/dist/skill-tunnel/cli.d.ts.map +1 -1
  196. package/dist/skill-tunnel/cli.js +22 -0
  197. package/dist/skill-tunnel/cli.js.map +1 -1
  198. package/dist/skill-tunnel/client.d.ts +5 -0
  199. package/dist/skill-tunnel/client.d.ts.map +1 -1
  200. package/dist/skill-tunnel/client.js +2 -0
  201. package/dist/skill-tunnel/client.js.map +1 -1
  202. package/dist/skill-tunnel/local-bridge.d.ts +9 -0
  203. package/dist/skill-tunnel/local-bridge.d.ts.map +1 -1
  204. package/dist/skill-tunnel/local-bridge.js +24 -1
  205. package/dist/skill-tunnel/local-bridge.js.map +1 -1
  206. package/package.json +3 -3
  207. package/dist/beacon-cleanup/audit.d.ts +0 -24
  208. package/dist/beacon-cleanup/audit.d.ts.map +0 -1
  209. package/dist/beacon-cleanup/audit.js +0 -292
  210. package/dist/beacon-cleanup/audit.js.map +0 -1
  211. package/dist/safe/claude-code-skill-v2.d.ts.map +0 -1
  212. package/dist/safe/claude-code-skill-v2.js.map +0 -1
  213. package/dist/safe/injectors.d.ts.map +0 -1
  214. package/dist/safe/injectors.js.map +0 -1
  215. package/dist/safe/safe-rules.d.ts.map +0 -1
  216. package/dist/safe/safe-rules.js +0 -152
  217. package/dist/safe/safe-rules.js.map +0 -1
  218. package/dist/safe/types.d.ts.map +0 -1
  219. package/dist/safe/types.js.map +0 -1
@@ -1,5 +1,5 @@
1
- export type { HarnessId, HarnessDetection, SafeInjectResult, } from './types.js';
2
- export { SKILLFM_MARKER_START, SKILLFM_MARKER_END } from './types.js';
3
- export { renderSafeGuide, injectOrReplaceBlock, removeBlock, hasMarkerBlock, } from './safe-rules.js';
4
- export { detectOpenClaw, injectOpenClaw, detectClaudeCode, injectClaudeCode, detectCursor, injectCursor, detectCodex, injectCodex, detectContinue, detectAllHarnesses, injectAllDetected, removeAllInjections, } from './injectors.js';
1
+ export type { HarnessId, HarnessDetection, ForcingInjectResult as SafeContextResult, } from '../agent-forcing/types.js';
2
+ export { SKILLFM_MARKER_START, SKILLFM_MARKER_END, } from '../agent-forcing/types.js';
3
+ export { renderForcingGuide as renderSafeGuide, renderToolsGuideBlock as renderSafeToolsGuideBlock, injectOrReplaceBlock as injectOrReplaceSafeBlock, removeBlock as removeSafeBlock, hasMarkerBlock as hasSafeMarkerBlock, } from '../agent-forcing/forcing-rules.js';
4
+ export { detectOpenClaw, injectOpenClaw, detectClaudeCode, injectClaudeCode, detectCursor, injectCursor, detectCodex, injectCodex, detectContinue, detectAllHarnesses, injectAllDetected, removeAllInjections, } from '../agent-forcing/injectors.js';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAMA,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,mBAAmB,IAAI,iBAAiB,GACzC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,IAAI,eAAe,EACrC,qBAAqB,IAAI,yBAAyB,EAClD,oBAAoB,IAAI,wBAAwB,EAChD,WAAW,IAAI,eAAe,EAC9B,cAAc,IAAI,kBAAkB,GACrC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC"}
@@ -1,6 +1,9 @@
1
1
  // sdk/skillfm-local/src/safe/index.ts
2
- // SAFE Adapter — public API.
3
- export { SKILLFM_MARKER_START, SKILLFM_MARKER_END } from './types.js';
4
- export { renderSafeGuide, injectOrReplaceBlock, removeBlock, hasMarkerBlock, } from './safe-rules.js';
5
- export { detectOpenClaw, injectOpenClaw, detectClaudeCode, injectClaudeCode, detectCursor, injectCursor, detectCodex, injectCodex, detectContinue, detectAllHarnesses, injectAllDetected, removeAllInjections, } from './injectors.js';
2
+ //
3
+ // SAFE alias layer for the legacy agent-forcing implementation.
4
+ // Phase 1 keeps the old implementation in place and exposes a stable SAFE
5
+ // entry point for new code.
6
+ export { SKILLFM_MARKER_START, SKILLFM_MARKER_END, } from '../agent-forcing/types.js';
7
+ export { renderForcingGuide as renderSafeGuide, renderToolsGuideBlock as renderSafeToolsGuideBlock, injectOrReplaceBlock as injectOrReplaceSafeBlock, removeBlock as removeSafeBlock, hasMarkerBlock as hasSafeMarkerBlock, } from '../agent-forcing/forcing-rules.js';
8
+ export { detectOpenClaw, injectOpenClaw, detectClaudeCode, injectClaudeCode, detectCursor, injectCursor, detectCodex, injectCodex, detectContinue, detectAllHarnesses, injectAllDetected, removeAllInjections, } from '../agent-forcing/injectors.js';
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AAO7B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,gEAAgE;AAChE,0EAA0E;AAC1E,4BAA4B;AAO5B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,IAAI,eAAe,EACrC,qBAAqB,IAAI,yBAAyB,EAClD,oBAAoB,IAAI,wBAAwB,EAChD,WAAW,IAAI,eAAe,EAC9B,cAAc,IAAI,kBAAkB,GACrC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC"}
@@ -1,2 +1,8 @@
1
+ type SafeCliDeps = {
2
+ argv?: string[];
3
+ };
4
+ export declare function runSafeCli(deps?: SafeCliDeps): Promise<void>;
1
5
  export declare function cmdSafe(): Promise<void>;
6
+ export declare function cmdForcing(): Promise<void>;
7
+ export {};
2
8
  //# sourceMappingURL=safe-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safe-cli.d.ts","sourceRoot":"","sources":["../src/safe-cli.ts"],"names":[],"mappings":"AAeA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC7C"}
1
+ {"version":3,"file":"safe-cli.d.ts","sourceRoot":"","sources":["../src/safe-cli.ts"],"names":[],"mappings":"AAeA,KAAK,WAAW,GAAG;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,wBAAsB,UAAU,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCtE;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGhD"}
package/dist/safe-cli.js CHANGED
@@ -1,14 +1,15 @@
1
1
  // sdk/skillfm-local/src/safe-cli.ts
2
2
  //
3
- // CLI: npx @skillfm/local SAFE <subcommand>
3
+ // CLI: npx @skillfm/local safe <subcommand>
4
4
  // detect — 仅检测各 harness, 不真改
5
- // inject — 真注入 SKILLFM-AGENT-GUIDE block 到检测到的 harness
5
+ // inject — 真注入 SAFE guide 到检测到的 harness
6
6
  // uninstall — 移除已注入的 block
7
7
  //
8
- // 这是用户手动控制 SAFE CLI fallback (sidecar 启动时也会自动跑 inject).
8
+ // Legacy `forcing` entry point remains as an alias wrapper.
9
9
  import { detectAllHarnesses, injectAllDetected, removeAllInjections, } from './safe/index.js';
10
- export async function cmdSafe() {
11
- const sub = process.argv[3] ?? 'detect';
10
+ export async function runSafeCli(deps = {}) {
11
+ const argv = deps.argv ?? process.argv;
12
+ const sub = argv[3] ?? 'detect';
12
13
  if (sub === 'detect') {
13
14
  const detections = await detectAllHarnesses();
14
15
  console.log('🤖 SkillFM SAFE — Detection');
@@ -50,4 +51,11 @@ export async function cmdSafe() {
50
51
  }
51
52
  process.exit(0);
52
53
  }
54
+ export async function cmdSafe() {
55
+ await runSafeCli();
56
+ }
57
+ export async function cmdForcing() {
58
+ console.error("[skillfm-local] 'forcing' has been renamed to 'safe'; use `skillfm-local safe ...`.");
59
+ await runSafeCli();
60
+ }
53
61
  //# sourceMappingURL=safe-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"safe-cli.js","sourceRoot":"","sources":["../src/safe-cli.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,4CAA4C;AAC5C,qCAAqC;AACrC,+DAA+D;AAC/D,gCAAgC;AAChC,EAAE;AACF,0DAA0D;AAE1D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAExC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;gBACjC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO;oBAC9B,CAAC,CAAC,QAAQ,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,cAAc,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC9E,IAAI,CAAC,CAAC,cAAc;oBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"safe-cli.js","sourceRoot":"","sources":["../src/safe-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { BrainPushClient } from '../scheduler/types.js';
2
+ export interface SafeObservationCollectorOptions {
3
+ skillfmHome?: string;
4
+ brain?: Pick<BrainPushClient, 'pushSafeSkillObservations'>;
5
+ logger?: Pick<Console, 'warn'>;
6
+ }
7
+ export interface SafeObservationContextInput {
8
+ skillSlug: string;
9
+ request: unknown;
10
+ }
11
+ export interface SafeObservationCaptureInput {
12
+ skillSlug: string;
13
+ response: unknown;
14
+ }
15
+ export declare class SafeObservationCollector {
16
+ private readonly opts;
17
+ constructor(opts?: SafeObservationCollectorOptions);
18
+ injectInstallConsent(input: SafeObservationContextInput): Promise<unknown>;
19
+ capture(input: SafeObservationCaptureInput): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/safe-observation/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;gBAE3C,IAAI,GAAE,+BAAoC;IAIhD,oBAAoB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1E,OAAO,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;CAcjE"}
@@ -0,0 +1,101 @@
1
+ import { appendSafeObservationCase, readInstallConsentGrant, } from './store.js';
2
+ export class SafeObservationCollector {
3
+ opts;
4
+ constructor(opts = {}) {
5
+ this.opts = opts;
6
+ }
7
+ async injectInstallConsent(input) {
8
+ const grant = await readInstallConsentGrant(input.skillSlug, this.opts.skillfmHome);
9
+ if (!grant)
10
+ return input.request;
11
+ return injectGrantIntoRequest(input.request, grant);
12
+ }
13
+ async capture(input) {
14
+ const observation = extractSafeObservation(input.response);
15
+ if (!observation)
16
+ return;
17
+ const grant = await readInstallConsentGrant(input.skillSlug, this.opts.skillfmHome);
18
+ const enriched = grant ? applyGrantToObservation(observation, grant) : observation;
19
+ await appendSafeObservationCase(input.skillSlug, enriched, this.opts.skillfmHome);
20
+ if (!shouldUpload(grant))
21
+ return;
22
+ const result = await this.opts.brain?.pushSafeSkillObservations([enriched]);
23
+ if (result && !result.ok) {
24
+ this.opts.logger?.warn?.(`[safe-observation] brain push failed: ${result.error ?? 'unknown error'}`);
25
+ }
26
+ }
27
+ }
28
+ function injectGrantIntoRequest(request, grant) {
29
+ if (!request || typeof request !== 'object' || Array.isArray(request))
30
+ return request;
31
+ const obj = request;
32
+ const context = obj.context && typeof obj.context === 'object' && !Array.isArray(obj.context)
33
+ ? obj.context
34
+ : {};
35
+ return {
36
+ ...obj,
37
+ context: {
38
+ ...context,
39
+ safe_observation_upload_scope: grant.upload_scope,
40
+ safe_observation_consent_grant_id: grant.status === 'accepted' ? grant.consent_grant_id : undefined,
41
+ safe_observation_reward_policy_ref: grant.reward_policy_ref,
42
+ safe_observation_consented_at: grant.consented_at,
43
+ },
44
+ };
45
+ }
46
+ function extractSafeObservation(response) {
47
+ if (!response || typeof response !== 'object')
48
+ return null;
49
+ const root = response;
50
+ const direct = root.safe_observation;
51
+ if (direct && typeof direct === 'object')
52
+ return direct;
53
+ const data = root.data;
54
+ if (!data || typeof data !== 'object')
55
+ return null;
56
+ const dataObj = data;
57
+ const output = dataObj.output;
58
+ if (!output || typeof output !== 'object')
59
+ return null;
60
+ const observation = output.safe_observation;
61
+ return observation && typeof observation === 'object' ? observation : null;
62
+ }
63
+ function applyGrantToObservation(observation, grant) {
64
+ if (!observation || typeof observation !== 'object' || Array.isArray(observation))
65
+ return observation;
66
+ const obj = observation;
67
+ const safe = obj.safe && typeof obj.safe === 'object' && !Array.isArray(obj.safe)
68
+ ? obj.safe
69
+ : {};
70
+ const consent = safe.consent && typeof safe.consent === 'object' && !Array.isArray(safe.consent)
71
+ ? safe.consent
72
+ : {};
73
+ const reward = obj.reward && typeof obj.reward === 'object' && !Array.isArray(obj.reward)
74
+ ? obj.reward
75
+ : {};
76
+ const uploadScope = grant.status === 'accepted' ? grant.upload_scope : 'local_only';
77
+ const eligible = grant.status === 'accepted' && uploadScope !== 'local_only' && reward.eligible !== false;
78
+ return {
79
+ ...obj,
80
+ safe: {
81
+ ...safe,
82
+ consent: {
83
+ ...consent,
84
+ local_record: true,
85
+ upload_scope: uploadScope,
86
+ consent_source: grant.status === 'accepted' ? 'skill_install' : undefined,
87
+ consent_grant_id: grant.status === 'accepted' ? grant.consent_grant_id : undefined,
88
+ consented_at: grant.consented_at,
89
+ },
90
+ },
91
+ reward: {
92
+ ...reward,
93
+ eligible,
94
+ policy_id: grant.reward_policy_ref ?? reward.policy_id,
95
+ },
96
+ };
97
+ }
98
+ function shouldUpload(grant) {
99
+ return Boolean(grant && grant.status === 'accepted' && grant.upload_scope !== 'local_only');
100
+ }
101
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/safe-observation/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type SafeShareScope = 'local_only' | 'aggregate' | 'redacted_case' | 'public_case';
2
+ export interface SafeObservationConsentGrant {
3
+ consent_grant_id: string;
4
+ skill_slug: string;
5
+ skill_version: string;
6
+ consent_source: 'skill_install';
7
+ status: 'accepted' | 'declined';
8
+ upload_scope: SafeShareScope;
9
+ reward_policy_ref?: string;
10
+ consented_at: string;
11
+ user_can_revoke: true;
12
+ }
13
+ export interface CreateInstallConsentGrantInput {
14
+ skillSlug: string;
15
+ skillVersion: string;
16
+ decision?: 'accepted' | 'declined';
17
+ uploadScope?: SafeShareScope;
18
+ rewardPolicyRef?: string;
19
+ skillfmHome?: string;
20
+ }
21
+ export interface LocalCaseRecord {
22
+ case_id: string;
23
+ emitted_at: string;
24
+ skill_slug: string;
25
+ observation: unknown;
26
+ }
27
+ export declare function defaultSkillfmHome(): string;
28
+ export declare function consentGrantPath(skillSlug: string, skillfmHome?: string): string;
29
+ export declare function casesJsonlPath(skillSlug: string, skillfmHome?: string): string;
30
+ export declare function createInstallConsentGrant(input: CreateInstallConsentGrantInput): Promise<SafeObservationConsentGrant>;
31
+ export declare function readInstallConsentGrant(skillSlug: string, skillfmHome?: string): Promise<SafeObservationConsentGrant | null>;
32
+ export declare function appendSafeObservationCase(skillSlug: string, observation: unknown, skillfmHome?: string): Promise<LocalCaseRecord>;
33
+ export declare function readSafeObservationCases(skillSlug: string, skillfmHome?: string): Promise<LocalCaseRecord[]>;
34
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/safe-observation/store.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,CAAC;AAE1F,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,eAAe,CAAC;IAChC,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;IAChC,YAAY,EAAE,cAAc,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,SAAuB,GAAG,MAAM,CAE9F;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,SAAuB,GAAG,MAAM,CAE5F;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAyBtC;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,SAAuB,GACjC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAO7C;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EACpB,WAAW,SAAuB,GACjC,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,WAAW,SAAuB,GACjC,OAAO,CAAC,eAAe,EAAE,CAAC,CAU5B"}
@@ -0,0 +1,80 @@
1
+ // SAFE observation local store.
2
+ //
3
+ // Full evidence stays on the user's machine. Upload is a separate consent-gated
4
+ // step handled by BrainPushClient.
5
+ import { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';
6
+ import { createHash, randomUUID } from 'node:crypto';
7
+ import { homedir } from 'node:os';
8
+ import { dirname, join } from 'node:path';
9
+ export function defaultSkillfmHome() {
10
+ return process.env.SKILLFM_HOME || join(homedir(), '.skillfm');
11
+ }
12
+ export function consentGrantPath(skillSlug, skillfmHome = defaultSkillfmHome()) {
13
+ return join(skillfmHome, 'safe-consent-grants', `${skillSlug}.json`);
14
+ }
15
+ export function casesJsonlPath(skillSlug, skillfmHome = defaultSkillfmHome()) {
16
+ return join(skillfmHome, 'capsule-cases', `${skillSlug}.jsonl`);
17
+ }
18
+ export async function createInstallConsentGrant(input) {
19
+ const status = input.decision ?? 'declined';
20
+ const uploadScope = status === 'accepted' ? (input.uploadScope ?? 'aggregate') : 'local_only';
21
+ const consentedAt = new Date().toISOString();
22
+ const stablePart = createHash('sha256')
23
+ .update(`${input.skillSlug}:${input.skillVersion}:${consentedAt}:${randomUUID()}`)
24
+ .digest('hex')
25
+ .slice(0, 20);
26
+ const grant = {
27
+ consent_grant_id: `grant_${stablePart}`,
28
+ skill_slug: input.skillSlug,
29
+ skill_version: input.skillVersion,
30
+ consent_source: 'skill_install',
31
+ status,
32
+ upload_scope: uploadScope,
33
+ reward_policy_ref: input.rewardPolicyRef,
34
+ consented_at: consentedAt,
35
+ user_can_revoke: true,
36
+ };
37
+ const path = consentGrantPath(input.skillSlug, input.skillfmHome);
38
+ await mkdir(dirname(path), { recursive: true });
39
+ await writeFile(path, `${JSON.stringify(grant, null, 2)}\n`, 'utf8');
40
+ return grant;
41
+ }
42
+ export async function readInstallConsentGrant(skillSlug, skillfmHome = defaultSkillfmHome()) {
43
+ try {
44
+ const raw = await readFile(consentGrantPath(skillSlug, skillfmHome), 'utf8');
45
+ return JSON.parse(raw);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ export async function appendSafeObservationCase(skillSlug, observation, skillfmHome = defaultSkillfmHome()) {
52
+ const emittedAt = new Date().toISOString();
53
+ const caseId = `case_${createHash('sha256')
54
+ .update(`${skillSlug}:${emittedAt}:${JSON.stringify(observation)}`)
55
+ .digest('hex')
56
+ .slice(0, 24)}`;
57
+ const record = {
58
+ case_id: caseId,
59
+ emitted_at: emittedAt,
60
+ skill_slug: skillSlug,
61
+ observation,
62
+ };
63
+ const path = casesJsonlPath(skillSlug, skillfmHome);
64
+ await mkdir(dirname(path), { recursive: true });
65
+ await appendFile(path, `${JSON.stringify(record)}\n`, 'utf8');
66
+ return record;
67
+ }
68
+ export async function readSafeObservationCases(skillSlug, skillfmHome = defaultSkillfmHome()) {
69
+ try {
70
+ const raw = await readFile(casesJsonlPath(skillSlug, skillfmHome), 'utf8');
71
+ return raw
72
+ .split('\n')
73
+ .filter(Boolean)
74
+ .map((line) => JSON.parse(line));
75
+ }
76
+ catch {
77
+ return [];
78
+ }
79
+ }
80
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/safe-observation/store.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  import type { GatewayDetection } from './types.js';
2
2
  export declare const SKILLFM_GATEWAY_BASE_URL: string;
3
+ export declare function normalizeShellGatewayBlocks(content: string, gatewayBaseUrl?: string): {
4
+ content: string;
5
+ removed_count: number;
6
+ };
3
7
  /**
4
8
  * 检测各 IDE 的配置 + 当前 BASE_URL
5
9
  */
@@ -18,10 +22,36 @@ export interface SetupResult {
18
22
  revert_command?: string;
19
23
  error?: string;
20
24
  }
21
- export declare function setupClaudeCodeGateway(): Promise<SetupResult>;
22
- export declare function setupShellEnvGateway(): Promise<SetupResult>;
25
+ type GatewayFetch = (input: string, init?: {
26
+ method?: string;
27
+ signal?: AbortSignal;
28
+ }) => Promise<{
29
+ ok: boolean;
30
+ status: number;
31
+ json?: () => Promise<unknown>;
32
+ }>;
33
+ export interface GatewayReadiness {
34
+ ok: boolean;
35
+ gateway_base_url: string;
36
+ checked_url: string;
37
+ status?: number;
38
+ gateway_kind?: string;
39
+ capabilities?: string[];
40
+ error?: string;
41
+ }
42
+ export interface GatewaySetupOptions {
43
+ gatewayBaseUrl?: string;
44
+ gatewayReadiness?: GatewayReadiness;
45
+ detections?: GatewayDetection[];
46
+ fetchImpl?: GatewayFetch;
47
+ timeoutMs?: number;
48
+ }
49
+ export declare function checkGatewayReadiness(opts?: GatewaySetupOptions): Promise<GatewayReadiness>;
50
+ export declare function setupClaudeCodeGateway(opts?: GatewaySetupOptions): Promise<SetupResult>;
51
+ export declare function setupShellEnvGateway(opts?: GatewaySetupOptions): Promise<SetupResult>;
23
52
  /**
24
53
  * 一键配 — 所有检测到的 IDE
25
54
  */
26
- export declare function setupAllDetectedGateways(): Promise<SetupResult[]>;
55
+ export declare function setupAllDetectedGateways(opts?: GatewaySetupOptions): Promise<SetupResult[]>;
56
+ export {};
27
57
  //# sourceMappingURL=gateway-setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-setup.d.ts","sourceRoot":"","sources":["../../src/save-token/gateway-setup.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,wBAAwB,QAAuE,CAAC;AAE7G;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsB9D;AAyFD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,WAAW,CAAC,CAiCnE;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAoCjE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAcvE"}
1
+ {"version":3,"file":"gateway-setup.d.ts","sourceRoot":"","sources":["../../src/save-token/gateway-setup.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AAEvE,eAAO,MAAM,wBAAwB,QAAuE,CAAC;AAoC7G,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,MAAiC,GAChD;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAO5C;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsB9D;AAkGD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,YAAY,GAAG,CAClB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAC7C,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,qBAAqB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiErG;AA+BD,wBAAsB,sBAAsB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkCjG;AAED,wBAAsB,oBAAoB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8B/F;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwBrG"}