@gajae-code/coding-agent 0.15.5 → 0.16.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 (272) hide show
  1. package/CHANGELOG.md +85 -1
  2. package/dist/types/async/job-manager.d.ts +83 -0
  3. package/dist/types/cli/args.d.ts +2 -0
  4. package/dist/types/cli/auth-gateway-cli.d.ts +17 -0
  5. package/dist/types/cli/model-presets-cli.d.ts +9 -0
  6. package/dist/types/cli/root-flags.d.ts +14 -0
  7. package/dist/types/cli/update-cli.d.ts +15 -0
  8. package/dist/types/cli.d.ts +7 -0
  9. package/dist/types/commands/auth-gateway.d.ts +3 -0
  10. package/dist/types/commands/gc.d.ts +13 -0
  11. package/dist/types/commands/launch.d.ts +10 -0
  12. package/dist/types/commands/model-presets.d.ts +21 -0
  13. package/dist/types/config/autorouting-tier-map.d.ts +120 -0
  14. package/dist/types/config/file-lock.d.ts +54 -2
  15. package/dist/types/config/internal/model-preset-registry-test-state.d.ts +4 -0
  16. package/dist/types/config/internal/model-preset-registry-test-support.d.ts +3 -0
  17. package/dist/types/config/keybindings.d.ts +3 -2
  18. package/dist/types/config/model-preset-registry.d.ts +368 -0
  19. package/dist/types/config/model-profile-activation.d.ts +39 -0
  20. package/dist/types/config/model-profiles.d.ts +5 -3
  21. package/dist/types/config/model-registry.d.ts +17 -5
  22. package/dist/types/config/settings-schema.d.ts +19 -1
  23. package/dist/types/config/settings.d.ts +2 -0
  24. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -5
  25. package/dist/types/coordinator-mcp/projection-scan.d.ts +54 -0
  26. package/dist/types/crash/record-loader.d.ts +15 -0
  27. package/dist/types/extensibility/extensions/types.d.ts +2 -5
  28. package/dist/types/gjc-runtime/empty-delete-gc.d.ts +58 -0
  29. package/dist/types/gjc-runtime/gc-runtime.d.ts +2 -0
  30. package/dist/types/gjc-runtime/launch-worktree-reservation.d.ts +21 -0
  31. package/dist/types/gjc-runtime/managed-owner-supervisor.d.ts +2 -0
  32. package/dist/types/gjc-runtime/session-state-lock.d.ts +35 -6
  33. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +72 -1
  34. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +1 -0
  35. package/dist/types/gjc-runtime/tmux-sessions.d.ts +27 -0
  36. package/dist/types/index.d.ts +1 -0
  37. package/dist/types/main.d.ts +3 -1
  38. package/dist/types/master-mode/context.d.ts +21 -0
  39. package/dist/types/master-mode/first-request.d.ts +34 -0
  40. package/dist/types/master-mode/snapshot.d.ts +32 -0
  41. package/dist/types/modes/components/frictionless-onboarding-selector.d.ts +10 -0
  42. package/dist/types/modes/components/jobs-overlay-model.d.ts +4 -2
  43. package/dist/types/modes/components/oauth-selector.d.ts +1 -0
  44. package/dist/types/modes/components/status-line/model-name.d.ts +18 -0
  45. package/dist/types/modes/components/status-line/priority-row.d.ts +34 -0
  46. package/dist/types/modes/components/status-line/segments.d.ts +10 -0
  47. package/dist/types/modes/jobs-observer.d.ts +36 -0
  48. package/dist/types/modes/print-mode.d.ts +17 -0
  49. package/dist/types/modes/ui-language.d.ts +7 -1
  50. package/dist/types/sdk/broker/broker.d.ts +80 -1
  51. package/dist/types/sdk/broker/endpoint-authority.d.ts +24 -0
  52. package/dist/types/sdk/broker/index.d.ts +3 -0
  53. package/dist/types/sdk/broker/lifecycle.d.ts +26 -0
  54. package/dist/types/sdk/broker/master-capability.d.ts +10 -0
  55. package/dist/types/sdk/broker/session-index.d.ts +40 -11
  56. package/dist/types/sdk/broker/session-scope.d.ts +72 -0
  57. package/dist/types/sdk/broker/spawn-authority.d.ts +201 -0
  58. package/dist/types/sdk/broker/spawn-substrate.d.ts +30 -0
  59. package/dist/types/sdk/broker/state-version.d.ts +4 -1
  60. package/dist/types/sdk/broker/worktree-occupancy.d.ts +28 -0
  61. package/dist/types/sdk/bus/chat-daemon-control.d.ts +3 -0
  62. package/dist/types/sdk/bus/index.d.ts +6 -0
  63. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +3 -0
  64. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +4 -0
  65. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +1 -1
  66. package/dist/types/sdk/cli/index.d.ts +1 -0
  67. package/dist/types/sdk/cli/master-cli.d.ts +63 -0
  68. package/dist/types/sdk/cli/rows.d.ts +4 -3
  69. package/dist/types/sdk/cli/session-cli.d.ts +18 -2
  70. package/dist/types/sdk/client/client.d.ts +3 -2
  71. package/dist/types/sdk/client/discovery.d.ts +1 -0
  72. package/dist/types/sdk/host/control/dispatch.d.ts +10 -0
  73. package/dist/types/sdk/host/control/index.d.ts +1 -1
  74. package/dist/types/sdk/host/control/operations.d.ts +2 -0
  75. package/dist/types/sdk/host/control/runtime-gate.d.ts +21 -7
  76. package/dist/types/sdk/host/host.d.ts +10 -0
  77. package/dist/types/sdk/host/model-pin.d.ts +7 -2
  78. package/dist/types/sdk/host/sdk-run-capability.d.ts +1 -0
  79. package/dist/types/sdk/host/session-runtime.d.ts +67 -1
  80. package/dist/types/sdk/lifecycle/broker-client.d.ts +6 -0
  81. package/dist/types/sdk/lifecycle/service.d.ts +15 -3
  82. package/dist/types/sdk/lifecycle-session.d.ts +2 -0
  83. package/dist/types/sdk/prompt-deadline-manager.d.ts +11 -1
  84. package/dist/types/sdk/protocol/adapter-validation.d.ts +2 -0
  85. package/dist/types/sdk/router/session-router.d.ts +11 -0
  86. package/dist/types/sdk/session.d.ts +16 -0
  87. package/dist/types/sdk/startup-capability.d.ts +2 -1
  88. package/dist/types/session/account-inventory.d.ts +1 -0
  89. package/dist/types/session/agent-session.d.ts +24 -7
  90. package/dist/types/session/credential-store-errors.d.ts +1 -0
  91. package/dist/types/session/fold-coordinator.d.ts +201 -0
  92. package/dist/types/session/sdk-run-capability-internal.d.ts +7 -0
  93. package/dist/types/session/sdk-run-capability.d.ts +2 -0
  94. package/dist/types/session/session-manager.d.ts +65 -0
  95. package/dist/types/session/yield-queue.d.ts +5 -4
  96. package/dist/types/setup/frictionless-onboarding.d.ts +1 -0
  97. package/dist/types/telemetry/control.d.ts +11 -0
  98. package/dist/types/telemetry/events.d.ts +20 -0
  99. package/dist/types/telemetry/index.d.ts +3 -0
  100. package/dist/types/telemetry/transport.d.ts +22 -0
  101. package/dist/types/tools/bash-interactive.d.ts +23 -0
  102. package/dist/types/tools/bash.d.ts +4 -0
  103. package/dist/types/tools/gh.d.ts +8 -0
  104. package/dist/types/tools/index.d.ts +10 -5
  105. package/dist/types/web/search/providers/base.d.ts +9 -4
  106. package/dist/types/web/search/providers/xai.d.ts +2 -1
  107. package/dist/types/web/search/types.d.ts +14 -0
  108. package/package.json +10 -7
  109. package/scripts/generate-hotkeys-docs.ts +4 -0
  110. package/scripts/generate-sdk-operation-inventory.ts +9 -3
  111. package/scripts/verify-gjc-sdk-canonicalization.ts +35 -1
  112. package/src/async/job-manager.ts +671 -39
  113. package/src/cli/accounts-cli.ts +9 -5
  114. package/src/cli/args.ts +17 -0
  115. package/src/cli/auth-broker-cli.ts +40 -12
  116. package/src/cli/auth-gateway-cli.ts +273 -97
  117. package/src/cli/config-cli.ts +2 -2
  118. package/src/cli/fast-help.ts +4 -0
  119. package/src/cli/model-presets-cli.ts +100 -0
  120. package/src/cli/root-flags.ts +5 -0
  121. package/src/cli/update-cli.ts +117 -16
  122. package/src/cli.ts +6 -2
  123. package/src/commands/auth-gateway.ts +12 -8
  124. package/src/commands/gc.ts +19 -0
  125. package/src/commands/launch.ts +86 -18
  126. package/src/commands/model-presets.ts +24 -0
  127. package/src/commands/sdk.ts +113 -21
  128. package/src/config/autorouting-tier-map.ts +44 -0
  129. package/src/config/file-lock-gc.ts +9 -4
  130. package/src/config/file-lock.ts +890 -99
  131. package/src/config/internal/model-preset-registry-test-state.ts +28 -0
  132. package/src/config/internal/model-preset-registry-test-support.ts +11 -0
  133. package/src/config/keybindings.ts +6 -2
  134. package/src/config/model-preset-registry.ts +2795 -0
  135. package/src/config/model-profile-activation.ts +115 -28
  136. package/src/config/model-profile-contract.ts +4 -1
  137. package/src/config/model-profiles.ts +56 -14
  138. package/src/config/model-registry.ts +1044 -122
  139. package/src/config/model-resolver.ts +5 -0
  140. package/src/config/settings-schema.ts +19 -1
  141. package/src/config/settings.ts +11 -1
  142. package/src/coordinator-mcp/model-preset.ts +32 -17
  143. package/src/coordinator-mcp/projection-scan.ts +592 -0
  144. package/src/coordinator-mcp/question-state.ts +9 -11
  145. package/src/coordinator-mcp/server.ts +111 -42
  146. package/src/coordinator-mcp/session-reaper.ts +9 -3
  147. package/src/crash/index-store.ts +2 -0
  148. package/src/crash/record-loader.ts +10 -0
  149. package/src/extensibility/extensions/loader.ts +0 -1
  150. package/src/extensibility/extensions/types.ts +2 -3
  151. package/src/extensibility/gjc-plugins/runtime-adapters.ts +1 -0
  152. package/src/gjc-runtime/empty-delete-gc.ts +301 -0
  153. package/src/gjc-runtime/gc-render.ts +29 -0
  154. package/src/gjc-runtime/gc-runtime.ts +174 -11
  155. package/src/gjc-runtime/launch-worktree-reservation.ts +242 -0
  156. package/src/gjc-runtime/managed-owner-supervisor.ts +63 -51
  157. package/src/gjc-runtime/session-state-lock.ts +1321 -147
  158. package/src/gjc-runtime/session-state-sidecar.ts +1004 -25
  159. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +4 -7
  160. package/src/gjc-runtime/tmux-owner-isolation.ts +2 -2
  161. package/src/gjc-runtime/tmux-sessions.ts +252 -13
  162. package/src/hooks/skill-state.ts +6 -0
  163. package/src/index.ts +1 -0
  164. package/src/internal-urls/docs-index.generated.ts +14 -13
  165. package/src/internal-urls/issue-pr-protocol.ts +4 -2
  166. package/src/lsp/config.ts +4 -3
  167. package/src/lsp/path-trust.ts +12 -6
  168. package/src/main.ts +66 -4
  169. package/src/master-mode/context.ts +50 -0
  170. package/src/master-mode/first-request.ts +65 -0
  171. package/src/master-mode/snapshot.ts +205 -0
  172. package/src/modes/acp/acp-agent.ts +616 -161
  173. package/src/modes/components/footer.ts +4 -2
  174. package/src/modes/components/frictionless-onboarding-selector.ts +48 -2
  175. package/src/modes/components/jobs-overlay-model.ts +99 -16
  176. package/src/modes/components/model-selector.ts +158 -18
  177. package/src/modes/components/oauth-selector.ts +6 -1
  178. package/src/modes/components/settings-selector.ts +1 -0
  179. package/src/modes/components/status-line/model-name.ts +53 -0
  180. package/src/modes/components/status-line/priority-row.ts +107 -0
  181. package/src/modes/components/status-line/segments.ts +29 -10
  182. package/src/modes/components/tool-status-header.ts +151 -15
  183. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  184. package/src/modes/controllers/input-controller.ts +51 -6
  185. package/src/modes/controllers/selector-controller.ts +191 -96
  186. package/src/modes/interactive-mode.ts +14 -1
  187. package/src/modes/jobs-observer.ts +149 -16
  188. package/src/modes/print-mode.ts +64 -0
  189. package/src/modes/runtime-init.ts +1 -1
  190. package/src/modes/ui-language.ts +49 -2
  191. package/src/modes/utils/injected-user-submission.ts +15 -1
  192. package/src/prompts/system/master-mode.md +28 -0
  193. package/src/prompts/tools/bash.md +2 -2
  194. package/src/prompts/tools/fold-receipt.md +3 -0
  195. package/src/prompts/tools/job.md +1 -1
  196. package/src/sdk/acp/adapter.ts +17 -2
  197. package/src/sdk/broker/broker.ts +1671 -34
  198. package/src/sdk/broker/endpoint-authority.ts +86 -0
  199. package/src/sdk/broker/ensure.ts +5 -0
  200. package/src/sdk/broker/index.ts +3 -0
  201. package/src/sdk/broker/lifecycle.ts +217 -46
  202. package/src/sdk/broker/master-capability.ts +232 -0
  203. package/src/sdk/broker/session-index.ts +121 -17
  204. package/src/sdk/broker/session-scope.ts +272 -0
  205. package/src/sdk/broker/spawn-authority.ts +1031 -0
  206. package/src/sdk/broker/spawn-substrate.ts +548 -0
  207. package/src/sdk/broker/state-version.ts +26 -14
  208. package/src/sdk/broker/transport.ts +1 -0
  209. package/src/sdk/broker/worktree-occupancy.ts +90 -0
  210. package/src/sdk/bus/chat-daemon-control.ts +5 -2
  211. package/src/sdk/bus/chat-daemon-runtime.ts +46 -5
  212. package/src/sdk/bus/index.ts +51 -4
  213. package/src/sdk/bus/kind-aware-reconciliation.ts +36 -6
  214. package/src/sdk/bus/prompt-reconciliation.ts +28 -4
  215. package/src/sdk/bus/slack-conversation.ts +5 -1
  216. package/src/sdk/bus/telegram-daemon-contract.ts +1 -1
  217. package/src/sdk/cli/index.ts +1 -0
  218. package/src/sdk/cli/master-cli.ts +259 -0
  219. package/src/sdk/cli/rows.ts +11 -8
  220. package/src/sdk/cli/session-cli.ts +276 -6
  221. package/src/sdk/client/client.ts +14 -8
  222. package/src/sdk/client/discovery.ts +3 -1
  223. package/src/sdk/host/control/dispatch.ts +101 -37
  224. package/src/sdk/host/control/index.ts +2 -0
  225. package/src/sdk/host/control/operations.ts +2 -0
  226. package/src/sdk/host/control/runtime-gate.ts +203 -11
  227. package/src/sdk/host/host.ts +27 -2
  228. package/src/sdk/host/model-pin.ts +185 -25
  229. package/src/sdk/host/sdk-run-capability.ts +1 -0
  230. package/src/sdk/host/session-runtime.test.ts +581 -43
  231. package/src/sdk/host/session-runtime.ts +655 -101
  232. package/src/sdk/lifecycle/broker-client.ts +28 -0
  233. package/src/sdk/lifecycle/service.ts +279 -20
  234. package/src/sdk/lifecycle-session.ts +10 -2
  235. package/src/sdk/prompt-deadline-manager.ts +16 -1
  236. package/src/sdk/protocol/adapter-validation.ts +27 -0
  237. package/src/sdk/protocol/operation-inventory.generated.json +53 -2
  238. package/src/sdk/protocol/operation-registry.ts +17 -4
  239. package/src/sdk/router/session-router.ts +294 -154
  240. package/src/sdk/session.ts +440 -167
  241. package/src/sdk/startup-capability.ts +1 -0
  242. package/src/session/account-inventory.ts +27 -11
  243. package/src/session/agent-session.ts +1292 -180
  244. package/src/session/blob-store.ts +15 -5
  245. package/src/session/credential-store-errors.ts +2 -0
  246. package/src/session/fold-coordinator.ts +433 -0
  247. package/src/session/internal/managed-session-storage.ts +153 -78
  248. package/src/session/sdk-run-capability-internal.ts +15 -0
  249. package/src/session/sdk-run-capability.ts +2 -0
  250. package/src/session/session-manager.ts +342 -28
  251. package/src/session/yield-queue.ts +24 -10
  252. package/src/setup/frictionless-onboarding.ts +2 -0
  253. package/src/setup/provider-presets.json +1 -1
  254. package/src/slash-commands/helpers/credential-switch.ts +6 -1
  255. package/src/task/executor.ts +19 -3
  256. package/src/telemetry/control.ts +26 -0
  257. package/src/telemetry/events.ts +1268 -0
  258. package/src/telemetry/index.ts +3 -0
  259. package/src/telemetry/transport.ts +87 -0
  260. package/src/tools/bash-interactive.ts +182 -85
  261. package/src/tools/bash.ts +1028 -109
  262. package/src/tools/gh.ts +104 -48
  263. package/src/tools/github-cache.ts +2 -2
  264. package/src/tools/index.ts +11 -5
  265. package/src/tools/tool-catalog.generated.ts +1 -1
  266. package/src/web/search/provider.ts +120 -11
  267. package/src/web/search/providers/anthropic.ts +89 -17
  268. package/src/web/search/providers/base.ts +9 -4
  269. package/src/web/search/providers/gemini.ts +87 -15
  270. package/src/web/search/providers/openai-compatible.ts +23 -8
  271. package/src/web/search/providers/xai.ts +98 -12
  272. package/src/web/search/types.ts +16 -0
