apex-dev 3.0.2 → 3.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 (153) hide show
  1. package/dist/highlights-eq9cgrbb.scm +604 -0
  2. package/dist/highlights-ghv9g403.scm +205 -0
  3. package/dist/highlights-hk7bwhj4.scm +284 -0
  4. package/dist/highlights-r812a2qc.scm +150 -0
  5. package/dist/highlights-x6tmsnaa.scm +115 -0
  6. package/dist/index.js +62590 -0
  7. package/dist/injections-73j83es3.scm +27 -0
  8. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  9. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  10. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  11. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  12. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  13. package/package.json +10 -4
  14. package/.config/amp/settings.json +0 -3
  15. package/.config/opencode/oh-my-opencode.json +0 -58
  16. package/.config/opencode/opencode.json +0 -6
  17. package/.local/share/amp/device-id.json +0 -3
  18. package/.local/share/amp/history.jsonl +0 -78
  19. package/.local/share/amp/session.json +0 -6
  20. package/.local/share/amp/threads/T-019c93b8-fce7-7083-aab9-d5f1c88a9545.json +0 -2528
  21. package/.local/share/amp/threads/T-019c93c8-4b7a-71df-94ac-867d8236a288.json +0 -7
  22. package/.local/share/amp/threads/T-019c93cd-5a7d-728e-8289-02e0ef4ca2ff.json +0 -680
  23. package/.local/share/amp/threads/T-019c93e7-83ca-7633-9eed-12bdcc118163.json +0 -873
  24. package/.local/share/amp/threads/T-019c93ea-ccd3-765a-88c9-42d7b631e977.json +0 -620
  25. package/.local/share/amp/threads/T-019c93ee-5977-71af-9ab7-c4611004b703.json +0 -1000
  26. package/.local/share/amp/threads/T-019c93f0-8328-71ed-a250-6da169cebfe1.json +0 -829
  27. package/.local/share/amp/threads/T-019c93f5-7bdd-703b-b2cd-0a04da64441a.json +0 -459
  28. package/.local/share/amp/threads/T-019c93f8-2b2e-733b-8249-9876546d9b5b.json +0 -764
  29. package/.local/share/amp/threads/T-019c93fd-fade-7195-a3b7-358f180d40b8.json +0 -7
  30. package/.local/share/amp/threads/T-019c93fe-2e56-705e-827e-eb99bd02e257.json +0 -3593
  31. package/.local/share/amp/threads/T-019c9408-6e64-77e1-9519-b913e3b24a03.json +0 -1559
  32. package/.local/share/amp/threads/T-019c9409-feeb-736d-b92c-4f7a263a643c.json +0 -7
  33. package/.local/share/amp/threads/T-019c940b-8d11-755b-b9e1-f923d8a5e6ba.json +0 -7
  34. package/.local/share/amp/threads/T-019c943a-6c5e-76a5-bf4e-170f7ad452ce.json +0 -979
  35. package/.local/share/amp/threads/T-019c94b2-1c8f-76d8-96d0-82449a028849.json +0 -1584
  36. package/.local/share/amp/threads/T-019c94b6-68f0-726e-92dd-90c5411ca28c.json +0 -7
  37. package/.local/share/amp/threads/T-019c94bf-a589-72a3-b3c2-a81359d9e0a6.json +0 -7
  38. package/.local/share/amp/threads/T-019c94e1-1bd9-70ab-b6f2-abd5cab4f4ce.json +0 -1035
  39. package/.local/share/amp/threads/T-019c94fd-cc4a-714b-896a-74f94020f6eb.json +0 -1310
  40. package/.local/share/amp/threads/T-019c9501-8976-7138-aca6-245a01a8fe9b.json +0 -7
  41. package/.local/share/amp/threads/T-019c9504-4b51-763e-8a9f-5d4cdfcf0cfa.json +0 -496
  42. package/.local/share/amp/threads/T-019c9506-4e3b-74fd-8eda-cedbf3793598.json +0 -2679
  43. package/.local/share/amp/threads/T-019c9508-178c-718c-88d2-caf816d64f65.json +0 -965
  44. package/.local/share/amp/threads/T-019c9509-2812-71fd-8fd2-923e29ad34fa.json +0 -7
  45. package/.local/share/amp/threads/T-019c950e-69fe-77d6-9854-fc73b77a3148.json +0 -4570
  46. package/.local/share/amp/threads/T-019c9707-6e2b-741c-b4d4-117026a78449.json +0 -2899
  47. package/.local/share/amp/threads/T-019c971b-6bc0-77b8-8868-f8956d3e71a8.json +0 -7
  48. package/.local/share/amp/threads/T-019c971b-c87c-75f3-a61f-beb18a1cb25f.json +0 -474
  49. package/.local/share/amp/threads/T-019c971d-d371-70ac-9805-5c739908e73b.json +0 -802
  50. package/.local/share/amp/threads/T-019c9722-d73d-74f1-9d1d-8fafaad0ede7.json +0 -7
  51. package/.local/share/amp/threads/T-019c9761-858c-719b-911f-bc2e4c8cbdde.json +0 -188
  52. package/.local/share/amp/threads/T-019c9761-f5f3-7606-a900-ebe7f10d6e37.json +0 -121
  53. package/.local/share/amp/threads/T-019c9763-b1ae-729d-90aa-f59938ce912e.json +0 -799
  54. package/.local/share/amp/threads/T-019c9769-4a8a-77b8-beab-f48973276f9a.json +0 -1541
  55. package/.local/share/amp/threads/T-019c9772-edac-7075-b26e-0ada1f8697d2.json +0 -7
  56. package/.local/share/amp/threads/T-019c97e8-a9ab-71a1-a8f9-109c540c98bf.json +0 -111
  57. package/.local/share/amp/threads/T-019c97e9-2277-753c-8c5d-df745fa6cfff.json +0 -7
  58. package/.local/share/amp/threads/T-019c97e9-f28e-758d-9663-e37047a8ed95.json +0 -111
  59. package/.local/share/amp/threads/T-019c97ea-17c7-77b8-92b2-f641c069bcc9.json +0 -71
  60. package/.local/share/amp/threads/T-019c97ea-44c6-75b8-88bc-d88113194f6a.json +0 -1611
  61. package/.local/share/amp/threads/T-019c97ec-abae-7251-a5f6-693adf496a1c.json +0 -7
  62. package/.local/share/amp/threads/T-019c97f5-8e61-73ad-8c5d-2637abedcde6.json +0 -1341
  63. package/.local/share/amp/threads/T-019c989d-4f4e-7249-bde0-21d19455ccae.json +0 -163
  64. package/.local/share/amp/threads/T-019c989d-9024-73c4-bee8-e2ae45028a39.json +0 -124
  65. package/.local/share/amp/threads/T-019c989e-1394-74ad-8234-ac573fcdb4c7.json +0 -1260
  66. package/.local/share/amp/threads/T-019c989f-e3dd-772e-85ac-525d0fc88fda.json +0 -403
  67. package/.local/share/amp/threads/T-019c98a1-7b0c-778a-b311-2e1cff85d710.json +0 -3422
  68. package/.local/share/amp/threads/T-019c98c5-4b7f-7284-99e9-88aa8c18ba66.json +0 -1830
  69. package/.local/share/amp/threads/T-019c98d0-f27f-76ec-be10-6df96f22be99.json +0 -4061
  70. package/.local/share/amp/threads/T-019c98f9-d031-704d-a0c2-f2f395f68f2b.json +0 -509
  71. package/.local/share/amp/threads/T-019c9919-f9ee-766c-90be-af7a07f6a4c6.json +0 -2075
  72. package/.local/share/amp/threads/T-019c991c-b98b-7158-9083-cc52408beb13.json +0 -7
  73. package/.local/share/amp/threads/T-019c991d-66d6-72aa-a9a1-105f7df0ea06.json +0 -7
  74. package/.local/share/amp/threads/T-019c9c2e-71a4-77ff-bd7f-b053da7f9000.json +0 -1637
  75. package/.local/share/amp/threads/T-019c9c45-27ca-728b-ba77-835115dfa9b2.json +0 -3893
  76. package/.local/share/amp/threads/T-019c9c48-45dc-736a-9752-e4119fe698f9.json +0 -7
  77. package/.local/share/amp/threads/T-019c9c4d-266b-72d0-b56e-74a5777e6583.json +0 -7
  78. package/.local/share/amp/threads/T-019c9c52-ab89-758f-9178-bda99c39d10b.json +0 -7
  79. package/.local/share/amp/threads/T-019c9c56-5715-72e2-b8b4-87711a842dd1.json +0 -1799
  80. package/.local/share/amp/threads/T-019c9c5b-88b1-74cb-97e9-16b23e03daa2.json +0 -727
  81. package/.local/share/amp/threads/T-019c9c5c-3b3e-721c-ad2e-a2ef245dce3f.json +0 -738
  82. package/.local/share/amp/threads/T-019c9c5c-fd78-736f-9d29-a66d23839d40.json +0 -256
  83. package/.local/share/amp/threads/T-019c9c5d-db4a-74cd-ad2a-925fac87131d.json +0 -1859
  84. package/.local/share/kilo/kilo.db +0 -0
  85. package/.local/share/kilo/kilo.db-shm +0 -0
  86. package/.local/share/kilo/kilo.db-wal +0 -0
  87. package/.local/share/kilo/storage/migration +0 -1
  88. package/.local/share/kilo/storage/session_diff/ses_36bea4cb9ffe1b0j5HEL14KEaU.json +0 -1
  89. package/.local/share/kilo/storage/session_diff/ses_36beaa8f2ffeeZ3Y39SQ9UDWQQ.json +0 -1
  90. package/.local/share/kilo/telemetry-id +0 -1
  91. package/.local/share/opencode/auth.json +0 -6
  92. package/.local/share/opencode/opencode.db +0 -0
  93. package/.local/share/opencode/opencode.db-shm +0 -0
  94. package/.local/share/opencode/opencode.db-wal +0 -0
  95. package/.local/share/opencode/storage/agent-usage-reminder/ses_36870ea98ffe8S5ZOCE4F11yFh.json +0 -6
  96. package/.local/share/opencode/storage/agent-usage-reminder/ses_3687a3e9affewUnHBzvpiPR6df.json +0 -6
  97. package/.local/share/opencode/storage/agent-usage-reminder/ses_36886e68dffeKVgUWf6lzXdEEt.json +0 -6
  98. package/.local/share/opencode/storage/agent-usage-reminder/ses_36bee9f1effeJbiHHLWLR6O3WJ.json +0 -6
  99. package/.local/share/opencode/storage/agent-usage-reminder/ses_36c25e50affef2nhaXq9aSgKH3.json +0 -6
  100. package/.local/share/opencode/storage/agent-usage-reminder/ses_36c260708ffel4wG4yhdo0knDD.json +0 -6
  101. package/.local/share/opencode/storage/agent-usage-reminder/ses_36c261531ffeoVcvqXxry2bN9H.json +0 -6
  102. package/.local/share/opencode/storage/agent-usage-reminder/ses_36c291bddffePWRiaFLLJAC1y7.json +0 -6
  103. package/.local/share/opencode/storage/migration +0 -1
  104. package/.local/share/opencode/storage/session_diff/ses_36870ea98ffe8S5ZOCE4F11yFh.json +0 -1
  105. package/.local/share/opencode/storage/session_diff/ses_3687a3e9affewUnHBzvpiPR6df.json +0 -1
  106. package/.local/share/opencode/storage/session_diff/ses_36886e68dffeKVgUWf6lzXdEEt.json +0 -1
  107. package/.local/share/opencode/storage/session_diff/ses_36bee9f1effeJbiHHLWLR6O3WJ.json +0 -1
  108. package/.local/share/opencode/storage/session_diff/ses_36c25e50affef2nhaXq9aSgKH3.json +0 -1
  109. package/.local/share/opencode/storage/session_diff/ses_36c260708ffel4wG4yhdo0knDD.json +0 -1
  110. package/.local/share/opencode/storage/session_diff/ses_36c261531ffeoVcvqXxry2bN9H.json +0 -1
  111. package/.local/share/opencode/storage/session_diff/ses_36c291bddffePWRiaFLLJAC1y7.json +0 -1
  112. package/.local/share/opencode/storage/session_diff/ses_36c2af1c5ffegxEaOZOGcVykyy.json +0 -1
  113. package/.local/share/opencode/storage/session_diff/ses_36c2be235ffeOa6x8UCk1HW4kU.json +0 -1
  114. package/.local/share/opencode/tool-output/tool_c93da840c0016GrdyAkOnHGezU +0 -2330
  115. package/.local/share/opencode/tool-output/tool_c9411e784001cRoQqwVDb1a6lY +0 -1017
  116. package/.local/state/replit/log-query.db +0 -0
  117. package/.local/state/replit/log-query.db-shm +0 -0
  118. package/.local/state/replit/log-query.db-wal +0 -0
  119. package/.replit +0 -41
  120. package/.upm/store.json +0 -1
  121. package/AGENTS.md +0 -28
  122. package/bun.lock +0 -271
  123. package/generated-icon.png +0 -0
  124. package/hello.txt +0 -1
  125. package/index.jsx +0 -24
  126. package/src/agent.js +0 -504
  127. package/src/app.jsx +0 -96
  128. package/src/commands.js +0 -133
  129. package/src/components/AssistantMessage.jsx +0 -83
  130. package/src/components/ChatArea.jsx +0 -84
  131. package/src/components/DiffView.jsx +0 -26
  132. package/src/components/Divider.jsx +0 -8
  133. package/src/components/Header.jsx +0 -44
  134. package/src/components/HelpModal.jsx +0 -81
  135. package/src/components/InputBar.jsx +0 -32
  136. package/src/components/Spinner.jsx +0 -23
  137. package/src/components/StatusBar.jsx +0 -44
  138. package/src/components/SystemMessage.jsx +0 -31
  139. package/src/components/ThinkBlock.jsx +0 -29
  140. package/src/components/ToolCallItem.jsx +0 -43
  141. package/src/components/UserMessage.jsx +0 -11
  142. package/src/components/Welcome.jsx +0 -14
  143. package/src/config.js +0 -196
  144. package/src/hooks/useLayout.js +0 -15
  145. package/src/hooks/useStore.js +0 -6
  146. package/src/prompt.js +0 -101
  147. package/src/store.js +0 -99
  148. package/src/theme.js +0 -19
  149. package/src/thinking.js +0 -54
  150. package/src/toolExecutors.js +0 -853
  151. package/src/tools.js +0 -335
  152. package/src/utils.js +0 -32
  153. package/tsconfig.json +0 -10
