@trenchwork/erosolar 1.1.62 → 1.1.63

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 (70) hide show
  1. package/dist/capabilities/todoCapability.js +2 -2
  2. package/dist/capabilities/todoCapability.js.map +1 -1
  3. package/dist/config.js +1 -1
  4. package/dist/contracts/v1/agent.d.ts +12 -2
  5. package/dist/contracts/v1/agent.d.ts.map +1 -1
  6. package/dist/core/adversarialCorrection.d.ts +22 -0
  7. package/dist/core/adversarialCorrection.d.ts.map +1 -0
  8. package/dist/core/adversarialCorrection.js +25 -0
  9. package/dist/core/adversarialCorrection.js.map +1 -0
  10. package/dist/core/agent.d.ts +2 -0
  11. package/dist/core/agent.d.ts.map +1 -1
  12. package/dist/core/agent.js +11 -1
  13. package/dist/core/agent.js.map +1 -1
  14. package/dist/core/failureRegistry.d.ts +30 -0
  15. package/dist/core/failureRegistry.d.ts.map +1 -0
  16. package/dist/core/failureRegistry.js +74 -0
  17. package/dist/core/failureRegistry.js.map +1 -0
  18. package/dist/core/hostedAuth.d.ts +55 -0
  19. package/dist/core/hostedAuth.d.ts.map +1 -0
  20. package/dist/core/hostedAuth.js +134 -0
  21. package/dist/core/hostedAuth.js.map +1 -0
  22. package/dist/core/secretStore.d.ts +11 -0
  23. package/dist/core/secretStore.d.ts.map +1 -1
  24. package/dist/core/secretStore.js +25 -0
  25. package/dist/core/secretStore.js.map +1 -1
  26. package/dist/core/slashCommands.d.ts.map +1 -1
  27. package/dist/core/slashCommands.js +1 -0
  28. package/dist/core/slashCommands.js.map +1 -1
  29. package/dist/core/thinkingVerbs.d.ts +31 -0
  30. package/dist/core/thinkingVerbs.d.ts.map +1 -0
  31. package/dist/core/thinkingVerbs.js +58 -0
  32. package/dist/core/thinkingVerbs.js.map +1 -0
  33. package/dist/core/turnGovernor.d.ts +63 -0
  34. package/dist/core/turnGovernor.d.ts.map +1 -0
  35. package/dist/core/turnGovernor.js +94 -0
  36. package/dist/core/turnGovernor.js.map +1 -0
  37. package/dist/headless/interactiveShell.d.ts +4 -0
  38. package/dist/headless/interactiveShell.d.ts.map +1 -1
  39. package/dist/headless/interactiveShell.js +168 -38
  40. package/dist/headless/interactiveShell.js.map +1 -1
  41. package/dist/plugins/tools/todo/todoPlugin.js +1 -1
  42. package/dist/plugins/tools/todo/todoPlugin.js.map +1 -1
  43. package/dist/runtime/agentController.d.ts.map +1 -1
  44. package/dist/runtime/agentController.js +7 -0
  45. package/dist/runtime/agentController.js.map +1 -1
  46. package/dist/shell/toolPresentation.d.ts +7 -0
  47. package/dist/shell/toolPresentation.d.ts.map +1 -1
  48. package/dist/shell/toolPresentation.js +51 -1
  49. package/dist/shell/toolPresentation.js.map +1 -1
  50. package/dist/tools/memoryTools.d.ts +7 -0
  51. package/dist/tools/memoryTools.d.ts.map +1 -1
  52. package/dist/tools/memoryTools.js +17 -0
  53. package/dist/tools/memoryTools.js.map +1 -1
  54. package/dist/tools/todoTools.d.ts +3 -4
  55. package/dist/tools/todoTools.d.ts.map +1 -1
  56. package/dist/tools/todoTools.js +23 -4
  57. package/dist/tools/todoTools.js.map +1 -1
  58. package/dist/ui/ink/InkPromptController.d.ts +2 -0
  59. package/dist/ui/ink/InkPromptController.d.ts.map +1 -1
  60. package/dist/ui/ink/InkPromptController.js +4 -0
  61. package/dist/ui/ink/InkPromptController.js.map +1 -1
  62. package/dist/ui/ink/Prompt.d.ts +2 -0
  63. package/dist/ui/ink/Prompt.d.ts.map +1 -1
  64. package/dist/ui/ink/Prompt.js +8 -1
  65. package/dist/ui/ink/Prompt.js.map +1 -1
  66. package/dist/ui/ink/StatusLine.d.ts +6 -0
  67. package/dist/ui/ink/StatusLine.d.ts.map +1 -1
  68. package/dist/ui/ink/StatusLine.js +17 -3
  69. package/dist/ui/ink/StatusLine.js.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Hosted-key access — the CLIENT side of "optional sign-in unlocks hosted keys,
