@gajae-code/coding-agent 0.18.12 → 0.19.0

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 (305) hide show
  1. package/CHANGELOG.md +467 -0
  2. package/dist/types/capability/rule.d.ts +7 -2
  3. package/dist/types/cli/append-system-prompt.d.ts +6 -0
  4. package/dist/types/cli/args.d.ts +7 -2
  5. package/dist/types/cli/customize-doctor-precedence.d.ts +16 -0
  6. package/dist/types/cli/customize-doctor.d.ts +4 -3
  7. package/dist/types/cli/public-command-errors.d.ts +1 -0
  8. package/dist/types/cli/root-flags.d.ts +0 -12
  9. package/dist/types/cli/update-cli.d.ts +7 -2
  10. package/dist/types/cli-main.d.ts +0 -6
  11. package/dist/types/commands/launch.d.ts +0 -6
  12. package/dist/types/commands/migrate.d.ts +1 -1
  13. package/dist/types/commands/sdk.d.ts +8 -0
  14. package/dist/types/commit/map-reduce/index.d.ts +4 -4
  15. package/dist/types/config/autorouting-tier-map.d.ts +23 -1
  16. package/dist/types/config/config-hot-reload.d.ts +5 -0
  17. package/dist/types/config/file-lock.d.ts +44 -2
  18. package/dist/types/config/model-profile-activation.d.ts +19 -5
  19. package/dist/types/config/model-registry.d.ts +16 -3
  20. package/dist/types/config/model-resolver.d.ts +5 -4
  21. package/dist/types/config/settings-schema.d.ts +11 -1
  22. package/dist/types/coordinator-mcp/server.d.ts +4 -0
  23. package/dist/types/customization/import.d.ts +2 -0
  24. package/dist/types/customization/types.d.ts +1 -1
  25. package/dist/types/dap/session.d.ts +11 -2
  26. package/dist/types/discovery/helpers.d.ts +7 -2
  27. package/dist/types/edit/index.d.ts +5 -0
  28. package/dist/types/edit/modes/patch.d.ts +9 -0
  29. package/dist/types/eval/py/runtime.d.ts +9 -0
  30. package/dist/types/export/ttsr.d.ts +19 -0
  31. package/dist/types/extensibility/extensions/types.d.ts +5 -1
  32. package/dist/types/extensibility/slash-commands.d.ts +1 -0
  33. package/dist/types/gjc-runtime/ralplan-current-final.d.ts +54 -0
  34. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +5 -0
  35. package/dist/types/gjc-runtime/tmux-sessions.d.ts +24 -0
  36. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +6 -0
  37. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
  38. package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
  39. package/dist/types/hindsight/content.d.ts +5 -6
  40. package/dist/types/internal-urls/types.d.ts +2 -0
  41. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -4
  42. package/dist/types/main.d.ts +23 -18
  43. package/dist/types/migrate/action-planner.d.ts +10 -1
  44. package/dist/types/migrate/adapters/codex.d.ts +1 -1
  45. package/dist/types/migrate/adapters/index.d.ts +35 -3
  46. package/dist/types/migrate/hook-module.d.ts +23 -0
  47. package/dist/types/migrate/report.d.ts +2 -1
  48. package/dist/types/migrate/types.d.ts +69 -2
  49. package/dist/types/modes/components/agent-dashboard.d.ts +1 -1
  50. package/dist/types/modes/components/model-selector.d.ts +43 -0
  51. package/dist/types/modes/prompt-suggestion-controller.d.ts +1 -1
  52. package/dist/types/modes/utils/host-status.d.ts +15 -11
  53. package/dist/types/runtime-mcp/project-host-values.d.ts +11 -5
  54. package/dist/types/sdk/broker/broker-exit.d.ts +1 -1
  55. package/dist/types/sdk/broker/broker.d.ts +22 -1
  56. package/dist/types/sdk/broker/ensure.d.ts +5 -2
  57. package/dist/types/sdk/broker/hop.d.ts +9 -0
  58. package/dist/types/sdk/broker/lifecycle.d.ts +22 -0
  59. package/dist/types/sdk/broker/session-index.d.ts +2 -0
  60. package/dist/types/sdk/broker/transport.d.ts +2 -0
  61. package/dist/types/sdk/bus/index.d.ts +21 -0
  62. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +7 -1
  63. package/dist/types/sdk/bus/telegram-daemon.d.ts +2 -0
  64. package/dist/types/sdk/bus/threaded-render.d.ts +2 -1
  65. package/dist/types/sdk/host/control/operations.d.ts +5 -1
  66. package/dist/types/sdk/host/events.d.ts +4 -0
  67. package/dist/types/sdk/host/host.d.ts +2 -1
  68. package/dist/types/sdk/host/prompt-image-upload.d.ts +43 -0
  69. package/dist/types/sdk/host/session-runtime.d.ts +8 -8
  70. package/dist/types/sdk/host/surface-policy.d.ts +2 -1
  71. package/dist/types/sdk/lifecycle/service.d.ts +12 -0
  72. package/dist/types/sdk/prompt-status.d.ts +11 -4
  73. package/dist/types/session/agent-session.d.ts +50 -8
  74. package/dist/types/session/session-manager.d.ts +16 -0
  75. package/dist/types/skill-state/workflow-mutation-guard.d.ts +13 -1
  76. package/dist/types/slash-commands/helpers/mcp.d.ts +5 -0
  77. package/dist/types/ssh/ssh-executor.d.ts +8 -1
  78. package/dist/types/system-prompt.d.ts +3 -2
  79. package/dist/types/task/role-body.d.ts +11 -0
  80. package/dist/types/tools/awaiting-input.d.ts +28 -0
  81. package/dist/types/tools/bash-allowed-prefixes.d.ts +6 -0
  82. package/dist/types/tools/bash-skill-urls.d.ts +4 -0
  83. package/dist/types/tools/bash.d.ts +7 -0
  84. package/dist/types/tools/descriptors.d.ts +13 -2
  85. package/dist/types/tools/fetch.d.ts +6 -0
  86. package/dist/types/tools/irc.d.ts +5 -3
  87. package/dist/types/tools/tmux-self-injection-guard.d.ts +2 -0
  88. package/dist/types/tools/ultragoal-ask-guard.d.ts +1 -1
  89. package/dist/types/tools/write.d.ts +2 -0
  90. package/dist/types/utils/file-mentions.d.ts +5 -0
  91. package/dist/types/utils/image-limits.d.ts +7 -0
  92. package/dist/types/utils/image-loading.d.ts +0 -1
  93. package/dist/types/utils/open.d.ts +0 -1
  94. package/dist/types/utils/pasted-image-loading.d.ts +1 -5
  95. package/dist/types/utils/prompt-suggestion.d.ts +2 -2
  96. package/dist/types/utils/shell-snapshot.d.ts +2 -0
  97. package/dist/types/utils/title-generator.d.ts +13 -3
  98. package/dist/types/web/search/providers/codex.d.ts +6 -7
  99. package/package.json +9 -8
  100. package/scripts/acp-conformance-agent.ts +12 -2
  101. package/scripts/generate-sdk-operation-inventory.ts +16 -0
  102. package/src/capability/fs.ts +31 -3
  103. package/src/capability/rule.ts +11 -2
  104. package/src/cli/append-system-prompt.ts +12 -0
  105. package/src/cli/args.ts +11 -7
  106. package/src/cli/customize-doctor-precedence.ts +31 -0
  107. package/src/cli/customize-doctor.ts +49 -39
  108. package/src/cli/fast-help.ts +0 -2
  109. package/src/cli/migrate-cli.ts +14 -3
  110. package/src/cli/public-command-errors.ts +2 -0
  111. package/src/cli/root-flags.ts +0 -2
  112. package/src/cli/update-cli.ts +247 -6
  113. package/src/commands/harness.ts +25 -15
  114. package/src/commands/migrate.ts +3 -3
  115. package/src/commands/sdk.ts +81 -11
  116. package/src/commit/agentic/agent.ts +6 -6
  117. package/src/commit/analysis/conventional.ts +14 -5
  118. package/src/commit/map-reduce/index.ts +7 -7
  119. package/src/commit/pipeline.ts +12 -12
  120. package/src/config/autorouting-tier-map.ts +20 -1
  121. package/src/config/config-file.ts +106 -3
  122. package/src/config/config-hot-reload.ts +8 -0
  123. package/src/config/file-lock.ts +1431 -304
  124. package/src/config/keybindings.ts +154 -7
  125. package/src/config/model-profile-activation.ts +177 -39
  126. package/src/config/model-registry.ts +380 -55
  127. package/src/config/model-resolver.ts +49 -21
  128. package/src/config/settings-schema.ts +13 -1
  129. package/src/config/settings.ts +2 -0
  130. package/src/coordinator-mcp/server.ts +37 -2
  131. package/src/crash/sanitize.ts +3 -1
  132. package/src/customization/import.ts +276 -7
  133. package/src/customization/inventory.ts +24 -8
  134. package/src/customization/types.ts +1 -0
  135. package/src/dap/client.ts +3 -2
  136. package/src/dap/session.ts +161 -36
  137. package/src/debug/crash-diagnostics.ts +87 -5
  138. package/src/debug/report-bundle.ts +71 -2
  139. package/src/discovery/builtin.ts +4 -3
  140. package/src/discovery/helpers.ts +24 -14
  141. package/src/edit/index.ts +191 -5
  142. package/src/edit/modes/patch.ts +27 -0
  143. package/src/eval/py/runtime.ts +44 -4
  144. package/src/exec/non-interactive-env.ts +0 -1
  145. package/src/export/html/index.ts +60 -20
  146. package/src/export/ttsr.ts +176 -1
  147. package/src/extensibility/extensions/loader.ts +2 -0
  148. package/src/extensibility/extensions/ouroboros-ooo-bridge.ts +63 -1
  149. package/src/extensibility/extensions/types.ts +5 -1
  150. package/src/extensibility/hooks/loader.ts +10 -2
  151. package/src/extensibility/plugins/marketplace/manager.ts +36 -10
  152. package/src/extensibility/slash-commands.ts +5 -0
  153. package/src/gjc-runtime/gc-runtime.ts +4 -1
  154. package/src/gjc-runtime/launch-tmux.ts +23 -13
  155. package/src/gjc-runtime/ralplan-current-final.ts +294 -0
  156. package/src/gjc-runtime/ralplan-runtime.ts +95 -1
  157. package/src/gjc-runtime/state-writer.ts +109 -5
  158. package/src/gjc-runtime/tmux-sessions.ts +93 -13
  159. package/src/gjc-runtime/ultragoal-change-set.ts +90 -11
  160. package/src/gjc-runtime/ultragoal-guard.ts +9 -1
  161. package/src/gjc-runtime/ultragoal-runtime.ts +15 -5
  162. package/src/harness-control-plane/finalize.ts +11 -0
  163. package/src/harness-control-plane/receipt-spool.ts +105 -28
  164. package/src/harness-control-plane/storage.ts +124 -6
  165. package/src/hindsight/content.ts +116 -16
  166. package/src/hindsight/mental-models.ts +22 -10
  167. package/src/hindsight/state.ts +7 -4
  168. package/src/hooks/native-skill-hook.ts +3 -1
  169. package/src/internal-urls/artifact-protocol.ts +3 -1
  170. package/src/internal-urls/docs-index.generated.ts +14 -14
  171. package/src/internal-urls/local-protocol.ts +28 -3
  172. package/src/internal-urls/types.ts +2 -0
  173. package/src/lsp/client.ts +2 -1
  174. package/src/lsp/clients/biome-client.ts +2 -0
  175. package/src/lsp/clients/swiftlint-client.ts +2 -0
  176. package/src/main.ts +330 -92
  177. package/src/memories/index.ts +25 -2
  178. package/src/migrate/action-planner.ts +517 -2
  179. package/src/migrate/adapters/claude-code.ts +141 -3
  180. package/src/migrate/adapters/codex.ts +57 -5
  181. package/src/migrate/adapters/index.ts +240 -5
  182. package/src/migrate/adapters/opencode.ts +4 -0
  183. package/src/migrate/executor.ts +141 -3
  184. package/src/migrate/hook-module.ts +193 -0
  185. package/src/migrate/report.ts +45 -1
  186. package/src/migrate/types.ts +73 -3
  187. package/src/modes/acp/acp-agent.ts +10 -1
  188. package/src/modes/components/agent-dashboard.ts +20 -4
  189. package/src/modes/components/customization/customization-dashboard.ts +7 -0
  190. package/src/modes/components/customization/import-wizard.ts +29 -3
  191. package/src/modes/components/model-selector.ts +157 -103
  192. package/src/modes/components/welcome.ts +3 -1
  193. package/src/modes/controllers/command-controller.ts +271 -16
  194. package/src/modes/controllers/event-controller.ts +1 -1
  195. package/src/modes/controllers/extension-ui-controller.ts +31 -1
  196. package/src/modes/controllers/goal-mode-controller.ts +79 -10
  197. package/src/modes/controllers/input-controller.ts +2 -0
  198. package/src/modes/controllers/plan-mode-controller.ts +49 -4
  199. package/src/modes/controllers/runtime-mcp-command-controller.ts +7 -6
  200. package/src/modes/controllers/selector-controller.ts +14 -1
  201. package/src/modes/interactive-mode.ts +55 -4
  202. package/src/modes/prompt-suggestion-controller.ts +1 -1
  203. package/src/modes/runtime-init.ts +5 -1
  204. package/src/modes/utils/host-status.ts +21 -10
  205. package/src/prompts/agent-fragments/browser-aside.md +2 -2
  206. package/src/prompts/system/irc-incoming.md +3 -1
  207. package/src/prompts/tools/irc.md +1 -1
  208. package/src/runtime-mcp/manager.ts +8 -3
  209. package/src/runtime-mcp/project-host-values.ts +12 -8
  210. package/src/runtime-mcp/tool-bridge.ts +68 -4
  211. package/src/runtime-mcp/transports/stdio.ts +2 -1
  212. package/src/sdk/broker/broker-exit.ts +2 -0
  213. package/src/sdk/broker/broker.ts +143 -4
  214. package/src/sdk/broker/ensure.ts +74 -6
  215. package/src/sdk/broker/hop.ts +13 -1
  216. package/src/sdk/broker/lifecycle-ledger.ts +3 -0
  217. package/src/sdk/broker/lifecycle.ts +102 -6
  218. package/src/sdk/broker/session-index.ts +29 -4
  219. package/src/sdk/broker/transport.ts +17 -1
  220. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  221. package/src/sdk/bus/index.ts +408 -14
  222. package/src/sdk/bus/session-control.ts +2 -0
  223. package/src/sdk/bus/slack-daemon.ts +105 -9
  224. package/src/sdk/bus/telegram-daemon-contract.ts +7 -1
  225. package/src/sdk/bus/telegram-daemon.ts +10 -2
  226. package/src/sdk/bus/threaded-render.ts +20 -1
  227. package/src/sdk/cli/session-cli.ts +2 -0
  228. package/src/sdk/host/control/dispatch.ts +13 -1
  229. package/src/sdk/host/control/operations.ts +10 -1
  230. package/src/sdk/host/events.ts +67 -4
  231. package/src/sdk/host/host.ts +8 -2
  232. package/src/sdk/host/prompt-image-upload.ts +438 -0
  233. package/src/sdk/host/sdk-surface-parity.test.ts +15 -0
  234. package/src/sdk/host/session-runtime.test.ts +1537 -24
  235. package/src/sdk/host/session-runtime.ts +332 -36
  236. package/src/sdk/host/surface-policy.ts +4 -0
  237. package/src/sdk/host/websocket-transport.lifecycle.test.ts +90 -2
  238. package/src/sdk/host/websocket-transport.ts +19 -7
  239. package/src/sdk/lifecycle/service.ts +14 -1
  240. package/src/sdk/prompt-status.ts +6 -4
  241. package/src/sdk/protocol/adapter-validation.ts +28 -1
  242. package/src/sdk/protocol/operation-inventory.generated.json +160 -0
  243. package/src/sdk/protocol/operation-registry.ts +33 -3
  244. package/src/sdk/session.ts +123 -36
  245. package/src/session/agent-session.ts +1614 -329
  246. package/src/session/history-storage.ts +182 -12
  247. package/src/session/internal/managed-session-scope.ts +47 -18
  248. package/src/session/internal/managed-session-storage.ts +71 -1
  249. package/src/session/session-manager.ts +90 -5
  250. package/src/session-import/redact.ts +53 -2
  251. package/src/skill-state/workflow-mutation-guard.ts +1498 -18
  252. package/src/slash-commands/builtin-registry.ts +6 -3
  253. package/src/slash-commands/helpers/mcp.ts +11 -3
  254. package/src/ssh/ssh-executor.ts +9 -2
  255. package/src/stt/recorder.ts +26 -9
  256. package/src/system-prompt.ts +61 -16
  257. package/src/task/executor.ts +12 -8
  258. package/src/task/role-body.ts +84 -0
  259. package/src/task/token-log-mode.test.ts +162 -0
  260. package/src/task/token-log.ts +91 -2
  261. package/src/tools/archive-reader.ts +650 -37
  262. package/src/tools/ask.ts +1 -0
  263. package/src/tools/ast-grep.ts +7 -2
  264. package/src/tools/auto-generated-guard.ts +12 -3
  265. package/src/tools/awaiting-input.ts +114 -0
  266. package/src/tools/bash-allowed-prefixes.ts +61 -1
  267. package/src/tools/bash-skill-urls.ts +58 -5
  268. package/src/tools/bash.ts +99 -26
  269. package/src/tools/browser/tab-worker.ts +39 -13
  270. package/src/tools/browser.ts +17 -7
  271. package/src/tools/cron.ts +10 -1
  272. package/src/tools/debug.ts +9 -2
  273. package/src/tools/descriptors.test.ts +4 -4
  274. package/src/tools/descriptors.ts +16 -4
  275. package/src/tools/eval.ts +15 -0
  276. package/src/tools/fetch.ts +90 -2
  277. package/src/tools/gh.ts +27 -12
  278. package/src/tools/image-gen.ts +20 -6
  279. package/src/tools/irc.ts +5 -3
  280. package/src/tools/monitor.ts +9 -1
  281. package/src/tools/output-meta.ts +51 -3
  282. package/src/tools/read.ts +9 -2
  283. package/src/tools/recipe/runner.ts +23 -12
  284. package/src/tools/render-utils.ts +2 -2
  285. package/src/tools/search.ts +3 -2
  286. package/src/tools/ssh.ts +274 -8
  287. package/src/tools/subagent.ts +10 -4
  288. package/src/tools/tmux-self-injection-guard.ts +3301 -122
  289. package/src/tools/tool-catalog.generated.ts +1 -1
  290. package/src/tools/ultragoal-ask-guard.ts +13 -1
  291. package/src/tools/write.ts +7 -0
  292. package/src/tui/tree-list.ts +15 -1
  293. package/src/utils/commit-message-generator.ts +3 -2
  294. package/src/utils/external-editor.ts +21 -7
  295. package/src/utils/file-mentions.ts +46 -6
  296. package/src/utils/git.ts +38 -7
  297. package/src/utils/image-limits.ts +8 -0
  298. package/src/utils/image-loading.ts +1 -1
  299. package/src/utils/open.ts +73 -4
  300. package/src/utils/pasted-image-loading.ts +9 -8
  301. package/src/utils/prompt-suggestion.ts +5 -4
  302. package/src/utils/shell-snapshot.ts +9 -1
  303. package/src/utils/title-generator.ts +65 -20
  304. package/src/web/search/index.ts +2 -1
  305. package/src/web/search/providers/codex.ts +29 -32
