apex-code 0.0.1-alpha.1 → 0.0.1-alpha.11

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 (798) hide show
  1. package/CHANGELOG.md +482 -0
  2. package/README.md +75 -680
  3. package/dist/cli/args.d.ts +21 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +119 -15
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/auth-command.d.ts.map +1 -1
  8. package/dist/cli/auth-command.js +3 -3
  9. package/dist/cli/auth-command.js.map +1 -1
  10. package/dist/cli/concurrent-session.d.ts +3 -0
  11. package/dist/cli/concurrent-session.d.ts.map +1 -0
  12. package/dist/cli/concurrent-session.js +13 -0
  13. package/dist/cli/concurrent-session.js.map +1 -0
  14. package/dist/cli/cost-command.d.ts +19 -0
  15. package/dist/cli/cost-command.d.ts.map +1 -0
  16. package/dist/cli/cost-command.js +107 -0
  17. package/dist/cli/cost-command.js.map +1 -0
  18. package/dist/cli/file-processor.d.ts.map +1 -1
  19. package/dist/cli/file-processor.js +2 -1
  20. package/dist/cli/file-processor.js.map +1 -1
  21. package/dist/cli/startup-ui.d.ts +1 -1
  22. package/dist/cli/startup-ui.d.ts.map +1 -1
  23. package/dist/cli/startup-ui.js +1 -2
  24. package/dist/cli/startup-ui.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +99 -16
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts +5 -4
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +58 -24
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  33. package/dist/core/agent-session-runtime.js +2 -0
  34. package/dist/core/agent-session-runtime.js.map +1 -1
  35. package/dist/core/agent-session-services.d.ts +28 -0
  36. package/dist/core/agent-session-services.d.ts.map +1 -1
  37. package/dist/core/agent-session-services.js +140 -4
  38. package/dist/core/agent-session-services.js.map +1 -1
  39. package/dist/core/agent-session.d.ts +147 -9
  40. package/dist/core/agent-session.d.ts.map +1 -1
  41. package/dist/core/agent-session.js +440 -123
  42. package/dist/core/agent-session.js.map +1 -1
  43. package/dist/core/auth-storage.d.ts +4 -1
  44. package/dist/core/auth-storage.d.ts.map +1 -1
  45. package/dist/core/auth-storage.js +17 -14
  46. package/dist/core/auth-storage.js.map +1 -1
  47. package/dist/core/bash-executor.d.ts.map +1 -1
  48. package/dist/core/bash-executor.js +18 -10
  49. package/dist/core/bash-executor.js.map +1 -1
  50. package/dist/core/checkpoints/git-checkpoints.d.ts +33 -0
  51. package/dist/core/checkpoints/git-checkpoints.d.ts.map +1 -0
  52. package/dist/core/checkpoints/git-checkpoints.js +230 -0
  53. package/dist/core/checkpoints/git-checkpoints.js.map +1 -0
  54. package/dist/core/checkpoints/session-checkpoints.d.ts +23 -0
  55. package/dist/core/checkpoints/session-checkpoints.d.ts.map +1 -0
  56. package/dist/core/checkpoints/session-checkpoints.js +29 -0
  57. package/dist/core/checkpoints/session-checkpoints.js.map +1 -0
  58. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  59. package/dist/core/compaction/branch-summarization.js +3 -0
  60. package/dist/core/compaction/branch-summarization.js.map +1 -1
  61. package/dist/core/compaction/compaction.d.ts +4 -3
  62. package/dist/core/compaction/compaction.d.ts.map +1 -1
  63. package/dist/core/compaction/compaction.js +41 -32
  64. package/dist/core/compaction/compaction.js.map +1 -1
  65. package/dist/core/context/deferred-schemas.d.ts +92 -0
  66. package/dist/core/context/deferred-schemas.d.ts.map +1 -0
  67. package/dist/core/context/deferred-schemas.js +74 -0
  68. package/dist/core/context/deferred-schemas.js.map +1 -0
  69. package/dist/core/context/eviction.d.ts +47 -0
  70. package/dist/core/context/eviction.d.ts.map +1 -0
  71. package/dist/core/context/eviction.js +83 -0
  72. package/dist/core/context/eviction.js.map +1 -0
  73. package/dist/core/context/pipeline.d.ts +90 -0
  74. package/dist/core/context/pipeline.d.ts.map +1 -0
  75. package/dist/core/context/pipeline.js +109 -0
  76. package/dist/core/context/pipeline.js.map +1 -0
  77. package/dist/core/credential-failover.d.ts +30 -0
  78. package/dist/core/credential-failover.d.ts.map +1 -0
  79. package/dist/core/credential-failover.js +46 -0
  80. package/dist/core/credential-failover.js.map +1 -0
  81. package/dist/core/credential-pool.d.ts +60 -0
  82. package/dist/core/credential-pool.d.ts.map +1 -0
  83. package/dist/core/credential-pool.js +84 -0
  84. package/dist/core/credential-pool.js.map +1 -0
  85. package/dist/core/defaults.d.ts +1 -0
  86. package/dist/core/defaults.d.ts.map +1 -1
  87. package/dist/core/defaults.js +9 -0
  88. package/dist/core/defaults.js.map +1 -1
  89. package/dist/core/delegation/agents.d.ts +15 -0
  90. package/dist/core/delegation/agents.d.ts.map +1 -0
  91. package/dist/core/delegation/agents.js +55 -0
  92. package/dist/core/delegation/agents.js.map +1 -0
  93. package/dist/core/delegation/ceiling.d.ts +29 -0
  94. package/dist/core/delegation/ceiling.d.ts.map +1 -0
  95. package/dist/core/delegation/ceiling.js +34 -0
  96. package/dist/core/delegation/ceiling.js.map +1 -0
  97. package/dist/core/delegation/runtime.d.ts +94 -0
  98. package/dist/core/delegation/runtime.d.ts.map +1 -0
  99. package/dist/core/delegation/runtime.js +117 -0
  100. package/dist/core/delegation/runtime.js.map +1 -0
  101. package/dist/core/durable-state/daemon.d.ts +37 -0
  102. package/dist/core/durable-state/daemon.d.ts.map +1 -0
  103. package/dist/core/durable-state/daemon.js +62 -0
  104. package/dist/core/durable-state/daemon.js.map +1 -0
  105. package/dist/core/durable-state/provenance.d.ts +7 -0
  106. package/dist/core/durable-state/provenance.d.ts.map +1 -0
  107. package/dist/core/durable-state/provenance.js +24 -0
  108. package/dist/core/durable-state/provenance.js.map +1 -0
  109. package/dist/core/durable-state/sqlite.d.ts +84 -0
  110. package/dist/core/durable-state/sqlite.d.ts.map +1 -0
  111. package/dist/core/durable-state/sqlite.js +355 -0
  112. package/dist/core/durable-state/sqlite.js.map +1 -0
  113. package/dist/core/environment.d.ts +12 -0
  114. package/dist/core/environment.d.ts.map +1 -0
  115. package/dist/core/environment.js +69 -0
  116. package/dist/core/environment.js.map +1 -0
  117. package/dist/core/evidence-policy.d.ts +17 -0
  118. package/dist/core/evidence-policy.d.ts.map +1 -0
  119. package/dist/core/evidence-policy.js +25 -0
  120. package/dist/core/evidence-policy.js.map +1 -0
  121. package/dist/core/evidence.d.ts +16 -0
  122. package/dist/core/evidence.d.ts.map +1 -0
  123. package/dist/core/evidence.js +51 -0
  124. package/dist/core/evidence.js.map +1 -0
  125. package/dist/core/exec.d.ts.map +1 -1
  126. package/dist/core/exec.js +5 -2
  127. package/dist/core/exec.js.map +1 -1
  128. package/dist/core/experimental.d.ts +4 -0
  129. package/dist/core/experimental.d.ts.map +1 -1
  130. package/dist/core/experimental.js +6 -1
  131. package/dist/core/experimental.js.map +1 -1
  132. package/dist/core/extensions/index.d.ts +2 -2
  133. package/dist/core/extensions/index.d.ts.map +1 -1
  134. package/dist/core/extensions/index.js +1 -1
  135. package/dist/core/extensions/index.js.map +1 -1
  136. package/dist/core/extensions/loader.d.ts.map +1 -1
  137. package/dist/core/extensions/loader.js +122 -49
  138. package/dist/core/extensions/loader.js.map +1 -1
  139. package/dist/core/extensions/types.d.ts +44 -9
  140. package/dist/core/extensions/types.d.ts.map +1 -1
  141. package/dist/core/extensions/types.js +3 -0
  142. package/dist/core/extensions/types.js.map +1 -1
  143. package/dist/core/footer-data-provider.d.ts +1 -1
  144. package/dist/core/footer-data-provider.d.ts.map +1 -1
  145. package/dist/core/footer-data-provider.js +1 -1
  146. package/dist/core/footer-data-provider.js.map +1 -1
  147. package/dist/core/http-dispatcher.d.ts +1 -2
  148. package/dist/core/http-dispatcher.d.ts.map +1 -1
  149. package/dist/core/http-dispatcher.js +2 -17
  150. package/dist/core/http-dispatcher.js.map +1 -1
  151. package/dist/core/http-idle-timeout.d.ts +12 -0
  152. package/dist/core/http-idle-timeout.d.ts.map +1 -0
  153. package/dist/core/http-idle-timeout.js +27 -0
  154. package/dist/core/http-idle-timeout.js.map +1 -0
  155. package/dist/core/index.d.ts +1 -0
  156. package/dist/core/index.d.ts.map +1 -1
  157. package/dist/core/index.js +1 -0
  158. package/dist/core/index.js.map +1 -1
  159. package/dist/core/keybindings.d.ts +38 -13
  160. package/dist/core/keybindings.d.ts.map +1 -1
  161. package/dist/core/keybindings.js +26 -5
  162. package/dist/core/keybindings.js.map +1 -1
  163. package/dist/core/lsp/client.d.ts +78 -0
  164. package/dist/core/lsp/client.d.ts.map +1 -0
  165. package/dist/core/lsp/client.js +494 -0
  166. package/dist/core/lsp/client.js.map +1 -0
  167. package/dist/core/lsp/diagnostics.d.ts +47 -0
  168. package/dist/core/lsp/diagnostics.d.ts.map +1 -0
  169. package/dist/core/lsp/diagnostics.js +224 -0
  170. package/dist/core/lsp/diagnostics.js.map +1 -0
  171. package/dist/core/lsp/pool.d.ts +48 -0
  172. package/dist/core/lsp/pool.d.ts.map +1 -0
  173. package/dist/core/lsp/pool.js +150 -0
  174. package/dist/core/lsp/pool.js.map +1 -0
  175. package/dist/core/lsp/registry.d.ts +49 -0
  176. package/dist/core/lsp/registry.d.ts.map +1 -0
  177. package/dist/core/lsp/registry.js +215 -0
  178. package/dist/core/lsp/registry.js.map +1 -0
  179. package/dist/core/lsp/status.d.ts +23 -0
  180. package/dist/core/lsp/status.d.ts.map +1 -0
  181. package/dist/core/lsp/status.js +35 -0
  182. package/dist/core/lsp/status.js.map +1 -0
  183. package/dist/core/lsp/sync.d.ts +13 -0
  184. package/dist/core/lsp/sync.d.ts.map +1 -0
  185. package/dist/core/lsp/sync.js +71 -0
  186. package/dist/core/lsp/sync.js.map +1 -0
  187. package/dist/core/mcp/config.d.ts +16 -0
  188. package/dist/core/mcp/config.d.ts.map +1 -0
  189. package/dist/core/mcp/config.js +152 -0
  190. package/dist/core/mcp/config.js.map +1 -0
  191. package/dist/core/mcp/connector.d.ts +10 -0
  192. package/dist/core/mcp/connector.d.ts.map +1 -0
  193. package/dist/core/mcp/connector.js +70 -0
  194. package/dist/core/mcp/connector.js.map +1 -0
  195. package/dist/core/mcp/contract.d.ts +19 -0
  196. package/dist/core/mcp/contract.d.ts.map +1 -0
  197. package/dist/core/mcp/contract.js +89 -0
  198. package/dist/core/mcp/contract.js.map +1 -0
  199. package/dist/core/mcp/mcp-tool.d.ts +32 -0
  200. package/dist/core/mcp/mcp-tool.d.ts.map +1 -0
  201. package/dist/core/mcp/mcp-tool.js +165 -0
  202. package/dist/core/mcp/mcp-tool.js.map +1 -0
  203. package/dist/core/mcp/metadata-cache.d.ts +29 -0
  204. package/dist/core/mcp/metadata-cache.d.ts.map +1 -0
  205. package/dist/core/mcp/metadata-cache.js +99 -0
  206. package/dist/core/mcp/metadata-cache.js.map +1 -0
  207. package/dist/core/mcp/runtime.d.ts +18 -0
  208. package/dist/core/mcp/runtime.d.ts.map +1 -0
  209. package/dist/core/mcp/runtime.js +35 -0
  210. package/dist/core/mcp/runtime.js.map +1 -0
  211. package/dist/core/mcp/schema.d.ts +22 -0
  212. package/dist/core/mcp/schema.d.ts.map +1 -0
  213. package/dist/core/mcp/schema.js +20 -0
  214. package/dist/core/mcp/schema.js.map +1 -0
  215. package/dist/core/mcp/server-manager.d.ts +43 -0
  216. package/dist/core/mcp/server-manager.d.ts.map +1 -0
  217. package/dist/core/mcp/server-manager.js +142 -0
  218. package/dist/core/mcp/server-manager.js.map +1 -0
  219. package/dist/core/mcp/types.d.ts +98 -0
  220. package/dist/core/mcp/types.d.ts.map +1 -0
  221. package/dist/core/mcp/types.js +8 -0
  222. package/dist/core/mcp/types.js.map +1 -0
  223. package/dist/core/model-config.d.ts +18 -0
  224. package/dist/core/model-config.d.ts.map +1 -1
  225. package/dist/core/model-config.js +25 -6
  226. package/dist/core/model-config.js.map +1 -1
  227. package/dist/core/model-resolver.d.ts +21 -0
  228. package/dist/core/model-resolver.d.ts.map +1 -1
  229. package/dist/core/model-resolver.js +73 -8
  230. package/dist/core/model-resolver.js.map +1 -1
  231. package/dist/core/model-runtime.d.ts +73 -0
  232. package/dist/core/model-runtime.d.ts.map +1 -1
  233. package/dist/core/model-runtime.js +225 -8
  234. package/dist/core/model-runtime.js.map +1 -1
  235. package/dist/core/models-store.d.ts.map +1 -1
  236. package/dist/core/models-store.js +2 -1
  237. package/dist/core/models-store.js.map +1 -1
  238. package/dist/core/observability/aggregate.d.ts +21 -0
  239. package/dist/core/observability/aggregate.d.ts.map +1 -0
  240. package/dist/core/observability/aggregate.js +36 -0
  241. package/dist/core/observability/aggregate.js.map +1 -0
  242. package/dist/core/observability/otlp.d.ts +66 -0
  243. package/dist/core/observability/otlp.d.ts.map +1 -0
  244. package/dist/core/observability/otlp.js +95 -0
  245. package/dist/core/observability/otlp.js.map +1 -0
  246. package/dist/core/package-manager.d.ts.map +1 -1
  247. package/dist/core/package-manager.js +40 -16
  248. package/dist/core/package-manager.js.map +1 -1
  249. package/dist/core/permissions/gate.d.ts +42 -0
  250. package/dist/core/permissions/gate.d.ts.map +1 -0
  251. package/dist/core/permissions/gate.js +72 -0
  252. package/dist/core/permissions/gate.js.map +1 -0
  253. package/dist/core/permissions/modes.d.ts +18 -0
  254. package/dist/core/permissions/modes.d.ts.map +1 -0
  255. package/dist/core/permissions/modes.js +57 -0
  256. package/dist/core/permissions/modes.js.map +1 -0
  257. package/dist/core/permissions/responder.d.ts +30 -0
  258. package/dist/core/permissions/responder.d.ts.map +1 -0
  259. package/dist/core/permissions/responder.js +32 -0
  260. package/dist/core/permissions/responder.js.map +1 -0
  261. package/dist/core/permissions/rules.d.ts +34 -0
  262. package/dist/core/permissions/rules.d.ts.map +1 -0
  263. package/dist/core/permissions/rules.js +74 -0
  264. package/dist/core/permissions/rules.js.map +1 -0
  265. package/dist/core/permissions/startup.d.ts +45 -0
  266. package/dist/core/permissions/startup.d.ts.map +1 -0
  267. package/dist/core/permissions/startup.js +63 -0
  268. package/dist/core/permissions/startup.js.map +1 -0
  269. package/dist/core/permissions/store.d.ts +114 -0
  270. package/dist/core/permissions/store.d.ts.map +1 -0
  271. package/dist/core/permissions/store.js +229 -0
  272. package/dist/core/permissions/store.js.map +1 -0
  273. package/dist/core/pi-manifest.d.ts.map +1 -1
  274. package/dist/core/pi-manifest.js +2 -1
  275. package/dist/core/pi-manifest.js.map +1 -1
  276. package/dist/core/project-trust.d.ts.map +1 -1
  277. package/dist/core/project-trust.js +1 -1
  278. package/dist/core/project-trust.js.map +1 -1
  279. package/dist/core/provider-attribution.d.ts.map +1 -1
  280. package/dist/core/provider-attribution.js +6 -7
  281. package/dist/core/provider-attribution.js.map +1 -1
  282. package/dist/core/remote-catalog-provider.d.ts +2 -2
  283. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  284. package/dist/core/remote-catalog-provider.js +22 -17
  285. package/dist/core/remote-catalog-provider.js.map +1 -1
  286. package/dist/core/resource-loader.d.ts.map +1 -1
  287. package/dist/core/resource-loader.js +3 -2
  288. package/dist/core/resource-loader.js.map +1 -1
  289. package/dist/core/sandbox/bwrap-arguments.d.ts +52 -0
  290. package/dist/core/sandbox/bwrap-arguments.d.ts.map +1 -0
  291. package/dist/core/sandbox/bwrap-arguments.js +86 -0
  292. package/dist/core/sandbox/bwrap-arguments.js.map +1 -0
  293. package/dist/core/sandbox/child-entry.d.ts +2 -0
  294. package/dist/core/sandbox/child-entry.d.ts.map +1 -0
  295. package/dist/core/sandbox/child-entry.js +22 -0
  296. package/dist/core/sandbox/child-entry.js.map +1 -0
  297. package/dist/core/sandbox/cli-launch.d.ts +88 -0
  298. package/dist/core/sandbox/cli-launch.d.ts.map +1 -0
  299. package/dist/core/sandbox/cli-launch.js +272 -0
  300. package/dist/core/sandbox/cli-launch.js.map +1 -0
  301. package/dist/core/sandbox/cli-supervisor.d.ts +30 -0
  302. package/dist/core/sandbox/cli-supervisor.d.ts.map +1 -0
  303. package/dist/core/sandbox/cli-supervisor.js +123 -0
  304. package/dist/core/sandbox/cli-supervisor.js.map +1 -0
  305. package/dist/core/sandbox/default-hosts.d.ts +28 -0
  306. package/dist/core/sandbox/default-hosts.d.ts.map +1 -0
  307. package/dist/core/sandbox/default-hosts.js +69 -0
  308. package/dist/core/sandbox/default-hosts.js.map +1 -0
  309. package/dist/core/sandbox/full-access.d.ts +28 -0
  310. package/dist/core/sandbox/full-access.d.ts.map +1 -0
  311. package/dist/core/sandbox/full-access.js +63 -0
  312. package/dist/core/sandbox/full-access.js.map +1 -0
  313. package/dist/core/sandbox/git-identity.d.ts +57 -0
  314. package/dist/core/sandbox/git-identity.d.ts.map +1 -0
  315. package/dist/core/sandbox/git-identity.js +78 -0
  316. package/dist/core/sandbox/git-identity.js.map +1 -0
  317. package/dist/core/sandbox/host-approval.d.ts +42 -0
  318. package/dist/core/sandbox/host-approval.d.ts.map +1 -0
  319. package/dist/core/sandbox/host-approval.js +99 -0
  320. package/dist/core/sandbox/host-approval.js.map +1 -0
  321. package/dist/core/sandbox/linux-backend.d.ts +46 -0
  322. package/dist/core/sandbox/linux-backend.d.ts.map +1 -0
  323. package/dist/core/sandbox/linux-backend.js +304 -0
  324. package/dist/core/sandbox/linux-backend.js.map +1 -0
  325. package/dist/core/sandbox/macos-backend.d.ts +28 -0
  326. package/dist/core/sandbox/macos-backend.d.ts.map +1 -0
  327. package/dist/core/sandbox/macos-backend.js +313 -0
  328. package/dist/core/sandbox/macos-backend.js.map +1 -0
  329. package/dist/core/sandbox/network-proxy.d.ts +38 -0
  330. package/dist/core/sandbox/network-proxy.d.ts.map +1 -0
  331. package/dist/core/sandbox/network-proxy.js +153 -0
  332. package/dist/core/sandbox/network-proxy.js.map +1 -0
  333. package/dist/core/sandbox/network-refusal.d.ts +24 -0
  334. package/dist/core/sandbox/network-refusal.d.ts.map +1 -0
  335. package/dist/core/sandbox/network-refusal.js +72 -0
  336. package/dist/core/sandbox/network-refusal.js.map +1 -0
  337. package/dist/core/sandbox/policy.d.ts +40 -0
  338. package/dist/core/sandbox/policy.d.ts.map +1 -0
  339. package/dist/core/sandbox/policy.js +55 -0
  340. package/dist/core/sandbox/policy.js.map +1 -0
  341. package/dist/core/sandbox/profiles.d.ts +25 -0
  342. package/dist/core/sandbox/profiles.d.ts.map +1 -0
  343. package/dist/core/sandbox/profiles.js +23 -0
  344. package/dist/core/sandbox/profiles.js.map +1 -0
  345. package/dist/core/sandbox/rpc/command-client.d.ts +28 -0
  346. package/dist/core/sandbox/rpc/command-client.d.ts.map +1 -0
  347. package/dist/core/sandbox/rpc/command-client.js +86 -0
  348. package/dist/core/sandbox/rpc/command-client.js.map +1 -0
  349. package/dist/core/sandbox/rpc/command-proxy.d.ts +48 -0
  350. package/dist/core/sandbox/rpc/command-proxy.d.ts.map +1 -0
  351. package/dist/core/sandbox/rpc/command-proxy.js +120 -0
  352. package/dist/core/sandbox/rpc/command-proxy.js.map +1 -0
  353. package/dist/core/sandbox/rpc/credential-client.d.ts +20 -0
  354. package/dist/core/sandbox/rpc/credential-client.d.ts.map +1 -0
  355. package/dist/core/sandbox/rpc/credential-client.js +170 -0
  356. package/dist/core/sandbox/rpc/credential-client.js.map +1 -0
  357. package/dist/core/sandbox/rpc/credential-proxy.d.ts +44 -0
  358. package/dist/core/sandbox/rpc/credential-proxy.d.ts.map +1 -0
  359. package/dist/core/sandbox/rpc/credential-proxy.js +287 -0
  360. package/dist/core/sandbox/rpc/credential-proxy.js.map +1 -0
  361. package/dist/core/sandbox/rpc/framing.d.ts +35 -0
  362. package/dist/core/sandbox/rpc/framing.d.ts.map +1 -0
  363. package/dist/core/sandbox/rpc/framing.js +114 -0
  364. package/dist/core/sandbox/rpc/framing.js.map +1 -0
  365. package/dist/core/sandbox/rpc/git-credential-helper.d.ts +40 -0
  366. package/dist/core/sandbox/rpc/git-credential-helper.d.ts.map +1 -0
  367. package/dist/core/sandbox/rpc/git-credential-helper.js +152 -0
  368. package/dist/core/sandbox/rpc/git-credential-helper.js.map +1 -0
  369. package/dist/core/sandbox/rpc/git-credential-proxy.d.ts +48 -0
  370. package/dist/core/sandbox/rpc/git-credential-proxy.d.ts.map +1 -0
  371. package/dist/core/sandbox/rpc/git-credential-proxy.js +142 -0
  372. package/dist/core/sandbox/rpc/git-credential-proxy.js.map +1 -0
  373. package/dist/core/sandbox/supervisor-temp.d.ts +18 -0
  374. package/dist/core/sandbox/supervisor-temp.d.ts.map +1 -0
  375. package/dist/core/sandbox/supervisor-temp.js +21 -0
  376. package/dist/core/sandbox/supervisor-temp.js.map +1 -0
  377. package/dist/core/sandbox/supervisor.d.ts +51 -0
  378. package/dist/core/sandbox/supervisor.d.ts.map +1 -0
  379. package/dist/core/sandbox/supervisor.js +18 -0
  380. package/dist/core/sandbox/supervisor.js.map +1 -0
  381. package/dist/core/sandbox/terminal-handoff.d.ts +45 -0
  382. package/dist/core/sandbox/terminal-handoff.d.ts.map +1 -0
  383. package/dist/core/sandbox/terminal-handoff.js +176 -0
  384. package/dist/core/sandbox/terminal-handoff.js.map +1 -0
  385. package/dist/core/sandbox/terminal-size.d.ts +40 -0
  386. package/dist/core/sandbox/terminal-size.d.ts.map +1 -0
  387. package/dist/core/sandbox/terminal-size.js +105 -0
  388. package/dist/core/sandbox/terminal-size.js.map +1 -0
  389. package/dist/core/sandbox/violations.d.ts +23 -0
  390. package/dist/core/sandbox/violations.d.ts.map +1 -0
  391. package/dist/core/sandbox/violations.js +30 -0
  392. package/dist/core/sandbox/violations.js.map +1 -0
  393. package/dist/core/sdk.d.ts +32 -41
  394. package/dist/core/sdk.d.ts.map +1 -1
  395. package/dist/core/sdk.js +174 -6
  396. package/dist/core/sdk.js.map +1 -1
  397. package/dist/core/session-export.d.ts +4 -0
  398. package/dist/core/session-export.d.ts.map +1 -0
  399. package/dist/core/session-export.js +32 -0
  400. package/dist/core/session-export.js.map +1 -0
  401. package/dist/core/session-lease.d.ts +31 -0
  402. package/dist/core/session-lease.d.ts.map +1 -0
  403. package/dist/core/session-lease.js +138 -0
  404. package/dist/core/session-lease.js.map +1 -0
  405. package/dist/core/session-manager.d.ts +58 -2
  406. package/dist/core/session-manager.d.ts.map +1 -1
  407. package/dist/core/session-manager.js +92 -7
  408. package/dist/core/session-manager.js.map +1 -1
  409. package/dist/core/session-share.d.ts +31 -0
  410. package/dist/core/session-share.d.ts.map +1 -0
  411. package/dist/core/session-share.js +45 -0
  412. package/dist/core/session-share.js.map +1 -0
  413. package/dist/core/settings-diagnostics.d.ts +9 -0
  414. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  415. package/dist/core/settings-diagnostics.js +21 -0
  416. package/dist/core/settings-diagnostics.js.map +1 -0
  417. package/dist/core/settings-manager.d.ts +99 -9
  418. package/dist/core/settings-manager.d.ts.map +1 -1
  419. package/dist/core/settings-manager.js +141 -36
  420. package/dist/core/settings-manager.js.map +1 -1
  421. package/dist/core/skills.d.ts +19 -7
  422. package/dist/core/skills.d.ts.map +1 -1
  423. package/dist/core/skills.js +128 -52
  424. package/dist/core/skills.js.map +1 -1
  425. package/dist/core/slash-commands.d.ts.map +1 -1
  426. package/dist/core/slash-commands.js +6 -2
  427. package/dist/core/slash-commands.js.map +1 -1
  428. package/dist/core/system-prompt.d.ts +2 -2
  429. package/dist/core/system-prompt.d.ts.map +1 -1
  430. package/dist/core/system-prompt.js +59 -68
  431. package/dist/core/system-prompt.js.map +1 -1
  432. package/dist/core/timings.d.ts +1 -1
  433. package/dist/core/timings.d.ts.map +1 -1
  434. package/dist/core/timings.js +3 -2
  435. package/dist/core/timings.js.map +1 -1
  436. package/dist/core/tools/ask-user.d.ts +25 -0
  437. package/dist/core/tools/ask-user.d.ts.map +1 -0
  438. package/dist/core/tools/ask-user.js +49 -0
  439. package/dist/core/tools/ask-user.js.map +1 -0
  440. package/dist/core/tools/bash-command-segments.d.ts +22 -0
  441. package/dist/core/tools/bash-command-segments.d.ts.map +1 -0
  442. package/dist/core/tools/bash-command-segments.js +128 -0
  443. package/dist/core/tools/bash-command-segments.js.map +1 -0
  444. package/dist/core/tools/bash.d.ts +40 -4
  445. package/dist/core/tools/bash.d.ts.map +1 -1
  446. package/dist/core/tools/bash.js +183 -32
  447. package/dist/core/tools/bash.js.map +1 -1
  448. package/dist/core/tools/contract-snapshot.d.ts +58 -0
  449. package/dist/core/tools/contract-snapshot.d.ts.map +1 -0
  450. package/dist/core/tools/contract-snapshot.js +51 -0
  451. package/dist/core/tools/contract-snapshot.js.map +1 -0
  452. package/dist/core/tools/contract.d.ts +185 -0
  453. package/dist/core/tools/contract.d.ts.map +1 -0
  454. package/dist/core/tools/contract.js +50 -0
  455. package/dist/core/tools/contract.js.map +1 -0
  456. package/dist/core/tools/delegate.d.ts +38 -0
  457. package/dist/core/tools/delegate.d.ts.map +1 -0
  458. package/dist/core/tools/delegate.js +90 -0
  459. package/dist/core/tools/delegate.js.map +1 -0
  460. package/dist/core/tools/diagnostics.d.ts +39 -0
  461. package/dist/core/tools/diagnostics.d.ts.map +1 -0
  462. package/dist/core/tools/diagnostics.js +62 -0
  463. package/dist/core/tools/diagnostics.js.map +1 -0
  464. package/dist/core/tools/edit-diff.d.ts +0 -5
  465. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  466. package/dist/core/tools/edit-diff.js +2 -5
  467. package/dist/core/tools/edit-diff.js.map +1 -1
  468. package/dist/core/tools/edit.d.ts +12 -2
  469. package/dist/core/tools/edit.d.ts.map +1 -1
  470. package/dist/core/tools/edit.js +61 -10
  471. package/dist/core/tools/edit.js.map +1 -1
  472. package/dist/core/tools/find.d.ts +2 -2
  473. package/dist/core/tools/find.d.ts.map +1 -1
  474. package/dist/core/tools/find.js +13 -1
  475. package/dist/core/tools/find.js.map +1 -1
  476. package/dist/core/tools/grep.d.ts +4 -2
  477. package/dist/core/tools/grep.d.ts.map +1 -1
  478. package/dist/core/tools/grep.js +47 -10
  479. package/dist/core/tools/grep.js.map +1 -1
  480. package/dist/core/tools/index.d.ts +60 -6
  481. package/dist/core/tools/index.d.ts.map +1 -1
  482. package/dist/core/tools/index.js +148 -2
  483. package/dist/core/tools/index.js.map +1 -1
  484. package/dist/core/tools/ls.d.ts +4 -2
  485. package/dist/core/tools/ls.d.ts.map +1 -1
  486. package/dist/core/tools/ls.js +17 -1
  487. package/dist/core/tools/ls.js.map +1 -1
  488. package/dist/core/tools/lsp.d.ts +62 -0
  489. package/dist/core/tools/lsp.d.ts.map +1 -0
  490. package/dist/core/tools/lsp.js +216 -0
  491. package/dist/core/tools/lsp.js.map +1 -0
  492. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  493. package/dist/core/tools/output-accumulator.js +1 -1
  494. package/dist/core/tools/output-accumulator.js.map +1 -1
  495. package/dist/core/tools/path-permission.d.ts +18 -0
  496. package/dist/core/tools/path-permission.d.ts.map +1 -0
  497. package/dist/core/tools/path-permission.js +28 -0
  498. package/dist/core/tools/path-permission.js.map +1 -0
  499. package/dist/core/tools/plan-present.d.ts +27 -0
  500. package/dist/core/tools/plan-present.d.ts.map +1 -0
  501. package/dist/core/tools/plan-present.js +55 -0
  502. package/dist/core/tools/plan-present.js.map +1 -0
  503. package/dist/core/tools/powershell.d.ts +16 -0
  504. package/dist/core/tools/powershell.d.ts.map +1 -0
  505. package/dist/core/tools/powershell.js +39 -0
  506. package/dist/core/tools/powershell.js.map +1 -0
  507. package/dist/core/tools/read.d.ts +2 -2
  508. package/dist/core/tools/read.d.ts.map +1 -1
  509. package/dist/core/tools/read.js +14 -0
  510. package/dist/core/tools/read.js.map +1 -1
  511. package/dist/core/tools/skill-search.d.ts +32 -0
  512. package/dist/core/tools/skill-search.d.ts.map +1 -0
  513. package/dist/core/tools/skill-search.js +56 -0
  514. package/dist/core/tools/skill-search.js.map +1 -0
  515. package/dist/core/tools/test.d.ts +34 -0
  516. package/dist/core/tools/test.d.ts.map +1 -0
  517. package/dist/core/tools/test.js +75 -0
  518. package/dist/core/tools/test.js.map +1 -0
  519. package/dist/core/tools/todo-write.d.ts +31 -0
  520. package/dist/core/tools/todo-write.d.ts.map +1 -0
  521. package/dist/core/tools/todo-write.js +51 -0
  522. package/dist/core/tools/todo-write.js.map +1 -0
  523. package/dist/core/tools/tool-definition-wrapper.d.ts +13 -2
  524. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  525. package/dist/core/tools/tool-definition-wrapper.js +11 -1
  526. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  527. package/dist/core/tools/tool-schema.d.ts +22 -0
  528. package/dist/core/tools/tool-schema.d.ts.map +1 -0
  529. package/dist/core/tools/tool-schema.js +45 -0
  530. package/dist/core/tools/tool-schema.js.map +1 -0
  531. package/dist/core/tools/web-fetch.d.ts +26 -0
  532. package/dist/core/tools/web-fetch.d.ts.map +1 -0
  533. package/dist/core/tools/web-fetch.js +62 -0
  534. package/dist/core/tools/web-fetch.js.map +1 -0
  535. package/dist/core/tools/web-search-exa.d.ts +33 -0
  536. package/dist/core/tools/web-search-exa.d.ts.map +1 -0
  537. package/dist/core/tools/web-search-exa.js +128 -0
  538. package/dist/core/tools/web-search-exa.js.map +1 -0
  539. package/dist/core/tools/web-search.d.ts +26 -0
  540. package/dist/core/tools/web-search.d.ts.map +1 -0
  541. package/dist/core/tools/web-search.js +53 -0
  542. package/dist/core/tools/web-search.js.map +1 -0
  543. package/dist/core/tools/write.d.ts +16 -2
  544. package/dist/core/tools/write.d.ts.map +1 -1
  545. package/dist/core/tools/write.js +48 -2
  546. package/dist/core/tools/write.js.map +1 -1
  547. package/dist/core/trust-manager.d.ts.map +1 -1
  548. package/dist/core/trust-manager.js +2 -1
  549. package/dist/core/trust-manager.js.map +1 -1
  550. package/dist/core/usage-performance-store.d.ts +56 -0
  551. package/dist/core/usage-performance-store.d.ts.map +1 -0
  552. package/dist/core/usage-performance-store.js +85 -0
  553. package/dist/core/usage-performance-store.js.map +1 -0
  554. package/dist/core/web-search-provider.d.ts +64 -0
  555. package/dist/core/web-search-provider.d.ts.map +1 -0
  556. package/dist/core/web-search-provider.js +149 -0
  557. package/dist/core/web-search-provider.js.map +1 -0
  558. package/dist/extensions/llama/index.d.ts.map +1 -1
  559. package/dist/extensions/llama/index.js +2 -0
  560. package/dist/extensions/llama/index.js.map +1 -1
  561. package/dist/extensions/llama/provider.d.ts.map +1 -1
  562. package/dist/extensions/llama/provider.js +6 -2
  563. package/dist/extensions/llama/provider.js.map +1 -1
  564. package/dist/index.d.ts +9 -6
  565. package/dist/index.d.ts.map +1 -1
  566. package/dist/index.js +7 -4
  567. package/dist/index.js.map +1 -1
  568. package/dist/main.d.ts +5 -0
  569. package/dist/main.d.ts.map +1 -1
  570. package/dist/main.js +87 -22
  571. package/dist/main.js.map +1 -1
  572. package/dist/migrations.d.ts.map +1 -1
  573. package/dist/migrations.js +6 -5
  574. package/dist/migrations.js.map +1 -1
  575. package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  576. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  577. package/dist/modes/interactive/components/assistant-message.js +182 -23
  578. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  579. package/dist/modes/interactive/components/bash-execution.d.ts +7 -0
  580. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  581. package/dist/modes/interactive/components/bash-execution.js +20 -0
  582. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  583. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  584. package/dist/modes/interactive/components/config-selector.js +9 -6
  585. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  586. package/dist/modes/interactive/components/custom-editor.d.ts +72 -1
  587. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  588. package/dist/modes/interactive/components/custom-editor.js +338 -1
  589. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  590. package/dist/modes/interactive/components/dynamic-border.d.ts +7 -1
  591. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  592. package/dist/modes/interactive/components/dynamic-border.js +11 -2
  593. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  594. package/dist/modes/interactive/components/extension-selector.d.ts +4 -0
  595. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  596. package/dist/modes/interactive/components/extension-selector.js +24 -6
  597. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  598. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -4
  599. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  600. package/dist/modes/interactive/components/first-time-setup.js +17 -41
  601. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  602. package/dist/modes/interactive/components/first-use-hints.d.ts +8 -0
  603. package/dist/modes/interactive/components/first-use-hints.d.ts.map +1 -0
  604. package/dist/modes/interactive/components/first-use-hints.js +22 -0
  605. package/dist/modes/interactive/components/first-use-hints.js.map +1 -0
  606. package/dist/modes/interactive/components/footer.d.ts +31 -1
  607. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  608. package/dist/modes/interactive/components/footer.js +205 -24
  609. package/dist/modes/interactive/components/footer.js.map +1 -1
  610. package/dist/modes/interactive/components/index.d.ts +2 -0
  611. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  612. package/dist/modes/interactive/components/index.js +2 -0
  613. package/dist/modes/interactive/components/index.js.map +1 -1
  614. package/dist/modes/interactive/components/model-selector.d.ts +31 -9
  615. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  616. package/dist/modes/interactive/components/model-selector.js +236 -96
  617. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  618. package/dist/modes/interactive/components/settings-selector.d.ts +25 -5
  619. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  620. package/dist/modes/interactive/components/settings-selector.js +226 -58
  621. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  622. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  623. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  624. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  625. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  626. package/dist/modes/interactive/components/splash-header.d.ts +66 -0
  627. package/dist/modes/interactive/components/splash-header.d.ts.map +1 -0
  628. package/dist/modes/interactive/components/splash-header.js +180 -0
  629. package/dist/modes/interactive/components/splash-header.js.map +1 -0
  630. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  631. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  632. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  633. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  634. package/dist/modes/interactive/components/tool-execution.d.ts +28 -1
  635. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  636. package/dist/modes/interactive/components/tool-execution.js +144 -35
  637. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  638. package/dist/modes/interactive/components/tool-panel.d.ts +30 -0
  639. package/dist/modes/interactive/components/tool-panel.d.ts.map +1 -0
  640. package/dist/modes/interactive/components/tool-panel.js +130 -0
  641. package/dist/modes/interactive/components/tool-panel.js.map +1 -0
  642. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  643. package/dist/modes/interactive/external-editor.js +60 -10
  644. package/dist/modes/interactive/external-editor.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode.d.ts +90 -5
  646. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode.js +729 -206
  648. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  649. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  650. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  651. package/dist/modes/interactive/model-catalog-refresh.js +34 -0
  652. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  653. package/dist/modes/interactive/theme/apex.json +93 -0
  654. package/dist/modes/interactive/theme/dark.json +2 -0
  655. package/dist/modes/interactive/theme/light.json +3 -1
  656. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  657. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  658. package/dist/modes/interactive/theme/theme-controller.js +25 -11
  659. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  660. package/dist/modes/interactive/theme/theme-schema.json +11 -3
  661. package/dist/modes/interactive/theme/theme.d.ts +14 -3
  662. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  663. package/dist/modes/interactive/theme/theme.js +65 -10
  664. package/dist/modes/interactive/theme/theme.js.map +1 -1
  665. package/dist/modes/json-event.d.ts +18 -12
  666. package/dist/modes/json-event.d.ts.map +1 -1
  667. package/dist/modes/json-event.js +22 -5
  668. package/dist/modes/json-event.js.map +1 -1
  669. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  670. package/dist/modes/rpc/rpc-mode.js +2 -1
  671. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  672. package/dist/package-manager-cli.d.ts +1 -0
  673. package/dist/package-manager-cli.d.ts.map +1 -1
  674. package/dist/package-manager-cli.js +210 -19
  675. package/dist/package-manager-cli.js.map +1 -1
  676. package/dist/rpc-entry.d.ts.map +1 -1
  677. package/dist/rpc-entry.js +2 -1
  678. package/dist/rpc-entry.js.map +1 -1
  679. package/dist/testing/replay/metrics.d.ts +24 -0
  680. package/dist/testing/replay/metrics.d.ts.map +1 -0
  681. package/dist/testing/replay/metrics.js +35 -0
  682. package/dist/testing/replay/metrics.js.map +1 -0
  683. package/dist/testing/replay/recorded-provider.d.ts +10 -0
  684. package/dist/testing/replay/recorded-provider.d.ts.map +1 -0
  685. package/dist/testing/replay/recorded-provider.js +108 -0
  686. package/dist/testing/replay/recorded-provider.js.map +1 -0
  687. package/dist/testing/replay/runner.d.ts +56 -0
  688. package/dist/testing/replay/runner.d.ts.map +1 -0
  689. package/dist/testing/replay/runner.js +406 -0
  690. package/dist/testing/replay/runner.js.map +1 -0
  691. package/dist/themes/apex-logo.d.ts +41 -0
  692. package/dist/themes/apex-logo.d.ts.map +1 -0
  693. package/dist/themes/apex-logo.js +35 -0
  694. package/dist/themes/apex-logo.js.map +1 -0
  695. package/dist/utils/apex-code-user-agent.d.ts +2 -0
  696. package/dist/utils/apex-code-user-agent.d.ts.map +1 -0
  697. package/dist/utils/apex-code-user-agent.js +5 -0
  698. package/dist/utils/apex-code-user-agent.js.map +1 -0
  699. package/dist/utils/changelog.d.ts +7 -2
  700. package/dist/utils/changelog.d.ts.map +1 -1
  701. package/dist/utils/changelog.js +82 -13
  702. package/dist/utils/changelog.js.map +1 -1
  703. package/dist/utils/clipboard-image.d.ts.map +1 -1
  704. package/dist/utils/clipboard-image.js +1 -1
  705. package/dist/utils/clipboard-image.js.map +1 -1
  706. package/dist/utils/frontmatter.d.ts.map +1 -1
  707. package/dist/utils/frontmatter.js +2 -1
  708. package/dist/utils/frontmatter.js.map +1 -1
  709. package/dist/utils/management-http.d.ts +5 -3
  710. package/dist/utils/management-http.d.ts.map +1 -1
  711. package/dist/utils/management-http.js +14 -10
  712. package/dist/utils/management-http.js.map +1 -1
  713. package/dist/utils/shell.d.ts +3 -0
  714. package/dist/utils/shell.d.ts.map +1 -1
  715. package/dist/utils/shell.js +17 -5
  716. package/dist/utils/shell.js.map +1 -1
  717. package/dist/utils/syntax-highlight.d.ts +1 -0
  718. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  719. package/dist/utils/syntax-highlight.js +60 -1
  720. package/dist/utils/syntax-highlight.js.map +1 -1
  721. package/dist/utils/text.d.ts +8 -0
  722. package/dist/utils/text.d.ts.map +1 -0
  723. package/dist/utils/text.js +9 -0
  724. package/dist/utils/text.js.map +1 -0
  725. package/dist/utils/tools-manager.d.ts +70 -2
  726. package/dist/utils/tools-manager.d.ts.map +1 -1
  727. package/dist/utils/tools-manager.js +280 -124
  728. package/dist/utils/tools-manager.js.map +1 -1
  729. package/dist/utils/version-check.d.ts +7 -5
  730. package/dist/utils/version-check.d.ts.map +1 -1
  731. package/dist/utils/version-check.js +27 -14
  732. package/dist/utils/version-check.js.map +1 -1
  733. package/dist/utils/windows-self-update.d.ts.map +1 -1
  734. package/dist/utils/windows-self-update.js +1 -1
  735. package/dist/utils/windows-self-update.js.map +1 -1
  736. package/docs/compaction.md +41 -24
  737. package/docs/containerization.md +24 -21
  738. package/docs/custom-provider.md +15 -12
  739. package/docs/development.md +11 -11
  740. package/docs/environment-variables.md +37 -77
  741. package/docs/extensions.md +68 -54
  742. package/docs/index.md +12 -24
  743. package/docs/json.md +18 -11
  744. package/docs/keybindings.md +18 -12
  745. package/docs/llama-cpp.md +9 -7
  746. package/docs/models.md +17 -11
  747. package/docs/packages.md +47 -43
  748. package/docs/prompt-templates.md +3 -3
  749. package/docs/providers.md +10 -10
  750. package/docs/quickstart.md +49 -32
  751. package/docs/rpc.md +35 -18
  752. package/docs/sdk.md +20 -6
  753. package/docs/security.md +18 -18
  754. package/docs/session-format.md +9 -9
  755. package/docs/sessions.md +13 -13
  756. package/docs/settings.md +83 -16
  757. package/docs/shell-aliases.md +1 -1
  758. package/docs/skills.md +66 -15
  759. package/docs/terminal-setup.md +44 -19
  760. package/docs/termux.md +4 -4
  761. package/docs/themes.md +32 -11
  762. package/docs/tmux.md +4 -4
  763. package/docs/tui.md +5 -5
  764. package/docs/usage.md +61 -53
  765. package/docs/windows.md +24 -2
  766. package/examples/extensions/border-status-editor.ts +1 -1
  767. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  768. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  769. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  770. package/examples/extensions/git-checkpoint.ts +24 -36
  771. package/examples/extensions/gondolin/package-lock.json +2 -2
  772. package/examples/extensions/gondolin/package.json +1 -1
  773. package/examples/extensions/notify.ts +3 -1
  774. package/examples/extensions/sandbox/package-lock.json +2 -2
  775. package/examples/extensions/sandbox/package.json +1 -1
  776. package/examples/extensions/subagent/README.md +3 -1
  777. package/examples/extensions/subagent/agents.ts +40 -9
  778. package/examples/extensions/subagent/index.ts +27 -4
  779. package/examples/extensions/titlebar-spinner.ts +1 -1
  780. package/examples/extensions/with-deps/package-lock.json +2 -2
  781. package/examples/extensions/with-deps/package.json +1 -1
  782. package/examples/rpc-extension-ui.ts +1 -1
  783. package/examples/sdk/06-extensions.ts +1 -1
  784. package/examples/sdk/README.md +1 -1
  785. package/npm-shrinkwrap.json +435 -452
  786. package/package.json +17 -18
  787. package/dist/core/telemetry.d.ts +0 -3
  788. package/dist/core/telemetry.d.ts.map +0 -1
  789. package/dist/core/telemetry.js +0 -9
  790. package/dist/core/telemetry.js.map +0 -1
  791. package/dist/server/create-harness.d.ts +0 -26
  792. package/dist/server/create-harness.d.ts.map +0 -1
  793. package/dist/server/create-harness.js +0 -104
  794. package/dist/server/create-harness.js.map +0 -1
  795. package/dist/utils/pi-user-agent.d.ts +0 -2
  796. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  797. package/dist/utils/pi-user-agent.js +0 -5
  798. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"models-store.d.ts","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAuBxG,qBAAa,8BAA+B,YAAW,WAAW;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAEzD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAI3G;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7G;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF;CACD;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAEhD,YAAY,IAAI,GAAE,MAAiD,EAQlE;IAED,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,iBAAiB;YAWX,UAAU;IAsClB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAI3G;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7G;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CASrF;CACD","sourcesContent":["import { join } from \"node:path\";\nimport type { ModelsStore, ModelsStoreEntry, ModelsStoreOperationOptions } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { raceWithAbortSignal } from \"../utils/abort.ts\";\nimport { getFileRevision, normalizePath } from \"../utils/paths.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"./auth-storage.ts\";\n\ntype StoredModels = Record<string, ModelsStoreEntry>;\n\ntype ModelsFileReload = {\n\tcontroller: AbortController;\n\tpromise: Promise<StoredModels>;\n\treaders: number;\n};\n\ntype ModelsFileReadState = {\n\tdata: StoredModels;\n\trevision?: string;\n\treload?: ModelsFileReload;\n};\n\n// Optimize the common path without retaining an unbounded set of custom paths.\nlet sharedModelsFileReadState: { path: string; readState: ModelsFileReadState } | undefined;\n\nexport class InMemoryCodingAgentModelsStore implements ModelsStore {\n\tprivate readonly entries = new Map<string, ModelsStoreEntry>();\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst entry = this.entries.get(providerId);\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.set(providerId, structuredClone(entry));\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.delete(providerId);\n\t}\n}\n\n/** Locked JSON-backed storage for dynamically refreshed provider catalogs. */\nexport class FileModelsStore implements ModelsStore {\n\tprivate readonly storage: AuthStorageBackend;\n\tprivate readonly path: string;\n\tprivate readonly readState: ModelsFileReadState;\n\n\tconstructor(path: string = join(getAgentDir(), \"models-store.json\")) {\n\t\tthis.path = normalizePath(path);\n\t\tthis.storage = new FileAuthStorageBackend(this.path);\n\t\tthis.readState =\n\t\t\tsharedModelsFileReadState?.path === this.path ? sharedModelsFileReadState.readState : { data: {} };\n\t\tif (!sharedModelsFileReadState) {\n\t\t\tsharedModelsFileReadState = { path: this.path, readState: this.readState };\n\t\t}\n\t}\n\n\tprivate parse(content: string | undefined): StoredModels {\n\t\treturn content ? (JSON.parse(content) as StoredModels) : {};\n\t}\n\n\tprivate updateReadState(readState: ModelsFileReadState, data: StoredModels, revision?: string): void {\n\t\treadState.data = data;\n\t\treadState.revision = revision;\n\t}\n\n\tprivate reloadFromStorage(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\treturn this.storage.withLockAsync(async (content) => {\n\t\t\tconst data = this.parse(content);\n\t\t\tthis.updateReadState(readState, data, getFileRevision(this.path));\n\t\t\treturn { result: data };\n\t\t}, options);\n\t}\n\n\tprivate async readLatest(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst revision = getFileRevision(this.path);\n\t\tif (revision !== undefined && revision === readState.revision) return readState.data;\n\t\tif (!readState.reload) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst reload: ModelsFileReload = {\n\t\t\t\tcontroller,\n\t\t\t\tpromise: this.reloadFromStorage(readState, { signal: controller.signal }),\n\t\t\t\treaders: 0,\n\t\t\t};\n\t\t\treadState.reload = reload;\n\t\t\tvoid reload.promise.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst reload = readState.reload;\n\t\treload.readers++;\n\t\ttry {\n\t\t\treturn await raceWithAbortSignal(reload.promise, options?.signal);\n\t\t} finally {\n\t\t\treload.readers--;\n\t\t\tif (reload.readers === 0 && readState.reload === reload) {\n\t\t\t\treadState.reload = undefined;\n\t\t\t\treload.controller.abort();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\tconst entry = (await this.readLatest(this.readState, options))[providerId];\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tcurrent[providerId] = structuredClone(entry);\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tdelete current[providerId];\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n}\n"]}
