funolio-agent 0.13.0 → 0.15.17
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/dist/agent-config.d.ts +2 -0
- package/dist/agent-config.d.ts.map +1 -1
- package/dist/agent-config.js.map +1 -1
- package/dist/approval.d.ts +58 -11
- package/dist/approval.d.ts.map +1 -1
- package/dist/approval.js +225 -35
- package/dist/approval.js.map +1 -1
- package/dist/auth/anthropic-subscription.d.ts +24 -0
- package/dist/auth/anthropic-subscription.d.ts.map +1 -0
- package/dist/auth/anthropic-subscription.js +104 -0
- package/dist/auth/anthropic-subscription.js.map +1 -0
- package/dist/auth/auto-detect.d.ts +28 -0
- package/dist/auth/auto-detect.d.ts.map +1 -0
- package/dist/auth/auto-detect.js +210 -0
- package/dist/auth/auto-detect.js.map +1 -0
- package/dist/auth/credential-reader.d.ts +24 -0
- package/dist/auth/credential-reader.d.ts.map +1 -0
- package/dist/auth/credential-reader.js +265 -0
- package/dist/auth/credential-reader.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token-refresh.d.ts +31 -0
- package/dist/auth/token-refresh.d.ts.map +1 -0
- package/dist/auth/token-refresh.js +341 -0
- package/dist/auth/token-refresh.js.map +1 -0
- package/dist/backfill.d.ts +19 -8
- package/dist/backfill.d.ts.map +1 -1
- package/dist/backfill.js +64 -157
- package/dist/backfill.js.map +1 -1
- package/dist/bot-manager.d.ts +7 -2
- package/dist/bot-manager.d.ts.map +1 -1
- package/dist/bot-manager.js +79 -34
- package/dist/bot-manager.js.map +1 -1
- package/dist/clerk-model.d.ts +10 -1
- package/dist/clerk-model.d.ts.map +1 -1
- package/dist/clerk-model.js +107 -75
- package/dist/clerk-model.js.map +1 -1
- package/dist/cli.js +21 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/configure.d.ts.map +1 -1
- package/dist/commands/configure.js +53 -0
- package/dist/commands/configure.js.map +1 -1
- package/dist/commands/import-openclaw.d.ts.map +1 -1
- package/dist/commands/import-openclaw.js +1 -1
- package/dist/commands/import-openclaw.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +56 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +271 -19
- package/dist/commands/start.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +224 -2
- package/dist/config.js.map +1 -1
- package/dist/context-window.d.ts +15 -1
- package/dist/context-window.d.ts.map +1 -1
- package/dist/context-window.js +37 -1
- package/dist/context-window.js.map +1 -1
- package/dist/integration-tokens.d.ts +40 -0
- package/dist/integration-tokens.d.ts.map +1 -0
- package/dist/integration-tokens.js +168 -0
- package/dist/integration-tokens.js.map +1 -0
- package/dist/local-data.d.ts +236 -3
- package/dist/local-data.d.ts.map +1 -1
- package/dist/local-data.js +824 -16
- package/dist/local-data.js.map +1 -1
- package/dist/local-db.d.ts +17 -0
- package/dist/local-db.d.ts.map +1 -1
- package/dist/local-db.js +207 -4
- package/dist/local-db.js.map +1 -1
- package/dist/local-import-worker.d.ts +9 -1
- package/dist/local-import-worker.d.ts.map +1 -1
- package/dist/local-import-worker.js +235 -27
- package/dist/local-import-worker.js.map +1 -1
- package/dist/local-server.d.ts.map +1 -1
- package/dist/local-server.js +1368 -153
- package/dist/local-server.js.map +1 -1
- package/dist/mcp/bridge-server.d.ts +4 -7
- package/dist/mcp/bridge-server.d.ts.map +1 -1
- package/dist/mcp/bridge-server.js +37 -38
- package/dist/mcp/bridge-server.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +10 -1
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/marketplace.d.ts.map +1 -1
- package/dist/mcp/marketplace.js +31 -11
- package/dist/mcp/marketplace.js.map +1 -1
- package/dist/mcp/registry-shared.d.ts +40 -0
- package/dist/mcp/registry-shared.d.ts.map +1 -0
- package/dist/mcp/registry-shared.js +634 -0
- package/dist/mcp/registry-shared.js.map +1 -0
- package/dist/mcp/registry.d.ts +4 -36
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +8 -492
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/sync-cli-config.d.ts.map +1 -1
- package/dist/mcp/sync-cli-config.js +103 -23
- package/dist/mcp/sync-cli-config.js.map +1 -1
- package/dist/message-loop.d.ts +14 -0
- package/dist/message-loop.d.ts.map +1 -1
- package/dist/message-loop.js +262 -34
- package/dist/message-loop.js.map +1 -1
- package/dist/mqtt-client.d.ts +25 -1
- package/dist/mqtt-client.d.ts.map +1 -1
- package/dist/mqtt-client.js +25 -7
- package/dist/mqtt-client.js.map +1 -1
- package/dist/providers/anthropic.d.ts +1 -0
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +14 -4
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-cli.d.ts.map +1 -1
- package/dist/providers/claude-cli.js +145 -48
- package/dist/providers/claude-cli.js.map +1 -1
- package/dist/providers/codex-cli.d.ts +1 -1
- package/dist/providers/codex-cli.d.ts.map +1 -1
- package/dist/providers/codex-cli.js +71 -18
- package/dist/providers/codex-cli.js.map +1 -1
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +5 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +252 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/response-guard.d.ts +6 -0
- package/dist/response-guard.d.ts.map +1 -0
- package/dist/response-guard.js +30 -0
- package/dist/response-guard.js.map +1 -0
- package/dist/summarization-pipeline.d.ts +63 -2
- package/dist/summarization-pipeline.d.ts.map +1 -1
- package/dist/summarization-pipeline.js +361 -95
- package/dist/summarization-pipeline.js.map +1 -1
- package/dist/token-counter.d.ts +10 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +57 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/tool-filter.d.ts +26 -0
- package/dist/tool-filter.d.ts.map +1 -0
- package/dist/tool-filter.js +136 -0
- package/dist/tool-filter.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/schedule-task.d.ts.map +1 -1
- package/dist/tools/schedule-task.js +6 -5
- package/dist/tools/schedule-task.js.map +1 -1
- package/dist/tools/todo-tasks.d.ts +7 -0
- package/dist/tools/todo-tasks.d.ts.map +1 -0
- package/dist/tools/todo-tasks.js +260 -0
- package/dist/tools/todo-tasks.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/wizard-state.d.ts +125 -0
- package/dist/wizard-state.d.ts.map +1 -0
- package/dist/wizard-state.js +658 -0
- package/dist/wizard-state.js.map +1 -0
- package/dist/wizard-support.d.ts +110 -0
- package/dist/wizard-support.d.ts.map +1 -0
- package/dist/wizard-support.js +599 -0
- package/dist/wizard-support.js.map +1 -0
- package/dist/workflow-engine.d.ts +9 -5
- package/dist/workflow-engine.d.ts.map +1 -1
- package/dist/workflow-engine.js +165 -13
- package/dist/workflow-engine.js.map +1 -1
- package/package.json +6 -3
package/dist/agent-config.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface AgentLocalConfig {
|
|
|
22
22
|
workspace?: string;
|
|
23
23
|
permissionMode?: 'autopilot' | 'approve-destructive' | 'approve-all';
|
|
24
24
|
systemPrompt?: string;
|
|
25
|
+
maxToolCallsPerMessage?: number;
|
|
26
|
+
maxTokensPerMessage?: number;
|
|
25
27
|
createdAt: string;
|
|
26
28
|
}
|
|
27
29
|
export declare function getAgentsDir(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-config.d.ts","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,WAAW,GAAG,qBAAqB,GAAG,aAAa,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAMrC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAQrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAS5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAYlB"}
|
|
1
|
+
{"version":3,"file":"agent-config.d.ts","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,WAAW,GAAG,qBAAqB,GAAG,aAAa,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAMrC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAQrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAS5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAYlB"}
|
package/dist/agent-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"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"}
|
package/dist/approval.d.ts
CHANGED
|
@@ -1,26 +1,73 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Permission Gating
|
|
2
|
+
* Permission Gating + Real-Time Tool Approval via MQTT
|
|
3
3
|
*
|
|
4
4
|
* Three modes:
|
|
5
5
|
* - autopilot: execute everything without asking
|
|
6
|
-
* - approve-destructive: auto-run reads,
|
|
7
|
-
* - approve-all:
|
|
6
|
+
* - approve-destructive: auto-run reads, ask user for destructive tools
|
|
7
|
+
* - approve-all: ask user for every tool call
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* In non-autopilot modes, the agent publishes an approval_request via MQTT,
|
|
10
|
+
* renders an inline card in the web UI, and waits for the user's response
|
|
11
|
+
* (allow/deny) before proceeding. Times out after 60s → auto-deny.
|
|
12
12
|
*/
|
|
13
|
+
import { EventEmitter } from 'events';
|
|
13
14
|
export type PermissionMode = 'autopilot' | 'approve-destructive' | 'approve-all';
|
|
14
15
|
export interface ApprovalResult {
|
|
15
16
|
approved: boolean;
|
|
16
17
|
reason?: string;
|
|
18
|
+
/** If true, user chose "always allow" — persist this tool as auto-approved */
|
|
19
|
+
remember?: boolean;
|
|
17
20
|
}
|
|
21
|
+
export interface ApprovalRequest {
|
|
22
|
+
requestId: string;
|
|
23
|
+
commandId: string;
|
|
24
|
+
tool: string;
|
|
25
|
+
arguments: Record<string, any>;
|
|
26
|
+
riskLevel: 'safe' | 'destructive';
|
|
27
|
+
summary: string;
|
|
28
|
+
timeout: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ApprovalResponse {
|
|
31
|
+
requestId: string;
|
|
32
|
+
approved: boolean;
|
|
33
|
+
remember?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function rememberTool(toolName: string): void;
|
|
36
|
+
export declare function isRemembered(toolName: string): boolean;
|
|
37
|
+
export declare function clearRemembered(): void;
|
|
18
38
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* @param permissionMode - The agent's permission mode
|
|
23
|
-
* @param enabledTools - List of tool names that are enabled (if undefined, all are enabled)
|
|
39
|
+
* Quick synchronous check — returns whether a tool needs interactive approval.
|
|
40
|
+
* Returns { approved: true } for auto-approved tools, { approved: false } for
|
|
41
|
+
* tools that need the async MQTT approval flow.
|
|
24
42
|
*/
|
|
25
43
|
export declare function checkPermission(toolName: string, permissionMode: PermissionMode, enabledTools?: string[]): ApprovalResult;
|
|
44
|
+
export type PublishFn = (topic: string, payload: string, opts?: {
|
|
45
|
+
qos?: number;
|
|
46
|
+
}) => void;
|
|
47
|
+
export declare class ApprovalManager extends EventEmitter {
|
|
48
|
+
private pending;
|
|
49
|
+
private userId;
|
|
50
|
+
private publishFn;
|
|
51
|
+
private defaultTimeout;
|
|
52
|
+
constructor(userId: string, publishFn: PublishFn, defaultTimeout?: number);
|
|
53
|
+
/**
|
|
54
|
+
* Request interactive approval for a tool call via MQTT.
|
|
55
|
+
* Publishes an approval_request, waits for user response or timeout.
|
|
56
|
+
*/
|
|
57
|
+
requestApproval(commandId: string, toolName: string, toolArgs: Record<string, any>, timeout?: number): Promise<ApprovalResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Handle an incoming approval response from the web UI.
|
|
60
|
+
* Call this from the MQTT message handler.
|
|
61
|
+
*/
|
|
62
|
+
handleResponse(response: ApprovalResponse): void;
|
|
63
|
+
/**
|
|
64
|
+
* Cancel all pending approvals (e.g., on command cancel).
|
|
65
|
+
*/
|
|
66
|
+
cancelAll(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Cancel a specific pending approval by command ID.
|
|
69
|
+
*/
|
|
70
|
+
cancelForCommand(commandId: string): void;
|
|
71
|
+
get pendingCount(): number;
|
|
72
|
+
}
|
|
26
73
|
//# sourceMappingURL=approval.d.ts.map
|
package/dist/approval.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,qBAAqB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,qBAAqB,GAAG,aAAa,CAAC;AAqBjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0BD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,cAAc,CAmChB;AAmCD,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC;AAE1F,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,OAAO,CAGV;IAEL,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,SAAS;IAOzE;;;OAGG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC;IAgC1B;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAsBhD;;OAEG;IACH,SAAS,IAAI,IAAI;IAQjB;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMzC,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
|
package/dist/approval.js
CHANGED
|
@@ -1,18 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Permission Gating
|
|
3
|
+
* Permission Gating + Real-Time Tool Approval via MQTT
|
|
4
4
|
*
|
|
5
5
|
* Three modes:
|
|
6
6
|
* - autopilot: execute everything without asking
|
|
7
|
-
* - approve-destructive: auto-run reads,
|
|
8
|
-
* - approve-all:
|
|
7
|
+
* - approve-destructive: auto-run reads, ask user for destructive tools
|
|
8
|
+
* - approve-all: ask user for every tool call
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* In non-autopilot modes, the agent publishes an approval_request via MQTT,
|
|
11
|
+
* renders an inline card in the web UI, and waits for the user's response
|
|
12
|
+
* (allow/deny) before proceeding. Times out after 60s → auto-deny.
|
|
13
13
|
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
14
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.ApprovalManager = void 0;
|
|
49
|
+
exports.rememberTool = rememberTool;
|
|
50
|
+
exports.isRemembered = isRemembered;
|
|
51
|
+
exports.clearRemembered = clearRemembered;
|
|
15
52
|
exports.checkPermission = checkPermission;
|
|
53
|
+
const events_1 = require("events");
|
|
54
|
+
const crypto = __importStar(require("crypto"));
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const os = __importStar(require("os"));
|
|
16
58
|
/** Tools that modify state — require approval in approve-destructive mode */
|
|
17
59
|
const DESTRUCTIVE_TOOLS = new Set([
|
|
18
60
|
'write_file',
|
|
@@ -26,13 +68,49 @@ const READONLY_TOOLS = new Set([
|
|
|
26
68
|
'list_directory',
|
|
27
69
|
'git_status',
|
|
28
70
|
'git_diff',
|
|
71
|
+
'web_search',
|
|
72
|
+
'web_fetch',
|
|
73
|
+
'search_local_memory',
|
|
29
74
|
]);
|
|
75
|
+
// ── Remembered Approvals ────────────────────────────────────────────────────
|
|
76
|
+
const REMEMBERED_FILE = path.join(os.homedir(), '.funolio', 'remembered-tools.json');
|
|
77
|
+
let rememberedTools = null;
|
|
78
|
+
function loadRemembered() {
|
|
79
|
+
if (rememberedTools)
|
|
80
|
+
return rememberedTools;
|
|
81
|
+
try {
|
|
82
|
+
const data = JSON.parse(fs.readFileSync(REMEMBERED_FILE, 'utf-8'));
|
|
83
|
+
rememberedTools = new Set(Array.isArray(data) ? data : []);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
rememberedTools = new Set();
|
|
87
|
+
}
|
|
88
|
+
return rememberedTools;
|
|
89
|
+
}
|
|
90
|
+
function saveRemembered() {
|
|
91
|
+
if (!rememberedTools)
|
|
92
|
+
return;
|
|
93
|
+
const dir = path.dirname(REMEMBERED_FILE);
|
|
94
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
95
|
+
fs.writeFileSync(REMEMBERED_FILE, JSON.stringify([...rememberedTools], null, 2), { mode: 0o600 });
|
|
96
|
+
}
|
|
97
|
+
function rememberTool(toolName) {
|
|
98
|
+
const set = loadRemembered();
|
|
99
|
+
set.add(toolName);
|
|
100
|
+
saveRemembered();
|
|
101
|
+
}
|
|
102
|
+
function isRemembered(toolName) {
|
|
103
|
+
return loadRemembered().has(toolName);
|
|
104
|
+
}
|
|
105
|
+
function clearRemembered() {
|
|
106
|
+
rememberedTools = new Set();
|
|
107
|
+
saveRemembered();
|
|
108
|
+
}
|
|
109
|
+
// ── Synchronous Permission Check ────────────────────────────────────────────
|
|
30
110
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* @param permissionMode - The agent's permission mode
|
|
35
|
-
* @param enabledTools - List of tool names that are enabled (if undefined, all are enabled)
|
|
111
|
+
* Quick synchronous check — returns whether a tool needs interactive approval.
|
|
112
|
+
* Returns { approved: true } for auto-approved tools, { approved: false } for
|
|
113
|
+
* tools that need the async MQTT approval flow.
|
|
36
114
|
*/
|
|
37
115
|
function checkPermission(toolName, permissionMode, enabledTools) {
|
|
38
116
|
// Check if tool is enabled
|
|
@@ -42,32 +120,144 @@ function checkPermission(toolName, permissionMode, enabledTools) {
|
|
|
42
120
|
reason: `Tool "${toolName}" is not enabled for this agent`,
|
|
43
121
|
};
|
|
44
122
|
}
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
123
|
+
// Autopilot — everything is approved
|
|
124
|
+
if (permissionMode === 'autopilot') {
|
|
125
|
+
return { approved: true };
|
|
126
|
+
}
|
|
127
|
+
// Check remembered approvals
|
|
128
|
+
if (isRemembered(toolName)) {
|
|
129
|
+
return { approved: true };
|
|
130
|
+
}
|
|
131
|
+
// approve-destructive: auto-approve read-only tools
|
|
132
|
+
if (permissionMode === 'approve-destructive') {
|
|
133
|
+
if (READONLY_TOOLS.has(toolName)) {
|
|
48
134
|
return { approved: true };
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
case '
|
|
65
|
-
return {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
approved: false,
|
|
138
|
+
reason: `Tool "${toolName}" requires user approval (destructive action).`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// approve-all: everything needs approval
|
|
142
|
+
return {
|
|
143
|
+
approved: false,
|
|
144
|
+
reason: `Tool "${toolName}" requires user approval.`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// ── Tool Summary Generator ──────────────────────────────────────────────────
|
|
148
|
+
function generateToolSummary(toolName, args) {
|
|
149
|
+
switch (toolName) {
|
|
150
|
+
case 'write_file':
|
|
151
|
+
return `Write file: ${args.path || args.filePath || 'unknown'}`;
|
|
152
|
+
case 'edit_file':
|
|
153
|
+
return `Edit file: ${args.path || args.filePath || 'unknown'}`;
|
|
154
|
+
case 'run_command':
|
|
155
|
+
return `Run command: ${args.command || 'unknown'}`;
|
|
156
|
+
case 'git_commit':
|
|
157
|
+
return `Git commit: ${args.message || 'unknown'}`;
|
|
158
|
+
case 'read_file':
|
|
159
|
+
return `Read file: ${args.path || args.filePath || 'unknown'}`;
|
|
160
|
+
case 'list_directory':
|
|
161
|
+
return `List directory: ${args.path || args.directory || '.'}`;
|
|
162
|
+
case 'web_search':
|
|
163
|
+
return `Web search: ${args.query || 'unknown'}`;
|
|
164
|
+
case 'web_fetch':
|
|
165
|
+
return `Fetch URL: ${args.url || 'unknown'}`;
|
|
166
|
+
case 'schedule_task':
|
|
167
|
+
return `Schedule task: ${args.description || args.name || 'unknown'}`;
|
|
69
168
|
default:
|
|
70
|
-
return {
|
|
169
|
+
return `${toolName}(${JSON.stringify(args).slice(0, 80)})`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function getRiskLevel(toolName) {
|
|
173
|
+
return DESTRUCTIVE_TOOLS.has(toolName) ? 'destructive' : 'safe';
|
|
174
|
+
}
|
|
175
|
+
class ApprovalManager extends events_1.EventEmitter {
|
|
176
|
+
pending = new Map();
|
|
177
|
+
userId;
|
|
178
|
+
publishFn;
|
|
179
|
+
defaultTimeout;
|
|
180
|
+
constructor(userId, publishFn, defaultTimeout = 60_000) {
|
|
181
|
+
super();
|
|
182
|
+
this.userId = userId;
|
|
183
|
+
this.publishFn = publishFn;
|
|
184
|
+
this.defaultTimeout = defaultTimeout;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Request interactive approval for a tool call via MQTT.
|
|
188
|
+
* Publishes an approval_request, waits for user response or timeout.
|
|
189
|
+
*/
|
|
190
|
+
async requestApproval(commandId, toolName, toolArgs, timeout) {
|
|
191
|
+
const requestId = crypto.randomUUID();
|
|
192
|
+
const timeoutMs = timeout || this.defaultTimeout;
|
|
193
|
+
const request = {
|
|
194
|
+
requestId,
|
|
195
|
+
commandId,
|
|
196
|
+
tool: toolName,
|
|
197
|
+
arguments: toolArgs,
|
|
198
|
+
riskLevel: getRiskLevel(toolName),
|
|
199
|
+
summary: generateToolSummary(toolName, toolArgs),
|
|
200
|
+
timeout: timeoutMs,
|
|
201
|
+
};
|
|
202
|
+
// Publish the approval request
|
|
203
|
+
const topic = `funolio/${this.userId}/agent/approval`;
|
|
204
|
+
this.publishFn(topic, JSON.stringify(request), { qos: 1 });
|
|
205
|
+
// Wait for response or timeout
|
|
206
|
+
return new Promise((resolve) => {
|
|
207
|
+
const timer = setTimeout(() => {
|
|
208
|
+
this.pending.delete(requestId);
|
|
209
|
+
resolve({
|
|
210
|
+
approved: false,
|
|
211
|
+
reason: `Approval timed out after ${timeoutMs / 1000}s. User did not respond.`,
|
|
212
|
+
});
|
|
213
|
+
}, timeoutMs);
|
|
214
|
+
this.pending.set(requestId, { resolve, timer });
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Handle an incoming approval response from the web UI.
|
|
219
|
+
* Call this from the MQTT message handler.
|
|
220
|
+
*/
|
|
221
|
+
handleResponse(response) {
|
|
222
|
+
const entry = this.pending.get(response.requestId);
|
|
223
|
+
if (!entry)
|
|
224
|
+
return; // Stale or unknown request
|
|
225
|
+
clearTimeout(entry.timer);
|
|
226
|
+
this.pending.delete(response.requestId);
|
|
227
|
+
// If user chose "always allow", persist it
|
|
228
|
+
if (response.approved && response.remember) {
|
|
229
|
+
// We need the tool name — stored in the request we sent.
|
|
230
|
+
// The response only has requestId, but we can emit an event
|
|
231
|
+
// for the caller to handle remembering.
|
|
232
|
+
this.emit('remember', response.requestId);
|
|
233
|
+
}
|
|
234
|
+
entry.resolve({
|
|
235
|
+
approved: response.approved,
|
|
236
|
+
reason: response.approved ? undefined : 'User denied the tool call.',
|
|
237
|
+
remember: response.remember,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Cancel all pending approvals (e.g., on command cancel).
|
|
242
|
+
*/
|
|
243
|
+
cancelAll() {
|
|
244
|
+
for (const [id, entry] of this.pending) {
|
|
245
|
+
clearTimeout(entry.timer);
|
|
246
|
+
entry.resolve({ approved: false, reason: 'Cancelled.' });
|
|
247
|
+
}
|
|
248
|
+
this.pending.clear();
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Cancel a specific pending approval by command ID.
|
|
252
|
+
*/
|
|
253
|
+
cancelForCommand(commandId) {
|
|
254
|
+
// We don't track commandId→requestId mapping here, so this is
|
|
255
|
+
// handled by the message loop cancelling all pending on command cancel.
|
|
256
|
+
this.cancelAll();
|
|
257
|
+
}
|
|
258
|
+
get pendingCount() {
|
|
259
|
+
return this.pending.size;
|
|
71
260
|
}
|
|
72
261
|
}
|
|
262
|
+
exports.ApprovalManager = ApprovalManager;
|
|
73
263
|
//# sourceMappingURL=approval.js.map
|
package/dist/approval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { OAuthCredential } from './credential-reader';
|
|
2
|
+
export declare const ANTHROPIC_OAUTH_BETA_HEADER = "oauth-2025-04-20";
|
|
3
|
+
export declare const ANTHROPIC_CLAUDE_CODE_API_KEY_URL = "https://api.anthropic.com/api/oauth/claude_cli/create_api_key";
|
|
4
|
+
export interface AnthropicSubscriptionTokenInput {
|
|
5
|
+
accessToken: string;
|
|
6
|
+
refreshToken?: string | null;
|
|
7
|
+
expiresAt?: number | null;
|
|
8
|
+
onRefresh?: ((credential: OAuthCredential) => void) | null;
|
|
9
|
+
}
|
|
10
|
+
export type AnthropicAuthMode = 'api-key' | 'oauth-bearer';
|
|
11
|
+
export interface AnthropicSubscriptionAuthResult {
|
|
12
|
+
token: string;
|
|
13
|
+
authMode: AnthropicAuthMode;
|
|
14
|
+
credential: OAuthCredential;
|
|
15
|
+
refreshed: boolean;
|
|
16
|
+
source: 'api-key-exchange' | 'oauth-bearer';
|
|
17
|
+
}
|
|
18
|
+
export declare function ensureFreshAnthropicCredential(input: AnthropicSubscriptionTokenInput): Promise<{
|
|
19
|
+
credential: OAuthCredential;
|
|
20
|
+
refreshed: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function createAnthropicApiKeyFromOauth(accessToken: string): Promise<string>;
|
|
23
|
+
export declare function resolveAnthropicSubscriptionAuth(input: AnthropicSubscriptionTokenInput): Promise<AnthropicSubscriptionAuthResult>;
|
|
24
|
+
//# sourceMappingURL=anthropic-subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-subscription.d.ts","sourceRoot":"","sources":["../../src/auth/anthropic-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,qBAAqB,CAAC;AAGjE,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAC9D,eAAO,MAAM,iCAAiC,kEAAkE,CAAC;AASjH,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,cAAc,CAAC;AAE3D,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC;CAC7C;AAqCD,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAS9D;AAED,wBAAsB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BzF;AAED,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,+BAA+B,CAAC,CA0B1C"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ANTHROPIC_CLAUDE_CODE_API_KEY_URL = exports.ANTHROPIC_OAUTH_BETA_HEADER = void 0;
|
|
4
|
+
exports.ensureFreshAnthropicCredential = ensureFreshAnthropicCredential;
|
|
5
|
+
exports.createAnthropicApiKeyFromOauth = createAnthropicApiKeyFromOauth;
|
|
6
|
+
exports.resolveAnthropicSubscriptionAuth = resolveAnthropicSubscriptionAuth;
|
|
7
|
+
const credential_reader_1 = require("./credential-reader");
|
|
8
|
+
const token_refresh_1 = require("./token-refresh");
|
|
9
|
+
exports.ANTHROPIC_OAUTH_BETA_HEADER = 'oauth-2025-04-20';
|
|
10
|
+
exports.ANTHROPIC_CLAUDE_CODE_API_KEY_URL = 'https://api.anthropic.com/api/oauth/claude_cli/create_api_key';
|
|
11
|
+
const API_KEY_CACHE_TTL_MS = 30 * 60_000;
|
|
12
|
+
const apiKeyCache = new Map();
|
|
13
|
+
function readCachedApiKey(accessToken) {
|
|
14
|
+
const cached = apiKeyCache.get(accessToken);
|
|
15
|
+
if (!cached)
|
|
16
|
+
return null;
|
|
17
|
+
if (cached.expiresAt <= Date.now()) {
|
|
18
|
+
apiKeyCache.delete(accessToken);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return cached.rawKey;
|
|
22
|
+
}
|
|
23
|
+
function storeCachedApiKey(accessToken, rawKey) {
|
|
24
|
+
apiKeyCache.set(accessToken, {
|
|
25
|
+
rawKey,
|
|
26
|
+
expiresAt: Date.now() + API_KEY_CACHE_TTL_MS,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function toCredential(input) {
|
|
30
|
+
return {
|
|
31
|
+
provider: 'anthropic',
|
|
32
|
+
accessToken: input.accessToken,
|
|
33
|
+
refreshToken: input.refreshToken || '',
|
|
34
|
+
expiresAt: input.expiresAt || 0,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function isScopeLimitedOauthError(message) {
|
|
38
|
+
const normalized = message.toLowerCase();
|
|
39
|
+
return normalized.includes('org:create_api_key')
|
|
40
|
+
|| normalized.includes('permission_error')
|
|
41
|
+
|| normalized.includes('scope requirement');
|
|
42
|
+
}
|
|
43
|
+
async function ensureFreshAnthropicCredential(input) {
|
|
44
|
+
const credential = toCredential(input);
|
|
45
|
+
if (!credential.refreshToken || !(0, credential_reader_1.isExpired)(credential)) {
|
|
46
|
+
return { credential, refreshed: false };
|
|
47
|
+
}
|
|
48
|
+
const refreshed = await (0, token_refresh_1.refreshToken)(credential);
|
|
49
|
+
input.onRefresh?.(refreshed.credential);
|
|
50
|
+
return { credential: refreshed.credential, refreshed: true };
|
|
51
|
+
}
|
|
52
|
+
async function createAnthropicApiKeyFromOauth(accessToken) {
|
|
53
|
+
const cached = readCachedApiKey(accessToken);
|
|
54
|
+
if (cached)
|
|
55
|
+
return cached;
|
|
56
|
+
const response = await fetch(exports.ANTHROPIC_CLAUDE_CODE_API_KEY_URL, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: {
|
|
59
|
+
Authorization: `Bearer ${accessToken}`,
|
|
60
|
+
'anthropic-beta': exports.ANTHROPIC_OAUTH_BETA_HEADER,
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'User-Agent': 'funolio-agent',
|
|
63
|
+
'x-app': 'funolio-desktop',
|
|
64
|
+
},
|
|
65
|
+
body: '{}',
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const body = await response.text().catch(() => '');
|
|
69
|
+
throw new Error(`Anthropic Claude subscription API key exchange failed (${response.status}): ${body}`);
|
|
70
|
+
}
|
|
71
|
+
const data = await response.json();
|
|
72
|
+
if (!data.raw_key) {
|
|
73
|
+
throw new Error('Anthropic Claude subscription API key exchange returned no raw_key');
|
|
74
|
+
}
|
|
75
|
+
storeCachedApiKey(accessToken, data.raw_key);
|
|
76
|
+
return data.raw_key;
|
|
77
|
+
}
|
|
78
|
+
async function resolveAnthropicSubscriptionAuth(input) {
|
|
79
|
+
const { credential, refreshed } = await ensureFreshAnthropicCredential(input);
|
|
80
|
+
try {
|
|
81
|
+
const apiKey = await createAnthropicApiKeyFromOauth(credential.accessToken);
|
|
82
|
+
return {
|
|
83
|
+
token: apiKey,
|
|
84
|
+
authMode: 'api-key',
|
|
85
|
+
credential,
|
|
86
|
+
refreshed,
|
|
87
|
+
source: 'api-key-exchange',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const message = err?.message || String(err);
|
|
92
|
+
if (!isScopeLimitedOauthError(message)) {
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
token: credential.accessToken,
|
|
97
|
+
authMode: 'oauth-bearer',
|
|
98
|
+
credential,
|
|
99
|
+
refreshed,
|
|
100
|
+
source: 'oauth-bearer',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=anthropic-subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-subscription.js","sourceRoot":"","sources":["../../src/auth/anthropic-subscription.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OAuthCredential } from './credential-reader';
|
|
2
|
+
export interface ResolvedAuth {
|
|
3
|
+
provider: string;
|
|
4
|
+
model: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
source: 'oauth' | 'api-key' | 'env';
|
|
7
|
+
credential?: OAuthCredential;
|
|
8
|
+
expired?: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the best available authentication method.
|
|
13
|
+
* Priority: explicit API key > OAuth credentials > env vars
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveAuth(config: {
|
|
16
|
+
provider?: string;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
model?: string;
|
|
19
|
+
oauthToken?: string;
|
|
20
|
+
oauthRefreshToken?: string;
|
|
21
|
+
oauthExpiresAt?: number;
|
|
22
|
+
}): Promise<ResolvedAuth | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Ensure the token in a ResolvedAuth is still valid. Refreshes if needed.
|
|
25
|
+
* Returns the same object if still valid, or a new one with updated token.
|
|
26
|
+
*/
|
|
27
|
+
export declare function ensureFreshToken(auth: ResolvedAuth): Promise<ResolvedAuth>;
|
|
28
|
+
//# sourceMappingURL=auto-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-detect.d.ts","sourceRoot":"","sources":["../../src/auth/auto-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,qBAAqB,CAAC;AAQjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACpC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgG/B;AAoCD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAgChF"}
|