@gajae-code/coding-agent 0.18.6 → 0.18.8

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 (302) hide show
  1. package/CHANGELOG.md +318 -1
  2. package/dist/types/async/job-manager.d.ts +1 -1
  3. package/dist/types/capability/mcp.d.ts +2 -0
  4. package/dist/types/capability/skill.d.ts +2 -0
  5. package/dist/types/capability/types.d.ts +6 -0
  6. package/dist/types/cli/public-command-errors.d.ts +3 -1
  7. package/dist/types/cli/setup-cli.d.ts +1 -1
  8. package/dist/types/commands/deep-interview.d.ts +3 -0
  9. package/dist/types/config/autorouting-tier-map.d.ts +348 -9
  10. package/dist/types/config/file-lock.d.ts +1 -0
  11. package/dist/types/config/model-bindings-applier.d.ts +2 -0
  12. package/dist/types/config/model-profile-activation.d.ts +11 -3
  13. package/dist/types/config/model-registry.d.ts +4 -9
  14. package/dist/types/config/settings.d.ts +4 -0
  15. package/dist/types/config/skill-settings-defaults.d.ts +2 -0
  16. package/dist/types/cursor-delete-path.d.ts +1 -0
  17. package/dist/types/cursor-mcp-name.d.ts +8 -0
  18. package/dist/types/customization/inventory.d.ts +2 -0
  19. package/dist/types/debug/report-bundle-parent.d.ts +2 -0
  20. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.d.ts +1 -0
  21. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.d.ts +31 -0
  22. package/dist/types/defaults/gjc-skills.generated.d.ts +5 -6
  23. package/dist/types/discovery/helpers.d.ts +8 -3
  24. package/dist/types/export/html/css-color.d.ts +2 -0
  25. package/dist/types/export/html/template.generated.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/types.d.ts +7 -0
  27. package/dist/types/extensibility/gjc-plugins/runtime-adapters.d.ts +14 -1
  28. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +2 -0
  29. package/dist/types/extensibility/plugins/plugin-link-path.d.ts +2 -0
  30. package/dist/types/extensibility/runtime-skill-discovery.d.ts +3 -1
  31. package/dist/types/extensibility/skill-management.d.ts +3 -1
  32. package/dist/types/extensibility/skills.d.ts +2 -0
  33. package/dist/types/gjc-runtime/deep-interview-crystallize.d.ts +74 -0
  34. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +11 -0
  35. package/dist/types/gjc-runtime/gc-runtime.d.ts +5 -0
  36. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +0 -5
  37. package/dist/types/gjc-runtime/state-argv.d.ts +1 -1
  38. package/dist/types/gjc-runtime/state-migrations.d.ts +8 -0
  39. package/dist/types/gjc-runtime/state-runtime.d.ts +95 -0
  40. package/dist/types/gjc-runtime/state-writer.d.ts +11 -1
  41. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -0
  42. package/dist/types/internal-urls/skill-path.d.ts +1 -0
  43. package/dist/types/lsp/workspace-path.d.ts +1 -0
  44. package/dist/types/modes/acp/acp-agent.d.ts +7 -0
  45. package/dist/types/modes/components/custom-editor.d.ts +6 -0
  46. package/dist/types/modes/components/customization/customization-dashboard.d.ts +1 -0
  47. package/dist/types/modes/components/extensions/state-manager.d.ts +4 -3
  48. package/dist/types/modes/controllers/input-controller.d.ts +9 -0
  49. package/dist/types/modes/interactive-mode.d.ts +1 -0
  50. package/dist/types/modes/utils/interrupt-ownership.d.ts +3 -0
  51. package/dist/types/modes/utils/keybinding-matchers.d.ts +1 -0
  52. package/dist/types/modes/utils/macos-option-forwarding.d.ts +17 -0
  53. package/dist/types/progress/collect-project-progress.d.ts +38 -0
  54. package/dist/types/progress/progress-contract.d.ts +154 -0
  55. package/dist/types/progress/progress-snapshot.d.ts +11 -0
  56. package/dist/types/progress/project-progress.d.ts +141 -0
  57. package/dist/types/progress/render-progress.d.ts +28 -0
  58. package/dist/types/runtime-mcp/elicitation.d.ts +12 -0
  59. package/dist/types/runtime-mcp/oauth-public-url.d.ts +1 -0
  60. package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +1 -0
  61. package/dist/types/runtime-mcp/smithery-registry.d.ts +24 -0
  62. package/dist/types/runtime-mcp/types.d.ts +6 -0
  63. package/dist/types/sdk/acp/adapter.d.ts +1 -1
  64. package/dist/types/sdk/broker/broker-exit.d.ts +6 -2
  65. package/dist/types/sdk/broker/broker.d.ts +18 -1
  66. package/dist/types/sdk/broker/lifecycle.d.ts +9 -0
  67. package/dist/types/sdk/broker/session-index.d.ts +12 -6
  68. package/dist/types/sdk/broker/task-artifact-owner-validation.d.ts +55 -0
  69. package/dist/types/sdk/bus/index.d.ts +12 -1
  70. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +6 -1
  71. package/dist/types/sdk/bus/telegram-daemon.d.ts +3 -2
  72. package/dist/types/sdk/client/client.d.ts +2 -0
  73. package/dist/types/sdk/host/host.d.ts +6 -0
  74. package/dist/types/sdk/host/query/handlers.d.ts +3 -0
  75. package/dist/types/sdk/index.d.ts +1 -0
  76. package/dist/types/sdk/router/session-router.d.ts +9 -0
  77. package/dist/types/sdk/session-list.d.ts +1 -1
  78. package/dist/types/sdk/session.d.ts +8 -0
  79. package/dist/types/session/agent-session.d.ts +38 -9
  80. package/dist/types/session/artifacts.d.ts +2 -2
  81. package/dist/types/session/internal/managed-gc-retirement-codec.d.ts +32 -0
  82. package/dist/types/session/internal/managed-session-scope.d.ts +79 -2
  83. package/dist/types/session/internal/managed-session-storage.d.ts +36 -1
  84. package/dist/types/session/internal/managed-task-owner-cleanup.d.ts +62 -0
  85. package/dist/types/session/internal/task-artifact-owner-access.d.ts +19 -0
  86. package/dist/types/session/internal/task-artifact-owner-transcript.d.ts +11 -0
  87. package/dist/types/session/session-manager.d.ts +31 -5
  88. package/dist/types/session/session-retirement.d.ts +71 -0
  89. package/dist/types/session/session-storage.d.ts +62 -48
  90. package/dist/types/session/session-transcript-header.d.ts +2 -0
  91. package/dist/types/session/task-artifact-owner-codec.d.ts +109 -0
  92. package/dist/types/session/task-artifact-owner-retirement.d.ts +7 -0
  93. package/dist/types/session/task-artifact-owner.d.ts +10 -0
  94. package/dist/types/setup/credential-auto-import.d.ts +1 -1
  95. package/dist/types/setup/credential-import.d.ts +6 -4
  96. package/dist/types/skill-state/active-state.d.ts +38 -0
  97. package/dist/types/slash-commands/helpers/progress-report.d.ts +8 -0
  98. package/dist/types/task/executor.d.ts +3 -0
  99. package/dist/types/tools/bash-skill-urls.d.ts +1 -1
  100. package/dist/types/tools/index.d.ts +3 -0
  101. package/dist/types/tools/python.d.ts +9 -1
  102. package/dist/types/tools/recipe/recipe-guard.d.ts +7 -0
  103. package/dist/types/tools/restricted-cwd.d.ts +1 -0
  104. package/dist/types/tools/todo-write.d.ts +6 -0
  105. package/dist/types/utils/tools-checksum.d.ts +7 -0
  106. package/package.json +7 -7
  107. package/scripts/generate-sdk-operation-inventory.ts +21 -0
  108. package/scripts/resident-memory-bench.ts +174 -20
  109. package/scripts/verify-managed-empty-stop.ts +28 -0
  110. package/src/async/job-manager.ts +228 -122
  111. package/src/capability/index.ts +18 -0
  112. package/src/capability/mcp.ts +2 -0
  113. package/src/capability/skill.ts +2 -0
  114. package/src/capability/types.ts +6 -0
  115. package/src/cli/auth-broker-cli.ts +1 -1
  116. package/src/cli/config-cli.ts +8 -18
  117. package/src/cli/customize-doctor.ts +15 -2
  118. package/src/cli/public-command-errors.ts +21 -1
  119. package/src/cli/setup-cli.ts +4 -4
  120. package/src/cli/skills-cli.ts +5 -0
  121. package/src/cli-main.ts +7 -8
  122. package/src/commands/deep-interview.ts +47 -8
  123. package/src/commands/sdk.ts +140 -29
  124. package/src/config/autorouting-tier-map.ts +117 -7
  125. package/src/config/file-lock.ts +307 -68
  126. package/src/config/mcp-schema.json +4 -0
  127. package/src/config/model-bindings-applier.ts +20 -0
  128. package/src/config/model-profile-activation.ts +240 -46
  129. package/src/config/model-registry.ts +47 -153
  130. package/src/config/settings.ts +44 -4
  131. package/src/config/skill-settings-defaults.ts +7 -0
  132. package/src/coordinator-mcp/policy.ts +3 -2
  133. package/src/cursor-delete-path.ts +10 -0
  134. package/src/cursor-mcp-name.ts +15 -0
  135. package/src/cursor.ts +13 -2
  136. package/src/customization/inventory.ts +3 -0
  137. package/src/debug/report-bundle-parent.ts +22 -0
  138. package/src/debug/report-bundle.ts +3 -0
  139. package/src/debug/system-info.ts +13 -1
  140. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.ts +67 -4
  141. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.ts +80 -0
  142. package/src/defaults/gjc/skills/deep-interview/SKILL.md +105 -10
  143. package/src/defaults/gjc/skills/ralplan/SKILL.md +6 -4
  144. package/src/defaults/gjc-defaults.test.ts +18 -1
  145. package/src/defaults/gjc-defaults.ts +3 -0
  146. package/src/defaults/gjc-skills.generated.ts +58 -36
  147. package/src/discovery/agents.ts +6 -1
  148. package/src/discovery/builtin.ts +10 -0
  149. package/src/discovery/helpers.ts +168 -23
  150. package/src/discovery/mcp-json.ts +6 -0
  151. package/src/discovery/ssh.ts +9 -4
  152. package/src/discovery/substitute-plugin-root.ts +3 -1
  153. package/src/edit/file-read-cache.ts +1 -1
  154. package/src/eval/py/executor.ts +380 -120
  155. package/src/export/html/css-color.ts +9 -0
  156. package/src/export/html/index.ts +5 -4
  157. package/src/export/html/template.generated.ts +1 -1
  158. package/src/extensibility/extensions/runner.ts +4 -0
  159. package/src/extensibility/extensions/types.ts +7 -0
  160. package/src/extensibility/gjc-plugins/runtime-adapters.ts +73 -8
  161. package/src/extensibility/plugins/manager.ts +3 -2
  162. package/src/extensibility/plugins/marketplace/cache.ts +15 -0
  163. package/src/extensibility/plugins/marketplace/manager.ts +11 -3
  164. package/src/extensibility/plugins/plugin-link-path.ts +12 -0
  165. package/src/extensibility/runtime-skill-discovery.ts +20 -2
  166. package/src/extensibility/skill-management.ts +6 -2
  167. package/src/extensibility/skills.ts +6 -1
  168. package/src/gjc-runtime/deep-interview-crystallize.ts +1814 -0
  169. package/src/gjc-runtime/deep-interview-recorder.ts +20 -2
  170. package/src/gjc-runtime/deep-interview-runtime.ts +1415 -13
  171. package/src/gjc-runtime/deep-interview-stage.ts +98 -21
  172. package/src/gjc-runtime/gc-runtime.ts +206 -8
  173. package/src/gjc-runtime/launch-worktree.ts +14 -4
  174. package/src/gjc-runtime/ralplan-runtime.ts +447 -52
  175. package/src/gjc-runtime/state-argv.ts +2 -0
  176. package/src/gjc-runtime/state-migrations.ts +91 -29
  177. package/src/gjc-runtime/state-runtime.ts +3716 -135
  178. package/src/gjc-runtime/state-writer.ts +83 -8
  179. package/src/gjc-runtime/ultragoal-runtime.ts +16 -4
  180. package/src/gjc-runtime/workflow-manifest.generated.json +70 -42
  181. package/src/gjc-runtime/workflow-manifest.ts +54 -21
  182. package/src/harness-control-plane/operate.ts +12 -4
  183. package/src/harness-control-plane/owner.ts +5 -1
  184. package/src/hashline/parser.ts +48 -9
  185. package/src/hashline/recovery.ts +13 -4
  186. package/src/hindsight/config.ts +9 -3
  187. package/src/internal-urls/docs-index.generated.ts +19 -18
  188. package/src/internal-urls/skill-path.ts +19 -0
  189. package/src/internal-urls/skill-protocol.ts +2 -0
  190. package/src/lsp/edits.ts +6 -0
  191. package/src/lsp/workspace-path.ts +51 -0
  192. package/src/main.ts +195 -31
  193. package/src/modes/acp/acp-agent.ts +163 -7
  194. package/src/modes/components/custom-editor.ts +14 -0
  195. package/src/modes/components/customization/customization-dashboard.ts +12 -0
  196. package/src/modes/components/extensions/extension-dashboard.ts +2 -2
  197. package/src/modes/components/extensions/state-manager.ts +15 -5
  198. package/src/modes/components/model-selector.ts +1 -4
  199. package/src/modes/components/provider-onboarding-selector.ts +1 -1
  200. package/src/modes/components/status-line/segments.ts +4 -0
  201. package/src/modes/controllers/event-controller.ts +11 -4
  202. package/src/modes/controllers/input-controller.ts +74 -29
  203. package/src/modes/controllers/runtime-mcp-command-controller.ts +8 -3
  204. package/src/modes/controllers/selector-controller.ts +28 -15
  205. package/src/modes/interactive-mode.ts +4 -0
  206. package/src/modes/runtime-init.ts +4 -0
  207. package/src/modes/utils/abort-message.ts +3 -1
  208. package/src/modes/utils/interrupt-ownership.ts +12 -0
  209. package/src/modes/utils/keybinding-matchers.ts +4 -0
  210. package/src/modes/utils/macos-option-forwarding.ts +80 -0
  211. package/src/progress/collect-project-progress.ts +153 -0
  212. package/src/progress/progress-contract.ts +172 -0
  213. package/src/progress/progress-snapshot.ts +140 -0
  214. package/src/progress/project-progress.ts +446 -0
  215. package/src/progress/render-progress.ts +209 -0
  216. package/src/prompts/system/master-mode.md +1 -0
  217. package/src/prompts/tools/skill-discovery.md +1 -1
  218. package/src/runtime-mcp/client.ts +13 -4
  219. package/src/runtime-mcp/config-writer.ts +10 -6
  220. package/src/runtime-mcp/config.ts +1 -0
  221. package/src/runtime-mcp/elicitation.ts +142 -0
  222. package/src/runtime-mcp/oauth-flow.ts +5 -0
  223. package/src/runtime-mcp/oauth-public-url.ts +8 -0
  224. package/src/runtime-mcp/plugin-network-boundary.ts +4 -0
  225. package/src/runtime-mcp/smithery-registry.ts +22 -3
  226. package/src/runtime-mcp/transports/http.ts +2 -2
  227. package/src/runtime-mcp/types.ts +6 -0
  228. package/src/sdk/acp/adapter.ts +93 -8
  229. package/src/sdk/broker/broker-exit.ts +52 -23
  230. package/src/sdk/broker/broker.ts +83 -7
  231. package/src/sdk/broker/ensure.ts +2 -0
  232. package/src/sdk/broker/lifecycle.ts +820 -73
  233. package/src/sdk/broker/session-index.ts +191 -81
  234. package/src/sdk/broker/task-artifact-owner-validation.ts +259 -0
  235. package/src/sdk/bus/chat-daemon-cli.ts +38 -1
  236. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  237. package/src/sdk/bus/chat-daemon-runtime.ts +3 -0
  238. package/src/sdk/bus/index.ts +241 -46
  239. package/src/sdk/bus/telegram-daemon-contract.ts +6 -1
  240. package/src/sdk/bus/telegram-daemon.ts +4 -2
  241. package/src/sdk/cli/session-cli.ts +17 -3
  242. package/src/sdk/client/client.ts +28 -8
  243. package/src/sdk/host/host.ts +6 -0
  244. package/src/sdk/host/query/handlers.ts +9 -1
  245. package/src/sdk/host/session-runtime.test.ts +2805 -411
  246. package/src/sdk/host/session-runtime.ts +428 -111
  247. package/src/sdk/host/surface-policy.ts +1 -0
  248. package/src/sdk/index.ts +8 -0
  249. package/src/sdk/lifecycle-session.ts +3 -1
  250. package/src/sdk/mcp/server.ts +15 -3
  251. package/src/sdk/prompt-deadline-manager.ts +15 -0
  252. package/src/sdk/protocol/operation-inventory.generated.json +146 -0
  253. package/src/sdk/protocol/operation-registry.ts +9 -2
  254. package/src/sdk/router/session-router.ts +94 -14
  255. package/src/sdk/session-list.ts +1 -0
  256. package/src/sdk/session.ts +81 -38
  257. package/src/session/agent-session.ts +674 -224
  258. package/src/session/artifacts.ts +174 -70
  259. package/src/session/internal/managed-gc-retirement-codec.ts +319 -0
  260. package/src/session/internal/managed-session-scope.ts +3457 -462
  261. package/src/session/internal/managed-session-storage.ts +482 -61
  262. package/src/session/internal/managed-task-owner-cleanup.ts +473 -0
  263. package/src/session/internal/task-artifact-owner-access.ts +245 -0
  264. package/src/session/internal/task-artifact-owner-transcript.ts +614 -0
  265. package/src/session/session-manager.ts +939 -133
  266. package/src/session/session-retirement.ts +714 -0
  267. package/src/session/session-storage.ts +418 -174
  268. package/src/session/session-transcript-header.ts +17 -0
  269. package/src/session/task-artifact-owner-codec.ts +641 -0
  270. package/src/session/task-artifact-owner-retirement.ts +477 -0
  271. package/src/session/task-artifact-owner.ts +289 -0
  272. package/src/setup/credential-auto-import.ts +12 -3
  273. package/src/setup/credential-import.ts +176 -5
  274. package/src/setup/paseo/announce.ts +6 -1
  275. package/src/skill-state/active-state.ts +132 -2
  276. package/src/slash-commands/builtin-registry.ts +39 -9
  277. package/src/slash-commands/helpers/progress-report.ts +23 -0
  278. package/src/stt/setup.ts +3 -5
  279. package/src/task/commands.ts +3 -1
  280. package/src/task/executor.ts +4 -0
  281. package/src/task/index.ts +6 -0
  282. package/src/tools/ask.ts +205 -6
  283. package/src/tools/ast-edit.ts +4 -0
  284. package/src/tools/bash-allowed-prefixes.ts +15 -0
  285. package/src/tools/bash-skill-urls.ts +56 -3
  286. package/src/tools/bash.ts +48 -79
  287. package/src/tools/descriptors.ts +5 -1
  288. package/src/tools/eval.ts +56 -36
  289. package/src/tools/image-gen.ts +1 -1
  290. package/src/tools/index.ts +3 -0
  291. package/src/tools/python.ts +187 -66
  292. package/src/tools/recipe/index.ts +9 -0
  293. package/src/tools/recipe/recipe-guard.ts +19 -0
  294. package/src/tools/restricted-cwd.ts +10 -0
  295. package/src/tools/skill-discovery.ts +5 -0
  296. package/src/tools/skill.ts +28 -1
  297. package/src/tools/todo-write.ts +10 -1
  298. package/src/tools/tool-catalog.generated.ts +1 -1
  299. package/src/tools/write.ts +1 -0
  300. package/src/utils/tools-checksum.ts +34 -0
  301. package/src/utils/tools-manager.ts +24 -6
  302. package/src/web/search/providers/codex.ts +3 -2