1
+ {"version":3,"file":"models-store.d.ts","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAwBxG,qBAAa,8BAA+B,YAAW,WAAW;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAEzD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAI3G;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7G;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF;CACD;AAED,8EAA8E;AAC9E,qBAAa,eAAgB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAEhD,YAAY,IAAI,GAAE,MAAiD,EAQlE;IAED,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,iBAAiB;YAWX,UAAU;IAsClB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAI3G;IAEK,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7G;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CASrF;CACD","sourcesContent":["import { join } from \"node:path\";\nimport type { ModelsStore, ModelsStoreEntry, ModelsStoreOperationOptions } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { raceWithAbortSignal } from \"../utils/abort.ts\";\nimport { getFileRevision, normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"./auth-storage.ts\";\n\ntype StoredModels = Record<string, ModelsStoreEntry>;\n\ntype ModelsFileReload = {\n\tcontroller: AbortController;\n\tpromise: Promise<StoredModels>;\n\treaders: number;\n};\n\ntype ModelsFileReadState = {\n\tdata: StoredModels;\n\trevision?: string;\n\treload?: ModelsFileReload;\n};\n\n// Optimize the common path without retaining an unbounded set of custom paths.\nlet sharedModelsFileReadState: { path: string; readState: ModelsFileReadState } | undefined;\n\nexport class InMemoryCodingAgentModelsStore implements ModelsStore {\n\tprivate readonly entries = new Map<string, ModelsStoreEntry>();\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst entry = this.entries.get(providerId);\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.set(providerId, structuredClone(entry));\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.delete(providerId);\n\t}\n}\n\n/** Locked JSON-backed storage for dynamically refreshed provider catalogs. */\nexport class FileModelsStore implements ModelsStore {\n\tprivate readonly storage: AuthStorageBackend;\n\tprivate readonly path: string;\n\tprivate readonly readState: ModelsFileReadState;\n\n\tconstructor(path: string = join(getAgentDir(), \"models-store.json\")) {\n\t\tthis.path = normalizePath(path);\n\t\tthis.storage = new FileAuthStorageBackend(this.path);\n\t\tthis.readState =\n\t\t\tsharedModelsFileReadState?.path === this.path ? sharedModelsFileReadState.readState : { data: {} };\n\t\tif (!sharedModelsFileReadState) {\n\t\t\tsharedModelsFileReadState = { path: this.path, readState: this.readState };\n\t\t}\n\t}\n\n\tprivate parse(content: string | undefined): StoredModels {\n\t\treturn content ? (JSON.parse(stripBom(content)) as StoredModels) : {};\n\t}\n\n\tprivate updateReadState(readState: ModelsFileReadState, data: StoredModels, revision?: string): void {\n\t\treadState.data = data;\n\t\treadState.revision = revision;\n\t}\n\n\tprivate reloadFromStorage(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\treturn this.storage.withLockAsync(async (content) => {\n\t\t\tconst data = this.parse(content);\n\t\t\tthis.updateReadState(readState, data, getFileRevision(this.path));\n\t\t\treturn { result: data };\n\t\t}, options);\n\t}\n\n\tprivate async readLatest(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst revision = getFileRevision(this.path);\n\t\tif (revision !== undefined && revision === readState.revision) return readState.data;\n\t\tif (!readState.reload) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst reload: ModelsFileReload = {\n\t\t\t\tcontroller,\n\t\t\t\tpromise: this.reloadFromStorage(readState, { signal: controller.signal }),\n\t\t\t\treaders: 0,\n\t\t\t};\n\t\t\treadState.reload = reload;\n\t\t\tvoid reload.promise.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst reload = readState.reload;\n\t\treload.readers++;\n\t\ttry {\n\t\t\treturn await raceWithAbortSignal(reload.promise, options?.signal);\n\t\t} finally {\n\t\t\treload.readers--;\n\t\t\tif (reload.readers === 0 && readState.reload === reload) {\n\t\t\t\treadState.reload = undefined;\n\t\t\t\treload.controller.abort();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\tconst entry = (await this.readLatest(this.readState, options))[providerId];\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tcurrent[providerId] = structuredClone(entry);\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tdelete current[providerId];\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n}\n"]}
@@ -2,6 +2,7 @@ import { join } from "node:path";
2
2
  import { getAgentDir } from "../config.js";
