@qduc/term2 0.24.1 → 0.25.0

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 (215) hide show
  1. package/dist/agent.d.ts +3 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +2 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/app.d.ts +10 -0
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js +33 -6
  8. package/dist/app.js.map +1 -1
  9. package/dist/cli.js +43 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/mcp-login-command.d.ts +24 -0
  12. package/dist/commands/mcp-login-command.d.ts.map +1 -0
  13. package/dist/commands/mcp-login-command.js +65 -0
  14. package/dist/commands/mcp-login-command.js.map +1 -0
  15. package/dist/commands/mcp-status-command.d.ts +19 -0
  16. package/dist/commands/mcp-status-command.d.ts.map +1 -0
  17. package/dist/commands/mcp-status-command.js +19 -0
  18. package/dist/commands/mcp-status-command.js.map +1 -0
  19. package/dist/components/input/ApplicationInputSurface.d.ts +4 -0
  20. package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
  21. package/dist/components/input/ApplicationInputSurface.js +2 -0
  22. package/dist/components/input/ApplicationInputSurface.js.map +1 -1
  23. package/dist/components/input/McpMenuSession.d.ts +9 -0
  24. package/dist/components/input/McpMenuSession.d.ts.map +1 -0
  25. package/dist/components/input/McpMenuSession.js +370 -0
  26. package/dist/components/input/McpMenuSession.js.map +1 -0
  27. package/dist/components/input/mcp-intent-host.d.ts +10 -0
  28. package/dist/components/input/mcp-intent-host.d.ts.map +1 -0
  29. package/dist/components/input/mcp-intent-host.js +31 -0
  30. package/dist/components/input/mcp-intent-host.js.map +1 -0
  31. package/dist/components/input/menu-controller.d.ts.map +1 -1
  32. package/dist/components/input/menu-controller.js +8 -5
  33. package/dist/components/input/menu-controller.js.map +1 -1
  34. package/dist/components/input/menu-registry.d.ts.map +1 -1
  35. package/dist/components/input/menu-registry.js +2 -0
  36. package/dist/components/input/menu-registry.js.map +1 -1
  37. package/dist/components/input/menu-types.d.ts +22 -1
  38. package/dist/components/input/menu-types.d.ts.map +1 -1
  39. package/dist/components/layout/BottomArea.d.ts +6 -1
  40. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  41. package/dist/components/layout/BottomArea.js +9 -6
  42. package/dist/components/layout/BottomArea.js.map +1 -1
  43. package/dist/components/menu/McpSelectionMenu.d.ts +15 -0
  44. package/dist/components/menu/McpSelectionMenu.d.ts.map +1 -0
  45. package/dist/components/menu/McpSelectionMenu.js +19 -0
  46. package/dist/components/menu/McpSelectionMenu.js.map +1 -0
  47. package/dist/components/message/command-message-helpers.d.ts +2 -2
  48. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  49. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  50. package/dist/components/prompt/ApprovalPrompt.js +3 -0
  51. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  52. package/dist/contracts/conversation.d.ts +2 -0
  53. package/dist/contracts/conversation.d.ts.map +1 -1
  54. package/dist/contracts/conversation.js.map +1 -1
  55. package/dist/hooks/conversation-ui-reducer.d.ts +1 -1
  56. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  57. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  58. package/dist/hooks/settings-completion-config.js +1 -0
  59. package/dist/hooks/settings-completion-config.js.map +1 -1
  60. package/dist/hooks/use-app-commands.d.ts +9 -1
  61. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  62. package/dist/hooks/use-app-commands.js +14 -1
  63. package/dist/hooks/use-app-commands.js.map +1 -1
  64. package/dist/hooks/use-conversation.d.ts +1 -1
  65. package/dist/hooks/use-mcp-notices.d.ts +10 -0
  66. package/dist/hooks/use-mcp-notices.d.ts.map +1 -0
  67. package/dist/hooks/use-mcp-notices.js +47 -0
  68. package/dist/hooks/use-mcp-notices.js.map +1 -0
  69. package/dist/hooks/use-settings-value-completion.d.ts +3 -2
  70. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  71. package/dist/hooks/use-settings-value-completion.js +21 -3
  72. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  73. package/dist/hooks/use-shell-mode.d.ts +1 -0
  74. package/dist/hooks/use-shell-mode.d.ts.map +1 -1
  75. package/dist/hooks/use-shell-mode.js +1 -0
  76. package/dist/hooks/use-shell-mode.js.map +1 -1
  77. package/dist/lib/agent-client.d.ts +1 -0
  78. package/dist/lib/agent-client.d.ts.map +1 -1
  79. package/dist/lib/agent-client.js +2 -0
  80. package/dist/lib/agent-client.js.map +1 -1
  81. package/dist/lib/agent-configuration.d.ts +4 -0
  82. package/dist/lib/agent-configuration.d.ts.map +1 -1
  83. package/dist/lib/agent-configuration.js +8 -0
  84. package/dist/lib/agent-configuration.js.map +1 -1
  85. package/dist/lib/agent-factory.d.ts +2 -0
  86. package/dist/lib/agent-factory.d.ts.map +1 -1
  87. package/dist/lib/agent-factory.js +1 -0
  88. package/dist/lib/agent-factory.js.map +1 -1
  89. package/dist/lib/oauth-loopback.d.ts +79 -0
  90. package/dist/lib/oauth-loopback.d.ts.map +1 -0
  91. package/dist/lib/oauth-loopback.js +221 -0
  92. package/dist/lib/oauth-loopback.js.map +1 -0
  93. package/dist/non-interactive.d.ts +2 -0
  94. package/dist/non-interactive.d.ts.map +1 -1
  95. package/dist/non-interactive.js +19 -0
  96. package/dist/non-interactive.js.map +1 -1
  97. package/dist/providers/oauth-pkce.d.ts +5 -1
  98. package/dist/providers/oauth-pkce.d.ts.map +1 -1
  99. package/dist/providers/oauth-pkce.js +28 -208
  100. package/dist/providers/oauth-pkce.js.map +1 -1
  101. package/dist/providers/openrouter-decisions.d.ts +15 -0
  102. package/dist/providers/openrouter-decisions.d.ts.map +1 -0
  103. package/dist/providers/openrouter-decisions.js +25 -0
  104. package/dist/providers/openrouter-decisions.js.map +1 -0
  105. package/dist/services/approval/decision-shadow.d.ts +15 -0
  106. package/dist/services/approval/decision-shadow.d.ts.map +1 -0
  107. package/dist/services/approval/decision-shadow.js +77 -0
  108. package/dist/services/approval/decision-shadow.js.map +1 -0
  109. package/dist/services/approval/non-interactive-approval-policy.d.ts +5 -0
  110. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -1
  111. package/dist/services/approval/non-interactive-approval-policy.js +14 -0
  112. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  113. package/dist/services/approval/shell-auto-approval-evaluator.d.ts +5 -1
  114. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  115. package/dist/services/approval/shell-auto-approval-evaluator.js +80 -4
  116. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  117. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  118. package/dist/services/conversation/conversation-orchestrator.js +16 -2
  119. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  120. package/dist/services/conversation/conversation-orchestrator.types.d.ts +1 -1
  121. package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
  122. package/dist/services/mcp/mcp-config-controller.d.ts +32 -0
  123. package/dist/services/mcp/mcp-config-controller.d.ts.map +1 -0
  124. package/dist/services/mcp/mcp-config-controller.js +89 -0
  125. package/dist/services/mcp/mcp-config-controller.js.map +1 -0
  126. package/dist/services/mcp/mcp-config.d.ts +61 -0
  127. package/dist/services/mcp/mcp-config.d.ts.map +1 -0
  128. package/dist/services/mcp/mcp-config.js +232 -0
  129. package/dist/services/mcp/mcp-config.js.map +1 -0
  130. package/dist/services/mcp/mcp-connection-manager.d.ts +126 -0
  131. package/dist/services/mcp/mcp-connection-manager.d.ts.map +1 -0
  132. package/dist/services/mcp/mcp-connection-manager.js +488 -0
  133. package/dist/services/mcp/mcp-connection-manager.js.map +1 -0
  134. package/dist/services/mcp/mcp-oauth-login.d.ts +79 -0
  135. package/dist/services/mcp/mcp-oauth-login.d.ts.map +1 -0
  136. package/dist/services/mcp/mcp-oauth-login.js +126 -0
  137. package/dist/services/mcp/mcp-oauth-login.js.map +1 -0
  138. package/dist/services/mcp/mcp-oauth-provider.d.ts +77 -0
  139. package/dist/services/mcp/mcp-oauth-provider.d.ts.map +1 -0
  140. package/dist/services/mcp/mcp-oauth-provider.js +121 -0
  141. package/dist/services/mcp/mcp-oauth-provider.js.map +1 -0
  142. package/dist/services/mcp/mcp-oauth-store.d.ts +106 -0
  143. package/dist/services/mcp/mcp-oauth-store.d.ts.map +1 -0
  144. package/dist/services/mcp/mcp-oauth-store.js +278 -0
  145. package/dist/services/mcp/mcp-oauth-store.js.map +1 -0
  146. package/dist/services/mcp/mcp-status.d.ts +41 -0
  147. package/dist/services/mcp/mcp-status.d.ts.map +1 -0
  148. package/dist/services/mcp/mcp-status.js +69 -0
  149. package/dist/services/mcp/mcp-status.js.map +1 -0
  150. package/dist/services/mcp/mcp-stdio-launcher.d.ts +26 -0
  151. package/dist/services/mcp/mcp-stdio-launcher.d.ts.map +1 -0
  152. package/dist/services/mcp/mcp-stdio-launcher.js +8 -0
  153. package/dist/services/mcp/mcp-stdio-launcher.js.map +1 -0
  154. package/dist/services/mcp/mcp-tool-source.d.ts +77 -0
  155. package/dist/services/mcp/mcp-tool-source.d.ts.map +1 -0
  156. package/dist/services/mcp/mcp-tool-source.js +10 -0
  157. package/dist/services/mcp/mcp-tool-source.js.map +1 -0
  158. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts +25 -0
  159. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts.map +1 -0
  160. package/dist/services/mcp/test-fixtures/fake-authorization-server.js +147 -0
  161. package/dist/services/mcp/test-fixtures/fake-authorization-server.js.map +1 -0
  162. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts +29 -0
  163. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts.map +1 -0
  164. package/dist/services/mcp/test-fixtures/protected-mcp-server.js +87 -0
  165. package/dist/services/mcp/test-fixtures/protected-mcp-server.js.map +1 -0
  166. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts +19 -0
  167. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts.map +1 -0
  168. package/dist/services/mcp/turn-stable-mcp-tool-source.js +37 -0
  169. package/dist/services/mcp/turn-stable-mcp-tool-source.js.map +1 -0
  170. package/dist/services/models/decision-model-listing.d.ts +26 -0
  171. package/dist/services/models/decision-model-listing.d.ts.map +1 -0
  172. package/dist/services/models/decision-model-listing.js +61 -0
  173. package/dist/services/models/decision-model-listing.js.map +1 -0
  174. package/dist/services/profiles/registry.d.ts +1 -1
  175. package/dist/services/profiles/registry.d.ts.map +1 -1
  176. package/dist/services/profiles/registry.js +2 -1
  177. package/dist/services/profiles/registry.js.map +1 -1
  178. package/dist/services/settings/settings-schema.d.ts +4 -0
  179. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  180. package/dist/services/settings/settings-schema.js +8 -0
  181. package/dist/services/settings/settings-schema.js.map +1 -1
  182. package/dist/services/settings/settings-sources.d.ts +2 -0
  183. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  184. package/dist/services/settings/settings-sources.js +2 -0
  185. package/dist/services/settings/settings-sources.js.map +1 -1
  186. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -1
  187. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  188. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +1 -0
  189. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  190. package/dist/services/shell/shell-interaction-session.d.ts +2 -0
  191. package/dist/services/shell/shell-interaction-session.d.ts.map +1 -1
  192. package/dist/services/shell/shell-interaction-session.js +11 -2
  193. package/dist/services/shell/shell-interaction-session.js.map +1 -1
  194. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  195. package/dist/tools/system/run-code/mcp-script-surface.d.ts +28 -0
  196. package/dist/tools/system/run-code/mcp-script-surface.d.ts.map +1 -0
  197. package/dist/tools/system/run-code/mcp-script-surface.js +165 -0
  198. package/dist/tools/system/run-code/mcp-script-surface.js.map +1 -0
  199. package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
  200. package/dist/tools/system/run-code/run-code-runtime.js +13 -1
  201. package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
  202. package/dist/tools/system/run-code/run-code.d.ts +3 -0
  203. package/dist/tools/system/run-code/run-code.d.ts.map +1 -1
  204. package/dist/tools/system/run-code/run-code.js +32 -4
  205. package/dist/tools/system/run-code/run-code.js.map +1 -1
  206. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  207. package/dist/utils/conversation/conversation-utils.d.ts +1 -5
  208. package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
  209. package/dist/utils/conversation/conversation-utils.js +4 -1
  210. package/dist/utils/conversation/conversation-utils.js.map +1 -1
  211. package/dist/utils/value-suggestions.d.ts +14 -0
  212. package/dist/utils/value-suggestions.d.ts.map +1 -1
  213. package/dist/utils/value-suggestions.js +31 -0
  214. package/dist/utils/value-suggestions.js.map +1 -1
  215. package/package.json +3 -1
