@gajae-code/coding-agent 0.18.11 → 0.18.12

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 (270) hide show
  1. package/CHANGELOG.md +293 -0
  2. package/dist/types/async/job-manager.d.ts +7 -3
  3. package/dist/types/async/result-formatting.d.ts +2 -0
  4. package/dist/types/autoresearch/git.d.ts +1 -1
  5. package/dist/types/capability/fs.d.ts +2 -2
  6. package/dist/types/cli/accounts-cli.d.ts +2 -2
  7. package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
  8. package/dist/types/cli/install-activation.d.ts +10 -4
  9. package/dist/types/cli/public-command-errors.d.ts +1 -0
  10. package/dist/types/cli/update-cli.d.ts +14 -1
  11. package/dist/types/cli-ordinary.d.ts +2 -2
  12. package/dist/types/commands/accounts.d.ts +2 -1
  13. package/dist/types/commands/migrate.d.ts +1 -1
  14. package/dist/types/commands/sdk.d.ts +5 -0
  15. package/dist/types/commit/changelog/index.d.ts +1 -0
  16. package/dist/types/config/autorouting-tier-map.d.ts +30 -0
  17. package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
  18. package/dist/types/config/config-hot-reload.d.ts +39 -0
  19. package/dist/types/config/file-lock.d.ts +8 -1
  20. package/dist/types/config/model-discovery-manager.d.ts +2 -0
  21. package/dist/types/config/model-profile-activation.d.ts +62 -6
  22. package/dist/types/config/model-registry.d.ts +56 -5
  23. package/dist/types/config/model-resolver.d.ts +2 -0
  24. package/dist/types/config/models-config-schema.d.ts +10 -0
  25. package/dist/types/config/settings-schema.d.ts +46 -3
  26. package/dist/types/config/settings.d.ts +33 -1
  27. package/dist/types/dap/config.d.ts +8 -4
  28. package/dist/types/debug/system-info.d.ts +6 -1
  29. package/dist/types/discovery/mcp-compat.d.ts +3 -1
  30. package/dist/types/edit/modes/patch.d.ts +5 -0
  31. package/dist/types/edit/modes/replace.d.ts +3 -0
  32. package/dist/types/exec/bash-executor.d.ts +12 -0
  33. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
  35. package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
  36. package/dist/types/migrate/adapters/codex.d.ts +2 -1
  37. package/dist/types/migrate/adapters/index.d.ts +10 -1
  38. package/dist/types/migrate/executor.d.ts +3 -1
  39. package/dist/types/migrate/types.d.ts +15 -3
  40. package/dist/types/modes/components/settings-selector.d.ts +6 -0
  41. package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
  42. package/dist/types/modes/theme/theme.d.ts +1 -0
  43. package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
  44. package/dist/types/runtime-mcp/manager.d.ts +7 -0
  45. package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
  46. package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
  47. package/dist/types/sdk/broker/broker-exit.d.ts +2 -2
  48. package/dist/types/sdk/broker/broker.d.ts +7 -1
  49. package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
  50. package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
  51. package/dist/types/sdk/broker/ensure.d.ts +136 -7
  52. package/dist/types/sdk/broker/hop.d.ts +36 -0
  53. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
  54. package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
  55. package/dist/types/sdk/broker/session-index.d.ts +4 -1
  56. package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
  57. package/dist/types/sdk/bus/index.d.ts +23 -0
  58. package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
  59. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  60. package/dist/types/sdk/cli/session-cli.d.ts +0 -1
  61. package/dist/types/sdk/host/session-runtime.d.ts +32 -0
  62. package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
  63. package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
  64. package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
  65. package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
  66. package/dist/types/sdk/session-list.d.ts +1 -1
  67. package/dist/types/session/agent-session.d.ts +58 -2
  68. package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
  69. package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
  70. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
  71. package/dist/types/session/messages.d.ts +5 -1
  72. package/dist/types/session/session-manager.d.ts +13 -3
  73. package/dist/types/session/startup-auth-config.d.ts +24 -2
  74. package/dist/types/session/streaming-output.d.ts +11 -0
  75. package/dist/types/session/terminal-abort.d.ts +3 -1
  76. package/dist/types/session-import/service.d.ts +1 -1
  77. package/dist/types/skill-state/workflow-mutation-guard.d.ts +7 -3
  78. package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
  79. package/dist/types/task/executor.d.ts +19 -2
  80. package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
  81. package/dist/types/tools/atomic-file-write.d.ts +9 -7
  82. package/dist/types/tools/bash-allowed-prefixes.d.ts +11 -0
  83. package/dist/types/tools/descriptors.d.ts +2 -0
  84. package/dist/types/tools/fetch.d.ts +1 -1
  85. package/dist/types/tools/index.d.ts +2 -0
  86. package/dist/types/tools/python.d.ts +1 -1
  87. package/dist/types/tools/report-issue.d.ts +41 -0
  88. package/dist/types/tools/subagent.d.ts +23 -0
  89. package/dist/types/web/scrapers/types.d.ts +8 -1
  90. package/dist/types/web/search/providers/insane.d.ts +7 -1
  91. package/dist/types/web/search/providers/searxng.d.ts +5 -0
  92. package/package.json +8 -8
  93. package/scripts/build-binary.ts +2 -1
  94. package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
  95. package/scripts/generate-docs-index.ts +8 -1
  96. package/scripts/generate-sdk-operation-inventory.ts +22 -4
  97. package/src/async/job-manager.ts +356 -56
  98. package/src/async/result-formatting.ts +40 -0
  99. package/src/autoresearch/git.ts +9 -2
  100. package/src/autoresearch/prompts/prompt-setup.md +1 -1
  101. package/src/capability/fs.ts +27 -19
  102. package/src/capability/index.ts +2 -2
  103. package/src/cli/accounts-cli.ts +176 -8
  104. package/src/cli/auth-broker-cli.ts +21 -11
  105. package/src/cli/doctor/install-repairs.ts +35 -5
  106. package/src/cli/fast-help.ts +1 -1
  107. package/src/cli/install-activation.ts +47 -4
  108. package/src/cli/migrate-cli.ts +7 -5
  109. package/src/cli/public-command-errors.ts +4 -0
  110. package/src/cli/root-flags.ts +2 -2
  111. package/src/cli/stats-cli.ts +9 -5
  112. package/src/cli/update-cli.ts +224 -7
  113. package/src/cli-ordinary.ts +7 -2
  114. package/src/commands/accounts.ts +10 -5
  115. package/src/commands/migrate.ts +3 -3
  116. package/src/commands/sdk.ts +199 -42
  117. package/src/commands/ultragoal.ts +16 -8
  118. package/src/commit/changelog/index.ts +39 -1
  119. package/src/commit/message.ts +10 -3
  120. package/src/config/autorouting-tier-map.ts +30 -0
  121. package/src/config/config-hot-reload-trust.ts +148 -0
  122. package/src/config/config-hot-reload.ts +734 -0
  123. package/src/config/file-lock.ts +216 -56
  124. package/src/config/model-bindings-applier.ts +85 -47
  125. package/src/config/model-discovery-manager.ts +10 -0
  126. package/src/config/model-profile-activation.ts +716 -113
  127. package/src/config/model-registry.ts +1334 -158
  128. package/src/config/model-resolver.ts +3 -1
  129. package/src/config/models-config-schema.ts +6 -0
  130. package/src/config/settings-schema.ts +60 -3
  131. package/src/config/settings.ts +458 -24
  132. package/src/coordinator-mcp/policy.ts +26 -1
  133. package/src/crash/sanitize.ts +4 -0
  134. package/src/customization/import.ts +3 -1
  135. package/src/dap/config.ts +31 -11
  136. package/src/dap/defaults.json +1 -1
  137. package/src/debug/crash-diagnostics.ts +2 -1
  138. package/src/debug/report-bundle.ts +19 -0
  139. package/src/debug/system-info.ts +8 -3
  140. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
  141. package/src/discovery/agents-md.ts +1 -1
  142. package/src/discovery/helpers.ts +1 -2
  143. package/src/discovery/mcp-compat.ts +120 -17
  144. package/src/edit/apply-patch/index.ts +12 -1
  145. package/src/edit/index.ts +13 -17
  146. package/src/edit/modes/patch.ts +187 -8
  147. package/src/edit/modes/replace.ts +136 -0
  148. package/src/eval/js/context-manager.ts +29 -3
  149. package/src/eval/js/worker-entry.ts +51 -18
  150. package/src/eval/py/executor.ts +14 -4
  151. package/src/eval/py/runner.py +144 -5
  152. package/src/exec/bash-executor.ts +81 -4
  153. package/src/exec/bash-shell-guardian.ts +4 -1
  154. package/src/exec/bash-shell-supervisor.ts +8 -4
  155. package/src/exec/isolated-shell.ts +5 -1
  156. package/src/export/html/index.ts +46 -6
  157. package/src/extensibility/custom-tools/wrapper.ts +3 -1
  158. package/src/extensibility/extensions/loader.ts +8 -1
  159. package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
  160. package/src/gjc-runtime/gc-runtime.ts +33 -6
  161. package/src/gjc-runtime/launch-tmux.ts +7 -2
  162. package/src/gjc-runtime/launch-worktree.test.ts +148 -0
  163. package/src/gjc-runtime/launch-worktree.ts +101 -14
  164. package/src/gjc-runtime/managed-owner-admission.ts +46 -2
  165. package/src/gjc-runtime/session-resolution.ts +38 -6
  166. package/src/gjc-runtime/session-state-lock.ts +59 -14
  167. package/src/gjc-runtime/state-runtime.ts +23 -19
  168. package/src/hooks/native-skill-hook.ts +14 -11
  169. package/src/internal-urls/docs-index.generated.ts +14 -13
  170. package/src/internal-urls/local-protocol.ts +142 -8
  171. package/src/lsp/index.ts +29 -0
  172. package/src/lsp/workspace-path.ts +23 -0
  173. package/src/migrate/action-planner.ts +57 -0
  174. package/src/migrate/adapters/claude-code.ts +23 -4
  175. package/src/migrate/adapters/codex.ts +22 -4
  176. package/src/migrate/adapters/index.ts +22 -4
  177. package/src/migrate/adapters/opencode.ts +6 -1
  178. package/src/migrate/executor.ts +84 -7
  179. package/src/migrate/report.ts +19 -2
  180. package/src/migrate/types.ts +14 -4
  181. package/src/modes/DESIGN.md +51 -0
  182. package/src/modes/acp/permission-mode.ts +18 -1
  183. package/src/modes/components/assistant-message.ts +55 -1
  184. package/src/modes/components/settings-selector.ts +103 -37
  185. package/src/modes/controllers/command-controller.ts +38 -2
  186. package/src/modes/controllers/plan-mode-controller.ts +17 -7
  187. package/src/modes/controllers/selector-controller.ts +62 -6
  188. package/src/modes/interactive-mode.ts +68 -0
  189. package/src/modes/theme/theme.ts +15 -0
  190. package/src/prompts/tools/debug.md +1 -1
  191. package/src/prompts/tools/read.md +1 -1
  192. package/src/prompts/tools/report-issue.md +13 -0
  193. package/src/prompts/tools/task.md +1 -1
  194. package/src/runtime-credential-selector.ts +2 -2
  195. package/src/runtime-mcp/content-limits.ts +7 -0
  196. package/src/runtime-mcp/manager-pool.test.ts +5 -4
  197. package/src/runtime-mcp/manager.ts +32 -0
  198. package/src/runtime-mcp/oauth-flow.ts +32 -6
  199. package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
  200. package/src/runtime-mcp/render.ts +16 -1
  201. package/src/runtime-mcp/tool-bridge.ts +126 -17
  202. package/src/sdk/broker/broker-exit.ts +8 -5
  203. package/src/sdk/broker/broker.ts +342 -82
  204. package/src/sdk/broker/daemon-entry.ts +338 -116
  205. package/src/sdk/broker/doctor-restart.ts +2 -1
  206. package/src/sdk/broker/ensure.ts +1143 -265
  207. package/src/sdk/broker/hop.ts +274 -0
  208. package/src/sdk/broker/lifecycle-ledger.ts +35 -11
  209. package/src/sdk/broker/lock-host-identity.ts +29 -0
  210. package/src/sdk/broker/session-index.ts +62 -12
  211. package/src/sdk/bus/chat-command-policy.ts +16 -3
  212. package/src/sdk/bus/index.ts +52 -21
  213. package/src/sdk/bus/reconciliation-store.ts +201 -8
  214. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  215. package/src/sdk/cli/session-cli.ts +21 -6
  216. package/src/sdk/host/session-runtime.test.ts +118 -23
  217. package/src/sdk/host/session-runtime.ts +352 -47
  218. package/src/sdk/lifecycle/service.ts +1 -0
  219. package/src/sdk/prompt-deadline-flush.ts +78 -5
  220. package/src/sdk/prompt-deadline-manager.ts +68 -14
  221. package/src/sdk/protocol/adapter-validation.ts +53 -11
  222. package/src/sdk/protocol/operation-inventory.generated.json +101 -2
  223. package/src/sdk/reconciliation-extensions.ts +1 -0
  224. package/src/sdk/session-list.ts +1 -0
  225. package/src/sdk/session.ts +114 -61
  226. package/src/session/agent-session.ts +1043 -81
  227. package/src/session/internal/managed-session-scope.ts +126 -39
  228. package/src/session/internal/managed-session-storage.ts +14 -11
  229. package/src/session/internal/native-publish-outcome.ts +5 -1
  230. package/src/session/messages.ts +47 -6
  231. package/src/session/session-manager.ts +236 -14
  232. package/src/session/startup-auth-config.ts +116 -8
  233. package/src/session/streaming-output.ts +262 -4
  234. package/src/session/terminal-abort.ts +14 -2
  235. package/src/session-import/service.ts +1 -0
  236. package/src/skill-state/workflow-mutation-guard.ts +491 -32
  237. package/src/slash-commands/builtin-registry.ts +15 -3
  238. package/src/slash-commands/helpers/credential-switch.ts +10 -5
  239. package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
  240. package/src/task/executor.ts +103 -12
  241. package/src/task/index.ts +389 -175
  242. package/src/tools/ast-edit-write-path.ts +64 -0
  243. package/src/tools/ast-edit.ts +18 -1
  244. package/src/tools/atomic-file-write.ts +46 -15
  245. package/src/tools/auto-generated-guard.ts +3 -0
  246. package/src/tools/bash-allowed-prefixes.ts +153 -5
  247. package/src/tools/bash-interactive.ts +14 -2
  248. package/src/tools/bash.ts +14 -0
  249. package/src/tools/debug.ts +7 -6
  250. package/src/tools/descriptors.test.ts +44 -0
  251. package/src/tools/descriptors.ts +34 -2
  252. package/src/tools/fetch.ts +3 -2
  253. package/src/tools/index.ts +2 -0
  254. package/src/tools/output-meta.ts +23 -2
  255. package/src/tools/python.ts +1 -1
  256. package/src/tools/read.ts +17 -35
  257. package/src/tools/report-issue.ts +184 -0
  258. package/src/tools/subagent-render.ts +114 -12
  259. package/src/tools/subagent.ts +108 -1
  260. package/src/tools/todo-write.ts +41 -3
  261. package/src/tools/tool-catalog.generated.ts +31 -3
  262. package/src/tools/write.ts +35 -3
  263. package/src/utils/commit-message-generator.ts +9 -2
  264. package/src/utils/file-mentions.ts +29 -1
  265. package/src/utils/title-generator.ts +7 -2
  266. package/src/web/scrapers/index.ts +3 -1
  267. package/src/web/scrapers/types.ts +8 -0
  268. package/src/web/scrapers/youtube.ts +3 -2
  269. package/src/web/search/providers/insane.ts +91 -28
  270. package/src/web/search/providers/searxng.ts +62 -10
