@gajae-code/coding-agent 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/dist/types/async/job-manager.d.ts +17 -3
  3. package/dist/types/config/settings-schema.d.ts +54 -0
  4. package/dist/types/exa/mcp-client.d.ts +10 -1
  5. package/dist/types/exec/bash-executor.d.ts +45 -12
  6. package/dist/types/extensibility/extensions/types.d.ts +16 -2
  7. package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
  8. package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
  9. package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
  10. package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
  11. package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
  12. package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
  13. package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
  14. package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
  15. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +18 -0
  16. package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
  17. package/dist/types/gjc-runtime/team-runtime.d.ts +25 -0
  18. package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
  19. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +10 -0
  20. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
  21. package/dist/types/modes/acp/acp-agent.d.ts +2 -19
  22. package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
  23. package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
  24. package/dist/types/modes/components/session-observer-overlay.d.ts +18 -0
  25. package/dist/types/modes/components/settings-selector.d.ts +9 -0
  26. package/dist/types/modes/components/status-line/gh.d.ts +5 -0
  27. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
  28. package/dist/types/reminders/star-reminder.d.ts +3 -13
  29. package/dist/types/runtime-mcp/manager.d.ts +1 -0
  30. package/dist/types/sdk/acp/adapter.d.ts +3 -1
  31. package/dist/types/sdk/broker/transport.d.ts +2 -0
  32. package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
  33. package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
  34. package/dist/types/sdk/bus/config.d.ts +6 -2
  35. package/dist/types/sdk/bus/index.d.ts +29 -0
  36. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +8 -1
  37. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  38. package/dist/types/sdk/bus/reconciliation-store.d.ts +7 -3
  39. package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
  40. package/dist/types/sdk/bus/rich-render.d.ts +2 -0
  41. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
  42. package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
  43. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
  44. package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
  45. package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
  46. package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
  47. package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
  48. package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
  49. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  50. package/dist/types/sdk/prompt-status.d.ts +23 -3
  51. package/dist/types/sdk/session.d.ts +6 -0
  52. package/dist/types/session/agent-session.d.ts +38 -2
  53. package/dist/types/session/artifacts.d.ts +8 -0
  54. package/dist/types/session/blob-store.d.ts +57 -4
  55. package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
  56. package/dist/types/session/session-manager.d.ts +23 -6
  57. package/dist/types/session/session-storage.d.ts +4 -0
  58. package/dist/types/session/streaming-output.d.ts +36 -7
  59. package/dist/types/setup/credential-import.d.ts +12 -0
  60. package/dist/types/skill-state/active-state.d.ts +12 -0
  61. package/dist/types/skill-state/workflow-hud.d.ts +6 -0
  62. package/dist/types/task/executor.d.ts +3 -2
  63. package/dist/types/task/index.d.ts +3 -1
  64. package/dist/types/task/provider-retry-status.d.ts +8 -0
  65. package/dist/types/task/receipt.d.ts +7 -1
  66. package/dist/types/task/types.d.ts +23 -0
  67. package/dist/types/tools/ask-answer-registry.d.ts +2 -2
  68. package/dist/types/tools/bash-interactive.d.ts +4 -1
  69. package/dist/types/tools/bash.d.ts +3 -1
  70. package/dist/types/tools/image-gen.d.ts +4 -0
  71. package/dist/types/tools/index.d.ts +4 -0
  72. package/dist/types/tools/output-meta.d.ts +23 -2
  73. package/dist/types/tools/path-utils.d.ts +1 -0
  74. package/dist/types/tools/read.d.ts +0 -6
  75. package/dist/types/tools/review.d.ts +5 -7
  76. package/dist/types/tools/subagent.d.ts +2 -0
  77. package/dist/types/utils/gh.d.ts +13 -0
  78. package/dist/types/utils/image-resize.d.ts +1 -0
  79. package/dist/types/web/search/providers/kimi.d.ts +2 -0
  80. package/dist/types/web/search/providers/searxng.d.ts +7 -0
  81. package/dist/types/web/search/providers/xai.d.ts +2 -0
  82. package/package.json +10 -8
  83. package/scripts/acp-conformance-agent.ts +218 -0
  84. package/scripts/capture-gjc-bundle-settings.ts +306 -0
  85. package/scripts/generate-sdk-operation-inventory.ts +3 -0
  86. package/scripts/resident-memory-bench.ts +1341 -0
  87. package/scripts/run-acp-conformance.ts +285 -0
  88. package/src/async/job-manager.ts +78 -20
  89. package/src/cli/fast-help.ts +1 -1
  90. package/src/cli/plugin-cli.ts +176 -18
  91. package/src/commands/team.ts +19 -1
  92. package/src/config/file-lock.ts +11 -2
  93. package/src/config/settings-schema.ts +51 -0
  94. package/src/coordinator-mcp/question-gate-codec.ts +1 -1
  95. package/src/coordinator-mcp/server.ts +5 -12
  96. package/src/defaults/gjc/skills/deep-interview/SKILL.md +1 -0
  97. package/src/defaults/gjc/skills/ralplan/SKILL.md +19 -16
  98. package/src/defaults/gjc/skills/team/SKILL.md +2 -0
  99. package/src/defaults/gjc/skills/ultragoal/SKILL.md +37 -24
  100. package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
  101. package/src/defaults/gjc-defaults.ts +4 -4
  102. package/src/exa/mcp-client.ts +12 -3
  103. package/src/exec/bash-executor.ts +144 -27
  104. package/src/extensibility/extensions/runner.ts +15 -0
  105. package/src/extensibility/extensions/types.ts +18 -1
  106. package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
  107. package/src/extensibility/gjc-plugins/index.ts +19 -2
  108. package/src/extensibility/gjc-plugins/installer.ts +189 -50
  109. package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
  110. package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
  111. package/src/extensibility/gjc-plugins/observability.ts +3 -3
  112. package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
  113. package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
  114. package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
  115. package/src/extensibility/gjc-plugins/schema.ts +84 -12
  116. package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
  117. package/src/extensibility/gjc-plugins/types.ts +141 -0
  118. package/src/extensibility/gjc-plugins/validation.ts +9 -0
  119. package/src/gjc-runtime/launch-tmux.ts +25 -6
  120. package/src/gjc-runtime/managed-owner-admission.ts +1 -1
  121. package/src/gjc-runtime/ralplan-runtime.ts +411 -17
  122. package/src/gjc-runtime/team-launch.ts +8 -0
  123. package/src/gjc-runtime/team-runtime.ts +140 -32
  124. package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
  125. package/src/gjc-runtime/tmux-owner-isolation.ts +10 -0
  126. package/src/gjc-runtime/tmux-sessions.ts +58 -13
  127. package/src/gjc-runtime/ultragoal-runtime.ts +401 -611
  128. package/src/gjc-runtime/workflow-manifest.generated.json +8 -99
  129. package/src/gjc-runtime/workflow-manifest.ts +4 -68
  130. package/src/internal-urls/docs-index.generated.ts +15 -15
  131. package/src/modes/DESIGN.md +51 -0
  132. package/src/modes/acp/acp-agent.ts +298 -186
  133. package/src/modes/components/gjc-bundle-settings.ts +508 -0
  134. package/src/modes/components/notifications-settings-editor.ts +12 -1
  135. package/src/modes/components/oauth-selector.ts +68 -30
  136. package/src/modes/components/session-observer-overlay.ts +305 -86
  137. package/src/modes/components/settings-selector.ts +56 -5
  138. package/src/modes/components/status-line/gh.ts +16 -0
  139. package/src/modes/components/tool-status-header.ts +3 -14
  140. package/src/modes/components/transcript-viewer-overlay.ts +99 -24
  141. package/src/modes/controllers/command-controller.ts +4 -0
  142. package/src/modes/controllers/extension-ui-controller.ts +7 -0
  143. package/src/modes/controllers/selector-controller.ts +45 -0
  144. package/src/modes/runtime-init.ts +3 -0
  145. package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
  146. package/src/prompts/system/eager-todo.md +8 -4
  147. package/src/prompts/system/system-prompt.md +11 -4
  148. package/src/prompts/tools/bash.md +5 -5
  149. package/src/prompts/tools/search-tool-bm25.md +5 -0
  150. package/src/prompts/tools/task.md +1 -1
  151. package/src/reminders/star-reminder.ts +4 -42
  152. package/src/runtime-mcp/manager.ts +19 -4
  153. package/src/sdk/acp/adapter.ts +22 -6
  154. package/src/sdk/broker/transport.ts +35 -3
  155. package/src/sdk/bus/attachment-registry.ts +5 -1
  156. package/src/sdk/bus/chat-daemon-cli.ts +4 -39
  157. package/src/sdk/bus/chat-daemon-control.ts +6 -3
  158. package/src/sdk/bus/config.ts +18 -2
  159. package/src/sdk/bus/index.ts +661 -126
  160. package/src/sdk/bus/kind-aware-reconciliation.ts +148 -73
  161. package/src/sdk/bus/lifecycle-commands.ts +4 -1
  162. package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
  163. package/src/sdk/bus/reconciliation-store.ts +95 -16
  164. package/src/sdk/bus/rich-draft.ts +1 -1
  165. package/src/sdk/bus/rich-render.ts +2 -2
  166. package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
  167. package/src/sdk/bus/telegram-cli.ts +33 -8
  168. package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
  169. package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
  170. package/src/sdk/bus/telegram-daemon.ts +916 -23
  171. package/src/sdk/bus/telegram-reference.ts +40 -3
  172. package/src/sdk/bus/threaded-render.ts +48 -3
  173. package/src/sdk/bus/topic-registry.ts +20 -0
  174. package/src/sdk/host/query/revision-store.ts +36 -2
  175. package/src/sdk/host/reverse-leases.ts +44 -7
  176. package/src/sdk/prompt-status.ts +16 -3
  177. package/src/sdk/protocol/operation-inventory.generated.json +22 -0
  178. package/src/sdk/session.ts +88 -9
  179. package/src/session/agent-session.ts +822 -172
  180. package/src/session/artifacts.ts +22 -0
  181. package/src/session/auth-broker-config.ts +10 -3
  182. package/src/session/blob-store.ts +915 -24
  183. package/src/session/internal/managed-session-scope.ts +44 -6
  184. package/src/session/internal/managed-session-storage.ts +48 -6
  185. package/src/session/session-manager.ts +1614 -435
  186. package/src/session/session-storage.ts +9 -1
  187. package/src/session/streaming-output.ts +238 -68
  188. package/src/setup/credential-import.ts +75 -13
  189. package/src/skill-state/active-state.ts +32 -0
  190. package/src/skill-state/workflow-hud.ts +17 -0
  191. package/src/skill-state/workflow-mutation-guard.ts +496 -2
  192. package/src/task/executor.ts +122 -39
  193. package/src/task/index.ts +23 -14
  194. package/src/task/provider-retry-status.ts +16 -0
  195. package/src/task/receipt.ts +23 -7
  196. package/src/task/render.ts +6 -2
  197. package/src/task/types.ts +108 -0
  198. package/src/tools/ask-answer-registry.ts +12 -6
  199. package/src/tools/ask.ts +86 -55
  200. package/src/tools/ast-edit.ts +1 -0
  201. package/src/tools/ast-grep.ts +1 -0
  202. package/src/tools/bash-interactive.ts +8 -3
  203. package/src/tools/bash.ts +503 -60
  204. package/src/tools/find.ts +1 -0
  205. package/src/tools/image-gen.ts +29 -5
  206. package/src/tools/index.ts +4 -0
  207. package/src/tools/output-meta.ts +108 -14
  208. package/src/tools/path-utils.ts +3 -2
  209. package/src/tools/read.ts +18 -0
  210. package/src/tools/review.ts +5 -7
  211. package/src/tools/search.ts +1 -0
  212. package/src/tools/subagent-render.ts +6 -2
  213. package/src/tools/subagent.ts +6 -0
  214. package/src/tools/telegram-send.ts +6 -3
  215. package/src/utils/gh.ts +39 -0
  216. package/src/utils/image-resize.ts +3 -0
  217. package/src/web/search/providers/anthropic.ts +4 -4
  218. package/src/web/search/providers/kimi.ts +15 -5
  219. package/src/web/search/providers/searxng.ts +47 -4
  220. package/src/web/search/providers/xai.ts +7 -2
  221. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
  222. package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
  223. package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
