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.
Files changed (168) hide show
  1. package/dist/agent-config.d.ts +2 -0
  2. package/dist/agent-config.d.ts.map +1 -1
  3. package/dist/agent-config.js.map +1 -1
  4. package/dist/approval.d.ts +58 -11
  5. package/dist/approval.d.ts.map +1 -1
  6. package/dist/approval.js +225 -35
  7. package/dist/approval.js.map +1 -1
  8. package/dist/auth/anthropic-subscription.d.ts +24 -0
  9. package/dist/auth/anthropic-subscription.d.ts.map +1 -0
  10. package/dist/auth/anthropic-subscription.js +104 -0
  11. package/dist/auth/anthropic-subscription.js.map +1 -0
  12. package/dist/auth/auto-detect.d.ts +28 -0
  13. package/dist/auth/auto-detect.d.ts.map +1 -0
  14. package/dist/auth/auto-detect.js +210 -0
  15. package/dist/auth/auto-detect.js.map +1 -0
  16. package/dist/auth/credential-reader.d.ts +24 -0
  17. package/dist/auth/credential-reader.d.ts.map +1 -0
  18. package/dist/auth/credential-reader.js +265 -0
  19. package/dist/auth/credential-reader.js.map +1 -0
  20. package/dist/auth/index.d.ts +4 -0
  21. package/dist/auth/index.d.ts.map +1 -0
  22. package/dist/auth/index.js +16 -0
  23. package/dist/auth/index.js.map +1 -0
  24. package/dist/auth/token-refresh.d.ts +31 -0
  25. package/dist/auth/token-refresh.d.ts.map +1 -0
  26. package/dist/auth/token-refresh.js +341 -0
  27. package/dist/auth/token-refresh.js.map +1 -0
  28. package/dist/backfill.d.ts +19 -8
  29. package/dist/backfill.d.ts.map +1 -1
  30. package/dist/backfill.js +64 -157
  31. package/dist/backfill.js.map +1 -1
  32. package/dist/bot-manager.d.ts +7 -2
  33. package/dist/bot-manager.d.ts.map +1 -1
  34. package/dist/bot-manager.js +79 -34
  35. package/dist/bot-manager.js.map +1 -1
  36. package/dist/clerk-model.d.ts +10 -1
  37. package/dist/clerk-model.d.ts.map +1 -1
  38. package/dist/clerk-model.js +107 -75
  39. package/dist/clerk-model.js.map +1 -1
  40. package/dist/cli.js +21 -3
  41. package/dist/cli.js.map +1 -1
  42. package/dist/commands/configure.d.ts.map +1 -1
  43. package/dist/commands/configure.js +53 -0
  44. package/dist/commands/configure.js.map +1 -1
  45. package/dist/commands/import-openclaw.d.ts.map +1 -1
  46. package/dist/commands/import-openclaw.js +1 -1
  47. package/dist/commands/import-openclaw.js.map +1 -1
  48. package/dist/commands/init.d.ts.map +1 -1
  49. package/dist/commands/init.js +56 -2
  50. package/dist/commands/init.js.map +1 -1
  51. package/dist/commands/start.d.ts.map +1 -1
  52. package/dist/commands/start.js +271 -19
  53. package/dist/commands/start.js.map +1 -1
  54. package/dist/config.d.ts +8 -0
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +224 -2
  57. package/dist/config.js.map +1 -1
  58. package/dist/context-window.d.ts +15 -1
  59. package/dist/context-window.d.ts.map +1 -1
  60. package/dist/context-window.js +37 -1
  61. package/dist/context-window.js.map +1 -1
  62. package/dist/integration-tokens.d.ts +40 -0
  63. package/dist/integration-tokens.d.ts.map +1 -0
  64. package/dist/integration-tokens.js +168 -0
  65. package/dist/integration-tokens.js.map +1 -0
  66. package/dist/local-data.d.ts +236 -3
  67. package/dist/local-data.d.ts.map +1 -1
  68. package/dist/local-data.js +824 -16
  69. package/dist/local-data.js.map +1 -1
  70. package/dist/local-db.d.ts +17 -0
  71. package/dist/local-db.d.ts.map +1 -1
  72. package/dist/local-db.js +207 -4
  73. package/dist/local-db.js.map +1 -1
  74. package/dist/local-import-worker.d.ts +9 -1
  75. package/dist/local-import-worker.d.ts.map +1 -1
  76. package/dist/local-import-worker.js +235 -27
  77. package/dist/local-import-worker.js.map +1 -1
  78. package/dist/local-server.d.ts.map +1 -1
  79. package/dist/local-server.js +1368 -153
  80. package/dist/local-server.js.map +1 -1
  81. package/dist/mcp/bridge-server.d.ts +4 -7
  82. package/dist/mcp/bridge-server.d.ts.map +1 -1
  83. package/dist/mcp/bridge-server.js +37 -38
  84. package/dist/mcp/bridge-server.js.map +1 -1
  85. package/dist/mcp/manager.d.ts.map +1 -1
  86. package/dist/mcp/manager.js +10 -1
  87. package/dist/mcp/manager.js.map +1 -1
  88. package/dist/mcp/marketplace.d.ts.map +1 -1
  89. package/dist/mcp/marketplace.js +31 -11
  90. package/dist/mcp/marketplace.js.map +1 -1
  91. package/dist/mcp/registry-shared.d.ts +40 -0
  92. package/dist/mcp/registry-shared.d.ts.map +1 -0
  93. package/dist/mcp/registry-shared.js +634 -0
  94. package/dist/mcp/registry-shared.js.map +1 -0
  95. package/dist/mcp/registry.d.ts +4 -36
  96. package/dist/mcp/registry.d.ts.map +1 -1
  97. package/dist/mcp/registry.js +8 -492
  98. package/dist/mcp/registry.js.map +1 -1
  99. package/dist/mcp/sync-cli-config.d.ts.map +1 -1
  100. package/dist/mcp/sync-cli-config.js +103 -23
  101. package/dist/mcp/sync-cli-config.js.map +1 -1
  102. package/dist/message-loop.d.ts +14 -0
  103. package/dist/message-loop.d.ts.map +1 -1
  104. package/dist/message-loop.js +262 -34
  105. package/dist/message-loop.js.map +1 -1
  106. package/dist/mqtt-client.d.ts +25 -1
  107. package/dist/mqtt-client.d.ts.map +1 -1
  108. package/dist/mqtt-client.js +25 -7
  109. package/dist/mqtt-client.js.map +1 -1
  110. package/dist/providers/anthropic.d.ts +1 -0
  111. package/dist/providers/anthropic.d.ts.map +1 -1
  112. package/dist/providers/anthropic.js +14 -4
  113. package/dist/providers/anthropic.js.map +1 -1
  114. package/dist/providers/claude-cli.d.ts.map +1 -1
  115. package/dist/providers/claude-cli.js +145 -48
  116. package/dist/providers/claude-cli.js.map +1 -1
  117. package/dist/providers/codex-cli.d.ts +1 -1
  118. package/dist/providers/codex-cli.d.ts.map +1 -1
  119. package/dist/providers/codex-cli.js +71 -18
  120. package/dist/providers/codex-cli.js.map +1 -1
  121. package/dist/providers/index.d.ts +4 -0
  122. package/dist/providers/index.d.ts.map +1 -1
  123. package/dist/providers/index.js.map +1 -1
  124. package/dist/providers/openai.d.ts +5 -0
  125. package/dist/providers/openai.d.ts.map +1 -1
  126. package/dist/providers/openai.js +252 -0
  127. package/dist/providers/openai.js.map +1 -1
  128. package/dist/response-guard.d.ts +6 -0
  129. package/dist/response-guard.d.ts.map +1 -0
  130. package/dist/response-guard.js +30 -0
  131. package/dist/response-guard.js.map +1 -0
  132. package/dist/summarization-pipeline.d.ts +63 -2
  133. package/dist/summarization-pipeline.d.ts.map +1 -1
  134. package/dist/summarization-pipeline.js +361 -95
  135. package/dist/summarization-pipeline.js.map +1 -1
  136. package/dist/token-counter.d.ts +10 -0
  137. package/dist/token-counter.d.ts.map +1 -0
  138. package/dist/token-counter.js +57 -0
  139. package/dist/token-counter.js.map +1 -0
  140. package/dist/tool-filter.d.ts +26 -0
  141. package/dist/tool-filter.d.ts.map +1 -0
  142. package/dist/tool-filter.js +136 -0
  143. package/dist/tool-filter.js.map +1 -0
  144. package/dist/tools/index.d.ts.map +1 -1
  145. package/dist/tools/index.js +6 -0
  146. package/dist/tools/index.js.map +1 -1
  147. package/dist/tools/schedule-task.d.ts.map +1 -1
  148. package/dist/tools/schedule-task.js +6 -5
  149. package/dist/tools/schedule-task.js.map +1 -1
  150. package/dist/tools/todo-tasks.d.ts +7 -0
  151. package/dist/tools/todo-tasks.d.ts.map +1 -0
  152. package/dist/tools/todo-tasks.js +260 -0
  153. package/dist/tools/todo-tasks.js.map +1 -0
  154. package/dist/types.d.ts +6 -0
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/wizard-state.d.ts +125 -0
  157. package/dist/wizard-state.d.ts.map +1 -0
  158. package/dist/wizard-state.js +658 -0
  159. package/dist/wizard-state.js.map +1 -0
  160. package/dist/wizard-support.d.ts +110 -0
  161. package/dist/wizard-support.d.ts.map +1 -0
  162. package/dist/wizard-support.js +599 -0
  163. package/dist/wizard-support.js.map +1 -0
  164. package/dist/workflow-engine.d.ts +9 -5
  165. package/dist/workflow-engine.d.ts.map +1 -1
  166. package/dist/workflow-engine.js +165 -13
  167. package/dist/workflow-engine.js.map +1 -1
  168. package/package.json +6 -3
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-config.js","sourceRoot":"","sources":["../src/agent-config.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,73 @@
1
1
  /**
2
- * Permission Gating controls which tools can execute based on agent config.
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, DENY destructive tools (writes/commands/git)
7
- * - approve-all: DENY everything until explicit approval via MQTT
6
+ * - approve-destructive: auto-run reads, ask user for destructive tools
7
+ * - approve-all: ask user for every tool call
8
8
  *
9
- * When a tool is denied, the agent returns an error to the LLM indicating
10
- * approval is required. A future version will implement real-time approval
11
- * via the web UI and MQTT.
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
- * Check if a tool call is allowed based on permission mode and enabled tools.
20
- *
21
- * @param toolName - The tool being called
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
@@ -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;AAkBjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,cAAc,CAuChB"}
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 controls which tools can execute based on agent config.
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, DENY destructive tools (writes/commands/git)
8
- * - approve-all: DENY everything until explicit approval via MQTT
7
+ * - approve-destructive: auto-run reads, ask user for destructive tools
8
+ * - approve-all: ask user for every tool call
9
9
  *
10
- * When a tool is denied, the agent returns an error to the LLM indicating
11
- * approval is required. A future version will implement real-time approval
12
- * via the web UI and MQTT.
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
- * Check if a tool call is allowed based on permission mode and enabled tools.
32
- *
33
- * @param toolName - The tool being called
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
- // Check permission mode
46
- switch (permissionMode) {
47
- case 'autopilot':
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
- case 'approve-destructive':
50
- if (READONLY_TOOLS.has(toolName)) {
51
- return { approved: true };
52
- }
53
- if (DESTRUCTIVE_TOOLS.has(toolName)) {
54
- return {
55
- approved: false,
56
- reason: `Tool "${toolName}" requires user approval (destructive action). Permission mode: approve-destructive.`,
57
- };
58
- }
59
- // Unknown tool — deny by default in approve-destructive mode
60
- return {
61
- approved: false,
62
- reason: `Tool "${toolName}" is not recognized as read-only. Approval required.`,
63
- };
64
- case 'approve-all':
65
- return {
66
- approved: false,
67
- reason: `Tool "${toolName}" requires user approval. Permission mode: approve-all.`,
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 { approved: true };
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
@@ -1 +1 @@
1
- {"version":3,"file":"approval.js","sourceRoot":"","sources":["../src/approval.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAgCH,0CA2CC;AAvED,6EAA6E;AAC7E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,YAAY;IACZ,WAAW;IACX,aAAa;IACb,YAAY;CACb,CAAC,CAAC;AAEH,kEAAkE;AAClE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,WAAW;IACX,gBAAgB;IAChB,YAAY;IACZ,UAAU;CACX,CAAC,CAAC;AAOH;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,QAAgB,EAChB,cAA8B,EAC9B,YAAuB;IAEvB,2BAA2B;IAC3B,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,SAAS,QAAQ,iCAAiC;SAC3D,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE5B,KAAK,qBAAqB;YACxB,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC5B,CAAC;YACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACL,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,SAAS,QAAQ,sFAAsF;iBAChH,CAAC;YACJ,CAAC;YACD,6DAA6D;YAC7D,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,SAAS,QAAQ,sDAAsD;aAChF,CAAC;QAEJ,KAAK,aAAa;YAChB,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,SAAS,QAAQ,yDAAyD;aACnF,CAAC;QAEJ;YACE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC"}
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"}