@@ -1896,10 +1896,10 @@ const EXECUTION_APPROVAL_TRANSCRIPT_MAX_BYTES = 128 * 1024 * 1024;
1896
1896
  const DEEP_INTERVIEW_EXECUTION_APPROVAL_RECORD_MAX_BYTES = 16 * 1024;
1897
1897
  const DEEP_INTERVIEW_EXECUTION_APPROVAL_ID_MAX_LENGTH = 256;
1898
1898
 
1899
+ // The boundary binds approval to transcript content (prefix length/sha256, leaf, Ask call), not to
1900
+ // the file's inode: SessionManager persists full rewrites by atomic rename, which replaces the inode.
1899
1901
  export interface ExecutionApprovalTranscriptBoundary {
1900
1902
  byte_length: number;
1901
- device: string;
1902
- inode: string;
1903
1903
  leaf_id: string | null;
1904
1904
  approval_tool_call_id: string;
1905
1905
  }
@@ -1909,10 +1909,6 @@ function isExecutionApprovalTranscriptBoundary(value: unknown): value is Executi
1909
1909
  isPlainObject(value) &&
1910
1910
  Number.isSafeInteger(value.byte_length) &&
1911
1911
  (value.byte_length as number) > 0 &&
1912
- typeof value.device === "string" &&
1913
- /^\d+$/.test(value.device) &&
1914
- typeof value.inode === "string" &&
1915
- /^\d+$/.test(value.inode) &&
1916
1912
  (value.leaf_id === null || isExecutionApprovalId(value.leaf_id)) &&