@@ -82,11 +82,18 @@ import {
82
82
  import { ExtensionRuntime } from "../extensibility/extensions/loader";
83
83
  import { type ConstrainedPluginHook, loadConstrainedPluginHooks } from "../extensibility/gjc-plugins/constrained-hooks";
84
84
  import { resolveCurrentPhaseForParent } from "../extensibility/gjc-plugins/injection";
85
+ import { currentActivationFingerprint } from "../extensibility/gjc-plugins/lifecycle";
85
86
  import {
86
87
  buildPluginMcpConfigs,
87
88
  loadAlwaysOnPluginTools,
88
89
  renderAlwaysOnSystemAppendices,
89
90
  } from "../extensibility/gjc-plugins/runtime-adapters";
91
+ import {
92
+ GjcRuntimeFindingAccumulator,
93
+ type GjcRuntimeSnapshotProvider,
94
+ GjcRuntimeSnapshotStore,
95
+ gjcActivationGenerationFor,
96
+ } from "../extensibility/gjc-plugins/runtime-quarantine";
90
97
  import { loadActiveSubskillTools } from "../extensibility/gjc-plugins/tools";
91
98
  import { loadSkills, type Skill, type SkillWarning, setActiveSkills } from "../extensibility/skills";
92
99
  import type { FileSlashCommand } from "../extensibility/slash-commands";
@@ -494,6 +501,11 @@ export interface CreateAgentSessionResult {
494
501
  lspServers?: LspStartupServerInfo[];
495
502
  /** Shared event bus for tool/extension communication */
496
503
  eventBus: EventBus;
504
+ /**
505
+ * Read-only view of GJC bundle runtime evidence for the activation generation
506
+ * this session published. Undefined when no GJC bundles participated.
507
+ */
508
+ gjcRuntimeSnapshot?: GjcRuntimeSnapshotProvider;
497
509
  }
498
510
 
499
511
  // Re-exports
@@ -1070,6 +1082,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1070
1082
  "options.authStorage and options.modelRegistry.authStorage must be the same instance when both are provided",
1071
1083
  );