@@ -0,0 +1,272 @@
1
+ import { canonicalSessionCwd, type SessionLocatorV2, sessionWorktreeRoot } from "./session-index";
2
+
3
+ export type ScopeNameV1 = "repo" | "pwd" | "global";
4
+
5
+ export type ScopeRequestV1 = {
6
+ version: 1;
7
+ requested: ScopeNameV1;
8
+ requestAnchor: { cwd: string; worktreeRoot: string | null };
9
+ };
10
+
11
+ export type ResolvedScopeV1 = {
12
+ version: 1;
13
+ requested: ScopeNameV1;
14
+ requestAnchor: { cwd: string; worktreeRoot: string | null };
15
+ resolved:
16
+ | { kind: "repo"; worktreeRoot: string }
17
+ | { kind: "pwd"; cwd: string }
18
+ | { kind: "global"; visibility: "current-broker" }
19
+ | null;
20
+ resolution: "resolved" | "not-in-git-worktree";
21
+ };
22
+
23
+ export type SdkSearchRowV1 = {
24
+ id: string;
25
+ locator: { cwd: string; worktreeRoot: string | null; stateRoot: string };
26
+ live: boolean;
27
+ probe?: "reachable" | "unreachable" | "stale";
28
+ };
29
+
30
+ export type SdkSearchResultV1 = {
31
+ version: 1;
32
+ scope: ResolvedScopeV1;
33
+ status: "populated" | "empty" | "not-in-git-worktree" | "unavailable";
34
+ observedAt: string;
35
+ indexSeq?: number;
36
+ rows: readonly SdkSearchRowV1[];
37
+ cursor?: string;
38
+ warnings: readonly string[];
39
+ error?: { code: string; message: string };
40
+ };
41
+
42
+ export class ScopeRequestValidationError extends Error {
43
+ constructor(message: string) {
44
+ super(message);
45
+ this.name = "ScopeRequestValidationError";
46
+ }
47
+ }
48
+
49
+ function record(value: unknown): Record<string, unknown> | undefined {
50
+ return value !== null && typeof value === "object" && !Array.isArray(value)
51
+ ? (value as Record<string, unknown>)
52
+ : undefined;
53
+ }
54
+
55
+ /** Strictly validates the versioned request shape before canonical resolution. */
56
+ export function scopeRequestV1(value: unknown): ScopeRequestV1 | undefined {
57
+ const request = record(value);
58
+ const anchor = request === undefined ? undefined : record(request.requestAnchor);
59
+ if (
60
+ request?.version !== 1 ||
61
+ (request.requested !== "repo" && request.requested !== "pwd" && request.requested !== "global") ||
62
+ anchor === undefined ||
63
+ typeof anchor.cwd !== "string" ||
64
+ anchor.cwd.length === 0 ||
65
+ (anchor.worktreeRoot !== null && (typeof anchor.worktreeRoot !== "string" || anchor.worktreeRoot.length === 0)) ||
66
+ Object.keys(request).some(key => key !== "version" && key !== "requested" && key !== "requestAnchor") ||
67
+ Object.keys(anchor).some(key => key !== "cwd" && key !== "worktreeRoot")
68
+ )
69
+ return undefined;
70
+ return {
71
+ version: 1,
72
+ requested: request.requested,
73
+ requestAnchor: { cwd: anchor.cwd, worktreeRoot: anchor.worktreeRoot },
74
+ };
75
+ }
76
+
77
+ /** Strictly validates a resolved descriptor returned by Broker pages. */
78
+ export function resolvedScopeV1(value: unknown): ResolvedScopeV1 | undefined {
79
+ const scope = record(value);
80
+ if (!scope) return undefined;
81
+ const request = scopeRequestV1({
82
+ version: scope.version,
83
+ requested: scope.requested,
84
+ requestAnchor: scope.requestAnchor,
85
+ });
86
+ if (
87
+ !request ||
88
+ (scope.resolution !== "resolved" && scope.resolution !== "not-in-git-worktree") ||
89
+ Object.keys(scope).some(
90
+ key =>
91
+ key !== "version" &&
92
+ key !== "requested" &&
93
+ key !== "requestAnchor" &&
94
+ key !== "resolved" &&
95
+ key !== "resolution",
96
+ )
97
+ )
98
+ return undefined;
99
+ const resolved = scope.resolved;
100
+ if (resolved === null)
101
+ return scope.resolution === "not-in-git-worktree" && request.requested === "repo"
102
+ ? { ...request, resolved: null, resolution: "not-in-git-worktree" }
103
+ : undefined;
104
+ const descriptor = record(resolved);
105
+ if (!descriptor || scope.resolution !== "resolved") return undefined;
106
+ if (
107
+ request.requested === "repo" &&
108
+ descriptor.kind === "repo" &&
109
+ typeof descriptor.worktreeRoot === "string" &&
110
+ Object.keys(descriptor).every(key => key === "kind" || key === "worktreeRoot")
111
+ )
112
+ return { ...request, resolved: { kind: "repo", worktreeRoot: descriptor.worktreeRoot }, resolution: "resolved" };
113
+ if (
114
+ request.requested === "pwd" &&
115
+ descriptor.kind === "pwd" &&
116
+ typeof descriptor.cwd === "string" &&
117
+ Object.keys(descriptor).every(key => key === "kind" || key === "cwd")
118
+ )
119
+ return { ...request, resolved: { kind: "pwd", cwd: descriptor.cwd }, resolution: "resolved" };
120
+ if (
121
+ request.requested === "global" &&
122
+ descriptor.kind === "global" &&
123
+ descriptor.visibility === "current-broker" &&
124
+ Object.keys(descriptor).every(key => key === "kind" || key === "visibility")
125
+ )
126
+ return { ...request, resolved: { kind: "global", visibility: "current-broker" }, resolution: "resolved" };
127
+ return undefined;
128
+ }
129
+
130
+ /** Strictly validates a safe broker-search row. */
131
+ export function sdkSearchRowV1(value: unknown): SdkSearchRowV1 | undefined {
132
+ const row = record(value);
133
+ const locator = row === undefined ? undefined : record(row.locator);
134
+ if (
135
+ typeof row?.id !== "string" ||
136
+ row.id.length === 0 ||
137
+ (row.live !== true && row.live !== false) ||
138
+ (row.probe !== undefined && row.probe !== "reachable" && row.probe !== "unreachable" && row.probe !== "stale") ||
139
+ !locator ||
140
+ typeof locator.cwd !== "string" ||
141
+ (locator.worktreeRoot !== null && typeof locator.worktreeRoot !== "string") ||
142
+ typeof locator.stateRoot !== "string" ||
143
+ Object.keys(locator).some(key => key !== "cwd" && key !== "worktreeRoot" && key !== "stateRoot") ||
144
+ Object.keys(row).some(key => key !== "id" && key !== "locator" && key !== "live" && key !== "probe")
145
+ )
146
+ return undefined;
147
+ return {
148
+ id: row.id,
149
+ locator: { cwd: locator.cwd, worktreeRoot: locator.worktreeRoot, stateRoot: locator.stateRoot },
150
+ live: row.live,
151
+ ...(row.probe === undefined ? {} : { probe: row.probe }),
152
+ };
153
+ }
154
+
155
+ /** Strictly validates the aggregate credential-free search envelope. */
156
+ export function sdkSearchResultV1(value: unknown): SdkSearchResultV1 | undefined {
157
+ const result = record(value);
158
+ const scope = result === undefined ? undefined : resolvedScopeV1(result.scope);
159
+ const cursor = typeof result?.cursor === "string" && result.cursor.length > 0 ? result.cursor : undefined;
160
+ if (
161
+ result?.version !== 1 ||
162
+ !scope ||
163
+ (result.status !== "populated" &&
164
+ result.status !== "empty" &&
165
+ result.status !== "not-in-git-worktree" &&
166
+ result.status !== "unavailable") ||
167
+ typeof result.observedAt !== "string" ||
168
+ !Array.isArray(result.rows) ||
169
+ !Array.isArray(result.warnings) ||
170
+ result.rows.some(row => !sdkSearchRowV1(row)) ||
171
+ (result.cursor !== undefined && cursor === undefined) ||
172
+ result.warnings.some(warning => typeof warning !== "string") ||
173
+ Object.keys(result).some(
174
+ key =>
175
+ key !== "version" &&
176
+ key !== "scope" &&
177
+ key !== "status" &&
178
+ key !== "observedAt" &&
179
+ key !== "indexSeq" &&
180
+ key !== "rows" &&
181
+ key !== "cursor" &&
182
+ key !== "warnings" &&
183
+ key !== "error",
184
+ )
185
+ )
186
+ return undefined;
187
+ if (result.status === "not-in-git-worktree" && (scope.resolved !== null || result.rows.length !== 0))
188
+ return undefined;
189
+ const error = record(result.error);
190
+ if (
191
+ result.status === "unavailable" &&
192
+ (!error ||
193
+ typeof error.code !== "string" ||
194
+ typeof error.message !== "string" ||
195
+ Object.keys(error).some(key => key !== "code" && key !== "message"))
196
+ )
197
+ return undefined;
198
+ const indexSeq = typeof result.indexSeq === "number" ? result.indexSeq : undefined;
199
+ if (result.indexSeq !== undefined && indexSeq === undefined) return undefined;
200
+ if (indexSeq !== undefined && (!Number.isSafeInteger(indexSeq) || indexSeq < 0)) return undefined;
201
+ return {
202
+ version: 1,
203
+ scope,
204
+ status: result.status,
205
+ observedAt: result.observedAt,
206
+ ...(indexSeq === undefined ? {} : { indexSeq }),
207
+ rows: result.rows.map(row => sdkSearchRowV1(row)!),
208
+ ...(cursor === undefined ? {} : { cursor }),
209
+ warnings: [...result.warnings],
210
+ ...(error === undefined ? {} : { error: { code: error.code as string, message: error.message as string } }),
211
+ };
212
+ }
213
+
214
+ /** Resolves and validates an anchor against its canonical cwd worktree identity. */
215
+ export async function resolveScopeRequest(request: ScopeRequestV1): Promise<ResolvedScopeV1> {
216
+ const cwd = await canonicalSessionCwd(request.requestAnchor.cwd);
217
+ const worktreeRoot = await sessionWorktreeRoot(cwd);
218
+ const suppliedWorktree =
219
+ request.requestAnchor.worktreeRoot === null
220
+ ? null
221
+ : await canonicalSessionCwd(request.requestAnchor.worktreeRoot);
222
+ if (suppliedWorktree !== worktreeRoot)
223
+ throw new ScopeRequestValidationError("scope request anchor does not match its canonical worktree identity");
224
+ const requestAnchor = { cwd, worktreeRoot };
225
+ if (request.requested === "global")
226
+ return {
227
+ version: 1,
228
+ requested: request.requested,
229
+ requestAnchor,
230
+ resolved: { kind: "global", visibility: "current-broker" },
231
+ resolution: "resolved",
232
+ };
233
+ if (request.requested === "pwd")
234
+ return {
235
+ version: 1,
236
+ requested: request.requested,
237
+ requestAnchor,
238
+ resolved: { kind: "pwd", cwd },
239
+ resolution: "resolved",
240
+ };
241
+ return worktreeRoot === null
242
+ ? { version: 1, requested: request.requested, requestAnchor, resolved: null, resolution: "not-in-git-worktree" }
243
+ : {
244
+ version: 1,
245
+ requested: request.requested,
246
+ requestAnchor,
247
+ resolved: { kind: "repo", worktreeRoot },
248
+ resolution: "resolved",
249
+ };
250
+ }
251
+
252
+ export function scopeMatchesLocator(
253
+ scope: ResolvedScopeV1,
254
+ locator: Pick<SessionLocatorV2, "cwd" | "worktreeRoot">,
255
+ ): boolean {
256
+ if (scope.resolved === null) return false;
257
+ if (scope.resolved.kind === "global") return true;
258
+ if (scope.resolved.kind === "pwd") return locator.cwd === scope.resolved.cwd;
259
+ return locator.worktreeRoot === scope.resolved.worktreeRoot;
260
+ }
261
+
262
+ export function searchRowV1(session: { sessionId: string; locator: SessionLocatorV2; live: boolean }): SdkSearchRowV1 {
263
+ return {
264
+ id: session.sessionId,
265
+ locator: {
266
+ cwd: session.locator.cwd,
267
+ worktreeRoot: session.locator.worktreeRoot,
268
+ stateRoot: session.locator.stateRoot,
269
+ },
270
+ live: session.live,
271
+ };
272
+ }