1917
1913
  isExecutionApprovalId(value.approval_tool_call_id)
1918
1914
  );
@@ -2037,8 +2033,6 @@ export async function captureExecutionApprovalTranscriptBoundary(
2037
2033
  throw new StateCommandError(2, "execution approval transcript boundary lacks the current Ask call");
2038
2034
  return {
2039
2035
  byte_length: Buffer.byteLength(text),
2040
- device: after.dev.toString(),
2041
- inode: after.ino.toString(),
2042
2036
  leaf_id: prefix.leaf,
2043
2037
  approval_tool_call_id: approvalToolCallId,
2044
2038
  };
@@ -2062,13 +2056,8 @@ export async function assertExecutionApprovalTranscriptBoundary(
2062
2056
  const after = await fs.lstat(transcriptPath, { bigint: true });
2063
2057
  if ((await fs.realpath(transcriptPath)) !== path.resolve(transcriptPath))
2064
2058
  throw new StateCommandError(2, "execution approval transcript path is not canonical");
2065
- if (
2066
- !sameBoundedFileIdentity(before, after) ||
2067
- after.dev.toString() !== boundary.device ||
2068
- after.ino.toString() !== boundary.inode ||
2069
- text === undefined
2070
- )
2071
- throw new StateCommandError(2, "execution approval transcript identity changed");
2059
+ if (!sameBoundedFileIdentity(before, after) || text === undefined)
2060
+ throw new StateCommandError(2, "execution approval transcript changed while it was read");
2072
2061
  const bytes = Buffer.from(text);
2073
2062
  const prefix = bytes.subarray(0, boundary.byte_length);
2074
2063
  if (prefix.length !== boundary.byte_length || createHash("sha256").update(prefix).digest("hex") !== transcriptSha256)
@@ -3222,6 +3211,21 @@ async function assertSanctionedExecutionApprovalAudit(
3222
3211
  )
3223
3212
  throw new StateCommandError(2, "deep-interview execution approval lacks sanctioned transition provenance");
3224
3213
 
3214
+ // The approval index is written only after the append-only ledger entry.
3215
+ // A pending journal means that append did not finish, so the index must
3216
+ // not authorize execution handoff.
3217
+ let approvalJournal: WorkflowTransactionJournal | undefined;
3218
+ try {
3219
+ approvalJournal = await readWorkflowTransactionJournal(cwd, sessionId, mutationId);
3220
+ } catch (error) {
3221
+ throw new StateCommandError(
3222
+ 2,
3223
+ `failed to read execution approval journal: ${error instanceof Error ? error.message : String(error)}`,
3224
+ );
3225
+ }
3226
+ if (approvalJournal?.status === "pending")
3227
+ throw new StateCommandError(2, "deep-interview execution approval journal is incomplete");
3228
+
3225
3229
  const indexedApprovalPath = path.join(sessionStateDir(cwd, sessionId), "deep-interview-approval-audit.json");
3226
3230
  let indexedRaw = "";
3227
3231
  try {
@@ -5067,8 +5071,6 @@ async function appendExecutionApprovalAudit(
5067
5071
  } = {},
5068
5072
  ): Promise<void> {
5069
5073
  const entry = buildExecutionApprovalAuditEntry(options);
5070
- await writeExecutionApprovalIndex(options, entry);
5071
- await hooks.afterIndex?.();
5072
5074
  const filePath = auditPath(options.cwd, options.sessionId);
5073
5075
  await withWorkflowStateLock(
5074
5076
  filePath,
@@ -5089,6 +5091,8 @@ async function appendExecutionApprovalAudit(
5089
5091
  },
5090
5092
  { cwd: options.cwd },
5091
5093
  );
5094
+ await writeExecutionApprovalIndex(options, entry);
5095
+ await hooks.afterIndex?.();
5092
5096
  await hooks.afterAudit?.();
5093
5097
  }
5094
5098
 
@@ -5296,8 +5300,6 @@ async function handleApproveExecutionRecordLocked(
5296
5300
  indexedMatches = isPlainObject(parsed) && JSON.stringify(parsed) === JSON.stringify(expectedApprovalEntry);
5297
5301
  } catch {}
5298
5302
  }
5299
- if (!indexedMatches) await writeExecutionApprovalIndex(approvalOptions, expectedApprovalEntry);
5300
- recoverySteps.add("approval-index");
5301
5303
  let approvalAuditOffset = pendingJournal.approval_audit_offset;
5302
5304
  if (!recoverySteps.has("approval-audit")) {
5303
5305
  approvalAuditOffset = await appendExecutionApprovalAuditIdempotent(
@@ -5312,6 +5314,8 @@ async function handleApproveExecutionRecordLocked(
5312
5314
  );
5313
5315
  recoverySteps.add("approval-audit");
5314
5316
  }
5317
+ if (!indexedMatches) await writeExecutionApprovalIndex(approvalOptions, expectedApprovalEntry);
5318
+ recoverySteps.add("approval-index");
5315
5319
  await updateWorkflowTransactionJournal(cwd, selectors.gjcSessionId, existingReceipt.mutation_id, {
5316
5320
  steps: [...recoverySteps],
5317
5321
  approval_audit_offset: approvalAuditOffset,
@@ -1,10 +1,12 @@
1
1
  import { appendFile, mkdir, stat } from "node:fs/promises";
2
2
  import * as path from "node:path";
3
3
  import { getAgentDir, getConfigDirName } from "@gajae-code/utils";
4
+ import { projectEnvSnapshot } from "@gajae-code/utils/env-file";
4
5
  import { YAML } from "bun";
5
6
  import type { SkillDiscoverySettings } from "../config/skill-settings-defaults";
6
7
  import { DEFAULT_DISABLED_EXTENSIONS, DEFAULT_SKILL_DISCOVERY_SETTINGS } from "../config/skill-settings-defaults";
7
8
  import { sessionLogsDir } from "../gjc-runtime/session-layout";
9
+ import { trustedCoordinatorEnv } from "../gjc-runtime/sidecar-bootstrap-env";
8
10
  import {
9
11
  detectMcpDelegateFlowActivation,
10
12
  type McpDelegateHostContextV1,
@@ -281,14 +283,14 @@ function readTurnId(payload: HookPayload): string | undefined {
281
283
  return safeString(payload.turn_id ?? payload.turnId).trim() || undefined;
282
284
  }
283
285
 
284
- function readSessionFile(payload: HookPayload): string | undefined {
285
- return (
286
- safeString(
287
- payload.session_file ?? payload.sessionFile ?? payload.transcript_path ?? payload.transcriptPath,
288
- ).trim() ||
289
- process.env.GJC_SESSION_FILE?.trim() ||
290
- undefined
291
- );
286
+ function readSessionFile(payload: HookPayload, cwd: string): string | undefined {
287
+ const explicit = safeString(
288
+ payload.session_file ?? payload.sessionFile ?? payload.transcript_path ?? payload.transcriptPath,
289
+ ).trim();
290
+ if (explicit) return explicit;
291
+ // Bun has already copied the project dotenv into the environment. A value
292
+ // that matches that snapshot must not select another transcript.
293
+ return trustedCoordinatorEnv("GJC_SESSION_FILE", process.env, projectEnvSnapshot(cwd));
292
294
  }
293
295
 
294
296
  export async function dispatchGjcNativeSkillHook(
@@ -297,6 +299,7 @@ export async function dispatchGjcNativeSkillHook(
297
299
  ): Promise<GjcNativeHookDispatchResult> {
298
300
  const hookEventName = readHookEventName(payload);
299
301
  const cwd = (options.cwd ?? safeString(payload.cwd).trim()) || process.cwd();
302
+ const sessionFile = readSessionFile(payload, cwd);
300
303
  if (hookEventName === "UserPromptSubmit") {
301
304
  const recoveryDiagnostics = await collectUserPromptStateRecoveryDiagnostics({
302
305
  cwd,
@@ -304,7 +307,7 @@ export async function dispatchGjcNativeSkillHook(
304
307
  threadId: readThreadId(payload),
305
308
  stateDir: options.stateDir,
306
309
  prompt: readPromptText(payload),
307
- sessionFile: readSessionFile(payload),
310
+ sessionFile,
308
311
  });
309
312
  const recoveryContext = buildStateRecoveryDiagnosticsContext(recoveryDiagnostics);
310
313
  const prompt = readPromptText(payload);
@@ -346,7 +349,7 @@ export async function dispatchGjcNativeSkillHook(
346
349
  threadId: readThreadId(payload),
347
350
  stateDir: options.stateDir,
348
351
  prompt,
349
- sessionFile: readSessionFile(payload),
352
+ sessionFile,
350
353
  });
351
354
  if (activeUltragoalContext?.startsWith("BLOCK_ULTRAGOAL_COMPLETION:")) {
352
355
  return {
@@ -390,7 +393,7 @@ export async function dispatchGjcNativeSkillHook(
390
393
  sessionId: readSessionId(payload),
391
394
  threadId: readThreadId(payload),
392
395
  stateDir: options.stateDir,
393
- sessionFile: readSessionFile(payload),
396
+ sessionFile,
394
397
  }),
395
398
  };
396
399
  }