@ai-studio-3d/vyasa 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +69 -0
  2. package/data/common-kit.json +34 -0
  3. package/data/pricing.json +119 -0
  4. package/data/schema/AnalyticsData.json +214 -0
  5. package/data/schema/FoundationData.json +42 -0
  6. package/data/schema/KitData.json +321 -0
  7. package/data/schema/SearchData.json +173 -0
  8. package/data/schema/SessionDetailData.json +231 -0
  9. package/data/schema/SessionsListData.json +115 -0
  10. package/data/schema/WasteData.json +95 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +343 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/core/billing/index.d.ts +4 -0
  16. package/dist/core/billing/index.d.ts.map +1 -0
  17. package/dist/core/billing/index.js +43 -0
  18. package/dist/core/billing/index.js.map +1 -0
  19. package/dist/core/budget/index.d.ts +30 -0
  20. package/dist/core/budget/index.d.ts.map +1 -0
  21. package/dist/core/budget/index.js +61 -0
  22. package/dist/core/budget/index.js.map +1 -0
  23. package/dist/core/codex/index.d.ts +3 -0
  24. package/dist/core/codex/index.d.ts.map +1 -0
  25. package/dist/core/codex/index.js +212 -0
  26. package/dist/core/codex/index.js.map +1 -0
  27. package/dist/core/cursor/index.d.ts +3 -0
  28. package/dist/core/cursor/index.d.ts.map +1 -0
  29. package/dist/core/cursor/index.js +304 -0
  30. package/dist/core/cursor/index.js.map +1 -0
  31. package/dist/core/cursor/scan.d.ts +28 -0
  32. package/dist/core/cursor/scan.d.ts.map +1 -0
  33. package/dist/core/cursor/scan.js +79 -0
  34. package/dist/core/cursor/scan.js.map +1 -0
  35. package/dist/core/decisions/index.d.ts +21 -0
  36. package/dist/core/decisions/index.d.ts.map +1 -0
  37. package/dist/core/decisions/index.js +133 -0
  38. package/dist/core/decisions/index.js.map +1 -0
  39. package/dist/core/dlp/index.d.ts +7 -0
  40. package/dist/core/dlp/index.d.ts.map +1 -0
  41. package/dist/core/dlp/index.js +115 -0
  42. package/dist/core/dlp/index.js.map +1 -0
  43. package/dist/core/health/index.d.ts +10 -0
  44. package/dist/core/health/index.d.ts.map +1 -0
  45. package/dist/core/health/index.js +21 -0
  46. package/dist/core/health/index.js.map +1 -0
  47. package/dist/core/index/index.d.ts +9 -0
  48. package/dist/core/index/index.d.ts.map +1 -0
  49. package/dist/core/index/index.js +103 -0
  50. package/dist/core/index/index.js.map +1 -0
  51. package/dist/core/index/ingest.d.ts +16 -0
  52. package/dist/core/index/ingest.d.ts.map +1 -0
  53. package/dist/core/index/ingest.js +184 -0
  54. package/dist/core/index/ingest.js.map +1 -0
  55. package/dist/core/index/platforms.d.ts +21 -0
  56. package/dist/core/index/platforms.d.ts.map +1 -0
  57. package/dist/core/index/platforms.js +44 -0
  58. package/dist/core/index/platforms.js.map +1 -0
  59. package/dist/core/index/pricing-map.d.ts +10 -0
  60. package/dist/core/index/pricing-map.d.ts.map +1 -0
  61. package/dist/core/index/pricing-map.js +16 -0
  62. package/dist/core/index/pricing-map.js.map +1 -0
  63. package/dist/core/index/progress.d.ts +26 -0
  64. package/dist/core/index/progress.d.ts.map +1 -0
  65. package/dist/core/index/progress.js +59 -0
  66. package/dist/core/index/progress.js.map +1 -0
  67. package/dist/core/index/scan.d.ts +9 -0
  68. package/dist/core/index/scan.d.ts.map +1 -0
  69. package/dist/core/index/scan.js +42 -0
  70. package/dist/core/index/scan.js.map +1 -0
  71. package/dist/core/index/statements.d.ts +18 -0
  72. package/dist/core/index/statements.d.ts.map +1 -0
  73. package/dist/core/index/statements.js +82 -0
  74. package/dist/core/index/statements.js.map +1 -0
  75. package/dist/core/index/tail.d.ts +42 -0
  76. package/dist/core/index/tail.d.ts.map +1 -0
  77. package/dist/core/index/tail.js +123 -0
  78. package/dist/core/index/tail.js.map +1 -0
  79. package/dist/core/jsonl/index.d.ts +3 -0
  80. package/dist/core/jsonl/index.d.ts.map +1 -0
  81. package/dist/core/jsonl/index.js +106 -0
  82. package/dist/core/jsonl/index.js.map +1 -0
  83. package/dist/core/jsonl-validate/index.d.ts +10 -0
  84. package/dist/core/jsonl-validate/index.d.ts.map +1 -0
  85. package/dist/core/jsonl-validate/index.js +40 -0
  86. package/dist/core/jsonl-validate/index.js.map +1 -0
  87. package/dist/core/kit/detection.d.ts +94 -0
  88. package/dist/core/kit/detection.d.ts.map +1 -0
  89. package/dist/core/kit/detection.js +312 -0
  90. package/dist/core/kit/detection.js.map +1 -0
  91. package/dist/core/kit/index.d.ts +12 -0
  92. package/dist/core/kit/index.d.ts.map +1 -0
  93. package/dist/core/kit/index.js +131 -0
  94. package/dist/core/kit/index.js.map +1 -0
  95. package/dist/core/kit/scan.d.ts +28 -0
  96. package/dist/core/kit/scan.d.ts.map +1 -0
  97. package/dist/core/kit/scan.js +432 -0
  98. package/dist/core/kit/scan.js.map +1 -0
  99. package/dist/core/recap/index.d.ts +18 -0
  100. package/dist/core/recap/index.d.ts.map +1 -0
  101. package/dist/core/recap/index.js +88 -0
  102. package/dist/core/recap/index.js.map +1 -0
  103. package/dist/core/repetition/index.d.ts +5 -0
  104. package/dist/core/repetition/index.d.ts.map +1 -0
  105. package/dist/core/repetition/index.js +0 -0
  106. package/dist/core/repetition/index.js.map +1 -0
  107. package/dist/core/schema/index.d.ts +514 -0
  108. package/dist/core/schema/index.d.ts.map +1 -0
  109. package/dist/core/schema/index.js +2 -0
  110. package/dist/core/schema/index.js.map +1 -0
  111. package/dist/core/schema-watch/index.d.ts +34 -0
  112. package/dist/core/schema-watch/index.d.ts.map +1 -0
  113. package/dist/core/schema-watch/index.js +87 -0
  114. package/dist/core/schema-watch/index.js.map +1 -0
  115. package/dist/core/search/index.d.ts +44 -0
  116. package/dist/core/search/index.d.ts.map +1 -0
  117. package/dist/core/search/index.js +641 -0
  118. package/dist/core/search/index.js.map +1 -0
  119. package/dist/core/settings/index.d.ts +24 -0
  120. package/dist/core/settings/index.d.ts.map +1 -0
  121. package/dist/core/settings/index.js +76 -0
  122. package/dist/core/settings/index.js.map +1 -0
  123. package/dist/core/share/bundle.d.ts +40 -0
  124. package/dist/core/share/bundle.d.ts.map +1 -0
  125. package/dist/core/share/bundle.js +158 -0
  126. package/dist/core/share/bundle.js.map +1 -0
  127. package/dist/core/share/canonical/from-claude.d.ts +13 -0
  128. package/dist/core/share/canonical/from-claude.d.ts.map +1 -0
  129. package/dist/core/share/canonical/from-claude.js +129 -0
  130. package/dist/core/share/canonical/from-claude.js.map +1 -0
  131. package/dist/core/share/canonical/from-codex.d.ts +18 -0
  132. package/dist/core/share/canonical/from-codex.d.ts.map +1 -0
  133. package/dist/core/share/canonical/from-codex.js +183 -0
  134. package/dist/core/share/canonical/from-codex.js.map +1 -0
  135. package/dist/core/share/canonical/to-claude.d.ts +15 -0
  136. package/dist/core/share/canonical/to-claude.d.ts.map +1 -0
  137. package/dist/core/share/canonical/to-claude.js +146 -0
  138. package/dist/core/share/canonical/to-claude.js.map +1 -0
  139. package/dist/core/share/canonical/to-codex.d.ts +21 -0
  140. package/dist/core/share/canonical/to-codex.d.ts.map +1 -0
  141. package/dist/core/share/canonical/to-codex.js +124 -0
  142. package/dist/core/share/canonical/to-codex.js.map +1 -0
  143. package/dist/core/share/canonical/tool-map.d.ts +61 -0
  144. package/dist/core/share/canonical/tool-map.d.ts.map +1 -0
  145. package/dist/core/share/canonical/tool-map.js +299 -0
  146. package/dist/core/share/canonical/tool-map.js.map +1 -0
  147. package/dist/core/share/canonical/types.d.ts +57 -0
  148. package/dist/core/share/canonical/types.d.ts.map +1 -0
  149. package/dist/core/share/canonical/types.js +9 -0
  150. package/dist/core/share/canonical/types.js.map +1 -0
  151. package/dist/core/share/import.d.ts +28 -0
  152. package/dist/core/share/import.d.ts.map +1 -0
  153. package/dist/core/share/import.js +174 -0
  154. package/dist/core/share/import.js.map +1 -0
  155. package/dist/core/share/manifest.d.ts +37 -0
  156. package/dist/core/share/manifest.d.ts.map +1 -0
  157. package/dist/core/share/manifest.js +31 -0
  158. package/dist/core/share/manifest.js.map +1 -0
  159. package/dist/core/share/preview.d.ts +4 -0
  160. package/dist/core/share/preview.d.ts.map +1 -0
  161. package/dist/core/share/preview.js +153 -0
  162. package/dist/core/share/preview.js.map +1 -0
  163. package/dist/core/share/primer.d.ts +19 -0
  164. package/dist/core/share/primer.d.ts.map +1 -0
  165. package/dist/core/share/primer.js +196 -0
  166. package/dist/core/share/primer.js.map +1 -0
  167. package/dist/core/share/resume.d.ts +10 -0
  168. package/dist/core/share/resume.d.ts.map +1 -0
  169. package/dist/core/share/resume.js +58 -0
  170. package/dist/core/share/resume.js.map +1 -0
  171. package/dist/core/share/scrub.d.ts +10 -0
  172. package/dist/core/share/scrub.d.ts.map +1 -0
  173. package/dist/core/share/scrub.js +198 -0
  174. package/dist/core/share/scrub.js.map +1 -0
  175. package/dist/core/share/tar.d.ts +12 -0
  176. package/dist/core/share/tar.d.ts.map +1 -0
  177. package/dist/core/share/tar.js +78 -0
  178. package/dist/core/share/tar.js.map +1 -0
  179. package/dist/core/tags/index.d.ts +48 -0
  180. package/dist/core/tags/index.d.ts.map +1 -0
  181. package/dist/core/tags/index.js +113 -0
  182. package/dist/core/tags/index.js.map +1 -0
  183. package/dist/core/today/index.d.ts +25 -0
  184. package/dist/core/today/index.d.ts.map +1 -0
  185. package/dist/core/today/index.js +42 -0
  186. package/dist/core/today/index.js.map +1 -0
  187. package/dist/core/waste/abandoned.d.ts +12 -0
  188. package/dist/core/waste/abandoned.d.ts.map +1 -0
  189. package/dist/core/waste/abandoned.js +127 -0
  190. package/dist/core/waste/abandoned.js.map +1 -0
  191. package/dist/core/waste/cache-miss.d.ts +9 -0
  192. package/dist/core/waste/cache-miss.d.ts.map +1 -0
  193. package/dist/core/waste/cache-miss.js +84 -0
  194. package/dist/core/waste/cache-miss.js.map +1 -0
  195. package/dist/core/waste/index.d.ts +12 -0
  196. package/dist/core/waste/index.d.ts.map +1 -0
  197. package/dist/core/waste/index.js +45 -0
  198. package/dist/core/waste/index.js.map +1 -0
  199. package/dist/core/waste/wrong-model.d.ts +11 -0
  200. package/dist/core/waste/wrong-model.d.ts.map +1 -0
  201. package/dist/core/waste/wrong-model.js +104 -0
  202. package/dist/core/waste/wrong-model.js.map +1 -0
  203. package/dist/db/index.d.ts +10 -0
  204. package/dist/db/index.d.ts.map +1 -0
  205. package/dist/db/index.js +29 -0
  206. package/dist/db/index.js.map +1 -0
  207. package/dist/db/migrate.d.ts +8 -0
  208. package/dist/db/migrate.d.ts.map +1 -0
  209. package/dist/db/migrate.js +282 -0
  210. package/dist/db/migrate.js.map +1 -0
  211. package/dist/server/events.d.ts +4 -0
  212. package/dist/server/events.d.ts.map +1 -0
  213. package/dist/server/events.js +54 -0
  214. package/dist/server/events.js.map +1 -0
  215. package/dist/server/index.d.ts +7 -0
  216. package/dist/server/index.d.ts.map +1 -0
  217. package/dist/server/index.js +238 -0
  218. package/dist/server/index.js.map +1 -0
  219. package/dist/server/routes/foundation.d.ts +2 -0
  220. package/dist/server/routes/foundation.d.ts.map +1 -0
  221. package/dist/server/routes/foundation.js +2 -0
  222. package/dist/server/routes/foundation.js.map +1 -0
  223. package/dist/server/routes/search.d.ts +2 -0
  224. package/dist/server/routes/search.d.ts.map +1 -0
  225. package/dist/server/routes/search.js +2 -0
  226. package/dist/server/routes/search.js.map +1 -0
  227. package/dist/server/routes/sessions.d.ts +2 -0
  228. package/dist/server/routes/sessions.d.ts.map +1 -0
  229. package/dist/server/routes/sessions.js +2 -0
  230. package/dist/server/routes/sessions.js.map +1 -0
  231. package/dist/server/routes/waste.d.ts +2 -0
  232. package/dist/server/routes/waste.d.ts.map +1 -0
  233. package/dist/server/routes/waste.js +2 -0
  234. package/dist/server/routes/waste.js.map +1 -0
  235. package/dist/web/assets/index-Ba1VvTj0.js +37 -0
  236. package/dist/web/index.html +12 -0
  237. package/package.json +76 -0