@@ -5,10 +5,53 @@ import { type AutoroutingSetup } from "../../config/autorouting-contract";
5
5
  import type { GjcModelAssignmentTargetId, ModelRegistry } from "../../config/model-registry";
6
6
  import { type ScopedModelSelection } from "../../config/model-resolver";
7
7
  import type { ModelProfileConfig } from "../../config/models-config-schema";
8
+ import { type ProviderAuthState } from "../../config/provider-ranking";
8
9
  import type { Settings } from "../../config/settings";
9
10
  import type { SmartRoutingIntent, SmartRoutingPreview } from "./smart-routing-panel";
10
11
  import { SmartRoutingPanelComponent } from "./smart-routing-panel";
12
+ export declare function assignFuzzyScoresToModels(items: ModelItem[], query: string): void;
13
+ /**
14
+ * Compute and assign fuzzy scores to canonical model items based on a query.
15
+ */
16
+ export declare function assignFuzzyScoresToCanonicalModels(items: CanonicalModelItem[], query: string): void;
17
+ export interface RankedModelOrderContext {
18
+ roles: RoleAssignments;
19
+ mruIndex: ReadonlyMap<string, number>;
20
+ providerAuthStateById: ReadonlyMap<string, ProviderAuthState>;
21
+ }
22
+ /** Ranking shared by the provider view: fuzzy quality, default, MRU, provider, recency. */
23
+ export declare function compareModelItemsForRanking(a: ModelItem, b: ModelItem, context: RankedModelOrderContext): number;
24
+ /** Ranking shared by the canonical view: fuzzy quality, default, MRU, provider, then id. */
25
+ export declare function compareCanonicalModelItemsForRanking(a: CanonicalModelItem, b: CanonicalModelItem, context: RankedModelOrderContext): number;
26
+ interface ModelItem {
27
+ kind: "provider";
28
+ provider: string;
29
+ id: string;
30
+ model: Model;
31
+ selector: string;
32
+ thinkingLevel?: ThinkingLevel;
33
+ explicitThinkingLevel?: boolean;
34
+ fuzzyScore?: number;
35
+ }
36
+ interface CanonicalModelItem {
37
+ kind: "canonical";
38
+ id: string;
39
+ model: Model;
40
+ selector: string;
41
+ variantCount: number;
42
+ searchText: string;
43
+ normalizedSearchText: string;
44
+ compactSearchText: string;
45
+ thinkingLevel?: ThinkingLevel;
46
+ explicitThinkingLevel?: boolean;
47
+ fuzzyScore?: number;
48
+ }
11
49
  type ScopedModelItem = ScopedModelSelection;