1072
1084
  }
1085
+
1073
1086
  let agent: Agent;
1074
1087
  let session!: AgentSession;
1075
1088
  let hasSession = false;
@@ -1281,13 +1294,16 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1281
1294
  );
1282
1295
  let model = options.model;
1283
1296
  let modelFallbackMessage: string | undefined;
1297
+ const resumeModelBehavior = settings.get("session.resumeModelBehavior");
1284
1298
  const persistedDefaultChain = existingSession.configuredModelChains.default?.entries;
1285
1299
  const defaultModelEntries =
1286
- persistedDefaultChain && persistedDefaultChain.length > 0
1287
- ? persistedDefaultChain
1288
- : existingSession.models.default
1289
- ? [existingSession.models.default]
1290
- : [];
1300
+ resumeModelBehavior === "useCurrentDefault"
1301
+ ? []
1302
+ : persistedDefaultChain && persistedDefaultChain.length > 0
1303
+ ? persistedDefaultChain
1304
+ : existingSession.models.default
1305
+ ? [existingSession.models.default]
1306
+ : [];
1291
1307
  // If session has data, restore its configured default chain rather than the
1292
1308
  // scalar runtime model, which may be a stale fallback from the prior run.
1293
1309
  if (!hasExplicitModel && !model && hasExistingSession && defaultModelEntries.length > 0) {
@@ -1616,10 +1632,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1616
1632
 
1617
1633
  // Wire process-wide internal URL singletons owned by their real classes.
1618
1634
  // Top-level sessions install the active snapshots; subagents inherit them.
1619
- // Artifact and agent-output URLs resolve via `AgentRegistry.global()` —
1620
- // the protocol handlers walk each ref's `sessionManager.getArtifactsDir()`,
1621
- // which collapses to the parent's dir for subagents (they adopt the
1622
- // parent's ArtifactManager) so one lookup hits everything.
1635
+ // Artifact and agent-output URLs resolve against explicitly authorized
1636
+ // directories only (see `authorizedArtifactsDirsFromContext`): the
1637
+ // caller's own `sessionManager.getArtifactsDir()` plus, when this session
1638
+ // adopted a shared `ArtifactManager` (subagent tree membership),
1639
+ // `getAuthorizedArtifactsDirs` below. There is no registry-wide lookup.
1623
1640
  const getArtifactsDir = () => sessionManager.getArtifactsDir();
1624
1641
  const localProtocolOptions = options.localProtocolOptions ?? {
1625
1642
  getArtifactsDir,
@@ -1637,6 +1654,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1637
1654
  disposeLocalProtocolOverride = LocalProtocolHandler.installOverride(options.localProtocolOptions);
1638
1655
  }
1639
1656
  toolSession.getArtifactsDir = getArtifactsDir;
1657
+ toolSession.getAuthorizedArtifactsDirs = () => {
1658
+ const manager = sessionManager.getArtifactManager();
1659
+ return manager ? [manager.dir] : [];
1660
+ };
1640
1661
  toolSession.agentOutputManager = new AgentOutputManager(
1641
1662
  getArtifactsDir,
1642
1663
  options.parentTaskPrefix ? { parentPrefix: options.parentTaskPrefix } : undefined,
@@ -1709,6 +1730,23 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1709
1730
  }
1710
1731
  }