3
+ * or bring your own." Keys NEVER ship in this client (Project Glasswing); they
4
+ * live only in the ero.solar AWS backend, exactly like the Tavily search proxy
5
+ * already does (see src/tools/webTools.ts). Sign-in mints a short-lived token;
6
+ * the proxies validate it and use the operator keys.
7
+ *
8
+ * ── CONTRACT (the ero.solar backend implements this; this file codes against it) ──
9
+ * Sign-in (loopback OAuth, increment 2):
10
+ * open https://ero.solar/cli/login?port=<loopbackPort>&state=<csrf>
11
+ * → Google SSO → 302 http://127.0.0.1:<port>/cb?token=<jwt>&email=<e>&state=<csrf>
12
+ * DeepSeek (hosted): POST {HOSTED_DEEPSEEK_PROXY} header `Authorization: Bearer <token>`
13
+ * Tavily (hosted): the existing tavilySearch proxy, same Bearer token
14
+ * The token is short-lived and server-validated; if it 401s the CLI drops to
15
+ * "signed out" and asks the user to /login again or use their own key.
16
+ *
17
+ * THIS MODULE is state + resolution only (increment 1, fully testable). The live
18
+ * sign-in flow and the provider→proxy wiring are increment 2 (backend-gated).
19
+ */
20
+ export declare const HOSTED_LOGIN_URL = "https://ero.solar/cli/login";
21
+ export declare const HOSTED_DEEPSEEK_PROXY = "https://ero.solar/api/deepseek";
22
+ export interface HostedSession {
23
+ token: string;
24
+ email: string;
25
+ }
26
+ export type KeyMode = 'hosted' | 'own' | 'none';
27
+ export interface KeyModeStatus {
28
+ mode: KeyMode;
29
+ email: string | null;
30
+ signedIn: boolean;
31
+ ownDeepSeek: boolean;
32
+ ownTavily: boolean;
33
+ preferOwnKeys: boolean;
34
+ }
35
+ /** The active hosted session (token + email), or null when signed out. */
36
+ export declare function getHostedSession(): HostedSession | null;
37
+ /** Persist a hosted session (called by /login once the backend returns a token). */
38
+ export declare function setHostedSession(session: HostedSession): void;
39
+ /** Sign out: drop the token but keep the own/hosted preference. */
40
+ export declare function clearHostedSession(): void;
41
+ export declare function prefersOwnKeys(): boolean;
42
+ export declare function setPreferOwnKeys(value: boolean): void;
43
+ /**
44
+ * Resolve which keys are in effect. Preference order: an explicit "use my own
45
+ * keys" wins when the user actually has a DeepSeek key; otherwise a hosted
46
+ * session is used; otherwise the user's own key; otherwise nothing is set up.
47
+ */
48
+ export declare function resolveKeyMode(): KeyModeStatus;
49
+ /**
50
+ * The dim welcome/banner line that makes the active key source unmistakable —
51
+ * the user must be able to see at a glance whether they're on hosted keys or
52
+ * their own. Returns null in 'none' mode (the welcome already shows key setup).
53
+ */
54
+ export declare function keyModeLine(status?: KeyModeStatus): string | null;
55
+ //# sourceMappingURL=hostedAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostedAuth.d.ts","sourceRoot":"","sources":["../../src/core/hostedAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,eAAO,MAAM,gBAAgB,gCAAgC,CAAC;AAC9D,eAAO,MAAM,qBAAqB,mCAAmC,CAAC;AAWtE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AASD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AA+BD,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAGvD;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAG7D;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAErD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,aAAa,CAa9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,GAAE,aAAgC,GAAG,MAAM,GAAG,IAAI,CAanF"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Hosted-key access — the CLIENT side of "optional sign-in unlocks hosted keys,
3
+ * or bring your own." Keys NEVER ship in this client (Project Glasswing); they
4
+ * live only in the ero.solar AWS backend, exactly like the Tavily search proxy
5
+ * already does (see src/tools/webTools.ts). Sign-in mints a short-lived token;
6
+ * the proxies validate it and use the operator keys.
7
+ *
8
+ * ── CONTRACT (the ero.solar backend implements this; this file codes against it) ──
9
+ * Sign-in (loopback OAuth, increment 2):
10
+ * open https://ero.solar/cli/login?port=<loopbackPort>&state=<csrf>
11
+ * → Google SSO → 302 http://127.0.0.1:<port>/cb?token=<jwt>&email=<e>&state=<csrf>
12
+ * DeepSeek (hosted): POST {HOSTED_DEEPSEEK_PROXY} header `Authorization: Bearer <token>`
13
+ * Tavily (hosted): the existing tavilySearch proxy, same Bearer token
14
+ * The token is short-lived and server-validated; if it 401s the CLI drops to
15
+ * "signed out" and asks the user to /login again or use their own key.
16
+ *
17
+ * THIS MODULE is state + resolution only (increment 1, fully testable). The live
18
+ * sign-in flow and the provider→proxy wiring are increment 2 (backend-gated).
19
+ */
20
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, rmSync } from 'node:fs';
21
+ import { homedir } from 'node:os';
22
+ import { join, resolve } from 'node:path';
23
+ import { getSecretValue } from './secretStore.js';
24
+ // Contract endpoints (the backend the user is building must match these).
25
+ export const HOSTED_LOGIN_URL = 'https://ero.solar/cli/login';
26
+ export const HOSTED_DEEPSEEK_PROXY = 'https://ero.solar/api/deepseek';
27
+ // Resolved per call (not captured at module load) so EROSOLAR_HOME changes —
28
+ // and tests pointing at a temp dir — take effect.
29
+ function homeDir() {
30
+ return process.env['EROSOLAR_HOME'] ? resolve(process.env['EROSOLAR_HOME']) : join(homedir(), '.erosolar');
31
+ }
32
+ function sessionFile() {
33
+ return join(homeDir(), 'session.json');
34
+ }
35
+ function readFile() {
36
+ // Read the on-disk session first (the future /login writes it; it also holds
37
+ // the own/hosted preference), then let env override the token+email — env
38
+ // lets tests/CI inject a session without touching disk, while still honouring
39
+ // a stored preference.
40
+ let data = {};
41
+ const file = sessionFile();
42
+ if (existsSync(file)) {
43
+ try {
44
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
45
+ if (parsed && typeof parsed === 'object')
46
+ data = parsed;
47
+ }
48
+ catch { /* corrupt → treat as empty */ }
49
+ }
50
+ const envToken = process.env['EROSOLAR_HOSTED_TOKEN']?.trim();
51
+ if (envToken) {
52
+ data.token = envToken;
53
+ data.email = process.env['EROSOLAR_HOSTED_EMAIL']?.trim() || 'you@hosted';
54
+ }
55
+ return data;
56
+ }
57
+ function writeFile(data) {
58
+ const file = sessionFile();
59
+ mkdirSync(homeDir(), { recursive: true, mode: 0o700 });
60
+ const tmp = `${file}.${process.pid}.tmp`;
61
+ writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
62
+ renameSync(tmp, file);
63
+ }
64
+ /** The active hosted session (token + email), or null when signed out. */
65
+ export function getHostedSession() {
66
+ const f = readFile();
67
+ return f.token ? { token: f.token, email: f.email || 'you@hosted' } : null;
68
+ }
69
+ /** Persist a hosted session (called by /login once the backend returns a token). */
70
+ export function setHostedSession(session) {
71
+ const f = readFile();
72
+ writeFile({ ...f, token: session.token, email: session.email });
73
+ }
74
+ /** Sign out: drop the token but keep the own/hosted preference. */
75
+ export function clearHostedSession() {
76
+ const f = readFile();
77
+ delete f.token;
78
+ delete f.email;
79
+ if (Object.keys(f).length === 0) {
80
+ try {
81
+ rmSync(sessionFile(), { force: true });
82
+ }
83
+ catch { /* ignore */ }
84
+ return;
85
+ }
86
+ writeFile(f);
87
+ }
88
+ export function prefersOwnKeys() {
89
+ return readFile().preferOwnKeys === true;
90
+ }
91
+ export function setPreferOwnKeys(value) {
92
+ writeFile({ ...readFile(), preferOwnKeys: value });
93
+ }
94
+ /**
95
+ * Resolve which keys are in effect. Preference order: an explicit "use my own
96
+ * keys" wins when the user actually has a DeepSeek key; otherwise a hosted
97
+ * session is used; otherwise the user's own key; otherwise nothing is set up.
98
+ */
99
+ export function resolveKeyMode() {
100
+ const session = getHostedSession();
101
+ const ownDeepSeek = Boolean(getSecretValue('DEEPSEEK_API_KEY'));
102
+ const ownTavily = Boolean(getSecretValue('TAVILY_API_KEY'));
103
+ const preferOwnKeys = prefersOwnKeys();
104
+ let mode;
105
+ if (preferOwnKeys && ownDeepSeek)
106
+ mode = 'own';
107
+ else if (session)
108
+ mode = 'hosted';
109
+ else if (ownDeepSeek)
110
+ mode = 'own';
111
+ else
112
+ mode = 'none';
113
+ return { mode, email: session?.email ?? null, signedIn: Boolean(session), ownDeepSeek, ownTavily, preferOwnKeys };
114
+ }
115
+ /**
116
+ * The dim welcome/banner line that makes the active key source unmistakable —
117
+ * the user must be able to see at a glance whether they're on hosted keys or
118
+ * their own. Returns null in 'none' mode (the welcome already shows key setup).
119
+ */
120
+ export function keyModeLine(status = resolveKeyMode()) {
121
+ switch (status.mode) {
122
+ case 'hosted':
123
+ return `Signed in as ${status.email} · using hosted keys` +
124
+ (status.ownDeepSeek ? ' · /account to use your own' : '');
125
+ case 'own': {
126
+ const tav = status.ownTavily ? 'Tavily ✓' : 'Tavily (shared proxy)';
127
+ const base = `Using your own keys · DeepSeek ✓ · ${tav}`;
128
+ return status.signedIn ? `${base} · /account to use hosted` : base;
129
+ }
130
+ default:
131
+ return null;
132
+ }
133
+ }
134
+ //# sourceMappingURL=hostedAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostedAuth.js","sourceRoot":"","sources":["../../src/core/hostedAuth.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,17 @@ export declare function getSecretValue(id: SecretName): string | null;
24
24
  */