50
+ interface RoleAssignment {
51
+ model: Model;
52
+ thinkingLevel: ThinkingLevel;
53
+ }
54
+ type RoleAssignments = Record<string, RoleAssignment | undefined>;
12
55
  export type ModelSelectorSelection = {
13
56
  kind: "assignment";
14
57
  model: Model;
@@ -3,7 +3,7 @@ import type { InteractiveModeContext } from "./types";
3
3
  * Owns the ghost-text next-prompt prediction lifecycle for interactive mode.
4
4
  *
5
5
  * After each agent turn ends (and only when `promptSuggestions` is enabled
6
- * and the composer is empty), a smol-model prediction of the user's next
6
+ * and the composer is empty), a model prediction of the user's next
7
7
  * prompt is generated in the background. The result renders as dim ghost
8
8
  * text in the empty composer via the autocomplete provider's inline hint;
9
9
  * Tab accepts it, typing dismisses it, and a new turn clears it.
@@ -1,23 +1,27 @@
1
1
  /**
2
2
  * Host-terminal agent status markers.
3
3
  *
4
- * Interactive turns announce their state as an OSC 777 sequence:
4
+ * Interactive turns can announce their state as an OSC 777 sequence:
5
5
  *
6
6
  * ESC ] 777 ; notify;Terax;gjc;<event> BEL
7
7
  *
8
- * A terminal that understands the sequence (Terax reads it to drive its per-tab
9
- * agent status and header bell) reacts; every other terminal discards the OSC
10
- * as unknown, exactly like the OSC 133 prompt marks and OSC 7 cwd reports that
11
- * shells emit unconditionally. So there is no host sniffing and no env gate:
12
- * any host that wants agent status can parse the stream without gjc knowing it
13
- * exists.
8
+ * OSC 777 is the rxvt `notify` extension, not a private sequence: a terminal
9
+ * that implements it does not discard the payload, it raises a desktop
10
+ * notification. Ghostty parses `777;notify` in `osc/parsers/rxvt_extension.zig`
11
+ * and maps it to `show_desktop_notification`, so emitting it unconditionally
12
+ * made every turn pop notifications titled `Terax` in Ghostty and cmux.
14
13
  *
15
- * `notify;Terax;` is the wire identifier of the only protocol that currently
16
- * carries per-turn agent state, not a host check - the payload names gjc as the
17
- * reporting agent.
14
+ * Emission is therefore opt-in. A host that wants per-turn agent status exports
15
+ * `GJC_HOST_STATUS=terax` from its shell integration; every other host gets no
16
+ * escape sequence at all. `notify;Terax;` is the wire identifier of that
17
+ * protocol, and gjc is still named in the payload as the reporting agent.
18
18
  *
19
19
  * Interactive TUI only. Print and RPC mode stdout stays byte-for-byte parseable
20
20
  * because they never reach these controllers.
21
21
  */