1711
1732
 
1733
+ // GJC bundle runtime evidence for this activation. Producers below return
1734
+ // findings into this caller-owned accumulator and never publish; exactly one
1735
+ // complete snapshot is published once every producer has run.
1736
+ const gjcRuntimeStore = new GjcRuntimeSnapshotStore();
1737
+ let gjcProducersComplete = true;
1738
+ let gjcActivationGeneration = 0;
1739
+ try {
1740
+ gjcActivationGeneration = gjcActivationGenerationFor(await currentActivationFingerprint({ cwd }));
1741
+ } catch (error) {
1742
+ // Without a readable activation generation no snapshot can be proven
1743
+ // current, so publish nothing rather than a snapshot consumers cannot
1744
+ // validate against.
1745
+ gjcProducersComplete = false;
1746
+ logger.warn("Failed to derive GJC bundle activation generation", { error });
1747
+ }
1748
+ const gjcFindings = new GjcRuntimeFindingAccumulator(gjcActivationGeneration);
1749
+
1712
1750
  // Always-on GJC plugin bundle tools (validated registry surfaces). This is
1713
1751
  // additive and a no-op when no plugins are installed for the cwd. Surfaces
1714
1752
  // are hash-verified and collision-checked; declared names are authoritative.
@@ -1719,9 +1757,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1719
1757
  });