@@ -1,15 +1,21 @@
1
1
  import { type ChildProcess, spawn } from "node:child_process";
2
- import { createHash } from "node:crypto";
2
+ import { createHash, randomUUID } from "node:crypto";
3
3
  import * as nodeFs from "node:fs";
4
4
  import * as fs from "node:fs/promises";
5
5
  import * as os from "node:os";
6
6
  import * as path from "node:path";
7
- import { exactRemoveDirectoryTree, type NativeDirectoryTreeSnapshot, snapshotDirectoryTree } from "@gajae-code/natives";
7
+ import {
8
+ exactRemoveDirectoryTree,
9
+ exactUnlinkDirect,
10
+ type NativeDirectoryTreeSnapshot,
11
+ snapshotDirectoryTree,
12
+ } from "@gajae-code/natives";
8
13
  import { logger, postmortem } from "@gajae-code/utils";
9
14
  import { CliParseError, Command } from "@gajae-code/utils/cli";
10
15
  import type { Args as ParsedArgs } from "../cli/args";
11
16
  import { isSafeSdkInternalAgentDir, scanPublicCommand } from "../cli/public-command-entry";
12
17
  import { PublicCommandFailure } from "../cli/public-command-errors";
18
+ import { FileLockAcquireError } from "../config/file-lock";
13
19
  import { parseModelString } from "../config/model-resolver";