3
3
  import { raceWithAbortSignal } from "../utils/abort.js";
4
4
  import { getFileRevision, normalizePath } from "../utils/paths.js";
5
+ import { stripBom } from "../utils/text.js";
5
6
  import { FileAuthStorageBackend } from "./auth-storage.js";
6
7
  // Optimize the common path without retaining an unbounded set of custom paths.
7
8
  let sharedModelsFileReadState;
@@ -36,7 +37,7 @@ export class FileModelsStore {
36
37
  }
37
38
  }
38
39
  parse(content) {
39
- return content ? JSON.parse(content) : {};
40
+ return content ? JSON.parse(stripBom(content)) : {};
40
41
  }
41
42
  updateReadState(readState, data, revision) {
42
43
  readState.data = data;
@@ -1 +1 @@
1
- {"version":3,"file":"models-store.js","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { ModelsStore, ModelsStoreEntry, ModelsStoreOperationOptions } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { raceWithAbortSignal } from \"../utils/abort.ts\";\nimport { getFileRevision, normalizePath } from \"../utils/paths.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"./auth-storage.ts\";\n\ntype StoredModels = Record<string, ModelsStoreEntry>;\n\ntype ModelsFileReload = {\n\tcontroller: AbortController;\n\tpromise: Promise<StoredModels>;\n\treaders: number;\n};\n\ntype ModelsFileReadState = {\n\tdata: StoredModels;\n\trevision?: string;\n\treload?: ModelsFileReload;\n};\n\n// Optimize the common path without retaining an unbounded set of custom paths.\nlet sharedModelsFileReadState: { path: string; readState: ModelsFileReadState } | undefined;\n\nexport class InMemoryCodingAgentModelsStore implements ModelsStore {\n\tprivate readonly entries = new Map<string, ModelsStoreEntry>();\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst entry = this.entries.get(providerId);\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.set(providerId, structuredClone(entry));\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.delete(providerId);\n\t}\n}\n\n/** Locked JSON-backed storage for dynamically refreshed provider catalogs. */\nexport class FileModelsStore implements ModelsStore {\n\tprivate readonly storage: AuthStorageBackend;\n\tprivate readonly path: string;\n\tprivate readonly readState: ModelsFileReadState;\n\n\tconstructor(path: string = join(getAgentDir(), \"models-store.json\")) {\n\t\tthis.path = normalizePath(path);\n\t\tthis.storage = new FileAuthStorageBackend(this.path);\n\t\tthis.readState =\n\t\t\tsharedModelsFileReadState?.path === this.path ? sharedModelsFileReadState.readState : { data: {} };\n\t\tif (!sharedModelsFileReadState) {\n\t\t\tsharedModelsFileReadState = { path: this.path, readState: this.readState };\n\t\t}\n\t}\n\n\tprivate parse(content: string | undefined): StoredModels {\n\t\treturn content ? (JSON.parse(content) as StoredModels) : {};\n\t}\n\n\tprivate updateReadState(readState: ModelsFileReadState, data: StoredModels, revision?: string): void {\n\t\treadState.data = data;\n\t\treadState.revision = revision;\n\t}\n\n\tprivate reloadFromStorage(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\treturn this.storage.withLockAsync(async (content) => {\n\t\t\tconst data = this.parse(content);\n\t\t\tthis.updateReadState(readState, data, getFileRevision(this.path));\n\t\t\treturn { result: data };\n\t\t}, options);\n\t}\n\n\tprivate async readLatest(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst revision = getFileRevision(this.path);\n\t\tif (revision !== undefined && revision === readState.revision) return readState.data;\n\t\tif (!readState.reload) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst reload: ModelsFileReload = {\n\t\t\t\tcontroller,\n\t\t\t\tpromise: this.reloadFromStorage(readState, { signal: controller.signal }),\n\t\t\t\treaders: 0,\n\t\t\t};\n\t\t\treadState.reload = reload;\n\t\t\tvoid reload.promise.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst reload = readState.reload;\n\t\treload.readers++;\n\t\ttry {\n\t\t\treturn await raceWithAbortSignal(reload.promise, options?.signal);\n\t\t} finally {\n\t\t\treload.readers--;\n\t\t\tif (reload.readers === 0 && readState.reload === reload) {\n\t\t\t\treadState.reload = undefined;\n\t\t\t\treload.controller.abort();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\tconst entry = (await this.readLatest(this.readState, options))[providerId];\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tcurrent[providerId] = structuredClone(entry);\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tdelete current[providerId];\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n}\n"]}
1
+ {"version":3,"file":"models-store.js","sourceRoot":"","sources":["../../src/core/models-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { ModelsStore, ModelsStoreEntry, ModelsStoreOperationOptions } from \"@earendil-works/pi-ai\";\nimport { getAgentDir } from \"../config.ts\";\nimport { raceWithAbortSignal } from \"../utils/abort.ts\";\nimport { getFileRevision, normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"./auth-storage.ts\";\n\ntype StoredModels = Record<string, ModelsStoreEntry>;\n\ntype ModelsFileReload = {\n\tcontroller: AbortController;\n\tpromise: Promise<StoredModels>;\n\treaders: number;\n};\n\ntype ModelsFileReadState = {\n\tdata: StoredModels;\n\trevision?: string;\n\treload?: ModelsFileReload;\n};\n\n// Optimize the common path without retaining an unbounded set of custom paths.\nlet sharedModelsFileReadState: { path: string; readState: ModelsFileReadState } | undefined;\n\nexport class InMemoryCodingAgentModelsStore implements ModelsStore {\n\tprivate readonly entries = new Map<string, ModelsStoreEntry>();\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst entry = this.entries.get(providerId);\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.set(providerId, structuredClone(entry));\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tthis.entries.delete(providerId);\n\t}\n}\n\n/** Locked JSON-backed storage for dynamically refreshed provider catalogs. */\nexport class FileModelsStore implements ModelsStore {\n\tprivate readonly storage: AuthStorageBackend;\n\tprivate readonly path: string;\n\tprivate readonly readState: ModelsFileReadState;\n\n\tconstructor(path: string = join(getAgentDir(), \"models-store.json\")) {\n\t\tthis.path = normalizePath(path);\n\t\tthis.storage = new FileAuthStorageBackend(this.path);\n\t\tthis.readState =\n\t\t\tsharedModelsFileReadState?.path === this.path ? sharedModelsFileReadState.readState : { data: {} };\n\t\tif (!sharedModelsFileReadState) {\n\t\t\tsharedModelsFileReadState = { path: this.path, readState: this.readState };\n\t\t}\n\t}\n\n\tprivate parse(content: string | undefined): StoredModels {\n\t\treturn content ? (JSON.parse(stripBom(content)) as StoredModels) : {};\n\t}\n\n\tprivate updateReadState(readState: ModelsFileReadState, data: StoredModels, revision?: string): void {\n\t\treadState.data = data;\n\t\treadState.revision = revision;\n\t}\n\n\tprivate reloadFromStorage(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\treturn this.storage.withLockAsync(async (content) => {\n\t\t\tconst data = this.parse(content);\n\t\t\tthis.updateReadState(readState, data, getFileRevision(this.path));\n\t\t\treturn { result: data };\n\t\t}, options);\n\t}\n\n\tprivate async readLatest(\n\t\treadState: ModelsFileReadState,\n\t\toptions?: ModelsStoreOperationOptions,\n\t): Promise<StoredModels> {\n\t\toptions?.signal?.throwIfAborted();\n\t\tconst revision = getFileRevision(this.path);\n\t\tif (revision !== undefined && revision === readState.revision) return readState.data;\n\t\tif (!readState.reload) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst reload: ModelsFileReload = {\n\t\t\t\tcontroller,\n\t\t\t\tpromise: this.reloadFromStorage(readState, { signal: controller.signal }),\n\t\t\t\treaders: 0,\n\t\t\t};\n\t\t\treadState.reload = reload;\n\t\t\tvoid reload.promise.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tif (readState.reload === reload) readState.reload = undefined;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tconst reload = readState.reload;\n\t\treload.readers++;\n\t\ttry {\n\t\t\treturn await raceWithAbortSignal(reload.promise, options?.signal);\n\t\t} finally {\n\t\t\treload.readers--;\n\t\t\tif (reload.readers === 0 && readState.reload === reload) {\n\t\t\t\treadState.reload = undefined;\n\t\t\t\treload.controller.abort();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync read(providerId: string, options?: ModelsStoreOperationOptions): Promise<ModelsStoreEntry | undefined> {\n\t\tconst entry = (await this.readLatest(this.readState, options))[providerId];\n\t\toptions?.signal?.throwIfAborted();\n\t\treturn entry ? structuredClone(entry) : undefined;\n\t}\n\n\tasync write(providerId: string, entry: ModelsStoreEntry, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tcurrent[providerId] = structuredClone(entry);\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n\n\tasync delete(providerId: string, options?: ModelsStoreOperationOptions): Promise<void> {\n\t\tlet latest: StoredModels | undefined;\n\t\tawait this.storage.withLockAsync(async (content) => {\n\t\t\tconst current = this.parse(content);\n\t\t\tdelete current[providerId];\n\t\t\tlatest = current;\n\t\t\treturn { result: undefined, next: JSON.stringify(current, null, 2) };\n\t\t}, options);\n\t\tif (latest) this.updateReadState(this.readState, latest);\n\t}\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { UsagePerformanceSample } from "../usage-performance-store.ts";
2
+ export type UsageAggregateDimension = "model" | "session" | "role";
3
+ export interface UsageAggregateRow {
4
+ key: string;
5
+ cost: number;
6
+ sampleCount: number;
7
+ ttftMsTotal: number;
8
+ generationMsTotal: number;
9
+ }
10
+ export interface UsageAggregateRange {
11
+ sinceMs?: number;
12
+ untilMs?: number;
13
+ }
14
+ /**
15
+ * Groups durable usage/cost samples by model, session, or role over an optional
16
+ * time range. The one query surface both `apex-code cost` (roadmap Phase 8) and
17
+ * the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never
18
+ * compute cost through independently-drifting logic.
19
+ */
20
+ export declare function aggregateUsagePerformance(samples: readonly UsagePerformanceSample[], dimension: UsageAggregateDimension, range?: UsageAggregateRange): UsageAggregateRow[];
21
+ //# sourceMappingURL=aggregate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/core/observability/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,SAAS,EAAE,uBAAuB,EAClC,KAAK,GAAE,mBAAwB,GAC7B,iBAAiB,EAAE,CAkBrB","sourcesContent":["import type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\nexport type UsageAggregateDimension = \"model\" | \"session\" | \"role\";\n\nexport interface UsageAggregateRow {\n\tkey: string;\n\tcost: number;\n\tsampleCount: number;\n\tttftMsTotal: number;\n\tgenerationMsTotal: number;\n}\n\nexport interface UsageAggregateRange {\n\tsinceMs?: number;\n\tuntilMs?: number;\n}\n\nconst UNKNOWN_SESSION_KEY = \"(unknown session)\";\nconst NO_ROLE_KEY = \"(no role)\";\n\nfunction keyFor(sample: UsagePerformanceSample, dimension: UsageAggregateDimension): string {\n\tif (dimension === \"model\") return `${sample.provider}/${sample.model}`;\n\tif (dimension === \"session\") return sample.sessionId ?? UNKNOWN_SESSION_KEY;\n\treturn sample.role ?? NO_ROLE_KEY;\n}\n\n/**\n * Groups durable usage/cost samples by model, session, or role over an optional\n * time range. The one query surface both `apex-code cost` (roadmap Phase 8) and\n * the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never\n * compute cost through independently-drifting logic.\n */\nexport function aggregateUsagePerformance(\n\tsamples: readonly UsagePerformanceSample[],\n\tdimension: UsageAggregateDimension,\n\trange: UsageAggregateRange = {},\n): UsageAggregateRow[] {\n\tconst rows = new Map<string, UsageAggregateRow>();\n\tfor (const sample of samples) {\n\t\tif (range.sinceMs !== undefined && sample.timestamp < range.sinceMs) continue;\n\t\tif (range.untilMs !== undefined && sample.timestamp > range.untilMs) continue;\n\n\t\tconst key = keyFor(sample, dimension);\n\t\tlet row = rows.get(key);\n\t\tif (!row) {\n\t\t\trow = { key, cost: 0, sampleCount: 0, ttftMsTotal: 0, generationMsTotal: 0 };\n\t\t\trows.set(key, row);\n\t\t}\n\t\trow.cost += sample.cost ?? 0;\n\t\trow.sampleCount += 1;\n\t\trow.ttftMsTotal += sample.ttftMs;\n\t\trow.generationMsTotal += sample.generationMs;\n\t}\n\treturn Array.from(rows.values()).sort((a, b) => a.key.localeCompare(b.key));\n}\n"]}
@@ -0,0 +1,36 @@
1
+ const UNKNOWN_SESSION_KEY = "(unknown session)";
2
+ const NO_ROLE_KEY = "(no role)";
3
+ function keyFor(sample, dimension) {
4
+ if (dimension === "model")
5
+ return `${sample.provider}/${sample.model}`;
6
+ if (dimension === "session")
7
+ return sample.sessionId ?? UNKNOWN_SESSION_KEY;
8
+ return sample.role ?? NO_ROLE_KEY;
9
+ }
10
+ /**
11
+ * Groups durable usage/cost samples by model, session, or role over an optional
12
+ * time range. The one query surface both `apex-code cost` (roadmap Phase 8) and
13
+ * the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never
14
+ * compute cost through independently-drifting logic.
15
+ */
16
+ export function aggregateUsagePerformance(samples, dimension, range = {}) {
17
+ const rows = new Map();
18
+ for (const sample of samples) {
19
+ if (range.sinceMs !== undefined && sample.timestamp < range.sinceMs)
20
+ continue;
21
+ if (range.untilMs !== undefined && sample.timestamp > range.untilMs)
22
+ continue;
23
+ const key = keyFor(sample, dimension);
24
+ let row = rows.get(key);
25
+ if (!row) {
26
+ row = { key, cost: 0, sampleCount: 0, ttftMsTotal: 0, generationMsTotal: 0 };
27
+ rows.set(key, row);
28
+ }
29
+ row.cost += sample.cost ?? 0;
30
+ row.sampleCount += 1;
31
+ row.ttftMsTotal += sample.ttftMs;
32
+ row.generationMsTotal += sample.generationMs;
33
+ }
34
+ return Array.from(rows.values()).sort((a, b) => a.key.localeCompare(b.key));
35
+ }
36
+ //# sourceMappingURL=aggregate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/core/observability/aggregate.ts"],"names":[],"mappings":"AAiBA,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,SAAS,MAAM,CAAC,MAA8B,EAAE,SAAkC,EAAU;IAC3F,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;IACvE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC;IAC5E,OAAO,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;AAAA,CAClC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACxC,OAA0C,EAC1C,SAAkC,EAClC,KAAK,GAAwB,EAAE,EACT;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAA6B,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO;YAAE,SAAS;QAC9E,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO;YAAE,SAAS;QAE9E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC;QACrB,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC;QACjC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,YAAY,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,CAC5E","sourcesContent":["import type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\nexport type UsageAggregateDimension = \"model\" | \"session\" | \"role\";\n\nexport interface UsageAggregateRow {\n\tkey: string;\n\tcost: number;\n\tsampleCount: number;\n\tttftMsTotal: number;\n\tgenerationMsTotal: number;\n}\n\nexport interface UsageAggregateRange {\n\tsinceMs?: number;\n\tuntilMs?: number;\n}\n\nconst UNKNOWN_SESSION_KEY = \"(unknown session)\";\nconst NO_ROLE_KEY = \"(no role)\";\n\nfunction keyFor(sample: UsagePerformanceSample, dimension: UsageAggregateDimension): string {\n\tif (dimension === \"model\") return `${sample.provider}/${sample.model}`;\n\tif (dimension === \"session\") return sample.sessionId ?? UNKNOWN_SESSION_KEY;\n\treturn sample.role ?? NO_ROLE_KEY;\n}\n\n/**\n * Groups durable usage/cost samples by model, session, or role over an optional\n * time range. The one query surface both `apex-code cost` (roadmap Phase 8) and\n * the ledger-vs-`getUsageCostBreakdown` reconciliation gate read, so the two never\n * compute cost through independently-drifting logic.\n */\nexport function aggregateUsagePerformance(\n\tsamples: readonly UsagePerformanceSample[],\n\tdimension: UsageAggregateDimension,\n\trange: UsageAggregateRange = {},\n): UsageAggregateRow[] {\n\tconst rows = new Map<string, UsageAggregateRow>();\n\tfor (const sample of samples) {\n\t\tif (range.sinceMs !== undefined && sample.timestamp < range.sinceMs) continue;\n\t\tif (range.untilMs !== undefined && sample.timestamp > range.untilMs) continue;\n\n\t\tconst key = keyFor(sample, dimension);\n\t\tlet row = rows.get(key);\n\t\tif (!row) {\n\t\t\trow = { key, cost: 0, sampleCount: 0, ttftMsTotal: 0, generationMsTotal: 0 };\n\t\t\trows.set(key, row);\n\t\t}\n\t\trow.cost += sample.cost ?? 0;\n\t\trow.sampleCount += 1;\n\t\trow.ttftMsTotal += sample.ttftMs;\n\t\trow.generationMsTotal += sample.generationMs;\n\t}\n\treturn Array.from(rows.values()).sort((a, b) => a.key.localeCompare(b.key));\n}\n"]}
@@ -0,0 +1,66 @@
1
+ import type { UsagePerformanceSample } from "../usage-performance-store.ts";
2
+ /**
3
+ * User-directed OTLP trace export (roadmap Phase 8, ADR 0012). Uses global
4
+ * `fetch` deliberately, not a direct undici import: `http-dispatcher.ts` already
5
+ * binds it to a proxy-aware, timeout-configured dispatcher, and a second HTTP
6
+ * client here would silently bypass a user's HTTP_PROXY.
7
+ *
8
+ * Scope note (recorded in the Phase 8 plan): this emits one span per model
9
+ * request attempt -- the same unit `SqliteUsagePerformanceStore` already
10
+ * records -- not a full turn/tool-call span tree. That would require touching
11
+ * `agent-session.ts`'s tool-call lifecycle, a separate, larger integration this
12
+ * phase does not open.
13
+ */
14
+ export interface OtlpExportConfig {
15
+ endpoint: string;
16
+ headers?: Record<string, string>;
17
+ }
18
+ interface OtlpAttribute {
19
+ key: string;
20
+ value: {
21
+ stringValue: string;
22
+ } | {
23
+ doubleValue: number;
24
+ };
25
+ }
26
+ export interface OtlpSpan {
27
+ traceId: string;
28
+ spanId: string;
29
+ name: string;
30
+ kind: number;
31
+ startTimeUnixNano: string;
32
+ endTimeUnixNano: string;
33
+ attributes: OtlpAttribute[];
34
+ }
35
+ export interface OtlpTracePayload {
36
+ resourceSpans: Array<{
37
+ resource: {
38
+ attributes: OtlpAttribute[];
39
+ };
40
+ scopeSpans: Array<{
41
+ scope: {
42
+ name: string;
43
+ };
44
+ spans: OtlpSpan[];
45
+ }>;
46
+ }>;
47
+ }
48
+ /**
49
+ * The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever
50
+ * emits a subset of this -- extending `UsagePerformanceSample` must not
51
+ * silently widen what is exported; this list is edited explicitly or not at
52
+ * all.
53
+ */
54
+ export declare const OTLP_ALLOWED_ATTRIBUTE_KEYS: readonly ["provider", "model", "role", "outcome", "failure_kind", "ttft_ms", "generation_ms", "input_tokens", "output_tokens", "cache_read_tokens", "cache_write_tokens", "cost", "credential_identity", "tool_name"];
55
+ /** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */
56
+ export declare function buildUsageSampleSpan(sample: UsagePerformanceSample): OtlpSpan;
57
+ export declare function buildOtlpTracePayload(spans: readonly OtlpSpan[]): OtlpTracePayload;
58
+ /**
59
+ * Exports one span for one usage sample. Never throws -- an export failure
60
+ * must never fail the turn that produced the sample, matching
61
+ * `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the
62
+ * ledger write.
63
+ */
64
+ export declare function exportUsageSampleSpan(sample: UsagePerformanceSample, config: OtlpExportConfig): Promise<void>;
65
+ export {};
66
+ //# sourceMappingURL=otlp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.d.ts","sourceRoot":"","sources":["../../../src/core/observability/otlp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,UAAU,aAAa;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,QAAQ;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,EAAE,KAAK,CAAC;QACpB,QAAQ,EAAE;YAAE,UAAU,EAAE,aAAa,EAAE,CAAA;SAAE,CAAC;QAC1C,UAAU,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC,CAAC;CACH;AAMD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,uNAe9B,CAAC;AAWX,0GAA0G;AAC1G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CA8B7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,gBAAgB,CASlF;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnH","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\n/**\n * User-directed OTLP trace export (roadmap Phase 8, ADR 0012). Uses global\n * `fetch` deliberately, not a direct undici import: `http-dispatcher.ts` already\n * binds it to a proxy-aware, timeout-configured dispatcher, and a second HTTP\n * client here would silently bypass a user's HTTP_PROXY.\n *\n * Scope note (recorded in the Phase 8 plan): this emits one span per model\n * request attempt -- the same unit `SqliteUsagePerformanceStore` already\n * records -- not a full turn/tool-call span tree. That would require touching\n * `agent-session.ts`'s tool-call lifecycle, a separate, larger integration this\n * phase does not open.\n */\n\nexport interface OtlpExportConfig {\n\tendpoint: string;\n\theaders?: Record<string, string>;\n}\n\ninterface OtlpAttribute {\n\tkey: string;\n\tvalue: { stringValue: string } | { doubleValue: number };\n}\n\nexport interface OtlpSpan {\n\ttraceId: string;\n\tspanId: string;\n\tname: string;\n\tkind: number;\n\tstartTimeUnixNano: string;\n\tendTimeUnixNano: string;\n\tattributes: OtlpAttribute[];\n}\n\nexport interface OtlpTracePayload {\n\tresourceSpans: Array<{\n\t\tresource: { attributes: OtlpAttribute[] };\n\t\tscopeSpans: Array<{ scope: { name: string }; spans: OtlpSpan[] }>;\n\t}>;\n}\n\nconst SERVICE_NAME = \"apex-code\";\n/** OTLP SpanKind: SPAN_KIND_CLIENT -- this process is the caller of the model API. */\nconst SPAN_KIND_CLIENT = 3;\n\n/**\n * The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever\n * emits a subset of this -- extending `UsagePerformanceSample` must not\n * silently widen what is exported; this list is edited explicitly or not at\n * all.\n */\nexport const OTLP_ALLOWED_ATTRIBUTE_KEYS = [\n\t\"provider\",\n\t\"model\",\n\t\"role\",\n\t\"outcome\",\n\t\"failure_kind\",\n\t\"ttft_ms\",\n\t\"generation_ms\",\n\t\"input_tokens\",\n\t\"output_tokens\",\n\t\"cache_read_tokens\",\n\t\"cache_write_tokens\",\n\t\"cost\",\n\t\"credential_identity\",\n\t\"tool_name\",\n] as const;\n\nfunction attr(key: string, value: string | number | undefined): OtlpAttribute | undefined {\n\tif (value === undefined) return undefined;\n\treturn typeof value === \"number\" ? { key, value: { doubleValue: value } } : { key, value: { stringValue: value } };\n}\n\nfunction randomHex(bytes: number): string {\n\treturn randomBytes(bytes).toString(\"hex\");\n}\n\n/** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */\nexport function buildUsageSampleSpan(sample: UsagePerformanceSample): OtlpSpan {\n\tconst attributes = [\n\t\tattr(\"provider\", sample.provider),\n\t\tattr(\"model\", sample.model),\n\t\tattr(\"role\", sample.role),\n\t\tattr(\"outcome\", sample.outcome),\n\t\tattr(\"failure_kind\", sample.failureKind),\n\t\tattr(\"ttft_ms\", sample.ttftMs),\n\t\tattr(\"generation_ms\", sample.generationMs),\n\t\tattr(\"input_tokens\", sample.usage?.input),\n\t\tattr(\"output_tokens\", sample.usage?.output),\n\t\tattr(\"cache_read_tokens\", sample.usage?.cacheRead),\n\t\tattr(\"cache_write_tokens\", sample.usage?.cacheWrite),\n\t\tattr(\"cost\", sample.cost),\n\t\tattr(\"credential_identity\", sample.credentialIdentity),\n\t].filter((candidate): candidate is OtlpAttribute => candidate !== undefined);\n\n\tconst startNanos = BigInt(sample.timestamp) * 1_000_000n;\n\tconst durationMs = Math.max(0, Math.round(sample.ttftMs + sample.generationMs));\n\tconst endNanos = startNanos + BigInt(durationMs) * 1_000_000n;\n\n\treturn {\n\t\ttraceId: randomHex(16),\n\t\tspanId: randomHex(8),\n\t\tname: \"model_request_attempt\",\n\t\tkind: SPAN_KIND_CLIENT,\n\t\tstartTimeUnixNano: startNanos.toString(),\n\t\tendTimeUnixNano: endNanos.toString(),\n\t\tattributes,\n\t};\n}\n\nexport function buildOtlpTracePayload(spans: readonly OtlpSpan[]): OtlpTracePayload {\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tresource: { attributes: [attr(\"service.name\", SERVICE_NAME)!] },\n\t\t\t\tscopeSpans: [{ scope: { name: SERVICE_NAME }, spans: [...spans] }],\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Exports one span for one usage sample. Never throws -- an export failure\n * must never fail the turn that produced the sample, matching\n * `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the\n * ledger write.\n */\nexport async function exportUsageSampleSpan(sample: UsagePerformanceSample, config: OtlpExportConfig): Promise<void> {\n\ttry {\n\t\tconst payload = buildOtlpTracePayload([buildUsageSampleSpan(sample)]);\n\t\tconst url = `${config.endpoint.replace(/\\/$/, \"\")}/v1/traces`;\n\t\tawait fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": \"application/json\", ...config.headers },\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t} catch {\n\t\t// Never let an export failure surface to the caller.\n\t}\n}\n"]}
@@ -0,0 +1,95 @@
1
+ import { randomBytes } from "node:crypto";
2
+ const SERVICE_NAME = "apex-code";
3
+ /** OTLP SpanKind: SPAN_KIND_CLIENT -- this process is the caller of the model API. */
4
+ const SPAN_KIND_CLIENT = 3;
5
+ /**
6
+ * The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever
7
+ * emits a subset of this -- extending `UsagePerformanceSample` must not
8
+ * silently widen what is exported; this list is edited explicitly or not at
9
+ * all.
10
+ */
11
+ export const OTLP_ALLOWED_ATTRIBUTE_KEYS = [
12
+ "provider",
13
+ "model",
14
+ "role",
15
+ "outcome",
16
+ "failure_kind",
17
+ "ttft_ms",
18
+ "generation_ms",
19
+ "input_tokens",
20
+ "output_tokens",
21
+ "cache_read_tokens",
22
+ "cache_write_tokens",
23
+ "cost",
24
+ "credential_identity",
25
+ "tool_name",
26
+ ];
27
+ function attr(key, value) {
28
+ if (value === undefined)
29
+ return undefined;
30
+ return typeof value === "number" ? { key, value: { doubleValue: value } } : { key, value: { stringValue: value } };
31
+ }
32
+ function randomHex(bytes) {
33
+ return randomBytes(bytes).toString("hex");
34
+ }
35
+ /** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */
36
+ export function buildUsageSampleSpan(sample) {
37
+ const attributes = [
38
+ attr("provider", sample.provider),
39
+ attr("model", sample.model),
40
+ attr("role", sample.role),
41
+ attr("outcome", sample.outcome),
42
+ attr("failure_kind", sample.failureKind),
43
+ attr("ttft_ms", sample.ttftMs),
44
+ attr("generation_ms", sample.generationMs),
45
+ attr("input_tokens", sample.usage?.input),
46
+ attr("output_tokens", sample.usage?.output),
47
+ attr("cache_read_tokens", sample.usage?.cacheRead),
48
+ attr("cache_write_tokens", sample.usage?.cacheWrite),
49
+ attr("cost", sample.cost),
50
+ attr("credential_identity", sample.credentialIdentity),
51
+ ].filter((candidate) => candidate !== undefined);
52
+ const startNanos = BigInt(sample.timestamp) * 1000000n;
53
+ const durationMs = Math.max(0, Math.round(sample.ttftMs + sample.generationMs));
54
+ const endNanos = startNanos + BigInt(durationMs) * 1000000n;
55
+ return {
56
+ traceId: randomHex(16),
57
+ spanId: randomHex(8),
58
+ name: "model_request_attempt",
59
+ kind: SPAN_KIND_CLIENT,
60
+ startTimeUnixNano: startNanos.toString(),
61
+ endTimeUnixNano: endNanos.toString(),
62
+ attributes,
63
+ };
64
+ }
65
+ export function buildOtlpTracePayload(spans) {
66
+ return {
67
+ resourceSpans: [
68
+ {
69
+ resource: { attributes: [attr("service.name", SERVICE_NAME)] },
70
+ scopeSpans: [{ scope: { name: SERVICE_NAME }, spans: [...spans] }],
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ /**
76
+ * Exports one span for one usage sample. Never throws -- an export failure
77
+ * must never fail the turn that produced the sample, matching
78
+ * `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the
79
+ * ledger write.
80
+ */
81
+ export async function exportUsageSampleSpan(sample, config) {
82
+ try {
83
+ const payload = buildOtlpTracePayload([buildUsageSampleSpan(sample)]);
84
+ const url = `${config.endpoint.replace(/\/$/, "")}/v1/traces`;
85
+ await fetch(url, {
86
+ method: "POST",
87
+ headers: { "content-type": "application/json", ...config.headers },
88
+ body: JSON.stringify(payload),
89
+ });
90
+ }
91
+ catch {
92
+ // Never let an export failure surface to the caller.
93
+ }
94
+ }
95
+ //# sourceMappingURL=otlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../../src/core/observability/otlp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { UsagePerformanceSample } from \"../usage-performance-store.ts\";\n\n/**\n * User-directed OTLP trace export (roadmap Phase 8, ADR 0012). Uses global\n * `fetch` deliberately, not a direct undici import: `http-dispatcher.ts` already\n * binds it to a proxy-aware, timeout-configured dispatcher, and a second HTTP\n * client here would silently bypass a user's HTTP_PROXY.\n *\n * Scope note (recorded in the Phase 8 plan): this emits one span per model\n * request attempt -- the same unit `SqliteUsagePerformanceStore` already\n * records -- not a full turn/tool-call span tree. That would require touching\n * `agent-session.ts`'s tool-call lifecycle, a separate, larger integration this\n * phase does not open.\n */\n\nexport interface OtlpExportConfig {\n\tendpoint: string;\n\theaders?: Record<string, string>;\n}\n\ninterface OtlpAttribute {\n\tkey: string;\n\tvalue: { stringValue: string } | { doubleValue: number };\n}\n\nexport interface OtlpSpan {\n\ttraceId: string;\n\tspanId: string;\n\tname: string;\n\tkind: number;\n\tstartTimeUnixNano: string;\n\tendTimeUnixNano: string;\n\tattributes: OtlpAttribute[];\n}\n\nexport interface OtlpTracePayload {\n\tresourceSpans: Array<{\n\t\tresource: { attributes: OtlpAttribute[] };\n\t\tscopeSpans: Array<{ scope: { name: string }; spans: OtlpSpan[] }>;\n\t}>;\n}\n\nconst SERVICE_NAME = \"apex-code\";\n/** OTLP SpanKind: SPAN_KIND_CLIENT -- this process is the caller of the model API. */\nconst SPAN_KIND_CLIENT = 3;\n\n/**\n * The complete allowlist ADR 0012 permits. `buildUsageSampleSpan` only ever\n * emits a subset of this -- extending `UsagePerformanceSample` must not\n * silently widen what is exported; this list is edited explicitly or not at\n * all.\n */\nexport const OTLP_ALLOWED_ATTRIBUTE_KEYS = [\n\t\"provider\",\n\t\"model\",\n\t\"role\",\n\t\"outcome\",\n\t\"failure_kind\",\n\t\"ttft_ms\",\n\t\"generation_ms\",\n\t\"input_tokens\",\n\t\"output_tokens\",\n\t\"cache_read_tokens\",\n\t\"cache_write_tokens\",\n\t\"cost\",\n\t\"credential_identity\",\n\t\"tool_name\",\n] as const;\n\nfunction attr(key: string, value: string | number | undefined): OtlpAttribute | undefined {\n\tif (value === undefined) return undefined;\n\treturn typeof value === \"number\" ? { key, value: { doubleValue: value } } : { key, value: { stringValue: value } };\n}\n\nfunction randomHex(bytes: number): string {\n\treturn randomBytes(bytes).toString(\"hex\");\n}\n\n/** Builds one span for one model request attempt. Attributes are an allowlist, never a redaction pass. */\nexport function buildUsageSampleSpan(sample: UsagePerformanceSample): OtlpSpan {\n\tconst attributes = [\n\t\tattr(\"provider\", sample.provider),\n\t\tattr(\"model\", sample.model),\n\t\tattr(\"role\", sample.role),\n\t\tattr(\"outcome\", sample.outcome),\n\t\tattr(\"failure_kind\", sample.failureKind),\n\t\tattr(\"ttft_ms\", sample.ttftMs),\n\t\tattr(\"generation_ms\", sample.generationMs),\n\t\tattr(\"input_tokens\", sample.usage?.input),\n\t\tattr(\"output_tokens\", sample.usage?.output),\n\t\tattr(\"cache_read_tokens\", sample.usage?.cacheRead),\n\t\tattr(\"cache_write_tokens\", sample.usage?.cacheWrite),\n\t\tattr(\"cost\", sample.cost),\n\t\tattr(\"credential_identity\", sample.credentialIdentity),\n\t].filter((candidate): candidate is OtlpAttribute => candidate !== undefined);\n\n\tconst startNanos = BigInt(sample.timestamp) * 1_000_000n;\n\tconst durationMs = Math.max(0, Math.round(sample.ttftMs + sample.generationMs));\n\tconst endNanos = startNanos + BigInt(durationMs) * 1_000_000n;\n\n\treturn {\n\t\ttraceId: randomHex(16),\n\t\tspanId: randomHex(8),\n\t\tname: \"model_request_attempt\",\n\t\tkind: SPAN_KIND_CLIENT,\n\t\tstartTimeUnixNano: startNanos.toString(),\n\t\tendTimeUnixNano: endNanos.toString(),\n\t\tattributes,\n\t};\n}\n\nexport function buildOtlpTracePayload(spans: readonly OtlpSpan[]): OtlpTracePayload {\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tresource: { attributes: [attr(\"service.name\", SERVICE_NAME)!] },\n\t\t\t\tscopeSpans: [{ scope: { name: SERVICE_NAME }, spans: [...spans] }],\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Exports one span for one usage sample. Never throws -- an export failure\n * must never fail the turn that produced the sample, matching\n * `instrumentAttempt`'s own fire-and-forget `.catch(() => {})` around the\n * ledger write.\n */\nexport async function exportUsageSampleSpan(sample: UsagePerformanceSample, config: OtlpExportConfig): Promise<void> {\n\ttry {\n\t\tconst payload = buildOtlpTracePayload([buildUsageSampleSpan(sample)]);\n\t\tconst url = `${config.endpoint.replace(/\\/$/, \"\")}/v1/traces`;\n\t\tawait fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"content-type\": \"application/json\", ...config.headers },\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t} catch {\n\t\t// Never let an export failure surface to the caller.\n\t}\n}\n"]}