1720
1758
  if (pluginToolResult.tools.length > 0) customTools.push(...pluginToolResult.tools);
1721
1759
  for (const q of pluginToolResult.quarantine) {
1760
+ gjcFindings.add({ identity: q.identity, surfaceId: q.surfaceId, code: q.code, message: q.message });
1722
1761
  logger.warn("Quarantined GJC plugin surface", { plugin: q.plugin, surface: q.surfaceId, code: q.code });
1723
1762
  }
1724
1763
  } catch (error) {
1764
+ gjcProducersComplete = false;
1725
1765
  logger.warn("Failed to load always-on GJC plugin tools", { error });
1726
1766
  }
1727
1767
 
@@ -1753,6 +1793,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1753
1793
  try {
1754
1794
  const { configs, quarantine } = await buildPluginMcpConfigs({ cwd });
1755
1795
  for (const q of quarantine) {
1796
+ gjcFindings.add({ identity: q.identity, surfaceId: q.surfaceId, code: q.code, message: q.message });
1756
1797
  logger.warn("Quarantined GJC plugin MCP", { plugin: q.plugin, surface: q.surfaceId, code: q.code });
1757
1798
  }
1758
1799
  if (Object.keys(configs).length > 0) {
@@ -1766,6 +1807,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1766
1807
  );
1767
1808
  const result = await owned.connectServers(configs, sources as never);
1768
1809
  for (const [server, err] of result.errors) {
1810
+ // A server that failed to connect leaves this generation
1811
+ // incomplete: its surfaces produced no evidence, so publishing
1812
+ // would present a partial pass as a clear one.
1813
+ gjcProducersComplete = false;
1769
1814
  logger.warn("GJC plugin MCP connect failed", { path: `mcp:${server}`, error: err });
1770
1815
  }
1771
1816
  if (result.connectedServers.length > 0) {
@@ -1785,6 +1830,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1785
1830
  }
1786
1831
  }
1787
1832
  } catch (error) {
1833
+ gjcProducersComplete = false;
1788
1834
  logger.warn("Failed to wire GJC plugin MCP servers", { error });
1789
1835
  }
1790
1836
  } else if (isCanonicalSubSession) {
@@ -1834,11 +1880,14 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1834
1880
  inlineExtensions.push(createPluginHooksExtension(pluginHookResult.hooks));
1835
1881
  }
1836
1882
  for (const q of pluginHookResult.quarantine) {
1883
+ gjcFindings.add({ identity: q.identity, surfaceId: q.surfaceId, code: q.code, message: q.message });
1837
1884
  logger.warn("Quarantined GJC plugin hook", { plugin: q.plugin, surface: q.surfaceId, code: q.code });
1838
1885
  }
1839
1886
  } catch (error) {
1887
+ gjcProducersComplete = false;
1840
1888
  logger.warn("Failed to load constrained GJC plugin hooks", { error });
1841
1889
  }
1890
+
1842
1891
  let notificationCfg: NotificationConfig | undefined;