14
20
  import { Settings } from "../config/settings";
15
21
  import { usePostmortemSignalExitAuthority } from "../lsp/client";
@@ -24,7 +30,9 @@ import {
24
30
  writeBrokerStartupExitRecordBounded,
25
31
  } from "../sdk/broker/broker-exit";
26
32
  import { readBrokerDiscovery } from "../sdk/broker/discovery";
33
+ import { type EndpointFileRead, readEndpointFile } from "../sdk/broker/endpoint-authority";
27
34
  import {
35
+ BROKER_DISCOVERY_BUDGET,
28
36
  emitBrokerStartupTestSignal,
29
37
  reconcileBrokerGenerationForStartup,
30
38
  withBrokerStartupLock,
@@ -653,6 +661,7 @@ export async function runSessionHost(
653
661
  let startupComplete = false;
654
662
  let readinessPublicationCleanupComplete = true;
655
663
  let revokePendingReadinessMarker: (() => Promise<boolean>) | undefined;
664
+ let revokePublishedReadinessMarker: (() => Promise<boolean>) | undefined;
656
665
  let readinessRevocation: Promise<boolean> | undefined;
657
666
  let startupInterruption: SdkStartupFailure | undefined;
658
667
  const interrupted = Promise.withResolvers<SdkStartupFailure>();
@@ -1267,20 +1276,76 @@ export async function runSessionHost(
1267
1276
  return failureRollback;
1268
1277
  };
1269
1278
  const sessionEndpointPath = path.join(request.stateRoot, "sdk", `${request.sessionId}.json`);
1270
- const exitAfterSessionDisposal = async (reason?: "detached_idle"): Promise<void> => {
1271
- await disposeSession(reason);
1279
+ const removeOwnedSessionEndpoint = async (): Promise<boolean> => {
1280
+ try {
1281
+ await fs.stat(sessionEndpointPath);
1282
+ } catch (error) {
1283
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return true;
1284
+ return false;
1285
+ }
1286
+ const endpoint: EndpointFileRead | undefined = await readEndpointFile(sessionEndpointPath);
1287
+ if (!endpoint) return false;
1288
+ let parsed: { pid?: unknown; sessionId?: unknown };
1289
+ try {
1290
+ parsed = JSON.parse(endpoint.source) as { pid?: unknown; sessionId?: unknown };
1291
+ } catch {
1292
+ return false;
1293
+ }
1294
+ if (parsed.pid !== process.pid || parsed.sessionId !== request.sessionId) {
1295
+ return false;
1296
+ }
1297
+ const removal = (() => {
1298
+ try {
1299
+ return exactUnlinkDirect(sessionEndpointPath, {
1300
+ dev: endpoint.dev,
1301
+ ino: endpoint.ino,
1302
+ nlink: endpoint.nlink,
1303
+ size: endpoint.size,
1304
+ mtimeNs: endpoint.mtimeNs,
1305
+ quarantineName: `.gjc-delete-endpoint-${request.sessionId}-${randomUUID()}`,
1306
+ sha256: createHash("sha256").update(endpoint.source).digest("hex"),
1307
+ allowHardLink: true,
1308
+ });
1309
+ } catch (error) {
1310
+ logger.warn("SDK host endpoint cleanup failed", { error: String(error) });
1311
+ return undefined;
1312
+ }
1313
+ })();
1314
+ if (!removal) return false;
1315
+ return (
1316
+ removal.ok ||
1317
+ removal.code === "not_found" ||
1318
+ (removal.code === "cleanup_pending" &&
1319
+ removal.payloadDurable === true &&
1320
+ !removal.retainedSuccessorPath &&
1321
+ !removal.retainedUnknownPath)
1322
+ );
1323
+ };
1324
+ let unregisterHostPostmortem: (() => void) | undefined;
1325
+ let sessionDisposalExit: Promise<void> | undefined;
1326
+ const exitAfterSessionDisposal = async (reason?: "detached_idle", exitProcess = true): Promise<void> => {
1272
1327
  let failure: SdkStartupFailure | undefined;
1328
+ let ownsEndpoint = false;
1329
+ const endpointCleanup = (async (): Promise<boolean> => {
1330
+ let complete = await removeOwnedSessionEndpoint();
1331
+ for (let attempt = 0; !complete && attempt < 20; attempt += 1) {
1332
+ await Bun.sleep(25);
1333
+ complete = await removeOwnedSessionEndpoint();
1334
+ }
1335
+ return complete;
1336
+ })();
1337
+ let [endpointCleanupComplete, readinessRevoked] = await Promise.all([
1338
+ endpointCleanup,
1339
+ revokePublishedReadinessMarker?.() ?? Promise.resolve(true),
1340
+ ]);
1341
+ await disposeSession(reason);
1342
+ endpointCleanupComplete = await removeOwnedSessionEndpoint();
1273
1343
  try {
1274
1344
  const endpoint = JSON.parse(await fs.readFile(sessionEndpointPath, "utf8")) as {
1275
1345
  pid?: unknown;
1276
1346
  sessionId?: unknown;
1277
1347
  };
1278
- if (endpoint.pid === process.pid && endpoint.sessionId === request.sessionId)
1279
- failure = {
1280
- phase: "startup",
1281
- reason: "failed",
1282
- message: `SDK host endpoint remained after graceful shutdown: ${request.sessionId}`,
1283
- };
1348
+ ownsEndpoint = endpoint.pid === process.pid && endpoint.sessionId === request.sessionId;
1284
1349
  } catch (error) {
1285
1350
  if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
1286
1351
  failure = {
@@ -1288,27 +1353,57 @@ export async function runSessionHost(
1288
1353
  reason: "failed",
1289
1354
  message: `SDK host endpoint cleanup could not be verified: ${request.sessionId}`,
1290
1355
  };
1291
- }
1356
+ } else endpointCleanupComplete = true;
1357
+ }
1358
+ if (!ownsEndpoint && !failure && !readinessRevoked && revokePublishedReadinessMarker) {
1359
+ failure = {
1360
+ phase: "startup",
1361
+ reason: "failed",
1362
+ message: `SDK host readiness marker cleanup could not be verified: ${request.sessionId}`,
1363
+ };
1292
1364
  }
1365
+ if (ownsEndpoint && !endpointCleanupComplete && !failure)
1366
+ failure = {
1367
+ phase: "startup",
1368
+ reason: "failed",
1369
+ message: `SDK host endpoint remained after graceful shutdown: ${request.sessionId}`,
1370
+ };
1293
1371
  if (failure) {
1294
1372
  process.exitCode = 1;
1295
1373
  process.stderr.write(`${failure.message}\n`);
1296
1374
  await writeFailure(failure, rollback.result).catch(() => {});
1297
1375
  }
1298
- process.exit(process.exitCode ?? 0);
1376
+ unregisterHostPostmortem?.();
1377
+ unregisterHostPostmortem = undefined;
1378
+ if (exitProcess) process.exit(process.exitCode ?? 0);
1299
1379
  };
1300
1380
  let stopping = false;
1381
+ const requestSessionStop = (reason?: "detached_idle", exitProcess = true): Promise<void> => {
1382
+ if (stopping) return sessionDisposalExit ?? Promise.resolve();
1383
+ stopping = true;
1384
+ sessionDisposalExit = exitAfterSessionDisposal(reason, exitProcess);
1385
+ return sessionDisposalExit;
1386
+ };
1301
1387
  const stop = (reason?: "detached_idle") => {
1302
1388
  if (startupComplete) {
1303
- if (stopping) return;
1304
- stopping = true;
1305
- void exitAfterSessionDisposal(reason);
1389
+ void requestSessionStop(reason);
1306
1390
  return;
1307
1391
  }
1308
1392
  const failure = capability.normalizeFailure("startup", "failed", "SDK lifecycle host terminated.");
1309
1393
  interruptStartup(failure);
1310
1394
  };
1311
- const onReadySignal = (): void => stop();
1395
+ const registerHostPostmortem = (): void => {
1396
+ if (unregisterHostPostmortem) return;
1397
+ unregisterHostPostmortem = postmortem.register("sdk-session-host:exit", async reason => {
1398
+ if (reason !== postmortem.Reason.SIGTERM && reason !== postmortem.Reason.SIGINT) return;
1399
+ // The postmortem signal authority defaults to 143/130; a session host
1400
+ // signal is graceful and must preserve its cleanup result instead.
1401
+ await requestSessionStop(undefined, false);
1402
+ process.exitCode = 0;
1403
+ process.exit(0);
1404
+ });
1405
+ };
1406
+ registerHostPostmortem();
1312
1407
 
1313
1408
  try {
1314
1409
  const startupThinkingLevel = request.modelId ? parseModelString(request.modelId)?.thinkingLevel : undefined;
@@ -1356,6 +1451,7 @@ export async function runSessionHost(
1356
1451
  effectMarker,
1357
1452
  () => startupInterruption === undefined && now() < request.semanticReadyDeadlineAt,
1358
1453
  revoke => {
1454
+ revokePublishedReadinessMarker = revoke;
1359
1455
  revokePendingReadinessMarker = revoke;
1360
1456
  if (startupInterruption !== undefined) startReadinessRevocation(revoke);
1361
1457
  else if (now() >= request.semanticReadyDeadlineAt) {
@@ -1390,8 +1486,6 @@ export async function runSessionHost(
1390
1486
  revokePendingReadinessMarker = undefined;
1391
1487
  readinessRevocation = undefined;
1392
1488
  removeStartupSignalHandlers();
1393
- process.once("SIGTERM", onReadySignal);
1394
- process.once("SIGINT", onReadySignal);
1395
1489
  } catch (error) {
1396
1490
  if (error instanceof LifecycleReadinessCleanupError) constructionCleanupComplete = false;
1397
1491
  const failure =
@@ -1404,8 +1498,6 @@ export async function runSessionHost(
1404
1498
  await failAfterRollback(durableFailure);
1405
1499
  } finally {
1406
1500
  removeStartupSignalHandlers();
1407
- process.removeListener("SIGTERM", onReadySignal);
1408
- process.removeListener("SIGINT", onReadySignal);
1409
1501
  }
1410
1502
  throw error;
1411
1503
  }
@@ -1655,7 +1747,8 @@ export default class Sdk extends Command {
1655
1747
  child.unref();
1656
1748
  return;
1657
1749
  }
1658
- if (internal.action === "broker-internal") usePostmortemSignalExitAuthority();
1750
+ if (internal.action === "broker-internal" || internal.action === "session-host-internal")
1751
+ usePostmortemSignalExitAuthority();
1659
1752
  if (internal.action === "session-host-internal") {
1660
1753
  await runSessionHost();
1661
1754
  return;
@@ -1669,7 +1762,7 @@ export default class Sdk extends Command {
1669
1762
  let runningBroker: Broker | undefined;
1670
1763
  let stopSweep: (() => void) | undefined;
1671
1764
  let startupExitRequested = false;
1672
- let startupExitReason: "startup-deadline" | "startup-signal" | undefined;
1765
+ let startupExitReason: BrokerStartupExitRecord["reason"] | undefined;
1673
1766
  let startupExitLogged = false;
1674
1767
  let pendingShutdownSignal: "SIGTERM" | "SIGINT" | undefined;
1675
1768
  let startupExitTask: Promise<boolean> | undefined;
@@ -1690,10 +1783,11 @@ export default class Sdk extends Command {
1690
1783
  };
1691
1784
  const startupSignalExitCode = (signal: "SIGTERM" | "SIGINT"): 130 | 143 => (signal === "SIGINT" ? 130 : 143);
1692
1785
  const makeStartupExitRecord = (
1693
- reason: "startup-deadline" | "startup-signal",
1786
+ reason: BrokerStartupExitRecord["reason"],
1694
1787
  exitCode: 1 | 130 | 143,
1695
1788
  signal: "SIGTERM" | "SIGINT" | null,
1696
1789
  timeoutMs?: number,
1790
+ blockingLockPath?: string,
1697
1791
  ): BrokerStartupExitRecord & Record<string, unknown> => ({
1698
1792
  version: 1,
1699
1793
  reason,
@@ -1706,6 +1800,7 @@ export default class Sdk extends Command {
1706
1800
  exitCode,
1707
1801
  timeoutMs: timeoutMs ?? null,
1708
1802
  writtenAt: Date.now(),
1803
+ ...(blockingLockPath === undefined ? {} : { blockingLockPath }),
1709
1804
  });
1710
1805
  const beginStartupExitRecordWrite = (record: BrokerStartupExitRecord): Promise<BrokerStartupExitWriteStatus> => {
1711
1806
  const testDelayMs = Number(process.env.GJC_SDK_TEST_BROKER_STARTUP_EXIT_RECORD_DELAY_MS ?? 0);
@@ -1740,21 +1835,24 @@ export default class Sdk extends Command {
1740
1835
  process.stderr.write(`${JSON.stringify({ level, message, ...record })}\n`);
1741
1836
  };
1742
1837
  const exitDuringStartup = (
1743
- reason: "startup-deadline" | "startup-signal",
1838
+ reason: BrokerStartupExitRecord["reason"],
1744
1839
  exitCode: 1 | 130 | 143,
1745
1840
  signal: "SIGTERM" | "SIGINT" | null,
1746
1841
  timeoutMs?: number,
1842
+ blockingLockPath?: string,
1747
1843
  ): Promise<boolean> => {
1748
1844
  // The first startup exit cause owns both the persisted reason and the process exit code.
1749
1845
  if (startupExitTask) return startupExitReason === reason ? startupExitTask : Promise.resolve(false);
1750
1846
  if (startupExitRequested) return Promise.resolve(false);
1751
1847
  startupExitRequested = true;
1752
1848
  startupExitReason = reason;
1753
- const exitRecord = makeStartupExitRecord(reason, exitCode, signal, timeoutMs);
1849
+ const exitRecord = makeStartupExitRecord(reason, exitCode, signal, timeoutMs, blockingLockPath);
1754
1850
  const message =
1755
- reason === "startup-deadline"
1756
- ? `SDK broker startup exceeded its ${timeoutMs}ms fence deadline.`
1757
- : `SDK broker startup interrupted by ${signal} before readiness.`;
1851
+ reason === "startup-lock-blocked" && blockingLockPath
1852
+ ? `SDK broker startup blocked by retained removal transition ${blockingLockPath}.`
1853
+ : reason === "startup-deadline"
1854
+ ? `SDK broker startup exceeded its ${timeoutMs}ms fence deadline.`
1855
+ : `SDK broker startup interrupted by ${signal} before readiness.`;
1758
1856
  writeStartupExitLog(exitRecord, message);
1759
1857
  startupExitTask = (async () => {
1760
1858
  const exitRecordWrite = await beginStartupExitRecordWrite(exitRecord);
@@ -1783,7 +1881,7 @@ export default class Sdk extends Command {
1783
1881
  : pendingShutdownSignal;
1784
1882
  if (!signal) return;
1785
1883
  pendingShutdownSignal = signal;
1786
- if (startupExitTask && startupExitReason === "startup-deadline") {
1884
+ if (startupExitTask && startupExitReason !== "startup-signal") {
1787
1885
  await startupExitTask;
1788
1886
  await waitForStartupAbortCleanup();
1789
1887
  process.exit(1);
@@ -1816,6 +1914,7 @@ export default class Sdk extends Command {
1816
1914
  Number.isSafeInteger(testWatchdogMs) && testWatchdogMs > 0 && testWatchdogMs <= remainingMs
1817
1915
  ? testWatchdogMs
1818
1916
  : remainingMs;
1917
+ const startupCheckpointDeadline = performance.now() + watchdogMs - 1_000;
1819
1918
  const startupWatchdog = setTimeout(() => {
1820
1919
  startupAbortController.abort();
1821
1920
  void exitDuringStartup("startup-deadline", 1, null, watchdogMs).then(async started => {
@@ -1913,6 +2012,7 @@ export default class Sdk extends Command {
1913
2012
  const candidate = new Broker({
1914
2013
  agentDir,
1915
2014
  startupAbortSignal: startupAbortController.signal,
2015
+ startupCheckpointDeadline,
1916
2016
  onStartupReady: () => clearTimeout(startupWatchdog),
1917
2017
  masterOrphanGraceMs: (await Settings.loadForScope({ cwd: process.cwd(), agentDir })).get(
1918
2018
  "sdk.masterOrphanGraceMs",
@@ -1956,6 +2056,17 @@ export default class Sdk extends Command {
1956
2056
  await finishPendingStartupSignal();
1957
2057
  return;
1958
2058
  }
2059
+ // A retained removal transition is an explicit acquire failure, not only
2060
+ // an exhausted ordinary contention timeout.
2061
+ if (error instanceof FileLockAcquireError && error.orphanPath) {
2062
+ await exitDuringStartup(
2063
+ "startup-lock-blocked",
2064
+ 1,
2065
+ null,
2066
+ BROKER_DISCOVERY_BUDGET.startupLockWaitMs,
2067
+ error.orphanPath,
2068
+ );
2069
+ }
1959
2070
  if (broker) {
1960
2071
  try {
1961
2072
  await broker.stop({ kind: "startup-failure" });
@@ -77,16 +77,9 @@ export const CURATED_TIER_LABELS = {
77
77
 
78
78
  /** Generated from packages/ai/src/models.json at feature land: 3936 in-scope baseline skips. */
79
79
  export const TIER_MAP_SKIP_LIST = {
80
- "amazon-bedrock/anthropic.claude-sonnet-5-5": { rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated" },
81
80
  "amazon-bedrock/au.anthropic.claude-sonnet-5-5": {
82
81
  rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated",
83
82
  },
84
- "amazon-bedrock/eu.anthropic.claude-sonnet-5-5": {
85
- rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated",
86
- },
87
- "amazon-bedrock/global.anthropic.claude-sonnet-5-5": {
88
- rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated",
89
- },
90
83
  "amazon-bedrock/jp.anthropic.claude-sonnet-5-5": {
91
84
  rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated",
92
85
  },
@@ -6498,6 +6491,123 @@ export const TIER_MAP_SKIP_LIST = {
6498
6491
  "kiro/minimax-m2.1": { rationale: "Kiro API-key catalog addition; not yet curated" },
6499
6492
  "kiro/minimax-m2.5": { rationale: "Kiro API-key catalog addition; not yet curated" },
6500
6493
  "kiro/qwen3-coder-next": { rationale: "Kiro API-key catalog addition; not yet curated" },
6494
+ // Models.dev refresh additions
6495
+ "amazon-bedrock/anthropic.claude-sonnet-5-5": { rationale: "models.dev refresh addition; not yet curated" },
6496
+ "amazon-bedrock/eu.anthropic.claude-sonnet-5-5": { rationale: "models.dev refresh addition; not yet curated" },
6497
+ "amazon-bedrock/global.anthropic.claude-sonnet-5-5": { rationale: "models.dev refresh addition; not yet curated" },
6498
+ "amazon-bedrock/global.moonshotai.kimi-k3": { rationale: "models.dev refresh addition; not yet curated" },
6499
+ "amazon-bedrock/global.openai.gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6500
+ "amazon-bedrock/global.openai.gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6501
+ "amazon-bedrock/global.openai.gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6502
+ "amazon-bedrock/global.xai.grok-4.7": { rationale: "models.dev refresh addition; not yet curated" },
6503
+ "amazon-bedrock/openai.gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6504
+ "amazon-bedrock/openai.gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6505
+ "amazon-bedrock/openai.gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6506
+ "amazon-bedrock/us.moonshotai.kimi-k3": { rationale: "models.dev refresh addition; not yet curated" },
6507
+ "amazon-bedrock/us.openai.gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6508
+ "amazon-bedrock/us.openai.gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6509
+ "amazon-bedrock/us.openai.gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6510
+ "amazon-bedrock/us.xai.grok-4.7": { rationale: "models.dev refresh addition; not yet curated" },
6511
+ "cloudflare-ai-gateway/anthropic/claude-opus-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6512
+ "cloudflare-ai-gateway/openai/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6513
+ "cloudflare-ai-gateway/openai/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6514
+ "cloudflare-ai-gateway/xai/grok-4.7": { rationale: "models.dev refresh addition; not yet curated" },
6515
+ "deepinfra/XiaomiMiMo/MiMo-V2.6-Flash": { rationale: "models.dev refresh addition; not yet curated" },
6516
+ "deepinfra/XiaomiMiMo/MiMo-V2.6-Pro": { rationale: "models.dev refresh addition; not yet curated" },
6517
+ "deepinfra/tencent/Hy4-preview": { rationale: "models.dev refresh addition; not yet curated" },
6518
+ "github-copilot/claude-opus-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6519
+ "github-copilot/claude-sonnet-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6520
+ "github-copilot/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6521
+ "github-copilot/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6522
+ "github-copilot/gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6523
+ "kilo/aion-labs/aion-3.5": { rationale: "models.dev refresh addition; not yet curated" },
6524
+ "kilo/aion-labs/aion-3.5-mini": { rationale: "models.dev refresh addition; not yet curated" },
6525
+ "kilo/anthropic/claude-sonnet-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6526
+ "kilo/cohere/command-a-plus": { rationale: "models.dev refresh addition; not yet curated" },
6527
+ "kilo/fireworks/ember-1": { rationale: "models.dev refresh addition; not yet curated" },
6528
+ "kilo/openai/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6529
+ "kilo/openai/gpt-6-luna-pro": { rationale: "models.dev refresh addition; not yet curated" },
6530
+ "kilo/openai/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6531
+ "kilo/openai/gpt-6-sol-pro": { rationale: "models.dev refresh addition; not yet curated" },
6532
+ "kilo/openai/gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6533
+ "kilo/openai/gpt-6.1-sol-pro": { rationale: "models.dev refresh addition; not yet curated" },
6534
+ "kilo/perceptron/perceptron-mk1.5": { rationale: "models.dev refresh addition; not yet curated" },
6535
+ "kilo/qwen/qwen3.8-max-prime": { rationale: "models.dev refresh addition; not yet curated" },
6536
+ "kilo/qwen/qwen3.8-omni-flash": { rationale: "models.dev refresh addition; not yet curated" },
6537
+ "kilo/stealth/space-bunny-alpha": { rationale: "models.dev refresh addition; not yet curated" },
6538
+ "kilo/typesafe/jev-router": { rationale: "models.dev refresh addition; not yet curated" },
6539
+ "kilo/upstage/solar-mini4": { rationale: "models.dev refresh addition; not yet curated" },
6540
+ "kilo/z-ai/glm-5.3-prime": { rationale: "models.dev refresh addition; not yet curated" },
6541
+ "minimax-code-cn/MiniMax-M3.1-Flash-Preview": { rationale: "models.dev refresh addition; not yet curated" },
6542
+ "minimax-code/MiniMax-M3.1-Flash-Preview": { rationale: "models.dev refresh addition; not yet curated" },
6543
+ "openai/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6544
+ "openai/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6545
+ "openai/gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6546
+ "openai/gpt-daybreak-blue-latest": { rationale: "models.dev refresh addition; not yet curated" },
6547
+ "openai/gpt-daybreak-red-latest": { rationale: "models.dev refresh addition; not yet curated" },
6548
+ "opencode-go/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6549
+ "opencode-go/longcat-2.5-preview-free": { rationale: "models.dev refresh addition; not yet curated" },
6550
+ "opencode-go/space-bunny-free": { rationale: "models.dev refresh addition; not yet curated" },
6551
+ "opencode-zen/claude-opus-5-5": { rationale: "models.dev refresh addition; not yet curated" },
6552
+ "opencode-zen/claude-sonnet-5-5": { rationale: "models.dev refresh addition; not yet curated" },
6553
+ "opencode-zen/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6554
+ "opencode-zen/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6555
+ "opencode-zen/gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6556
+ "opencode-zen/grok-4.7": { rationale: "models.dev refresh addition; not yet curated" },
6557
+ "opencode-zen/longcat-2.5-preview-free": { rationale: "models.dev refresh addition; not yet curated" },
6558
+ "opencode-zen/qwen3.8-max": { rationale: "models.dev refresh addition; not yet curated" },
6559
+ "opencode-zen/space-bunny-free": { rationale: "models.dev refresh addition; not yet curated" },
6560
+ "openrouter/aion-labs/aion-3.5": { rationale: "models.dev refresh addition; not yet curated" },
6561
+ "openrouter/aion-labs/aion-3.5-mini": { rationale: "models.dev refresh addition; not yet curated" },
6562
+ "openrouter/anthropic/claude-sonnet-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6563
+ "openrouter/anthropic/claude-sonnet-5.5:batch": { rationale: "models.dev refresh addition; not yet curated" },
6564
+ "openrouter/cohere/command-a-plus": { rationale: "models.dev refresh addition; not yet curated" },
6565
+ "openrouter/fireworks/ember-1": { rationale: "models.dev refresh addition; not yet curated" },
6566
+ "openrouter/openai/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6567
+ "openrouter/openai/gpt-6-luna-pro": { rationale: "models.dev refresh addition; not yet curated" },
6568
+ "openrouter/openai/gpt-6-luna-pro:batch": { rationale: "models.dev refresh addition; not yet curated" },
6569
+ "openrouter/openai/gpt-6-luna:batch": { rationale: "models.dev refresh addition; not yet curated" },
6570
+ "openrouter/openai/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6571
+ "openrouter/openai/gpt-6-sol:batch": { rationale: "models.dev refresh addition; not yet curated" },
6572
+ "openrouter/openai/gpt-6-sol-pro": { rationale: "models.dev refresh addition; not yet curated" },
6573
+ "openrouter/openai/gpt-6-sol-pro:batch": { rationale: "models.dev refresh addition; not yet curated" },
6574
+ "openrouter/openai/gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6575
+ "openrouter/openai/gpt-6.1-sol-pro": { rationale: "models.dev refresh addition; not yet curated" },
6576
+ "openrouter/openai/gpt-oss-120b:batch": { rationale: "models.dev refresh addition; not yet curated" },
6577
+ "openrouter/perceptron/perceptron-mk1.5": { rationale: "models.dev refresh addition; not yet curated" },
6578
+ "openrouter/qwen/qwen3.8-max-prime": { rationale: "models.dev refresh addition; not yet curated" },
6579
+ "openrouter/qwen/qwen3.8-omni-flash": { rationale: "models.dev refresh addition; not yet curated" },
6580
+ "openrouter/stealth/space-bunny-alpha": { rationale: "models.dev refresh addition; not yet curated" },
6581
+ "openrouter/typesafe/jev-router": { rationale: "models.dev refresh addition; not yet curated" },
6582
+ "openrouter/upstage/solar-mini4": { rationale: "models.dev refresh addition; not yet curated" },
6583
+ "openrouter/z-ai/glm-5.3-prime": { rationale: "models.dev refresh addition; not yet curated" },
6584
+ "venice/aion-labs-aion-3-5": { rationale: "models.dev refresh addition; not yet curated" },
6585
+ "venice/aion-labs-aion-3-5-mini": { rationale: "models.dev refresh addition; not yet curated" },
6586
+ "venice/claude-opus-5-5-fast": { rationale: "models.dev refresh addition; not yet curated" },
6587
+ "venice/claude-sonnet-5-5": { rationale: "models.dev refresh addition; not yet curated" },
6588
+ "venice/openai-gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6589
+ "venice/openai-gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6590
+ "venice/openai-gpt-61-sol": { rationale: "models.dev refresh addition; not yet curated" },
6591
+ "venice/xiaomi-mimo-v2-6-flash": { rationale: "models.dev refresh addition; not yet curated" },
6592
+ "vercel-ai-gateway/alibaba/qwen3.8-max-prime": { rationale: "models.dev refresh addition; not yet curated" },
6593
+ "vercel-ai-gateway/anthropic/claude-sonnet-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6594
+ "vercel-ai-gateway/fireworks/ember-1": { rationale: "models.dev refresh addition; not yet curated" },
6595
+ "vercel-ai-gateway/inclusionai/ling-3.1-flash": { rationale: "models.dev refresh addition; not yet curated" },
6596
+ "vercel-ai-gateway/inclusionai/ling-3.1-flash-free": { rationale: "models.dev refresh addition; not yet curated" },
6597
+ "vercel-ai-gateway/meituan/longcat-2.5-preview": { rationale: "models.dev refresh addition; not yet curated" },
6598
+ "vercel-ai-gateway/openai/gpt-6-luna": { rationale: "models.dev refresh addition; not yet curated" },
6599
+ "vercel-ai-gateway/openai/gpt-6-luna-fast": { rationale: "models.dev refresh addition; not yet curated" },
6600
+ "vercel-ai-gateway/openai/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6601
+ "vercel-ai-gateway/openai/gpt-6-sol-fast": { rationale: "models.dev refresh addition; not yet curated" },
6602
+ "vercel-ai-gateway/openai/gpt-6.1-sol": { rationale: "models.dev refresh addition; not yet curated" },
6603
+ "vercel-ai-gateway/openai/gpt-6.1-sol-fast": { rationale: "models.dev refresh addition; not yet curated" },
6604
+ "zenmux/anthropic/claude-fable-5.1": { rationale: "models.dev refresh addition; not yet curated" },
6605
+ "zenmux/anthropic/claude-opus-5.5": { rationale: "models.dev refresh addition; not yet curated" },
6606
+ "zenmux/deepseek/deepseek-v4.1-flash": { rationale: "models.dev refresh addition; not yet curated" },
6607
+ "zenmux/moonshotai/kimi-k2.7-code-highspeed": { rationale: "models.dev refresh addition; not yet curated" },
6608
+ "zenmux/openai/gpt-6-astra": { rationale: "models.dev refresh addition; not yet curated" },
6609
+ "zenmux/openai/gpt-6-sol": { rationale: "models.dev refresh addition; not yet curated" },
6610
+ "zenmux/xiaomi/mimo-v2.6-pro": { rationale: "models.dev refresh addition; not yet curated" },
6501
6611
  } as const satisfies TierMapSkipList;
6502
6612
 
6503
6613
  export const CURATED_TIER_MAP: AutoroutingCuratedTierMap = {