@platless/axom-cli 0.3.13 → 0.5.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 (235) hide show
  1. package/dist/axom-patch/cli/README.md +30 -8
  2. package/dist/axom-patch/cli/account-limits/README.md +27 -0
  3. package/dist/axom-patch/cli/account-limits/antigravity-proxy.mjs +47 -0
  4. package/dist/axom-patch/cli/account-limits/antigravity-read.mjs +90 -0
  5. package/dist/axom-patch/cli/account-limits/antigravity.mjs +46 -0
  6. package/dist/axom-patch/cli/account-limits/generate.py +120 -0
  7. package/dist/axom-patch/cli/account-limits/kimi-proxy.mjs +64 -0
  8. package/dist/axom-patch/cli/account-limits/normalize.mjs +151 -0
  9. package/dist/axom-patch/cli/claude-account-limits.json +37 -0
  10. package/dist/axom-patch/cli/codex-account-limits.json +37 -0
  11. package/dist/axom-patch/cli/commandcode-account-limits.json +30 -0
  12. package/dist/axom-patch/cli/nightly-task.md +152 -0
  13. package/dist/axom-patch/cli/pi-subagent-subwork.json +23 -0
  14. package/dist/axom-patch/cli/probes/claude-late-async-terminal.mjs +5 -1
  15. package/dist/axom-patch/cli/probes/pi-subagent-subwork.mjs +211 -0
  16. package/dist/axom-patch/cli/probes/qoder-steering.mjs +1 -1
  17. package/dist/axom-patch/cli/probes/qoder-subagent-origin.mjs +20 -8
  18. package/dist/axom-patch/cli/probes/zcode-subagent-subwork.mjs +257 -0
  19. package/dist/axom-patch/cli/qoder-background-terminal.md +2 -1
  20. package/dist/axom-patch/cli/qoder-foreground-output.md +4 -3
  21. package/dist/axom-patch/cli/qoder-steering.json +15 -15
  22. package/dist/axom-patch/cli/qoder-subagent-origin.json +21 -21
  23. package/dist/axom-patch/cli/runtime.json +34 -8
  24. package/dist/axom-patch/cli/zcode-account-limits.json +31 -0
  25. package/dist/axom-patch/cli/zcode-models.json +38 -0
  26. package/dist/axom-patch/cli/zcode-subagent-subwork.json +73 -0
  27. package/dist/cli.js +33 -6
  28. package/dist/keepers/acp/keeper.mjs +3083 -0
  29. package/dist/keepers/acp/manifest.json +9 -0
  30. package/dist/keepers/terminal/keeper.mjs +8469 -0
  31. package/dist/keepers/terminal/manifest.json +9 -0
  32. package/dist/keepers/terminal/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  33. package/dist/keepers/terminal/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  34. package/dist/keepers/terminal/node_modules/node-pty/lib/index.js +52 -0
  35. package/dist/keepers/terminal/node_modules/node-pty/lib/interfaces.js +7 -0
  36. package/dist/keepers/terminal/node_modules/node-pty/lib/shared/conout.js +10 -0
  37. package/dist/keepers/terminal/node_modules/node-pty/lib/terminal.js +190 -0
  38. package/dist/keepers/terminal/node_modules/node-pty/lib/types.js +7 -0
  39. package/dist/keepers/terminal/node_modules/node-pty/lib/unixTerminal.js +351 -0
  40. package/dist/keepers/terminal/node_modules/node-pty/lib/utils.js +38 -0
  41. package/dist/keepers/terminal/node_modules/node-pty/lib/windowsConoutConnection.js +131 -0
  42. package/dist/keepers/terminal/node_modules/node-pty/lib/windowsPtyAgent.js +344 -0
  43. package/dist/keepers/terminal/node_modules/node-pty/lib/windowsTerminal.js +209 -0
  44. package/dist/keepers/terminal/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  45. package/dist/keepers/terminal/node_modules/node-pty/package.json +66 -0
  46. package/dist/keepers/terminal/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  47. package/dist/keepers/terminal/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  48. package/dist/keepers/terminal/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  49. package/dist/keepers/terminal/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  50. package/dist/keepers/terminal/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  51. package/dist/keepers/terminal/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  52. package/dist/runtime-deps/qoder-sdk/package-lock.json +1189 -0
  53. package/dist/runtime-deps/qoder-sdk/package.json +8 -0
  54. package/dist/test/keeperKit.js +67 -0
  55. package/dist/workstation/acp/acpAgents.js +2163 -611
  56. package/dist/workstation/acp/acpClient.js +60 -497
  57. package/dist/workstation/acp/adoption.js +10 -396
  58. package/dist/workstation/acp/binaryInstall.js +100 -27
  59. package/dist/workstation/acp/builds/gc.js +245 -0
  60. package/dist/workstation/acp/builds/install/binary.js +28 -0
  61. package/dist/workstation/acp/builds/install/npm.js +235 -0
  62. package/dist/workstation/acp/builds/install/uv.js +254 -0
  63. package/dist/workstation/acp/builds/migrate.js +195 -0
  64. package/dist/workstation/acp/builds/model.js +128 -0
  65. package/dist/workstation/acp/builds/nodeGate.js +100 -0
  66. package/dist/workstation/acp/builds/store.js +352 -0
  67. package/dist/workstation/acp/commandTableProbe.js +68 -0
  68. package/dist/workstation/acp/configOptions.js +103 -1
  69. package/dist/workstation/acp/envSecrets.js +27 -0
  70. package/dist/workstation/acp/initializeResponse.js +285 -0
  71. package/dist/workstation/acp/installErrors.js +12 -2
  72. package/dist/workstation/acp/installProbe.js +1 -1
  73. package/dist/workstation/acp/managedPatches.js +76 -160
  74. package/dist/workstation/acp/outbox.js +330 -0
  75. package/dist/workstation/acp/patchAssets.js +20 -3
  76. package/dist/workstation/acp/permission.js +42 -10
  77. package/dist/workstation/acp/processor/checkpoint.js +87 -0
  78. package/dist/workstation/acp/processor/commands.js +35 -0
  79. package/dist/workstation/acp/processor/control.js +355 -0
  80. package/dist/workstation/acp/processor/emit.js +26 -0
  81. package/dist/workstation/acp/processor/jsonrpc.js +172 -0
  82. package/dist/workstation/acp/processor/memoryLog.js +49 -0
  83. package/dist/workstation/acp/processor/origins.js +48 -0
  84. package/dist/workstation/acp/processor/output.js +67 -0
  85. package/dist/workstation/acp/processor/projection.js +42 -0
  86. package/dist/workstation/acp/processor/record.js +128 -0
  87. package/dist/workstation/acp/processor/runtime.js +181 -0
  88. package/dist/workstation/acp/processor/sdkSchemas.js +61 -0
  89. package/dist/workstation/acp/processor/session.js +525 -0
  90. package/dist/workstation/acp/processor/sideChannel.js +80 -0
  91. package/dist/workstation/acp/processor/state.js +74 -0
  92. package/dist/workstation/acp/processor/step.js +459 -0
  93. package/dist/workstation/acp/processor/test/fixtureLog.js +65 -0
  94. package/dist/workstation/acp/processor/test/harness.js +120 -0
  95. package/dist/workstation/acp/processor/test/largeIdEcho.js +50 -0
  96. package/dist/workstation/acp/processor/test/rawAgent.js +70 -0
  97. package/dist/workstation/acp/processor/transport/generations.js +76 -0
  98. package/dist/workstation/acp/processor/transport/keeper.js +130 -0
  99. package/dist/workstation/acp/processor/transport/local.js +269 -0
  100. package/dist/workstation/acp/processor/transport/types.js +78 -0
  101. package/dist/workstation/acp/processor/updates.js +364 -0
  102. package/dist/workstation/acp/processorSession.js +1512 -0
  103. package/dist/workstation/acp/qoderStartup.js +1 -1
  104. package/dist/workstation/acp/registry/catalog.js +154 -32
  105. package/dist/workstation/acp/registry/launch.js +61 -119
  106. package/dist/workstation/acp/sessionUpdateMapper.js +18 -7
  107. package/dist/workstation/acp/steering.js +58 -0
  108. package/dist/workstation/acp/switching.js +114 -0
  109. package/dist/workstation/acp/terminalLogin.js +16 -42
  110. package/dist/workstation/acp/terminalLoginSpec.js +41 -0
  111. package/dist/workstation/acp/test/adapterFixtures.js +256 -0
  112. package/dist/workstation/acp/test/daemonLife.js +106 -0
  113. package/dist/workstation/acp/test/keeperWorld.js +267 -0
  114. package/dist/workstation/acp/test/memoryOutbox.js +55 -0
  115. package/dist/workstation/acp/test/raw/fixtures.js +196 -0
  116. package/dist/workstation/acp/test/raw/qoderCaptures.js +125 -0
  117. package/dist/workstation/acp/test/raw/sanitize.js +344 -0
  118. package/dist/workstation/acp/test/raw/sources.js +249 -0
  119. package/dist/workstation/acp/test/realAdapter.js +377 -0
  120. package/dist/workstation/acp/test/scriptAgent.js +206 -0
  121. package/dist/workstation/acp/test/sessionFrames.js +42 -0
  122. package/dist/workstation/acp/timedCommand.js +4 -2
  123. package/dist/workstation/acp/uvxInstall.js +72 -122
  124. package/dist/workstation/agentFlow.js +103 -0
  125. package/dist/workstation/agentSessions.js +1324 -474
  126. package/dist/workstation/channels/agent.js +7 -5
  127. package/dist/workstation/channels/computer.js +69 -21
  128. package/dist/workstation/channels/computerExecs.js +200 -0
  129. package/dist/workstation/channels/management.js +84 -4
  130. package/dist/workstation/daemon.js +288 -7
  131. package/dist/workstation/daemonctl.js +28 -2
  132. package/dist/workstation/exec/attach.js +126 -0
  133. package/dist/workstation/exec/command.js +40 -0
  134. package/dist/workstation/exec/durable.js +517 -0
  135. package/dist/workstation/exec/fallback.js +106 -0
  136. package/dist/workstation/exec/policy.js +837 -0
  137. package/dist/workstation/exec/shaping.js +211 -0
  138. package/dist/workstation/exec.js +3 -112
  139. package/dist/workstation/files/adapters/computerFileFrames.js +51 -0
  140. package/dist/workstation/files/adapters/toolRequests.js +121 -0
  141. package/dist/workstation/files/client.js +455 -0
  142. package/dist/workstation/files/errors.js +28 -0
  143. package/dist/workstation/files/fence.js +350 -0
  144. package/dist/workstation/files/find/fileIndex.js +153 -0
  145. package/dist/workstation/files/find/fuzzy.js +155 -0
  146. package/dist/workstation/files/host.js +122 -0
  147. package/dist/workstation/files/hostProtocol.js +2 -0
  148. package/dist/workstation/files/media/cache.js +620 -0
  149. package/dist/workstation/files/media/encoding.js +308 -0
  150. package/dist/workstation/files/media/estimator.js +100 -0
  151. package/dist/workstation/files/media/media.js +325 -0
  152. package/dist/workstation/files/media/packedAudio.js +23 -0
  153. package/dist/workstation/files/media/scheduler.js +551 -0
  154. package/dist/workstation/files/media/types.js +5 -0
  155. package/dist/workstation/files/scope.js +45 -0
  156. package/dist/workstation/files/structured.js +284 -0
  157. package/dist/workstation/{fileOps.js → files/text.js} +117 -38
  158. package/dist/workstation/files/uploads.js +351 -0
  159. package/dist/workstation/journal.js +65 -236
  160. package/dist/workstation/keepers/acp/client.js +101 -0
  161. package/dist/workstation/keepers/acp/envelope.js +62 -0
  162. package/dist/workstation/keepers/acp/host.js +419 -0
  163. package/dist/workstation/keepers/acp/main.js +18 -0
  164. package/dist/workstation/keepers/acp/memoryStream.js +121 -0
  165. package/dist/workstation/keepers/acp/params.js +137 -0
  166. package/dist/workstation/keepers/acp/protocol.js +66 -0
  167. package/dist/workstation/keepers/acp/recover.js +120 -0
  168. package/dist/workstation/keepers/acp/session.js +584 -0
  169. package/dist/workstation/keepers/acp/stderr.js +154 -0
  170. package/dist/workstation/keepers/kit/activity.js +103 -0
  171. package/dist/workstation/keepers/kit/bootstrap.js +164 -0
  172. package/dist/workstation/keepers/kit/buildVersion.js +51 -0
  173. package/dist/workstation/keepers/kit/bundle.js +120 -0
  174. package/dist/workstation/keepers/kit/client.js +432 -0
  175. package/dist/workstation/keepers/kit/identity.js +21 -0
  176. package/dist/workstation/keepers/kit/ipc.js +112 -0
  177. package/dist/workstation/keepers/kit/launchConfig.js +8 -0
  178. package/dist/workstation/keepers/kit/launcher.js +249 -0
  179. package/dist/workstation/keepers/kit/lock.js +123 -0
  180. package/dist/workstation/keepers/kit/orphanSweep.js +86 -0
  181. package/dist/workstation/keepers/kit/paths.js +75 -0
  182. package/dist/workstation/keepers/kit/protocol.js +43 -0
  183. package/dist/workstation/keepers/kit/server.js +518 -0
  184. package/dist/workstation/keepers/kit/streamLog.js +697 -0
  185. package/dist/workstation/keepers/legacy.js +296 -0
  186. package/dist/workstation/keepers/policy.js +576 -0
  187. package/dist/workstation/keepers/stop.js +34 -0
  188. package/dist/workstation/keepers/terminal/client.js +213 -0
  189. package/dist/workstation/keepers/terminal/exec.js +981 -0
  190. package/dist/workstation/keepers/terminal/generations.js +129 -0
  191. package/dist/workstation/keepers/terminal/keeper.js +62 -0
  192. package/dist/workstation/keepers/terminal/main.js +43 -0
  193. package/dist/workstation/keepers/terminal/orphanSweep.js +3 -0
  194. package/dist/workstation/keepers/terminal/params.js +27 -0
  195. package/dist/workstation/keepers/terminal/protocol.js +56 -0
  196. package/dist/workstation/keepers/terminal/pty.js +330 -0
  197. package/dist/workstation/protocol/accountLimits.js +47 -0
  198. package/dist/workstation/protocol/agent.js +48 -4
  199. package/dist/workstation/protocol/common.js +30 -0
  200. package/dist/workstation/protocol/computer.js +15 -4
  201. package/dist/workstation/protocol/management.js +50 -2
  202. package/dist/workstation/qoderAdapter/backgroundProcess.js +18 -6
  203. package/dist/workstation/qoderAdapter/backgroundTerminal.js +78 -147
  204. package/dist/workstation/qoderAdapter/backgroundTerminalFold.js +372 -0
  205. package/dist/workstation/qoderAdapter/callbackContext.js +76 -0
  206. package/dist/workstation/qoderAdapter/foregroundOutput.js +15 -9
  207. package/dist/workstation/qoderAdapter/history.js +1 -3
  208. package/dist/workstation/qoderAdapter/main.js +4 -2
  209. package/dist/workstation/qoderAdapter/sdkDriver.js +1 -2
  210. package/dist/workstation/qoderAdapter/sdkRuntime.js +93 -0
  211. package/dist/workstation/qoderAdapter/sdkRuntimeInstall.js +145 -0
  212. package/dist/workstation/qoderAdapter/session.js +1 -1
  213. package/dist/workstation/qoderAdapter/subwork.js +15 -7
  214. package/dist/workstation/systemMetrics.js +110 -1
  215. package/dist/workstation/tools/client.js +9 -1
  216. package/dist/workstation/tools/info.js +50 -0
  217. package/dist/workstation/tools/keeperProcess.js +15 -5
  218. package/dist/workstation/tools/router.js +55 -0
  219. package/dist/workstation/tools/terminalRouter.js +222 -0
  220. package/dist/workstation/tools/validation.js +37 -1
  221. package/dist/workstation/update/coordinator.js +3 -0
  222. package/dist/workstation/update/ptyPreflight.js +21 -0
  223. package/dist/workstation/update/taskRegistry.js +105 -11
  224. package/package.json +10 -7
  225. package/dist/workstation/acp/acpSession.js +0 -1475
  226. package/dist/workstation/acp/contract.js +0 -499
  227. package/dist/workstation/acp/draftInterceptor.js +0 -163
  228. package/dist/workstation/acp/sessionScope.js +0 -19
  229. package/dist/workstation/filePaths.js +0 -174
  230. package/dist/workstation/fileWorker.js +0 -81
  231. package/dist/workstation/fileWorkerClient.js +0 -121
  232. package/dist/workstation/qoderAdapter/taskEvent.js +0 -26
  233. package/dist/workstation/tools/core.js +0 -50
  234. package/dist/workstation/tools/files.js +0 -525
  235. package/dist/workstation/tools/terminal.js +0 -214