@@ -1,26 +1,22 @@
1
1
  import crypto from 'node:crypto';
2
- import http from 'node:http';
3
- import readline from 'node:readline';
4
- import { spawn } from 'node:child_process';
2
+ import { awaitLoopbackCallback, bindLoopbackRedirect, closeLoopbackServer, openInBrowser, } from '../lib/oauth-loopback.js';
3
+ /**
4
+ * The browser half of an OAuth 2.0 + PKCE login for a public native client.
5
+ *
6
+ * Both providers term2 logs in to (Grok and Codex) borrow the official CLI's
7
+ * registered client id, so the redirect URI is *their* registered value and is
8
+ * not negotiable — see docs/plans/provider-oauth-independence.md. The only
9
+ * thing that differs between them is endpoints, scopes, and how the token
10
+ * endpoint wants its request body encoded, so all of that is configuration and
11
+ * the flow itself lives here once.
12
+ *
13
+ * The loopback listener and callback handling live in `source/lib/oauth-loopback.ts`
14
+ * so MCP OAuth (whose redirect port is chosen at runtime) can reuse them.
15
+ */
16
+ export { openInBrowser };
5
17
  function base64url(buf) {
6
18
  return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
7
19
  }
8
- export function openInBrowser(url) {
9
- const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
10
- const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
11
- try {
12
- const child = spawn(command, args, { stdio: 'ignore', detached: true });
13
- child.on('error', () => {
14
- // Ignored: opening a browser in a headless/server/minimal environment or when
15
- // the browser launcher is missing (e.g. xdg-open ENOENT) is non-fatal.
16
- // The caller always prints the URL, so the user can complete login manually.
17
- });
18
- child.unref();
19
- }
20
- catch {
21
- // The caller always prints the URL, so a failed launcher is not fatal.
22
- }
23
- }
24
20
  function buildAuthorizeUrl(config, redirectUri, challenge, state) {
25
21
  const url = new URL(config.authorizeEndpoint);
26
22
  url.searchParams.set('client_id', config.clientId);
@@ -35,195 +31,10 @@ function buildAuthorizeUrl(config, redirectUri, challenge, state) {
35
31
  }
36
32
  return url;
37
33
  }