22
22
  export type HostStatusEvent = "working" | "attention" | "finished";
23
- export declare function emitHostStatus(event: HostStatusEvent, output?: Pick<NodeJS.WriteStream, "write">): void;
23
+ /** The host marker value that opts a terminal into agent-status markers. */
24
+ export declare const HOST_STATUS_MARKER_ENV = "GJC_HOST_STATUS";
25
+ /** Whether the current host opted in to agent-status markers. */
26
+ export declare function hostStatusEnabled(env?: NodeJS.ProcessEnv): boolean;
27
+ export declare function emitHostStatus(event: HostStatusEvent, output?: Pick<NodeJS.WriteStream, "write">, env?: NodeJS.ProcessEnv): void;
@@ -2,14 +2,20 @@
2
2
  * Host-value policy for MCP config that comes from an untrusted project file.
3
3
  *
4
4
  * User mcp.json and an explicit `--mcp-config` file may still substitute
5
- * secret-named environment variables and run `!` shell commands. A project
6
- * file (native `.gjc/mcp.json` or a repo-root `mcp.json`) uses the same
7
- * sensitive-name rule as project `ssh.json`: do not copy those host values
8
- * into server env or headers, and do not execute `!`.
5
+ * secret-named environment variables and run `!` shell commands. Any
6
+ * project-level source, including providers other than native `.gjc/mcp.json`
7
+ * and repo-root `mcp.json`, uses the same sensitive-name rule as project
8
+ * `ssh.json`: do not copy those host values into server env or headers, and
9
+ * do not execute `!`.
9
10
  */
10
11
  import type { SourceMeta } from "../capability/types";
11
12
  export declare function nativeMcpSource(level: "user" | "project", filePath: string): SourceMeta;
12
- /** True when this server was loaded from untrusted project MCP config. */
13
+ /**
14
+ * True when this server was loaded from untrusted project MCP config.
15
+ * Every project-level provider is untrusted, including providers other than
16
+ * native `.gjc/mcp.json` and repo-root `mcp.json`. User scope and a tools-only
17
+ * load stay on the previous path.
18
+ */
13
19
  export declare function isUntrustedProjectMcpSource(source: SourceMeta | undefined, toolsOnly: boolean): boolean;
