@gajae-code/coding-agent 0.19.1-nightly.20261022091658.40484287217.g789b4b74f150 → 0.19.2

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 (197) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/dist/types/capability/types.d.ts +2 -0
  3. package/dist/types/cli/public-command-errors.d.ts +1 -0
  4. package/dist/types/cli/skills-cli.d.ts +7 -0
  5. package/dist/types/config/autorouting-tier-map.d.ts +41 -2
  6. package/dist/types/config/file-lock.d.ts +2 -2
  7. package/dist/types/config/model-profile-activation.d.ts +11 -0
  8. package/dist/types/config/settings-schema.d.ts +1 -1
  9. package/dist/types/coordinator-mcp/event-webhook.d.ts +5 -1
  10. package/dist/types/crash/record-loader.d.ts +3 -3
  11. package/dist/types/crash/upstream/envelope.d.ts +1 -0
  12. package/dist/types/discovery/helpers.d.ts +5 -0
  13. package/dist/types/extensibility/extensions/types.d.ts +1 -1
  14. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +4 -2
  15. package/dist/types/extensibility/skills.d.ts +8 -0
  16. package/dist/types/memories/index.d.ts +2 -0
  17. package/dist/types/migrate/adapters/index.d.ts +8 -5
  18. package/dist/types/modes/components/oauth-selector.d.ts +1 -0
  19. package/dist/types/modes/components/plugin-settings.d.ts +4 -2
  20. package/dist/types/modes/controllers/plan-mode-controller.d.ts +4 -0
  21. package/dist/types/modes/controllers/ssh-command-controller.d.ts +5 -0
  22. package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -17
  23. package/dist/types/runtime-mcp/config.d.ts +2 -0
  24. package/dist/types/runtime-mcp/manager.d.ts +2 -0
  25. package/dist/types/runtime-mcp/project-host-values.d.ts +9 -1
  26. package/dist/types/sdk/broker/broker.d.ts +6 -0
  27. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +14 -3
  28. package/dist/types/sdk/broker/publication-liveness-deadline.d.ts +40 -0
  29. package/dist/types/sdk/broker/publication-liveness-watchdog-smoke.d.ts +14 -0
  30. package/dist/types/sdk/broker/publication-liveness-watchdog-worker.d.ts +1 -0
  31. package/dist/types/sdk/broker/publication-liveness-watchdog.d.ts +27 -0
  32. package/dist/types/sdk/broker/runtime-abort-capability.d.ts +12 -0
  33. package/dist/types/sdk/broker/session-index.d.ts +25 -0
  34. package/dist/types/sdk/bus/chat-daemon-control.d.ts +3 -0
  35. package/dist/types/sdk/bus/daemon-internal-cli-args.d.ts +2 -0
  36. package/dist/types/sdk/bus/discord-daemon.d.ts +8 -0
  37. package/dist/types/sdk/bus/engine.d.ts +7 -0
  38. package/dist/types/sdk/bus/helpers.d.ts +7 -0
  39. package/dist/types/sdk/bus/index.d.ts +16 -12
  40. package/dist/types/sdk/bus/slack-daemon.d.ts +1 -1
  41. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +10 -1
  42. package/dist/types/sdk/bus/telegram-daemon.d.ts +6 -1
  43. package/dist/types/sdk/host/control/runtime-gate.d.ts +7 -0
  44. package/dist/types/sdk/host/events.d.ts +6 -1
  45. package/dist/types/sdk/host/host.d.ts +11 -0
  46. package/dist/types/sdk/session.d.ts +2 -0
  47. package/dist/types/secrets/obfuscator.d.ts +1 -1
  48. package/dist/types/session/agent-session.d.ts +40 -2
  49. package/dist/types/session/messages.d.ts +22 -0
  50. package/dist/types/session/streaming-output.d.ts +1 -1
  51. package/dist/types/slash-commands/helpers/usage-report.d.ts +1 -1
  52. package/dist/types/task/executor.d.ts +26 -1
  53. package/dist/types/tools/atomic-file-write.d.ts +7 -0
  54. package/dist/types/tools/fetch.d.ts +2 -3
  55. package/dist/types/tools/read-internals.d.ts +7 -0
  56. package/dist/types/tools/skill.d.ts +2 -2
  57. package/dist/types/utils/prompt-suggestion.d.ts +21 -27
  58. package/package.json +7 -7
  59. package/scripts/compile-args.ts +2 -0
  60. package/scripts/generate-sdk-operation-inventory.ts +4 -0
  61. package/src/autoresearch/prompts.ts +11 -2
  62. package/src/capability/types.ts +2 -0
  63. package/src/cli/args.ts +1 -0
  64. package/src/cli/auth-broker-cli.ts +4 -0
  65. package/src/cli/auth-gateway-cli.ts +8 -0
  66. package/src/cli/daemon-cli.ts +4 -1
  67. package/src/cli/notify-cli.ts +2 -0
  68. package/src/cli/public-command-entry.ts +17 -4
  69. package/src/cli/public-command-errors.ts +2 -0
  70. package/src/cli/public-command-registry.ts +2 -0
  71. package/src/cli/skills-cli.ts +13 -4
  72. package/src/cli/update-cli.ts +51 -8
  73. package/src/cli-main.ts +27 -7
  74. package/src/commands/harness.ts +2 -1
  75. package/src/commands/sdk.ts +1 -1
  76. package/src/config/autorouting-tier-map.ts +16 -2
  77. package/src/config/file-lock.ts +209 -64
  78. package/src/config/machine-identity.ts +1 -1
  79. package/src/config/model-profile-activation.ts +25 -0
  80. package/src/config/model-registry.ts +1 -1
  81. package/src/config/settings-schema.ts +22 -1
  82. package/src/config/settings.ts +90 -15
  83. package/src/coordinator-mcp/event-webhook.ts +45 -16
  84. package/src/crash/index-store.ts +3 -2
  85. package/src/crash/record-loader.ts +23 -9
  86. package/src/crash/report.ts +9 -7
  87. package/src/crash/upstream/envelope.ts +4 -1
  88. package/src/crash/upstream/relay.ts +1 -0
  89. package/src/discovery/helpers.ts +99 -3
  90. package/src/exa/mcp-client.ts +50 -3
  91. package/src/extensibility/extensions/types.ts +1 -1
  92. package/src/extensibility/plugins/marketplace/registry.ts +48 -4
  93. package/src/extensibility/skills.ts +121 -5
  94. package/src/gjc-runtime/launch-tmux.ts +3 -1
  95. package/src/gjc-runtime/launch-worktree.ts +35 -0
  96. package/src/gjc-runtime/psmux-detect.ts +2 -1
  97. package/src/gjc-runtime/session-state-lock.ts +26 -8
  98. package/src/gjc-runtime/tmux-sessions.ts +40 -11
  99. package/src/gjc-runtime/ultragoal-change-set.ts +9 -9
  100. package/src/hashline/execute.ts +22 -2
  101. package/src/hooks/native-skill-hook.ts +141 -7
  102. package/src/internal-urls/docs-index.generated.ts +7 -7
  103. package/src/memories/index.ts +57 -4
  104. package/src/migrate/adapters/claude-code.ts +7 -6
  105. package/src/migrate/adapters/index.ts +108 -30
  106. package/src/modes/acp/acp-event-mapper.ts +143 -5
  107. package/src/modes/components/custom-model-preset-wizard.ts +14 -2
  108. package/src/modes/components/oauth-selector.ts +9 -13
  109. package/src/modes/components/plugin-settings.ts +41 -17
  110. package/src/modes/components/settings-selector.ts +16 -11
  111. package/src/modes/components/skill-hud/render.ts +4 -0
  112. package/src/modes/components/ttsr-notification.ts +7 -4
  113. package/src/modes/components/welcome.ts +13 -2
  114. package/src/modes/controllers/command-controller.ts +141 -22
  115. package/src/modes/controllers/event-controller.ts +1 -1
  116. package/src/modes/controllers/extension-ui-controller.ts +12 -0
  117. package/src/modes/controllers/input-controller.ts +8 -3
  118. package/src/modes/controllers/plan-mode-controller.ts +57 -13
  119. package/src/modes/controllers/runtime-mcp-command-controller.ts +44 -37
  120. package/src/modes/controllers/selector-controller.ts +36 -1
  121. package/src/modes/controllers/ssh-command-controller.ts +20 -9
  122. package/src/modes/controllers/todo-command-controller.ts +13 -7
  123. package/src/modes/interactive-mode.ts +4 -0
  124. package/src/modes/prompt-suggestion-controller.ts +82 -46
  125. package/src/modes/runtime-init.ts +1 -1
  126. package/src/modes/utils/tools-markdown.ts +12 -5
  127. package/src/prompts/system/prompt-suggestion.md +7 -0
  128. package/src/quick-lane/classify.ts +124 -15
  129. package/src/runtime-mcp/config.ts +11 -2
  130. package/src/runtime-mcp/manager.ts +14 -2
  131. package/src/runtime-mcp/pool-key.test.ts +109 -1
  132. package/src/runtime-mcp/pool-key.ts +6 -0
  133. package/src/runtime-mcp/pool.test.ts +96 -0
  134. package/src/runtime-mcp/project-host-values.ts +13 -1
  135. package/src/sdk/broker/broker.ts +112 -11
  136. package/src/sdk/broker/discovery.ts +17 -0
  137. package/src/sdk/broker/ensure.ts +37 -3
  138. package/src/sdk/broker/lifecycle-ledger.ts +110 -3
  139. package/src/sdk/broker/publication-liveness-deadline.ts +59 -0
  140. package/src/sdk/broker/publication-liveness-watchdog-smoke.ts +65 -0
  141. package/src/sdk/broker/publication-liveness-watchdog-worker.ts +52 -0
  142. package/src/sdk/broker/publication-liveness-watchdog.ts +260 -0
  143. package/src/sdk/broker/runtime-abort-capability.ts +41 -0
  144. package/src/sdk/broker/session-index.ts +121 -3
  145. package/src/sdk/bus/chat-daemon-control.ts +5 -2
  146. package/src/sdk/bus/chat-daemon-runtime.ts +3 -0
  147. package/src/sdk/bus/daemon-internal-cli-args.ts +21 -0
  148. package/src/sdk/bus/discord-daemon.ts +95 -2
  149. package/src/sdk/bus/discord-live-provider.ts +64 -35
  150. package/src/sdk/bus/engine.ts +89 -0
  151. package/src/sdk/bus/helpers.ts +19 -0
  152. package/src/sdk/bus/index.ts +63 -18
  153. package/src/sdk/bus/slack-daemon.ts +123 -31
  154. package/src/sdk/bus/telegram-daemon-contract.ts +10 -1
  155. package/src/sdk/bus/telegram-daemon.ts +68 -16
  156. package/src/sdk/cli/session-cli.ts +7 -2
  157. package/src/sdk/host/control/runtime-gate.ts +11 -1
  158. package/src/sdk/host/events.ts +10 -2
  159. package/src/sdk/host/host.ts +92 -13
  160. package/src/sdk/host/session-runtime.test.ts +36 -20
  161. package/src/sdk/host/session-runtime.ts +29 -0
  162. package/src/sdk/protocol/operation-inventory.generated.json +22 -0
  163. package/src/sdk/session.ts +23 -5
  164. package/src/secrets/obfuscator.ts +65 -16
  165. package/src/session/agent-session.ts +223 -41
  166. package/src/session/blob-store.ts +2 -1
  167. package/src/session/messages.ts +61 -3
  168. package/src/session/session-manager.ts +1 -0
  169. package/src/session/streaming-output.ts +301 -19
  170. package/src/skill-state/workflow-mutation-guard.ts +443 -98
  171. package/src/slash-commands/builtin-registry.ts +11 -2
  172. package/src/slash-commands/helpers/usage-report.ts +16 -4
  173. package/src/system-prompt.ts +3 -0
  174. package/src/task/executor.ts +100 -1
  175. package/src/task/index.ts +18 -0
  176. package/src/task/receipt.ts +26 -5
  177. package/src/tools/archive-reader.ts +13 -7
  178. package/src/tools/ast-edit.ts +8 -2
  179. package/src/tools/atomic-file-write.ts +31 -4
  180. package/src/tools/bisect.ts +35 -0
  181. package/src/tools/fetch.ts +2 -10
  182. package/src/tools/gh-renderer.ts +44 -25
  183. package/src/tools/jtd-to-json-schema.ts +3 -3
  184. package/src/tools/output-meta.ts +75 -1
  185. package/src/tools/read-internals.ts +35 -1
  186. package/src/tools/read.ts +23 -12
  187. package/src/tools/skill-discovery.ts +4 -1
  188. package/src/tools/skill.ts +13 -4
  189. package/src/tools/ssh.ts +8 -3
  190. package/src/tools/vim.ts +3 -1
  191. package/src/tools/write.ts +9 -3
  192. package/src/tools/yield.ts +97 -4
  193. package/src/tui/code-cell.ts +16 -2
  194. package/src/utils/herdr-pane.ts +76 -9
  195. package/src/utils/pasted-image-path.ts +15 -1
  196. package/src/utils/prompt-suggestion.ts +65 -242
  197. package/src/prompts/system/prompt-suggestion-system.md +0 -32