38
- /**
39
- * Binds the first registered loopback port that is free.
40
- *
41
- * We may only try ports the official client registered, so an exhausted list is
42
- * a real failure with a real cause: another login is almost certainly holding
43
- * the port.
44
- */
45
- function bindLoopbackListener(config) {
46
- return new Promise((resolve, reject) => {
47
- const attempt = (index) => {
48
- const port = config.redirectPorts[index];
49
- const server = http.createServer();
50
- const onError = (err) => {
51
- server.close();
52
- if (err.code !== 'EADDRINUSE') {
53
- reject(err);
54
- return;
55
- }
56
- if (index + 1 < config.redirectPorts.length) {
57
- attempt(index + 1);
58
- return;
59
- }
60
- reject(new Error(`${config.label} login could not bind any of its registered redirect ports (${config.redirectPorts.join(', ')}). The authorization server only accepts those exact redirects, so close whatever holds them${config.portConflictHint ? ` (${config.portConflictHint})` : ''} and retry.`));
61
- };
62
- server.once('error', onError);
63
- server.listen(port, '127.0.0.1', () => {
64
- server.off('error', onError);
65
- // Port 0 asks the OS for an ephemeral port; the redirect must name the real one.
66
- resolve({ server, port: server.address().port });
67
- });
68
- };
69
- attempt(0);
70
- });
71
- }
72
- function stripWrappingQuotes(value) {
73
- const trimmed = value.trim();
74
- if ((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
75
- return trimmed.slice(1, -1).trim();
76
- }
77
- return trimmed;
78
- }
79
- function isLoopbackHostname(hostname) {
80
- const host = hostname.replace(/^\[|\]$/g, '').toLowerCase();
81
- return host === 'localhost' || host === '127.0.0.1' || host === '::1';
82
- }
83
34
  function exampleCallbackUrl(config) {
84
35
  const port = config.redirectPorts[0];
85
36
  return `http://localhost:${port === 0 ? '<port>' : port}${config.callbackPath}?code=...`;
86
37
  }
87
- function interpretCallbackParams(config, expectedState, error, code, state) {
88
- if (error)
89
- return new Error(`${config.label} login was rejected: ${error}`);
90
- if (state !== expectedState) {
91
- // A mismatched state means this callback did not come from the
92
- // authorization request we started; the code may be an attacker's.
93
- return new Error(`${config.label} login failed: OAuth state mismatch`);
94
- }
95
- if (!code)
96
- return new Error(`${config.label} login failed: no authorization code in callback`);
97
- return code;
98
- }
99
- /** Characters an authorization code may contain, raw or percent-encoded. */
100
- const BARE_CODE_PATTERN = /^[A-Za-z0-9._~+/=%-]+$/;
101
- /**
102
- * Accepts the callback's query string (`code=...&state=...`) or the bare code.
103
- *
104
- * A bare code carries no state to check. That is acceptable here because the
105
- * user copied it from their own browser into this terminal; the state check
106
- * guards the loopback listener against codes injected by other pages.
107
- */
108
- function interpretPastedCodeOrQuery(raw, config, expectedState) {
109
- const notUsable = {
110
- kind: 'ignore',
111
- message: `Paste the authorization code or the redirected localhost URL (${exampleCallbackUrl(config)}).`,
112
- };
113
- if (/(^|[?&])(code|error)=/.test(raw)) {
114
- const params = new URLSearchParams(raw.replace(/^[?#]/, ''));
115
- const result = interpretCallbackParams(config, expectedState, params.get('error'), params.get('code'), params.get('state'));
116
- return result instanceof Error ? { kind: 'fail', error: result } : { kind: 'code', code: result };
117
- }
118
- if (!BARE_CODE_PATTERN.test(raw))
119
- return notUsable;
120
- try {
121
- return { kind: 'code', code: decodeURIComponent(raw) };
122
- }
123
- catch {
124
- return notUsable;
125
- }
126
- }
127
- function interpretPastedOAuthRedirect(line, config, expectedState) {
128
- const raw = stripWrappingQuotes(line);
129
- if (!raw)
130
- return { kind: 'ignore', message: '' };
131
- let url;
132
- try {
133
- url = new URL(raw);
134
- }
135
- catch {
136
- return interpretPastedCodeOrQuery(raw, config, expectedState);
137
- }
138
- if (!isLoopbackHostname(url.hostname) || url.pathname !== config.callbackPath) {
139
- return {
140
- kind: 'ignore',
141
- message: `Paste the redirected localhost URL from the address bar (${exampleCallbackUrl(config)}).`,
142
- };
143
- }
144
- const result = interpretCallbackParams(config, expectedState, url.searchParams.get('error'), url.searchParams.get('code'), url.searchParams.get('state'));
145
- return result instanceof Error ? { kind: 'fail', error: result } : { kind: 'code', code: result };
146
- }
147
- function awaitCallback(config, server, redirectUri, expectedState, options = {}) {
148
- return new Promise((resolve, reject) => {
149
- let settled = false;
150
- let paste;
151
- const cleanup = () => {
152
- options.signal?.removeEventListener('abort', onAbort);
153
- server.off('error', onError);
154
- paste?.close();
155
- };
156
- const doResolve = (value) => {
157
- cleanup();
158
- resolve(value);
159
- };
160
- const doReject = (err) => {
161
- cleanup();
162
- reject(err);
163
- };
164
- if (options.signal?.aborted) {
165
- doReject(new Error(`${config.label} login cancelled`));
166
- return;
167
- }
168
- const onAbort = () => {
169
- settled = true;
170
- server.close();
171
- server.closeAllConnections?.();
172
- doReject(new Error(`${config.label} login cancelled`));
173
- };
174
- options.signal?.addEventListener('abort', onAbort, { once: true });
175
- // The callback is single-use. A retried or duplicated request after the
176
- // socket has been torn down must not run the handler a second time.
177
- server.on('request', (req, res) => {
178
- if (settled) {
179
- res.destroy();
180
- return;
181
- }
182
- const requestUrl = new URL(req.url || '/', redirectUri);
183
- if (requestUrl.pathname !== config.callbackPath) {
184
- res.writeHead(404).end();
185
- return;
186
- }
187
- settled = true;
188
- const result = interpretCallbackParams(config, expectedState, requestUrl.searchParams.get('error'), requestUrl.searchParams.get('code'), requestUrl.searchParams.get('state'));
189
- const failure = result instanceof Error ? result : null;
190
- res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8', Connection: 'close' });
191
- res.end(failure ? `${failure.message}\nYou can close this tab.` : 'Login complete. You can close this tab.');
192
- // Free the callback port immediately: a keep-alive browser socket would
193
- // otherwise hold it and make the next login attempt fail.
194
- server.close();
195
- server.closeAllConnections?.();
196
- if (failure)
197
- doReject(failure);
198
- else
199
- doResolve(result);
200
- });
201
- if (options.pasteInput) {
202
- paste = readline.createInterface({ input: options.pasteInput, crlfDelay: Infinity });
203
- paste.on('line', (line) => {
204
- if (settled)
205
- return;
206
- const interpreted = interpretPastedOAuthRedirect(line, config, expectedState);
207
- if (interpreted.kind === 'ignore') {
208
- if (interpreted.message)
209
- options.onPasteRejected?.(interpreted.message);
210
- return;
211
- }
212
- settled = true;
213
- server.close();
214
- server.closeAllConnections?.();
215
- if (interpreted.kind === 'fail')
216
- doReject(interpreted.error);
217
- else
218
- doResolve(interpreted.code);
219
- });
220
- }
221
- const onError = (err) => {
222
- doReject(err);
223
- };
224
- server.on('error', onError);
225
- });
226
- }
227
38
  /**
228
39
  * Runs the full browser login and returns the token endpoint's raw response
229
40
  * body. Mapping that body into a provider's stored credential shape, and
@@ -240,10 +51,20 @@ export async function runPkceLoopbackLogin(config, options = {}) {
240
51
  const state = base64url(crypto.randomBytes(16));
241
52
  // Bind before building the URL: the redirect_uri we send must name the port
242
53
  // we actually got, or the authorization server will refuse the callback.
243
- const { server, port } = await bindLoopbackListener(config);
54
+ const { server, port } = await bindLoopbackRedirect({
55
+ ports: config.redirectPorts,
56
+ label: config.label,
57
+ portConflictHint: config.portConflictHint,
58
+ });
244
59
  const redirectUri = config.redirectUriFor(port);
60
+ const flowConfig = {
61
+ label: config.label,
62
+ callbackPath: config.callbackPath,
63
+ redirectUri,
64
+ exampleCallbackUrl: exampleCallbackUrl(config),
65
+ };
245
66
  const authUrl = buildAuthorizeUrl(config, redirectUri, challenge, state).toString();
246
- const callback = awaitCallback(config, server, redirectUri, state, {
67
+ const callback = awaitLoopbackCallback(server, flowConfig, state, {
247
68
  signal: options.signal,
248
69
  pasteInput: options.pasteInput,
249
70
  onPasteRejected: options.onPasteRejected,
@@ -255,8 +76,7 @@ export async function runPkceLoopbackLogin(config, options = {}) {
255
76
  code = await callback;
256
77
  }
257
78
  catch (error) {
258
- server.close();
259
- server.closeAllConnections?.();
79
+ closeLoopbackServer(server);
260
80
  throw error;
261
81
  }
262
82
  const params = {
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-pkce.js","sourceRoot":"","sources":["../../source/providers/oauth-pkce.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauth-pkce.js","sourceRoot":"","sources":["../../source/providers/oauth-pkce.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GAEd,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AA4CzB,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAuB,EAAE,WAAmB,EAAE,SAAiB,EAAE,KAAa;IACvG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAuB;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,oBAAoB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,WAAW,CAAC;AAC3F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAuB,EAAE,OAAO,GAAqB,EAAE;IAChG,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,aAAa,CAAC;IAEzD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhD,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,oBAAoB,CAAC;QAClD,KAAK,EAAE,MAAM,CAAC,aAAa;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,UAAU,GAAuB;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,WAAW;QACX,kBAAkB,EAAE,kBAAkB,CAAC,MAAM,CAAC;KAC/C,CAAC;IACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEpF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QAChE,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC,CAAC;IAEH,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG;QACb,UAAU,EAAE,oBAAoB;QAChC,IAAI;QACJ,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,QAAQ;QACvB,SAAS,EAAE,MAAM,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,KAAK,MAAM,CAAC;IACvD,2EAA2E;IAC3E,0EAA0E;IAC1E,sDAAsD;IACtD,2FAA2F;IAC3F,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAC7B,CAAC,CAAC,SAAS;QACX,CAAC,CAAE,WAAmB,CAAC,OAAO;YAC9B,CAAC,CAAE,WAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM;QAChC,CAAC,CAAC,aAAa,IAAK,WAAmB,CAAC,GAAG;YACzC,CAAC,CAAE,WAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAC3D,CAAC,CAAC,OAAO,CAAC,MAAM;QAClB,CAAC,CAAC,aAAa,CAAC;IAClB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE;QACrD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mCAAmC,EAAE;QAC/F,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;QAC/E,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,CAAC,KAAK,sCACb,QAAQ,CAAC,MACX,qFACE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,qBACjE,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,uDAAuD,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type DecisionQuestion = {
2
+ type: 'choice';
3
+ instructions: string;
4
+ criteria: Record<string, string>;
5
+ };
6
+ export declare function requestOpenRouterDecisions({ model, state, questions, apiKey, baseUrl, fetchImpl, timeoutMs, }: {
7
+ model: string;
8
+ state: unknown;
9
+ questions: Record<string, DecisionQuestion>;
10
+ apiKey: string;
11
+ baseUrl?: string;
12
+ fetchImpl?: typeof fetch;
13
+ timeoutMs?: number;
14
+ }): Promise<unknown>;
15
+ //# sourceMappingURL=openrouter-decisions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-decisions.d.ts","sourceRoot":"","sources":["../../source/providers/openrouter-decisions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,wBAAsB,0BAA0B,CAAC,EAC/C,KAAK,EACL,KAAK,EACL,SAAS,EACT,MAAM,EACN,OAAwC,EACxC,SAAiB,EACjB,SAAkB,GACnB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBnB"}
@@ -0,0 +1,25 @@
1
+ export async function requestOpenRouterDecisions({ model, state, questions, apiKey, baseUrl = 'https://openrouter.ai/api/v1', fetchImpl = fetch, timeoutMs = 10_000, }) {
2
+ if (!apiKey)
3
+ throw new Error('OpenRouter Decisions requires an API key');
4
+ const endpoint = new URL(baseUrl);
5
+ const basePath = endpoint.pathname.replace(/\/+$/, '');
6
+ endpoint.pathname = `${basePath.replace(/\/api\/v1$/, '')}/api/alpha/decisions`;
7
+ const url = endpoint.toString();
8
+ const controller = new AbortController();
9
+ const deadline = setTimeout(() => controller.abort(new Error('OpenRouter Decisions shadow deadline exceeded')), timeoutMs);
10
+ try {
11
+ const response = await fetchImpl(url, {
12
+ method: 'POST',
13
+ headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
14
+ body: JSON.stringify({ model, state, questions }),
15
+ signal: controller.signal,
16
+ });
17
+ if (!response.ok)
18
+ throw new Error(`OpenRouter Decisions returned HTTP ${response.status}`);
19
+ return await response.json();
20
+ }
21
+ finally {
22
+ clearTimeout(deadline);
23
+ }
24
+ }
25
+ //# sourceMappingURL=openrouter-decisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-decisions.js","sourceRoot":"","sources":["../../source/providers/openrouter-decisions.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,KAAK,EACL,KAAK,EACL,SAAS,EACT,MAAM,EACN,OAAO,GAAG,8BAA8B,EACxC,SAAS,GAAG,KAAK,EACjB,SAAS,GAAG,MAAM,GASnB;IACC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,sBAAsB,CAAC;IAChF,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,UAAU,CACzB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,EAClF,SAAS,CACV,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAClF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACjD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type DecisionShadowResult = {
2
+ riskLevel: 'low' | 'medium' | 'high';
3
+ authorization: 'explicit' | 'implied' | 'weak' | 'unknown';
4
+ confidence: number;
5
+ wouldApprove: boolean;
6
+ };
7
+ export declare function evaluateDecisionShadow({ model, evidence, requestCount, apiKey, baseUrl, fetchImpl, }: {
8
+ model: string;
9
+ evidence: string;
10
+ requestCount: number;
11
+ apiKey: string;
12
+ baseUrl?: string;
13
+ fetchImpl?: typeof fetch;
14
+ }): Promise<DecisionShadowResult[]>;
15
+ //# sourceMappingURL=decision-shadow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-shadow.d.ts","sourceRoot":"","sources":["../../../source/services/approval/decision-shadow.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,aAAa,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAuCF,wBAAsB,sBAAsB,CAAC,EAC3C,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA+ClC"}
@@ -0,0 +1,77 @@
1
+ import { requestOpenRouterDecisions } from '../../providers/openrouter-decisions.js';
2
+ import { SHELL_AUTO_APPROVAL_INSTRUCTIONS } from '../../prompts/shell-auto-approval.js';
3
+ const RISK_CRITERIA = {
4
+ low: 'Read-only or easily reversible workspace work',
5
+ medium: 'Bounded workspace mutation or local process change',
6
+ high: 'Destructive, external, credential-related, network, or hard-to-verify effect',
7
+ };
8
+ const AUTHORIZATION_CRITERIA = {
9
+ explicit: 'The user directly requested this action or effect',
10
+ implied: 'The action is clearly necessary for the requested task',
11
+ weak: 'The connection to the requested task is tenuous',
12
+ unknown: 'The available context does not establish user intent',
13
+ };
14
+ function readChoice(answers, key, allowed) {
15
+ const answer = answers[key];
16
+ if (!answer || typeof answer !== 'object')
17
+ throw new Error(`Missing decision answer ${key}`);
18
+ const record = answer;
19
+ if (record.type !== 'choice' || !allowed.includes(record.choice)) {
20
+ throw new Error(`Invalid decision answer ${key}`);
21
+ }
22
+ if (typeof record.confidence !== 'number' ||
23
+ !Number.isFinite(record.confidence) ||
24
+ record.confidence < 0 ||
25
+ record.confidence > 1) {
26
+ throw new Error(`Invalid decision confidence ${key}`);
27
+ }
28
+ return { choice: record.choice, confidence: record.confidence };
29
+ }
30
+ export async function evaluateDecisionShadow({ model, evidence, requestCount, apiKey, baseUrl, fetchImpl, }) {
31
+ const questions = {};
32
+ for (let index = 0; index < requestCount; index++) {
33
+ const requestNumber = index + 1;
34
+ questions[`risk_${index}`] = {
35
+ type: 'choice',
36
+ instructions: `Classify the risk of approval request ${requestNumber} in the evidence using the policy.`,
37
+ criteria: RISK_CRITERIA,
38
+ };
39
+ questions[`authorization_${index}`] = {
40
+ type: 'choice',
41
+ instructions: `Classify user authorization for approval request ${requestNumber} in the evidence using the policy.`,
42
+ criteria: AUTHORIZATION_CRITERIA,
43
+ };
44
+ }
45
+ const response = await requestOpenRouterDecisions({
46
+ model,
47
+ state: { policy: SHELL_AUTO_APPROVAL_INSTRUCTIONS, evidence },
48
+ questions,
49
+ apiKey,
50
+ ...(baseUrl ? { baseUrl } : {}),
51
+ ...(fetchImpl ? { fetchImpl } : {}),
52
+ });
53
+ if (!response || typeof response !== 'object' || !('answers' in response)) {
54
+ throw new Error('OpenRouter Decisions response has no answers');
55
+ }
56
+ const answers = response.answers;
57
+ if (!answers || typeof answers !== 'object' || Array.isArray(answers)) {
58
+ throw new Error('OpenRouter Decisions response has invalid answers');
59
+ }
60
+ const answerMap = answers;
61
+ return Array.from({ length: requestCount }, (_, index) => {
62
+ const risk = readChoice(answerMap, `risk_${index}`, ['low', 'medium', 'high']);
63
+ const authorization = readChoice(answerMap, `authorization_${index}`, [
64
+ 'explicit',
65
+ 'implied',
66
+ 'weak',
67
+ 'unknown',
68
+ ]);
69
+ return {
70
+ riskLevel: risk.choice,
71
+ authorization: authorization.choice,
72
+ confidence: Math.min(risk.confidence, authorization.confidence),
73
+ wouldApprove: risk.choice !== 'high' && (authorization.choice === 'explicit' || authorization.choice === 'implied'),
74
+ };
75
+ });
76
+ }
77
+ //# sourceMappingURL=decision-shadow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-shadow.js","sourceRoot":"","sources":["../../../source/services/approval/decision-shadow.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { ApprovalDescriptor } from '../../contracts/conversation.js';
2
2
  import type { ConversationAgentClient } from '../conversation-agent-client.js';
3
3
  import type { ILoggingService, ISettingsService, ISessionContextService } from '../service-interfaces.js';
4
+ import type { evaluateDecisionShadow } from './decision-shadow.js';
4
5
  export declare const NON_INTERACTIVE_REJECTION_REASON = "Non-interactive mode: use --auto-approve to allow tool execution";
5
6
  export type NonInteractiveApprovalDecision = {
6
7
  answer: 'y';
@@ -15,6 +16,10 @@ export interface NonInteractiveApprovalPolicyDeps {
15
16
  agentClient?: ConversationAgentClient;
16
17
  logger?: ILoggingService;
17
18
  sessionContextService: ISessionContextService;
19
+ mcpAllowlist?: readonly string[];
20
+ isMcpTool?: (name: string) => boolean;
21
+ isMcpAllowed?: (name: string, allowlist: readonly string[]) => boolean;
22
+ decisionShadow?: typeof evaluateDecisionShadow;
18
23
  }
19
24
  /**
20
25
  * Decides whether a tool approval paused in a non-interactive session can be
@@ -1 +1 @@
1
- {"version":3,"file":"non-interactive-approval-policy.d.ts","sourceRoot":"","sources":["../../../source/services/approval/non-interactive-approval-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAM1G,eAAO,MAAM,gCAAgC,qEAAqE,CAAC;AAEnH,MAAM,MAAM,8BAA8B,GACtC;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,GACf;IACE,MAAM,EAAE,GAAG,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEN,MAAM,WAAW,gCAAgC;IAC/C,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,qBAAqB,EAAE,sBAAsB,CAAC;CAC/C;AAaD;;;;GAIG;AACH,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,gCAAgC,EAAI;IAEjE,MAAM,CAAC,KAAK,EAAE;QAClB,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,EAAE,kBAAkB,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC;KAC9B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAiE1C;CACF"}
1
+ {"version":3,"file":"non-interactive-approval-policy.d.ts","sourceRoot":"","sources":["../../../source/services/approval/non-interactive-approval-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAK1G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,eAAO,MAAM,gCAAgC,qEAAqE,CAAC;AAEnH,MAAM,MAAM,8BAA8B,GACtC;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,GACf;IACE,MAAM,EAAE,GAAG,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEN,MAAM,WAAW,gCAAgC;IAC/C,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,qBAAqB,EAAE,sBAAsB,CAAC;IAC9C,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC;IACvE,cAAc,CAAC,EAAE,OAAO,sBAAsB,CAAC;CAChD;AAaD;;;;GAIG;AACH,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,gCAAgC,EAAI;IAEjE,MAAM,CAAC,KAAK,EAAE;QAClB,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,EAAE,kBAAkB,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC;KAC9B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CA+E1C;CACF"}
@@ -28,6 +28,18 @@ export class NonInteractiveApprovalPolicy {
28
28
  return { answer: 'n', rejectionReason: NON_INTERACTIVE_REJECTION_REASON, reportRejection: false };
29
29
  }
30
30
  const { approval } = input;
31
+ if (this.deps.isMcpTool?.(approval.toolName) === true) {
32
+ const allowed = this.deps.mcpAllowlist ?? [];
33
+ const member = approval.toolName;
34
+ const matches = this.deps.isMcpAllowed?.(member, allowed) ?? false;
35
+ return matches
36
+ ? { answer: 'y' }
37
+ : {
38
+ answer: 'n',
39
+ rejectionReason: NON_INTERACTIVE_REJECTION_REASON,
40
+ reportRejection: false,
41
+ };
42
+ }
31
43
  if (approval.toolName !== 'shell' && approval.toolName !== 'bash') {
32
44
  return { answer: 'y' };
33
45
  }
@@ -63,6 +75,8 @@ export class NonInteractiveApprovalPolicy {
63
75
  agentClient: this.deps.agentClient,
64
76
  logger: this.deps.logger ?? noOpLogger,
65
77
  sessionContextService: this.deps.sessionContextService,
78
+ awaitDecisionShadow: true,
79
+ decisionShadow: this.deps.decisionShadow,
66
80
  });
67
81
  const advisory = advisories.get(callId);
68
82
  if (advisory?.approved) {
@@ -1 +1 @@
1
- {"version":3,"file":"non-interactive-approval-policy.js","sourceRoot":"","sources":["../../../source/services/approval/non-interactive-approval-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"non-interactive-approval-policy.js","sourceRoot":"","sources":["../../../source/services/approval/non-interactive-approval-policy.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import type { ILoggingService, ISettingsService, ISessionContextService } from '
4
4
  import { SHELL_AUTO_APPROVAL_PROMPT_VERSION } from '../../prompts/shell-auto-approval.js';
5
5
  import type { ShellAutoApprovalAgentClient } from '../conversation-agent-client.js';
6
6
  import type { SessionAccessState } from '../session/session-access-state.js';
7
+ import { evaluateDecisionShadow } from './decision-shadow.js';
7
8
  export type ShellAutoApprovalCommand = {
8
9
  id: string;
9
10
  command?: string;
@@ -20,7 +21,7 @@ export type ShellAutoApprovalManualDecision = {
20
21
  };
21
22
  export type ShellAutoApprovalAdvisory = LLMAdvisory;
22
23
  export { SHELL_AUTO_APPROVAL_PROMPT_VERSION };
23
- export declare function evaluateShellAutoApprovalAdvisories({ commands, history, manualDecisions, settingsService, agentClient, logger, sessionContextService, sessionAccess, throwOnError, retryOptions, }: {
24
+ export declare function evaluateShellAutoApprovalAdvisories({ commands, history, manualDecisions, settingsService, agentClient, logger, sessionContextService, sessionAccess, throwOnError, retryOptions, decisionShadow, awaitDecisionShadow, }: {
24
25
  commands: ShellAutoApprovalCommand[];
25
26
  history: ProviderInputItem[];
26
27
  /** Recent manual approve/reject decisions this session, offered as precedent. */
@@ -35,5 +36,8 @@ export declare function evaluateShellAutoApprovalAdvisories({ commands, history,
35
36
  sleep?: (ms: number) => Promise<void>;
36
37
  random?: () => number;
37
38
  };
39
+ decisionShadow?: typeof evaluateDecisionShadow;
40
+ /** Non-interactive callers wait for comparison telemetry before process exit. */
41
+ awaitDecisionShadow?: boolean;
38
42
  }): Promise<Map<string, ShellAutoApprovalAdvisory>>;
39
43
  //# sourceMappingURL=shell-auto-approval-evaluator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-auto-approval-evaluator.d.ts","sourceRoot":"","sources":["../../../source/services/approval/shell-auto-approval-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAEL,kCAAkC,EACnC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAK7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,WAAW,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,CAAC;AAqX9C,wBAAsB,mCAAmC,CAAC,EACxD,QAAQ,EACR,OAAO,EACP,eAAe,EACf,eAAe,EACf,WAAW,EACX,MAAM,EACN,qBAAqB,EACrB,aAAa,EACb,YAAoB,EACpB,YAAY,GACb,EAAE;IACD,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,iFAAiF;IACjF,eAAe,CAAC,EAAE,+BAA+B,EAAE,CAAC;IACpD,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,4BAA4B,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;IACxB,qBAAqB,EAAE,sBAAsB,CAAC;IAC9C,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;KACvB,CAAC;CACH,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAmPlD"}
1
+ {"version":3,"file":"shell-auto-approval-evaluator.d.ts","sourceRoot":"","sources":["../../../source/services/approval/shell-auto-approval-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAEL,kCAAkC,EACnC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E,OAAO,EAAE,sBAAsB,EAA6B,MAAM,sBAAsB,CAAC;AAEzF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,WAAW,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,CAAC;AAuX9C,wBAAsB,mCAAmC,CAAC,EACxD,QAAQ,EACR,OAAO,EACP,eAAe,EACf,eAAe,EACf,WAAW,EACX,MAAM,EACN,qBAAqB,EACrB,aAAa,EACb,YAAoB,EACpB,YAAY,EACZ,cAAuC,EACvC,mBAA2B,GAC5B,EAAE;IACD,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,iFAAiF;IACjF,eAAe,CAAC,EAAE,+BAA+B,EAAE,CAAC;IACpD,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,4BAA4B,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;IACxB,qBAAqB,EAAE,sBAAsB,CAAC;IAC9C,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;KACvB,CAAC;IACF,cAAc,CAAC,EAAE,OAAO,sBAAsB,CAAC;IAC/C,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CA2TlD"}