cli-jaw 2.2.9 → 2.2.10

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 (214) hide show
  1. package/README.md +4 -4
  2. package/dist/bin/commands/doctor.js +66 -1
  3. package/dist/bin/commands/doctor.js.map +1 -1
  4. package/dist/bin/commands/init.js +107 -8
  5. package/dist/bin/commands/init.js.map +1 -1
  6. package/dist/lib/upload.js +5 -1
  7. package/dist/lib/upload.js.map +1 -1
  8. package/dist/server.js +1 -0
  9. package/dist/server.js.map +1 -1
  10. package/dist/src/agent/alert-escalation.js +1 -1
  11. package/dist/src/agent/alert-escalation.js.map +1 -1
  12. package/dist/src/agent/codex-app-catalog.js +57 -0
  13. package/dist/src/agent/codex-app-catalog.js.map +1 -0
  14. package/dist/src/agent/codex-app-client.js +89 -7
  15. package/dist/src/agent/codex-app-client.js.map +1 -1
  16. package/dist/src/agent/pi-rpc-verdict.js +22 -0
  17. package/dist/src/agent/pi-rpc-verdict.js.map +1 -0
  18. package/dist/src/agent/pi-runtime.js +240 -0
  19. package/dist/src/agent/pi-runtime.js.map +1 -1
  20. package/dist/src/agent/runtime-pool.js +445 -0
  21. package/dist/src/agent/runtime-pool.js.map +1 -0
  22. package/dist/src/agent/spawn.js +395 -240
  23. package/dist/src/agent/spawn.js.map +1 -1
  24. package/dist/src/cli/command-context.js +5 -2
  25. package/dist/src/cli/command-context.js.map +1 -1
  26. package/dist/src/cli/commands.js +43 -39
  27. package/dist/src/cli/commands.js.map +1 -1
  28. package/dist/src/cli/handlers-runtime.js +15 -7
  29. package/dist/src/cli/handlers-runtime.js.map +1 -1
  30. package/dist/src/cli/handlers-search.js +1 -1
  31. package/dist/src/cli/handlers-search.js.map +1 -1
  32. package/dist/src/cli/handlers-skill-invoke.js +1 -1
  33. package/dist/src/cli/handlers-skill-invoke.js.map +1 -1
  34. package/dist/src/cli/handlers-workflows.js +1 -1
  35. package/dist/src/cli/handlers-workflows.js.map +1 -1
  36. package/dist/src/cli/handlers.js +1 -1
  37. package/dist/src/cli/handlers.js.map +1 -1
  38. package/dist/src/cli/opencodex-models.js +40 -7
  39. package/dist/src/cli/opencodex-models.js.map +1 -1
  40. package/dist/src/cli/registry-live.js +6 -5
  41. package/dist/src/cli/registry-live.js.map +1 -1
  42. package/dist/src/command-contract/catalog.js +4 -0
  43. package/dist/src/command-contract/catalog.js.map +1 -1
  44. package/dist/src/core/config.js +69 -4
  45. package/dist/src/core/config.js.map +1 -1
  46. package/dist/src/core/runtime-settings.js +17 -0
  47. package/dist/src/core/runtime-settings.js.map +1 -1
  48. package/dist/src/core/settings-merge.js +1 -1
  49. package/dist/src/core/settings-merge.js.map +1 -1
  50. package/dist/src/discord/bot.js +29 -14
  51. package/dist/src/discord/bot.js.map +1 -1
  52. package/dist/src/discord/commands.js +5 -4
  53. package/dist/src/discord/commands.js.map +1 -1
  54. package/dist/src/discord/discord-file.js +8 -2
  55. package/dist/src/discord/discord-file.js.map +1 -1
  56. package/dist/src/discord/forwarder.js +17 -19
  57. package/dist/src/discord/forwarder.js.map +1 -1
  58. package/dist/src/discord/send-only-client.js +9 -1
  59. package/dist/src/discord/send-only-client.js.map +1 -1
  60. package/dist/src/manager/dashboard-service.js +38 -1
  61. package/dist/src/manager/dashboard-service.js.map +1 -1
  62. package/dist/src/manager/telegram-hub/hub-bot.js +47 -29
  63. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
  64. package/dist/src/messaging/channel-health.js +32 -0
  65. package/dist/src/messaging/channel-health.js.map +1 -1
  66. package/dist/src/messaging/chunk.js +376 -0
  67. package/dist/src/messaging/chunk.js.map +1 -0
  68. package/dist/src/messaging/dedupe.js +104 -0
  69. package/dist/src/messaging/dedupe.js.map +1 -0
  70. package/dist/src/messaging/fold.js +210 -0
  71. package/dist/src/messaging/fold.js.map +1 -0
  72. package/dist/src/messaging/redact.js +577 -0
  73. package/dist/src/messaging/redact.js.map +1 -0
  74. package/dist/src/messaging/retry.js +76 -0
  75. package/dist/src/messaging/retry.js.map +1 -0
  76. package/dist/src/messaging/runtime.js +6 -3
  77. package/dist/src/messaging/runtime.js.map +1 -1
  78. package/dist/src/messaging/send.js +45 -15
  79. package/dist/src/messaging/send.js.map +1 -1
  80. package/dist/src/messaging/slack-target.js +50 -0
  81. package/dist/src/messaging/slack-target.js.map +1 -0
  82. package/dist/src/messaging/types.js.map +1 -1
  83. package/dist/src/orchestrator/pipeline.js +4 -4
  84. package/dist/src/orchestrator/pipeline.js.map +1 -1
  85. package/dist/src/routes/command.js +11 -7
  86. package/dist/src/routes/command.js.map +1 -1
  87. package/dist/src/routes/messaging.js +28 -12
  88. package/dist/src/routes/messaging.js.map +1 -1
  89. package/dist/src/routes/settings.js +22 -6
  90. package/dist/src/routes/settings.js.map +1 -1
  91. package/dist/src/slack/api.js +116 -0
  92. package/dist/src/slack/api.js.map +1 -0
  93. package/dist/src/slack/bot.js +262 -0
  94. package/dist/src/slack/bot.js.map +1 -0
  95. package/dist/src/slack/commands.js +98 -0
  96. package/dist/src/slack/commands.js.map +1 -0
  97. package/dist/src/slack/events.js +116 -0
  98. package/dist/src/slack/events.js.map +1 -0
  99. package/dist/src/slack/format.js +58 -0
  100. package/dist/src/slack/format.js.map +1 -0
  101. package/dist/src/slack/forwarder.js +57 -0
  102. package/dist/src/slack/forwarder.js.map +1 -0
  103. package/dist/src/slack/register.js +13 -0
  104. package/dist/src/slack/register.js.map +1 -0
  105. package/dist/src/slack/send-handler.js +41 -0
  106. package/dist/src/slack/send-handler.js.map +1 -0
  107. package/dist/src/slack/send-only-client.js +46 -0
  108. package/dist/src/slack/send-only-client.js.map +1 -0
  109. package/dist/src/slack/slack-file.js +72 -0
  110. package/dist/src/slack/slack-file.js.map +1 -0
  111. package/dist/src/slack/socket.js +341 -0
  112. package/dist/src/slack/socket.js.map +1 -0
  113. package/dist/src/telegram/bot.js +117 -37
  114. package/dist/src/telegram/bot.js.map +1 -1
  115. package/dist/src/telegram/elicitation-buttons.js +7 -2
  116. package/dist/src/telegram/elicitation-buttons.js.map +1 -1
  117. package/dist/src/telegram/forwarder.js +15 -7
  118. package/dist/src/telegram/forwarder.js.map +1 -1
  119. package/dist/src/telegram/rich-message.js +209 -24
  120. package/dist/src/telegram/rich-message.js.map +1 -1
  121. package/dist/src/telegram/telegram-file.js +35 -4
  122. package/dist/src/telegram/telegram-file.js.map +1 -1
  123. package/dist/src/telegram/voice.js +4 -3
  124. package/dist/src/telegram/voice.js.map +1 -1
  125. package/package.json +5 -1
  126. package/public/assets/providers/slack.svg +1 -0
  127. package/public/dist/assets/ChannelsDiscord-D9FLnZso.js +1 -0
  128. package/public/dist/assets/ChannelsSlack-ybvupgdK.js +1 -0
  129. package/public/dist/assets/ChannelsTelegram-BOCOPrBc.js +1 -0
  130. package/public/dist/assets/HealthBadge-megTlF4n.js +1 -0
  131. package/public/dist/assets/TransportStatusChips-CjEySMis.js +1 -0
  132. package/public/dist/assets/app-BGIAy4he.js +55 -0
  133. package/public/dist/assets/{bgtask-badge-CdBqBy1L.js → bgtask-badge-DXca8E7c.js} +1 -1
  134. package/public/dist/assets/bgtask-badge-GRSiNILQ.js +1 -0
  135. package/public/dist/assets/{employees-C8qufeJl.js → employees-BL4qMxJj.js} +1 -1
  136. package/public/dist/assets/iframe-renderer-BUSk0Rw9.js +1 -0
  137. package/public/dist/assets/{iframe-renderer-CZ67aeTO.js → iframe-renderer-DUI0LYBy.js} +2 -2
  138. package/public/dist/assets/{manager-CLXT60M5.js → manager-B-gpf-3j.js} +3 -3
  139. package/public/dist/assets/{memory-lWramLVw.js → memory-B_Y0L0KD.js} +1 -1
  140. package/public/dist/assets/memory-CX6YahTc.js +1 -0
  141. package/public/dist/assets/message-history-Det7u76S.js +1 -0
  142. package/public/dist/assets/{message-history-2NUN3UxM.js → message-history-Dl8dJzez.js} +1 -1
  143. package/public/dist/assets/{provider-icons-stsNmQKx.js → provider-icons-VDfahiUp.js} +3 -2
  144. package/public/dist/assets/{render-CsF-ojLe.js → render-BI1aqKoc.js} +1 -1
  145. package/public/dist/assets/{settings-BMLowRCh.js → settings-B0Sj4sUH.js} +1 -1
  146. package/public/dist/assets/settings-C7NutP6X.js +1 -0
  147. package/public/dist/assets/settings-core-CyX-px6_.js +100 -0
  148. package/public/dist/assets/settings-core-DVpFmrhY.js +1 -0
  149. package/public/dist/assets/{sidebar-gKjYLv49.js → sidebar-DOR9fTgN.js} +3 -3
  150. package/public/dist/assets/skills-BWhKreQ2.js +1 -0
  151. package/public/dist/assets/{skills-CKTbomdm.js → skills-wt0fkV9Y.js} +1 -1
  152. package/public/dist/assets/slash-commands-BZbqTg3v.js +20 -0
  153. package/public/dist/assets/slash-commands-Di4NDA4w.js +1 -0
  154. package/public/dist/assets/{trace-drawer-C3G4mmB1.js → trace-drawer-kMYzaVFW.js} +1 -1
  155. package/public/dist/assets/ui-BghexWrB.js +1 -0
  156. package/public/dist/assets/{ui-CVVC_flX.js → ui-D4D5HUfo.js} +1 -1
  157. package/public/dist/index.html +62 -1
  158. package/public/dist/manager/index.html +1 -1
  159. package/public/index.html +61 -0
  160. package/public/js/features/command-info.ts +1 -0
  161. package/public/js/features/help-content.ts +8 -0
  162. package/public/js/features/settings-channel.ts +5 -1
  163. package/public/js/features/settings-core.ts +2 -0
  164. package/public/js/features/settings-slack.ts +74 -0
  165. package/public/js/features/settings-types.ts +5 -1
  166. package/public/js/features/settings.ts +1 -0
  167. package/public/js/features/transport-status-row.ts +15 -3
  168. package/public/js/main.ts +19 -0
  169. package/public/js/provider-icons.ts +4 -1
  170. package/public/js/ws.ts +1 -1
  171. package/public/locales/en.json +21 -0
  172. package/public/locales/ja.json +21 -0
  173. package/public/locales/ko.json +21 -0
  174. package/public/locales/zh.json +21 -0
  175. package/public/manager/src/settings/SettingsShell.tsx +1 -0
  176. package/public/manager/src/settings/SettingsSidebar.tsx +1 -0
  177. package/public/manager/src/settings/pages/ChannelsSlack.tsx +323 -0
  178. package/public/manager/src/settings/pages/components/ActiveChannelToggle.tsx +2 -1
  179. package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +13 -4
  180. package/public/manager/src/settings/types.ts +1 -0
  181. package/scripts/check-redaction-sinks.mjs +276 -0
  182. package/scripts/pi-rpc-probe.mts +361 -0
  183. package/scripts/release-gates.mjs +83 -0
  184. package/scripts/release-preview.sh +8 -1
  185. package/scripts/release.sh +13 -2
  186. package/scripts/sync-electron-version.cjs +93 -0
  187. package/public/dist/assets/ChannelsDiscord-Bt1_rtNC.js +0 -1
  188. package/public/dist/assets/ChannelsTelegram-BLV0m1oq.js +0 -1
  189. package/public/dist/assets/TransportStatusChips-Bld0yXi7.js +0 -1
  190. package/public/dist/assets/app-iSJhsP20.js +0 -55
  191. package/public/dist/assets/bgtask-badge-CSkSsoB6.js +0 -1
  192. package/public/dist/assets/iframe-renderer-DXdo0YXN.js +0 -1
  193. package/public/dist/assets/memory-DeKUlD2M.js +0 -1
  194. package/public/dist/assets/message-history-CWTQ2woA.js +0 -1
  195. package/public/dist/assets/settings-CDjs7hTT.js +0 -1
  196. package/public/dist/assets/settings-core-Cs_oq-b3.js +0 -99
  197. package/public/dist/assets/settings-core-D-TOh1a6.js +0 -1
  198. package/public/dist/assets/skills-GuIfNASs.js +0 -1
  199. package/public/dist/assets/slash-commands-BtZa093n.js +0 -20
  200. package/public/dist/assets/slash-commands-DGJKfpMT.js +0 -1
  201. package/public/dist/assets/ui-DJg5Q_NJ.js +0 -1
  202. /package/public/dist/assets/{DashboardMeta-B7CVqXcU.js → DashboardMeta-DennaaA_.js} +0 -0
  203. /package/public/dist/assets/{Display-BF-rACK6.js → Display-hGuSn_W5.js} +0 -0
  204. /package/public/dist/assets/{Employees-D3hnciP0.js → Employees-B5YXk5ma.js} +0 -0
  205. /package/public/dist/assets/{Heartbeat-D4Pn5O3O.js → Heartbeat-vDGhPfct.js} +0 -0
  206. /package/public/dist/assets/{Mcp-SfytKWGX.js → Mcp-BHWnJ6SP.js} +0 -0
  207. /package/public/dist/assets/{Memory-DNxBOQ7N.js → Memory-B_UZ-iCA.js} +0 -0
  208. /package/public/dist/assets/{ModelProvider-CXwtlG7l.js → ModelProvider-CgUvs6pE.js} +0 -0
  209. /package/public/dist/assets/{Network-DISUhige.js → Network-AWpSkALD.js} +0 -0
  210. /package/public/dist/assets/{Profile-B8yBO3Ju.js → Profile-DnIE2ios.js} +0 -0
  211. /package/public/dist/assets/{Prompts-5lNQ5qOm.js → Prompts-B9aKLall.js} +0 -0
  212. /package/public/dist/assets/{SpeechKeys-BepaIHBa.js → SpeechKeys-K4Be_o7z.js} +0 -0
  213. /package/public/dist/assets/{TelegramHub--DNjRAwW.js → TelegramHub-CFwSkzHP.js} +0 -0
  214. /package/public/dist/assets/{TerminalPanel-DQovYfwz.js → TerminalPanel-CdlFZHAK.js} +0 -0
