@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
@@ -0,0 +1,292 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import {
4
+ renderStickyViewportShowcase,
5
+ STICKY_VIEWPORT_SHOWCASE_ENTRIES,
6
+ STICKY_VIEWPORT_SHOWCASE_KEYS,
7
+ type StickyViewportShowcaseEntry,
8
+ } from "../test/fixtures/tui/sticky-viewport-showcase";
9
+
10
+ const COMMAND =
11
+ "bun packages/coding-agent/scripts/capture-sticky-viewport-showcase.ts --out .gjc/qa/sticky-viewport-<run>";
12
+ const REVISION = "sticky-viewport-showcase-v2";
13
+ const TIMESTAMP = "1970-01-01T00:00:00.000Z";
14
+ const PAYLOADS = ["terminal.txt", "terminal-ansi.txt", "terminal.html", "metadata.json"] as const;
15
+ const FONT_RENDERING_ASSUMPTIONS =
16
+ "Embedded red-claw theme at deterministic truecolor; HTML uses a monospace terminal fallback stack.";
17
+ const WRAPPING_TRUNCATION_POLICY =
18
+ "ANSI-aware terminal-cell wrapping preserves semantic CJK phrase boundaries; constrained height drops the notice, decorative pet, then low-priority hooks without truncating pinned status or the focused composer.";
19
+ const ACCEPTANCE_VERSION = "sticky-viewport-stage-03";
20
+ const DESIGN_VERSION = "modes-design-sticky-viewport-v3";
21
+ const CJK_PHRASE_BOUNDARIES = ["의미 있는 문장 경계", "意味のある文の境界", "保留语义短语边界"] as const;
22
+ const HOST_MATRIX = {
23
+ capture_host: "VirtualTerminal",
24
+ live_pty: false,
25
+ network: false,
26
+ } as const;
27
+ const escapeHtml = (value: string) =>
28
+ value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
29
+ type AnsiStyle = {
30
+ foreground?: string;
31
+ background?: string;
32
+ bold?: boolean;
33
+ dim?: boolean;
34
+ italic?: boolean;
35
+ underline?: boolean;
36
+ blink?: boolean;
37
+ inverse?: boolean;
38
+ invisible?: boolean;
39
+ strikethrough?: boolean;
40
+ overline?: boolean;
41
+ };
42
+ const TERMINAL_DEFAULT_FOREGROUND = "#ffe7dc";
43
+ const TERMINAL_DEFAULT_BACKGROUND = "#110b0b";
44
+ const ANSI_COLORS: Record<number, string> = {
45
+ 30: "#000000",
46
+ 31: "#cc0000",
47
+ 32: "#4e9a06",
48
+ 33: "#c4a000",
49
+ 34: "#3465a4",
50
+ 35: "#75507b",
51
+ 36: "#06989a",
52
+ 37: "#d3d7cf",
53
+ 90: "#555753",
54
+ 91: "#ef2929",
55
+ 92: "#8ae234",
56
+ 93: "#fce94f",
57
+ 94: "#729fcf",
58
+ 95: "#ad7fa8",
59
+ 96: "#34e2e2",
60
+ 97: "#eeeeec",
61
+ };
62
+ /** Converts an xterm 256-color palette index into its canonical CSS color. */
63
+ export const xterm256Color = (index: number): string => {
64
+ if (!Number.isInteger(index) || index < 0 || index > 255) throw new RangeError(`invalid xterm color index ${index}`);
65
+ if (index < 16) return ANSI_COLORS[index < 8 ? index + 30 : index + 82]!;
66
+ if (index >= 232) {
67
+ const value = (index - 232) * 10 + 8;
68
+ return `rgb(${value},${value},${value})`;
69
+ }
70
+ const value = index - 16,
71
+ channel = (component: number) => (component === 0 ? 0 : component * 40 + 55);
72
+ return `rgb(${channel(Math.floor(value / 36))},${channel(Math.floor((value % 36) / 6))},${channel(value % 6)})`;
73
+ };
74
+ const styleAttribute = (style: AnsiStyle): string => {
75
+ const foreground = style.inverse ? (style.background ?? TERMINAL_DEFAULT_BACKGROUND) : style.foreground;
76
+ const background = style.inverse ? (style.foreground ?? TERMINAL_DEFAULT_FOREGROUND) : style.background;
77
+ const decorations = [
78
+ style.underline && "underline",
79
+ style.strikethrough && "line-through",
80
+ style.overline && "overline",
81
+ ]
82
+ .filter(Boolean)
83
+ .join(" ");
84
+ return [
85
+ foreground && `color:${foreground}`,
86
+ background && `background-color:${background}`,
87
+ style.bold && "font-weight:700",
88
+ style.dim && "opacity:.65",
89
+ style.italic && "font-style:italic",
90
+ style.blink && "animation:blink 1s step-end infinite",
91
+ style.invisible && "visibility:hidden",
92
+ decorations && `text-decoration:${decorations}`,
93
+ ]
94
+ .filter(Boolean)
95
+ .join(";");
96
+ };
97
+ const NON_VISUAL_TERMINAL_CONTROL = /\x1b_[^\x1b\x07]*(?:\x07|\x1b\\)/g;
98
+ /** Stateful SGR conversion with closing/reopening spans and partial/full resets. */
99
+ export function ansiToHtml(value: string): string {
100
+ const visibleText = value.replace(NON_VISUAL_TERMINAL_CONTROL, "");
101
+ let body = "",
102
+ offset = 0,
103
+ spanOpen = false,
104
+ style: AnsiStyle = {};
105
+ const close = () => {
106
+ if (spanOpen) {
107
+ body += "</span>";
108
+ spanOpen = false;
109
+ }
110
+ };
111
+ const open = () => {
112
+ const attribute = styleAttribute(style);
113
+ if (attribute) {
114
+ body += `<span style="${attribute}">`;
115
+ spanOpen = true;
116
+ }
117
+ };
118
+ for (const match of visibleText.matchAll(/\x1b\[([0-9;]*)m/g)) {
119
+ body += escapeHtml(visibleText.slice(offset, match.index));
120
+ offset = (match.index ?? 0) + match[0].length;
121
+ close();
122
+ const codes = (match[1] || "0").split(";").map(Number);
123
+ for (let index = 0; index < codes.length; index += 1) {
124
+ const code = codes[index];
125
+ if (code === 0) style = {};
126
+ else if (code === 1) style.bold = true;
127
+ else if (code === 2) style.dim = true;
128
+ else if (code === 3) style.italic = true;
129
+ else if (code === 4) style.underline = true;
130
+ else if (code === 5) style.blink = true;
131
+ else if (code === 7) style.inverse = true;
132
+ else if (code === 8) style.invisible = true;
133
+ else if (code === 9) style.strikethrough = true;
134
+ else if (code === 22) {
135
+ style.bold = false;
136
+ style.dim = false;
137
+ } else if (code === 23) style.italic = false;
138
+ else if (code === 24) style.underline = false;
139
+ else if (code === 25) style.blink = false;
140
+ else if (code === 27) style.inverse = false;
141
+ else if (code === 28) style.invisible = false;
142
+ else if (code === 29) style.strikethrough = false;
143
+ else if (code === 53) style.overline = true;
144
+ else if (code === 55) style.overline = false;
145
+ else if (code === 39) style.foreground = undefined;
146
+ else if (code === 49) style.background = undefined;
147
+ else if (code in ANSI_COLORS) style.foreground = ANSI_COLORS[code];
148
+ else if (code >= 40 && code <= 47) style.background = ANSI_COLORS[code - 10];
149
+ else if (code >= 100 && code <= 107) style.background = ANSI_COLORS[code - 10];
150
+ else if (code === 38 || code === 48) {
151
+ const mode = codes[index + 1];
152
+ if (mode === 2 && [codes[index + 2], codes[index + 3], codes[index + 4]].every(Number.isInteger)) {
153
+ const color = `rgb(${codes[index + 2]},${codes[index + 3]},${codes[index + 4]})`;
154
+ if (code === 38) style.foreground = color;
155
+ else style.background = color;
156
+ index += 4;
157
+ } else if (mode === 5 && Number.isInteger(codes[index + 2])) {
158
+ if (code === 38) style.foreground = xterm256Color(codes[index + 2]!);
159
+ else style.background = xterm256Color(codes[index + 2]!);
160
+ index += 2;
161
+ }
162
+ }
163
+ }
164
+ open();
165
+ }
166
+ body += escapeHtml(visibleText.slice(offset));
167
+ close();
168
+ return `<!doctype html><html lang="en"><meta charset="utf-8"><title>Sticky viewport showcase</title><style>body{margin:0;background:#110b0b;color:#ffe7dc}pre{white-space:pre;font-family:ui-monospace,monospace}@keyframes blink{50%{visibility:hidden}}</style><pre>${body}</pre></html>\n`;
169
+ }
170
+ const json = (value: unknown) => `${JSON.stringify(value, null, 2)}\n`;
171
+ const hash = (value: string) => new Bun.CryptoHasher("sha256").update(value).digest("hex");
172
+ function out(args: string[]): string {
173
+ if (args.length !== 2 || args[0] !== "--out" || !args[1]) throw new Error(`Usage: ${COMMAND}`);
174
+ return args[1];
175
+ }
176
+ async function capture(entry: StickyViewportShowcaseEntry, root: string) {
177
+ const rendered = await renderStickyViewportShowcase(entry);
178
+ if (!rendered.state.composer_visible)
179
+ throw new Error(`${entry.key}: focused composer was not visible in production frame`);
180
+ if (entry.stateId === "manual-new-output" && rendered.state.notice !== true)
181
+ throw new Error(`${entry.key}: manual output notice precondition failed`);
182
+ if (
183
+ JSON.stringify(rendered.cjkPhraseBoundaries) !==
184
+ JSON.stringify(entry.stateId === "narrow-cjk" ? CJK_PHRASE_BOUNDARIES : [])
185
+ )
186
+ throw new Error(`${entry.key}: CJK phrase boundary metadata precondition failed`);
187
+ const directory = path.join(root, ...entry.key.split("/"));
188
+ await fs.mkdir(directory, { recursive: true });
189
+ const metadata = json({
190
+ schema_version: 2,
191
+ entry_key: entry.key,
192
+ fixture_revision: REVISION,
193
+ capture_timestamp: TIMESTAMP,
194
+ command_or_replay_source: COMMAND,
195
+ fixture_source: "packages/coding-agent/test/fixtures/tui/sticky-viewport-showcase.ts",
196
+ terminal: {
197
+ ...entry.viewport,
198
+ font_rendering_assumptions: FONT_RENDERING_ASSUMPTIONS,
199
+ wrapping_truncation_policy: WRAPPING_TRUNCATION_POLICY,
200
+ },
201
+ render_mode: entry.renderMode,
202
+ ansi_mode: entry.renderMode === "unicode-color",
203
+ source_revision: rendered.sourceRevision,
204
+ output_revision: rendered.outputRevision,
205
+ state: rendered.state,
206
+ provenance: {
207
+ capture_mode: "production-tui-virtual-terminal",
208
+ live_pty: false,
209
+ network: false,
210
+ fixed_clock: true,
211
+ author_identity: "capture-sticky-viewport-showcase",
212
+ executor_identity: "capture-sticky-viewport-showcase",
213
+ },
214
+ cjk_phrase_boundaries: rendered.cjkPhraseBoundaries,
215
+ });
216
+ const contents = {
217
+ "terminal.txt": rendered.terminalText,
218
+ "terminal-ansi.txt": rendered.terminalAnsiText,
219
+ "terminal.html": ansiToHtml(rendered.terminalAnsiText),
220
+ "metadata.json": metadata,
221
+ };
222
+ const files = await Promise.all(
223
+ PAYLOADS.map(async name => {
224
+ const content = contents[name];
225
+ await Bun.write(path.join(directory, name), content);
226
+ return {
227
+ path: `${entry.key}/${name}`,
228
+ sha256: hash(content),
229
+ byte_length: Buffer.byteLength(content),
230
+ };
231
+ }),
232
+ );
233
+ return {
234
+ key: entry.key,
235
+ state_id: entry.stateId,
236
+ viewport: entry.viewport,
237
+ render_mode: entry.renderMode,
238
+ files,
239
+ };
240
+ }
241
+ async function main() {
242
+ const root = path.resolve(out(process.argv.slice(2)));
243
+ await fs.mkdir(root, { recursive: true });
244
+ const entries = [];
245
+ for (const entry of STICKY_VIEWPORT_SHOWCASE_ENTRIES) entries.push(await capture(entry, root));
246
+ const manifest = json({
247
+ schema_version: 2,
248
+ fixture_revision: REVISION,
249
+ command: COMMAND,
250
+ capture_timestamp: TIMESTAMP,
251
+ expected_entry_count: 20,
252
+ entry_count: 20,
253
+ ordered_keys: STICKY_VIEWPORT_SHOWCASE_KEYS,
254
+ provenance: {
255
+ capture_mode: "production-tui-virtual-terminal",
256
+ live_pty: false,
257
+ network: false,
258
+ fixed_clock: true,
259
+ author_identity: "capture-sticky-viewport-showcase",
260
+ executor_identity: "capture-sticky-viewport-showcase",
261
+ },
262
+ review_input_file: "review-input.json",
263
+ entries,
264
+ });
265
+ await Bun.write(path.join(root, "manifest.json"), manifest);
266
+ await Bun.write(
267
+ path.join(root, "review-input.json"),
268
+ json({
269
+ schema_version: 2,
270
+ manifest_sha256: hash(manifest),
271
+ command_or_replay_source: COMMAND,
272
+ capture_timestamp: TIMESTAMP,
273
+ fixture_source: "packages/coding-agent/test/fixtures/tui/sticky-viewport-showcase.ts",
274
+ fixed_clock: true,
275
+ live_pty: false,
276
+ network: false,
277
+ expected_keys: STICKY_VIEWPORT_SHOWCASE_KEYS,
278
+ author_identity: "capture-sticky-viewport-showcase",
279
+ executor_identity: "capture-sticky-viewport-showcase",
280
+ required_artifacts: PAYLOADS,
281
+ acceptance_version: ACCEPTANCE_VERSION,
282
+ design_version: DESIGN_VERSION,
283
+ host_matrix: HOST_MATRIX,
284
+ narrow_cjk: {
285
+ entry_key: "narrow-cjk/48x10/unicode-color",
286
+ phrase_boundaries: ["의미 있는 문장 경계", "意味のある文の境界", "保留语义短语边界"],
287
+ },
288
+ }),
289
+ );
290
+ process.stdout.write(`Captured 20 production TUI sticky viewport entries to ${root}\n`);
291
+ }
292
+ if (import.meta.main) await main();
@@ -119,10 +119,13 @@ const LOCKED_EXCLUSIONS: Readonly<Record<string, string>> = {
119
119
  "agent_session:continuePersistedHistory": "internal startup lifecycle plumbing, not a user-facing control seam",
120
120
  "agent_session:promoteRecoveryHydrationAfterOwnershipReadyFence":
121
121
  "internal owner-recovery authority transition after a durable writer fence, never a user-facing SDK operation",
122
+ "agent_session:restoreFromMemoryGuardCheckpoint":
123
+ "internal owner-recovery staged restore builder after durable claims/fencing, never a user-facing SDK operation",
122
124
  "agent_session:setActiveModelProfile": "internal accessor/plumbing, not a user-facing control seam",
123
125
  "agent_session:getActiveModelProfile": "internal accessor/plumbing, not a user-facing control seam",
124
126
  "agent_session:getSessionDefaultModelSelector": "internal accessor/plumbing, not a user-facing control seam",
125
127
  "agent_session:recordResumeDefaultModel": "internal accessor/plumbing, not a user-facing control seam",
128
+ "agent_session:resolveConfiguredDefaultModel": "internal accessor/plumbing, not a user-facing control seam",
126
129
  "agent_session:setModelTemporary": "internal accessor/plumbing, not a user-facing control seam",
127
130
  "agent_session:setModelTemporaryForControl":
128
131
  "internal Telegram control wrapper over the reviewed model.set seam, not an independent public SDK operation",
@@ -148,6 +151,8 @@ const LOCKED_EXCLUSIONS: Readonly<Record<string, string>> = {
148
151
  "agent_session:runIdleCompaction": "internal accessor/plumbing, not a user-facing control seam",
149
152
  "agent_session:abortBranchSummary": "internal accessor/plumbing, not a user-facing control seam",
150
153
  "agent_session:abortHandoff": "internal accessor/plumbing, not a user-facing control seam",
154
+ "agent_session:abortPromptAndWait":
155
+ "internal SDK prompt-terminalization resource fence over a host-captured run handle, not an independent public SDK control seam",
151
156
  "agent_session:prepareContributionPrep": "internal accessor/plumbing, not a user-facing control seam",
152
157
  "agent_session:setResourceSampler": "internal accessor/plumbing, not a user-facing control seam",
153
158
  "agent_session:setRetainedMemorySampler": "internal accessor/plumbing, not a user-facing control seam",