@@ -1,7 +0,0 @@
1
- {
2
- "v": 1,
3
- "id": "T-019c971b-6bc0-77b8-8868-f8956d3e71a8",
4
- "created": 1772061682627,
5
- "messages": [],
6
- "agentMode": "smart"
7
- }
@@ -1,474 +0,0 @@
1
- {
2
- "v": 198,
3
- "id": "T-019c971b-c87c-75f3-a61f-beb18a1cb25f",
4
- "created": 1772061706368,
5
- "messages": [
6
- {
7
- "role": "user",
8
- "messageId": 0,
9
- "content": [
10
- {
11
- "type": "text",
12
- "text": "remove the model ID from the CLI"
13
- }
14
- ],
15
- "userState": {
16
- "currentlyVisibleFiles": []
17
- },
18
- "agentMode": "smart",
19
- "meta": {
20
- "sentAt": 1772061714002
21
- }
22
- },
23
- {
24
- "role": "assistant",
25
- "messageId": 1,
26
- "content": [
27
- {
28
- "type": "thinking",
29
- "thinking": "The user wants to remove the model ID from the CLI. Let me first look at the project structure to understand what we're working with.",
30
- "signature": "Eq4CCkYICxgCKkBHrW0yzMGQIw/x/2ByUw3e/nGWVVswAnZ2gHbVyB5+lZf7SVG7xsuQAjT7J+Pgm87F9Ld0lLvgRxDJZlovTnbbEgxbgLaLtNT6uayBIrsaDLqQ75a4cc0elKGnNSIwB34kjeLN237x3XtrgwLV/qdDV+Razy6L3+j52Jh/WSm4yc18yumQSqE160hcrZTzKpUBpeeiA6fYZHZE4i9tnbaolHryqmuV+8atPG42N1es0vjkXwxPprYjdHM4GF0r1k7/47rmbDIadEu/qoup4u53DT6qQeZixRyyaDBsACt/vsXNhvoSj+wUQH9OX2tXsY7kzpU55NZIaATCDrANsyqt35M9QMeWhJ8ECPpOG9I+oLoHZ+WFPKzH76yH5GsgyiF9Pm3Tfs4YAQ==",
31
- "provider": "anthropic"
32
- },
33
- {
34
- "type": "tool_use",
35
- "complete": true,
36
- "id": "toolu_018PohYw3beqFumnvzVaAAVn",
37
- "name": "Read",
38
- "input": {
39
- "path": "/home/runner/workspace/src"
40
- }
41
- },
42
- {
43
- "type": "tool_use",
44
- "complete": true,
45
- "id": "toolu_01MBV9ZCQpyUEav2c4CxTFcd",
46
- "name": "Read",
47
- "input": {
48
- "path": "/home/runner/workspace/index.js"
49
- }
50
- }
51
- ],
52
- "state": {
53
- "type": "complete",
54
- "stopReason": "tool_use"
55
- },
56
- "usage": {
57
- "model": "claude-opus-4-6",
58
- "maxInputTokens": 168000,
59
- "inputTokens": 3,
60
- "outputTokens": 145,
61
- "cacheCreationInputTokens": 1198,
62
- "cacheReadInputTokens": 13086,
63
- "totalInputTokens": 14287,
64
- "timestamp": "2026-02-25T23:21:57.624Z"
65
- }
66
- },
67
- {
68
- "role": "user",
69
- "messageId": 2,
70
- "content": [
71
- {
72
- "type": "tool_result",
73
- "toolUseID": "toolu_018PohYw3beqFumnvzVaAAVn",
74
- "run": {
75
- "status": "done",
76
- "progress": {},
77
- "result": {
78
- "absolutePath": "/home/runner/workspace/src",
79
- "content": "agent.js\ncommands.js\nconfig.js\nprompt.js\nthinking.js\ntoolExecutors.js\ntools.js\nui.js",
80
- "isDirectory": true,
81
- "directoryEntries": [
82
- "agent.js",
83
- "commands.js",
84
- "config.js",
85
- "prompt.js",
86
- "thinking.js",
87
- "toolExecutors.js",
88
- "tools.js",
89
- "ui.js"
90
- ]
91
- },
92
- "trackFiles": [
93
- "file:///home/runner/workspace/src"
94
- ]
95
- }
96
- },
97
- {
98
- "type": "tool_result",
99
- "toolUseID": "toolu_01MBV9ZCQpyUEav2c4CxTFcd",
100
- "run": {
101
- "status": "done",
102
- "progress": {},
103
- "result": {
104
- "absolutePath": "/home/runner/workspace/index.js",
105
- "content": "1: #!/usr/bin/env node\n2: 'use strict';\n3: \n4: const { session } = require('./src/config');\n5: const {\n6: t,\n7: indent,\n8: showHeader,\n9: showWelcome,\n10: showPrompt,\n11: showSessionSummary,\n12: createPrompt,\n13: } = require('./src/ui');\n14: const { handleSlashCommand } = require('./src/commands');\n15: const { handleUserInput, setRlClosed, getRlClosed, getIsProcessing } = require('./src/agent');\n16: \n17: // ===== State =====\n18: let rl;\n19: let askQuestion;\n20: \n21: // ===== Input Loop =====\n22: function setupInputLoop() {\n23: setRlClosed(false);\n24: rl = createPrompt();\n25: \n26: rl.on('close', () => {\n27: setRlClosed(true);\n28: if (getIsProcessing()) return;\n29: // If stdin is still usable, re-create readline (e.g. terminal glitch)\n30: if (!process.stdin.destroyed && process.stdin.readable) {\n31: setupInputLoop();\n32: askQuestion();\n33: return;\n34: }\n35: console.log();\n36: showSessionSummary();\n37: console.log(indent(t.dim('Goodbye! ') + t.primary('✦')));\n38: console.log();\n39: process.exit(0);\n40: });\n41: }\n42: \n43: // ===== Main Loop =====\n44: async function main() {\n45: showHeader();\n46: showWelcome();\n47: \n48: setupInputLoop();\n49: \n50: askQuestion = () => {\n51: if (getRlClosed()) return;\n52: process.stdin.resume();\n53: const promptStr = showPrompt();\n54: \n55: rl.question(promptStr, async (answer) => {\n56: if (answer === null || answer === undefined) {\n57: process.exit(0);\n58: }\n59: const input = answer.trim();\n60: \n61: if (!input) { askQuestion(); return; }\n62: \n63: // Slash commands\n64: if (input.startsWith('/')) {\n65: await handleSlashCommand(input, rl);\n66: askQuestion();\n67: return;\n68: }\n69: \n70: if (input === 'exit' || input === 'quit') {\n71: console.log();\n72: showSessionSummary();\n73: console.log(indent(t.dim('Goodbye! ') + t.primary('✦')));\n74: console.log();\n75: process.exit(0);\n76: }\n77: \n78: try {\n79: await handleUserInput(input, { setupInputLoop, askQuestion });\n80: } catch (err) {\n81: console.log(indent(t.red('✗ Unexpected error: ') + t.text(err.message)));\n82: console.log();\n83: }\n84: askQuestion();\n85: });\n86: };\n87: \n88: askQuestion();\n89: }\n90: \n91: // ===== Run =====\n92: main().catch(console.error);"
106
- },
107
- "trackFiles": [
108
- "file:///home/runner/workspace/index.js"
109
- ]
110
- }
111
- }
112
- ]
113
- },
114
- {
115
- "role": "assistant",
116
- "messageId": 3,
117
- "content": [
118
- {
119
- "type": "tool_use",
120
- "complete": true,
121
- "id": "toolu_014RD2k3EnpztPQMJkMAAcQZ",
122
- "name": "Read",
123
- "input": {
124
- "path": "/home/runner/workspace/src/ui.js"
125
- }
126
- },
127
- {
128
- "type": "tool_use",
129
- "complete": true,
130
- "id": "toolu_01N8ynydkZnkzvdSexAx63zD",
131
- "name": "Read",
132
- "input": {
133
- "path": "/home/runner/workspace/src/config.js"
134
- }
135
- }
136
- ],
137
- "state": {
138
- "type": "complete",
139
- "stopReason": "tool_use"
140
- },
141
- "usage": {
142
- "model": "claude-opus-4-6",
143
- "maxInputTokens": 168000,
144
- "inputTokens": 1,
145
- "outputTokens": 107,
146
- "cacheCreationInputTokens": 1228,
147
- "cacheReadInputTokens": 14284,
148
- "totalInputTokens": 15513,
149
- "timestamp": "2026-02-25T23:22:01.036Z"
150
- }
151
- },
152
- {
153
- "role": "user",
154
- "messageId": 4,
155
- "content": [
156
- {
157
- "type": "tool_result",
158
- "toolUseID": "toolu_014RD2k3EnpztPQMJkMAAcQZ",
159
- "run": {
160
- "status": "done",
161
- "progress": {},
162
- "result": {
163
- "absolutePath": "/home/runner/workspace/src/ui.js",
164
- "content": "1: 'use strict';\n2: \n3: const chalk = require('chalk');\n4: const ora = require('ora');\n5: const boxen = require('boxen');\n6: const figures = require('figures');\n7: const readline = require('readline');\n8: const { highlight } = require('cli-highlight');\n9: const path = require('path');\n10: const { execSync } = require('child_process');\n11: const { NVIDIA_MODEL, MAX_TOOL_ITERATIONS, PROJECT_ROOT, session, timestamp } = require('./config');\n12: \n13: // ===== Theme (Amp-inspired) =====\n14: const t = {\n15: primary: chalk.hex('#6366f1'),\n16: accent: chalk.hex('#818cf8'),\n17: dim: chalk.dim,\n18: muted: chalk.gray,\n19: text: chalk.white,\n20: bold: chalk.bold,\n21: green: chalk.green,\n22: yellow: chalk.yellow,\n23: red: chalk.red,\n24: blue: chalk.blue,\n25: cyan: chalk.cyan,\n26: italic: chalk.italic,\n27: };\n28: \n29: // ===== Layout =====\n30: const COLS = Math.min(process.stdout.columns || 80, 100);\n31: \n32: function hr() {\n33: return t.dim('─'.repeat(COLS));\n34: }\n35: \n36: function stripAnsi(str) {\n37: return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n38: }\n39: \n40: function indent(str, n = 0) {\n41: if (n === 0) return str;\n42: const prefix = ' '.repeat(n);\n43: return str.split('\\n').map(l => prefix + l).join('\\n');\n44: }\n45: \n46: // ===== Header =====\n47: function showHeader() {\n48: console.clear();\n49: let branch = '';\n50: try { branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', { encoding: 'utf-8', cwd: PROJECT_ROOT }).trim(); } catch {}\n51: \n52: const name = t.primary.bold('⚡ Apex');\n53: const model = t.dim(NVIDIA_MODEL.split('/').pop());\n54: const branchStr = branch ? t.dim('on ') + t.text(branch) : '';\n55: const cwd = t.dim(path.basename(PROJECT_ROOT));\n56: \n57: console.log();\n58: console.log(`${name} ${model} ${cwd} ${branchStr}`);\n59: console.log(hr());\n60: }\n61: \n62: // ===== Welcome =====\n63: function showWelcome() {\n64: console.log();\n65: console.log(t.bold('How can I help?'));\n66: console.log(t.dim(`Tools available · Max ${MAX_TOOL_ITERATIONS} iterations per turn`));\n67: console.log();\n68: }\n69: \n70: // ===== Messages =====\n71: function showUserMessage(text) {\n72: console.log();\n73: console.log(t.blue.bold('You'));\n74: console.log(text);\n75: console.log();\n76: }\n77: \n78: function showAssistantHeader() {\n79: console.log(t.primary.bold('Apex'));\n80: }\n81: \n82: function showAssistantMessage(text) {\n83: const lines = text.split('\\n');\n84: const formatted = [];\n85: let inCodeBlock = false;\n86: let codeLines = [];\n87: let codeLang = '';\n88: \n89: for (const line of lines) {\n90: if (line.startsWith('```') && !inCodeBlock) {\n91: inCodeBlock = true;\n92: codeLang = line.slice(3).trim() || 'code';\n93: codeLines = [];\n94: } else if (line.startsWith('```') && inCodeBlock) {\n95: inCodeBlock = false;\n96: formatted.push(renderCodeBlock(codeLines.join('\\n'), codeLang));\n97: } else if (inCodeBlock) {\n98: codeLines.push(line);\n99: } else {\n100: const processed = line.replace(/`([^`]+)`/g, (_, code) => t.cyan(code));\n101: formatted.push(processed);\n102: }\n103: }\n104: \n105: console.log(formatted.join('\\n'));\n106: console.log();\n107: }\n108: \n109: // ===== Code Block =====\n110: function renderCodeBlock(code, lang) {\n111: const label = t.dim(`── ${lang} ──`);\n112: let highlighted;\n113: try {\n114: highlighted = highlight(code, { language: lang, ignoreIllegals: true });\n115: } catch {\n116: highlighted = code;\n117: }\n118: \n119: const cLines = highlighted.split('\\n').map((line, i) => {\n120: return t.dim(String(i + 1).padStart(3) + ' │ ') + line;\n121: });\n122: \n123: return `${label}\\n${cLines.join('\\n')}\\n${t.dim('─'.repeat(Math.min(COLS, 60)))}`;\n124: }\n125: \n126: // ===== Tool Display =====\n127: function toolBadge(name) {\n128: return t.dim('[') + t.accent(name) + t.dim(']');\n129: }\n130: \n131: function toolDetail(name, args) {\n132: switch (name) {\n133: case 'Bash': return args.command || '';\n134: case 'Grep': return `\"${args.pattern}\"${args.path ? ` in ${args.path}` : ''}`;\n135: case 'Glob': return args.pattern || '';\n136: case 'ListDir': return args.path || '.';\n137: case 'Read': {\n138: let d = args.path || '';\n139: if (args.start_line) d += `:${args.start_line}-${args.end_line || ''}`;\n140: return d;\n141: }\n142: case 'Write': return args.path || '';\n143: case 'Edit': return args.path || '';\n144: case 'Patch': return `${args.path} (${(args.edits || []).length} edits)`;\n145: case 'UndoEdit': return args.path || '';\n146: case 'Task': return args.description || '';\n147: case 'CodeReview': {\n148: const extra = (args.files || []).length;\n149: const modCount = session.filesModified.size;\n150: return `${modCount} modified${extra ? ` + ${extra} extra` : ''}`;\n151: }\n152: default: return JSON.stringify(args).slice(0, 60);\n153: }\n154: }\n155: \n156: async function showToolCall(name, detail, startTime) {\n157: const truncDetail = detail.length > 60 ? detail.slice(0, 57) + '...' : detail;\n158: const spinner = ora({\n159: text: `${toolBadge(name)} ${t.dim(truncDetail)}`,\n160: prefixText: ' ',\n161: spinner: 'dots',\n162: color: 'white',\n163: }).start();\n164: return spinner;\n165: }\n166: \n167: function finishToolCall(spinner, name, detail, startTime, success = true) {\n168: const elapsed = Date.now() - startTime;\n169: const icon = success ? t.green('✓') : t.red('✗');\n170: const timeStr = elapsed < 1000 ? `${elapsed}ms` : `${(elapsed / 1000).toFixed(1)}s`;\n171: const truncDetail = detail.length > 60 ? detail.slice(0, 57) + '...' : detail;\n172: \n173: spinner.stopAndPersist({\n174: symbol: icon,\n175: text: `${toolBadge(name)} ${t.dim(truncDetail)} ${t.dim(timeStr)}`,\n176: prefixText: ' ',\n177: });\n178: }\n179: \n180: // ===== Diff =====\n181: function showDiff(filename, diffText) {\n182: console.log(indent(t.bold(path.basename(filename)), 4));\n183: const lines = diffText.split('\\n');\n184: for (const line of lines) {\n185: if (line.startsWith('+')) {\n186: console.log(indent(t.green(line), 4));\n187: } else if (line.startsWith('-')) {\n188: console.log(indent(t.red(line), 4));\n189: }\n190: }\n191: console.log();\n192: }\n193: \n194: // ===== Turn Summary =====\n195: function showTurnSummary(tokens, duration, toolCalls) {\n196: const costPerToken = 0.000002;\n197: const cost = tokens * costPerToken;\n198: session.totalCost += cost;\n199: \n200: const parts = [];\n201: if (tokens > 0) parts.push(`${tokens.toLocaleString()} tokens`);\n202: parts.push(`$${cost.toFixed(4)}`);\n203: parts.push(`${duration}s`);\n204: if (toolCalls > 0) parts.push(`${toolCalls} tool${toolCalls !== 1 ? 's' : ''}`);\n205: \n206: if (session.filesModified.size > 0) {\n207: const files = [...session.filesModified].map(f => path.basename(f)).join(', ');\n208: parts.push(`modified ${files}`);\n209: }\n210: \n211: console.log(t.dim(` ${parts.join(' · ')}`));\n212: console.log();\n213: }\n214: \n215: // ===== Prompt =====\n216: function createPrompt() {\n217: return readline.createInterface({\n218: input: process.stdin,\n219: output: process.stdout,\n220: prompt: '',\n221: });\n222: }\n223: \n224: function showPrompt() {\n225: console.log(t.dim(' Ctrl+C to cancel · /help for commands'));\n226: return t.primary('❯ ');\n227: }\n228: \n229: // ===== Session Summary =====\n230: function showSessionSummary() {\n231: const elapsed = ((Date.now() - session.startTime) / 1000 / 60).toFixed(1);\n232: const parts = [\n233: `${elapsed} min`,\n234: `${session.turnCount} turns`,\n235: `${session.toolCallCount} tool calls`,\n236: `${session.totalTokens.toLocaleString()} tokens`,\n237: `$${session.totalCost.toFixed(4)}`,\n238: ];\n239: if (session.filesModified.size > 0) {\n240: parts.push(`${session.filesModified.size} files modified`);\n241: }\n242: if (session.commandsRun.length > 0) {\n243: parts.push(`${session.commandsRun.length} commands`);\n244: }\n245: \n246: console.log();\n247: console.log(t.dim(' Session: ') + t.text(parts.join(' · ')));\n248: console.log();\n249: }\n250: \n251: // ===== Help =====\n252: function showHelpMenu() {\n253: console.log();\n254: console.log(t.bold('Commands'));\n255: console.log(t.dim(' /help ') + 'Show this menu');\n256: console.log(t.dim(' /files ') + 'Show project file tree');\n257: console.log(t.dim(' /clear ') + 'Clear conversation');\n258: console.log(t.dim(' /cost ') + 'Show session stats');\n259: console.log(t.dim(' /undo ') + 'Undo last edit');\n260: console.log(t.dim(' /diff ') + 'Show git diff');\n261: console.log(t.dim(' /git <cmd> ') + 'Run a git command');\n262: console.log(t.dim(' /quit ') + 'Exit');\n263: console.log();\n264: console.log(t.bold('Tools'));\n265: console.log(t.dim(' Read, Write, Edit, Patch, Bash, Grep, Glob, ListDir, UndoEdit, Task, CodeReview'));\n266: console.log();\n267: }\n268: \n269: module.exports = {\n270: t,\n271: COLS,\n272: hr,\n273: stripAnsi,\n274: indent,\n275: showHeader,\n276: showWelcome,\n277: showUserMessage,\n278: showAssistantHeader,\n279: showAssistantMessage,\n280: renderCodeBlock,\n281: toolBadge,\n282: toolDetail,\n283: showToolCall,\n284: finishToolCall,\n285: showDiff,\n286: showTurnSummary,\n287: createPrompt,\n288: showPrompt,\n289: showSessionSummary,\n290: showHelpMenu,\n291: };"
165
- },
166
- "trackFiles": [
167
- "file:///home/runner/workspace/src/ui.js"
168
- ]
169
- }
170
- },
171
- {
172
- "type": "tool_result",
173
- "toolUseID": "toolu_01N8ynydkZnkzvdSexAx63zD",
174
- "run": {
175
- "status": "done",
176
- "progress": {},
177
- "result": {
178
- "absolutePath": "/home/runner/workspace/src/config.js",
179
- "content": "1: 'use strict';\n2: \n3: const OpenAI = require('openai');\n4: \n5: // ===== Config =====\n6: const NVIDIA_MODEL = 'nvidia/llama-3.1-nemotron-ultra-253b-v1';\n7: const REVIEWER_MODEL = 'nvidia/llama-3.1-nemotron-ultra-253b-v1';\n8: const MAX_TOOL_ITERATIONS = 50;\n9: const MAX_OUTPUT_LEN = 12000;\n10: const TOOL_TIMEOUT = 60000;\n11: const PROJECT_ROOT = process.cwd();\n12: \n13: const REVIEWER_SYSTEM_PROMPT = `You are a senior code reviewer. An AI coding assistant just made changes to a codebase. Your job is to review those changes thoroughly and report issues. Be specific — reference exact line numbers, function names, and variables.\n14: \n15: Focus on:\n16: 1. **Bugs & logic errors** — incorrect conditions, off-by-one, null/undefined risks, race conditions\n17: 2. **Security** — exposed secrets, injection risks, unsafe operations\n18: 3. **Edge cases** — unhandled inputs, missing error handling at boundaries\n19: 4. **Code quality** — naming, readability, dead code, unnecessary complexity\n20: 5. **Correctness** — does the code actually fulfil the stated intent?\n21: \n22: If everything looks good, say so briefly. If there are problems, list them clearly with severity (critical / warning / nit). You have no tools; your only output is this review.`;\n23: \n24: const nvidiaClient = new OpenAI({\n25: apiKey: process.env.NVIDIA_API_KEY || '',\n26: baseURL: 'https://integrate.api.nvidia.com/v1',\n27: });\n28: \n29: // ===== Session State =====\n30: const session = {\n31: conversationHistory: [],\n32: totalTokens: 0,\n33: totalCost: 0,\n34: toolCallCount: 0,\n35: filesModified: new Set(),\n36: filesRead: new Set(),\n37: commandsRun: [],\n38: editHistory: [], // { path, before, after, timestamp }\n39: startTime: Date.now(),\n40: turnCount: 0,\n41: };\n42: \n43: // ===== Shared Utilities =====\n44: function truncateOutput(str) {\n45: if (str.length > MAX_OUTPUT_LEN) {\n46: return str.slice(0, MAX_OUTPUT_LEN) + `\\n... (truncated, ${str.length} chars total)`;\n47: }\n48: return str;\n49: }\n50: \n51: const path = require('path');\n52: \n53: function resolvePath(p) {\n54: if (!p) return PROJECT_ROOT;\n55: return path.isAbsolute(p) ? p : path.resolve(PROJECT_ROOT, p);\n56: }\n57: \n58: function timestamp() {\n59: return new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n60: }\n61: \n62: function sleep(ms) {\n63: return new Promise(r => setTimeout(r, ms));\n64: }\n65: \n66: module.exports = {\n67: NVIDIA_MODEL,\n68: REVIEWER_MODEL,\n69: MAX_TOOL_ITERATIONS,\n70: MAX_OUTPUT_LEN,\n71: TOOL_TIMEOUT,\n72: PROJECT_ROOT,\n73: REVIEWER_SYSTEM_PROMPT,\n74: nvidiaClient,\n75: session,\n76: truncateOutput,\n77: resolvePath,\n78: timestamp,\n79: sleep,\n80: };"
180
- },
181
- "trackFiles": [
182
- "file:///home/runner/workspace/src/config.js"
183
- ]
184
- }
185
- }
186
- ]
187
- },
188
- {
189
- "role": "assistant",
190
- "messageId": 5,
191
- "content": [
192
- {
193
- "type": "text",
194
- "text": "The model ID is shown in the header on line 53 of `ui.js`. I'll remove it."
195
- },
196
- {
197
- "type": "tool_use",
198
- "complete": true,
199
- "id": "toolu_01LSPeeN952LYWoPRk6vw5R6",
200
- "name": "edit_file",
201
- "input": {
202
- "path": "/home/runner/workspace/src/ui.js",
203
- "old_str": " const name = t.primary.bold('⚡ Apex');\n const model = t.dim(NVIDIA_MODEL.split('/').pop());\n const branchStr = branch ? t.dim('on ') + t.text(branch) : '';\n const cwd = t.dim(path.basename(PROJECT_ROOT));\n\n console.log();\n console.log(`${name} ${model} ${cwd} ${branchStr}`);",
204
- "new_str": " const name = t.primary.bold('⚡ Apex');\n const branchStr = branch ? t.dim('on ') + t.text(branch) : '';\n const cwd = t.dim(path.basename(PROJECT_ROOT));\n\n console.log();\n console.log(`${name} ${cwd} ${branchStr}`);"
205
- }
206
- }
207
- ],
208
- "state": {
209
- "type": "complete",
210
- "stopReason": "tool_use"
211
- },
212
- "usage": {
213
- "model": "claude-opus-4-6",
214
- "maxInputTokens": 168000,
215
- "inputTokens": 1,
216
- "outputTokens": 322,
217
- "cacheCreationInputTokens": 4819,
218
- "cacheReadInputTokens": 15512,
219
- "totalInputTokens": 20332,
220
- "timestamp": "2026-02-25T23:22:07.045Z"
221
- }
222
- },
223
- {
224
- "role": "user",
225
- "messageId": 6,
226
- "content": [
227
- {
228
- "type": "tool_result",
229
- "toolUseID": "toolu_01LSPeeN952LYWoPRk6vw5R6",
230
- "run": {
231
- "status": "done",
232
- "progress": {},
233
- "result": {
234
- "diff": "```diff\nIndex: /home/runner/workspace/src/ui.js\n===================================================================\n--- /home/runner/workspace/src/ui.js\toriginal\n+++ /home/runner/workspace/src/ui.js\tmodified\n@@ -49,14 +49,13 @@\n let branch = '';\n try { branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', { encoding: 'utf-8', cwd: PROJECT_ROOT }).trim(); } catch {}\n \n const name = t.primary.bold('⚡ Apex');\n- const model = t.dim(NVIDIA_MODEL.split('/').pop());\n const branchStr = branch ? t.dim('on ') + t.text(branch) : '';\n const cwd = t.dim(path.basename(PROJECT_ROOT));\n \n console.log();\n- console.log(`${name} ${model} ${cwd} ${branchStr}`);\n+ console.log(`${name} ${cwd} ${branchStr}`);\n console.log(hr());\n }\n \n // ===== Welcome =====\n```",
235
- "lineRange": [
236
- 52,
237
- 57
238
- ]
239
- },
240
- "trackFiles": [
241
- "file:///home/runner/workspace/src/ui.js"
242
- ]
243
- }
244
- }
245
- ]
246
- },
247
- {
248
- "role": "assistant",
249
- "messageId": 7,
250
- "content": [
251
- {
252
- "type": "text",
253
- "text": "Now let me also clean up the unused `NVIDIA_MODEL` import in `ui.js`:"
254
- },
255
- {
256
- "type": "tool_use",
257
- "complete": true,
258
- "id": "toolu_01Sra4vQ9jK4enhkrz8ndTcW",
259
- "name": "edit_file",
260
- "input": {
261
- "path": "/home/runner/workspace/src/ui.js",
262
- "old_str": "const { NVIDIA_MODEL, MAX_TOOL_ITERATIONS, PROJECT_ROOT, session, timestamp } = require('./config');",
263
- "new_str": "const { MAX_TOOL_ITERATIONS, PROJECT_ROOT, session, timestamp } = require('./config');"
264
- }
265
- }
266
- ],
267
- "state": {
268
- "type": "complete",
269
- "stopReason": "tool_use"
270
- },
271
- "usage": {
272
- "model": "claude-opus-4-6",
273
- "maxInputTokens": 168000,
274
- "inputTokens": 1,
275
- "outputTokens": 173,
276
- "cacheCreationInputTokens": 635,
277
- "cacheReadInputTokens": 20331,
278
- "totalInputTokens": 20967,
279
- "timestamp": "2026-02-25T23:22:11.065Z"
280
- }
281
- },
282
- {
283
- "role": "user",
284
- "messageId": 8,
285
- "content": [
286
- {
287
- "type": "tool_result",
288
- "toolUseID": "toolu_01Sra4vQ9jK4enhkrz8ndTcW",
289
- "run": {
290
- "status": "done",
291
- "progress": {},
292
- "result": {
293
- "diff": "```diff\nIndex: /home/runner/workspace/src/ui.js\n===================================================================\n--- /home/runner/workspace/src/ui.js\toriginal\n+++ /home/runner/workspace/src/ui.js\tmodified\n@@ -7,9 +7,9 @@\n const readline = require('readline');\n const { highlight } = require('cli-highlight');\n const path = require('path');\n const { execSync } = require('child_process');\n-const { NVIDIA_MODEL, MAX_TOOL_ITERATIONS, PROJECT_ROOT, session, timestamp } = require('./config');\n+const { MAX_TOOL_ITERATIONS, PROJECT_ROOT, session, timestamp } = require('./config');\n \n // ===== Theme (Amp-inspired) =====\n const t = {\n primary: chalk.hex('#6366f1'),\n```",
294
- "lineRange": [
295
- 11,
296
- 11
297
- ]
298
- },
299
- "trackFiles": [
300
- "file:///home/runner/workspace/src/ui.js"
301
- ]
302
- }
303
- }
304
- ]
305
- },
306
- {
307
- "role": "assistant",
308
- "messageId": 9,
309
- "content": [
310
- {
311
- "type": "text",
312
- "text": "Done. Removed the model ID (`NVIDIA_MODEL`) from the CLI header and cleaned up the unused import."
313
- }
314
- ],
315
- "state": {
316
- "type": "complete",
317
- "stopReason": "end_turn"
318
- },
319
- "usage": {
320
- "model": "claude-opus-4-6",
321
- "maxInputTokens": 168000,
322
- "inputTokens": 1,
323
- "outputTokens": 27,
324
- "cacheCreationInputTokens": 409,
325
- "cacheReadInputTokens": 20966,
326
- "totalInputTokens": 21376,
327
- "timestamp": "2026-02-25T23:22:13.703Z"
328
- },
329
- "turnElapsedMs": 19699
330
- }
331
- ],
332
- "agentMode": "smart",
333
- "nextMessageId": 10,
334
- "meta": {
335
- "traces": [
336
- {
337
- "name": "agent",
338
- "id": "8wVNb",
339
- "startTime": "2026-02-25T23:21:54.004Z",
340
- "context": {
341
- "messageId": 0
342
- },
343
- "endTime": "2026-02-25T23:22:13.704Z"
344
- },
345
- {
346
- "name": "inference",
347
- "id": "OKcvJ",
348
- "parent": "8wVNb",
349
- "startTime": "2026-02-25T23:21:54.006Z",
350
- "context": {
351
- "messageId": 0
352
- },
353
- "endTime": "2026-02-25T23:21:57.626Z"
354
- },
355
- {
356
- "name": "tools",
357
- "id": "L5njx",
358
- "parent": "8wVNb",
359
- "startTime": "2026-02-25T23:21:57.625Z",
360
- "context": {
361
- "messageId": 1
362
- },
363
- "endTime": "2026-02-25T23:21:57.641Z"
364
- },
365
- {
366
- "name": "inference",
367
- "id": "sz9p3",
368
- "parent": "8wVNb",
369
- "startTime": "2026-02-25T23:21:57.642Z",
370
- "context": {
371
- "messageId": 0
372
- },
373
- "endTime": "2026-02-25T23:22:01.036Z"
374
- },
375
- {
376
- "name": "tools",
377
- "id": "VNIQi",
378
- "parent": "8wVNb",
379
- "startTime": "2026-02-25T23:22:01.036Z",
380
- "context": {
381
- "messageId": 3
382
- },
383
- "endTime": "2026-02-25T23:22:01.048Z"
384
- },
385
- {
386
- "name": "inference",
387
- "id": "333JM",
388
- "parent": "8wVNb",
389
- "startTime": "2026-02-25T23:22:01.049Z",
390
- "context": {
391
- "messageId": 0
392
- },
393
- "endTime": "2026-02-25T23:22:07.045Z"
394
- },
395
- {
396
- "name": "tools",
397
- "id": "JJuGx",
398
- "parent": "8wVNb",
399
- "startTime": "2026-02-25T23:22:07.045Z",
400
- "context": {
401
- "messageId": 5
402
- },
403
- "endTime": "2026-02-25T23:22:07.061Z"
404
- },
405
- {
406
- "name": "inference",
407
- "id": "iae33",
408
- "parent": "8wVNb",
409
- "startTime": "2026-02-25T23:22:07.062Z",
410
- "context": {
411
- "messageId": 0
412
- },
413
- "endTime": "2026-02-25T23:22:11.066Z"
414
- },
415
- {
416
- "name": "tools",
417
- "id": "VWr0o",
418
- "parent": "8wVNb",
419
- "startTime": "2026-02-25T23:22:11.066Z",
420
- "context": {
421
- "messageId": 7
422
- },
423
- "endTime": "2026-02-25T23:22:11.078Z"
424
- },
425
- {
426
- "name": "inference",
427
- "id": "XasJV",
428
- "parent": "8wVNb",
429
- "startTime": "2026-02-25T23:22:11.079Z",
430
- "context": {
431
- "messageId": 0
432
- },
433
- "endTime": "2026-02-25T23:22:13.704Z"
434
- }
435
- ]
436
- },
437
- "env": {
438
- "initial": {
439
- "trees": [
440
- {
441
- "displayName": "workspace",
442
- "uri": "file:///home/runner/workspace"
443
- }
444
- ],
445
- "platform": {
446
- "os": "linux",
447
- "osVersion": "Ubuntu 24.04.2 LTS",
448
- "cpuArchitecture": "x64",
449
- "webBrowser": false,
450
- "client": "CLI",
451
- "clientVersion": "0.0.1772003388-gaa1ef1",
452
- "clientType": "cli",
453
- "installationID": "990855e2-5987-4061-ad34-8c29deacfa95",
454
- "deviceFingerprint": "v1:fp_5e0b4aaea6d8b2adcf3c155505cf5c39765fb8ea3e8157ac186424d91df98615"
455
- },
456
- "tags": [
457
- "model:claude-opus-4-6"
458
- ]
459
- }
460
- },
461
- "title": "Remove model ID from CLI",
462
- "~debug": {
463
- "lastInferenceUsage": {
464
- "model": "claude-opus-4-6",
465
- "maxInputTokens": 168000,
466
- "inputTokens": 3,
467
- "outputTokens": 322,
468
- "cacheCreationInputTokens": 4819,
469
- "cacheReadInputTokens": 20966,
470
- "totalInputTokens": 21376,
471
- "timestamp": "2026-02-25T23:22:13.703Z"
472
- }
473
- }
474
- }