@@ -2,49 +2,49 @@
2
2
  "id": "qoder-steering",
3
3
  "package": "@qoder-ai/qodercli",
4
4
  "versions": [
5
- "1.1.61"
5
+ "1.1.71"
6
6
  ],
7
7
  "bin": "qodercli",
8
8
  "edits": [
9
9
  {
10
10
  "file": "bundle/qodercli.js",
11
- "before_sha256": "88829cdc00f1d435d6b9fb4cd8088d678731a99e8c414cb02159a770ddedc32d",
12
- "after_sha256": "b2401c8cae2370a486eae2d14f0d8a39826887886f558982b73ba2c839a9d9a3",
13
- "before": "protocolVersion:xbs,authMethods:e,agentInfo:{name:HQ,title:Hn,version:t},agentCapabilities:",
11
+ "before_sha256": "a7ff3d5883231c1add98d266d5f860813c6fa7e498ae075384b7c558e8531c88",
12
+ "after_sha256": "b43037a4df32734a47bd5eb0f937583252bbbe637c36514cc8aba7fced3acfe9",
13
+ "before": "protocolVersion:_vs,authMethods:e,agentInfo:{name:d0,title:Nn,version:t},agentCapabilities:",
14
14
  "after": "protocolVersion:xbs,authMethods:e,agentInfo:{name:HQ,title:Hn,version:t},_meta:{steering:{supported:true,timings:[\"now\"]}},agentCapabilities:"
15
15
  },
16
16
  {
17
17
  "file": "bundle/qodercli.js",
18
- "before_sha256": "b2401c8cae2370a486eae2d14f0d8a39826887886f558982b73ba2c839a9d9a3",
19
- "after_sha256": "d2725132d0ff3bb9a234f7d3a782e463bc6c2637a9e995569c5702ce50130dd4",
18
+ "before_sha256": "b43037a4df32734a47bd5eb0f937583252bbbe637c36514cc8aba7fced3acfe9",
19
+ "after_sha256": "f1ec60df59dce8dc241fa504d947e5eb5aad7c098dbaa5e89a28d3fd8bb9000c",
20
20
  "before": "async prompt(A){await this.ensureAuthenticated();let e=this.sessions.get(A.sessionId);",
21
21
  "after": "async extMethod(method,params){\n if(method !== \"_session/steering\") throw as.methodNotFound(method);\n await this.ensureAuthenticated();\n if(!params || typeof params.sessionId !== \"string\" || !params.sessionId) throw as.invalidParams(undefined,\"Missing sessionId\");\n const session=this.sessions.get(params.sessionId);\n if(!session) throw as.invalidParams(undefined,\"Unknown sessionId\");\n return session.axomQoderSteer(params);\n}\nasync prompt(A){await this.ensureAuthenticated();let e=this.sessions.get(A.sessionId);"
22
22
  },
23
23
  {
24
24
  "file": "bundle/qodercli.js",
25
- "before_sha256": "d2725132d0ff3bb9a234f7d3a782e463bc6c2637a9e995569c5702ce50130dd4",
26
- "after_sha256": "c3fc2dae248e7e9105417fabe289b52609daea7512ca770e4dc9cbd3d2cfdb61",
25
+ "before_sha256": "f1ec60df59dce8dc241fa504d947e5eb5aad7c098dbaa5e89a28d3fd8bb9000c",
26
+ "after_sha256": "ea26b18b8e10d410c6eaf03d9df720d6b061979dd9cbc62ff4a1a98682b2f3e4",
27
27
  "before": "promptRunning=!1;pendingMessages=[];",
28
28
  "after": "promptRunning=!1;pendingMessages=[];axomQoderSteeringMessages=[];"
29
29
  },
30
30
  {
31
31
  "file": "bundle/qodercli.js",
32
- "before_sha256": "c3fc2dae248e7e9105417fabe289b52609daea7512ca770e4dc9cbd3d2cfdb61",
33
- "after_sha256": "88dd0b3900897e3d9737ac63e5261711aa7aa277e4ca4d38ee59bdb987584eb5",
32
+ "before_sha256": "ea26b18b8e10d410c6eaf03d9df720d6b061979dd9cbc62ff4a1a98682b2f3e4",
33
+ "after_sha256": "3660901654aecf58b04ac669f2dc945c8ba16376e204ccef53f499a13d1d69e9",
34
34
  "before": "async promptViaQueryEngine(A,e,t,i,n){",
35
35
  "after": "axomQoderSteer(A){\n const steering=A._meta?.steering;\n if(steering?.priority !== undefined && steering.priority !== \"now\") throw as.invalidParams(undefined,\"Qoder supports only now steering\");\n if(steering?.idleBehavior !== undefined && steering.idleBehavior !== \"promptRequired\") throw as.invalidParams(undefined,\"Unsupported steering idleBehavior\");\n if(!Array.isArray(A.prompt) || !A.prompt.length || A.prompt.some(block=>!block || block.type !== \"text\" || typeof block.text !== \"string\")) throw as.invalidParams(undefined,\"Qoder steering requires text blocks\");\n const text=A.prompt.map(block=>block.text).join(\"\\n\");\n if(!text.trim() || text.length > 131072) throw as.invalidParams(undefined,\"Invalid steering text length\");\n if(this.disposed || !this.active || !this.promptRunning || !this.queryEngine?.activeAbortController || !this.pendingPrompt || this.pendingPrompt.signal.aborted) return {outcome:\"promptRequired\",reason:\"noRunningTurn\"};\n if(this.axomQoderSteeringMessages.length >= 32) throw as.invalidParams(undefined,\"Too many pending steering messages\");\n const message={prompt:A.prompt.map(block=>({type:\"text\",text:block.text})),id:mte()};\n this.axomQoderSteeringMessages.push(message);\n try{this.queryEngine.abort({source:\"sdk_interrupt\",origin:\"user\"});}\n catch(error){this.axomQoderSteeringMessages.pop();throw error;}\n return {outcome:\"injected\"};\n}\nasync promptViaQueryEngine(A,e,t,i,n){\n let result;\n try{\n result=await this.axomQoderPromptOnce(A,e,t,i,n);\n const originalId=result.userMessageId;\n while(!e.aborted && !this.disposed && this.active && this.axomQoderSteeringMessages.length){\n const message=this.axomQoderSteeringMessages.shift();\n const next=await this.axomQoderPromptOnce(message.prompt,e,mte(),message.id);\n if(result.usage && next.usage){\n const inputTokens=result.usage.inputTokens+next.usage.inputTokens;\n const outputTokens=result.usage.outputTokens+next.usage.outputTokens;\n next.usage={inputTokens,outputTokens,totalTokens:inputTokens+outputTokens};\n const models=new Map;\n for(const item of [...result._meta?.quota?.model_usage??[],...next._meta?.quota?.model_usage??[]]){\n const prior=models.get(item.model)??{input_tokens:0,output_tokens:0};\n models.set(item.model,{input_tokens:prior.input_tokens+item.token_count.input_tokens,output_tokens:prior.output_tokens+item.token_count.output_tokens});\n }\n next._meta={...next._meta,quota:{token_count:{input_tokens:inputTokens,output_tokens:outputTokens},model_usage:Array.from(models,([model,token_count])=>({model,token_count}))}};\n }\n result=next;\n }\n return {...result,...(originalId?{userMessageId:originalId}:{})};\n }finally{this.axomQoderSteeringMessages.length=0;}\n}\nasync axomQoderPromptOnce(A,e,t,i,n){"
36
36
  },
37
37
  {
38
38
  "file": "bundle/qodercli.js",
39
- "before_sha256": "88dd0b3900897e3d9737ac63e5261711aa7aa277e4ca4d38ee59bdb987584eb5",
40
- "after_sha256": "e45ea5a46d85285a41739fe391fe83dae491e1de3ba1882452b34e5b1453fab4",
41
- "before": "if(!A.includes(\"Operation aborted\"))throw new as(500,A);",
39
+ "before_sha256": "3660901654aecf58b04ac669f2dc945c8ba16376e204ccef53f499a13d1d69e9",
40
+ "after_sha256": "7b031034151e76daccbf26c7dbf08779b3e75a281da97b8a56673efdf8433956",
41
+ "before": "if(!A.includes(\"Operation aborted\"))throw new cs(500,A);",
42
42
  "after": "if(!A.includes(\"Operation aborted\")&&!(this.axomQoderSteeringMessages.length&&[\"aborted_tools\",\"aborted_streaming\"].includes(c.terminal_reason)))throw new as(500,A);"
43
43
  },
44
44
  {
45
45
  "file": "bundle/qodercli.js",
46
- "before_sha256": "e45ea5a46d85285a41739fe391fe83dae491e1de3ba1882452b34e5b1453fab4",
47
- "after_sha256": "a776c9f78e10cb1231229efebf3364ba0259f40b43bb09de77e2a0fb890f7199",
46
+ "before_sha256": "7b031034151e76daccbf26c7dbf08779b3e75a281da97b8a56673efdf8433956",
47
+ "after_sha256": "a2949de7f397a904753d5d1d838d637cc93b3cf43e8b51af8e58a188d6c2e282",
48
48
  "before": "else if(\"error_during_execution\"===A.subtype&&\"refusal\"!==A.stop_reason){let e=A.errors??[];",
49
49
  "after": "else if(\"error_during_execution\"===A.subtype&&\"refusal\"!==A.stop_reason&&!(this.axomQoderSteeringMessages.length&&[\"aborted_tools\",\"aborted_streaming\"].includes(A.terminal_reason))){let e=A.errors??[];"
50
50
  }
@@ -2,69 +2,69 @@
2
2
  "id": "qoder-subagent-origin",
3
3
  "package": "@qoder-ai/qodercli",
4
4
  "versions": [
5
- "1.1.61"
5
+ "1.1.71"
6
6
  ],
7
7
  "edits": [
8
8
  {
9
9
  "file": "bundle/qodercli.js",
10
- "before_sha256": "34875088fd8af9c97e88446cbbfa11bca24c1b6558cec048ac1152bd5486f4e9",
11
- "after_sha256": "b29a975245a7194ef2ac4f2a742090d9e0d8f64ba3471bae475a564ee96600c1",
10
+ "before_sha256": "bbac475858838d609241881d1ee89b26c32a2eae8697672522778b18ed78a94a",
11
+ "after_sha256": "4807a4c1cfdb57a6bd9102ec3924185e3e2649935164fed3e98ca353063ff5f0",
12
12
  "before": "toolCallNames=new Map;",
13
13
  "after": "toolCallNames=new Map;axomQoderToolOrigins=new Map;"
14
14
  },
15
15
  {
16
16
  "file": "bundle/qodercli.js",
17
- "before_sha256": "b29a975245a7194ef2ac4f2a742090d9e0d8f64ba3471bae475a564ee96600c1",
18
- "after_sha256": "8d6dac333c191312ffdd5180554279dc168405cffc3720833f21139f9242d5fe",
17
+ "before_sha256": "4807a4c1cfdb57a6bd9102ec3924185e3e2649935164fed3e98ca353063ff5f0",
18
+ "after_sha256": "6485062df36f164432cfe8d8a7adbf32f0bf85053500c11b61b8fce15bcdcbed",
19
19
  "before": "async sendUpdate(A){let e={sessionId:this.id,update:A};await this.connection.sessionUpdate(e)}",
20
20
  "after": "axomQoderId(value){return typeof value === \"string\" && value.length > 0 && value.length <= 256 && !/[\\x00-\\x1f\\x7f]/.test(value)}\naxomQoderObserveSdk(message){\n if(message.type !== \"assistant\" || !Array.isArray(message.message?.content)) return;\n const parent=message.parent_tool_use_id;\n if(parent !== null && !this.axomQoderId(parent)) return;\n for(const block of message.message.content){\n if(block?.type !== \"tool_use\" || !this.axomQoderId(block.id) || !this.axomQoderId(block.name)) continue;\n const prior=this.axomQoderToolOrigins.get(block.id);\n if(this.axomQoderToolOrigins.has(block.id)){\n if(prior && (prior.parent !== parent || prior.name !== block.name)) this.axomQoderToolOrigins.set(block.id,null);\n continue;\n }\n if(this.axomQoderToolOrigins.size >= 4096) continue;\n this.axomQoderToolOrigins.set(block.id,{parent,name:block.name});\n }\n}\naxomQoderSdkUpdate(message,update){\n if(this.axomQoderId(message.parent_tool_use_id)) update={...update,_meta:{...update._meta,qoder:{...update._meta?.qoder,version:1,source:\"native-acp-patch\",parentToolUseId:message.parent_tool_use_id,route:\"child\"}}};\n return this.sendUpdate(update);\n}\nasync sendUpdate(A){\n if(A.sessionUpdate === \"tool_call\" || A.sessionUpdate === \"tool_call_update\"){\n const origin=this.axomQoderToolOrigins.get(A.toolCallId);\n if(origin) A={...A,_meta:{...A._meta,qoder:{...A._meta?.qoder,version:1,source:\"native-acp-patch\",toolName:origin.name,...(origin.parent ? {parentToolUseId:origin.parent,route:\"child\"} : {})}}};\n }\n let e={sessionId:this.id,update:A};await this.connection.sessionUpdate(e)\n}"
21
21
  },
22
22
  {
23
23
  "file": "bundle/qodercli.js",
24
- "before_sha256": "8d6dac333c191312ffdd5180554279dc168405cffc3720833f21139f9242d5fe",
25
- "after_sha256": "c606c209aa5c89afacb411c68acc071817de29dc31fe0978e7c22e713eaba5cd",
24
+ "before_sha256": "6485062df36f164432cfe8d8a7adbf32f0bf85053500c11b61b8fce15bcdcbed",
25
+ "after_sha256": "2acc4d22cf66ca8c2c73543ba6bd1023d64c7730204521444ce2386c724bb0fd",
26
26
  "before": "async dispatchSDKMessage(A){switch(A.type){",
27
27
  "after": "async dispatchSDKMessage(A){this.axomQoderObserveSdk(A);switch(A.type){"
28
28
  },
29
29
  {
30
30
  "file": "bundle/qodercli.js",
31
- "before_sha256": "c606c209aa5c89afacb411c68acc071817de29dc31fe0978e7c22e713eaba5cd",
32
- "after_sha256": "fa8a112848de34c682943d97a6f59c3eb6c882d388c9478c7edf2c7ae6597973",
31
+ "before_sha256": "2acc4d22cf66ca8c2c73543ba6bd1023d64c7730204521444ce2386c724bb0fd",
32
+ "after_sha256": "7908a80dee46d50fcf8d57ba94c45f52ac3261b358a105719e07c9d4db0b0538",
33
33
  "before": "await this.sendUpdate({sessionUpdate:\"agent_message_chunk\",content:{type:\"text\",text:e.delta.text}})",
34
34
  "after": "await this.axomQoderSdkUpdate(A,{sessionUpdate:\"agent_message_chunk\",content:{type:\"text\",text:e.delta.text}})"
35
35
  },
36
36
  {
37
37
  "file": "bundle/qodercli.js",
38
- "before_sha256": "fa8a112848de34c682943d97a6f59c3eb6c882d388c9478c7edf2c7ae6597973",
39
- "after_sha256": "9b0bce311b17ac72f1bcdda18bc587d7cc5383994ca56893085e1568b57f5940",
38
+ "before_sha256": "7908a80dee46d50fcf8d57ba94c45f52ac3261b358a105719e07c9d4db0b0538",
39
+ "after_sha256": "d01e482a334b7973c40bc61f99482da0ccfda08984c289148cc1ca30866f7286",
40
40
  "before": "await this.sendUpdate({sessionUpdate:\"agent_thought_chunk\",content:{type:\"text\",text:e.delta.thinking}})",
41
41
  "after": "await this.axomQoderSdkUpdate(A,{sessionUpdate:\"agent_thought_chunk\",content:{type:\"text\",text:e.delta.thinking}})"
42
42
  },
43
43
  {
44
44
  "file": "bundle/qodercli.js",
45
- "before_sha256": "9b0bce311b17ac72f1bcdda18bc587d7cc5383994ca56893085e1568b57f5940",
46
- "after_sha256": "c5af49f3d42a8f525af8813b97b93078fa0bc3433e7331b47b55cd9a13b7b0d9",
47
- "before": "async streamHistory(A){let e=gnd(A);for(let t of A){",
48
- "after": "async streamHistory(A){let e=gnd(A);for(let t of A){this.axomQoderObserveSdk(t);"
45
+ "before_sha256": "d01e482a334b7973c40bc61f99482da0ccfda08984c289148cc1ca30866f7286",
46
+ "after_sha256": "24113eca8518c82ed990ba68e1728cac9bd55f57fb2026030cfa5be430b85e85",
47
+ "before": "async streamHistory(A){let e=Ocd(A);for(let t of A){",
48
+ "after": "async streamHistory(A){let e=Ocd(A);for(let t of A){this.axomQoderObserveSdk(t);"
49
49
  },
50
50
  {
51
51
  "file": "bundle/qodercli.js",
52
- "before_sha256": "c5af49f3d42a8f525af8813b97b93078fa0bc3433e7331b47b55cd9a13b7b0d9",
53
- "after_sha256": "5a4a47e3812f5cef51847852b400bab9d74acfd4932c890d9072c0ec58a552a9",
52
+ "before_sha256": "24113eca8518c82ed990ba68e1728cac9bd55f57fb2026030cfa5be430b85e85",
53
+ "after_sha256": "2337caf11a15d6f5f08dd0fade9968d3caaf2c4f4d370df4b86b28d7e8838bd2",
54
54
  "before": "await this.sendUpdate({sessionUpdate:\"user_message_chunk\",content:{type:\"text\",text:A},messageId:t.uuid})",
55
55
  "after": "await this.axomQoderSdkUpdate(t,{sessionUpdate:\"user_message_chunk\",content:{type:\"text\",text:A},messageId:t.uuid})"
56
56
  },
57
57
  {
58
58
  "file": "bundle/qodercli.js",
59
- "before_sha256": "5a4a47e3812f5cef51847852b400bab9d74acfd4932c890d9072c0ec58a552a9",
60
- "after_sha256": "0041e7a85e0ed7a8a811c7fd5b2cc7f7df710b529e087af319411a8cbd5a481d",
59
+ "before_sha256": "2337caf11a15d6f5f08dd0fade9968d3caaf2c4f4d370df4b86b28d7e8838bd2",
60
+ "after_sha256": "628db161081afd5a44573e916de1afc096c0f2451c0f62f774f5116ecbfd414a",
61
61
  "before": "await this.sendUpdate({sessionUpdate:\"agent_message_chunk\",content:{type:\"text\",text:A},messageId:t.uuid})",
62
62
  "after": "await this.axomQoderSdkUpdate(t,{sessionUpdate:\"agent_message_chunk\",content:{type:\"text\",text:A},messageId:t.uuid})"
63
63
  },
64
64
  {
65
65
  "file": "bundle/qodercli.js",
66
- "before_sha256": "0041e7a85e0ed7a8a811c7fd5b2cc7f7df710b529e087af319411a8cbd5a481d",
67
- "after_sha256": "88829cdc00f1d435d6b9fb4cd8088d678731a99e8c414cb02159a770ddedc32d",
66
+ "before_sha256": "628db161081afd5a44573e916de1afc096c0f2451c0f62f774f5116ecbfd414a",
67
+ "after_sha256": "a7ff3d5883231c1add98d266d5f860813c6fa7e498ae075384b7c558e8531c88",
68
68
  "before": "await this.sendUpdate({sessionUpdate:\"agent_thought_chunk\",content:{type:\"text\",text:A.thinking},messageId:t.uuid})",
69
69
  "after": "await this.axomQoderSdkUpdate(t,{sessionUpdate:\"agent_thought_chunk\",content:{type:\"text\",text:A.thinking},messageId:t.uuid})"
70
70
  }
@@ -2,17 +2,18 @@
2
2
  "schema_version": 1,
3
3
  "overrides": [
4
4
  {
5
- "id": "claude-async-task-preview",
6
- "agent": "claude-acp",
5
+ "id": "qoder-registry-catch-up",
6
+ "agent": "qoder",
7
7
  "distribution": {
8
- "version": "0.86.1-preview.2",
8
+ "version": "1.1.71",
9
9
  "npx": {
10
- "package": "@agentclientprotocol/claude-agent-acp@0.86.1-preview.2"
10
+ "package": "@qoder-ai/qodercli@1.1.71",
11
+ "args": [
12
+ "--acp"
13
+ ]
11
14
  }
12
15
  },
13
- "when_registry_version": [
14
- "0.86.0"
15
- ]
16
+ "until_registry_version": "1.1.71"
16
17
  },
17
18
  {
18
19
  "id": "claude-plan-tools",
@@ -31,7 +32,32 @@
31
32
  ],
32
33
  "package_patches": [
33
34
  "pi-steering.json",
35
+ "pi-subagent-subwork.json",
34
36
  "qoder-subagent-origin.json",
35
- "qoder-steering.json"
37
+ "qoder-steering.json",
38
+ "codex-account-limits.json",
39
+ "claude-account-limits.json",
40
+ "commandcode-account-limits.json",
41
+ "zcode-account-limits.json",
42
+ "zcode-models.json",
43
+ "zcode-subagent-subwork.json"
44
+ ],
45
+ "native_extensions": [
46
+ {
47
+ "agent": "kimi-code",
48
+ "versions": [
49
+ "2.1.1"
50
+ ],
51
+ "entry": "account-limits/kimi-proxy.mjs"
52
+ },
53
+ {
54
+ "agent": "antigravity-acp",
55
+ "versions": [
56
+ "1.3.0",
57
+ "1.4.0"
58
+ ],
59
+ "entry": "account-limits/antigravity-proxy.mjs",
60
+ "accountLimitsVersion": 5
61
+ }
36
62
  ]
37
63
  }
@@ -0,0 +1,31 @@
1
+ {
2
+ "id": "zcode-account-limits",
3
+ "package": "zcode-acp-server",
4
+ "versions": [
5
+ "0.69.3",
6
+ "0.69.4"
7
+ ],
8
+ "edits": [
9
+ {
10
+ "file": "dist/index.js",
11
+ "before_sha256": "3f7286e9380681ca22bce5ed5d4faaaad595edee745589337babe4d3f2e0113d",
12
+ "after_sha256": "8ae15d912cd451fa155fadf8fa7707553a51477d2f3974a1deb0ebf9bed55a00",
13
+ "before": " .onRequest(\"account/usage_stats\", z.object({}).passthrough(), () => accountUsageStats())",
14
+ "after": " .onRequest(axomQuota.READ, z.object({}).passthrough(), async () => {\n const { buildAccountProviderConfig, codingPlanRequestAuthFor } = await import(\"./config/account-provider.js\");\n const { resolveQuotaHost } = await import(\"./quota/client.js\");\n let apiKey = null, family = \"\";\n for (const [providerId, provider] of Object.entries(buildAccountProviderConfig()?.providers ?? {})) {\n if (!provider?.access?.entitled) continue;\n const auth = codingPlanRequestAuthFor(providerId);\n if (auth?.apiKey) { apiKey = auth.apiKey; family = providerId; break; }\n }\n if (!apiKey) throw new Error(\"No entitled GLM coding plan: sign in once in the ZCode desktop app\");\n const resp = await fetch(resolveQuotaHost(family.startsWith(\"account:zai\") ? \"https://api.z.ai\" : \"\") + \"/api/monitor/usage/quota/limit\", { headers: { Accept: \"application/json, text/plain, */*\", Authorization: \"Bearer \" + apiKey }, signal: AbortSignal.timeout(8000) });\n const text = await resp.text();\n let json = null; try { json = text ? JSON.parse(text) : null; } catch {}\n if (resp.status === 429 || !json || json.success !== true) throw new Error(\"GLM quota read failed\" + (json?.msg ? \": \" + json.msg : \" (HTTP \" + resp.status + \")\"));\n const snapshot = axomQuota.zcode({ provider: family, level: json.data?.level, limits: json.data?.limits });\n axomQuotaNotify(snapshot);\n return snapshot;\n })\n .onRequest(\"account/usage_stats\", z.object({}).passthrough(), () => accountUsageStats())"
15
+ },
16
+ {
17
+ "file": "dist/index.js",
18
+ "before_sha256": "8ae15d912cd451fa155fadf8fa7707553a51477d2f3974a1deb0ebf9bed55a00",
19
+ "after_sha256": "a3047f20115eb8bcad7dfee1eac6689a73127f589dce6131138b22e9ca2712d1",
20
+ "before": " .onRequest(\"initialize\", (ctx) => server.initialize(ctx.params, ctx.client))",
21
+ "after": " .onRequest(\"initialize\", async (ctx) => { const result = await server.initialize(ctx.params, ctx.client); const caps = result.agentCapabilities ?? {}; result.agentCapabilities = { ...caps, _meta: { ...caps._meta, \"axom/accountRateLimits\": { ...axomQuota.CAPABILITY, provider: \"zcode\" } } }; return result; })"
22
+ },
23
+ {
24
+ "file": "dist/index.js",
25
+ "before_sha256": "a3047f20115eb8bcad7dfee1eac6689a73127f589dce6131138b22e9ca2712d1",
26
+ "after_sha256": "1dcc36538826c874d851254d56f91b9f9f12a93652668688f5ed53baa803823f",
27
+ "before": "#!/usr/bin/env node\n/**\n * Entry point: wire the ZcodeAcpServer to a stdio ACP stream.\n *\n * The ACP",
28
+ "after": "#!/usr/bin/env node\n\nconst axomQuota = (() => {\n/** Account quota normalization. No I/O: passive events must never trigger a query. */\nconst READ = '_axom/account/rateLimits/read';\nconst UPDATED = '_axom/account/rateLimits/updated';\nconst CAPABILITY = { version: 2, read: true, updated: true };\nconst percent = v => typeof v === 'number' && Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : null;\nconst finite = v => { if (v == null || typeof v === 'boolean') return null; const n = typeof v === 'number' ? v : Number(v); return Number.isFinite(n) ? n : null; };\nconst time = (v, milliseconds = false) => {\n if (v == null || v === 0) return null;\n const d = new Date(typeof v === 'number' ? v * (milliseconds ? 1 : 1000) : v);\n return Number.isFinite(d.getTime()) ? d.toISOString() : null;\n};\nconst status = v => ({ allowed: 'allowed', allowed_warning: 'warning', rejected: 'blocked', normal: 'allowed' }[v] ?? 'unknown');\n/** Canonical window key rides the snapshot; the UI owns the key → display-label translation.\n * Windows without a canonical key keep their vendor content untouched. */\nconst windowKey = (seconds, period) => period === 'month' ? 'monthly' : seconds === 18000 ? 'five_hour' : seconds === 604800 ? 'weekly' : null;\nconst base = (provider, mode, raw, observedAt) => ({ schemaVersion: 1, updateMode: 'snapshot', provider, billingMode: mode, availability: mode === 'subscription' ? 'available' : mode === 'unknown' ? 'unknown' : 'not_applicable', observedAt: observedAt ?? new Date().toISOString(), plan: null, limits: [], balances: [], _meta: { ['_' + provider]: structuredClone(raw) } });\nfunction codex(raw, authType = 'chatgpt', observedAt) {\n const out = base('codex', ['chatgpt', 'chatgptAuthTokens'].includes(authType) ? 'subscription' : ['apiKey','apikey','amazonBedrock'].includes(authType) ? 'non_subscription' : 'unknown', raw, observedAt);\n if (out.billingMode !== 'subscription') return out;\n const buckets = Object.entries(raw.rateLimitsByLimitId ?? {});\n if (!buckets.length && raw.rateLimits) buckets.push([raw.rateLimits.limitId ?? 'codex', raw.rateLimits]);\n for (const [id, bucket] of buckets) {\n if (!bucket) continue;\n if (bucket.planType) out.plan = { id: bucket.planType, label: bucket.planType };\n for (const name of ['primary', 'secondary']) {\n const w = bucket[name]; if (!w) continue;\n const seconds = w.windowDurationMins == null ? null : w.windowDurationMins * 60;\n out.limits.push({ id: `${id}.${name}`, label: bucket.limitName ?? id, kind: 'subscription', windowSeconds: seconds, key: windowKey(seconds), usedPercent: percent(w.usedPercent), resetsAt: time(w.resetsAt), status: bucket.rateLimitReachedType ? 'blocked' : 'unknown', scope: { bucket: id } });\n }\n if (bucket.credits) out.balances.push({ id: `${id}.credits`, label: 'Credits', remaining: bucket.credits.balance ?? null, unit: 'credits', unlimited: bucket.credits.unlimited === true });\n }\n // Account IDs must not escape via provider extensions.\n delete out._meta._codex.accountId;\n return out;\n}\nfunction claude(raw, observedAt) {\n const mode = raw.billing_mode ?? (raw.subscription_type || raw.rate_limits_available === true ? 'subscription' : 'unknown');\n const out = base('claude', mode, raw, observedAt);\n out.plan = raw.subscription_type ? { id: raw.subscription_type, label: raw.subscription_type } : null;\n if (mode === 'subscription' && !raw.rate_limits_available) out.availability = 'unavailable';\n const limits = raw.rate_limits ?? {};\n const rows = Array.isArray(limits.limits) ? limits.limits : [];\n if (rows.length) {\n rows.forEach((w, i) => {\n const seconds = w.group === 'session' ? 18000 : w.group === 'weekly' ? 604800 : null;\n out.limits.push({ id: `claude.${w.kind}.${i}`, label: w.scope?.model?.display_name ?? w.kind, kind: 'subscription', windowSeconds: seconds, key: windowKey(seconds), usedPercent: percent(w.percent), resetsAt: time(w.resets_at), status: status(w.severity), active: w.is_active ?? null, scope: w.scope ?? null });\n });\n } else for (const [id, seconds] of [['five_hour', 18000], ['seven_day', 604800], ['seven_day_opus',604800], ['seven_day_sonnet',604800]]) {\n const w = limits[id]; if (!w) continue;\n out.limits.push({ id: `claude.${id}`, label: id, kind: 'subscription', windowSeconds: seconds, key: windowKey(seconds), usedPercent: percent(w.utilization), resetsAt: time(w.resets_at), status: 'unknown', scope: id.endsWith('opus') || id.endsWith('sonnet') ? { model: id.split('_').at(-1) } : null });\n }\n const spend=limits.spend;\n if(spend?.enabled && spend.used && spend.limit) out.limits.push({id:'claude.extra_spend',label:'Extra usage',kind:'spend',windowSeconds:null,usedPercent:percent(spend.percent),resetsAt:null,status:status(spend.severity),used:String(spend.used.amount_minor),limit:String(spend.limit.amount_minor),unit:'money',currency:spend.used.currency,exponent:spend.used.exponent});\n if(spend?.balance?.amount_minor != null) out.balances.push({id:'claude.extra_balance',label:'Extra usage balance',remaining:String(spend.balance.amount_minor),unit:'money',currency:spend.balance.currency,exponent:spend.balance.exponent});\n return out;\n}\nfunction claudeEvent(raw, previous = null, observedAt) {\n const out = previous ? structuredClone(previous) : base('claude',raw.rateLimitType?'subscription':'unknown',{},observedAt);\n out.updateMode = 'delta';\n out.balances = [];\n out.observedAt = observedAt ?? new Date().toISOString();\n out._meta._claude = { ...out._meta._claude, rateLimitEvent: raw };\n const seconds = raw.rateLimitType === 'five_hour' ? 18000 : raw.rateLimitType?.startsWith('seven_day') ? 604800 : null;\n if (seconds !== null) {\n const id = `claude.${raw.rateLimitType}`;\n const scoped = !['five_hour','seven_day'].includes(raw.rateLimitType);\n const prior=out.limits.find(w => w.windowSeconds===seconds && JSON.stringify(w.scope??null)===JSON.stringify(scoped ? {model:raw.rateLimitType.split('_').at(-1)}:null));\n const nextReset=time(raw.resetsAt);\n const rolled=prior?.resetsAt && nextReset && Math.abs(Date.parse(nextReset)-Date.parse(prior.resetsAt))>1000;\n const row = { id, label: raw.rateLimitType, kind: 'subscription', windowSeconds: seconds, key: windowKey(seconds), usedPercent: raw.utilization == null ? (rolled ? null : prior?.usedPercent ?? null) : percent(raw.utilization * 100), resetsAt: raw.resetsAt == null ? prior?.resetsAt ?? null : time(raw.resetsAt), status: status(raw.status), scope: scoped ? { model: raw.rateLimitType.split('_').at(-1) } : null };\n // Event utilization is a ratio, unlike get_usage's percentage. Match the existing window without duplicating it.\n const i = out.limits.findIndex(w => w.windowSeconds === seconds && JSON.stringify(w.scope ?? null) === JSON.stringify(row.scope));\n out.limits = [i >= 0 ? { ...out.limits[i], ...row, id: out.limits[i].id } : row];\n } else out.limits = [];\n return out;\n}\nfunction kimi(raw, observedAt) {\n const quota = raw.quota ?? raw;\n const out = base('kimi','subscription',quota,observedAt);\n for (const [id, seconds] of [['limit5h',18000],['limit7d',604800],['monthTotal',null]]) {\n const w = quota.usages?.[id]; if (!w) continue;\n out.limits.push({ id: `kimi.${id}`, label: id, kind: 'subscription', windowSeconds: seconds, period: id === 'monthTotal' ? 'month' : null, key: windowKey(seconds, id === 'monthTotal' ? 'month' : null), usedPercent: percent(w.usedRatio * 100), resetsAt: time(w.resetAt), status: 'unknown' });\n }\n const wallet = quota.extraUsage;\n if (wallet) out.balances.push({ id:'kimi.extra',label:'Extra usage',remaining:String(wallet.balanceCents),unit:'money',currency:wallet.currency,exponent:2 });\n return out;\n}\n/** GLM quota `percentage` is the USED share (measured: 5% for 58/1000); counters win when present.\n * Counter-derived shares are rounded to 2 decimals — 100-94.2 keeps fp noise otherwise. */\nconst glmPercent = limit => {\n const used = finite(limit.currentValue), remaining = finite(limit.remaining), total = finite(limit.usage);\n const cap = remaining !== null && used !== null ? remaining + used : total;\n const round2 = v => v == null ? null : Math.round(v * 100) / 100;\n if (cap !== null && cap > 0 && remaining !== null && remaining >= 0 && remaining <= cap) return round2(100 - percent(remaining / cap * 100));\n if (cap !== null && cap > 0 && used !== null && used >= 0 && used <= cap) return round2(percent(used / cap * 100));\n return percent(limit.percentage);\n};\nfunction zcode(raw, observedAt) {\n // Raw: the GLM quota endpoint's data block — { level, limits: [{ type, number, usage,\n // currentValue, remaining, percentage, nextResetTime(epoch ms), usageDetails }] }. Which windows\n // exist is plan-dependent (measured pro plan: 5h prompts + a tool/MCP allowance; no weekly row —\n // a `number: 7` window maps when a plan returns one, and nothing is invented when it doesn't).\n const limits = Array.isArray(raw?.limits) ? raw.limits : [];\n const level = typeof raw?.level === 'string' && raw.level ? raw.level : null;\n const out = base('zcode', limits.length ? 'subscription' : 'unknown', raw, observedAt);\n out.plan = level ? { id: level, label: level } : null;\n let tools = 0;\n limits.forEach((limit, i) => {\n if (!limit || typeof limit !== 'object') return;\n const resetsAt = time(limit.nextResetTime, true);\n if (limit.type === 'TOKENS_LIMIT') {\n // GLM window convention: number 5 → the 5-hour prompt window, 7 → weekly.\n // Ids mirror the adapter's own /quota keys (token_5h / token_week).\n const seconds = limit.number === 5 ? 18000 : limit.number === 7 ? 604800 : null;\n const label = limit.number === 5 ? '5h' : limit.number === 7 ? 'Week' : `token ${limit.number ?? i}`;\n const id = limit.number === 5 ? 'zcode.token_5h' : limit.number === 7 ? 'zcode.token_week' : `zcode.token_${limit.number ?? i}`;\n out.limits.push({ id, label, kind: 'subscription', windowSeconds: seconds, key: windowKey(seconds), usedPercent: glmPercent(limit), resetsAt, status: 'unknown' });\n } else if (limit.type === 'TIME_LIMIT' || limit.type === 'MCP_LIMIT') {\n // Built-in tool/MCP allowance: absolute counters (unit 'calls'); per-model detail stays in _meta.\n const used = finite(limit.currentValue), total = finite(limit.usage), remaining = finite(limit.remaining);\n out.limits.push({ id: tools ? `zcode.mcp.${i}` : 'zcode.mcp', label: 'MCP', kind: 'subscription', windowSeconds: null, usedPercent: glmPercent(limit), ...(used !== null && total !== null ? { used: String(used), limit: String(total), unit: 'calls' } : {}), resetsAt, status: remaining === 0 ? 'blocked' : used !== null || limit.percentage != null ? 'allowed' : 'unknown' });\n tools++;\n }\n });\n return out;\n}\nfunction commandcode(raw, observedAt) {\n const subscription = raw.subscription?.data ?? raw.subscription;\n const windows = raw.credits?.windowLimits ?? raw.windowLimits;\n const subscribed = ['active','trialing','past_due'].includes(subscription?.status) || windows?.limited === true;\n const mode = subscribed ? 'subscription' : subscription || windows ? 'non_subscription' : 'unknown';\n const out = base('commandcode',mode,raw,observedAt);\n out.plan = subscription?.planId ? { id:subscription.planId,label:subscription.planId } : null;\n for (const [id, seconds] of [['fiveHour',18000],['weekly',604800]]) {\n const w=windows?.[id]; if (!w) continue;\n out.limits.push({ id:`commandcode.${id}`,label:id,kind:'subscription',windowSeconds:seconds,key:windowKey(seconds),usedPercent:w.cap > 0 ? percent(w.used / w.cap * 100) : null,used:String(w.used),limit:String(w.cap),unit:'credits',resetsAt:time(w.resetAt,true),status:w.exceeded === true ? 'blocked' : 'allowed' });\n }\n const credits=raw.credits?.credits ?? raw.credits;\n if (subscribed && credits?.monthlyCredits != null) {\n const cap=raw.monthly?.limit;\n const known=typeof cap==='number' && Number.isFinite(cap) && cap>0;\n const used=known ? Math.max(0,cap-credits.monthlyCredits) : null;\n out.limits.push({id:'commandcode.monthly',label:'Monthly',kind:'subscription',windowSeconds:null,period:'month',key:windowKey(null,'month'),usedPercent:known?percent(used/cap*100):null,resetsAt:time(subscription?.currentPeriodEnd,true),status:'unknown',...(known?{used:String(used),limit:String(cap),unit:'credits'}:{})});\n }\n for (const [id,label] of [['monthlyCredits','Monthly credits'],['purchasedCredits','Purchased credits'],['freeCredits','Free credits']]) if (credits?.[id] != null) out.balances.push({ id:`commandcode.${id}`,label,remaining:String(credits[id]),unit:'credits' });\n return out;\n}\n\nreturn {READ,UPDATED,CAPABILITY,codex,claude,claudeEvent,kimi,commandcode,zcode};\n})();\nconst axomQuotaNotify = snapshot => process.stdout.write(JSON.stringify({jsonrpc:\"2.0\",method:axomQuota.UPDATED,params:snapshot})+\"\\n\");\n/**\n * Entry point: wire the ZcodeAcpServer to a stdio ACP stream.\n *\n * The ACP"
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "id": "zcode-models",
3
+ "package": "zcode-acp-server",
4
+ "versions": [
5
+ "0.69.3",
6
+ "0.69.4"
7
+ ],
8
+ "edits": [
9
+ {
10
+ "file": "dist/config/options.js",
11
+ "before_sha256": "7f30e0dbf281280b7043cc686990eff3785bc62206a4b369313b27333cf9c330",
12
+ "after_sha256": "4641e5097c667e9b351ee7f0dee89a5a517332f452b1fc878e0396775b9870f8",
13
+ "before": "import { configProviderIdFor } from \"./account-provider.js\";",
14
+ "after": "import { buildAccountProviderConfig as axomAccountProviders, codingPlanRequestAuthFor as axomPlanAuth, configProviderIdFor } from \"./account-provider.js\";"
15
+ },
16
+ {
17
+ "file": "dist/config/options.js",
18
+ "before_sha256": "4641e5097c667e9b351ee7f0dee89a5a517332f452b1fc878e0396775b9870f8",
19
+ "after_sha256": "286ad8d2b6f734ae1168cbe2095c25660016db10eee6ccc4d285a64fe8cc2cd4",
20
+ "before": "/** Read the config.json contents (UTF-8). Throws on read/parse failure. */",
21
+ "after": "function axomFreshInstallModels() {\n const fallback = { providerId: DEFAULT_PROVIDER_ID, providerName: DEFAULT_PROVIDER_NAME, modelId: DEFAULT_MODEL_ID };\n try {\n const out = [];\n for (const [pid, p] of Object.entries(axomAccountProviders()?.providers ?? {})) {\n if (!p?.access?.entitled || !axomPlanAuth(pid)?.apiKey) continue;\n const providerId = configProviderIdFor(pid);\n for (const modelId of p.builtinModelIds ?? []) {\n if (out.some((m) => m.providerId === providerId && m.modelId === modelId)) continue;\n out.push({ providerId, providerName: providerId, modelId });\n }\n }\n if (out.length === 0) return [fallback];\n return out.some((m) => m.providerId === fallback.providerId && m.modelId === fallback.modelId)\n ? [fallback, ...out.filter((m) => !(m.providerId === fallback.providerId && m.modelId === fallback.modelId))]\n : [fallback, ...out];\n }\n catch {\n return [fallback];\n }\n}\n\n/** Read the config.json contents (UTF-8). Throws on read/parse failure. */"
22
+ },
23
+ {
24
+ "file": "dist/config/options.js",
25
+ "before_sha256": "286ad8d2b6f734ae1168cbe2095c25660016db10eee6ccc4d285a64fe8cc2cd4",
26
+ "after_sha256": "c6fae88f596ee0cbb633317c0f83c2c883a2b2a5d8978bfc4fd6a6d152f77ccb",
27
+ "before": " if (out.length === 0 && Object.keys(cfg.provider ?? {}).length === 0) {\n return [\n {\n providerId: DEFAULT_PROVIDER_ID,\n providerName: DEFAULT_PROVIDER_NAME,\n modelId: DEFAULT_MODEL_ID,\n },\n ];\n }",
28
+ "after": " if (out.length === 0 && Object.keys(cfg.provider ?? {}).length === 0) {\n return axomFreshInstallModels();\n }"
29
+ },
30
+ {
31
+ "file": "dist/config/options.js",
32
+ "before_sha256": "c6fae88f596ee0cbb633317c0f83c2c883a2b2a5d8978bfc4fd6a6d152f77ccb",
33
+ "after_sha256": "d12eded70f22d8d9010de9949c0809b1f56f2c33635899764ca9f893fec0d256",
34
+ "before": " if (out.length > 0)\n return out;\n return [\n {\n providerId: DEFAULT_PROVIDER_ID,\n providerName: DEFAULT_PROVIDER_NAME,\n modelId: DEFAULT_MODEL_ID,\n },\n ];\n }\n}",
35
+ "after": " if (out.length > 0)\n return out;\n return axomFreshInstallModels();\n }\n}"
36
+ }
37
+ ]
38
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "id": "zcode-subagent-subwork",
3
+ "package": "zcode-acp-server",
4
+ "versions": [
5
+ "0.69.3",
6
+ "0.69.4"
7
+ ],
8
+ "edits": [
9
+ {
10
+ "file": "dist/handlers/dispatch.js",
11
+ "before_sha256": "7d095dc00eb9b8a55a8452ac390cbf56f71056da7ae0f575541602de23222483",
12
+ "after_sha256": "b82e262b6ffcd4d74262515f3d1465912b9508b22597cef5cf8db702bec52225",
13
+ "before": "import { isBroadcastSource, sendSessionUpdate, sendSessionUpdateToOthers } from \"./io.js\";\n/** True once the EPERM hint fired for this process — throttled to one shot. */",
14
+ "after": "import { isBroadcastSource, sendSessionUpdate, sendSessionUpdateToOthers } from \"./io.js\";\n/** Axom patch `zcode-subagent-subwork`: the backend addresses a foreground sub-agent's\n * internal tool calls as `tool_subagent_<child-suffix>_call_<id>`; the child ACP session\n * id is `sess_` + that middle segment (measured: tool id\n * `tool_subagent_agent_<uuid>_call_<x>` ↔ child session `sess_subagent_agent_<uuid>`).\n * Deterministic from the id alone — no state. */\nfunction axomSubagentChildScope(callId) {\n if (typeof callId !== \"string\" || !callId.startsWith(\"tool_subagent_\"))\n return null;\n const middle = callId.slice(\"tool_\".length);\n const cut = middle.indexOf(\"_call_\");\n if (cut <= 0)\n return null;\n return `sess_${middle.slice(0, cut)}`;\n}\n/** Draft RFD #1992 subagents negotiated by the client (the axom daemon always does). */\nfunction axomNativeSubagents(server) {\n return !!(server && server.clientCapabilities && server.clientCapabilities.subagents);\n}\n/** True once the EPERM hint fired for this process — throttled to one shot. */"
15
+ },
16
+ {
17
+ "file": "dist/handlers/dispatch.js",
18
+ "before_sha256": "b82e262b6ffcd4d74262515f3d1465912b9508b22597cef5cf8db702bec52225",
19
+ "after_sha256": "ecfb04258456577d61f3d20b2f1b8f0a950c58d8efefbdf58221b0b8c9a34c4e",
20
+ "before": "function dispatchToolCallNew(server, cx, acpSid, ev) {\n const termSupported = server.supportsTerminalOutput() && (ev.tool === \"Bash\" || ev.tool === \"bash\");\n const meta = { claudeCode: { toolName: ev.tool } };\n if (termSupported)\n meta[\"terminal_info\"] = { terminal_id: ev.callId };\n // Mark sub-agent dispatch cards so editors can badge them from creation.\n if (ev.tool === \"Agent\" || ev.tool === \"Task\")\n meta[\"subagent\"] = true;",
21
+ "after": "function dispatchToolCallNew(server, cx, acpSid, ev) {\n acpSid = axomSubagentChildScope(ev.callId) ?? acpSid;\n const termSupported = server.supportsTerminalOutput() && (ev.tool === \"Bash\" || ev.tool === \"bash\");\n const meta = { claudeCode: { toolName: ev.tool } };\n if (termSupported)\n meta[\"terminal_info\"] = { terminal_id: ev.callId };\n // Mark sub-agent dispatch cards so editors can badge them from creation.\n // Axom: with draft subagents (RFD #1992) negotiated, the native events own the\n // projection and this mark would double-project the child on such clients.\n if ((ev.tool === \"Agent\" || ev.tool === \"Task\") && !axomNativeSubagents(server))\n meta[\"subagent\"] = true;"
22
+ },
23
+ {
24
+ "file": "dist/handlers/dispatch.js",
25
+ "before_sha256": "ecfb04258456577d61f3d20b2f1b8f0a950c58d8efefbdf58221b0b8c9a34c4e",
26
+ "after_sha256": "a4ece2260d22b8791a9230afc4652aede39d7c10252ce47692f8208a668388c5",
27
+ "before": "function dispatchToolCallUpdate(server, cx, acpSid, ev) {\n const toolName = ev.tool ?? \"\";",
28
+ "after": "function dispatchToolCallUpdate(server, cx, acpSid, ev) {\n acpSid = axomSubagentChildScope(ev.callId) ?? acpSid;\n const toolName = ev.tool ?? \"\";"
29
+ },
30
+ {
31
+ "file": "dist/server.js",
32
+ "before_sha256": "547d640a68ad56a97bd587348ea38ee3eca57d1fad9ea1d14e04c486e1efc85a",
33
+ "after_sha256": "df37fa0b7e5873d13a2cdd71a5fbc931a7ea9ffca521b0218d60a7a9b11e1d3c",
34
+ "before": "export class ZcodeAcpServer {",
35
+ "after": "/** Axom patch `zcode-subagent-subwork`: normalize ZCode sub-agents and background\n * tasks into the draft ACP subagent variants (RFD #1992) and the AIR async-task\n * extension — the same contracts claude-agent-acp ships. The backend already emits\n * first-class lifecycle events on `session.updated` (agentId/childSessionId for\n * sub-agents, taskId for background tasks); this listener forwards them so hosts\n * can project subworks, and dispatch.js re-scopes a foreground sub-agent's internal\n * `tool_subagent_*` tool calls onto its child session. */\nclass AxomZcodeSubagents {\n constructor(server, zcodeSid) {\n this.server = server;\n this.sid = zcodeSid;\n /** agentId → { agentId, child, background, terminal, pendingState, pendingP, resultSeen, preview } */\n this.agents = new Map();\n /** parentToolCallId → agent record (foreground result flush). */\n this.parents = new Map();\n /** taskId → { terminal } (bash/exec background tasks only). */\n this.tasks = new Map();\n }\n /** Draft RFD #1992 negotiated — the axom daemon always declares this. */\n nativeOk() {\n const caps = this.server.clientCapabilities;\n return !!(caps && caps.subagents);\n }\n /** AIR async-task capability declared (`_meta.jetbrains.air.capabilities`). */\n asyncOk() {\n const air = this.server.clientCapabilities?._meta?.jetbrains?.air;\n return !!(air && Array.isArray(air.capabilities) && air.capabilities.includes(\"asyncTasks\"));\n }\n handleEvent(ev) {\n try {\n void this.onEvent(ev);\n }\n catch {\n // Never crash the bridge from a normalization observer.\n }\n }\n async onEvent(ev) {\n if (!ev || ev.type !== \"session.updated\") {\n this.onToolEvent(ev);\n return;\n }\n const p = ev.payload ?? {};\n if (typeof p.agentId === \"string\" && p.agentId && typeof p.childSessionId === \"string\" && p.childSessionId) {\n this.onAgent(p);\n return;\n }\n // Sub-agent background tasks also carry taskId with taskKind \"subagent\" —\n // the agentId path above owns those. Workflow runs have their own poller.\n if (typeof p.taskId === \"string\" && p.taskId && p.taskKind !== \"subagent\" && p.taskKind !== \"workflow\") {\n this.onTask(p);\n }\n }\n onAgent(p) {\n if (!this.nativeOk())\n return;\n const agentId = p.agentId;\n const child = p.childSessionId;\n const status = typeof p.status === \"string\" ? p.status : \"running\";\n let rec = this.agents.get(agentId);\n if (!rec) {\n rec = { agentId, child, background: p.background === true, terminal: false, pendingState: null, pendingP: null, resultSeen: false, preview: null };\n this.agents.set(agentId, rec);\n if (typeof p.parentToolCallId === \"string\" && p.parentToolCallId)\n this.parents.set(p.parentToolCallId, rec);\n // First sighting already terminal (adapter restart): adopt — emit the\n // spawn so the host can still link the child, then the state below.\n if (status !== \"running\")\n rec.resultSeen = true;\n this.emit({\n sessionUpdate: \"subagent_spawned\",\n subagentSessionId: child,\n name: (typeof p.description === \"string\" && p.description) || (typeof p.agentType === \"string\" && p.agentType) || \"Subagent\",\n task: typeof p.prompt === \"string\" ? p.prompt : (p.description ?? \"\"),\n capabilities: {},\n _meta: { zcode: { agentId, parentToolCallId: p.parentToolCallId, background: rec.background, adopted: status !== \"running\" } },\n });\n }\n if (rec.child !== child)\n return;\n const mapped = status === \"completed\" ? \"completed\"\n : status === \"failed\" || status === \"error\" ? \"failed\"\n : status === \"cancelled\" || status === \"stopped\" ? \"cancelled\"\n : status === \"disconnected\" ? \"disconnected\" : null;\n if (!mapped || rec.terminal)\n return;\n if (rec.background || rec.resultSeen || mapped !== \"completed\") {\n this.finishAgent(rec, mapped, p);\n return;\n }\n // Foreground completion: hold the state until the parent Agent tool's own\n // result event arrives (one event later, measured) so the child-scoped\n // preview precedes the terminal state on the wire.\n rec.pendingState = mapped;\n rec.pendingP = p;\n }\n finishAgent(rec, state, p) {\n rec.terminal = true;\n if (rec.preview) {\n this.emitChild(rec.child, { sessionUpdate: \"agent_message_chunk\", content: { type: \"text\", text: rec.preview } });\n rec.preview = null;\n }\n const meta = { zcode: { agentId: rec.agentId } };\n if (p) {\n for (const key of [\"parentToolCallId\", \"outputFile\"])\n if (typeof p[key] === \"string\")\n meta.zcode[key] = p[key];\n if (typeof p.totalTokens === \"number\")\n meta.zcode.totalTokens = p.totalTokens;\n if (typeof p.totalDurationMs === \"number\")\n meta.zcode.totalDurationMs = p.totalDurationMs;\n }\n this.emit({ sessionUpdate: \"subagent_state_update\", subagentSessionId: rec.child, state, _meta: meta });\n }\n onToolEvent(ev) {\n if (!ev || ev.type !== \"tool.updated\")\n return;\n const p = ev.payload ?? {};\n if (p.kind !== \"result\" || typeof p.toolCallId !== \"string\")\n return;\n const rec = this.parents.get(p.toolCallId);\n if (!rec || rec.terminal || rec.background)\n return;\n rec.resultSeen = true;\n const text = axomSubagentResultPreview(p.result);\n if (text)\n rec.preview = text;\n if (rec.pendingState)\n this.finishAgent(rec, rec.pendingState, rec.pendingP);\n }\n onTask(p) {\n if (!this.asyncOk())\n return;\n const taskId = p.taskId;\n let task = this.tasks.get(taskId);\n const status = typeof p.status === \"string\" ? p.status : \"running\";\n if (!task) {\n task = { terminal: false };\n this.tasks.set(taskId, task);\n this.emit({\n sessionUpdate: \"async_task_spawned\",\n asyncTaskId: taskId,\n name: (typeof p.description === \"string\" && p.description) || (typeof p.command === \"string\" && p.command) || \"background task\",\n taskType: typeof p.taskKind === \"string\" ? p.taskKind : \"shell\",\n description: typeof p.description === \"string\" ? p.description : \"\",\n showInTranscript: false,\n canStop: p.cancellable === true,\n ...(typeof p.outputPath === \"string\" ? { outputFilePath: p.outputPath } : {}),\n ...(typeof p.toolCallId === \"string\" ? { toolCallId: p.toolCallId } : {}),\n _meta: { zcode: { taskKind: p.taskKind, command: p.command } },\n });\n }\n const mapped = status === \"completed\" ? \"completed\"\n : status === \"failed\" || status === \"error\" ? \"failed\"\n : status === \"cancelled\" ? \"stopped\" : null;\n if (!mapped || task.terminal)\n return;\n task.terminal = true;\n this.emit({\n sessionUpdate: \"async_task_state_update\",\n asyncTaskId: taskId,\n state: mapped,\n ...(typeof p.toolCallId === \"string\" ? { toolCallId: p.toolCallId } : {}),\n });\n }\n emit(update) {\n void this.server.notifyByZcodeSid(this.sid, update);\n }\n emitChild(childId, update) {\n const server = this.server;\n if (!server.clients || server.clients.size === 0)\n return;\n void enqueueSessionSend(childId, () => server.clients.broadcast().notify(\"session/update\", { sessionId: childId, update }));\n }\n}\n/** The parent Agent tool's result carries the sub-agent's final message plus an\n * `agentId:` line and a `<usage>` block that belong to the envelope, not the\n * answer. The backend delivers the payload as a JSON string or as an already\n * parsed object (both measured) — accept either. */\nfunction axomSubagentResultPreview(result) {\n let content = null;\n if (typeof result === \"string\") {\n try {\n const parsed = JSON.parse(result);\n if (parsed && typeof parsed.content === \"string\")\n content = parsed.content;\n }\n catch {\n content = result;\n }\n }\n else if (result && typeof result === \"object\" && typeof result.content === \"string\") {\n content = result.content;\n }\n if (typeof content !== \"string\" || !content.trim())\n return null;\n const stripped = content\n .replace(/<usage>[\\s\\S]*?<\\/usage>/g, \"\")\n .split(\"\\n\")\n .filter((line) => !/^agentId:\\s*\\S+/.test(line))\n .join(\"\\n\")\n .trim();\n return stripped ? stripped.slice(0, 2000) : null;\n}\nexport { AxomZcodeSubagents };\nexport class ZcodeAcpServer {"
36
+ },
37
+ {
38
+ "file": "dist/server.js",
39
+ "before_sha256": "df37fa0b7e5873d13a2cdd71a5fbc931a7ea9ffca521b0218d60a7a9b11e1d3c",
40
+ "after_sha256": "55d776521298e0a59d7512be34aeb2b86bc10a4cce9b038a9387ab860ab1aa2c",
41
+ "before": " backend.registerEventListener(zcodeSid, new SessionTitleListener(this, zcodeSid));\n this.backgroundListenerBackend.set(zcodeSid, backend);",
42
+ "after": " backend.registerEventListener(zcodeSid, new SessionTitleListener(this, zcodeSid));\n backend.registerEventListener(zcodeSid, new AxomZcodeSubagents(this, zcodeSid));\n this.backgroundListenerBackend.set(zcodeSid, backend);"
43
+ },
44
+ {
45
+ "file": "dist/handlers/background-tasks.js",
46
+ "before_sha256": "c0e1eb4ca1585ab419fc1bb6e8878a8b9c9ab680ef664ec3c0a9c542d3b561ca",
47
+ "after_sha256": "4dead20a31589b1ac79d526160272ac84cb8d12626a80d6085fb5c3e131d80a4",
48
+ "before": "/** Map a zcode background task status string to an ACP ToolCallStatus. */\nfunction toAcpStatus(status) {\n if (status === \"completed\")\n return \"completed\";\n if (status === \"failed\" || status === \"error\" || status === \"cancelled\")\n return \"failed\";\n return \"in_progress\"; // running / pending / unknown\n}",
49
+ "after": "/** Map a zcode background task status string to an ACP ToolCallStatus. */\nfunction toAcpStatus(status) {\n if (status === \"completed\")\n return \"completed\";\n if (status === \"failed\" || status === \"error\" || status === \"cancelled\")\n return \"failed\";\n return \"in_progress\"; // running / pending / unknown\n}\n/** Axom patch `zcode-subagent-subwork`: when the client declared the AIR async-task\n * capability, the AxomZcodeSubagents listener forwards these same events as\n * `async_task_*` session updates bound to the launch card (and sub-agent tasks as\n * subagent variants) — minting this listener's own [background] card on top would\n * render one task twice on such clients. */\nfunction axomAsyncTasksOwned(server) {\n const air = server?.clientCapabilities?._meta?.jetbrains?.air;\n return !!(air && Array.isArray(air.capabilities) && air.capabilities.includes(\"asyncTasks\"));\n}"
50
+ },
51
+ {
52
+ "file": "dist/handlers/background-tasks.js",
53
+ "before_sha256": "4dead20a31589b1ac79d526160272ac84cb8d12626a80d6085fb5c3e131d80a4",
54
+ "after_sha256": "c01f1d9f7dfae968d06afa142150ec9f6770f0d1f5a2c64b9e6475325882b223",
55
+ "before": " async onTaskStatus(p) {\n const taskId = p.taskId;",
56
+ "after": " async onTaskStatus(p) {\n // Axom patch `zcode-subagent-subwork`: with the AIR async-task capability declared,\n // AxomZcodeSubagents forwards these events as async_task variants bound to the\n // launch card (sub-agent tasks as subagent variants) — skip this listener's own\n // [background] card so one task does not render twice on such clients.\n if (p.taskKind !== \"workflow\" && axomAsyncTasksOwned(this.server))\n return;\n const taskId = p.taskId;"
57
+ },
58
+ {
59
+ "file": "dist/handlers/session.js",
60
+ "before_sha256": "e36756aa50f823d97df4861566fafc2ea6b36d7baf6d1f9aa9f918930e1c40a6",
61
+ "after_sha256": "799343ea4036b518ad7d411d192c696ebe821a4eb2b32e87c0b8b5f288cf509f",
62
+ "before": "async function adoptStoredTitle(server, acpSid, zcodeSid) {\n if (server.sessionTitles.has(acpSid))\n return;",
63
+ "after": "async function adoptStoredTitle(server, acpSid, zcodeSid) {\n // Axom patch `zcode-subagent-subwork`: the in-memory title is usually the first\n // prompt's echo; the backend's stored generated title is the real answer, and the\n // live titleUpdated push is routinely lost at a backend respawn boundary — this\n // load-time read is then the only surviving copy. A user-pinned rename still wins.\n if (server.sessionTitles.has(acpSid) && server.titleUserSetBy.has(acpSid))\n return;"
64
+ },
65
+ {
66
+ "file": "dist/handlers/session.js",
67
+ "before_sha256": "799343ea4036b518ad7d411d192c696ebe821a4eb2b32e87c0b8b5f288cf509f",
68
+ "after_sha256": "e28f651c842a85e308e12f3e97d742bcb49a2f470530f7fe3babe4c04fdca4c9",
69
+ "before": " if (hit?.title) {\n server.sessionTitles.set(acpSid, hit.title);\n server.touchSessionSummary(acpSid, hit.title);\n refreshTerminalTabTitle(server, acpSid);\n log(`adopted stored title for ${acpSid.slice(0, 8)}: ${hit.title}`);\n }",
70
+ "after": " if (hit?.title && server.sessionTitles.get(acpSid) !== hit.title) {\n server.sessionTitles.set(acpSid, hit.title);\n server.touchSessionSummary(acpSid, hit.title);\n refreshTerminalTabTitle(server, acpSid);\n // Axom patch `zcode-subagent-subwork`: broadcast so hosts sync the stored\n // generated title on (re-)attach — the live push was lost at a respawn.\n void sendSessionUpdate(server.clients.broadcast(), acpSid, {\n sessionUpdate: \"session_info_update\",\n title: hit.title,\n updatedAt: new Date().toISOString(),\n }).catch(() => { });\n log(`adopted stored title for ${acpSid.slice(0, 8)}: ${hit.title}`);\n }"
71
+ }
72
+ ]
73
+ }
package/dist/cli.js CHANGED
@@ -39,12 +39,39 @@ export function buildProgram() {
39
39
  program
40
40
  .command('__credential-broker', { hidden: true })
41
41
  .action(() => runCredentialBroker());
42
- program.command('qoder-acp')
43
- .description('Run the Qoder SDK ACP adapter over stdio')
44
- .requiredOption('--qodercli <path>', 'Explicit Qoder CLI executable')
45
- .action(async (options) => {
46
- const { runQoderAdapter } = await import('./workstation/qoderAdapter/main.js');
47
- await runQoderAdapter(options.qodercli);
42
+ const qoderCommand = program.command('qoder-acp')
43
+ .description('Prepare or run the Qoder SDK ACP adapter')
44
+ .option('--qodercli <path>', 'Explicit Qoder CLI executable')
45
+ .option('--prepare-sdk', 'Install the separate SDK runtime, then exit');
46
+ qoderCommand.action(async (options) => {
47
+ if (Boolean(options.qodercli) === Boolean(options.prepareSdk))
48
+ qoderCommand.error('Choose exactly one of --prepare-sdk or --qodercli <path>');
49
+ try {
50
+ if (options.prepareSdk) {
51
+ const { prepareSdkRuntime } = await import('./workstation/qoderAdapter/sdkRuntimeInstall.js');
52
+ const controller = new AbortController();
53
+ const cancel = () => controller.abort();
54
+ process.once('SIGINT', cancel);
55
+ process.once('SIGTERM', cancel);
56
+ try {
57
+ console.error('Preparing Qoder SDK…');
58
+ const result = await prepareSdkRuntime({ signal: controller.signal });
59
+ console.error(`Qoder SDK ready${result.alreadyInstalled ? ' (already prepared)' : ''}: ${result.instance}`);
60
+ }
61
+ finally {
62
+ process.removeListener('SIGINT', cancel);
63
+ process.removeListener('SIGTERM', cancel);
64
+ }
65
+ }
66
+ else {
67
+ const { runQoderAdapter } = await import('./workstation/qoderAdapter/main.js');
68
+ await runQoderAdapter(options.qodercli);
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.error(error instanceof Error ? error.message : String(error));
73
+ process.exitCode = 1;
74
+ }
48
75
  });
49
76
  registerStructCommands(program);
50
77
  registerRecordCommands(program);