@gajae-code/coding-agent 0.11.11 → 0.12.1

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 (344) hide show
  1. package/CHANGELOG.md +131 -4
  2. package/dist/types/async/job-manager.d.ts +17 -3
  3. package/dist/types/cli/read-cli.d.ts +1 -0
  4. package/dist/types/commands/deep-interview.d.ts +9 -0
  5. package/dist/types/commands/harness.d.ts +22 -0
  6. package/dist/types/commands/read.d.ts +6 -0
  7. package/dist/types/config/model-registry.d.ts +4 -0
  8. package/dist/types/config/provider-auth-health.d.ts +14 -0
  9. package/dist/types/config/provider-ranking.d.ts +59 -0
  10. package/dist/types/config/settings-schema.d.ts +83 -1
  11. package/dist/types/config/settings.d.ts +2 -0
  12. package/dist/types/exa/mcp-client.d.ts +10 -1
  13. package/dist/types/exec/bash-executor.d.ts +45 -12
  14. package/dist/types/extensibility/extensions/types.d.ts +38 -4
  15. package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
  16. package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
  17. package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
  18. package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
  19. package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
  20. package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
  21. package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
  22. package/dist/types/extensibility/shared-events.d.ts +6 -0
  23. package/dist/types/gjc-runtime/deep-interview-ambiguity.d.ts +5 -12
  24. package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +17 -32
  25. package/dist/types/gjc-runtime/deep-interview-stage.d.ts +37 -0
  26. package/dist/types/gjc-runtime/deep-interview-state.d.ts +4 -135
  27. package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
  28. package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
  29. package/dist/types/gjc-runtime/memory-guard-owner-claims.d.ts +47 -0
  30. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +70 -1
  31. package/dist/types/gjc-runtime/state-writer.d.ts +5 -46
  32. package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
  33. package/dist/types/gjc-runtime/team-runtime.d.ts +27 -1
  34. package/dist/types/gjc-runtime/team-store.d.ts +12 -0
  35. package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
  36. package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +92 -0
  37. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +17 -0
  38. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +8 -0
  39. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
  40. package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -5
  41. package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
  42. package/dist/types/main.d.ts +1 -1
  43. package/dist/types/memories/index.d.ts +2 -0
  44. package/dist/types/modes/acp/acp-agent.d.ts +10 -19
  45. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  46. package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
  47. package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
  48. package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
  49. package/dist/types/modes/components/read-tool-group.d.ts +4 -4
  50. package/dist/types/modes/components/session-observer-overlay.d.ts +22 -0
  51. package/dist/types/modes/components/settings-selector.d.ts +11 -0
  52. package/dist/types/modes/components/status-line/gh.d.ts +5 -0
  53. package/dist/types/modes/components/tool-execution.d.ts +8 -0
  54. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
  55. package/dist/types/modes/controllers/event-controller.d.ts +3 -0
  56. package/dist/types/modes/interactive-mode.d.ts +2 -0
  57. package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
  58. package/dist/types/modes/types.d.ts +2 -0
  59. package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
  60. package/dist/types/reminders/star-reminder.d.ts +3 -13
  61. package/dist/types/runtime-mcp/manager.d.ts +1 -0
  62. package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
  63. package/dist/types/sdk/acp/adapter.d.ts +3 -1
  64. package/dist/types/sdk/broker/lifecycle.d.ts +5 -0
  65. package/dist/types/sdk/broker/transport.d.ts +2 -0
  66. package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
  67. package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
  68. package/dist/types/sdk/bus/config.d.ts +6 -2
  69. package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
  70. package/dist/types/sdk/bus/index.d.ts +44 -1
  71. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +44 -0
  72. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  73. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +2 -1
  74. package/dist/types/sdk/bus/reconciliation-store.d.ts +69 -0
  75. package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
  76. package/dist/types/sdk/bus/rich-render.d.ts +2 -0
  77. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
  78. package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
  79. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
  80. package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
  81. package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
  82. package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
  83. package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
  84. package/dist/types/sdk/host/control/operations.d.ts +1 -1
  85. package/dist/types/sdk/host/host.d.ts +2 -0
  86. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  87. package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
  88. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  89. package/dist/types/sdk/prompt-status.d.ts +23 -3
  90. package/dist/types/sdk/session.d.ts +6 -0
  91. package/dist/types/session/agent-session.d.ts +82 -12
  92. package/dist/types/session/artifacts.d.ts +8 -0
  93. package/dist/types/session/blob-store.d.ts +57 -4
  94. package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
  95. package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
  96. package/dist/types/session/session-manager.d.ts +48 -19
  97. package/dist/types/session/session-storage.d.ts +4 -0
  98. package/dist/types/session/streaming-output.d.ts +96 -12
  99. package/dist/types/setup/credential-import.d.ts +12 -0
  100. package/dist/types/skill-state/active-state.d.ts +12 -4
  101. package/dist/types/skill-state/workflow-hud.d.ts +9 -0
  102. package/dist/types/task/executor.d.ts +3 -2
  103. package/dist/types/task/index.d.ts +3 -1
  104. package/dist/types/task/provider-retry-status.d.ts +8 -0
  105. package/dist/types/task/receipt.d.ts +7 -1
  106. package/dist/types/task/types.d.ts +23 -0
  107. package/dist/types/tools/ask-answer-registry.d.ts +2 -2
  108. package/dist/types/tools/bash-interactive.d.ts +4 -1
  109. package/dist/types/tools/bash.d.ts +3 -1
  110. package/dist/types/tools/browser/launch.d.ts +7 -0
  111. package/dist/types/tools/fetch.d.ts +17 -1
  112. package/dist/types/tools/image-gen.d.ts +4 -0
  113. package/dist/types/tools/index.d.ts +4 -0
  114. package/dist/types/tools/output-meta.d.ts +44 -3
  115. package/dist/types/tools/path-utils.d.ts +1 -0
  116. package/dist/types/tools/read-internals.d.ts +12 -0
  117. package/dist/types/tools/read.d.ts +45 -7
  118. package/dist/types/tools/resource-gc.d.ts +4 -0
  119. package/dist/types/tools/review.d.ts +5 -7
  120. package/dist/types/tools/subagent.d.ts +2 -0
  121. package/dist/types/tools/tool-result.d.ts +7 -1
  122. package/dist/types/utils/gh.d.ts +13 -0
  123. package/dist/types/utils/image-resize.d.ts +1 -0
  124. package/dist/types/web/search/providers/kimi.d.ts +2 -0
  125. package/dist/types/web/search/providers/searxng.d.ts +7 -0
  126. package/dist/types/web/search/providers/xai.d.ts +2 -0
  127. package/package.json +11 -13
  128. package/scripts/acp-conformance-agent.ts +218 -0
  129. package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
  130. package/scripts/capture-gjc-bundle-settings.ts +306 -0
  131. package/scripts/capture-sticky-viewport-showcase.ts +292 -0
  132. package/scripts/generate-sdk-operation-inventory.ts +5 -0
  133. package/scripts/resident-memory-bench.ts +1341 -0
  134. package/scripts/run-acp-conformance.ts +285 -0
  135. package/scripts/verify-gjc-sdk-canonicalization.ts +122 -18
  136. package/scripts/verify-sticky-viewport-showcase.ts +611 -0
  137. package/src/async/job-manager.ts +78 -20
  138. package/src/capability/index.ts +8 -0
  139. package/src/cli/fast-help.ts +1 -1
  140. package/src/cli/plugin-cli.ts +176 -18
  141. package/src/cli/read-cli.ts +2 -1
  142. package/src/cli.ts +1 -0
  143. package/src/commands/deep-interview.ts +29 -9
  144. package/src/commands/harness.ts +35 -12
  145. package/src/commands/read.ts +11 -2
  146. package/src/commands/team.ts +20 -2
  147. package/src/config/file-lock.ts +11 -2
  148. package/src/config/model-registry.ts +21 -2
  149. package/src/config/provider-auth-health.ts +42 -0
  150. package/src/config/provider-ranking.ts +119 -0
  151. package/src/config/settings-schema.ts +74 -1
  152. package/src/config/settings.ts +246 -108
  153. package/src/coordinator-mcp/question-gate-codec.ts +1 -1
  154. package/src/coordinator-mcp/server.ts +5 -12
  155. package/src/defaults/gjc/skills/deep-interview/SKILL.md +230 -82
  156. package/src/defaults/gjc/skills/ralplan/SKILL.md +77 -41
  157. package/src/defaults/gjc/skills/team/SKILL.md +3 -1
  158. package/src/defaults/gjc/skills/ultragoal/SKILL.md +62 -39
  159. package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
  160. package/src/defaults/gjc-defaults.ts +4 -4
  161. package/src/eval/py/executor.ts +7 -2
  162. package/src/exa/mcp-client.ts +12 -3
  163. package/src/exec/bash-executor.ts +144 -27
  164. package/src/extensibility/extensions/runner.ts +15 -0
  165. package/src/extensibility/extensions/types.ts +46 -5
  166. package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
  167. package/src/extensibility/gjc-plugins/index.ts +19 -2
  168. package/src/extensibility/gjc-plugins/installer.ts +189 -50
  169. package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
  170. package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
  171. package/src/extensibility/gjc-plugins/observability.ts +3 -3
  172. package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
  173. package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
  174. package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
  175. package/src/extensibility/gjc-plugins/schema.ts +84 -12
  176. package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
  177. package/src/extensibility/gjc-plugins/types.ts +141 -0
  178. package/src/extensibility/gjc-plugins/validation.ts +9 -0
  179. package/src/extensibility/shared-events.ts +5 -0
  180. package/src/gjc-runtime/deep-interview-ambiguity.ts +47 -82
  181. package/src/gjc-runtime/deep-interview-recorder.ts +227 -310
  182. package/src/gjc-runtime/deep-interview-runtime.ts +109 -270
  183. package/src/gjc-runtime/deep-interview-stage.ts +1016 -0
  184. package/src/gjc-runtime/deep-interview-state.ts +12 -943
  185. package/src/gjc-runtime/gc-render.ts +1 -0
  186. package/src/gjc-runtime/gc-runtime.ts +11 -1
  187. package/src/gjc-runtime/launch-tmux.ts +25 -6
  188. package/src/gjc-runtime/managed-owner-admission.ts +1 -1
  189. package/src/gjc-runtime/memory-guard-owner-claims.ts +389 -0
  190. package/src/gjc-runtime/ralplan-runtime.ts +1149 -98
  191. package/src/gjc-runtime/state-runtime.ts +2 -1
  192. package/src/gjc-runtime/state-writer.ts +70 -222
  193. package/src/gjc-runtime/team-launch.ts +42 -5
  194. package/src/gjc-runtime/team-runtime.ts +1085 -40
  195. package/src/gjc-runtime/team-store.ts +32 -0
  196. package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
  197. package/src/gjc-runtime/team-worker-memory-guard.ts +363 -0
  198. package/src/gjc-runtime/team-workers.ts +1 -0
  199. package/src/gjc-runtime/tmux-owner-isolation.ts +28 -0
  200. package/src/gjc-runtime/tmux-sessions.ts +58 -13
  201. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +20 -0
  202. package/src/gjc-runtime/ultragoal-runtime.ts +414 -618
  203. package/src/gjc-runtime/workflow-manifest.generated.json +105 -449
  204. package/src/gjc-runtime/workflow-manifest.ts +38 -247
  205. package/src/hooks/native-skill-hook.ts +17 -4
  206. package/src/hooks/skill-state.ts +1 -23
  207. package/src/internal-urls/docs-index.generated.ts +21 -22
  208. package/src/internal-urls/local-root-gc.ts +127 -0
  209. package/src/main.ts +9 -5
  210. package/src/memories/index.ts +10 -0
  211. package/src/modes/DESIGN.md +98 -0
  212. package/src/modes/acp/acp-agent.ts +339 -191
  213. package/src/modes/acp/acp-event-mapper.ts +14 -7
  214. package/src/modes/acp/acp-mode.ts +39 -3
  215. package/src/modes/components/assistant-message.ts +123 -22
  216. package/src/modes/components/gjc-bundle-settings.ts +508 -0
  217. package/src/modes/components/irc-sidebar.ts +176 -62
  218. package/src/modes/components/model-selector.ts +61 -4
  219. package/src/modes/components/notifications-settings-editor.ts +12 -1
  220. package/src/modes/components/oauth-selector.ts +96 -28
  221. package/src/modes/components/read-tool-group.ts +82 -14
  222. package/src/modes/components/session-observer-overlay.ts +457 -83
  223. package/src/modes/components/settings-selector.ts +116 -23
  224. package/src/modes/components/status-line/gh.ts +16 -0
  225. package/src/modes/components/tool-execution.ts +138 -27
  226. package/src/modes/components/tool-status-header.ts +3 -14
  227. package/src/modes/components/transcript-viewer-overlay.ts +99 -24
  228. package/src/modes/controllers/command-controller.ts +4 -0
  229. package/src/modes/controllers/event-controller.ts +109 -27
  230. package/src/modes/controllers/extension-ui-controller.ts +26 -2
  231. package/src/modes/controllers/input-controller.ts +18 -3
  232. package/src/modes/controllers/selector-controller.ts +127 -36
  233. package/src/modes/interactive-mode.ts +62 -3
  234. package/src/modes/irc-observation-ledger.ts +71 -15
  235. package/src/modes/runtime-init.ts +22 -2
  236. package/src/modes/types.ts +2 -0
  237. package/src/modes/utils/ui-helpers.ts +94 -1
  238. package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
  239. package/src/prompts/agents/architect.md +9 -1
  240. package/src/prompts/agents/critic.md +9 -0
  241. package/src/prompts/system/eager-todo.md +8 -4
  242. package/src/prompts/system/system-prompt.md +11 -5
  243. package/src/prompts/tools/bash.md +5 -5
  244. package/src/prompts/tools/read.md +4 -2
  245. package/src/prompts/tools/search-tool-bm25.md +5 -0
  246. package/src/prompts/tools/task.md +1 -1
  247. package/src/reminders/star-reminder.ts +4 -42
  248. package/src/runtime-mcp/manager.ts +19 -4
  249. package/src/runtime-mcp/smithery-auth.ts +17 -2
  250. package/src/runtime-mcp/smithery-connect.ts +11 -1
  251. package/src/sdk/acp/adapter.ts +22 -6
  252. package/src/sdk/broker/lifecycle.ts +25 -6
  253. package/src/sdk/broker/transport.ts +35 -3
  254. package/src/sdk/bus/attachment-registry.ts +5 -1
  255. package/src/sdk/bus/chat-daemon-cli.ts +4 -39
  256. package/src/sdk/bus/chat-daemon-control.ts +6 -3
  257. package/src/sdk/bus/config.ts +18 -2
  258. package/src/sdk/bus/control-drain-lease.ts +104 -0
  259. package/src/sdk/bus/index.ts +984 -146
  260. package/src/sdk/bus/kind-aware-reconciliation.ts +317 -0
  261. package/src/sdk/bus/lifecycle-commands.ts +4 -1
  262. package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
  263. package/src/sdk/bus/prompt-reconciliation.ts +2 -1
  264. package/src/sdk/bus/reconciliation-store.ts +303 -0
  265. package/src/sdk/bus/rich-draft.ts +1 -1
  266. package/src/sdk/bus/rich-render.ts +2 -2
  267. package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
  268. package/src/sdk/bus/telegram-cli.ts +33 -8
  269. package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
  270. package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
  271. package/src/sdk/bus/telegram-daemon.ts +916 -23
  272. package/src/sdk/bus/telegram-reference.ts +40 -3
  273. package/src/sdk/bus/threaded-render.ts +48 -3
  274. package/src/sdk/bus/topic-registry.ts +20 -0
  275. package/src/sdk/host/control/dispatch.ts +5 -1
  276. package/src/sdk/host/control/operations.ts +1 -1
  277. package/src/sdk/host/host.ts +23 -1
  278. package/src/sdk/host/query/handlers.ts +55 -0
  279. package/src/sdk/host/query/revision-store.ts +36 -2
  280. package/src/sdk/host/reverse-leases.ts +44 -7
  281. package/src/sdk/mcp/server.ts +46 -18
  282. package/src/sdk/prompt-status.ts +16 -3
  283. package/src/sdk/protocol/operation-inventory.generated.json +51 -0
  284. package/src/sdk/protocol/operation-registry.ts +7 -2
  285. package/src/sdk/session.ts +101 -10
  286. package/src/session/agent-session.ts +1286 -220
  287. package/src/session/artifacts.ts +22 -0
  288. package/src/session/auth-broker-config.ts +10 -3
  289. package/src/session/blob-store.ts +915 -24
  290. package/src/session/internal/managed-session-scope.ts +44 -6
  291. package/src/session/internal/managed-session-storage.ts +48 -6
  292. package/src/session/memory-guard-checkpoint-participant.ts +131 -0
  293. package/src/session/session-manager.ts +2364 -438
  294. package/src/session/session-storage.ts +9 -1
  295. package/src/session/streaming-output.ts +500 -111
  296. package/src/setup/credential-import.ts +75 -13
  297. package/src/setup/provider-onboarding.ts +19 -4
  298. package/src/skill-state/active-state.ts +32 -10
  299. package/src/skill-state/workflow-hud.ts +42 -2
  300. package/src/skill-state/workflow-mutation-guard.ts +560 -8
  301. package/src/task/executor.ts +122 -39
  302. package/src/task/index.ts +23 -14
  303. package/src/task/provider-retry-status.ts +16 -0
  304. package/src/task/receipt.ts +23 -7
  305. package/src/task/render.ts +6 -2
  306. package/src/task/types.ts +108 -0
  307. package/src/tools/ask-answer-registry.ts +12 -6
  308. package/src/tools/ask.ts +169 -118
  309. package/src/tools/ast-edit.ts +1 -0
  310. package/src/tools/ast-grep.ts +1 -0
  311. package/src/tools/bash-interactive.ts +8 -3
  312. package/src/tools/bash.ts +503 -60
  313. package/src/tools/browser/launch.ts +41 -6
  314. package/src/tools/fetch.ts +114 -23
  315. package/src/tools/find.ts +1 -0
  316. package/src/tools/image-gen.ts +29 -5
  317. package/src/tools/index.ts +4 -0
  318. package/src/tools/output-meta.ts +281 -20
  319. package/src/tools/path-utils.ts +8 -3
  320. package/src/tools/read-internals.ts +44 -0
  321. package/src/tools/read.ts +1560 -310
  322. package/src/tools/resource-gc.ts +182 -18
  323. package/src/tools/review.ts +5 -7
  324. package/src/tools/search.ts +1 -0
  325. package/src/tools/subagent-render.ts +6 -2
  326. package/src/tools/subagent.ts +6 -0
  327. package/src/tools/telegram-send.ts +6 -3
  328. package/src/tools/tool-result.ts +14 -1
  329. package/src/utils/gh.ts +39 -0
  330. package/src/utils/image-resize.ts +3 -0
  331. package/src/web/search/providers/anthropic.ts +4 -4
  332. package/src/web/search/providers/codex.ts +1 -1
  333. package/src/web/search/providers/kimi.ts +15 -5
  334. package/src/web/search/providers/searxng.ts +47 -4
  335. package/src/web/search/providers/xai.ts +7 -2
  336. package/dist/types/gjc-runtime/deep-interview-draft.d.ts +0 -8
  337. package/dist/types/gjc-runtime/deep-interview-payload.d.ts +0 -41
  338. package/dist/types/gjc-runtime/deep-interview-repair.d.ts +0 -17
  339. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
  340. package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
  341. package/src/gjc-runtime/deep-interview-draft.ts +0 -843
  342. package/src/gjc-runtime/deep-interview-payload.ts +0 -262
  343. package/src/gjc-runtime/deep-interview-repair.ts +0 -1674
  344. package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Show what the read tool will return for a given path.
