negotium 0.1.7 → 0.1.9

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 (270) hide show
  1. package/README.md +26 -2
  2. package/dist/canonical-mcp-bridge.js +14 -0
  3. package/dist/canonical-mcp-bridge.js.map +9 -0
  4. package/dist/chunk-10ct8814.js +429 -0
  5. package/dist/chunk-10ct8814.js.map +11 -0
  6. package/dist/chunk-18fzftjf.js +214 -0
  7. package/dist/chunk-18fzftjf.js.map +10 -0
  8. package/dist/chunk-1k7t7bnx.js +97 -0
  9. package/dist/chunk-1k7t7bnx.js.map +10 -0
  10. package/dist/chunk-1msje2zf.js +23 -0
  11. package/dist/chunk-1msje2zf.js.map +10 -0
  12. package/dist/chunk-2dgkah1z.js +706 -0
  13. package/dist/chunk-2dgkah1z.js.map +14 -0
  14. package/dist/chunk-3t4dtm26.js +61 -0
  15. package/dist/chunk-3t4dtm26.js.map +10 -0
  16. package/dist/chunk-3vn2vnj1.js +51 -0
  17. package/dist/chunk-3vn2vnj1.js.map +10 -0
  18. package/dist/chunk-6hknphtc.js +2054 -0
  19. package/dist/chunk-6hknphtc.js.map +29 -0
  20. package/dist/chunk-6tfzpcvk.js +2149 -0
  21. package/dist/chunk-6tfzpcvk.js.map +15 -0
  22. package/dist/chunk-8g0c4as0.js +23 -0
  23. package/dist/chunk-8g0c4as0.js.map +10 -0
  24. package/dist/chunk-9spx3h9n.js +279 -0
  25. package/dist/chunk-9spx3h9n.js.map +10 -0
  26. package/dist/chunk-c500xe9z.js +33 -0
  27. package/dist/chunk-c500xe9z.js.map +10 -0
  28. package/dist/chunk-e9b2xpff.js +147 -0
  29. package/dist/chunk-e9b2xpff.js.map +10 -0
  30. package/dist/chunk-edb07sjp.js +567 -0
  31. package/dist/chunk-edb07sjp.js.map +14 -0
  32. package/dist/chunk-eexqsee7.js +368 -0
  33. package/dist/chunk-eexqsee7.js.map +11 -0
  34. package/dist/chunk-efyxk97v.js +500 -0
  35. package/dist/chunk-efyxk97v.js.map +13 -0
  36. package/dist/chunk-epqxwkvh.js +3534 -0
  37. package/dist/chunk-epqxwkvh.js.map +20 -0
  38. package/dist/chunk-f1pzh3xh.js +115 -0
  39. package/dist/chunk-f1pzh3xh.js.map +10 -0
  40. package/dist/chunk-f5xgprg1.js +59 -0
  41. package/dist/chunk-f5xgprg1.js.map +10 -0
  42. package/dist/chunk-f97qybwk.js +584 -0
  43. package/dist/chunk-f97qybwk.js.map +11 -0
  44. package/dist/chunk-fvc7ncxd.js +252 -0
  45. package/dist/chunk-fvc7ncxd.js.map +10 -0
  46. package/dist/chunk-g7pvfj5e.js +574 -0
  47. package/dist/chunk-g7pvfj5e.js.map +14 -0
  48. package/dist/chunk-h8vmb9gf.js +315 -0
  49. package/dist/chunk-h8vmb9gf.js.map +10 -0
  50. package/dist/chunk-hgw7n8cm.js +43 -0
  51. package/dist/chunk-hgw7n8cm.js.map +10 -0
  52. package/dist/chunk-hsq7j9jk.js +126 -0
  53. package/dist/chunk-hsq7j9jk.js.map +10 -0
  54. package/dist/chunk-hwy3n31w.js +21 -0
  55. package/dist/chunk-hwy3n31w.js.map +9 -0
  56. package/dist/chunk-j0kjscb7.js +53 -0
  57. package/dist/chunk-j0kjscb7.js.map +10 -0
  58. package/dist/chunk-jzz91jwh.js +70 -0
  59. package/dist/chunk-jzz91jwh.js.map +10 -0
  60. package/dist/chunk-k9z47mab.js +247 -0
  61. package/dist/chunk-k9z47mab.js.map +12 -0
  62. package/dist/chunk-kbm35t7w.js +1331 -0
  63. package/dist/chunk-kbm35t7w.js.map +16 -0
  64. package/dist/chunk-m4veth0c.js +1649 -0
  65. package/dist/chunk-m4veth0c.js.map +17 -0
  66. package/dist/chunk-mhty3nna.js +150 -0
  67. package/dist/chunk-mhty3nna.js.map +11 -0
  68. package/dist/chunk-mmgh670x.js +248 -0
  69. package/dist/chunk-mmgh670x.js.map +11 -0
  70. package/dist/chunk-n0kk5xbq.js +2358 -0
  71. package/dist/chunk-n0kk5xbq.js.map +26 -0
  72. package/dist/chunk-nmv41qx9.js +2847 -0
  73. package/dist/chunk-nmv41qx9.js.map +23 -0
  74. package/dist/chunk-nqdp52aj.js +113 -0
  75. package/dist/chunk-nqdp52aj.js.map +12 -0
  76. package/dist/chunk-ns2m25dz.js +139 -0
  77. package/dist/chunk-ns2m25dz.js.map +10 -0
  78. package/dist/chunk-pkdmypdd.js +147 -0
  79. package/dist/chunk-pkdmypdd.js.map +11 -0
  80. package/dist/chunk-rmyfmrrr.js +1634 -0
  81. package/dist/chunk-rmyfmrrr.js.map +15 -0
  82. package/dist/chunk-sa874j5c.js +9 -0
  83. package/dist/chunk-sa874j5c.js.map +10 -0
  84. package/dist/chunk-sgsz2fpq.js +289 -0
  85. package/dist/chunk-sgsz2fpq.js.map +10 -0
  86. package/dist/chunk-sn51wnf1.js +3020 -0
  87. package/dist/chunk-sn51wnf1.js.map +32 -0
  88. package/dist/chunk-sqhr1a7e.js +587 -0
  89. package/dist/chunk-sqhr1a7e.js.map +11 -0
  90. package/dist/chunk-tmj5r2zv.js +2933 -0
  91. package/dist/chunk-tmj5r2zv.js.map +20 -0
  92. package/dist/chunk-vefj3880.js +56 -0
  93. package/dist/chunk-vefj3880.js.map +10 -0
  94. package/dist/chunk-vp2db42d.js +121 -0
  95. package/dist/chunk-vp2db42d.js.map +10 -0
  96. package/dist/chunk-wry79q55.js +108 -0
  97. package/dist/chunk-wry79q55.js.map +10 -0
  98. package/dist/chunk-x1arr7ze.js +63 -0
  99. package/dist/chunk-x1arr7ze.js.map +10 -0
  100. package/dist/chunk-z2xy5n2q.js +103 -0
  101. package/dist/chunk-z2xy5n2q.js.map +10 -0
  102. package/dist/hosted-agent.js +53 -0
  103. package/dist/hosted-agent.js.map +10 -0
  104. package/dist/main.js +132 -20
  105. package/dist/main.js.map +4 -4
  106. package/dist/runtime/scripts/faster-whisper-wrapper.py +87 -0
  107. package/dist/runtime/scripts/mcp-patchright-http.mjs +349 -0
  108. package/dist/runtime/src/agents/api-topic-agent-switch.ts +178 -0
  109. package/dist/runtime/src/agents/archiver.ts +396 -0
  110. package/dist/runtime/src/agents/auth-check.ts +64 -0
  111. package/dist/runtime/src/agents/claude-provider.ts +737 -0
  112. package/dist/runtime/src/agents/claude-registry.ts +115 -0
  113. package/dist/runtime/src/agents/codex-native-multi-agent.ts +177 -0
  114. package/dist/runtime/src/agents/codex-provider.ts +785 -0
  115. package/dist/runtime/src/agents/codex-registry.ts +115 -0
  116. package/dist/runtime/src/agents/codex-tree-kill.ts +365 -0
  117. package/dist/runtime/src/agents/contracts.ts +69 -0
  118. package/dist/runtime/src/agents/deep-map.ts +13 -0
  119. package/dist/runtime/src/agents/execution-host.ts +91 -0
  120. package/dist/runtime/src/agents/fixtures/claude-attachments.jsonl +2 -0
  121. package/dist/runtime/src/agents/fixtures/codex-shell.jsonl +5 -0
  122. package/dist/runtime/src/agents/fork.ts +65 -0
  123. package/dist/runtime/src/agents/hosted-agent.ts +49 -0
  124. package/dist/runtime/src/agents/idle-archiver.ts +128 -0
  125. package/dist/runtime/src/agents/index.ts +205 -0
  126. package/dist/runtime/src/agents/maestro-provider.ts +206 -0
  127. package/dist/runtime/src/agents/maestro-registry.ts +31 -0
  128. package/dist/runtime/src/agents/mcp-tools/ask-user.ts +280 -0
  129. package/dist/runtime/src/agents/mcp-tools/common.ts +21 -0
  130. package/dist/runtime/src/agents/mcp-tools/self-config.ts +220 -0
  131. package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +525 -0
  132. package/dist/runtime/src/agents/mcp-tools/visuals.ts +88 -0
  133. package/dist/runtime/src/agents/model-catalog.ts +151 -0
  134. package/dist/runtime/src/agents/registry.ts +24 -0
  135. package/dist/runtime/src/agents/rollout/claude.ts +331 -0
  136. package/dist/runtime/src/agents/rollout/codex.ts +569 -0
  137. package/dist/runtime/src/agents/rollout/shared.ts +205 -0
  138. package/dist/runtime/src/agents/self-config-core.ts +415 -0
  139. package/dist/runtime/src/agents/task-events.ts +44 -0
  140. package/dist/runtime/src/agents/tool-format.ts +352 -0
  141. package/dist/runtime/src/agents/topic-agent-switch.ts +193 -0
  142. package/dist/runtime/src/agents/topic-cleanup.ts +231 -0
  143. package/dist/runtime/src/agents/vault-tool-policy.ts +33 -0
  144. package/dist/runtime/src/application/execute-external-user-turn.ts +23 -0
  145. package/dist/runtime/src/application/submit-user-message.ts +50 -0
  146. package/dist/runtime/src/application/switch-topic-effort.ts +48 -0
  147. package/dist/runtime/src/application/switch-topic-model.ts +79 -0
  148. package/dist/runtime/src/application/topic-service.ts +139 -0
  149. package/dist/runtime/src/application/vault-command.ts +170 -0
  150. package/dist/runtime/src/bus.ts +319 -0
  151. package/dist/runtime/src/index.ts +333 -0
  152. package/dist/runtime/src/mcp/agent-health-server.ts +309 -0
  153. package/dist/runtime/src/mcp/background-bash-server.ts +346 -0
  154. package/dist/runtime/src/mcp/canonical-bridge-config.ts +84 -0
  155. package/dist/runtime/src/mcp/canonical-proxy-server.ts +171 -0
  156. package/dist/runtime/src/mcp/dm-ipc.ts +60 -0
  157. package/dist/runtime/src/mcp/mcp-helpers.ts +40 -0
  158. package/dist/runtime/src/mcp/paddleocr-server.ts +105 -0
  159. package/dist/runtime/src/mcp/peer-bridge.ts +114 -0
  160. package/dist/runtime/src/mcp/runtime-spec.ts +137 -0
  161. package/dist/runtime/src/mcp/session-comm/bridge-ipc-config.ts +27 -0
  162. package/dist/runtime/src/mcp/session-comm/peer-forward.ts +165 -0
  163. package/dist/runtime/src/mcp/session-comm/runtime.ts +115 -0
  164. package/dist/runtime/src/mcp/session-comm/server.ts +649 -0
  165. package/dist/runtime/src/mcp/session-comm/topic-config.ts +131 -0
  166. package/dist/runtime/src/mcp/session-comm/topics.ts +229 -0
  167. package/dist/runtime/src/mcp/stdio-protect.ts +84 -0
  168. package/dist/runtime/src/mcp/system-health-server.ts +130 -0
  169. package/dist/runtime/src/mcp/task-server.ts +173 -0
  170. package/dist/runtime/src/mcp/token-stats-server.ts +98 -0
  171. package/dist/runtime/src/mcp/vault-http.ts +219 -0
  172. package/dist/runtime/src/mcp/vault-run.ts +153 -0
  173. package/dist/runtime/src/mcp/vault-server.ts +104 -0
  174. package/dist/runtime/src/mcp/wiki-server.ts +755 -0
  175. package/dist/runtime/src/media/file-events.ts +33 -0
  176. package/dist/runtime/src/media/text-extractor.ts +312 -0
  177. package/dist/runtime/src/media/video.ts +92 -0
  178. package/dist/runtime/src/outbox/file-ops.ts +210 -0
  179. package/dist/runtime/src/outbox/index.ts +8 -0
  180. package/dist/runtime/src/outbox/utils.ts +51 -0
  181. package/dist/runtime/src/platform/background-bash/manager.ts +279 -0
  182. package/dist/runtime/src/platform/config.ts +371 -0
  183. package/dist/runtime/src/platform/constants.ts +18 -0
  184. package/dist/runtime/src/platform/debug-users.ts +14 -0
  185. package/dist/runtime/src/platform/delay.ts +1 -0
  186. package/dist/runtime/src/platform/error.ts +9 -0
  187. package/dist/runtime/src/platform/file-utils.ts +16 -0
  188. package/dist/runtime/src/platform/jsonl.ts +202 -0
  189. package/dist/runtime/src/platform/lifecycle.ts +174 -0
  190. package/dist/runtime/src/platform/logger.ts +31 -0
  191. package/dist/runtime/src/platform/maestro-bootstrap-env.ts +3 -0
  192. package/dist/runtime/src/platform/mcp-config.ts +878 -0
  193. package/dist/runtime/src/platform/modules.ts +145 -0
  194. package/dist/runtime/src/platform/node-plugins.ts +46 -0
  195. package/dist/runtime/src/platform/playwright/manager.ts +1233 -0
  196. package/dist/runtime/src/prompts/agents/wiki-archiver.md +261 -0
  197. package/dist/runtime/src/prompts/builders.ts +368 -0
  198. package/dist/runtime/src/prompts/sessions/channel-system.md +48 -0
  199. package/dist/runtime/src/prompts/sessions/manager-system.md +37 -0
  200. package/dist/runtime/src/prompts/sessions/topic-system.md +47 -0
  201. package/dist/runtime/src/prompts/sessions/visual-design.md +86 -0
  202. package/dist/runtime/src/query/active-rooms.ts +534 -0
  203. package/dist/runtime/src/query/control.ts +313 -0
  204. package/dist/runtime/src/query/index.ts +24 -0
  205. package/dist/runtime/src/query/session-inbox-cleanup.ts +44 -0
  206. package/dist/runtime/src/query/session-inbox-path.ts +42 -0
  207. package/dist/runtime/src/query/state.ts +94 -0
  208. package/dist/runtime/src/query/types.ts +83 -0
  209. package/dist/runtime/src/runtime/ask-callbacks.ts +153 -0
  210. package/dist/runtime/src/runtime/attachments.ts +151 -0
  211. package/dist/runtime/src/runtime/background-sessions.ts +83 -0
  212. package/dist/runtime/src/runtime/channel-context.ts +107 -0
  213. package/dist/runtime/src/runtime/errors.ts +69 -0
  214. package/dist/runtime/src/runtime/event-heartbeat.ts +77 -0
  215. package/dist/runtime/src/runtime/file-hooks.ts +81 -0
  216. package/dist/runtime/src/runtime/footer.ts +23 -0
  217. package/dist/runtime/src/runtime/inbox.ts +946 -0
  218. package/dist/runtime/src/runtime/tasks.ts +56 -0
  219. package/dist/runtime/src/runtime/topic-config.ts +29 -0
  220. package/dist/runtime/src/runtime/turn-runner.ts +2298 -0
  221. package/dist/runtime/src/runtime/usage-alert.ts +84 -0
  222. package/dist/runtime/src/runtime/visual-html.ts +109 -0
  223. package/dist/runtime/src/runtime/visual-store.ts +430 -0
  224. package/dist/runtime/src/runtime/visuals.ts +171 -0
  225. package/dist/runtime/src/security/sanitize.ts +27 -0
  226. package/dist/runtime/src/security/sensitive-path.ts +34 -0
  227. package/dist/runtime/src/storage/activity-log.ts +152 -0
  228. package/dist/runtime/src/storage/api-messages.ts +617 -0
  229. package/dist/runtime/src/storage/api-topic-brief.ts +127 -0
  230. package/dist/runtime/src/storage/api-topic-config.ts +192 -0
  231. package/dist/runtime/src/storage/api-topics.ts +844 -0
  232. package/dist/runtime/src/storage/app-settings.ts +44 -0
  233. package/dist/runtime/src/storage/browser-profiles.ts +133 -0
  234. package/dist/runtime/src/storage/conversations.ts +268 -0
  235. package/dist/runtime/src/storage/forum/agent-settings.ts +20 -0
  236. package/dist/runtime/src/storage/forum/index.ts +4 -0
  237. package/dist/runtime/src/storage/forum/repository.ts +283 -0
  238. package/dist/runtime/src/storage/forum/schema.ts +300 -0
  239. package/dist/runtime/src/storage/forum-db.ts +23 -0
  240. package/dist/runtime/src/storage/runtime-events.ts +130 -0
  241. package/dist/runtime/src/storage/runtime-leases.ts +189 -0
  242. package/dist/runtime/src/storage/runtime-process-leases.ts +216 -0
  243. package/dist/runtime/src/storage/runtime-topic-state.ts +148 -0
  244. package/dist/runtime/src/storage/runtime-turn-requests.ts +301 -0
  245. package/dist/runtime/src/storage/self-schedules.ts +298 -0
  246. package/dist/runtime/src/storage/session-asks.ts +347 -0
  247. package/dist/runtime/src/storage/sqlite.ts +129 -0
  248. package/dist/runtime/src/storage/tasks.ts +179 -0
  249. package/dist/runtime/src/storage/token-stats.ts +144 -0
  250. package/dist/runtime/src/storage/topic-archive-state.ts +59 -0
  251. package/dist/runtime/src/storage/topic-archive.ts +74 -0
  252. package/dist/runtime/src/storage/topic-settings.ts +67 -0
  253. package/dist/runtime/src/storage/topic-transcript.ts +98 -0
  254. package/dist/runtime/src/storage/vault-crypto.ts +65 -0
  255. package/dist/runtime/src/storage/vault.ts +225 -0
  256. package/dist/runtime/src/storage/wiki-summary-names.ts +33 -0
  257. package/dist/runtime/src/storage/wiki.ts +85 -0
  258. package/dist/runtime/src/topics/create.ts +123 -0
  259. package/dist/runtime/src/topics/derive.ts +398 -0
  260. package/dist/runtime/src/topics/lifecycle.ts +311 -0
  261. package/dist/runtime/src/topics/links.ts +7 -0
  262. package/dist/runtime/src/topics/personal-general.ts +65 -0
  263. package/dist/runtime/src/topics/session.ts +381 -0
  264. package/dist/runtime/src/types/api.ts +497 -0
  265. package/dist/runtime/src/types.ts +257 -0
  266. package/dist/runtime/src/version.ts +1 -0
  267. package/dist/runtime/tsconfig.json +13 -0
  268. package/package.json +28 -3
  269. package/dist/main.d.ts +0 -3
  270. package/dist/main.d.ts.map +0 -1