1843
1892
  try {
1844
1893
  notificationCfg = getNotificationConfig(settings);
@@ -2184,6 +2233,15 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2184
2233
  tools: Map<string, AgentTool>,
2185
2234
  candidateModel?: Model,
2186
2235
  ): Promise<BuildSystemPromptResult> => {
2236
+ // This callback is reused for later prompt/tool/model rebuilds. Retire
2237
+ // the previous generation's evidence up front: from here until a
2238
+ // complete pass republishes, consumers must read `unavailable` rather
2239
+ // than a snapshot describing a generation that no longer applies.
2240
+ // Invalidating at entry (not beside the publish) means an await or a
2241
+ // throw in between cannot leave stale evidence readable. The reserved
2242
+ // epoch additionally fences overlapping rebuilds, so a slower earlier
2243
+ // pass cannot publish over a newer one.
2244
+ const gjcPassEpoch = gjcRuntimeStore.beginPass();
2187
2245
  toolContextStore.setToolNames(toolNames);
2188
2246
  const promptTools = (() => {
2189
2247
  const previousPromptMetadataModel = promptMetadataModel;
@@ -2216,8 +2274,17 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2216
2274
  try {
2217
2275
  pluginSystemAppendices = await renderAlwaysOnSystemAppendices({ cwd });
2218
2276
  } catch (error) {
2277
+ gjcProducersComplete = false;
2219
2278
  logger.warn("Failed to render GJC plugin system appendices", { error });
2220
2279
  }
2280
+
2281
+ // Publication point for GJC bundle runtime evidence. Appendix rendering
2282
+ // is the last producer, so only here is the generation complete.
2283
+ //
2284
+ // The previous generation was already retired at callback entry, so a
2285
+ // partial pass simply never republishes and consumers keep reading
2286
+ // `unavailable` rather than a stale generation.
2287
+ if (gjcProducersComplete) gjcRuntimeStore.publish(gjcFindings.snapshot(), gjcPassEpoch);
2221
2288
  const defaultPrompt = await buildSystemPromptInternal({
2222
2289
  cwd,
2223
2290
  skills,
@@ -2364,6 +2431,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2364
2431
  (options.alwaysActiveToolNames ?? []).map(name => name.toLowerCase()),
2365
2432
  );
2366
2433
  const essentialBuiltinNames = new Set(computeEssentialBuiltinNames(settings));
2434
+ // `task.eager` promises delegation preference. In discovery mode the task tool
2435
+ // would otherwise be hidden, making the matching prompt instruction unreachable.
2436
+ if (eagerTasks) essentialBuiltinNames.add("task");
2367
2437
  const allowedDiscoveredBuiltinNames = options.discoverableToolAllowedNames
2368
2438
  ? new Set(options.discoverableToolAllowedNames.map(name => name.toLowerCase()))
2369
2439
  : undefined;
@@ -2568,6 +2638,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2568
2638
  maxRetryDelayMs: retrySettings.maxDelayMs,
2569
2639
  requestMaxRetries: retrySettings.requestMaxRetries,
2570
2640
  streamMaxRetries: retrySettings.streamMaxRetries,
2641
+ streamFirstEventTimeoutMs: settings.has("retry.streamFirstEventTimeoutMs")
2642
+ ? retrySettings.streamFirstEventTimeoutMs
2643
+ : undefined,
2571
2644
  kimiApiFormat: settings.get("providers.kimiApiFormat") ?? "anthropic",
2572
2645
  shouldPause: options.shouldPause,
2573
2646
  preferWebsockets: preferOpenAICodexWebsockets,
@@ -2853,6 +2926,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2853
2926
  // microtask (the ToolSession closure needs `session` assigned). Await it
2854
2927
  // so a resumed canonical workflow session returns with `ask` resident.
2855
2928
  await session.workflowGateToolRestoration;
2929
+ // Expose the published evidence on the session itself so UI surfaces that
2930
+ // only hold a session (Settings) can consume it without threading the
2931
+ // creation result through every controller.
2932
+ session.gjcRuntimeSnapshot = gjcRuntimeStore;
2933
+ session.gjcActivationGeneration = gjcActivationGeneration;
2856
2934
  return {
2857
2935
  session,
2858
2936
  extensionsResult,
@@ -2861,6 +2939,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2861
2939
  modelFallbackMessage,
2862
2940
  lspServers,
2863
2941
  eventBus,
2942
+ gjcRuntimeSnapshot: gjcRuntimeStore,
2864
2943
  };
2865
2944
  } catch (error) {
2866
2945
  // Release the subscription if the throw happened after install but before the