@@ -0,0 +1,445 @@
1
+ import { CodexAppClient, isRecoverableResumeError } from './codex-app-client.js';
2
+ import { normalizePiSettings, spawnPersistentPiRpc, } from './pi-runtime.js';
3
+ const DEFAULT_POOL_WAIT_MS = 60_000;
4
+ const DEFAULT_POOL_IDLE_MS = 15 * 60_000;
5
+ const POOL_SWEEP_MS = 60_000;
6
+ const INTERRUPT_LATCH_MS = 10_000;
7
+ const stores = new Map();
8
+ let nextWaiterId = 1;
9
+ let reaper = null;
10
+ function storeFor(engine) {
11
+ let store = stores.get(engine);
12
+ if (!store) {
13
+ store = { entries: new Map(), scopeIndex: new Map() };
14
+ stores.set(engine, store);
15
+ }
16
+ return store;
17
+ }
18
+ function fullKey(key) {
19
+ return JSON.stringify([key.scopeKey, key.cwd, key.model, key.effort, key.fastMode]);
20
+ }
21
+ function fullPiKey(key) {
22
+ return JSON.stringify([
23
+ 'pi', key.scopeKey, key.cwd, key.profileId, key.fullEndpoint.replace(/\/+$/, ''),
24
+ key.apiKind, key.model, key.effort, key.profileFp,
25
+ ]);
26
+ }
27
+ function configuredMs(value, fallback) {
28
+ const parsed = Number(value);
29
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
30
+ }
31
+ function drainWaiters(entry, outcome) {
32
+ const pending = entry.waiters.splice(0);
33
+ for (const waiter of pending) {
34
+ clearTimeout(waiter.timer);
35
+ if (outcome instanceof Error)
36
+ waiter.reject(outcome);
37
+ else
38
+ waiter.resolve();
39
+ }
40
+ }
41
+ function removeWaiter(entry, id) {
42
+ const index = entry.waiters.findIndex((waiter) => waiter.id === id);
43
+ if (index >= 0)
44
+ entry.waiters.splice(index, 1);
45
+ }
46
+ function waitForEntry(entry, waitMs) {
47
+ return new Promise((resolve, reject) => {
48
+ const id = nextWaiterId++;
49
+ const timer = setTimeout(() => {
50
+ removeWaiter(entry, id);
51
+ reject(new Error(`runtime pool acquire timed out after ${waitMs}ms`));
52
+ }, waitMs);
53
+ entry.waiters.push({ id, resolve, reject, timer });
54
+ });
55
+ }
56
+ function unindex(store, scopeKey, key) {
57
+ const keys = store.scopeIndex.get(scopeKey);
58
+ keys?.delete(key);
59
+ if (keys?.size === 0)
60
+ store.scopeIndex.delete(scopeKey);
61
+ }
62
+ function removeEntry(store, key, entry, reason) {
63
+ if (store.entries.get(key) !== entry)
64
+ return;
65
+ store.entries.delete(key);
66
+ unindex(store, entry.scopeKey, key);
67
+ drainWaiters(entry, reason);
68
+ if (entry.state === 'ready')
69
+ entry.disposeExit();
70
+ }
71
+ function closeEntry(store, key, entry, reason) {
72
+ removeEntry(store, key, entry, reason);
73
+ if (entry.state === 'ready') {
74
+ void Promise.resolve(entry.runtime.close()).catch((err) => {
75
+ console.warn('[runtime-pool] close failed:', err.message);
76
+ });
77
+ }
78
+ }
79
+ function replaceScopeEntries(store, scopeKey, keepKey) {
80
+ for (const key of [...(store.scopeIndex.get(scopeKey) ?? [])]) {
81
+ if (key === keepKey)
82
+ continue;
83
+ const entry = store.entries.get(key);
84
+ if (entry)
85
+ closeEntry(store, key, entry, new Error('runtime pool entry replaced'));
86
+ }
87
+ }
88
+ function codexRuntime(client) {
89
+ return {
90
+ client,
91
+ get alive() { return client.alive; },
92
+ supportsInterrupt: true,
93
+ close: () => client.closeGracefully(),
94
+ interrupt: async () => {
95
+ if (client.activeTurnId) {
96
+ await client.interruptTurn();
97
+ return;
98
+ }
99
+ await new Promise((resolve, reject) => {
100
+ const cleanup = () => {
101
+ client.off('interrupt-failed', onFailed);
102
+ client.off('turn/completed', onCompleted);
103
+ clearTimeout(timer);
104
+ };
105
+ const onFailed = (err) => { cleanup(); reject(err); };
106
+ const onCompleted = () => { cleanup(); resolve(); };
107
+ const timer = setTimeout(() => {
108
+ cleanup();
109
+ reject(new Error('interrupt latch timeout'));
110
+ }, INTERRUPT_LATCH_MS);
111
+ client.once('interrupt-failed', onFailed);
112
+ client.once('turn/completed', onCompleted);
113
+ void client.interruptTurn();
114
+ });
115
+ },
116
+ kill: () => client.kill(),
117
+ onExit: (cb) => {
118
+ const listener = (code) => { cb(code); };
119
+ const errorListener = () => { cb(null); };
120
+ client.on('exit', listener);
121
+ client.on('error', errorListener);
122
+ return () => {
123
+ client.off('exit', listener);
124
+ client.off('error', errorListener);
125
+ };
126
+ },
127
+ };
128
+ }
129
+ function piRuntime(session) {
130
+ return {
131
+ session,
132
+ get alive() { return session.alive; },
133
+ supportsInterrupt: session.abortEffective,
134
+ close: () => session.close(),
135
+ interrupt: () => session.abort(),
136
+ kill: () => session.kill(),
137
+ onExit: (cb) => {
138
+ const listener = (code) => { cb(code); };
139
+ session.child.on('exit', listener);
140
+ return () => { session.child.off('exit', listener); };
141
+ },
142
+ };
143
+ }
144
+ async function cancelLease(entry) {
145
+ if (entry.runtime.supportsInterrupt) {
146
+ try {
147
+ await entry.runtime.interrupt();
148
+ return;
149
+ }
150
+ catch {
151
+ // Fall through: cancellation must not be lost when interrupt fails.
152
+ }
153
+ }
154
+ entry.runtime.kill();
155
+ entry.dead = true;
156
+ drainWaiters(entry, new Error('runtime cancelled and discarded'));
157
+ }
158
+ function makeCodexLease(store, key, entry, client, threadId, reused, resumedThread) {
159
+ let released = false;
160
+ return {
161
+ runtime: entry.runtime,
162
+ sessionId: threadId,
163
+ client,
164
+ threadId,
165
+ reused,
166
+ resumedThread,
167
+ release: () => {
168
+ if (released)
169
+ return;
170
+ released = true;
171
+ entry.lastUsedAt = Date.now();
172
+ entry.busy = false;
173
+ if (entry.dead || !entry.runtime.alive) {
174
+ removeEntry(store, key, entry, new Error('runtime exited'));
175
+ return;
176
+ }
177
+ drainWaiters(entry, 'wake');
178
+ },
179
+ cancel: () => cancelLease(entry),
180
+ };
181
+ }
182
+ function piSessionForLease(session, instructions) {
183
+ if (!instructions)
184
+ return session;
185
+ return {
186
+ child: session.child,
187
+ get alive() { return session.alive; },
188
+ abortEffective: session.abortEffective,
189
+ get sessionId() { return session.sessionId; },
190
+ set sessionId(value) { session.sessionId = value; },
191
+ sendPrompt: (message, opts) => session.sendPrompt(`${instructions}\n\n${message}`, opts),
192
+ abort: () => session.abort(),
193
+ close: () => session.close(),
194
+ kill: () => session.kill(),
195
+ };
196
+ }
197
+ function makePiLease(store, key, entry, session, reused, instructions) {
198
+ let released = false;
199
+ return {
200
+ runtime: entry.runtime,
201
+ sessionId: session.sessionId,
202
+ session: piSessionForLease(session, instructions),
203
+ reused,
204
+ release: () => {
205
+ if (released)
206
+ return;
207
+ released = true;
208
+ entry.sessionId = session.sessionId;
209
+ entry.lastUsedAt = Date.now();
210
+ entry.busy = false;
211
+ if (entry.dead || !entry.runtime.alive) {
212
+ removeEntry(store, key, entry, new Error('runtime exited'));
213
+ return;
214
+ }
215
+ drainWaiters(entry, 'wake');
216
+ },
217
+ cancel: () => cancelLease(entry),
218
+ };
219
+ }
220
+ async function createCodexEntry(store, key, creating, opts) {
221
+ const client = new CodexAppClient({
222
+ binary: opts.binary,
223
+ workDir: opts.key.cwd,
224
+ env: opts.env,
225
+ model: opts.key.model,
226
+ effort: opts.key.effort,
227
+ fastMode: opts.key.fastMode,
228
+ });
229
+ client.spawn();
230
+ try {
231
+ await client.initialize();
232
+ let resumedThread = false;
233
+ let threadId;
234
+ const storedThreadId = opts.forceNew ? null : opts.storedThreadId;
235
+ if (storedThreadId) {
236
+ try {
237
+ threadId = await client.resumeThread(storedThreadId, opts.instructions ? { instructions: opts.instructions } : {});
238
+ resumedThread = true;
239
+ }
240
+ catch (err) {
241
+ if (!isRecoverableResumeError(err.message))
242
+ throw err;
243
+ threadId = await client.startThread({
244
+ ...(opts.instructions ? { instructions: opts.instructions } : {}),
245
+ cwd: opts.key.cwd,
246
+ });
247
+ }
248
+ }
249
+ else {
250
+ threadId = await client.startThread({
251
+ ...(opts.instructions ? { instructions: opts.instructions } : {}),
252
+ cwd: opts.key.cwd,
253
+ });
254
+ }
255
+ if (store.entries.get(key) !== creating) {
256
+ await client.closeGracefully();
257
+ throw new Error('runtime pool creation superseded');
258
+ }
259
+ const runtime = codexRuntime(client);
260
+ let ready;
261
+ const disposeExit = runtime.onExit(() => {
262
+ if (store.entries.get(key) !== ready)
263
+ return;
264
+ ready.dead = true;
265
+ drainWaiters(ready, new Error('runtime exited'));
266
+ if (!ready.busy)
267
+ removeEntry(store, key, ready, new Error('runtime exited'));
268
+ });
269
+ ready = {
270
+ state: 'ready', scopeKey: opts.key.scopeKey, runtime, sessionId: threadId,
271
+ busy: true, dead: false, waiters: [], lastUsedAt: Date.now(), disposeExit,
272
+ };
273
+ store.entries.set(key, ready);
274
+ drainWaiters(creating, 'wake');
275
+ return makeCodexLease(store, key, ready, client, threadId, false, resumedThread);
276
+ }
277
+ catch (err) {
278
+ client.kill();
279
+ removeEntry(store, key, creating, err);
280
+ throw err;
281
+ }
282
+ }
283
+ export async function acquireCodexAppRuntime(opts) {
284
+ startPoolReaper();
285
+ const store = storeFor('codex-app');
286
+ const key = fullKey(opts.key);
287
+ const waitMs = opts.waitMs ?? configuredMs(process.env["CODEX_APP_POOL_WAIT_MS"], DEFAULT_POOL_WAIT_MS);
288
+ replaceScopeEntries(store, opts.key.scopeKey, opts.forceNew ? null : key);
289
+ let forceNewApplied = !opts.forceNew;
290
+ for (;;) {
291
+ let entry = store.entries.get(key);
292
+ if (!forceNewApplied) {
293
+ forceNewApplied = true;
294
+ if (entry)
295
+ closeEntry(store, key, entry, new Error('runtime pool forceNew replacement'));
296
+ entry = undefined;
297
+ }
298
+ if (!entry) {
299
+ const creating = {
300
+ state: 'creating', scopeKey: opts.key.scopeKey, waiters: [], lastUsedAt: Date.now(),
301
+ };
302
+ store.entries.set(key, creating);
303
+ let keys = store.scopeIndex.get(opts.key.scopeKey);
304
+ if (!keys) {
305
+ keys = new Set();
306
+ store.scopeIndex.set(opts.key.scopeKey, keys);
307
+ }
308
+ keys.add(key);
309
+ return createCodexEntry(store, key, creating, opts);
310
+ }
311
+ if (entry.state === 'creating') {
312
+ await waitForEntry(entry, waitMs);
313
+ continue;
314
+ }
315
+ if (entry.dead || !entry.runtime.alive || (opts.storedThreadId && entry.sessionId !== opts.storedThreadId)) {
316
+ closeEntry(store, key, entry, new Error('runtime pool entry stale'));
317
+ continue;
318
+ }
319
+ if (!entry.busy) {
320
+ entry.busy = true;
321
+ entry.lastUsedAt = Date.now();
322
+ const client = entry.runtime.client;
323
+ return makeCodexLease(store, key, entry, client, entry.sessionId, true, true);
324
+ }
325
+ await waitForEntry(entry, waitMs);
326
+ }
327
+ }
328
+ async function createPiEntry(store, key, creating, opts) {
329
+ const pi = normalizePiSettings(opts.piSettings);
330
+ const profile = pi.profiles.find((entry) => entry.id === opts.key.profileId);
331
+ if (!profile) {
332
+ const error = new Error(`Pi profile not found: ${opts.key.profileId}`);
333
+ removeEntry(store, key, creating, error);
334
+ throw error;
335
+ }
336
+ let session = null;
337
+ try {
338
+ session = spawnPersistentPiRpc(profile, pi, {
339
+ model: opts.key.model,
340
+ effort: opts.key.effort,
341
+ cwd: opts.key.cwd,
342
+ ...(opts.forceNew || !opts.storedSessionId ? {} : { sessionId: opts.storedSessionId }),
343
+ });
344
+ if (store.entries.get(key) !== creating) {
345
+ session.close();
346
+ throw new Error('runtime pool creation superseded');
347
+ }
348
+ const runtime = piRuntime(session);
349
+ let ready;
350
+ const disposeExit = runtime.onExit(() => {
351
+ if (store.entries.get(key) !== ready)
352
+ return;
353
+ ready.dead = true;
354
+ drainWaiters(ready, new Error('runtime exited'));
355
+ if (!ready.busy)
356
+ removeEntry(store, key, ready, new Error('runtime exited'));
357
+ });
358
+ ready = {
359
+ state: 'ready', scopeKey: opts.key.scopeKey, runtime, sessionId: session.sessionId,
360
+ busy: true, dead: false, waiters: [], lastUsedAt: Date.now(), disposeExit,
361
+ };
362
+ store.entries.set(key, ready);
363
+ drainWaiters(creating, 'wake');
364
+ return makePiLease(store, key, ready, session, false, opts.instructions);
365
+ }
366
+ catch (err) {
367
+ session?.kill();
368
+ removeEntry(store, key, creating, err);
369
+ throw err;
370
+ }
371
+ }
372
+ export async function acquirePiRuntime(opts) {
373
+ startPoolReaper();
374
+ const store = storeFor('pi');
375
+ const key = fullPiKey(opts.key);
376
+ const waitMs = opts.waitMs ?? configuredMs(process.env["PI_POOL_WAIT_MS"], DEFAULT_POOL_WAIT_MS);
377
+ replaceScopeEntries(store, opts.key.scopeKey, opts.forceNew ? null : key);
378
+ let forceNewApplied = !opts.forceNew;
379
+ for (;;) {
380
+ let entry = store.entries.get(key);
381
+ if (!forceNewApplied) {
382
+ forceNewApplied = true;
383
+ if (entry)
384
+ closeEntry(store, key, entry, new Error('runtime pool forceNew replacement'));
385
+ entry = undefined;
386
+ }
387
+ if (!entry) {
388
+ const creating = {
389
+ state: 'creating', scopeKey: opts.key.scopeKey, waiters: [], lastUsedAt: Date.now(),
390
+ };
391
+ store.entries.set(key, creating);
392
+ let keys = store.scopeIndex.get(opts.key.scopeKey);
393
+ if (!keys) {
394
+ keys = new Set();
395
+ store.scopeIndex.set(opts.key.scopeKey, keys);
396
+ }
397
+ keys.add(key);
398
+ return createPiEntry(store, key, creating, opts);
399
+ }
400
+ if (entry.state === 'creating') {
401
+ await waitForEntry(entry, waitMs);
402
+ continue;
403
+ }
404
+ const session = entry.runtime.session;
405
+ if (entry.dead || !entry.runtime.alive
406
+ || (opts.storedSessionId && entry.sessionId !== opts.storedSessionId)) {
407
+ closeEntry(store, key, entry, new Error('runtime pool entry stale'));
408
+ continue;
409
+ }
410
+ if (!entry.busy) {
411
+ entry.busy = true;
412
+ entry.lastUsedAt = Date.now();
413
+ return makePiLease(store, key, entry, session, true, opts.instructions);
414
+ }
415
+ await waitForEntry(entry, waitMs);
416
+ }
417
+ }
418
+ export function startPoolReaper(idleMs = DEFAULT_POOL_IDLE_MS) {
419
+ if (reaper)
420
+ return;
421
+ reaper = setInterval(() => {
422
+ const now = Date.now();
423
+ for (const store of stores.values()) {
424
+ for (const [key, entry] of store.entries) {
425
+ if (entry.state === 'ready' && !entry.busy && now - entry.lastUsedAt >= idleMs) {
426
+ closeEntry(store, key, entry, new Error('runtime pool idle timeout'));
427
+ }
428
+ }
429
+ }
430
+ }, POOL_SWEEP_MS);
431
+ reaper.unref();
432
+ }
433
+ export function poolStats() {
434
+ let size = 0;
435
+ let busy = 0;
436
+ for (const store of stores.values()) {
437
+ size += store.entries.size;
438
+ for (const entry of store.entries.values()) {
439
+ if (entry.state === 'ready' && entry.busy)
440
+ busy += 1;
441
+ }
442
+ }
443
+ return { size, busy };
444
+ }
445
+ //# sourceMappingURL=runtime-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-pool.js","sourceRoot":"","sources":["../../../src/agent/runtime-pool.ts"],"names":[],"mappings":"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"}