14
20
  export type ProjectHostValueDecision = {
15
21
  action: "resolve";
@@ -4,7 +4,7 @@ export type { BrokerExitWriterTestBarrier } from "./broker-exit-writer-worker";
4
4
  export declare function setBrokerExitWriterBarrierForTest(barrier?: BrokerExitWriterTestBarrier): void;
5
5
  export type BrokerExitMode = "owned-root" | "lost-root";
6
6
  export type BrokerFenceReason = "suspect-unpublished" | "observation-ambiguous" | "heartbeat-ambiguous";
7
- export type BrokerExitReason = "ownership-fence-expired" | "publication-liveness-timeout" | "heartbeat-renewal-blocked" | "restart-committed" | "shutdown-request" | "startup-failure" | "signal";
7
+ export type BrokerExitReason = "ownership-fence-expired" | "publication-liveness-timeout" | "heartbeat-renewal-blocked" | "restart-committed" | "shutdown-request" | "startup-failure" | "abandoned" | "signal";
8
8
  export type BrokerStopRequest = {
9
9
  kind: "shutdown-request";
10
10
  } | {
@@ -26,6 +26,21 @@ export interface BrokerSettings {
26
26
  masterCapabilityVerifier?: MasterCapabilityVerifier;
27
27
  /** Grace before an orphaned spawn child closes; schema-bounded in production. */
28
28
  masterOrphanGraceMs?: number;
29
+ /**
30
+ * Grace before a broker nobody is left to use exits on its own. The clock only
31
+ * runs while the index proves no live session host and no open spawn authority,
32
+ * so a broker whose client died without closing exits instead of holding its
33
+ * port, its publication, and its lock for the life of the machine.
34
+ */
35
+ abandonedGraceMs?: number;
36
+ /**
37
+ * Whether this broker may end itself once nobody is left to use it. Only the
38
+ * detached autostart entry point enables this: an operator-supervised
39
+ * `gjc sdk broker run` service owns its own lifetime, and its supervisor reads an
40
+ * owned-root completion as a clean exit, so self-reaping would quietly retire a
41
+ * service that was meant to keep serving.
42
+ */
43
+ reapWhenAbandoned?: boolean;
29
44
  /** Host model resolver override for lifecycle tests and embedders. */
30
45
  resolveModelPin?: SdkHostModelResolver;
31
46
  /**
@@ -62,10 +77,12 @@ type ResolvedBrokerSettings = {
62
77
  spawnSubstrateProvider?: SpawnSubstrateProvider;
63
78
  spawnPromptLayer?: SpawnPromptLayer;
64
79
  masterOrphanGraceMs: number;
80
+ abandonedGraceMs: number;
81
+ reapWhenAbandoned: boolean;
65
82
  restartRequestId?: string;
66
83
  };
67
84
  export declare function resolveBrokerPackageGeneration(): string;
68
- export type BrokerErrorCode = "idempotency_conflict" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "ready_then_exited" | "endpoint_unreadable" | "startup_admission_timeout" | "startup_admission_refused" | "readiness_timeout" | "worktree_preparation_timeout" | "dependency_preparation_timeout" | "worktree_in_use" | "incarnation_unavailable" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | (string & {});
85
+ export type BrokerErrorCode = "idempotency_conflict" | "legacy_lifecycle_ambiguous" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "ready_then_exited" | "endpoint_unreadable" | "startup_admission_timeout" | "startup_admission_refused" | "readiness_timeout" | "worktree_preparation_timeout" | "dependency_preparation_timeout" | "worktree_in_use" | "incarnation_unavailable" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | (string & {});
69
86
  export type BrokerCleanupIdentity = {
70
87
  dev: string;
71
88
  ino: string;
@@ -373,6 +390,8 @@ export declare class Broker {
373
390
  runStartup<T>(queueWaitMs: number, timing: StartupAdmissionTiming, task: (admittedAt: number) => Promise<T>): Promise<StartupAdmissionResult<T>>;
374
391
  start(): Promise<BrokerDiscovery>;
375
392
  get ownsDiscovery(): boolean;
393
+ /** Whether this broker completed its initial retained discovery publication. */
394
+ get hasPublishedDiscovery(): boolean;
376
395
  get completion(): Promise<void>;
377
396
  /** Why this broker completed, or null while it is still running. */
378
397
  get terminalExit(): {
@@ -418,6 +437,8 @@ export declare function setBrokerLockReclaimHooksForTest(broker: Broker, hooks:
418
437
  beforeQuarantine?: () => Promise<void>;
419
438
  onContended?: () => void;
420
439
  } | undefined): void;
440
+ /** Test-only hook for shortening the bounded abandonment grace. */
441
+ export declare function setAbandonedGraceForTest(broker: Broker, graceMs: number | undefined): void;
421
442
  /** Test-only hook for shortening the bounded liveness deadline. */
422
443
  export declare function setLivenessGraceForTest(broker: Broker, graceMs: number | undefined): void;
423
444
  /** Test-only hook for shortening the bounded wait before a deferred managed close is queued. */
@@ -1,5 +1,6 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
2
  import type { FileHandle } from "node:fs/promises";
3
+ import { type ProjectEnvSnapshot } from "@gajae-code/utils/env-file";
3
4
  import { type FileLockOptions } from "../../config/file-lock";
4
5
  import { type BrokerStartupExitRecord } from "./broker-exit";
5
6
  import { type BrokerDiscovery } from "./discovery";
@@ -129,8 +130,8 @@ export interface BrokerStartupLockOptions {
129
130
  }
130
131
  /**
131
132
  * Test-only phase observation for detached broker startup regressions. The
132
- * signal is opt-in through the child environment and never affects broker
133
- * ownership or error handling when the test seam is absent.
133
+ * directory is opt-in through a trusted operator environment and never affects
134
+ * broker ownership or error handling when the seam is absent.
134
135
  */
135
136
  export declare function emitBrokerStartupTestSignal(signal: string): Promise<void>;
136
137
  /**
@@ -302,6 +303,8 @@ export declare function reapDetachedBrokerPidForTest(pid: number, brokerIncarnat
302
303
  export declare function signalPinnedBrokerProcessForTest(reference: PinnedBrokerProcess | null, expectedIncarnation: string, signal: NodeJS.Signals): boolean;
303
304
  /** Test hook: verifies platforms without identity-bound signaling fail closed. */
304
305
  export declare function signalDetachedBrokerProcessForTest(pid: number, brokerIncarnation: string, signal: NodeJS.Signals, platform: NodeJS.Platform): boolean;
306
+ /** Test hook: the signal directory accepted from this environment and snapshot. */
307
+ export declare function trustedBrokerSignalDirectoryForTest(env: NodeJS.ProcessEnv, snapshot: ProjectEnvSnapshot | readonly ProjectEnvSnapshot[]): string | undefined;
305
308
  /** Test hook: resolves the complete broker environment without spawning. */
306
309
  export declare function brokerSpawnEnvironmentForTest(command: SdkInternalSpawnCommand, override?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
307
310
  /** Test hook: installs an exact controllable owner to exercise replacement fencing. */
@@ -1,9 +1,18 @@
1
1
  import * as childProcess from "node:child_process";
2
2
  import type * as stream from "node:stream";
3
3
  import type { Process } from "@gajae-code/natives";
4
+ /** Handoff protocol frames written to the trampoline's stdin. */
4
5
  export declare const BROKER_HANDOFF_ACKNOWLEDGEMENT = "GJC_BROKER_HANDOFF_ACK\n";
5
6
  export declare const BROKER_HANDOFF_COMMIT = "GJC_BROKER_HANDOFF_COMMIT\n";
6
7
  export declare const BROKER_HANDOFF_ABORT = "GJC_BROKER_HANDOFF_ABORT\n";
8
+ /**
9
+ * Backstop for a retained trampoline whose parent never sends a decision. It must
10
+ * outlive the parent's own broker discovery deadline (which is derived from the
11
+ * publication budget and can double across a guarded retry), otherwise the
12
+ * trampoline reaps the broker first and the parent misreports its own discovery
13
+ * timeout as an "exited before discovery" startup failure.
14
+ */
15
+ export declare const BROKER_HANDOFF_DECISION_TIMEOUT_MS = 120000;
7
16
  /**
8
17
  * Windows broker hop: spawns the real broker with detached:true and reports its pid.
9
18
  *
@@ -133,6 +133,28 @@ export type SessionLifecycleLaunchRequest = SessionLifecycleLaunchRequestBase &
133
133
  coordinatorSidecarSigningKey?: undefined;
134
134
  });
135
135
  export declare function readSessionLifecycleLaunchRequest(value: string | undefined, now?: number): SessionLifecycleLaunchRequest;
136
+ /**
137
+ * Validates the optional per-session `env`/`unsetEnv` pair (#6735). Returns
138
+ * null when either is malformed so the caller fails the launch closed.
139
+ */
140
+ export declare function lifecycleSessionEnv(input: {
141
+ env?: unknown;
142
+ unsetEnv?: unknown;
143
+ }): {
144
+ env?: Record<string, string>;
145
+ unsetEnv?: string[];
146
+ } | null;
147
+ /**
148
+ * Composes the inherited part of a lifecycle session host's environment:
149
+ * drops the process-local master capability, every `unsetEnv` name, and any
150
+ * inherited name an explicit per-session `env` entry replaces (case-folded on
151
+ * Windows so `Path` and `PATH` never both reach the child), then layers the
152
+ * per-session `env` on top. Broker-issued `GJC_*` keys are applied after this.
153
+ */
154
+ export declare function lifecycleSessionHostBaseEnv(inherited: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>>, launch: {
155
+ env?: Readonly<Record<string, string>>;
156
+ unsetEnv?: readonly string[];
157
+ }): Record<string, string>;
136
158
  type CleanupEvidence = BrokerCleanupEvidence;
137
159
  export declare function validateBrokerModelPresetSync(agentDir: string, requestedProfile: string): string | BrokerResponse;
138
160
  export declare function validateBrokerModelPresetForTest(agentDir: string, requestedProfile: string): string | BrokerResponse;
@@ -185,6 +185,8 @@ export declare const DEFAULT_SESSION_RETENTION_MAX_AGE_MS: number;
185
185
  export declare const DEFAULT_SESSION_RETENTION_MAX_ROWS = 25000;
186
186
  /** Bound ordinary bootstrap waits; authorized doctor successors may use the full prepared window. */
187
187
  export declare function sessionIndexStartupLockOptions(deadline: number, signal?: AbortSignal, policy?: "ordinary" | "authorized-successor"): FileLockOptions;
188
+ /** One elapsed budget for queueing, probing and every reacquisition in a pass. */
189
+ export declare const SESSION_HEARTBEAT_CHECKPOINT_BUDGET_MS = 15000;
188
190
  export declare class SessionIndex {
189
191
  #private;
190
192
  constructor(agentDir: string, policy?: RetentionPolicy, observationDeps?: SessionIndexObservationDeps);
@@ -6,6 +6,8 @@ export declare class BrokerTransport {
6
6
  #private;
7
7
  constructor(broker: Broker, token: string, port?: number);
8
8
  get port(): number;
9
+ /** Sockets a client holds open right now; the broker outlives every one of them. */
10
+ get clientCount(): number;
9
11
  start(): Promise<number>;
10
12
  stop(): Promise<void>;
11
13
  }
@@ -27,8 +27,10 @@ import { type WorkflowGateEmitter, type WorkflowGateTerminalProof } from "../../
27
27
  import type { AgentSessionEvent } from "../../session/agent-session";
28
28
  import { type SessionWorkLease, type SessionWorkLeaseHandle } from "../../session/session-work-lease";
29
29
  import type { AskAnswerSource, AskAnswerSourceResult, AskRemoteControl } from "../../tools";
30
+ import type { AwaitingInputKind } from "../../tools/awaiting-input";
30
31
  import { type SessionHostRuntimePublication } from "../broker/lifecycle";
31
32
  import { type SessionSdkHost } from "../host";
33
+ import { PromptImageUploadStore } from "../host/prompt-image-upload";
32
34
  import { CursorRegistry, RevisionStore } from "../host/query";
33
35
  import type { SdkFrame } from "../host/types";
34
36
  import { type SdkPromptTerminalOutcome } from "../prompt-status";
@@ -266,6 +268,13 @@ export declare class PresentationArbiter {
266
268
  interface SessionRuntime {
267
269
  server: NotificationServer;
268
270
  host: SessionSdkHost;
271
+ imageUploads: PromptImageUploadStore | undefined;
272
+ releaseAcceptedImage: (correlation: {
273
+ commandId: string;
274
+ turnId: string;
275
+ }) => void;
276
+ releaseAcceptedImagesForRun: (owner: AgentTerminalOwnerContext) => void;
277
+ releaseAcceptedImages: () => void;
269
278
  getJoinedPromptCorrelations: (owner: AgentTerminalOwnerContext) => Array<{
270
279
  commandId: string;
271
280
  turnId: string;
@@ -490,6 +499,16 @@ interface SessionRuntime {
490
499
  args?: unknown;
491
500
  pendingPhase?: "completed" | "failed" | "cancelled";
492
501
  }>;
502
+ /**
503
+ * Running tool calls that reported an awaiting-input signal, keyed by tool call
504
+ * id. An entry stays undelivered while notifications are inactive or policy is
505
+ * provisional, and is dropped when the call ends; one notification per call.
506
+ */
507
+ awaitingInput: Map<string, {
508
+ toolName: string;
509
+ kind: AwaitingInputKind;
510
+ delivered: boolean;
511
+ }>;
493
512
  /** Cancels the postmortem cleanup that emits `session_closed` on process teardown. */
494
513
  cancelPostmortemCleanup: () => void;
495
514
  /** Disposes side-turn resources when their owning logical session becomes unavailable. */
@@ -672,6 +691,8 @@ export declare function createNotificationsExtension(api: ExtensionAPI, options?
672
691
  * preflight outside the durable admission path (review thread P2).
673
692
  */
674
693
  terminalAbortSeams?: {
694
+ /** Definitive event-driven observation; never mutates the owning run. */
695
+ waitForRunSettlement?: (handle: string) => Promise<RunSettlementProof>;
675
696
  getTerminalRunOwnerForEvent?: (event: object) => AgentTerminalOwnerContext | undefined;
676
697
  getRunOwnerDomain?: (handle: string) => RunCancellationDomain | undefined;
677
698
  getTerminalTurnEpoch: () => number | undefined;
@@ -298,8 +298,14 @@ export declare const SDK_LIFECYCLE_ROUTER_PROTOCOL_VERSION = 1;
298
298
  * before its terminal record is durable.
299
299
  * Generation 203 replaces owners that still treat a project `.gjc` file as an
300
300
  * explicit deadline-autosave opt-in for a primary checkout.
301
+ * Generation 205 replaces owners whose process descendant walk can adopt
302
+ * children of a recycled PID. Generation 206 verifies macOS descendant
303
+ * identities and parentage before retaining PTY termination authority, and
304
+ * reaps adopted Linux PTY descendants when GJC is a child reaper.
305
+ * Generation 209 installs connection-owned private SDK image staging with
306
+ * execution-owned reservations, replacing hosts without that lifecycle contract.
301
307
  */
302
- export declare const DAEMON_GENERATION = 204;
308
+ export declare const DAEMON_GENERATION = 209;
303
309
  /**
304
310
  * Serving-compatibility boundary for daemon lifecycle requests. Epoch 7
305
311
  * requires durable publication receipts and acknowledged attachment dispatch,
@@ -135,6 +135,8 @@ export declare const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
135
135
  export declare const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
136
136
  /** Capability for the closed tool phase set: started, completed, failed, and cancelled. */
137
137
  export declare const TOOL_ACTIVITY_CAPABILITY = "tool_activity_v2";
138
+ /** Receive content-free notifications when a running command needs host-side authentication. */
139
+ export declare const AWAITING_INPUT_CAPABILITY = "awaiting_input_v1";
138
140
  /** Receive-only compatibility capability for pre-v2 hosts. */
139
141
  export declare const LEGACY_TOOL_ACTIVITY_CAPABILITY = "tool_activity_v1";
140
142
  /** Public `sdk/bus/telegram-daemon` path for the canonical `sdk/host` capability token. */
@@ -2,7 +2,7 @@
2
2
  * Pure rendering of threaded-session frames into Telegram send specs.
3
3
  *
4
4
  * The daemon receives the additive `ServerMessage` frames (identity_header,
5
- * context_update, turn_stream, image_attachment, config_update) over the session
5
+ * context_update, turn_stream, image_attachment, config_update, awaiting_input) over the session
6
6
  * WS and must turn each into a Bot API call scoped to the session's forum topic
7
7
  * (`message_thread_id`), throttled through the shared rate-limit pool. This
8
8
  * module is the pure frame→send mapping (including the priority lane and live-
@@ -71,6 +71,7 @@ interface ThreadedFrame {
71
71
  turnRef?: unknown;
72
72
  toolCallId?: unknown;
73
73
  toolName?: unknown;
74
+ kind?: unknown;
74
75
  argsSummary?: unknown;
75
76
  resultSummary?: unknown;
76
77
  isError?: unknown;
@@ -19,7 +19,11 @@ export type ControlInput = Record<string, unknown>;
19
19
  * AgentSession and its controllers without exposing those concrete types here.
20
20
  */
21
21
  export interface ControlSurface {
22
- prompt(text: string, images?: ControlValue, clientRef?: string): Promise<ControlValue> | ControlValue;
22
+ prompt(text: string, images?: ControlValue, clientRef?: string, stagedImages?: ControlValue): Promise<ControlValue> | ControlValue;
23
+ imageBegin?(input: ControlValue): Promise<ControlValue> | ControlValue;
24
+ imageAppend?(input: ControlValue): Promise<ControlValue> | ControlValue;
25
+ imageFinish?(input: ControlValue): Promise<ControlValue> | ControlValue;
26
+ imageDiscard?(input: ControlValue): Promise<ControlValue> | ControlValue;
23
27
  steer(text: string, clientRef?: string, expectedSdkRunToken?: string): Promise<ControlValue> | ControlValue;
24
28
  followUp(text: string): Promise<ControlValue> | ControlValue;
25
29
  abort(): Promise<ControlValue> | ControlValue;
@@ -20,6 +20,8 @@ export interface EventReplay {
20
20
  events: EventFrame[];
21
21
  gap?: EventReplayGap;
22
22
  }
23
+ /** Notification policy refresh records the live redaction bit for one session ring. */
24
+ export declare function setSessionOutboundRedact(sessionId: string, enabled: boolean): void;
23
25
  export declare class SessionEventStream {
24
26
  #private;
25
27
  constructor(options?: {
@@ -30,6 +32,8 @@ export declare class SessionEventStream {
30
32
  });
31
33
  get generation(): number;
32
34
  get sequence(): number;
35
+ /** Follow the session redaction bit. Replay then drops kinds emit sites already suppress. */
36
+ setOutboundRedact(enabled: boolean): void;
33
37
  restart(): number;
34
38
  emit(frame: SdkFrame): EventFrame;
35
39
  /** Replays retained current-generation events and reports any required resynchronization. */
@@ -81,6 +81,7 @@ export interface SessionSdkHostOptions extends HostEndpointAdapters {
81
81
  * must see the same capability-gated event kinds on both legs, or live and
82
82
  * replay delivery diverge for the same subscriber. */
83
83
  export declare const TOOL_ACTIVITY_CAPABILITY = "tool_activity_v2";
84
+ export declare const AWAITING_INPUT_CAPABILITY = "awaiting_input_v1";
84
85
  /** Capability for non-replayable streamed turn content. */
85
86
  export declare const TURN_STREAM_CAPABILITY = "turn_stream";
86
87
  /** Capability used by notification adapters that observe a host without owning its work. */
@@ -91,7 +92,7 @@ export declare const SESSION_HOST_OBSERVER_CAPABILITY = "session_host_observer_v
91
92
  * of every frame its positioned envelope already reached.
92
93
  */
93
94
  export declare const POSITIONED_NOTIFICATION_EFFECTS_CAPABILITY = "positioned_notification_effects_v1";
94
- export declare const CAP_GATED_FRAME_KINDS: ReadonlySet<string>;
95
+ export declare const CAP_GATED_FRAME_KINDS: ReadonlyMap<string, string>;
95
96
  /** Keep live delivery and replay on one capability gate. */
96
97
  export declare function canDeliverSdkEvent(kind: string, capabilities: ReadonlySet<string> | undefined): boolean;
97
98
  /** SDK hosting is independent of notification configuration. Only root sessions host an endpoint. */
@@ -0,0 +1,43 @@
1
+ import type { RunSettlementProof } from "@gajae-code/agent-core";
2
+ import type { ImageContent } from "@gajae-code/ai/core";
3
+ /** One definitive event-driven wait; teardown and elapsed time are not settlement proof. */
4
+ export declare function retirePromptImageReservation(handle: string, waitForRunSettlement: (handle: string) => Promise<RunSettlementProof>, isCurrent: () => boolean, release: () => void): void;
5
+ export interface PromptImageProcessBudgetSnapshot {
6
+ /** Retained upload and accepted source bytes, including accepted base64 copies. */
7
+ readonly sourceBytes: number;
8
+ readonly transientBytes: number;
9
+ readonly concurrentFinishes: number;
10
+ }
11
+ /** Internal process diagnostics only; not an SDK operation or a release capability. */
12
+ export declare function getPromptImageProcessBudgetSnapshot(): PromptImageProcessBudgetSnapshot;
13
+ /** Session-scoped, connection-owned image leases; no client-supplied path or identity is trusted. */
14
+ export declare class PromptImageUploadStore {
15
+ #private;
16
+ /** The host supplies live socket membership; standalone callers must choose an explicit policy. */
17
+ constructor(isConnectionOpen: (connectionId: string) => boolean);
18
+ begin(connectionId: string | undefined, value: unknown): {
19
+ id: string;
20
+ nextSequence: 0;
21
+ };
22
+ append(connectionId: string | undefined, value: unknown): {
23
+ id: string;
24
+ nextSequence: number;
25
+ receivedBytes: number;
26
+ };
27
+ finish(connectionId: string | undefined, value: unknown): Promise<{
28
+ id: string;
29
+ byteLength: number;
30
+ sha256: string;
31
+ mimeType: string;
32
+ }>;
33
+ discard(connectionId: string | undefined, value: unknown): {
34
+ discarded: true;
35
+ };
36
+ /** Synchronous reserve–validate–copy–consume transaction, called before prompt admission. */
37
+ redeem(connectionId: string | undefined, value: unknown): {
38
+ images: ImageContent[];
39
+ release: () => void;
40
+ };
41
+ disconnect(connectionId: string): void;
42
+ close(): void;
43
+ }
@@ -1,3 +1,4 @@
1
+ import { type RunSettlementProof } from "@gajae-code/agent-core";
1
2
  import type { ProviderDiagnostic } from "@gajae-code/ai/core";
2
3
  import { type Settings } from "../../config/settings";
3
4
  import type { ExtensionAPI, ExtensionContext } from "../../extensibility/extensions";
@@ -74,9 +75,12 @@ export interface SessionSdkTransport {
74
75
  stop(): Promise<void>;
75
76
  broadcastFrame?(frame: SdkFrame): void;
76
77
  onConnectionClose?(handler: (connectionId: string) => void): undefined | (() => void);
78
+ /** Authoritative live socket membership, not a cache of previously observed frames. */
79
+ isConnectionOpen?(connectionId: string): boolean;
77
80
  onNegotiatedCapabilities?(handler: (connectionId: string, capabilities: readonly string[]) => void): undefined | (() => void);
78
81
  }
79
82
  export interface SessionSdkRuntimeOptions extends Omit<SessionSdkHostOptions, "sessionId" | "stateRoot" | "token" | "sendFrame" | "onFrame"> {
83
+ onDisconnected?: (connectionId: string) => void;
80
84
  transport: SessionSdkTransport;
81
85
  /** Session settings; enables `config.patch` application on this runtime. */
82
86
  settings?: Settings;
@@ -154,6 +158,8 @@ export interface SdkOnlyReconciliationStore {
154
158
  }): Promise<void>;
155
159
  }
156
160
  export interface SdkOnlyTerminalAbortSeams {
161
+ /** Definitive event-driven observation: never abort, seal or quarantine a run to reclaim images. */
162
+ waitForRunSettlement?: (handle: string) => Promise<RunSettlementProof>;
157
163
  getReconciliationStore?: () => SdkOnlyReconciliationStore | undefined;
158
164
  getTerminalTurnEpoch: () => number | undefined;
159
165
  getActivePromptHandle: () => string | undefined;
@@ -215,14 +221,6 @@ export interface SdkOnlyDeadlineRecoveryCheckpoint {
215
221
  pendingToolCount?: number;
216
222
  errorCode?: string;
217
223
  }
218
- /**
219
- * The transport-neutral SDK session runtime.
220
- *
221
- * Concrete transports (including the optional notification/native transport) are
222
- * injected by the caller. This module owns host construction, control/query
223
- * dispatch, replay/event publication, and reverse-provider lifecycle without
224
- * importing any notification adapter or native notification class.
225
- */
226
224
  export declare class SessionSdkSessionRuntime {
227
225
  #private;
228
226
  readonly host: SessionSdkHost;
@@ -397,6 +395,8 @@ export interface SdkSurfaceFactoryOptions {
397
395
  api: ExtensionAPI;
398
396
  /** Startup surface that owns host-level permission and lifecycle authority. */
399
397
  primaryControlSurface?: "cli" | "sdk";
398
+ /** Private staging controls are advertised only with authoritative transport liveness. */
399
+ imageUploadsAvailable?: boolean;
400
400
  policy?: SdkSurfacePolicy;
401
401
  getInstalledDefinitions?: (capability: string) => unknown | undefined;
402
402
  getLiveState?: () => {
@@ -7,6 +7,7 @@ export interface SdkSurfacePolicy {
7
7
  export interface SdkSurfacePolicyOptions {
8
8
  bindings: Iterable<string>;
9
9
  workflowGateAvailable: boolean;
10
+ imageUploadsAvailable?: boolean;
10
11
  isBindingInstalled?: (binding: string) => boolean;
11
12
  }
12
13
  /** Shared operation advertisement policy for every SDK transport. */
@@ -20,4 +21,4 @@ export interface SdkCapabilities {
20
21
  }
21
22
  export declare function createSdkCapabilities(policy: SdkSurfacePolicy, hostTools?: boolean, primaryControlSurface?: SdkCapabilities["primaryControlSurface"]): SdkCapabilities;
22
23
  /** Derive the shared policy from an extension context without importing adapters. */
23
- export declare function createSdkSurfacePolicyForContext(ctx: ExtensionContext, workflowGateAvailable?: boolean): SdkSurfacePolicy;
24
+ export declare function createSdkSurfacePolicyForContext(ctx: ExtensionContext, workflowGateAvailable?: boolean, imageUploadsAvailable?: boolean): SdkSurfacePolicy;
@@ -57,6 +57,10 @@ export type SessionCreateTarget = SessionLifecycleCoordinatorTarget & {
57
57
  readonly body?: string;
58
58
  readonly modelPreset?: string;
59
59
  readonly mcpServers?: readonly Record<string, unknown>[];
60
+ /** Per-session environment for the hosted session; `GJC_*` names are reserved (#6735). */
61
+ readonly env?: Readonly<Record<string, string>>;
62
+ /** Inherited broker environment names removed from the hosted session (#6735). */
63
+ readonly unsetEnv?: readonly string[];
60
64
  readonly worktree?: SessionLifecycleWorktreeTarget;
61
65
  readonly readiness?: "immediate" | "deferred";
62
66
  readonly readinessTimeoutMs?: number;
@@ -70,6 +74,10 @@ export type SessionForkTarget = SessionLifecycleCoordinatorTarget & {
70
74
  readonly body?: string;
71
75
  readonly modelPreset?: string;
72
76
  readonly mcpServers?: readonly Record<string, unknown>[];
77
+ /** Per-session environment for the hosted session; `GJC_*` names are reserved (#6735). */
78
+ readonly env?: Readonly<Record<string, string>>;
79
+ /** Inherited broker environment names removed from the hosted session (#6735). */
80
+ readonly unsetEnv?: readonly string[];
73
81
  readonly worktree?: SessionLifecycleWorktreeTarget;
74
82
  readonly readinessTimeoutMs?: number;
75
83
  };
@@ -82,6 +90,10 @@ export type SessionResumeTarget = SessionLifecycleCoordinatorTarget & {
82
90
  readonly body?: string;
83
91
  readonly modelPreset?: string;
84
92
  readonly mcpServers?: readonly Record<string, unknown>[];
93
+ /** Per-session environment for the hosted session; `GJC_*` names are reserved (#6735). */
94
+ readonly env?: Readonly<Record<string, string>>;
95
+ /** Inherited broker environment names removed from the hosted session (#6735). */
96
+ readonly unsetEnv?: readonly string[];
85
97
  readonly worktree?: SessionLifecycleWorktreeTarget;
86
98
  readonly readinessTimeoutMs?: number;
87
99
  };
@@ -37,12 +37,19 @@ export interface TurnPromptImageInput {
37
37
  data: string;
38
38
  mimeType?: string;
39
39
  }
40
- /** Public input contract for ordered `turn.prompt`. */
41
- export interface TurnPromptInput {
40
+ /** Public input contract for ordered `turn.prompt`; direct and staged images cannot be mixed. */
41
+ export type TurnPromptInput = {
42
42
  text: string;
43
- images?: TurnPromptImageInput[];
44
43
  clientRef?: string;
45
- }
44
+ } & ({
45
+ images?: TurnPromptImageInput[];
46
+ stagedImages?: never;
47
+ } | {
48
+ images?: never;
49
+ stagedImages: Array<{
50
+ id: string;
51
+ }>;
52
+ });
46
53
  /**
47
54
  * Terminal outcome is preserved exactly; active records never age into terminal. An
48
55
  * ordinary prompt active at process restart is finalized from its durable pending