package/CHANGELOG.md CHANGED
@@ -2,6 +2,228 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.19.2] - 2026-10-29
6
+
7
+ ## [0.19.1] - 2026-10-28
8
+
9
+ ### Added
10
+
11
+ - GPT-6.1 Terra autorouting tier assignments (fast/medium rank 1, balanced/high rank 1). Prioritizes Terra over the legacy GPT-5.6 Terra (now rank 2).
12
+
13
+ ### Changed
14
+
15
+ - Prompt suggestions (`promptSuggestions`) now follow the Codex TUI logic. After a turn that completes normally, an ephemeral turn on the session's own model, thinking level, system prompt, and full history sends Codex's prompt verbatim to predict the user's likely next message. Only a strict `{"suggestion": string | null}` reply that is one line of at most 240 characters is shown. Ghost text is hidden while you type, while a turn runs, or while an autocomplete popup is open. Tab on an empty composer accepts it and Esc dismisses it. A submission, a new turn, a session switch, or a 30-second deadline cancels the request. No suggestion is requested while messages are queued or a side chat is open. The previous `default`-role transcript summary, word-count heuristics, and system prompt are removed.
16
+ - Unlike Codex's hidden thread fork, the suggestion turn runs with tools disabled and in a fresh provider session. It is marked as a maintenance call, so agent-level providers such as Devin refuse it.
17
+
18
+ ### Fixed
19
+
20
+ - SDK broker spawn-claim mirror rows in the lifecycle ledger now carry `spawnAnchor: true`, so a mirror no longer turns into a fenced legacy row once its claim leaves the spawn-authority journal and stops blocking `session.create` and `session.close` with `legacy_lifecycle_ambiguous`. Mirrors written by older brokers stay fenced because nothing durable proves their origin; an operator can release them through `sdk/lifecycle-ledger.spawn-anchor-attestation.json` (see `docs/sdk-session-cli.md`). Genuine pre-index legacy rows stay fenced (#7143).
21
+
22
+ - Collapsed Google Antigravity `/usage` rows by shared quota pool and preserved account email labels across live and cached usage views (#7267).
23
+ - Kept accounts that report only one horizon of a quota pool in the sibling `/usage` row as `not reported` cells (unknown bar, `N% free · M not reported` aggregate, warning instead of a false `exhausted`) instead of dropping the column (#7267).
24
+
25
+ - ACP session updates strip terminal control sequences from tool titles, raw tool arguments, and command text before they are sent to the client.
26
+
27
+ - Preserve explicit TAR directory entries in the archive index, including empty directories, and keep the existing first duplicate file record's metadata consistent with its bytes.
28
+
29
+ - `gjc auth-broker serve` re-reads the bearer token file on each request, so `token --regenerate` revokes the previous bearer while the broker is running.
30
+
31
+ - `gjc auth-gateway serve` re-reads `auth-gateway.token` on each request, so `token --regenerate` retires the previous bearer without a restart.
32
+
33
+ - Autoresearch setup and iterate prompts frame the active branch name so repository branch markup cannot close that slot.
34
+
35
+ - The bisect tool now uses the same ACP and SDK permission gate as eval. Prompt mode asks before its shell predicate runs, and deny mode rejects it. Allow mode is unchanged.
36
+
37
+ - Bisect tool results are framed as untrusted content when they enter the model, so a commit subject or diffstat cannot close that frame early.
38
+
39
+ - The bisect predicate now refuses a tmux input verb aimed at this agent pane before each shell starts, including a script that changes at a checked-out commit. The same check refuses a shell runner whose PATH override is still an unresolved expansion; a static PATH is unchanged.
40
+
41
+ - A broker discovery record is ignored when its url is not the owned loopback endpoint for that record's port.
42
+
43
+ - A stalled discovery publication fsync/rename no longer keeps an SDK broker alive past its liveness deadline (`publication-liveness-timeout`, `max(60s, heartbeat TTL × 4)`). When that write blocks the JS thread, `gjc sdk broker run` is SIGKILLed (signal status 137, not exit 1), including when stderr cannot accept the diagnostic. While the event loop still runs, it still exits 1.
44
+
45
+ - SDK broker startup fails when the publication-liveness watchdog cannot be armed, instead of staying up without that protection. The failed attempt releases its discovery file and lock. If the watchdog worker dies after startup, the broker exits with `publication-liveness-timeout` rather than keeping the publication unprotected.
46
+
47
+ - Foreground `gjc sdk broker run` loads the publication-liveness watchdog from the bundled module. A `PI_COMPILED` value from the environment or a project `.env` cannot redirect that worker to a file in the repository. The project-root worker path is used only when the running module is inside a compiled binary.
48
+
49
+ - A repository `.gjc/config.yml` or `.gjc/settings.json` can no longer set `clipboard.transport` or `clipboard.sshHost`, and a non-object `clipboard` value there cannot replace the user clipboard settings. User config and the clipboard CLI flags still can.
50
+
51
+ - Code cells strip terminal control sequences from source bytes before rendering, so a file read cannot write OSC, CSI, or DCS to the operator terminal.
52
+
53
+ - `gjc crash report` flattens a duplicate issue title and author to one display row before writing the candidate line.
54
+
55
+ - The custom model preset wizard strips terminal control characters from the snapshot preview before drawing role selectors and providers.
56
+
57
+ - Correct custom-provider setup recipes so both local and hosted examples pass configuration validation.
58
+
59
+ - `debug` tool results are framed as untrusted content when they enter the model, so debugger and program text cannot close that frame early.
60
+
61
+ - A repository `.gjc` config file can no longer clear or replace the operator `disabledExtensions` list, so an operator-disabled extension module stays unloaded. User config and runtime overrides still apply.
62
+
63
+ - Discord inbound commands and component actions, including claims recovered at startup, are delivered only for actors listed in the global Discord notification config, and are ignored when the author is missing or not listed.
64
+
65
+ - Discord nonce reconciliation binds a thread only when this bot authored the starter, the thread parent and owner are that bot's thread, and a history fallback matches the starter message rather than a later copy.
66
+
67
+ - A repository `.gjc/config.yml` or `.gjc/settings.json` can no longer set `edit.blockAutoGenerated`, and a runtime override cannot flip it. The user config keeps that switch, so a project file cannot turn off the auto-generated file edit guard.
68
+
69
+ - Hashline edit previews and ast-edit before/after lines are framed as untrusted content, so a repository line cannot close that frame early.
70
+
71
+ - Coordinator event webhook delivery checks https destinations with the public HTTP guard before the POST.
72
+
73
+ - File-lock acquisition now reaps same-host staging directories whose recorded process generation is dead, and removes empty or missing-info staging directories only when their names prove the local host and they exceed a 60-second grace period. Foreign-host and live-owner staging directories remain protected, while a rotating bounded scan prevents retained entries from starving later candidates.
74
+
75
+ - Restore parenthesized two-argument literal read-only Perl `open` calls during planning, including escaped literal backslashes, while rejecting unscanned startup modules and imports that can override `open`, custom `open` suffix calls, unsupported handles, and unsafe or unparsed modes.
76
+
77
+ - The GitHub tool view strips terminal control sequences from repository text before drawing it.
78
+
79
+ - The Herdr sequence watermark is stored in the trusted agent directory, so a planted file in the shared temp directory is not adopted at startup.
80
+
81
+ - A `<lock>.removing` left by a lock owner that stamped no host id, such as a broker killed mid-release just before an upgrade, no longer blocks a host-qualified lock like the SDK session index forever. Its remover record stays foreign while the transition could still be in progress. Once the record and every captured entry have been unchanged for the orphan adoption age, the recorded pid is checked locally and a dead remover's transition is adopted. Records from another host, and records naming a live process, are still never reclaimed.
82
+
83
+ - Point the install guide's retry configuration example at the global settings file actually read by GJC.
84
+
85
+ - The helpers GJC runs on its own while starting a session -- the `ps` process-identity probe behind file locks, launch-worktree reservations, the resident blob cache and `gjc harness`, the `tmux -V` multiplexer detection, the tmux window rename and its `git symbolic-ref` branch lookup, and the `lspci`/`wmic` GPU probe -- now start from the same filtered environment as the bash tool. Previously a repository `.env` declaring `LD_PRELOAD` (or another loader hook such as `LD_AUDIT` or `DYLD_INSERT_LIBRARIES`) made those helpers load a repository library as soon as `gjc` was launched in the checkout, before any prompt, including in the compiled binary.
86
+
87
+ - Record a model in the recent-model (usage) order only after its selection succeeds: a model profile switch, TUI default model selection, or configuration reload that fails and rolls back (for example, to a CLI `--model` startup override) no longer records the failed pick or the restored model as a recent choice (follow-up to #6768).
88
+ - Within a session, a model choice that a newer default model or profile selection overtook while its transaction was still finishing (for example, a configuration reload waiting on another session's model-catalog publication, or a profile switch still flushing settings) no longer records itself over the newer choice in the recent-model order. An automatic fallback switch, or a newer selection that fails and rolls back, does not suppress the completed choice.
89
+
90
+ - SDK broker session heartbeat checkpoints now emit a rate-limited warning when all retries fail because observations are stale.
91
+
92
+ - Missing or invalid `--owner-id` arguments to private notification-daemon entrypoints now report a usage error and exit 2 instead of recording a crash.
93
+
94
+ - Lean notifications keep the final answer of a tool-using request when a queued background result settles a short follow-up in the same run; the idle message no longer pins the request's first tool-loop narration in its place (#4458). A completed turn whose tool calls the provider already resolved (Devin ACP display-only calls) still counts as a settled answer.
95
+
96
+ - Lifecycle MCP server env and headers no longer run `!` shell commands or copy sensitive host values, including a sensitive header placeholder, when the lifecycle host loads that tools-only file. A caller-selected exact config stays trusted.
97
+
98
+ - Lifecycle read-back no longer rejects its own settled terminal row because an unrelated identity's ledger row exceeds the JSON bounds. A cleanup receipt carrying an artifact snapshot larger than the 1024-element limit no longer makes every later lifecycle result unverifiable on that agent directory; rows for the requested identity, undecodable rows, and unsupported state versions still withhold proof.
99
+
100
+ - Local `!` and `$` command output that enters model context is framed as untrusted content after the stored excerpt is already truncated.
101
+
102
+ - The Windows machine-identity probe (`reg query ... MachineGuid`) now runs with `windowsHide`, so the console-less detached broker no longer flashes a visible terminal window each time it derives the ownership-lock host identity.
103
+
104
+ - Markdown cells strip terminal control sequences from repository content before rendering, and keep a carriage return as a markdown line break.
105
+
106
+ - Marketplace registry writes no longer follow a symlink or hard link at the predictable temporary path next to `installed_plugins.json` or `marketplaces.json`.
107
+
108
+ - Exa and Websets tools/call failures no longer write tool arguments or echoed credential text into the rotating log.
109
+
110
+ - MCP server initialize instructions are framed as untrusted content after the per-server length cut, so a server-supplied closer cannot end that frame early.
111
+
112
+ - `/mcp resources`, prompts, notifications, reload errors, and the reconnect, enable, disable, unauth, and reauth status lines sanitize the server name before drawing it.
113
+
114
+ - MCP resource update notifications frame the server-provided URI as untrusted content before the user turn.
115
+
116
+ - Shared MCP pool keys include an API-key Authorization value, so one binding label cannot send another caller's token.
117
+
118
+ - Mid-run context maintenance no longer ends the turn with `Context maintenance could not commit a compaction before the next model request.` on models whose window is below 300k (for example a 272k window) when compaction has nothing to summarize but the unchanged context still fits the window. The fit check now uses the configured reserve instead of the window-scaled reserve, which below the 300k ceiling equalled the threshold margin and made the #6813 fallback unreachable.
119
+
120
+ - `gjc migrate` no longer follows a symlinked Claude Code instruction, settings, or skill file outside the home or project root being imported. A rootless Codex or OpenCode config whose final component is a symlink is still read.
121
+
122
+ - `/model roles` and the `/model` status summary strip control characters from stored model selectors before they reach the terminal.
123
+
124
+ - Native hook error logs are created as owner-only files and are not written through a symlink.
125
+
126
+ - `config.patch` rejects notification binding paths before any settings write, so a generic patch cannot replace a Slack actor, a Slack or Discord destination, or a Telegram chat id.
127
+
128
+ - Discord and Slack notification frames publish only their own string fields, and a replayed frame body is scrubbed again before the provider post, so prototype text is not sent. Ask choices and an explicit redact opt-out stay readable, including a Slack ask root posted after a lease wait.
129
+
130
+ - Outbound secret obfuscation now covers string message content and unsigned thinking prose.
131
+
132
+ - Pasted image paths trim trailing terminal newlines in one pass, so a paste that does not end in a newline cannot stall path parsing.
133
+
134
+ - The agent settings pending-retirement marker is rewritten on its own descriptor at mode 0600 and is not created through a final-component symlink. A refused marker write leaves settings.json active.
135
+
136
+ - ACP and SDK tool-approval titles and command text show control bytes visibly and keep the shell text that still executes, including inside an OSC sequence, before the 80-character title preview.
137
+
138
+ - External editor saves of a non-local plan path stay inside the session directory, including absolute paths, `..`, and symlinks.
139
+
140
+ - Inspect every imported Python `os.system` alias during planning, including repeated and continued import lists, so an unused alias cannot hide a later shell invocation. Keep inert comments and strings read-only while failing closed on unresolved alias calls.
141
+
142
+ - Preserve the original CLI argument list while parsing inline option values so tmux relaunches do not add those values to the user's prompt.
143
+
144
+ - Preserve the terminal startup fallback-model notice when the SDK session stream subscribes before the TUI, without replaying the notice to live extension observers.
145
+
146
+ - Project-layer task.agentModelOverrides is ignored when the task tool starts a subagent. User config and runtime overrides still apply.
147
+
148
+ - A project plugin registry entry whose install path resolves inside the directory that owns that registry is no longer loaded. Entries outside that directory, including the user plugin cache, still load. On a case-sensitive Windows directory, a path that differs only by case stays outside that directory.
149
+
150
+ - A project agent no longer preloads bundled workflow skills into a task subagent.
151
+
152
+ - Quick-lane file paths are scanned once, so a long slash-separated task that names no file cannot stall classification.
153
+
154
+ - The read tool description normalizes truncation to schema members and receipt budgets to finite numbers before interpolation and KiB conversion, so a project settings file cannot place arbitrary text in the tool definition.
155
+
156
+ - Memory phase 2 writes a rollout summary only when its file name stays lexically inside rollout_summaries, and still prunes existing summaries in that directory.
157
+
158
+ - SDK broker startup failures now wait for the spawned broker to exit before reading its stderr log, preserving the final diagnostic alongside the typed startup error.
159
+
160
+ - A session resumed in a new process (`--resume`/`--continue`) no longer has its first Telegram notifications silently suppressed. Every SDK host start now takes its event generation from a per-session authority in the agent directory instead of restarting at `1`: generations are strictly increasing and unique across host processes, with wall-clock time only as a floor, so the new process's `(generation, seq)` coordinates and notification publication ids can no longer collide with delivery receipts recorded for the previous process, and a host resumed after the system clock stepped backward still outranks the previous host in the session index and stays visible to Router consumers. The Telegram daemon resumes a stored replay cursor only within the host generation that produced it.
161
+
162
+ - A repository `.gjc/config.yml` or `.gjc/settings.json` can no longer set `searxng.endpoint` or replace the user SearXNG settings with a non-object value, and a runtime override cannot replace the user endpoint. Web search keeps the user config endpoint, or `SEARXNG_ENDPOINT` when that value is unset.
163
+
164
+ - Stop a session's coordinator state persistence from failing permanently with `terminal_persistence ... lock_owner_record_unprovenanced` when its `runtime-state.json.lock` owner record ends in zero-filled bytes. File-system filters such as cloud-sync placeholders, or crash recovery, can leave such a tail after an otherwise complete record. Owner records now ignore trailing NUL padding the same way they already ignore the writer's space padding. A NUL inside the record still fails closed.
165
+
166
+ - The `/session` panel strips terminal control sequences from project append-only settings, LSP server labels, and MCP server names before drawing them.
167
+
168
+ - An untouched settings or plugin text confirm keeps the stored string, an edit commits the submitted text, and plugin enum confirmation keeps the stored option.
169
+
170
+ - `skill_discovery` frames the paged skill catalog as untrusted content, so a repository skill description or use condition cannot close that frame early.
171
+
172
+ - The skill HUD drops ESC, BEL, and C1 bytes from skill, phase, summary, and chip text so a control sequence cannot be reassembled on the status row.
173
+
174
+ - A repository skill body is fenced as untrusted content in the model prompt, an end tag inside that body stays escaped, and the body and host suffix are shortened before that fence so the saved prompt keeps its closing fence within the session text cap.
175
+
176
+ - Skills chained with the `skill` tool now reach the model in the same turn. The tool sent the callee prompt as a plain custom message, which a busy session queues as a follow-up; follow-ups are only delivered once the agent stops, so the prompt arrived after the final answer and started an extra turn that re-ran the chained workflow. For example, an autoresearch mission that had already reached a verdict and been cleared was re-activated at `intake`, and its research-only guard then blocked every write for the rest of the session. The prompt is now steered in right after the tool result, and a prompt whose preparation finishes after the run was aborted is dropped instead of restarting the stopped run.
177
+
178
+ - `gjc skills discover` text output strips terminal control characters from repository skill names, descriptions, paths, and use conditions before writing the row.
179
+
180
+ - SSH tool descriptions encode host names and destinations from repository `ssh.json` and frame that host list, so a host name cannot insert a newline or sit in the trusted prompt.
181
+
182
+ - `/ssh list` strips terminal control sequences from host name, host, username, and port before drawing them.
183
+
184
+ - Streaming artifact output is published as mode 0600 without following a destination symlink, and an existing regular file is still updated when its parent directory is not writable.
185
+
186
+ - Task subagents inherit the parent session's bash restriction profile and allowlist, and a child allowlist cannot widen that posture.
187
+
188
+ - A tail-only tool-result cut keeps the opening untrusted-content tag on the retained tail when both the line budget and the byte budget have room for the tags, the trusted suffix, and one body line. A shortfall leaves the unfenced plain tail.
189
+
190
+ - Task setup-failure summaries escape "<" before they enter the task synopsis, so a repository agent file cannot close that element.
191
+
192
+ - Resuming a closed session (`--resume`/`--continue`) while the Telegram notification daemon keeps running opens a fresh forum topic and delivers notifications again. The `session_closed` tombstone now fences only the attachment that closed, not every later attachment for the same session id, and refused attachment recovery leaves a daemon warning instead of silently dropping the subscription.
193
+
194
+ - Managed tmux sessions start from a Broker launched without a UTF-8 locale (launchd, cron, a service manager). The native tmux clients that managed-session creation, inspection, and mutation run and parse now pass `-u`. Before this, tmux replaced the tab separators in their replies with `_`, so creation failed with `gjc_tmux_owner_changed_after_create`, and non-ASCII workspace paths did not round-trip through the session state-file tag. psmux and interactive `attach-session` are unchanged.
195
+
196
+ - `/todo` strips terminal control sequences from phase, task, and note text before drawing the list and the status lines that echo that text.
197
+
198
+ - The /tools panel strips terminal control sequences from tool names and descriptions before placing them in the markdown table.
199
+
200
+ - TTSR rule notifications strip terminal control sequences from the rule name, description, and body before drawing them.
201
+
202
+ - TTSR interrupt and tool-reminder text encodes rule name, path, and reserved prompt tags before they are rendered into the model message.
203
+
204
+ - Fixed ACP and SDK clients receiving no message or tool content for a turn they submitted to a session hosted by an interactive terminal; the turn ran and settled, but the client only saw its start and the prompt watchdog later expired. Folded background bash jobs are now published to those clients as well.
205
+
206
+ - The confirmed operator terminal abort (`gjc sdk session raw control <id> --op turn.abort --json-input '{"mode":"terminal","operator":true}' --confirm --idempotency-key <key>`) now reaches TUI and direct CLI sessions, not only sessions the SDK broker launched. Such a host publishes a process-local random marker in its own endpoint registration in the broker-owned session index; the broker echoes exactly that marker and the runtime accepts only its own. The marker is stripped from `session list` and never appears in endpoint discovery or SDK responses. The stopped session's terminal now shows `Turn stopped by a remote operator.` (#7272).
207
+ - An operator abort to a session whose host publishes no operator authority (a gjc that predates the operator route) now fails with `authorization_denied`, outcome `not-applied`, and diagnostic `sdk_operator_control_unsupported`, instead of `endpoint_stale` — which told callers to retry a request that cannot succeed (#7272).
208
+
209
+ - Resolve Ultragoal's default integration bases using explicit local and remote branch refs so same-named tags cannot hide committed changes or provide a false baseline.
210
+
211
+ - Let `gjc update` supersede a pre-promotion activation record left by a failed attempt at an older release instead of failing every later update with `activation_transaction_requires_reconciliation`. The record is superseded only while the installed binary is still the exact recorded baseline (issue #6096).
212
+
213
+ - v1 session migration records each assigned entry id before choosing the next one, so two entries cannot share an id.
214
+
215
+ - Vim edit results frame viewport and diff text as untrusted content, so a repository line cannot close that frame early.
216
+
217
+ - The welcome screen strips terminal controls from LSP server names and file types before drawing them.
218
+
219
+ - Workflow intent tracking is persisted only after the final prompt acceptance check and immediately before execution, so a prompt cancelled during admission, including at the durable-accept fence, no longer leaves a `workflow-intent-diff` entry for work that never started (#7138).
220
+
221
+ - Worktree dependency install refuses a non-exact `packageManager` version before `bun x` can resolve it as a package alias.
222
+
223
+ - Write tool previews strip terminal escapes before syntax highlighting, including when highlighting is off.
224
+
225
+ - The yield tool frames repository output-schema text in its parameter schema after truncation, so that text is not tool-definition instructions.
226
+
5
227
  ## [0.19.0] - 2026-10-22
6
228
 
7
229
  ### Added
@@ -127,6 +127,8 @@ export interface SourceMeta {
127
127
  path: string;
128
128
  /** Whether this came from user-level, project-level, or native config */
129
129
  level: "user" | "project" | "native";
130
+ /** Lifecycle host wrote this file. Caller-selected exact configs omit it. */
131
+ lifecycleOrigin?: boolean;
130
132
  }
131
133
  /**
132
134
  * Merged result from loading a capability across all providers.
@@ -78,6 +78,7 @@ export declare const PUBLIC_COMMAND_DIAGNOSTICS: {
78
78
  readonly sdk_resource_gone: "The requested resource is not available from this session endpoint; this reports absent resource state, not an empty result.";
79
79
  readonly sdk_unknown_operation: "The --op value is not a known SDK operation id for this command. Per-session control ids include turn.prompt, turn.steer, turn.follow_up, turn.abort and turn.abort_and_prompt.";
80
80
  readonly sdk_scope_requires_repository: "The selected session-list scope requires a Git repository. Run inside a checkout, pass --repo <path>, or use --scope cwd or --scope all.";
81
+ readonly sdk_operator_control_unsupported: "The session's host does not publish operator control authority, so the broker did not send the operator abort and nothing was stopped. The host likely runs a gjc release that predates operator control; restart that session with a current gjc. Retrying the same request will not succeed.";
81
82
  readonly router_cleanup_failed: "SDK session Router cleanup failed.";
82
83
  readonly broker_cleanup_failed: "SDK broker client cleanup failed.";
83
84
  readonly lifecycle_idempotency_conflict: "The broker reported an idempotency conflict. Reconcile existing lifecycle state before deciding whether another request is safe.";
@@ -1,3 +1,4 @@
1
+ import { type RuntimeSkillDiscoveryCandidate } from "../extensibility/runtime-skill-discovery";
1
2
  export type SkillsAction = "list" | "read" | "discover";
2
3
  export interface SkillsCommandArgs {
3
4
  action: SkillsAction;
@@ -12,4 +13,10 @@ export interface SkillsCommandArgs {
12
13
  query?: string;
13
14
  };
14
15
  }
16
+ /**
17
+ * One discover text row. Repository name, description, path, and use conditions
18
+ * are flattened to a single line and stripped of terminal controls here, at the
19
+ * last step before stdout, so a skill file cannot inject a control sequence.
20
+ */
21
+ export declare function formatCandidate(candidate: RuntimeSkillDiscoveryCandidate): string;
15
22
  export declare function runSkillsCommand(cmd: SkillsCommandArgs): Promise<void>;
@@ -67,11 +67,11 @@ export declare const CURATED_TIER_LABELS: {
67
67
  readonly "openai-codex/gpt-5.6-terra": readonly [{
68
68
  readonly tier: "fast";
69
69
  readonly effort: "low";
70
- readonly rank: 1;
70
+ readonly rank: 2;
71
71
  }, {
72
72
  readonly tier: "balanced";
73
73
  readonly effort: "medium";
74
- readonly rank: 1;
74
+ readonly rank: 2;
75
75
  }];
76
76
  readonly "openai-codex/gpt-6-sol": readonly [{
77
77
  readonly tier: "strong";
@@ -83,6 +83,15 @@ export declare const CURATED_TIER_LABELS: {
83
83
  readonly effort: "high";
84
84
  readonly rank: 2;
85
85
  }];
86
+ readonly "openai-codex/gpt-6.1-terra": readonly [{
87
+ readonly tier: "fast";
88
+ readonly effort: "medium";
89
+ readonly rank: 1;
90
+ }, {
91
+ readonly tier: "balanced";
92
+ readonly effort: "high";
93
+ readonly rank: 1;
94
+ }];
86
95
  readonly "google/gemini-3.5-flash-lite": readonly [{
87
96
  readonly tier: "fast";
88
97
  readonly rank: 1;
@@ -18169,6 +18178,9 @@ export declare const TIER_MAP_SKIP_LIST: {
18169
18178
  readonly "github-copilot/gpt-6.1-sol": {
18170
18179
  readonly rationale: "models.dev refresh addition; not yet curated";
18171
18180
  };
18181
+ readonly "github-copilot/gpt-6.1-terra": {
18182
+ readonly rationale: "models.dev refresh addition; not yet curated";
18183
+ };
18172
18184
  readonly "kilo/aion-labs/aion-3.5": {
18173
18185
  readonly rationale: "models.dev refresh addition; not yet curated";
18174
18186
  };
@@ -18202,6 +18214,12 @@ export declare const TIER_MAP_SKIP_LIST: {
18202
18214
  readonly "kilo/openai/gpt-6.1-sol-pro": {
18203
18215
  readonly rationale: "models.dev refresh addition; not yet curated";
18204
18216
  };
18217
+ readonly "kilo/openai/gpt-6.1-terra": {
18218
+ readonly rationale: "models.dev refresh addition; not yet curated";
18219
+ };
18220
+ readonly "kilo/openai/gpt-6.1-terra-pro": {
18221
+ readonly rationale: "models.dev refresh addition; not yet curated";
18222
+ };
18205
18223
  readonly "kilo/perceptron/perceptron-mk1.5": {
18206
18224
  readonly rationale: "models.dev refresh addition; not yet curated";
18207
18225
  };
@@ -18238,6 +18256,9 @@ export declare const TIER_MAP_SKIP_LIST: {
18238
18256
  readonly "openai/gpt-6.1-sol": {
18239
18257
  readonly rationale: "models.dev refresh addition; not yet curated";
18240
18258
  };
18259
+ readonly "openai/gpt-6.1-terra": {
18260
+ readonly rationale: "models.dev refresh addition; not yet curated";
18261
+ };
18241
18262
  readonly "openai/gpt-daybreak-blue-latest": {
18242
18263
  readonly rationale: "models.dev refresh addition; not yet curated";
18243
18264
  };
@@ -18328,6 +18349,18 @@ export declare const TIER_MAP_SKIP_LIST: {
18328
18349
  readonly "openrouter/openai/gpt-6.1-sol-pro": {
18329
18350
  readonly rationale: "models.dev refresh addition; not yet curated";
18330
18351
  };
18352
+ readonly "openrouter/openai/gpt-6.1-terra": {
18353
+ readonly rationale: "models.dev refresh addition; not yet curated";
18354
+ };
18355
+ readonly "openrouter/openai/gpt-6.1-terra:batch": {
18356
+ readonly rationale: "models.dev refresh addition; not yet curated";
18357
+ };
18358
+ readonly "openrouter/openai/gpt-6.1-terra-pro": {
18359
+ readonly rationale: "models.dev refresh addition; not yet curated";
18360
+ };
18361
+ readonly "openrouter/openai/gpt-6.1-terra-pro:batch": {
18362
+ readonly rationale: "models.dev refresh addition; not yet curated";
18363
+ };
18331
18364
  readonly "openrouter/openai/gpt-oss-120b:batch": {
18332
18365
  readonly rationale: "models.dev refresh addition; not yet curated";
18333
18366
  };
@@ -18412,6 +18445,12 @@ export declare const TIER_MAP_SKIP_LIST: {
18412
18445
  readonly "vercel-ai-gateway/openai/gpt-6.1-sol-fast": {
18413
18446
  readonly rationale: "models.dev refresh addition; not yet curated";
18414
18447
  };
18448
+ readonly "vercel-ai-gateway/openai/gpt-6.1-terra": {
18449
+ readonly rationale: "models.dev refresh addition; not yet curated";
18450
+ };
18451
+ readonly "vercel-ai-gateway/openai/gpt-6.1-terra-fast": {
18452
+ readonly rationale: "models.dev refresh addition; not yet curated";
18453
+ };
18415
18454
  readonly "zenmux/anthropic/claude-fable-5.1": {
18416
18455
  readonly rationale: "models.dev refresh addition; not yet curated";
18417
18456
  };
@@ -236,9 +236,9 @@ export interface FileLockStagingResult {
236
236
  reason: string;
237
237
  }
238
238
  /** Observe identity before probing; neither a replacement nor a symlink inherits the verdict. */
239
- export declare function inspectFileLockStagingDir(stagingPath: string, probe?: (pid: number) => OwnerLiveness, remove?: boolean): Promise<FileLockStagingResult>;
239
+ export declare function inspectFileLockStagingDir(stagingPath: string, probe?: (pid: number) => OwnerLiveness, remove?: boolean, ownerHostId?: string, previousOwnerHostIds?: readonly string[]): Promise<FileLockStagingResult>;
240
240
  /** Bounded opportunistic cleanup; the acquisition caller treats failures as diagnostic only. */
241
- export declare function reapOrphanedLockStagingDirs(lockPath: string): Promise<{
241
+ export declare function reapOrphanedLockStagingDirs(lockPath: string, options?: Pick<FileLockOptions, "ownerHostId" | "previousOwnerHostIds">): Promise<{
242
242
  removed: string[];
243
243
  retained: FileLockStagingResult[];
244
244
  }>;
@@ -50,6 +50,8 @@ type ModelProfileActivationSession = Pick<AgentSession, "model" | "thinkingLevel
50
50
  getDefaultFallbackRuntimeState?: () => DefaultFallbackRuntimeState;
51
51
  restoreDefaultFallbackRuntimeState?: (state: DefaultFallbackRuntimeState) => void;
52
52
  restoreModelSelectionForRollback?: AgentSession["restoreModelSelectionForRollback"];
53
+ beginModelSelectionUsage?: AgentSession["beginModelSelectionUsage"];
54
+ recordModelSelectionUsage?: AgentSession["recordModelSelectionUsage"];
53
55
  prepareModelSelectionForProfileActivation?: AgentSession["prepareModelSelectionForProfileActivation"];
54
56
  commitPreparedProfileModelSelection?: AgentSession["commitPreparedProfileModelSelection"];
55
57
  finishPreparedProfileModelSelection?: AgentSession["finishPreparedProfileModelSelection"];
@@ -131,6 +133,8 @@ export interface PreparedModelProfileActivation {
131
133
  preparedDefaultModelSelection: Awaited<ReturnType<NonNullable<ModelProfileActivationSession["prepareModelSelectionForProfileActivation"]>>> | undefined;
132
134
  defaultChainPublished: boolean;
133
135
  defaultModelPublished: boolean;
136
+ /** MRU order slot claimed when the reload publication committed the profile DEFAULT. */
137
+ defaultModelPublishedUsageSequence?: number;
134
138
  publishedState: PublishedModelProfileActivationState | undefined;
135
139
  previousDefaultFallbackRuntimeState: DefaultFallbackRuntimeState | undefined;
136
140
  defaultModel: Model<Api> | undefined;
@@ -318,6 +322,13 @@ export declare function rewriteSelectorForProxy(selector: string, proxyProvider:
318
322
  export declare function prepareModelProfileActivation(options: PrepareModelProfileActivationOptions): Promise<PreparedModelProfileActivation>;
319
323
  /** Publish the prepared model selection and role layer without awaiting. */
320
324
  export declare function publishPreparedModelProfileActivation(prepared: PreparedModelProfileActivation, options?: Pick<ApplyModelProfileActivationOptions, "preserveDefaultModelSelection" | "preserveLiveModelSelection">): void;
325
+ /**
326
+ * Record a published profile DEFAULT in the model usage order. Call synchronously
327
+ * once the enclosing publication finalized, before any await: a user selection
328
+ * made while a later step (such as a consumer lease) is pending must stay the
329
+ * most recent usage instead of being overtaken by this older profile choice.
330
+ */
331
+ export declare function recordPublishedModelProfileActivationUsage(prepared: PreparedModelProfileActivation): void;
321
332
  export declare function finishPreparedModelProfileActivation(prepared: PreparedModelProfileActivation): Promise<void>;
322
333
  export declare function applyPreparedModelProfileActivation(prepared: PreparedModelProfileActivation, options?: ApplyModelProfileActivationOptions): Promise<void>;
323
334
  /** Restore an applied activation when its enclosing settings/registry commit fails. */
@@ -1908,7 +1908,7 @@ export declare const SETTINGS_SCHEMA: {
1908
1908
  readonly ui: {
1909
1909
  readonly tab: "interaction";
1910
1910
  readonly label: "Prompt Suggestions";
1911
- readonly description: "Predict your likely next prompt after each turn (one extra default-role model call) and show it as ghost text; Tab accepts";
1911
+ readonly description: "Predict your likely next message after each completed turn (one extra call to the session model with the full conversation) and show it as ghost text; Tab accepts, Esc dismisses";
1912
1912
  };
1913
1913
  };
1914
1914
  readonly "startup.quiet": {
@@ -1,3 +1,4 @@
1
+ import { type AddressResolver } from "../web/insane/url-guard";
1
2
  /**
2
3
  * Opt-in webhook delivery of existing coordinator `watch_events` journal rows
3
4
  * (issue #4706). Delivery is a durable outbox keyed by the journal row's stable
@@ -31,11 +32,14 @@ export interface WebhookDelivery {
31
32
  now(): number;
32
33
  }
33
34
  /** Default `WebhookDelivery` over `fetch`: POST, 2xx = ok, no redirects, abort on timeout. */
34
- export declare function createDefaultEventWebhookDelivery(): WebhookDelivery;
35
+ export declare function createDefaultEventWebhookDelivery(hooks?: {
36
+ resolver?: AddressResolver;
37
+ }): WebhookDelivery;
35
38
  export declare const DEFAULT_EVENT_WEBHOOK_TIMEOUT_MS = 5000;
36
39
  export declare const MAX_EVENT_WEBHOOK_TIMEOUT_MS = 30000;
37
40
  export declare const DEFAULT_EVENT_WEBHOOK_MAX_ATTEMPTS = 5;
38
41
  export declare const MAX_EVENT_WEBHOOK_MAX_ATTEMPTS = 10;
42
+ export declare function isLoopbackHttpWebhook(rawUrl: string): boolean;
39
43
  export declare function parseEventWebhookConfig(explicitEnv?: NodeJS.ProcessEnv): EventWebhookConfig | null;
40
44
  /**
41
45
  * Records the row in the durable outbox and, unless the row is already
@@ -5,8 +5,8 @@
5
5
  * is explicitly **not** a parseable database. The field corpus contains at least
6
6
  * one interleaved record (two headers merged onto one line), and throwable text
7
7
  * is arbitrary multiline content. Recovery therefore trusts only a complete
8
- * v1 record whose terminal identity line matches a fingerprint recomputed from
9
- * that record's own header and stack.
8
+ * record whose terminal identity line matches a fingerprint recomputed from
9
+ * that record's own header and stack using the marker's supported version.
10
10
  *
11
11
  * Records written before that line existed are `unmatchable` and are never
12
12
  * offered for reporting — no retroactive mining is attempted or claimed.
@@ -26,7 +26,7 @@ export interface LoadedCrashRecord {
26
26
  readonly provenance?: CrashProvenance;
27
27
  }
28
28
  export declare function parseCrashRecords(contents: string): LoadedCrashRecord[];
29
- /** Complete v1 records whose marker fingerprint is recomputed from their diagnostic text. */
29
+ /** Complete records with supported marker versions and fingerprints recomputed from their diagnostic text. */
30
30
  export declare function parseRecoverableCrashRecords(contents: string): LoadedCrashRecord[];
31
31
  /** Newest identity-bearing record for a fingerprint, or `undefined` when unmatchable. */
32
32
  export declare function findLatestRecord(contents: string, fingerprint: string): LoadedCrashRecord | undefined;
@@ -6,6 +6,7 @@ export interface CrashEventFrame {
6
6
  export interface BuildCrashEnvelopeInput {
7
7
  readonly eventId: string;
8
8
  readonly fingerprint: string;
9
+ readonly fpv: number;
9
10
  readonly errorName: string;
10
11
  readonly messageClass: string;
11
12
  readonly frames: readonly CrashEventFrame[];
@@ -315,6 +315,11 @@ export declare function canonicalizePathWithinHome(ctx: Pick<LoadContext, "home"
315
315
  * an ordinary load may contain external install roots that an isolated load
316
316
  * must reject, and reusing that result would cross the home boundary.
317
317
  */
318
+ /** Reject install paths inside the registry owner's tree. Windows components use the parent directory's case rule. */
319
+ export declare function projectRegistryInstallPathIsInsideAnchor(projectAnchor: string, installPath: string, options?: {
320
+ platform?: NodeJS.Platform;
321
+ sensitivity?: (directory: string) => boolean;
322
+ }): boolean;
318
323
  export declare function listClaudePluginRoots(home: string, cwd?: string, isolatedHome?: boolean, homeIdentity?: FileIdentity): Promise<{
319
324
  roots: ClaudePluginRoot[];
320
325
  warnings: string[];
@@ -344,7 +344,7 @@ export interface ExtensionContext {
344
344
  getProjectProgress?(): Promise<ProjectProgressSnapshot>;
345
345
  /** Subscribe to foreground-wait folds (`bash_folded`). Returns an unsubscribe function. */
346
346
  onJobFold?(listener: (event: JobFoldEvent) => void): () => void;
347
- /** Observe session events synchronously in producer order. Returns an unsubscribe function. */
347
+ /** Observe live session events synchronously in producer order, without consuming queued startup fallback notices. */
348
348
  onSessionEvent?(listener: AgentSessionEventListener): () => void;
349
349
  /** Typed skill and mode controls exposed to the SDK host. */
350
350
  invokeSkill?(name: string, args?: string, options?: {
@@ -8,8 +8,10 @@
8
8
  * Read/write functions accept explicit file paths so callers control the
9
9
  * location. Path helpers compute the default paths from the dir singleton.
10
10
  *
11
- * Both use atomic write (tmp + rename). On Windows, rename over existing file
12
- * can fail with EPERM — fallback: unlink target then rename.
11
+ * Both use atomic write (exclusive tmp + rename). A symlink, hard link, or
12
+ * other non-directory at the temp path is removed, not followed. On Windows,
13
+ * rename over an existing file can fail with EPERM — fallback: unlink target
14
+ * then rename.
13
15
  */
14
16
  import type { InstalledPluginEntry, InstalledPluginsRegistry, MarketplaceRegistryEntry, MarketplacesRegistry } from "./types";
15
17
  export declare function getMarketplacesRegistryPath(): string;
@@ -94,4 +94,12 @@ export interface ParsedSkillInvocation {
94
94
  }
95
95
  export declare function parseSkillInvocations(text: string, skillsByCommandName: ReadonlyMap<string, Skill>): ParsedSkillInvocation[];
96
96
  export declare function resolveSkillSlashCommands(skills: readonly Skill[], _reservedDirectCommandNames: ReadonlySet<string>): ResolvedSkillSlashCommand[];
97
+ /**
98
+ * Reserve the fence inside `cap`, then keep the body and host suffix.
99
+ * The attacker-sized body is bounded before `wrapUntrustedContent` runs once.
100
+ */
101
+ export declare function frameSkillPromptWithinCap(body: string, suffix: string, cap?: number): {
102
+ message: string;
103
+ retained: string;
104
+ };
97
105
  export declare function buildSkillPromptMessage(skill: Pick<Skill, "name" | "filePath" | "content" | "loadContent">, args: string, context?: BuildSkillPromptMessageContext): Promise<BuiltSkillPromptMessage>;
@@ -25,6 +25,8 @@ export declare function clearMemoryData(agentDir: string, cwd: string): Promise<
25
25
  * Force-enqueue global consolidation maintenance work.
26
26
  */
27
27
  export declare function enqueueMemoryConsolidation(agentDir: string, cwd: string, sourceUpdatedAt?: number): void;
28
+ /** Test seam for the rollout summary path gate. */
29
+ export declare function rolloutSummaryDestinationForTesting(summariesDir: string, threadId: string, rolloutSlug: string | null): string | undefined;
28
30
  /** Secret scrubbing applied to every phase-2 consolidation output. Test seam. */
29
31
  export declare function redactMemorySecretsForTesting(input: string): string;
30
32
  export declare function getMemoryRoot(agentDir: string, cwd: string): string;
@@ -12,13 +12,15 @@ export interface Adapter {
12
12
  collect(options: AdapterOptions): Promise<AdapterResult>;
13
13
  }
14
14
  export declare function getAdapter(source: MigrateSource): Adapter;
15
+ /** Lexical containment after `path.resolve`. Symlink checks are separate. */
16
+ export declare function migrateSourceInsideRoot(root: string, target: string): boolean;
15
17
  /** Collect one source instruction file without interpreting or rewriting its content. */
16
- export declare function collectInstructionFile(filePath: string, source: MigrateSource): Promise<{
18
+ export declare function collectInstructionFile(filePath: string, source: MigrateSource, root?: string): Promise<{
17
19
  candidates: InstructionCandidate[];
18
20
  diagnostics: SourceDiagnostic[];
19
21
  }>;
20
22
  /** Read a text file, classifying absence/IO errors into source diagnostics. */
21
- export declare function readSourceText(filePath: string, source: MigrateSource, type: SourceDiagnostic["type"]): Promise<{
23
+ export declare function readSourceText(filePath: string, source: MigrateSource, type: SourceDiagnostic["type"], root?: string): Promise<{
22
24
  text: string;
23
25
  } | {
24
26
  diagnostic: SourceDiagnostic;
@@ -27,7 +29,7 @@ export declare function readSourceText(filePath: string, source: MigrateSource,
27
29
  * Read an optional settings file. A missing file is expected (most setups do not
28
30
  * have every settings file), so unlike `readSourceText` it produces no diagnostic.
29
31
  */
30
- export declare function readOptionalJson(filePath: string, source: MigrateSource, type: SourceDiagnostic["type"]): Promise<{
32
+ export declare function readOptionalJson(filePath: string, source: MigrateSource, type: SourceDiagnostic["type"], root?: string): Promise<{
31
33
  data: Record<string, unknown>;
32
34
  } | {
33
35
  diagnostic: SourceDiagnostic;
@@ -44,7 +46,7 @@ export declare function parseSourceJson(text: string, filePath: string, source:
44
46
  * Collect skill candidates from a directory of `<name>/SKILL.md` entries.
45
47
  * A missing directory yields a `skipped_absent_source` diagnostic.
46
48
  */
47
- export declare function collectSkillDir(dir: string, source: MigrateSource): Promise<{
49
+ export declare function collectSkillDir(dir: string, source: MigrateSource, root?: string): Promise<{
48
50
  candidates: SkillCandidate[];
49
51
  diagnostics: SourceDiagnostic[];
50
52
  }>;
@@ -62,7 +64,7 @@ export declare const PROTECTED_AGENT_NAMES: ReadonlySet<string>;
62
64
  * rewritten so the loaded name matches the destination file name, and tool lists
63
65
  * are translated to GJC tools.
64
66
  */
65
- export declare function collectMarkdownAgents(dir: string, source: MigrateSource): Promise<{
67
+ export declare function collectMarkdownAgents(dir: string, source: MigrateSource, root?: string): Promise<{
66
68
  candidates: AgentCandidate[];
67
69
  diagnostics: SourceDiagnostic[];
68
70
  }>;
@@ -72,6 +74,7 @@ export declare function collectMarkdownAgents(dir: string, source: MigrateSource
72
74
  */
73
75
  export declare function collectMarkdownCommands(dir: string, source: MigrateSource, options?: {
74
76
  recursive?: boolean;
77
+ root?: string;
75
78
  }): Promise<{
76
79
  candidates: SlashCommandCandidate[];
77
80
  diagnostics: SourceDiagnostic[];
@@ -7,6 +7,7 @@ export interface OAuthSelectorAccountOptions {
7
7
  onAccountSelect?: (selector: AuthCredentialSelector) => void | Promise<void>;
8
8
  onAutoSelect?: () => void | Promise<void>;
9
9
  onAddAccount?: () => void | Promise<void>;
10
+ onReloginAccount?: (id: number) => void | Promise<void>;
10
11
  onAccountRemove?: (targets: readonly CredentialRemovalTarget[]) => void | Promise<void>;
11
12
  }
12
13
  /** Component that renders an OAuth provider selector or a provider-scoped account selector. */
@@ -7,9 +7,9 @@
7
7
  * - Feature toggles
8
8
  * - Config value editor
9
9
  */
10
- import { Container } from "@gajae-code/tui";
10
+ import { Container, type SettingItem } from "@gajae-code/tui";
11
11
  import { PluginManager } from "../../extensibility/plugins/manager";
12
- import type { InstalledPlugin } from "../../extensibility/plugins/types";
12
+ import type { InstalledPlugin, PluginSettingSchema } from "../../extensibility/plugins/types";
13
13
  /**
14
14
  * Forwards a keystroke to `input`, but cancels via `onCancel` when the user presses Escape.
15
15
  */
@@ -51,6 +51,8 @@ export declare class PluginDetailComponent extends Container {
51
51
  constructor(plugin: InstalledPlugin, manager: PluginManager, callbacks: PluginDetailCallbacks);
52
52
  handleInput(data: string): void;
53
53
  }
54
+ export declare function commitPluginConfigValue(stored: string, submitted: string, type: PluginSettingSchema["type"], edited: boolean): unknown;
55
+ export declare function createPluginTextSubmenu(key: string, schema: PluginSettingSchema, onConfigChange: (key: string, value: unknown) => void): NonNullable<SettingItem["submenu"]>;
54
56
  export interface PluginSettingsCallbacks {
55
57
  onClose: () => void;
56
58
  onPluginChanged: () => void;