@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.
- package/README.md +2 -2
- package/dist/_vendored-contracts/beacon-assets-v1.d.ts +160 -0
- package/dist/_vendored-contracts/beacon-assets-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-assets-v1.js +29 -0
- package/dist/_vendored-contracts/beacon-assets-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.js +131 -0
- package/dist/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.d.ts +68 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.js +26 -0
- package/dist/_vendored-contracts/beacon-preferences-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts +208 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.js +25 -0
- package/dist/_vendored-contracts/beacon-rule-protocol-v1.js.map +1 -0
- package/dist/_vendored-contracts/beacon-usage-v1.d.ts +88 -0
- package/dist/_vendored-contracts/beacon-usage-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/beacon-usage-v1.js +27 -0
- package/dist/_vendored-contracts/beacon-usage-v1.js.map +1 -0
- package/dist/_vendored-contracts/index.d.ts +29 -0
- package/dist/_vendored-contracts/index.d.ts.map +1 -1
- package/dist/_vendored-contracts/index.js.map +1 -1
- package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts +149 -0
- package/dist/_vendored-contracts/safe-skill-observation-v1.d.ts.map +1 -0
- package/dist/_vendored-contracts/safe-skill-observation-v1.js +23 -0
- package/dist/_vendored-contracts/safe-skill-observation-v1.js.map +1 -0
- package/dist/_vendored-contracts/skill-distribution.d.ts +16 -0
- package/dist/_vendored-contracts/skill-distribution.d.ts.map +1 -1
- package/dist/_vendored-contracts/skill-distribution.js.map +1 -1
- package/dist/{safe → agent-forcing}/claude-code-skill-v2.d.ts +7 -4
- package/dist/agent-forcing/claude-code-skill-v2.d.ts.map +1 -0
- package/dist/{safe → agent-forcing}/claude-code-skill-v2.js +21 -19
- package/dist/agent-forcing/claude-code-skill-v2.js.map +1 -0
- package/dist/{safe/safe-rules.d.ts → agent-forcing/forcing-rules.d.ts} +6 -15
- package/dist/agent-forcing/forcing-rules.d.ts.map +1 -0
- package/dist/agent-forcing/forcing-rules.js +203 -0
- package/dist/agent-forcing/forcing-rules.js.map +1 -0
- package/dist/agent-forcing/index.d.ts +5 -0
- package/dist/agent-forcing/index.d.ts.map +1 -0
- package/dist/agent-forcing/index.js +6 -0
- package/dist/agent-forcing/index.js.map +1 -0
- package/dist/{safe → agent-forcing}/injectors.d.ts +7 -7
- package/dist/agent-forcing/injectors.d.ts.map +1 -0
- package/dist/{safe → agent-forcing}/injectors.js +24 -21
- package/dist/agent-forcing/injectors.js.map +1 -0
- package/dist/agent-forcing/slash-commands.d.ts +49 -0
- package/dist/agent-forcing/slash-commands.d.ts.map +1 -0
- package/dist/agent-forcing/slash-commands.js +166 -0
- package/dist/agent-forcing/slash-commands.js.map +1 -0
- package/dist/{safe → agent-forcing}/types.d.ts +1 -1
- package/dist/agent-forcing/types.d.ts.map +1 -0
- package/dist/{safe → agent-forcing}/types.js +4 -4
- package/dist/agent-forcing/types.js.map +1 -0
- package/dist/agent-hints.d.ts +1 -1
- package/dist/agent-hints.d.ts.map +1 -1
- package/dist/agent-hints.js +35 -41
- package/dist/agent-hints.js.map +1 -1
- package/dist/beacon/apprentice-capabilities.d.ts +10 -0
- package/dist/beacon/apprentice-capabilities.d.ts.map +1 -0
- package/dist/beacon/apprentice-capabilities.js +34 -0
- package/dist/beacon/apprentice-capabilities.js.map +1 -0
- package/dist/checkup/dimension-1-usage.d.ts +8 -1
- package/dist/checkup/dimension-1-usage.d.ts.map +1 -1
- package/dist/checkup/dimension-1-usage.js +3 -2
- package/dist/checkup/dimension-1-usage.js.map +1 -1
- package/dist/checkup/dimension-2-context.d.ts +12 -0
- package/dist/checkup/dimension-2-context.d.ts.map +1 -0
- package/dist/checkup/dimension-2-context.js +56 -0
- package/dist/checkup/dimension-2-context.js.map +1 -0
- package/dist/checkup/dimension-5-behavior.d.ts +12 -0
- package/dist/checkup/dimension-5-behavior.d.ts.map +1 -0
- package/dist/checkup/dimension-5-behavior.js +40 -0
- package/dist/checkup/dimension-5-behavior.js.map +1 -0
- package/dist/checkup/dimension-6-injection.d.ts +41 -0
- package/dist/checkup/dimension-6-injection.d.ts.map +1 -0
- package/dist/checkup/dimension-6-injection.js +74 -0
- package/dist/checkup/dimension-6-injection.js.map +1 -0
- package/dist/checkup/index.d.ts +3 -0
- package/dist/checkup/index.d.ts.map +1 -1
- package/dist/checkup/index.js +3 -0
- package/dist/checkup/index.js.map +1 -1
- package/dist/checkup/last-report.d.ts +32 -0
- package/dist/checkup/last-report.d.ts.map +1 -0
- package/dist/checkup/last-report.js +91 -0
- package/dist/checkup/last-report.js.map +1 -0
- package/dist/checkup/report.d.ts +13 -1
- package/dist/checkup/report.d.ts.map +1 -1
- package/dist/checkup/report.js +5 -3
- package/dist/checkup/report.js.map +1 -1
- package/dist/forcing-cli.d.ts +2 -0
- package/dist/forcing-cli.d.ts.map +1 -0
- package/dist/forcing-cli.js +2 -0
- package/dist/forcing-cli.js.map +1 -0
- package/dist/guard/bin.js +0 -0
- package/dist/guard/cli.js +2 -2
- package/dist/guard/cli.js.map +1 -1
- package/dist/guard/prompt-context.d.ts +3 -3
- package/dist/guard/prompt-context.d.ts.map +1 -1
- package/dist/guard/prompt-context.js +24 -42
- package/dist/guard/prompt-context.js.map +1 -1
- package/dist/harness/templates.d.ts +1 -1
- package/dist/harness/templates.js +1 -1
- package/dist/harness/templates.js.map +1 -1
- package/dist/index.js +14 -20
- package/dist/index.js.map +1 -1
- package/dist/mcp/brain-client.d.ts.map +1 -1
- package/dist/mcp/brain-client.js +3 -0
- package/dist/mcp/brain-client.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/_sentry-descriptions.js +2 -2
- package/dist/mcp/tools/_sentry-descriptions.js.map +1 -1
- package/dist/mcp/tools/checkup.d.ts +17 -2
- package/dist/mcp/tools/checkup.d.ts.map +1 -1
- package/dist/mcp/tools/checkup.js +41 -3
- package/dist/mcp/tools/checkup.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +3 -16
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +40 -228
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/install-module.d.ts +25 -0
- package/dist/mcp/tools/install-module.d.ts.map +1 -0
- package/dist/mcp/tools/install-module.js +87 -0
- package/dist/mcp/tools/install-module.js.map +1 -0
- package/dist/mcp/tools/send-daily-report.d.ts +29 -0
- package/dist/mcp/tools/send-daily-report.d.ts.map +1 -0
- package/dist/mcp/tools/send-daily-report.js +61 -0
- package/dist/mcp/tools/send-daily-report.js.map +1 -0
- package/dist/mcp/tools/setup-agent-forcing.d.ts +19 -0
- package/dist/mcp/tools/setup-agent-forcing.d.ts.map +1 -0
- package/dist/mcp/tools/setup-agent-forcing.js +86 -0
- package/dist/mcp/tools/setup-agent-forcing.js.map +1 -0
- package/dist/mcp/tools/setup-gateway.d.ts +2 -1
- package/dist/mcp/tools/setup-gateway.d.ts.map +1 -1
- package/dist/mcp/tools/setup-gateway.js +24 -6
- package/dist/mcp/tools/setup-gateway.js.map +1 -1
- package/dist/mcp/tools/setup-safe.d.ts +1 -18
- package/dist/mcp/tools/setup-safe.d.ts.map +1 -1
- package/dist/mcp/tools/setup-safe.js +1 -89
- package/dist/mcp/tools/setup-safe.js.map +1 -1
- package/dist/mcp/tools/unlock.d.ts +2 -2
- package/dist/mcp/tools/unlock.d.ts.map +1 -1
- package/dist/mcp/tools/unlock.js +40 -27
- package/dist/mcp/tools/unlock.js.map +1 -1
- package/dist/mcp-stdio/bin.js +0 -0
- package/dist/mcp-stdio/server.d.ts.map +1 -1
- package/dist/mcp-stdio/server.js +108 -265
- package/dist/mcp-stdio/server.js.map +1 -1
- package/dist/safe/index.d.ts +4 -4
- package/dist/safe/index.d.ts.map +1 -1
- package/dist/safe/index.js +7 -4
- package/dist/safe/index.js.map +1 -1
- package/dist/safe-cli.d.ts +6 -0
- package/dist/safe-cli.d.ts.map +1 -1
- package/dist/safe-cli.js +13 -5
- package/dist/safe-cli.js.map +1 -1
- package/dist/safe-observation/collector.d.ts +21 -0
- package/dist/safe-observation/collector.d.ts.map +1 -0
- package/dist/safe-observation/collector.js +101 -0
- package/dist/safe-observation/collector.js.map +1 -0
- package/dist/safe-observation/store.d.ts +34 -0
- package/dist/safe-observation/store.d.ts.map +1 -0
- package/dist/safe-observation/store.js +80 -0
- package/dist/safe-observation/store.js.map +1 -0
- package/dist/save-token/gateway-setup.d.ts +33 -3
- package/dist/save-token/gateway-setup.d.ts.map +1 -1
- package/dist/save-token/gateway-setup.js +165 -18
- package/dist/save-token/gateway-setup.js.map +1 -1
- package/dist/scheduler/brain-push-client.d.ts.map +1 -1
- package/dist/scheduler/brain-push-client.js +13 -2
- package/dist/scheduler/brain-push-client.js.map +1 -1
- package/dist/scheduler/types.d.ts +5 -0
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/scheduler/types.js +3 -1
- package/dist/scheduler/types.js.map +1 -1
- package/dist/setup-safe.d.ts +20 -0
- package/dist/setup-safe.d.ts.map +1 -0
- package/dist/setup-safe.js +93 -0
- package/dist/setup-safe.js.map +1 -0
- package/dist/skill-installer/index.d.ts +9 -0
- package/dist/skill-installer/index.d.ts.map +1 -1
- package/dist/skill-installer/index.js +20 -1
- package/dist/skill-installer/index.js.map +1 -1
- package/dist/skill-md/template.d.ts +18 -4
- package/dist/skill-md/template.d.ts.map +1 -1
- package/dist/skill-md/template.js +253 -59
- package/dist/skill-md/template.js.map +1 -1
- package/dist/skill-runner/discovery.d.ts.map +1 -1
- package/dist/skill-runner/discovery.js +8 -5
- package/dist/skill-runner/discovery.js.map +1 -1
- package/dist/skill-tunnel/cli.d.ts.map +1 -1
- package/dist/skill-tunnel/cli.js +22 -0
- package/dist/skill-tunnel/cli.js.map +1 -1
- package/dist/skill-tunnel/client.d.ts +5 -0
- package/dist/skill-tunnel/client.d.ts.map +1 -1
- package/dist/skill-tunnel/client.js +2 -0
- package/dist/skill-tunnel/client.js.map +1 -1
- package/dist/skill-tunnel/local-bridge.d.ts +9 -0
- package/dist/skill-tunnel/local-bridge.d.ts.map +1 -1
- package/dist/skill-tunnel/local-bridge.js +24 -1
- package/dist/skill-tunnel/local-bridge.js.map +1 -1
- package/package.json +3 -3
- package/dist/beacon-cleanup/audit.d.ts +0 -24
- package/dist/beacon-cleanup/audit.d.ts.map +0 -1
- package/dist/beacon-cleanup/audit.js +0 -292
- package/dist/beacon-cleanup/audit.js.map +0 -1
- package/dist/safe/claude-code-skill-v2.d.ts.map +0 -1
- package/dist/safe/claude-code-skill-v2.js.map +0 -1
- package/dist/safe/injectors.d.ts.map +0 -1
- package/dist/safe/injectors.js.map +0 -1
- package/dist/safe/safe-rules.d.ts.map +0 -1
- package/dist/safe/safe-rules.js +0 -152
- package/dist/safe/safe-rules.js.map +0 -1
- package/dist/safe/types.d.ts.map +0 -1
- package/dist/safe/types.js.map +0 -1
package/dist/safe/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type { HarnessId, HarnessDetection,
|
|
2
|
-
export { SKILLFM_MARKER_START, SKILLFM_MARKER_END } from '
|
|
3
|
-
export { renderSafeGuide, injectOrReplaceBlock, removeBlock, hasMarkerBlock, } from '
|
|
4
|
-
export { detectOpenClaw, injectOpenClaw, detectClaudeCode, injectClaudeCode, detectCursor, injectCursor, detectCodex, injectCodex, detectContinue, detectAllHarnesses, injectAllDetected, removeAllInjections, } from '
|
|
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
|
package/dist/safe/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/safe/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// sdk/skillfm-local/src/safe/index.ts
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
package/dist/safe/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,
|
|
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"}
|
package/dist/safe-cli.d.ts
CHANGED
|
@@ -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
|
package/dist/safe-cli.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
3
|
+
// CLI: npx @skillfm/local safe <subcommand>
|
|
4
4
|
// detect — 仅检测各 harness, 不真改
|
|
5
|
-
// inject — 真注入
|
|
5
|
+
// inject — 真注入 SAFE guide 到检测到的 harness
|
|
6
6
|
// uninstall — 移除已注入的 block
|
|
7
7
|
//
|
|
8
|
-
//
|
|
8
|
+
// Legacy `forcing` entry point remains as an alias wrapper.
|
|
9
9
|
import { detectAllHarnesses, injectAllDetected, removeAllInjections, } from './safe/index.js';
|
|
10
|
-
export async function
|
|
11
|
-
const
|
|
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
|
package/dist/safe-cli.js.map
CHANGED
|
@@ -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
|
|
1
|
+
{"version":3,"file":"safe-cli.js","sourceRoot":"","sources":["../src/safe-cli.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,4CAA4C;AAC5C,qCAAqC;AACrC,gDAAgD;AAChD,gCAAgC;AAChC,EAAE;AACF,4DAA4D;AAE5D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAMzB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAoB,EAAE;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAEhC,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;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,CAAC,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACrG,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -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
|
-
|
|
22
|
-
|
|
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":"
|
|
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"}
|