3
3
  */
4
- import { Args, Command } from "@gajae-code/utils/cli";
4
+ import { Args, Command, Flags } from "@gajae-code/utils/cli";
5
5
  import { type ReadCommandArgs, runReadCommand } from "../cli/read-cli";
6
6
  import { initTheme } from "../modes/theme/theme";
7
7
 
@@ -15,8 +15,16 @@ export default class Read extends Command {
15
15
  }),
16
16
  };
17
17
 
18
+ static flags = {
19
+ truncation: Flags.string({
20
+ options: ["head", "last", "both"],
21
+ description: "Which end of an over-budget result to keep",
22
+ }),
23
+ };
24
+
18
25
  static examples = [
19
26
  "gjc read src/foo.ts",
27
+ "gjc read src/foo.ts --truncation head",
20
28
  "gjc read src/foo.ts:50-100",
21
29
  "gjc read src/foo.ts:raw",
22
30
  "gjc read https://example.com",
@@ -25,9 +33,10 @@ export default class Read extends Command {
25
33
  ];
26
34
 
27
35
  async run(): Promise<void> {
28
- const { args } = await this.parse(Read);
36
+ const { args, flags } = await this.parse(Read);
29
37
  const cmd: ReadCommandArgs = {
30
38
  path: args.path ?? "",
39
+ truncation: flags.truncation as ReadCommandArgs["truncation"],
31
40
  };
32
41
  await initTheme();
33
42
  await runReadCommand(cmd);
@@ -13,6 +13,7 @@ import {
13
13
  readGjcTeamSnapshot,
14
14
  shutdownGjcTeam,
15
15
  startGjcTeam,
16
+ UnknownGjcTeamApiOperationError,
16
17
  } from "../gjc-runtime/team-runtime";
17
18
  import { syncSkillActiveState } from "../skill-state/active-state";
18
19
 
@@ -173,7 +174,7 @@ export default class Team extends Command {
173
174
  "Supported operations:",
174
175
  "send-message broadcast mailbox-list mailbox-mark-delivered mailbox-mark-notified notification-list notification-read notification-replay notification-mark-pane-attempt worker-startup-ack",
175
176
  "create-task read-task list-tasks update-task claim-task transition-task-status release-task-claim",
176
- "read-config read-manifest read-worker-status update-worker-status read-worker-heartbeat recover-stale-claims update-worker-heartbeat write-worker-inbox write-worker-identity",
177
+ "read-config read-manifest read-worker-status update-worker-status read-worker-heartbeat recover-stale-claims update-worker-heartbeat read-worker-memory-guard update-worker-memory-guard apply-worker-memory-guard write-worker-inbox write-worker-identity",
177
178
  "append-event read-events read-traces await-event write-shutdown-request read-shutdown-ack read-monitor-snapshot write-monitor-snapshot read-task-approval write-task-approval",
178
179
  "Completion example:",
179
180
  'transition-task-status --input \'{"team_name":"demo","task_id":"task-1","to":"completed","claim_token":"...","completion_evidence":{"summary":"done","items":[{"kind":"command","status":"passed","summary":"focused tests passed","command":"bun test packages/coding-agent/test/gjc-runtime/team-runtime.test.ts"}]}}\' --json',
@@ -183,7 +184,24 @@ export default class Team extends Command {
183
184
  return;
184
185
  }
185
186
  const input = parseInputFlag(rest);
186
- const result = await executeGjcTeamApiOperation(operation, input);
187
+ let result: unknown;
188
+ try {
189
+ result = await executeGjcTeamApiOperation(operation, input);
190
+ } catch (error) {
191
+ if (!(error instanceof UnknownGjcTeamApiOperationError)) throw error;
192
+ process.exitCode = 1;
193
+ if (json) {
194
+ writeReceipt({
195
+ ok: false,
196
+ error: error.code,
197
+ operation: error.operation,
198
+ suggestions: error.suggestions,
199
+ });
200
+ } else {
201
+ process.stderr.write(`${error.message}\n`);
202
+ }
203
+ return;
204
+ }
187
205
  const teamName = String(input.team_name ?? input.teamName ?? "").trim();
188
206
  if (teamName) {
189
207
  try {
@@ -1,7 +1,7 @@
1
1
  import type { Stats } from "node:fs";
2
2
  import * as fs from "node:fs/promises";
3
3
  import * as path from "node:path";
4
- import { isEnoent } from "@gajae-code/utils/fs-error";
4
+ import { hasFsCode, isEnoent } from "@gajae-code/utils/fs-error";
5
5
 
6
6
  export interface FileLockOptions {
7
7
  staleMs?: number;
@@ -185,7 +185,16 @@ async function staleLockSnapshot(
185
185
  staleMs: number,
186
186
  startTimeCache?: Map<string, string | null>,
187
187
  ): Promise<LockStaleSnapshot> {
188
- const info = await readLockInfo(lockPath);
188
+ let info: LockInfo | null;
189
+ try {
190
+ info = await readLockInfo(lockPath);
191
+ } catch (error) {
192
+ // Windows can transiently deny reads of a just-created lock metadata file
193
+ // while another contender is publishing it. Treat that as active
194
+ // contention and retry rather than failing the caller or reaping by path.
195
+ if (hasFsCode(error, "EPERM")) return { stale: false };
196
+ throw error;
197
+ }
189
198
  if (!info) {
190
199
  try {
191
200
  const stats = await fs.stat(lockPath);
@@ -34,7 +34,7 @@ const DEFAULT_LOCAL_TOKEN = "lm-studio-local";
34
34
 
35
35
  import { registerOAuthProvider, unregisterOAuthProviders } from "@gajae-code/ai/utils/oauth";
36
36
  import type { OAuthCredentials, OAuthLoginCallbacks } from "@gajae-code/ai/utils/oauth/types";
37
- import { $pickenv, isRecord, logger } from "@gajae-code/utils";
37
+ import { $pickCredentialEnv, isRecord, logger } from "@gajae-code/utils";
38
38
  import { parseModelString, resolveProviderModelReference } from "../config/model-resolver";
39
39
  import { isValidThemeColor, type ThemeColor } from "../modes/theme/theme";
40
40
  import type { AuthStorage, OAuthCredential } from "../session/auth-storage";
@@ -450,8 +450,20 @@ function getProviderBaseUrlEnvKeys(provider: string): string[] {
450
450
  return keys;
451
451
  }
452
452
 
453
+ /**
454
+ * Provider base URL from the environment, trusted sources only.
455
+ *
456
+ * The result is baked into the provider override and reaches `model.baseUrl`,
457
+ * which the provider resolvers use as the request endpoint that carries the
458
+ * provider credential. `$env` (and therefore `$pickenv`) merges the caller's
459
+ * `cwd/.env`, so reading it there would let repository content redirect
460
+ * authenticated traffic for any provider — including re-admitting a redirect
461
+ * that the provider-level resolvers already reject. Resolve it the same way
462
+ * provider credentials are: launching shell plus GJC/user-owned `.env` files,
463
+ * never the project `.env`.
464
+ */
453
465
  function resolveProviderBaseUrlFromEnv(provider: string): string | undefined {
454
- return $pickenv(...getProviderBaseUrlEnvKeys(provider));
466
+ return $pickCredentialEnv(...getProviderBaseUrlEnvKeys(provider));
455
467
  }
456
468
 
457
469
  function normalizeLocalOpenAICompatBaseUrl(baseUrl: string): string {
@@ -2507,6 +2519,13 @@ export class ModelRegistry {
2507
2519
  return this.#keylessProviders.has(model.provider) || this.authStorage.hasAuth(model.provider);
2508
2520
  }
2509
2521
 
2522
+ /**
2523
+ * Check whether auth is configured for a provider.
2524
+ */
2525
+ hasConfiguredProviderAuth(provider: string): boolean {
2526
+ return this.#keylessProviders.has(provider) || this.authStorage.hasAuth(provider);
2527
+ }
2528
+
2510
2529
  getDiscoverableProviders(): string[] {
2511
2530
  const disabledProviders = getDisabledProviderIdsFromSettings();
2512
2531
  return this.#discoveryManager.providers
@@ -0,0 +1,42 @@
1
+ import type { AuthStorage } from "@gajae-code/ai/auth-storage";
2
+
3
+ /**
4
+ * Most recent OAuth validation outcome per provider, used only as an ordering
5
+ * hint so `/model` can rank a provider whose stored credentials failed
6
+ * validation below one that is healthy, without re-running validation itself.
7
+ *
8
+ * Entries are scoped to the `AuthStorage` that produced them and to its
9
+ * credential generation, so any login, logout, import, or deletion discards the
10
+ * stale result instead of overriding current auth state.
11
+ */
12
+ export type ProviderAuthHealth = "valid" | "invalid";
13
+
14
+ interface HealthEntry {
15
+ generation: number;
16
+ health: ProviderAuthHealth;
17
+ }
18
+
19
+ const healthByStorage = new WeakMap<AuthStorage, Map<string, HealthEntry>>();
20
+
21
+ export function recordProviderAuthHealth(
22
+ authStorage: AuthStorage,
23
+ providerId: string,
24
+ health: ProviderAuthHealth,
25
+ ): void {
26
+ let entries = healthByStorage.get(authStorage);
27
+ if (!entries) {
28
+ entries = new Map();
29
+ healthByStorage.set(authStorage, entries);
30
+ }
31
+ entries.set(providerId, { generation: authStorage.getGeneration(), health });
32
+ }
33
+
34
+ export function getProviderAuthHealth(authStorage: AuthStorage, providerId: string): ProviderAuthHealth | undefined {
35
+ const entry = healthByStorage.get(authStorage)?.get(providerId);
36
+ if (!entry || entry.generation !== authStorage.getGeneration()) return undefined;
37
+ return entry.health;
38
+ }
39
+
40
+ export function clearProviderAuthHealth(authStorage: AuthStorage): void {
41
+ healthByStorage.delete(authStorage);
42
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Shared provider ordering used by every provider-facing selector (`/login`,
3
+ * `/model`, `/provider`).
4
+ *
5
+ * Providers the user already has come first, then a curated list of well-known
6
+ * providers, then everything else alphabetically. This is the single source of
7
+ * truth for that order — surfaces must not keep their own famous-provider list.
8
+ */
9
+
10
+ /**
11
+ * Auth/config state of a provider as seen by the calling surface.
12
+ *
13
+ * - `valid` — stored credentials that validated successfully.
14
+ * - `checking` — stored credentials whose async validation is still in flight.
15
+ * Ranked with `valid` so rows do not reflow when validation resolves.
16
+ * - `configured` — no OAuth record, but the provider is present in the model
17
+ * registry with a working API key (custom/API-compatible providers).
18
+ * - `invalid` — stored credentials that failed validation (problematic login).
19
+ * - `none` — nothing stored and nothing configured.
20
+ */
21
+ export type ProviderAuthState = "valid" | "checking" | "configured" | "invalid" | "none";
22
+
23
+ export const PROVIDER_RANK_TIER = {
24
+ existing: 0,
25
+ problematic: 1,
26
+ famous: 2,
27
+ other: 3,
28
+ } as const;
29
+
30
+ export type ProviderRankTier = (typeof PROVIDER_RANK_TIER)[keyof typeof PROVIDER_RANK_TIER];
31
+
32
+ /**
33
+ * Curated provider order for the famous tier. Regional and device variants sit
34
+ * immediately behind their primary so related entries stay grouped.
35
+ */
36
+ export const FAMOUS_PROVIDER_ORDER: readonly string[] = [
37
+ "openai-codex",
38
+ "openai-codex-device",
39
+ "anthropic",
40
+ "xai",
41
+ "opencode-go",
42
+ "zai",
43
+ "glm-zcode",
44
+ "alibaba-token-plan",
45
+ "qwen-portal",
46
+ "kimi-code",
47
+ "moonshot",
48
+ "minimax-code",
49
+ "minimax-code-cn",
50
+ "xiaomi",
51
+ "xiaomi-token-plan-sgp",
52
+ "xiaomi-token-plan-ams",
53
+ "xiaomi-token-plan-cn",
54
+ "opengateway",
55
+ "bizrouter",
56
+ "github-copilot",
57
+ "cursor",
58
+ ];
59
+
60
+ const FAMOUS_PROVIDER_INDEX = new Map(FAMOUS_PROVIDER_ORDER.map((id, index) => [id, index]));
61
+
62
+ /** A provider as ranked by a surface. `label` is what the user sees. */
63
+ export interface RankableProvider {
64
+ id: string;
65
+ label: string;
66
+ authState: ProviderAuthState;
67
+ }
68
+
69
+ /** A provider's position in the ordering: its tier plus its rank inside that tier. */
70
+ export interface ProviderRank {
71
+ tier: ProviderRankTier;
72
+ intraTierRank: number;
73
+ }
74
+
75
+ /**
76
+ * The single ranking result for a provider. `intraTierRank` is the curated
77
+ * famous-list position, or `Number.MAX_SAFE_INTEGER` for providers that are not
78
+ * on the list and therefore order by display label.
79
+ */
80
+ export function rankProvider(provider: RankableProvider): ProviderRank {
81
+ return {
82
+ tier: providerRankTier(provider.authState, provider.id),
83
+ intraTierRank: FAMOUS_PROVIDER_INDEX.get(provider.id) ?? Number.MAX_SAFE_INTEGER,
84
+ };
85
+ }
86
+
87
+ export function providerRankTier(authState: ProviderAuthState, id: string): ProviderRankTier {
88
+ if (authState === "valid" || authState === "checking" || authState === "configured") {
89
+ return PROVIDER_RANK_TIER.existing;
90
+ }
91
+ if (authState === "invalid") return PROVIDER_RANK_TIER.problematic;
92
+ return FAMOUS_PROVIDER_INDEX.has(id) ? PROVIDER_RANK_TIER.famous : PROVIDER_RANK_TIER.other;
93
+ }
94
+
95
+ /** Position within the famous list, or `undefined` for providers not on it. */
96
+ export function famousProviderIndex(id: string): number | undefined {
97
+ return FAMOUS_PROVIDER_INDEX.get(id);
98
+ }
99
+
100
+ /**
101
+ * Total order over providers: tier, then famous-list position, then display
102
+ * label, then id. The trailing id comparison guarantees no ties.
103
+ */
104
+ export function compareRankedProviders(left: RankableProvider, right: RankableProvider): number {
105
+ const leftRank = rankProvider(left);
106
+ const rightRank = rankProvider(right);
107
+ if (leftRank.tier !== rightRank.tier) return leftRank.tier - rightRank.tier;
108
+ if (leftRank.intraTierRank !== rightRank.intraTierRank) return leftRank.intraTierRank - rightRank.intraTierRank;
109
+
110
+ const label = left.label.localeCompare(right.label);
111
+ if (label !== 0) return label;
112
+
113
+ return left.id.localeCompare(right.id);
114
+ }
115
+
116
+ /** Convenience wrapper returning a new array in ranked order. */
117
+ export function sortRankedProviders<T extends RankableProvider>(providers: readonly T[]): T[] {
118
+ return [...providers].sort(compareRankedProviders);
119
+ }
@@ -275,6 +275,13 @@ export const SETTINGS_SCHEMA = {
275
275
  values: ["copy-retain", "disabled"] as const,
276
276
  default: "copy-retain",
277
277
  },
278
+ // SDK-owned prompt deadline. Hidden from the UI; ACP has no separate timeout.
279
+ "sdk.promptDeadlineMs": {
280
+ type: "number",
281
+ default: 1_800_000,
282
+ description: "SDK-owned prompt deadline; ACP has no separate timeout.",
283
+ validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 86_400_000,
284
+ },
278
285
 
279
286
  // Notifications (shared daemon with Telegram/Discord/Slack presentation adapters)
280
287
  "notifications.enabled": { type: "boolean", default: false },
@@ -287,6 +294,17 @@ export const SETTINGS_SCHEMA = {
287
294
  "notifications.telegram.activation": { type: "record", default: {} as Record<string, unknown> },
288
295
  "notifications.telegram.btw.enabled": { type: "boolean", default: true },
289
296
  "notifications.telegram.streaming.enabled": { type: "boolean", default: true },
297
+ "notifications.telegram.sound": {
298
+ type: "enum",
299
+ values: ["all", "important", "none"] as const,
300
+ default: "all",
301
+ ui: {
302
+ tab: "notifications",
303
+ label: "Telegram Notification Sounds",
304
+ description: "Choose which Telegram notifications play a sound.",
305
+ editing: "notification-atomic",
306
+ },
307
+ },
290
308
  "notifications.telegram.rich.enabled": {
291
309
  type: "boolean",
292
310
  default: true,
@@ -489,6 +507,22 @@ export const SETTINGS_SCHEMA = {
489
507
  options: "runtime",
490
508
  },
491
509
  },
510
+ "session.resumeModelBehavior": {
511
+ type: "enum",
512
+ values: ["keepSessionModel", "useCurrentDefault", "ask"] as const,
513
+ default: "keepSessionModel",
514
+ ui: {
515
+ tab: "model",
516
+ label: "Resume Model Behavior",
517
+ description:
518
+ "When resuming a session: keep the model that session last used, switch to the currently configured default model, or ask (TUI only; falls back to keeping the session's model in headless/CLI resume).",
519
+ options: [
520
+ { value: "keepSessionModel", label: "Keep session's saved model" },
521
+ { value: "useCurrentDefault", label: "Use current default model" },
522
+ { value: "ask", label: "Ask on resume (TUI only)" },
523
+ ],
524
+ },
525
+ },
492
526
 
493
527
  modelTags: { type: "record", default: EMPTY_MODEL_TAGS_RECORD },
494
528
 
@@ -501,11 +535,21 @@ export const SETTINGS_SCHEMA = {
501
535
  default: 0.05,
502
536
  validate: (value: number) => Number.isFinite(value) && value > 0 && value <= 1,
503
537
  },
538
+ "gjc.ralplan.autoHandoff": {
539
+ type: "enum",
540
+ values: ["off", "ultragoal", "team"],
541
+ default: "off",
542
+ },
504
543
  "gjc.ralplan.maxIterations": {
505
544
  type: "number",
506
545
  default: 5,
507
546
  validate: (value: number) => Number.isInteger(value) && value >= 1 && value <= 20,
508
547
  },
548
+ "gjc.ralplan.maxReviewPassesPerLane": {
549
+ type: "number",
550
+ default: 1,
551
+ validate: (value: number) => Number.isInteger(value) && value >= 1 && value <= 10,
552
+ },
509
553
 
510
554
  // ────────────────────────────────────────────────────────────────────────
511
555
  // Appearance
@@ -1219,6 +1263,16 @@ export const SETTINGS_SCHEMA = {
1219
1263
  "Maximum provider stream replay retries for replay-safe transient stream failures. Counts retries, not the first attempt. Set to 0 to disable provider stream retries.",
1220
1264
  },
1221
1265
  },
1266
+ "retry.streamFirstEventTimeoutMs": {
1267
+ type: "number",
1268
+ default: 100_000,
1269
+ validate: (value: number) => Number.isFinite(value) && value >= 0,
1270
+ ui: {
1271
+ tab: "model",
1272
+ label: "First Event Timeout",
1273
+ description: "Maximum wait for the first provider stream event, in ms. Set to 0 to disable the watchdog.",
1274
+ },
1275
+ },
1222
1276
  "retry.fallbackChains": { type: "record", default: {} as Record<string, string[]> },
1223
1277
  "retry.fallbackRevertPolicy": {
1224
1278
  type: "enum",
@@ -2054,7 +2108,8 @@ export const SETTINGS_SCHEMA = {
2054
2108
  ui: {
2055
2109
  tab: "editing",
2056
2110
  label: "Default Read Limit",
2057
- description: "Default number of lines returned when agent calls read without a limit",
2111
+ description:
2112
+ "Default collection/selection limit for read operations; bare local receipts use the separate 50-line / 10 KiB receipt budgets",
2058
2113
  options: [
2059
2114
  { value: "200", label: "200 lines" },
2060
2115
  { value: "300", label: "300 lines" },
@@ -2094,6 +2149,22 @@ export const SETTINGS_SCHEMA = {
2094
2149
  ],
2095
2150
  },
2096
2151
  },
2152
+ "read.truncation": {
2153
+ type: "enum",
2154
+ values: ["head", "last", "both"] as const,
2155
+ default: "last",
2156
+ ui: {
2157
+ tab: "editing",
2158
+ label: "Read Truncation",
2159
+ description:
2160
+ "Configured default direction for routes that support directional truncation; bare local and archive reads use this value (factory default: last), while explicit truncation always wins",
2161
+ options: [
2162
+ { value: "head", label: "Head", description: "Keep the first N lines" },
2163
+ { value: "last", label: "Last", description: "Keep the last N lines (default)" },
2164
+ { value: "both", label: "Both", description: "Keep the start and the end, elide the middle" },
2165
+ ],
2166
+ },
2167
+ },
2097
2168
  "read.summaryMaxBytes": {
2098
2169
  type: "number",
2099
2170
  default: 20,
@@ -3788,6 +3859,7 @@ export interface RetrySettings {
3788
3859
  maxDelayMs: number;
3789
3860
  requestMaxRetries: number;
3790
3861
  streamMaxRetries: number;
3862
+ streamFirstEventTimeoutMs: number;
3791
3863
  }
3792
3864
 
3793
3865
  export interface MemoriesSettings {
@@ -3907,6 +3979,7 @@ export interface NotificationsSettings {
3907
3979
  telegram: {
3908
3980
  botToken: string | undefined;
3909
3981
  chatId: string | undefined;
3982
+ sound: "all" | "important" | "none";
3910
3983
  btw: {
3911
3984
  enabled: boolean;
3912
3985
  };