25
25
  export declare function loadAllSecrets(): void;
26
26
  export declare function setSecretValue(id: SecretName, rawValue: string): void;
27
+ /**
28
+ * Route a raw `/key` argument to the secret it sets, by prefix or explicit
29
+ * provider word. DeepSeek keys are `sk-…`, Tavily keys are `tvly-…`, so a bare
30
+ * key self-identifies; `/key tavily <k>` / `/key deepseek <k>` force it. Bare
31
+ * keys with no known prefix default to DeepSeek (back-compat — that was the
32
+ * only key `/key` ever set). Returns null for an empty/blank argument.
33
+ */
34
+ export declare function classifyKeyEntry(raw: string): {
35
+ id: SecretName;
36
+ value: string;
37
+ } | null;
27
38
  export declare function maskSecret(value: string): string;
28
39
  export declare function ensureSecretForProvider(provider: ProviderId): string;
29
40
  export declare function getSecretDefinitionForProvider(provider: ProviderId): SecretDefinition | null;
@@ -1 +1 @@
1
- {"version":3,"file":"secretStore.d.ts","sourceRoot":"","sources":["../../src/core/secretStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AA2BD,qBAAa,kBAAmB,SAAQ,KAAK;aACf,MAAM,EAAE,gBAAgB;gBAAxB,MAAM,EAAE,gBAAgB;CAIrD;AAED,wBAAgB,qBAAqB,IAAI,gBAAgB,EAAE,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAE3E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAkB5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAYrC;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAUrE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAQpE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAE5F;AAmED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA4B5D;AAoCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQvD"}
1
+ {"version":3,"file":"secretStore.d.ts","sourceRoot":"","sources":["../../src/core/secretStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AA2BD,qBAAa,kBAAmB,SAAQ,KAAK;aACf,MAAM,EAAE,gBAAgB;gBAAxB,MAAM,EAAE,gBAAgB;CAIrD;AAED,wBAAgB,qBAAqB,IAAI,gBAAgB,EAAE,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAE3E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAkB5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAYrC;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAUrE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAetF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAQpE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAE5F;AAmED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA4B5D;AAoCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQlD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQvD"}
@@ -82,6 +82,31 @@ export function setSecretValue(id, rawValue) {
82
82
  writeSecretStore(store);
83
83
  process.env[id] = value;
84
84
  }
85
+ /**
86
+ * Route a raw `/key` argument to the secret it sets, by prefix or explicit
87
+ * provider word. DeepSeek keys are `sk-…`, Tavily keys are `tvly-…`, so a bare
88
+ * key self-identifies; `/key tavily <k>` / `/key deepseek <k>` force it. Bare
89
+ * keys with no known prefix default to DeepSeek (back-compat — that was the
90
+ * only key `/key` ever set). Returns null for an empty/blank argument.
91
+ */
92
+ export function classifyKeyEntry(raw) {
93
+ const trimmed = (raw || '').trim();
94
+ if (!trimmed)
95
+ return null;
96
+ const parts = trimmed.split(/\s+/);
97
+ const lead = (parts[0] || '').toLowerCase();
98
+ if (lead === 'tavily' || lead === 'tvly' || lead === 'search') {
99
+ const value = parts.slice(1).join(' ').trim();
100
+ return value ? { id: 'TAVILY_API_KEY', value } : null;
101
+ }
102
+ if (lead === 'deepseek' || lead === 'ds') {
103
+ const value = parts.slice(1).join(' ').trim();
104
+ return value ? { id: 'DEEPSEEK_API_KEY', value } : null;
105
+ }
106
+ if (/^tvly-/i.test(trimmed))
107
+ return { id: 'TAVILY_API_KEY', value: trimmed };
108
+ return { id: 'DEEPSEEK_API_KEY', value: trimmed };
109
+ }
85
110
  export function maskSecret(value) {
86
111
  if (!value) {
87
112
  return '';
@@ -1 +1 @@
1
- {"version":3,"file":"secretStore.js","sourceRoot":"","sources":["../../src/core/secretStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secretStore.js","sourceRoot":"","sources":["../../src/core/secretStore.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slashCommands.d.ts","sourceRoot":"","sources":["../../src/core/slashCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAYjD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9E;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE,CAa7E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAIpH"}
1
+ {"version":3,"file":"slashCommands.d.ts","sourceRoot":"","sources":["../../src/core/slashCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAajD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9E;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE,CAa7E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAIpH"}
@@ -13,6 +13,7 @@
13
13
  */
14
14
  export const SLASH_COMMANDS = [
15
15
  { command: '/key', description: 'Set your DeepSeek API key' },
16
+ { command: '/account', description: 'Show / switch key source (hosted vs your own)' },
16
17
  { command: '/clear', description: 'Clear the screen and conversation' },
17
18
  { command: '/resume', description: 'Restore a saved conversation' },
18
19
  { command: '/context', description: 'Show context-window usage' },
@@ -1 +1 @@
1
- {"version":3,"file":"slashCommands.js","sourceRoot":"","sources":["../../src/core/slashCommands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slashCommands.js","sourceRoot":"","sources":["../../src/core/slashCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Rotating "thinking" gerunds for the working spinner — Claude Code parity
3
+ * (see src/ui/CLAUDE_CODE_UX.md §4: "a rotating gerund ('Thinking',
4
+ * 'Synthesizing', 'Forging', 'Puzzling', 'Conjuring', 'Noodling')"). When the
5
+ * agent is working without a specific tool activity, the host parks the
6
+ * canonical generic label on the spinner and the renderer swaps it for a
7
+ * whimsical gerund that rotates over time, instead of a static "Thinking…".
8
+ *
9
+ * Pure module: no side effects, no imports. The renderer rotates by calling
10
+ * pickThinkingVerb(); tests seed the rng for determinism.
11
+ */
12
+ export declare const THINKING_VERBS: readonly string[];
13
+ /**
14
+ * Canonical generic-thinking label. The host sets this (or one of the legacy
15
+ * "Thinking…" / "Thinking..." variants) on the spinner when the agent is busy
16
+ * without a named tool activity; the renderer treats it as a sentinel and shows
17
+ * a rotating gerund instead. Never displayed verbatim while spinning.
18
+ */
19
+ export declare const GENERIC_THINKING_LABEL = "Thinking";
20
+ /** True when `message` is a generic-thinking sentinel (any historical spelling). */
21
+ export declare function isGenericThinking(message: string | null | undefined): boolean;
22
+ /**
23
+ * Pick a thinking gerund. Pass `exclude` (the current verb) so a rotation
24
+ * always lands on a different word; pass `rng` to make the choice deterministic
25
+ * in tests.
26
+ */
27
+ export declare function pickThinkingVerb(opts?: {
28
+ rng?: () => number;
29
+ exclude?: string;
30
+ }): string;
31
+ //# sourceMappingURL=thinkingVerbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinkingVerbs.d.ts","sourceRoot":"","sources":["../../src/core/thinkingVerbs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAqB1C,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,aAAa,CAAC;AAIjD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAM5F"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Rotating "thinking" gerunds for the working spinner — Claude Code parity
3
+ * (see src/ui/CLAUDE_CODE_UX.md §4: "a rotating gerund ('Thinking',
4
+ * 'Synthesizing', 'Forging', 'Puzzling', 'Conjuring', 'Noodling')"). When the
5
+ * agent is working without a specific tool activity, the host parks the
6
+ * canonical generic label on the spinner and the renderer swaps it for a
7
+ * whimsical gerund that rotates over time, instead of a static "Thinking…".
8
+ *
9
+ * Pure module: no side effects, no imports. The renderer rotates by calling
10
+ * pickThinkingVerb(); tests seed the rng for determinism.
11
+ */
12
+ export const THINKING_VERBS = Object.freeze([
13
+ 'Thinking',
14
+ 'Synthesizing',
15
+ 'Forging',
16
+ 'Puzzling',
17
+ 'Conjuring',
18
+ 'Noodling',
19
+ 'Pondering',
20
+ 'Brewing',
21
+ 'Cooking',
22
+ 'Churning',
23
+ 'Crafting',
24
+ 'Computing',
25
+ 'Cerebrating',
26
+ 'Simmering',
27
+ 'Percolating',
28
+ 'Ruminating',
29
+ 'Wrangling',
30
+ 'Tinkering',
31
+ 'Marinating',
32
+ 'Spelunking',
33
+ ]);
34
+ /**
35
+ * Canonical generic-thinking label. The host sets this (or one of the legacy
36
+ * "Thinking…" / "Thinking..." variants) on the spinner when the agent is busy
37
+ * without a named tool activity; the renderer treats it as a sentinel and shows
38
+ * a rotating gerund instead. Never displayed verbatim while spinning.
39
+ */
40
+ export const GENERIC_THINKING_LABEL = 'Thinking';
41
+ const GENERIC_VARIANTS = new Set(['Thinking', 'Thinking…', 'Thinking...']);
42
+ /** True when `message` is a generic-thinking sentinel (any historical spelling). */
43
+ export function isGenericThinking(message) {
44
+ return message != null && GENERIC_VARIANTS.has(message.trim());
45
+ }
46
+ /**
47
+ * Pick a thinking gerund. Pass `exclude` (the current verb) so a rotation
48
+ * always lands on a different word; pass `rng` to make the choice deterministic
49
+ * in tests.
50
+ */
51
+ export function pickThinkingVerb(opts = {}) {
52
+ const rng = opts.rng ?? Math.random;
53
+ const pool = opts.exclude ? THINKING_VERBS.filter((v) => v !== opts.exclude) : THINKING_VERBS;
54
+ const list = pool.length ? pool : THINKING_VERBS;
55
+ const idx = Math.abs(Math.floor(rng() * list.length)) % list.length;
56
+ return list[idx];
57
+ }
58
+ //# sourceMappingURL=thinkingVerbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinkingVerbs.js","sourceRoot":"","sources":["../../src/core/thinkingVerbs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC7D,UAAU;IACV,cAAc;IACd,SAAS;IACT,UAAU;IACV,WAAW;IACX,UAAU;IACV,WAAW;IACX,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,WAAW;IACX,aAAa;IACb,WAAW;IACX,aAAa;IACb,YAAY;IACZ,WAAW;IACX,WAAW;IACX,YAAY;IACZ,YAAY;CACb,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEjD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AAE3E,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,OAAkC;IAClE,OAAO,OAAO,IAAI,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAiD,EAAE;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACpE,OAAO,IAAI,CAAC,GAAG,CAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Turn governor — a bounded, stall-aware spine for the auto-continue loop.
3
+ *
4
+ * The auto-continue loop (interactiveShell processPrompt → processPrompt
5
+ * recursion) was UNBOUNDED: an agent that couldn't satisfy the completion
6
+ * heuristic ran forever, re-trying dead ends with no escalation. This caps the
7
+ * turns per user request and detects a stall (the same observable work
8
+ * repeating with no new progress), so the loop yields to the user WITH state
9
+ * instead of thrashing for hours. It also derives the next continuation from
10
+ * the agent's live TODO plan (which the loop previously ignored).
11
+ *
12
+ * Pure + dependency-free so it's unit-testable; the shell instantiates one per
13
+ * user request, resets on a fresh prompt, calls recordTurn() each auto-continue,
14
+ * and breaks on check().stop.
15
+ */
16
+ export interface TurnMetrics {
17
+ /** tools invoked during the turn */
18
+ toolsUsed: string[];
19
+ /** files written/edited during the turn */
20
+ filesModified: string[];
21
+ /** failing test/build signal in the turn output, or null */
22
+ failingSignal: string | null;
23
+ }
24
+ export interface GovernorVerdict {
25
+ stop: boolean;
26
+ reason: 'limit' | 'stall' | null;
27
+ turn: number;
28
+ }
29
+ /** Stable signature of a turn's observable work — the same signature repeating means no progress. */
30
+ export declare function fingerprintTurn(m: TurnMetrics): string;
31
+ export declare class TurnGovernor {
32
+ private turn;
33
+ private fps;
34
+ private readonly max;
35
+ private readonly stallWindow;
36
+ constructor(opts?: {
37
+ maxAutoTurns?: number;
38
+ stallWindow?: number;
39
+ });
40
+ /** A new user request starts a fresh turn budget. */
41
+ reset(): void;
42
+ /** Record one completed auto-continue turn. */
43
+ recordTurn(m: TurnMetrics): void;
44
+ /** Whether the auto-continue loop should stop now, and why. */
45
+ check(): GovernorVerdict;
46
+ get turnCount(): number;
47
+ get maxTurns(): number;
48
+ }
49
+ export interface TodoLike {
50
+ content?: string;
51
+ status?: string;
52
+ activeForm?: string;
53
+ }
54
+ /** Todos still to do (pending or in-progress). */
55
+ export declare function pendingTodos(todos: ReadonlyArray<TodoLike> | null | undefined): TodoLike[];
56
+ /**
57
+ * The next auto-continue prompt derived from the plan — the in-progress item
58
+ * (or first pending). Prefixed IMPORTANT: so the loop treats it as an
59
+ * auto-continue (not a fresh user request) and the no-docs guard holds.
60
+ * Returns null when the plan has no pending work.
61
+ */
62
+ export declare function nextTodoPrompt(todos: ReadonlyArray<TodoLike> | null | undefined): string | null;
63
+ //# sourceMappingURL=turnGovernor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnGovernor.d.ts","sourceRoot":"","sources":["../../src/core/turnGovernor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qGAAqG;AACrG,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAItD;AASD,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAKtE,qDAAqD;IACrD,KAAK,IAAI,IAAI;IAKb,+CAA+C;IAC/C,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAMhC,+DAA+D;IAC/D,KAAK,IAAI,eAAe;IAiBxB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;CACF;AAKD,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,CAE1F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO/F"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Turn governor — a bounded, stall-aware spine for the auto-continue loop.
3
+ *
4
+ * The auto-continue loop (interactiveShell processPrompt → processPrompt
5
+ * recursion) was UNBOUNDED: an agent that couldn't satisfy the completion
6
+ * heuristic ran forever, re-trying dead ends with no escalation. This caps the
7
+ * turns per user request and detects a stall (the same observable work
8
+ * repeating with no new progress), so the loop yields to the user WITH state
9
+ * instead of thrashing for hours. It also derives the next continuation from
10
+ * the agent's live TODO plan (which the loop previously ignored).
11
+ *
12
+ * Pure + dependency-free so it's unit-testable; the shell instantiates one per
13
+ * user request, resets on a fresh prompt, calls recordTurn() each auto-continue,
14
+ * and breaks on check().stop.
15
+ */
16
+ const DEFAULT_MAX_AUTO_TURNS = 25;
17
+ const STALL_WINDOW = 3;
18
+ /** Stable signature of a turn's observable work — the same signature repeating means no progress. */
19
+ export function fingerprintTurn(m) {
20
+ const tools = [...(m.toolsUsed ?? [])].map((t) => t.toLowerCase()).sort().join(',');
21
+ const files = [...(m.filesModified ?? [])].sort().join(',');
22
+ return `${tools}|${files}|${m.failingSignal ?? ''}`;
23
+ }
24
+ function maxFromEnv() {
25
+ const raw = process.env['EROSOLAR_MAX_AUTO_TURNS'];
26
+ if (!raw)
27
+ return null;
28
+ const n = parseInt(raw, 10);
29
+ return Number.isFinite(n) && n > 0 ? n : null;
30
+ }
31
+ export class TurnGovernor {
32
+ turn = 0;
33
+ fps = [];
34
+ max;
35
+ stallWindow;
36
+ constructor(opts = {}) {
37
+ this.max = opts.maxAutoTurns ?? maxFromEnv() ?? DEFAULT_MAX_AUTO_TURNS;
38
+ this.stallWindow = Math.max(2, opts.stallWindow ?? STALL_WINDOW);
39
+ }
40
+ /** A new user request starts a fresh turn budget. */
41
+ reset() {
42
+ this.turn = 0;
43
+ this.fps = [];
44
+ }
45
+ /** Record one completed auto-continue turn. */
46
+ recordTurn(m) {
47
+ this.turn += 1;
48
+ this.fps.push(fingerprintTurn(m));
49
+ if (this.fps.length > this.stallWindow)
50
+ this.fps.shift();
51
+ }
52
+ /** Whether the auto-continue loop should stop now, and why. */
53
+ check() {
54
+ if (this.turn >= this.max) {
55
+ return { stop: true, reason: 'limit', turn: this.turn };
56
+ }
57
+ // Stall: the last `stallWindow` turns did the exact same observable work
58
+ // (same tools, files, failing signal) — the agent is repeating itself with
59
+ // no new progress (including doing nothing at all), so stop rather than
60
+ // burn turns up to the limit.
61
+ if (this.fps.length >= this.stallWindow &&
62
+ this.fps.every((f) => f === this.fps[0])) {
63
+ return { stop: true, reason: 'stall', turn: this.turn };
64
+ }
65
+ return { stop: false, reason: null, turn: this.turn };
66
+ }
67
+ get turnCount() {
68
+ return this.turn;
69
+ }
70
+ get maxTurns() {
71
+ return this.max;
72
+ }
73
+ }
74
+ /** Todos still to do (pending or in-progress). */
75
+ export function pendingTodos(todos) {
76
+ return (todos ?? []).filter((t) => t && (t.status === 'pending' || t.status === 'in_progress'));
77
+ }
78
+ /**
79
+ * The next auto-continue prompt derived from the plan — the in-progress item
80
+ * (or first pending). Prefixed IMPORTANT: so the loop treats it as an
81
+ * auto-continue (not a fresh user request) and the no-docs guard holds.
82
+ * Returns null when the plan has no pending work.
83
+ */
84
+ export function nextTodoPrompt(todos) {
85
+ const p = pendingTodos(todos);
86
+ if (!p.length)
87
+ return null;
88
+ const next = p.find((t) => t.status === 'in_progress') ?? p[0];
89
+ const content = (next?.content ?? '').trim();
90
+ if (!content)
91
+ return null;
92
+ return `IMPORTANT: Do NOT create docs/markdown/summaries. Continue the plan — the next task is: ${content}. Complete it, then update the todo list (mark it completed and the next one in_progress).`;
93
+ }
94
+ //# sourceMappingURL=turnGovernor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnGovernor.js","sourceRoot":"","sources":["../../src/core/turnGovernor.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,10 @@ export interface WelcomeLineInput {
22
22
  provider: string;
23
23
  updateLines?: string[];
24
24
  cwd?: string;
25
+ /** Active key source — makes hosted-vs-own unmistakable. Defaults from hasApiKey. */
26
+ keyMode?: 'hosted' | 'own' | 'none';
27
+ /** Dim status line for the active key source (hosted/own). */
28
+ keyModeLine?: string | null;
25
29
  }
26
30
  /**
27
31
  * Compose the lines shown when the interactive shell opens. Deliberately NOT a
@@ -1 +1 @@
1
- {"version":3,"file":"interactiveShell.d.ts","sourceRoot":"","sources":["../../src/headless/interactiveShell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6JH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA0CD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAErE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDzF"}
1
+ {"version":3,"file":"interactiveShell.d.ts","sourceRoot":"","sources":["../../src/headless/interactiveShell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmKH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACpC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAErE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDzF"}