@@ -0,0 +1,706 @@
1
+ import {
2
+ parseJsonlText,
3
+ writeJsonlFile
4
+ } from "./chunk-pkdmypdd.js";
5
+ import {
6
+ CLAUDE_EFFORT_VALUES,
7
+ DM_WORKSPACE_DIR,
8
+ MODEL_FABLE,
9
+ MODEL_OPUS,
10
+ MODEL_SONNET,
11
+ TOPIC_WORKSPACE_DIR,
12
+ WORKSPACE_DIR,
13
+ logger
14
+ } from "./chunk-k9z47mab.js";
15
+ import {
16
+ __require,
17
+ __toESM
18
+ } from "./chunk-hwy3n31w.js";
19
+
20
+ // ../../packages/core/src/platform/maestro-bootstrap-env.ts
21
+ process.env.MAESTRO_SDK_SILENT_BOOTSTRAP ??= "1";
22
+
23
+ // ../../packages/core/src/agents/claude-registry.ts
24
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, readdirSync, renameSync, unlinkSync } from "fs";
25
+ import { homedir as homedir2 } from "os";
26
+ import { join as join3 } from "path";
27
+
28
+ // ../../packages/core/src/agents/rollout/claude.ts
29
+ import { randomUUID } from "crypto";
30
+ import { existsSync, readFileSync, writeFileSync } from "fs";
31
+ import { homedir } from "os";
32
+ import { join as join2 } from "path";
33
+
34
+ // ../../packages/core/src/agents/rollout/shared.ts
35
+ import { mkdirSync } from "fs";
36
+ import { dirname, join, resolve } from "path";
37
+ import { fileURLToPath } from "url";
38
+ var __dirname2 = dirname(fileURLToPath(import.meta.url));
39
+ var FIXTURES_DIR = join(__dirname2, "..", "fixtures");
40
+ function clone(obj) {
41
+ return structuredClone(obj);
42
+ }
43
+ var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
44
+ function assertUuidLike(label, value) {
45
+ if (!UUID_RE.test(value)) {
46
+ throw new Error(`rollout: ${label} is not a UUID-shaped string: ${value}`);
47
+ }
48
+ }
49
+ function assertCwdInWorkspace(cwd) {
50
+ const abs = resolve(cwd);
51
+ const roots = [WORKSPACE_DIR, DM_WORKSPACE_DIR, TOPIC_WORKSPACE_DIR];
52
+ const ok = roots.some((root) => abs === root || abs.startsWith(`${root}/`));
53
+ if (!ok) {
54
+ throw new Error(`rollout: cwd outside trusted workspace roots: ${cwd} (resolved=${abs})`);
55
+ }
56
+ }
57
+ function ensureCwdExists(cwd) {
58
+ assertCwdInWorkspace(cwd);
59
+ try {
60
+ mkdirSync(cwd, { recursive: true });
61
+ } catch (err) {
62
+ logger.warn({ err, cwd }, "rollout: ensureCwdExists failed \u2014 caller should pre-create cwd");
63
+ }
64
+ }
65
+ function truncate(text, n) {
66
+ const cps = Array.from(text);
67
+ return cps.length > n ? `${cps.slice(0, n).join("")}\u2026` : text;
68
+ }
69
+ function extractChatPairs(entries, opts = { includeToolAnnotations: true }) {
70
+ const pairs = [];
71
+ let pendingUser = null;
72
+ let pendingAssistantParts = [];
73
+ let toolBuffer = [];
74
+ const flushAssistant = () => {
75
+ if (pendingUser === null)
76
+ return;
77
+ const tools = opts.includeToolAnnotations && toolBuffer.length > 0 ? `
78
+
79
+ ${toolBuffer.join(`
80
+ `)}` : "";
81
+ const assistantText = pendingAssistantParts.join("").trim() + tools;
82
+ if (assistantText.trim()) {
83
+ pairs.push({ userText: pendingUser, assistantText });
84
+ }
85
+ pendingUser = null;
86
+ pendingAssistantParts = [];
87
+ toolBuffer = [];
88
+ };
89
+ for (const entry of entries) {
90
+ const ev = entry.event;
91
+ switch (ev.type) {
92
+ case "user_message": {
93
+ flushAssistant();
94
+ pendingUser = ev.content;
95
+ break;
96
+ }
97
+ case "session":
98
+ if (pendingAssistantParts.length > 0 || toolBuffer.length > 0) {
99
+ flushAssistant();
100
+ }
101
+ break;
102
+ case "text": {
103
+ if (pendingUser === null) {
104
+ pendingUser = "(continued)";
105
+ }
106
+ pendingAssistantParts.push(ev.content);
107
+ break;
108
+ }
109
+ case "result": {
110
+ if (pendingUser === null) {
111
+ pendingUser = "(continued)";
112
+ }
113
+ pendingAssistantParts = [ev.content];
114
+ flushAssistant();
115
+ break;
116
+ }
117
+ case "text_delta":
118
+ break;
119
+ case "tool_use": {
120
+ const u = ev;
121
+ toolBuffer.push(`<!-- Tool: ${u.name} ${truncate(JSON.stringify(u.input), 200)} -->`);
122
+ break;
123
+ }
124
+ case "tool_result": {
125
+ const u = ev;
126
+ toolBuffer.push(`<!-- Tool result: ${truncate(u.content, 200)} -->`);
127
+ break;
128
+ }
129
+ case "error": {
130
+ const u = ev;
131
+ toolBuffer.push(`[Error: ${truncate(u.content, 200)}]`);
132
+ break;
133
+ }
134
+ case "tool_progress":
135
+ case "tool_use_summary":
136
+ case "file":
137
+ case "status":
138
+ break;
139
+ }
140
+ }
141
+ flushAssistant();
142
+ return pairs;
143
+ }
144
+
145
+ // ../../packages/core/src/agents/rollout/claude.ts
146
+ var _attachmentsCache = null;
147
+ function loadClaudeAttachments() {
148
+ if (_attachmentsCache)
149
+ return _attachmentsCache;
150
+ const raw = readFileSync(join2(FIXTURES_DIR, "claude-attachments.jsonl"), "utf8");
151
+ const lines = parseJsonlText(raw);
152
+ if (lines.length < 2) {
153
+ throw new Error(`loadClaudeAttachments: expected >=2 entries in claude-attachments.jsonl, got ${lines.length}`);
154
+ }
155
+ _attachmentsCache = {
156
+ deferredToolsDelta: lines[0],
157
+ skillListing: lines[1]
158
+ };
159
+ return _attachmentsCache;
160
+ }
161
+ var CLAUDE_SDK_VERSION = "2.1.126";
162
+ var CLAUDE_DEFAULT_MODEL = "claude-sonnet-5";
163
+ var CLAUDE_DEFAULT_GIT_BRANCH = "HEAD";
164
+ function encodeClaudeCwd(cwd) {
165
+ const realCwd = cwd.startsWith("/tmp/") ? cwd.replace(/^\/tmp\//, "/private/tmp/") : cwd;
166
+ return `-${realCwd.replaceAll(/[^a-zA-Z0-9]/g, "-").replace(/^-/, "")}`;
167
+ }
168
+ function writeClaudeRollout(opts) {
169
+ const sessionId = opts.sessionId ?? randomUUID();
170
+ assertUuidLike("sessionId", sessionId);
171
+ ensureCwdExists(opts.cwd);
172
+ const pairs = opts.pairs ?? extractChatPairs(opts.entries ?? []);
173
+ const cwdReal = opts.cwd.startsWith("/tmp/") ? opts.cwd.replace(/^\/tmp\//, "/private/tmp/") : opts.cwd;
174
+ const lines = [];
175
+ const ts = () => new Date().toISOString();
176
+ let lastUuid = null;
177
+ lines.push({ type: "queue-operation", operation: "enqueue", timestamp: ts(), sessionId });
178
+ lines.push({ type: "queue-operation", operation: "dequeue", timestamp: ts(), sessionId });
179
+ const attachments = loadClaudeAttachments();
180
+ for (const pair of pairs) {
181
+ const userUuid = randomUUID();
182
+ lines.push({
183
+ parentUuid: lastUuid,
184
+ isSidechain: false,
185
+ promptId: randomUUID(),
186
+ type: "user",
187
+ message: { role: "user", content: [{ type: "text", text: pair.userText }] },
188
+ uuid: userUuid,
189
+ timestamp: ts(),
190
+ permissionMode: "bypassPermissions",
191
+ userType: "external",
192
+ entrypoint: "sdk-ts",
193
+ cwd: cwdReal,
194
+ sessionId,
195
+ version: CLAUDE_SDK_VERSION,
196
+ gitBranch: CLAUDE_DEFAULT_GIT_BRANCH
197
+ });
198
+ const att1Uuid = randomUUID();
199
+ const att1 = clone(attachments.deferredToolsDelta);
200
+ att1.parentUuid = userUuid;
201
+ att1.uuid = att1Uuid;
202
+ att1.timestamp = ts();
203
+ att1.sessionId = sessionId;
204
+ att1.cwd = cwdReal;
205
+ lines.push(att1);
206
+ const att2Uuid = randomUUID();
207
+ const att2 = clone(attachments.skillListing);
208
+ att2.parentUuid = att1Uuid;
209
+ att2.uuid = att2Uuid;
210
+ att2.timestamp = ts();
211
+ att2.sessionId = sessionId;
212
+ att2.cwd = cwdReal;
213
+ lines.push(att2);
214
+ const assistantUuid = randomUUID();
215
+ lines.push({
216
+ parentUuid: att2Uuid,
217
+ isSidechain: false,
218
+ message: {
219
+ model: opts.model ?? CLAUDE_DEFAULT_MODEL,
220
+ id: `msg_${randomUUID().replace(/-/g, "").slice(0, 24)}`,
221
+ type: "message",
222
+ role: "assistant",
223
+ content: [{ type: "text", text: pair.assistantText }],
224
+ stop_reason: "end_turn",
225
+ stop_sequence: null,
226
+ stop_details: null,
227
+ usage: {
228
+ input_tokens: 0,
229
+ cache_creation_input_tokens: 0,
230
+ cache_read_input_tokens: 0,
231
+ output_tokens: 0,
232
+ server_tool_use: { web_search_requests: 0, web_fetch_requests: 0 },
233
+ service_tier: "standard",
234
+ cache_creation: { ephemeral_1h_input_tokens: 0, ephemeral_5m_input_tokens: 0 },
235
+ inference_geo: "",
236
+ iterations: [],
237
+ speed: "standard"
238
+ },
239
+ diagnostics: null
240
+ },
241
+ requestId: `req_${randomUUID().replace(/-/g, "").slice(0, 22)}`,
242
+ type: "assistant",
243
+ uuid: assistantUuid,
244
+ timestamp: ts(),
245
+ userType: "external",
246
+ entrypoint: "sdk-ts",
247
+ cwd: cwdReal,
248
+ sessionId,
249
+ version: CLAUDE_SDK_VERSION,
250
+ gitBranch: CLAUDE_DEFAULT_GIT_BRANCH
251
+ });
252
+ lastUuid = assistantUuid;
253
+ }
254
+ const projectsDir = join2(homedir(), ".claude", "projects", encodeClaudeCwd(opts.cwd));
255
+ const path = join2(projectsDir, `${sessionId}.jsonl`);
256
+ writeJsonlFile(path, lines);
257
+ logger.info({ sessionId, path, pairs: pairs.length }, "writeClaudeRollout: synthetic rollout placed");
258
+ return { sessionId, rolloutPath: path };
259
+ }
260
+
261
+ // ../../packages/core/src/agents/claude-registry.ts
262
+ var ALIAS_MAP = {
263
+ sonnet: MODEL_SONNET,
264
+ opus: MODEL_OPUS,
265
+ fable: MODEL_FABLE
266
+ };
267
+ var VALID_ALIASES = new Set(Object.keys(ALIAS_MAP));
268
+ var VALID_EFFORTS = new Set(CLAUDE_EFFORT_VALUES);
269
+ var claudeRegistry = {
270
+ kind: "claude",
271
+ defaultModel: "sonnet",
272
+ defaultEffort: "high",
273
+ expandModelAlias(s) {
274
+ return ALIAS_MAP[s] ?? s;
275
+ },
276
+ validateModel(s) {
277
+ return VALID_ALIASES.has(s);
278
+ },
279
+ validEfforts: CLAUDE_EFFORT_VALUES,
280
+ validateEffort(s) {
281
+ return VALID_EFFORTS.has(s);
282
+ },
283
+ footerLabel(model, effort) {
284
+ return effort ? `${model} \xB7 ${effort}` : model;
285
+ },
286
+ writeRollout(opts) {
287
+ const { sessionId, rolloutPath } = writeClaudeRollout({
288
+ cwd: opts.cwd,
289
+ entries: opts.entries,
290
+ model: claudeRegistry.expandModelAlias(opts.model ?? claudeRegistry.defaultModel),
291
+ ...opts.reuseSessionId ? { sessionId: opts.reuseSessionId } : {}
292
+ });
293
+ return { sessionId, rolloutPath };
294
+ },
295
+ async forkSession({ parentSessionId, cwd, title }) {
296
+ const { forkSession } = await import("@anthropic-ai/claude-agent-sdk");
297
+ const result = await forkSession(parentSessionId, {
298
+ ...title ? { title } : {}
299
+ });
300
+ const projectsRoot = join3(homedir2(), ".claude", "projects");
301
+ const destDir = join3(projectsRoot, encodeClaudeCwd(cwd));
302
+ const destPath = join3(destDir, `${result.sessionId}.jsonl`);
303
+ if (!existsSync2(destPath)) {
304
+ const sourcePath = readdirSync(projectsRoot).map((d) => join3(projectsRoot, d, `${result.sessionId}.jsonl`)).find((p) => existsSync2(p));
305
+ if (!sourcePath) {
306
+ throw new Error(`claude forkSession: fork rollout ${result.sessionId}.jsonl not found under ${projectsRoot}`);
307
+ }
308
+ mkdirSync2(destDir, { recursive: true });
309
+ renameSync(sourcePath, destPath);
310
+ }
311
+ return {
312
+ forkId: result.sessionId,
313
+ rolloutPath: destPath
314
+ };
315
+ },
316
+ async cleanupRollouts({ cwd, sessionIds }) {
317
+ const projectsDir = join3(homedir2(), ".claude", "projects", encodeClaudeCwd(cwd));
318
+ const failures = [];
319
+ for (const sid of sessionIds) {
320
+ const path = join3(projectsDir, `${sid}.jsonl`);
321
+ try {
322
+ unlinkSync(path);
323
+ } catch (e) {
324
+ if (e?.code !== "ENOENT") {
325
+ logger.warn({ err: e, path }, "claude cleanupRollouts: unlink failed");
326
+ failures.push(e);
327
+ }
328
+ }
329
+ }
330
+ if (failures.length > 0) {
331
+ throw new AggregateError(failures, "claude cleanupRollouts failed");
332
+ }
333
+ }
334
+ };
335
+
336
+ // ../../packages/core/src/agents/rollout/codex.ts
337
+ import { randomBytes } from "crypto";
338
+ import { existsSync as existsSync3, readFileSync as readFileSync2, statSync, unlinkSync as unlinkSync2 } from "fs";
339
+ import { homedir as homedir3 } from "os";
340
+ import { join as join4 } from "path";
341
+ function codexSessionsDir() {
342
+ return join4(process.env.CODEX_HOME || join4(homedir3(), ".codex"), "sessions");
343
+ }
344
+ var _shellCache = null;
345
+ function loadCodexShell() {
346
+ if (_shellCache)
347
+ return _shellCache;
348
+ const raw = readFileSync2(join4(FIXTURES_DIR, "codex-shell.jsonl"), "utf8");
349
+ const lines = parseJsonlText(raw);
350
+ if (lines.length < 5) {
351
+ throw new Error(`loadCodexShell: expected >=5 entries in codex-shell.jsonl, got ${lines.length}`);
352
+ }
353
+ _shellCache = {
354
+ sessionMeta: lines[0],
355
+ taskStarted: lines[1],
356
+ developerSetup: lines[2],
357
+ envContext: lines[3],
358
+ turnContext: lines[4]
359
+ };
360
+ return _shellCache;
361
+ }
362
+ function uuidv7() {
363
+ const ts = Date.now();
364
+ const tsHex = ts.toString(16).padStart(12, "0");
365
+ const rand = randomBytes(10);
366
+ rand[0] = rand[0] & 15 | 112;
367
+ rand[2] = rand[2] & 63 | 128;
368
+ return [
369
+ tsHex.slice(0, 8),
370
+ tsHex.slice(8, 12),
371
+ rand.slice(0, 2).toString("hex"),
372
+ rand.slice(2, 4).toString("hex"),
373
+ rand.slice(4, 10).toString("hex")
374
+ ].join("-");
375
+ }
376
+ function patchDeveloperSetup(developerSetup) {
377
+ const payload = developerSetup.payload;
378
+ if (!payload)
379
+ return;
380
+ payload.content = [
381
+ {
382
+ type: "input_text",
383
+ text: [
384
+ "<permissions instructions>",
385
+ "Filesystem sandboxing is disabled for this runtime turn (`danger-full-access`).",
386
+ "Approval policy is `never`.",
387
+ "</permissions instructions>"
388
+ ].join(`
389
+ `)
390
+ }
391
+ ];
392
+ }
393
+ function patchEnvContext(envContext, cwd, currentDate, timezone) {
394
+ const payload = envContext.payload;
395
+ if (!payload)
396
+ return;
397
+ const content = payload.content;
398
+ if (!Array.isArray(content))
399
+ return;
400
+ for (const block of content) {
401
+ if (block.type === "input_text" && typeof block.text === "string") {
402
+ block.text = block.text.replace(/<cwd>[^<]*<\/cwd>/, `<cwd>${cwd}</cwd>`).replace(/<current_date>[^<]*<\/current_date>/, `<current_date>${currentDate}</current_date>`).replace(/<timezone>[^<]*<\/timezone>/, `<timezone>${timezone}</timezone>`);
403
+ }
404
+ }
405
+ }
406
+ function extractLatestCodexContextUsage(jsonl) {
407
+ const lines = jsonl.trimEnd().split(`
408
+ `);
409
+ for (let index = lines.length - 1;index >= 0; index -= 1) {
410
+ try {
411
+ const entry = JSON.parse(lines[index] ?? "");
412
+ if (entry.type !== "event_msg" || entry.payload?.type !== "token_count")
413
+ continue;
414
+ const contextTokens = entry.payload.info?.last_token_usage?.total_tokens;
415
+ const contextWindow = entry.payload.info?.model_context_window;
416
+ if (typeof contextTokens === "number" && Number.isFinite(contextTokens) && contextTokens >= 0 && typeof contextWindow === "number" && Number.isFinite(contextWindow) && contextWindow > 0) {
417
+ return { contextTokens, contextWindow };
418
+ }
419
+ } catch {}
420
+ }
421
+ return;
422
+ }
423
+ function readLatestCodexContextUsage(threadId) {
424
+ const sessionsDir = codexSessionsDir();
425
+ const candidates = [];
426
+ const buckets = candidateDateBuckets(threadId);
427
+ try {
428
+ if (buckets) {
429
+ for (const bucket of buckets) {
430
+ const dir = join4(sessionsDir, bucket);
431
+ if (!existsSync3(dir))
432
+ continue;
433
+ const glob = new Bun.Glob(`rollout-*-${threadId}.jsonl`);
434
+ for (const rel of glob.scanSync({ cwd: dir, onlyFiles: true })) {
435
+ candidates.push(join4(dir, rel));
436
+ }
437
+ }
438
+ } else {
439
+ const glob = new Bun.Glob(`**/rollout-*-${threadId}.jsonl`);
440
+ for (const rel of glob.scanSync({ cwd: sessionsDir, onlyFiles: true })) {
441
+ candidates.push(join4(sessionsDir, rel));
442
+ }
443
+ }
444
+ const path = candidates.sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs)[0];
445
+ return path ? extractLatestCodexContextUsage(readFileSync2(path, "utf8")) : undefined;
446
+ } catch (error) {
447
+ logger.debug({ error, threadId }, "codex context usage: rollout read failed");
448
+ return;
449
+ }
450
+ }
451
+ function migrateCodexRolloutNativeMultiAgentMetadata(threadId) {
452
+ const path = latestCodexRolloutPath(threadId);
453
+ if (!path)
454
+ return false;
455
+ try {
456
+ const entries = parseJsonlText(readFileSync2(path, "utf8"));
457
+ let changed = false;
458
+ for (const entry of entries) {
459
+ if (entry.type !== "session_meta" && entry.type !== "turn_context")
460
+ continue;
461
+ if (!entry.payload)
462
+ entry.payload = {};
463
+ if (entry.payload.multi_agent_version !== "disabled") {
464
+ entry.payload.multi_agent_version = "disabled";
465
+ changed = true;
466
+ }
467
+ }
468
+ if (changed) {
469
+ writeJsonlFile(path, entries);
470
+ logger.info({ threadId, path }, "codex rollout native multi-agent metadata disabled");
471
+ }
472
+ return changed;
473
+ } catch (error) {
474
+ logger.error({ error, threadId, path }, "codex rollout native multi-agent migration failed");
475
+ throw new Error(`Failed to migrate Codex rollout '${threadId}'`, { cause: error });
476
+ }
477
+ }
478
+ function latestCodexRolloutPath(threadId) {
479
+ const sessionsDir = codexSessionsDir();
480
+ const candidates = [];
481
+ const buckets = candidateDateBuckets(threadId);
482
+ try {
483
+ if (buckets) {
484
+ for (const bucket of buckets) {
485
+ const dir = join4(sessionsDir, bucket);
486
+ if (!existsSync3(dir))
487
+ continue;
488
+ const glob = new Bun.Glob(`rollout-*-${threadId}.jsonl`);
489
+ for (const rel of glob.scanSync({ cwd: dir, onlyFiles: true })) {
490
+ candidates.push(join4(dir, rel));
491
+ }
492
+ }
493
+ }
494
+ if (candidates.length === 0) {
495
+ const glob = new Bun.Glob(`**/rollout-*-${threadId}.jsonl`);
496
+ for (const rel of glob.scanSync({ cwd: sessionsDir, onlyFiles: true })) {
497
+ candidates.push(join4(sessionsDir, rel));
498
+ }
499
+ }
500
+ return candidates.sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs)[0];
501
+ } catch (error) {
502
+ logger.debug({ error, threadId }, "codex rollout lookup failed");
503
+ return;
504
+ }
505
+ }
506
+ function writeCodexRollout(opts) {
507
+ const threadId = opts.threadId ?? uuidv7();
508
+ assertUuidLike("threadId", threadId);
509
+ ensureCwdExists(opts.cwd);
510
+ const pairs = opts.pairs ?? extractChatPairs(opts.entries ?? []);
511
+ const now = new Date;
512
+ const tsIso = now.toISOString();
513
+ const currentDate = [
514
+ now.getFullYear(),
515
+ String(now.getMonth() + 1).padStart(2, "0"),
516
+ String(now.getDate()).padStart(2, "0")
517
+ ].join("-");
518
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone || process.env.TZ || "UTC";
519
+ const shell = loadCodexShell();
520
+ const sessionMeta = clone(shell.sessionMeta);
521
+ sessionMeta.payload.id = threadId;
522
+ sessionMeta.payload.timestamp = tsIso;
523
+ sessionMeta.payload.cwd = opts.cwd;
524
+ sessionMeta.payload.multi_agent_version = "disabled";
525
+ sessionMeta.timestamp = tsIso;
526
+ const taskStarted = clone(shell.taskStarted);
527
+ taskStarted.timestamp = tsIso;
528
+ const developerSetup = clone(shell.developerSetup);
529
+ developerSetup.timestamp = tsIso;
530
+ patchDeveloperSetup(developerSetup);
531
+ const envContext = clone(shell.envContext);
532
+ envContext.timestamp = tsIso;
533
+ patchEnvContext(envContext, opts.cwd, currentDate, timezone);
534
+ const turnContext = clone(shell.turnContext);
535
+ turnContext.timestamp = tsIso;
536
+ const turnPayload = turnContext.payload;
537
+ turnPayload.cwd = opts.cwd;
538
+ turnPayload.current_date = currentDate;
539
+ turnPayload.timezone = timezone;
540
+ turnPayload.approval_policy = "never";
541
+ turnPayload.sandbox_policy = { type: "danger-full-access" };
542
+ turnPayload.multi_agent_version = "disabled";
543
+ delete turnPayload.permission_profile;
544
+ if (opts.model)
545
+ turnPayload.model = opts.model;
546
+ const collaborationMode = turnPayload.collaboration_mode;
547
+ const collaborationSettings = collaborationMode?.settings;
548
+ if (collaborationSettings) {
549
+ if (opts.model)
550
+ collaborationSettings.model = opts.model;
551
+ if (opts.effort !== undefined)
552
+ collaborationSettings.reasoning_effort = opts.effort;
553
+ }
554
+ const lines = [sessionMeta, taskStarted, developerSetup, envContext, turnContext];
555
+ for (const pair of pairs) {
556
+ lines.push({
557
+ timestamp: tsIso,
558
+ type: "response_item",
559
+ payload: {
560
+ type: "message",
561
+ role: "user",
562
+ content: [{ type: "input_text", text: pair.userText }]
563
+ }
564
+ });
565
+ lines.push({
566
+ timestamp: tsIso,
567
+ type: "event_msg",
568
+ payload: {
569
+ type: "user_message",
570
+ message: pair.userText,
571
+ images: [],
572
+ local_images: [],
573
+ text_elements: []
574
+ }
575
+ });
576
+ lines.push({
577
+ timestamp: tsIso,
578
+ type: "event_msg",
579
+ payload: {
580
+ type: "agent_message",
581
+ message: pair.assistantText,
582
+ phase: "final_answer",
583
+ memory_citation: null
584
+ }
585
+ });
586
+ lines.push({
587
+ timestamp: tsIso,
588
+ type: "response_item",
589
+ payload: {
590
+ type: "message",
591
+ role: "assistant",
592
+ content: [{ type: "output_text", text: pair.assistantText }],
593
+ phase: "final_answer"
594
+ }
595
+ });
596
+ }
597
+ lines.push({
598
+ timestamp: tsIso,
599
+ type: "event_msg",
600
+ payload: { type: "task_complete" }
601
+ });
602
+ const yyyy = now.getUTCFullYear();
603
+ const mm = String(now.getUTCMonth() + 1).padStart(2, "0");
604
+ const dd = String(now.getUTCDate()).padStart(2, "0");
605
+ const tsStr = tsIso.replace(/[:.]/g, "-").slice(0, 19);
606
+ const dir = join4(codexSessionsDir(), String(yyyy), mm, dd);
607
+ const path = join4(dir, `rollout-${tsStr}-${threadId}.jsonl`);
608
+ if (opts.threadId) {
609
+ sweepPriorRolloutsForThread(opts.threadId);
610
+ }
611
+ writeJsonlFile(path, lines);
612
+ logger.info({ threadId, path, pairs: pairs.length }, "writeCodexRollout: synthetic rollout placed");
613
+ return { threadId, rolloutPath: path };
614
+ }
615
+ function sweepPriorRolloutsForThread(threadId) {
616
+ const sessionsDir = codexSessionsDir();
617
+ const buckets = candidateDateBuckets(threadId);
618
+ if (!buckets) {
619
+ sweepPriorRolloutsFullTree(threadId, sessionsDir);
620
+ return;
621
+ }
622
+ for (const bucket of buckets) {
623
+ const dir = join4(sessionsDir, bucket);
624
+ if (!existsSync3(dir))
625
+ continue;
626
+ try {
627
+ const glob = new Bun.Glob(`rollout-*-${threadId}.jsonl`);
628
+ for (const rel of glob.scanSync({ cwd: dir, onlyFiles: true })) {
629
+ const fullPath = join4(dir, rel);
630
+ try {
631
+ unlinkSync2(fullPath);
632
+ } catch (e) {
633
+ if (e?.code !== "ENOENT") {
634
+ logger.warn({ err: e, path: fullPath }, "writeCodexRollout: prior-rollout unlink failed (continuing)");
635
+ }
636
+ }
637
+ }
638
+ } catch (e) {
639
+ logger.warn({ err: e, threadId, bucket }, "writeCodexRollout: prior-rollout bucket scan failed (continuing)");
640
+ }
641
+ }
642
+ }
643
+ function sweepPriorRolloutsFullTree(threadId, sessionsDir) {
644
+ try {
645
+ const glob = new Bun.Glob(`**/rollout-*-${threadId}.jsonl`);
646
+ for (const rel of glob.scanSync({ cwd: sessionsDir, onlyFiles: true })) {
647
+ const fullPath = join4(sessionsDir, rel);
648
+ try {
649
+ unlinkSync2(fullPath);
650
+ } catch (e) {
651
+ if (e?.code !== "ENOENT") {
652
+ logger.warn({ err: e, path: fullPath }, "writeCodexRollout: prior-rollout unlink failed (continuing)");
653
+ }
654
+ }
655
+ }
656
+ } catch (e) {
657
+ logger.warn({ err: e, threadId }, "writeCodexRollout: full-tree prior-rollout sweep failed (continuing)");
658
+ }
659
+ }
660
+ var MAX_DAY_SPAN = 30;
661
+ var DAY_MS = 86400000;
662
+ var LOCAL_DATE_SKEW_DAYS = 1;
663
+ function candidateDateBuckets(threadId) {
664
+ const tidMs = decodeUuidV7Timestamp(threadId);
665
+ if (tidMs === null)
666
+ return null;
667
+ const nowMs = Date.now();
668
+ const tidDay = Math.floor(tidMs / DAY_MS);
669
+ const todayDay = Math.floor(nowMs / DAY_MS);
670
+ const minDay = Math.min(tidDay, todayDay);
671
+ const maxDay = Math.max(tidDay, todayDay);
672
+ const span = maxDay - minDay;
673
+ if (span > MAX_DAY_SPAN)
674
+ return null;
675
+ const buckets = new Set;
676
+ for (let d = minDay - LOCAL_DATE_SKEW_DAYS;d <= maxDay + LOCAL_DATE_SKEW_DAYS; d++) {
677
+ buckets.add(formatDateBucket(new Date(d * DAY_MS)));
678
+ }
679
+ return buckets;
680
+ }
681
+ function decodeUuidV7Timestamp(threadId) {
682
+ if (typeof threadId !== "string")
683
+ return null;
684
+ const m = /^([0-9a-fA-F]{8})-([0-9a-fA-F]{4})-7[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.exec(threadId);
685
+ if (!m)
686
+ return null;
687
+ const hex = `${m[1]}${m[2]}`;
688
+ const ms = Number.parseInt(hex, 16);
689
+ if (!Number.isFinite(ms))
690
+ return null;
691
+ const MIN = 1577836800000;
692
+ const MAX = 4102444800000;
693
+ if (ms < MIN || ms > MAX)
694
+ return null;
695
+ return ms;
696
+ }
697
+ function formatDateBucket(d) {
698
+ const yyyy = d.getUTCFullYear();
699
+ const mm = String(d.getUTCMonth() + 1).padStart(2, "0");
700
+ const dd = String(d.getUTCDate()).padStart(2, "0");
701
+ return `${yyyy}/${mm}/${dd}`;
702
+ }
703
+
704
+ export { encodeClaudeCwd, claudeRegistry, readLatestCodexContextUsage, migrateCodexRolloutNativeMultiAgentMetadata, writeCodexRollout };
705
+
706
+ //# debugId=1D492EB711EDE86B64756E2164756E21