@@ -0,0 +1,183 @@
1
+ import { codexCallToClaude } from './tool-map.js';
2
+ /**
3
+ * Parse a Codex rollout JSONL string into the canonical session model.
4
+ *
5
+ * Top-level envelope (verified against openai/codex protocol.rs RolloutItem):
6
+ * { timestamp, type, payload } where type ∈ {session_meta, turn_context,
7
+ * response_item, event_msg, compacted}.
8
+ *
9
+ * response_item.payload.type ∈ {message, function_call, function_call_output,
10
+ * custom_tool_call, custom_tool_call_output, reasoning}.
11
+ *
12
+ * Tool calls are translated to canonical Claude-shape (Bash / Write / Edit /
13
+ * etc.) via codexCallToClaude. Their tool_results are paired by call_id.
14
+ * event_msg + compacted records are ignored — runtime UI events / summaries,
15
+ * not durable session state.
16
+ */
17
+ export function fromCodexJsonl(jsonl) {
18
+ const blocks = [];
19
+ let sessionId = '';
20
+ let project = null;
21
+ let startedAt = null;
22
+ let endedAt = null;
23
+ let sourceCliVersion = null;
24
+ let currentModel = 'unknown';
25
+ for (const line of jsonl.split('\n')) {
26
+ const trimmed = line.trim();
27
+ if (!trimmed)
28
+ continue;
29
+ let env;
30
+ try {
31
+ env = JSON.parse(trimmed);
32
+ }
33
+ catch {
34
+ continue;
35
+ }
36
+ const type = env['type'];
37
+ const ts = typeof env['timestamp'] === 'string' ? env['timestamp'] : '';
38
+ const payload = env['payload'];
39
+ if (!payload)
40
+ continue;
41
+ if (type === 'session_meta') {
42
+ sessionId = stringOf(payload['id']) ?? sessionId;
43
+ project = stringOf(payload['cwd']) ?? project;
44
+ const metaTs = stringOf(payload['timestamp']) ?? ts;
45
+ if (metaTs && !startedAt)
46
+ startedAt = metaTs;
47
+ sourceCliVersion = stringOf(payload['cli_version']) ?? sourceCliVersion;
48
+ }
49
+ else if (type === 'turn_context') {
50
+ const model = stringOf(payload['model']);
51
+ if (model)
52
+ currentModel = model;
53
+ }
54
+ else if (type === 'response_item') {
55
+ const innerType = payload['type'];
56
+ if (innerType === 'message') {
57
+ blocks.push(...fromCodexMessage(payload, ts, currentModel));
58
+ }
59
+ else if (innerType === 'function_call') {
60
+ const block = fromCodexFunctionCall(payload, ts, currentModel);
61
+ if (block)
62
+ blocks.push(block);
63
+ }
64
+ else if (innerType === 'function_call_output' || innerType === 'custom_tool_call_output') {
65
+ const block = fromCodexFunctionCallOutput(payload, ts);
66
+ if (block)
67
+ blocks.push(block);
68
+ }
69
+ else if (innerType === 'custom_tool_call') {
70
+ const block = fromCodexCustomToolCall(payload, ts, currentModel);
71
+ if (block)
72
+ blocks.push(block);
73
+ }
74
+ else if (innerType === 'reasoning') {
75
+ blocks.push({ kind: 'reasoning_opaque', ts });
76
+ }
77
+ }
78
+ // event_msg / compacted / unknown top-types → ignore
79
+ if (ts)
80
+ endedAt = ts;
81
+ }
82
+ return {
83
+ sessionId,
84
+ platform: 'codex',
85
+ project,
86
+ startedAt,
87
+ endedAt,
88
+ sourceCliVersion,
89
+ blocks,
90
+ };
91
+ }
92
+ function fromCodexMessage(payload, ts, model) {
93
+ const role = stringOf(payload['role']) ?? 'user';
94
+ const content = payload['content'];
95
+ if (!Array.isArray(content))
96
+ return [];
97
+ const parts = [];
98
+ for (const item of content) {
99
+ if (!item || typeof item !== 'object')
100
+ continue;
101
+ const it = item;
102
+ const t = it['type'];
103
+ if (t === 'input_text' || t === 'output_text') {
104
+ const txt = stringOf(it['text']);
105
+ if (txt)
106
+ parts.push(txt);
107
+ }
108
+ // input_image: dropped for v1 (no Claude image transport)
109
+ }
110
+ if (parts.length === 0)
111
+ return [];
112
+ const text = parts.join('');
113
+ if (role === 'assistant') {
114
+ return [{ kind: 'assistant_text', text, ts, model }];
115
+ }
116
+ if (role === 'user') {
117
+ return [{ kind: 'user_text', text, ts }];
118
+ }
119
+ // developer / system → system_text
120
+ return [{ kind: 'system_text', text, subtype: role, ts }];
121
+ }
122
+ function fromCodexFunctionCall(payload, ts, model) {
123
+ const name = stringOf(payload['name']);
124
+ const callId = stringOf(payload['call_id']);
125
+ const args = stringOf(payload['arguments']) ?? '{}';
126
+ if (!name || !callId)
127
+ return null;
128
+ const codexPayload = { kind: 'function_call', name, arguments: args };
129
+ const claude = codexCallToClaude(codexPayload);
130
+ return {
131
+ kind: 'tool_call',
132
+ tool: claude.name,
133
+ args: claude.input,
134
+ callId,
135
+ ts,
136
+ model,
137
+ };
138
+ }
139
+ function fromCodexCustomToolCall(payload, ts, model) {
140
+ const name = stringOf(payload['name']);
141
+ const callId = stringOf(payload['call_id']);
142
+ const input = stringOf(payload['input']) ?? '';
143
+ if (!name || !callId)
144
+ return null;
145
+ const codexPayload = { kind: 'custom_tool_call', name, input };
146
+ const claude = codexCallToClaude(codexPayload);
147
+ return {
148
+ kind: 'tool_call',
149
+ tool: claude.name,
150
+ args: claude.input,
151
+ callId,
152
+ ts,
153
+ model,
154
+ };
155
+ }
156
+ function fromCodexFunctionCallOutput(payload, ts) {
157
+ const callId = stringOf(payload['call_id']);
158
+ if (!callId)
159
+ return null;
160
+ const rawOutput = payload['output'];
161
+ let output;
162
+ if (typeof rawOutput === 'string') {
163
+ output = rawOutput;
164
+ }
165
+ else if (rawOutput && typeof rawOutput === 'object') {
166
+ // FunctionCallOutputPayload object: extract `output` if present, else stringify
167
+ const obj = rawOutput;
168
+ if (typeof obj['output'] === 'string') {
169
+ output = obj['output'];
170
+ }
171
+ else {
172
+ output = JSON.stringify(rawOutput);
173
+ }
174
+ }
175
+ else {
176
+ output = '';
177
+ }
178
+ return { kind: 'tool_result', callId, output, ts };
179
+ }
180
+ function stringOf(v) {
181
+ return typeof v === 'string' ? v : undefined;
182
+ }
183
+ //# sourceMappingURL=from-codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-codex.js","sourceRoot":"","sources":["../../../../src/core/share/canonical/from-codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CanonicalSession } from './types.js';
2
+ import { codexCallToClaude } from './tool-map.js';
3
+ /**
4
+ * Render a CanonicalSession as Claude Code JSONL bytes.
5
+ *
6
+ * Groups blocks into Claude's UserRecord / AssistantRecord / SystemRecord shape:
7
+ * - Consecutive assistant_text + tool_call + thinking blocks → one assistant record
8
+ * - Consecutive user_text + tool_result blocks → one user record
9
+ * - system_text → its own system record
10
+ *
11
+ * Synthesises uuid/parentUuid chains. Drops `reasoning_opaque` blocks (Codex-only).
12
+ */
13
+ export declare function toClaudeJsonl(session: CanonicalSession): string;
14
+ export { codexCallToClaude };
15
+ //# sourceMappingURL=to-claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-claude.d.ts","sourceRoot":"","sources":["../../../../src/core/share/canonical/to-claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA6E/D;AA0ED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,146 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { codexCallToClaude } from './tool-map.js';
3
+ /**
4
+ * Render a CanonicalSession as Claude Code JSONL bytes.
5
+ *
6
+ * Groups blocks into Claude's UserRecord / AssistantRecord / SystemRecord shape:
7
+ * - Consecutive assistant_text + tool_call + thinking blocks → one assistant record
8
+ * - Consecutive user_text + tool_result blocks → one user record
9
+ * - system_text → its own system record
10
+ *
11
+ * Synthesises uuid/parentUuid chains. Drops `reasoning_opaque` blocks (Codex-only).
12
+ */
13
+ export function toClaudeJsonl(session) {
14
+ const lines = [];
15
+ let parentUuid = null;
16
+ let prevAssistantUuid = null;
17
+ for (const turn of groupIntoTurns(session.blocks)) {
18
+ const uuid = randomUUID();
19
+ let recordTs = turn.blocks[0]?.ts ?? session.startedAt ?? new Date().toISOString();
20
+ if (turn.role === 'user') {
21
+ const content = turn.blocks.map((b) => userBlockToClaude(b)).filter(notNull);
22
+ // Collapse to a string if there's exactly one text block (Claude's natural compact shape)
23
+ const messageContent = content.length === 1 && content[0].type === 'text'
24
+ ? content[0].text
25
+ : content;
26
+ const record = {
27
+ parentUuid,
28
+ isSidechain: false,
29
+ type: 'user',
30
+ message: { role: 'user', content: messageContent },
31
+ uuid,
32
+ timestamp: recordTs,
33
+ sessionId: session.sessionId,
34
+ userType: 'external',
35
+ cwd: session.project ?? undefined,
36
+ };
37
+ lines.push(JSON.stringify(record));
38
+ parentUuid = uuid;
39
+ }
40
+ else if (turn.role === 'assistant') {
41
+ const content = turn.blocks.map((b) => assistantBlockToClaude(b)).filter(notNull);
42
+ const model = turn.blocks
43
+ .map((b) => (b.kind === 'assistant_text' || b.kind === 'tool_call' ? b.model : undefined))
44
+ .find((m) => typeof m === 'string') ?? 'unknown';
45
+ const record = {
46
+ parentUuid,
47
+ isSidechain: false,
48
+ message: {
49
+ model,
50
+ id: `msg_${uuid.slice(0, 24).replace(/-/g, '')}`,
51
+ type: 'message',
52
+ role: 'assistant',
53
+ content,
54
+ },
55
+ type: 'assistant',
56
+ uuid,
57
+ timestamp: recordTs,
58
+ sessionId: session.sessionId,
59
+ };
60
+ lines.push(JSON.stringify(record));
61
+ parentUuid = uuid;
62
+ prevAssistantUuid = uuid;
63
+ }
64
+ else if (turn.role === 'system') {
65
+ const text = turn.blocks
66
+ .filter((b) => b.kind === 'system_text')
67
+ .map((b) => b.text)
68
+ .join('\n');
69
+ const subtype = turn.blocks[0]?.subtype ?? 'message';
70
+ const record = {
71
+ parentUuid: prevAssistantUuid ?? parentUuid,
72
+ isSidechain: false,
73
+ type: 'system',
74
+ subtype,
75
+ content: text,
76
+ isMeta: false,
77
+ timestamp: recordTs,
78
+ uuid,
79
+ sessionId: session.sessionId,
80
+ };
81
+ lines.push(JSON.stringify(record));
82
+ // System records typically don't update parentUuid for the next user turn
83
+ }
84
+ }
85
+ return lines.join('\n') + (lines.length ? '\n' : '');
86
+ }
87
+ function groupIntoTurns(blocks) {
88
+ const turns = [];
89
+ let current = null;
90
+ for (const block of blocks) {
91
+ const role = roleOf(block);
92
+ if (!role)
93
+ continue;
94
+ if (!current || current.role !== role) {
95
+ current = { role, blocks: [] };
96
+ turns.push(current);
97
+ }
98
+ current.blocks.push(block);
99
+ }
100
+ return turns;
101
+ }
102
+ function roleOf(b) {
103
+ switch (b.kind) {
104
+ case 'user_text':
105
+ case 'tool_result':
106
+ return 'user';
107
+ case 'assistant_text':
108
+ case 'tool_call':
109
+ case 'thinking':
110
+ return 'assistant';
111
+ case 'system_text':
112
+ return 'system';
113
+ case 'reasoning_opaque':
114
+ return null; // dropped going to Claude
115
+ }
116
+ }
117
+ function userBlockToClaude(b) {
118
+ if (b.kind === 'user_text')
119
+ return { type: 'text', text: b.text };
120
+ if (b.kind === 'tool_result') {
121
+ const out = { type: 'tool_result', tool_use_id: b.callId, content: b.output };
122
+ if (b.isError)
123
+ out.is_error = true;
124
+ return out;
125
+ }
126
+ return null;
127
+ }
128
+ function assistantBlockToClaude(b) {
129
+ if (b.kind === 'assistant_text')
130
+ return { type: 'text', text: b.text };
131
+ if (b.kind === 'thinking')
132
+ return { type: 'thinking', thinking: b.text };
133
+ if (b.kind === 'tool_call') {
134
+ // When converting from Codex side, the block was already translated. When converting
135
+ // from Claude side, the args are already Claude-shape. tool-map identity is preserved
136
+ // by the from-* parsers. So we just emit the tool_use directly.
137
+ return { type: 'tool_use', id: b.callId, name: b.tool, input: b.args };
138
+ }
139
+ return null;
140
+ }
141
+ function notNull(x) {
142
+ return x !== null;
143
+ }
144
+ // Re-export to keep callers from importing tool-map separately if they only need cross-trans
145
+ export { codexCallToClaude };
146
+ //# sourceMappingURL=to-claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-claude.js","sourceRoot":"","sources":["../../../../src/core/share/canonical/to-claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,UAAU,GAAkB,IAAI,CAAA;IACpC,IAAI,iBAAiB,GAAkB,IAAI,CAAA;IAE3C,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;QACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAElF,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC5E,0FAA0F;YAC1F,MAAM,cAAc,GAClB,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;gBAChD,CAAC,CAAE,OAAO,CAAC,CAAC,CAAoC,CAAC,IAAI;gBACrD,CAAC,CAAC,OAAO,CAAA;YAEb,MAAM,MAAM,GAAG;gBACb,UAAU;gBACV,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE;gBAClD,IAAI;gBACJ,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,OAAO,CAAC,OAAO,IAAI,SAAS;aAClC,CAAA;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;YAClC,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM;iBACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iBACzF,IAAI,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,IAAI,SAAS,CAAA;YAE/D,MAAM,MAAM,GAAG;gBACb,UAAU;gBACV,WAAW,EAAE,KAAK;gBAClB,OAAO,EAAE;oBACP,KAAK;oBACL,EAAE,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;oBAChD,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,OAAO;iBACR;gBACD,IAAI,EAAE,WAAW;gBACjB,IAAI;gBACJ,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAA;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;YAClC,UAAU,GAAG,IAAI,CAAA;YACjB,iBAAiB,GAAG,IAAI,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;iBACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAsB,CAAC,IAAI,CAAC;iBACxC,IAAI,CAAC,IAAI,CAAC,CAAA;YACb,MAAM,OAAO,GAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAsC,EAAE,OAAO,IAAI,SAAS,CAAA;YAC1F,MAAM,MAAM,GAAG;gBACb,UAAU,EAAE,iBAAiB,IAAI,UAAU;gBAC3C,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,QAAQ;gBACd,OAAO;gBACP,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,QAAQ;gBACnB,IAAI;gBACJ,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAA;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;YAClC,0EAA0E;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACtD,CAAC;AASD,SAAS,cAAc,CAAC,MAAwB;IAC9C,MAAM,KAAK,GAAW,EAAE,CAAA;IACxB,IAAI,OAAO,GAAgB,IAAI,CAAA;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,CAAC,IAAI;YAAE,SAAQ;QACnB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;YAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACrB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,MAAM,CAAC,CAAiB;IAC/B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,MAAM,CAAA;QACf,KAAK,gBAAgB,CAAC;QACtB,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,WAAW,CAAA;QACpB,KAAK,aAAa;YAChB,OAAO,QAAQ,CAAA;QACjB,KAAK,kBAAkB;YACrB,OAAO,IAAI,CAAA,CAAC,0BAA0B;IAC1C,CAAC;AACH,CAAC;AAQD,SAAS,iBAAiB,CAAC,CAAiB;IAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACjE,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAuB,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;QACjG,IAAI,CAAC,CAAC,OAAO;YAAG,GAA8B,CAAC,QAAQ,GAAG,IAAI,CAAA;QAC9D,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAiB;IAC/C,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACtE,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACxE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3B,qFAAqF;QACrF,sFAAsF;QACtF,gEAAgE;QAChE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACxE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,OAAO,CAAI,CAAW;IAC7B,OAAO,CAAC,KAAK,IAAI,CAAA;AACnB,CAAC;AAED,6FAA6F;AAC7F,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { CanonicalSession } from './types.js';
2
+ /**
3
+ * Render a CanonicalSession as Codex rollout JSONL bytes.
4
+ *
5
+ * Top-level envelope (verified against openai/codex protocol.rs RolloutItem):
6
+ * { timestamp, type, payload } — type is snake_case, payload is the variant body.
7
+ *
8
+ * Emits in order:
9
+ * 1. session_meta line (always first)
10
+ * 2. turn_context line (sets model)
11
+ * 3. response_item lines per canonical block:
12
+ * - user_text → message {role:user, content:[input_text]}
13
+ * - assistant_text → message {role:assistant, content:[output_text]}
14
+ * - tool_call → function_call OR custom_tool_call (via tool-map)
15
+ * - tool_result → function_call_output OR custom_tool_call_output (matched by callId)
16
+ * - system_text → message {role:developer, content:[input_text]}
17
+ * - thinking → DROPPED (no Codex equivalent)
18
+ * - reasoning_opaque → DROPPED (we don't synthesize encrypted reasoning blobs)
19
+ */
20
+ export declare function toCodexJsonl(session: CanonicalSession): string;
21
+ //# sourceMappingURL=to-codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-codex.d.ts","sourceRoot":"","sources":["../../../../src/core/share/canonical/to-codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAA;AAGlE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA+F9D"}
@@ -0,0 +1,124 @@
1
+ import { claudeToolToCodex } from './tool-map.js';
2
+ /**
3
+ * Render a CanonicalSession as Codex rollout JSONL bytes.
4
+ *
5
+ * Top-level envelope (verified against openai/codex protocol.rs RolloutItem):
6
+ * { timestamp, type, payload } — type is snake_case, payload is the variant body.
7
+ *
8
+ * Emits in order:
9
+ * 1. session_meta line (always first)
10
+ * 2. turn_context line (sets model)
11
+ * 3. response_item lines per canonical block:
12
+ * - user_text → message {role:user, content:[input_text]}
13
+ * - assistant_text → message {role:assistant, content:[output_text]}
14
+ * - tool_call → function_call OR custom_tool_call (via tool-map)
15
+ * - tool_result → function_call_output OR custom_tool_call_output (matched by callId)
16
+ * - system_text → message {role:developer, content:[input_text]}
17
+ * - thinking → DROPPED (no Codex equivalent)
18
+ * - reasoning_opaque → DROPPED (we don't synthesize encrypted reasoning blobs)
19
+ */
20
+ export function toCodexJsonl(session) {
21
+ const lines = [];
22
+ const startTs = session.startedAt ?? new Date().toISOString();
23
+ const cwd = session.project ?? '.';
24
+ // Track which tool_call kind each callId used, so the matching result picks
25
+ // the right output payload type (function_call_output vs custom_tool_call_output).
26
+ const callKindByCallId = new Map();
27
+ // 1. session_meta
28
+ lines.push(JSON.stringify({
29
+ timestamp: startTs,
30
+ type: 'session_meta',
31
+ payload: {
32
+ id: session.sessionId,
33
+ timestamp: startTs,
34
+ cwd,
35
+ originator: 'vyasa-translated',
36
+ cli_version: session.sourceCliVersion ?? 'translated',
37
+ source: 'cli',
38
+ model_provider: 'openai',
39
+ },
40
+ }));
41
+ // 2. turn_context (best-effort — pull model from first assistant block if available)
42
+ const firstModel = session.blocks
43
+ .map((b) => (b.kind === 'assistant_text' || b.kind === 'tool_call' ? b.model : undefined))
44
+ .find((m) => typeof m === 'string') ?? 'gpt-5';
45
+ lines.push(JSON.stringify({
46
+ timestamp: startTs,
47
+ type: 'turn_context',
48
+ payload: {
49
+ turn_id: `${session.sessionId}-turn`,
50
+ cwd,
51
+ current_date: startTs.slice(0, 10),
52
+ model: firstModel,
53
+ },
54
+ }));
55
+ // 3. response_items
56
+ for (const block of session.blocks) {
57
+ const ts = block.ts || startTs;
58
+ if (block.kind === 'user_text') {
59
+ lines.push(messageItem(ts, 'user', block.text, 'input_text'));
60
+ }
61
+ else if (block.kind === 'assistant_text') {
62
+ lines.push(messageItem(ts, 'assistant', block.text, 'output_text'));
63
+ }
64
+ else if (block.kind === 'system_text') {
65
+ lines.push(messageItem(ts, block.subtype ?? 'developer', block.text, 'input_text'));
66
+ }
67
+ else if (block.kind === 'tool_call') {
68
+ const codex = claudeToolToCodex(block.tool, block.args);
69
+ callKindByCallId.set(block.callId, codex.kind);
70
+ if (codex.kind === 'function_call') {
71
+ lines.push(JSON.stringify({
72
+ timestamp: ts,
73
+ type: 'response_item',
74
+ payload: {
75
+ type: 'function_call',
76
+ name: codex.name,
77
+ arguments: codex.arguments,
78
+ call_id: block.callId,
79
+ },
80
+ }));
81
+ }
82
+ else {
83
+ lines.push(JSON.stringify({
84
+ timestamp: ts,
85
+ type: 'response_item',
86
+ payload: {
87
+ type: 'custom_tool_call',
88
+ status: 'completed',
89
+ call_id: block.callId,
90
+ name: codex.name,
91
+ input: codex.input,
92
+ },
93
+ }));
94
+ }
95
+ }
96
+ else if (block.kind === 'tool_result') {
97
+ const kind = callKindByCallId.get(block.callId) ?? 'function_call';
98
+ const outerType = kind === 'custom_tool_call' ? 'custom_tool_call_output' : 'function_call_output';
99
+ lines.push(JSON.stringify({
100
+ timestamp: ts,
101
+ type: 'response_item',
102
+ payload: {
103
+ type: outerType,
104
+ call_id: block.callId,
105
+ output: block.output,
106
+ },
107
+ }));
108
+ }
109
+ // thinking + reasoning_opaque: skip
110
+ }
111
+ return lines.join('\n') + (lines.length ? '\n' : '');
112
+ }
113
+ function messageItem(ts, role, text, contentType) {
114
+ return JSON.stringify({
115
+ timestamp: ts,
116
+ type: 'response_item',
117
+ payload: {
118
+ type: 'message',
119
+ role,
120
+ content: [{ type: contentType, text }],
121
+ },
122
+ });
123
+ }
124
+ //# sourceMappingURL=to-codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-codex.js","sourceRoot":"","sources":["../../../../src/core/share/canonical/to-codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Bidirectional tool name + argument-shape mapping between Claude and Codex.
3
+ *
4
+ * Source of truth for mappings: see plan tool-mapping table. Shapes verified
5
+ * against real session data (~/.codex/sessions/...) AND upstream openai/codex
6
+ * Rust enum (codex-rs/protocol/src/models.rs).
7
+ *
8
+ * "Faithful" mappings round-trip cleanly. "Best-effort" mappings preserve
9
+ * semantics but may produce slightly different surface text. "Wrapped" mappings
10
+ * preserve the original tool name + args as printable text inside a no-op shell
11
+ * call — full data is recoverable but the receiving agent sees only "shell".
12
+ */
13
+ export interface CodexFunctionCall {
14
+ kind: 'function_call';
15
+ name: string;
16
+ /** Stringified JSON, per Codex spec. */
17
+ arguments: string;
18
+ }
19
+ export interface CodexCustomToolCall {
20
+ kind: 'custom_tool_call';
21
+ name: string;
22
+ /** Raw string input (e.g. apply_patch body). */
23
+ input: string;
24
+ }
25
+ export type CodexCallPayload = CodexFunctionCall | CodexCustomToolCall;
26
+ /**
27
+ * Translate one Claude tool_use block into a Codex response_item payload.
28
+ * Returns the appropriate payload kind (function_call vs custom_tool_call).
29
+ */
30
+ export declare function claudeToolToCodex(tool: string, args: Record<string, unknown>): CodexCallPayload;
31
+ /**
32
+ * Translate one Codex response_item function_call/custom_tool_call into a Claude
33
+ * tool_use block. Returns { name, input } suitable for Claude's ContentBlock.tool_use.
34
+ */
35
+ export interface ClaudeToolUseInput {
36
+ name: string;
37
+ input: Record<string, unknown>;
38
+ }
39
+ export declare function codexCallToClaude(payload: CodexCallPayload): ClaudeToolUseInput;
40
+ declare function shellQuote(s: string): string;
41
+ declare function buildAddFilePatch(filePath: string, content: string): string;
42
+ declare function buildUpdateFilePatch(filePath: string, oldStr: string, newStr: string): string;
43
+ /**
44
+ * Parse an apply_patch input to a Claude tool_use call. Returns null if the patch
45
+ * shape is unrecognized (caller should wrap).
46
+ */
47
+ export declare function parseApplyPatch(input: string): ClaudeToolUseInput | null;
48
+ /**
49
+ * If `cmd` is one of our wrap-tag echoes, recover the original tool + args.
50
+ * Returns null if `cmd` isn't a recognized wrap.
51
+ */
52
+ declare function unwrapShellEcho(cmd: string): ClaudeToolUseInput | null;
53
+ export declare const _internal: {
54
+ buildAddFilePatch: typeof buildAddFilePatch;
55
+ buildUpdateFilePatch: typeof buildUpdateFilePatch;
56
+ shellQuote: typeof shellQuote;
57
+ unwrapShellEcho: typeof unwrapShellEcho;
58
+ WRAP_TAG: string;
59
+ };
60
+ export {};
61
+ //# sourceMappingURL=tool-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-map.d.ts","sourceRoot":"","sources":["../../../../src/core/share/canonical/tool-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,CAAA;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAA;AAEtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAoF/F;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,kBAAkB,CA0B/E;AASD,iBAAS,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrC;AAcD,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWtF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAiDxE;AAgCD;;;GAGG;AACH,iBAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAmB/D;AAGD,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAA"}