@skaile/workspaces 4.21.1 → 4.23.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 (183) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-HKPNPO7N.js → asset-feeds-6TCDMWCJ.js} +4 -4
  4. package/dist/{asset-feeds-HKPNPO7N.js.map → asset-feeds-6TCDMWCJ.js.map} +1 -1
  5. package/dist/asset-manager/index.js +1 -1
  6. package/dist/bridge/drivers/claude-sdk.js +115 -6
  7. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  8. package/dist/bridge/drivers/codex.js +2 -2
  9. package/dist/bridge/drivers/continue.js +3 -3
  10. package/dist/bridge/drivers/echo.js +3 -3
  11. package/dist/bridge/drivers/gemini.js +5 -5
  12. package/dist/bridge/drivers/goose.js +3 -3
  13. package/dist/bridge/drivers/omp.js +4 -4
  14. package/dist/bridge/drivers/omp.js.map +1 -1
  15. package/dist/bridge/drivers/opencode.js +3 -3
  16. package/dist/bridge/drivers/qwen.js +5 -5
  17. package/dist/bridge/index.js +5 -5
  18. package/dist/bridge/src/drivers/claude-sdk.d.ts +23 -0
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  20. package/dist/bridge/src/drivers/omp.d.ts +1 -1
  21. package/dist/bridge/src/types.d.ts +17 -2
  22. package/dist/bridge/src/types.d.ts.map +1 -1
  23. package/dist/{chunk-SY2HSULI.js → chunk-3GOU3VEH.js} +3 -3
  24. package/dist/{chunk-SY2HSULI.js.map → chunk-3GOU3VEH.js.map} +1 -1
  25. package/dist/{chunk-HA674IQL.js → chunk-47MUF565.js} +6 -6
  26. package/dist/{chunk-HA674IQL.js.map → chunk-47MUF565.js.map} +1 -1
  27. package/dist/{chunk-ES4E6RDZ.js → chunk-52OD6PJ4.js} +3 -3
  28. package/dist/{chunk-ES4E6RDZ.js.map → chunk-52OD6PJ4.js.map} +1 -1
  29. package/dist/{chunk-TVLQTO7E.js → chunk-7LZJRVKJ.js} +9 -3
  30. package/dist/chunk-7LZJRVKJ.js.map +1 -0
  31. package/dist/{chunk-RLACUE4X.js → chunk-D3UARV3Z.js} +3 -3
  32. package/dist/{chunk-RLACUE4X.js.map → chunk-D3UARV3Z.js.map} +1 -1
  33. package/dist/{chunk-IZAN5MHL.js → chunk-F4ECQAN3.js} +165 -4
  34. package/dist/chunk-F4ECQAN3.js.map +1 -0
  35. package/dist/{chunk-S5A5MVJN.js → chunk-GRBB4CQL.js} +4 -4
  36. package/dist/chunk-GRBB4CQL.js.map +1 -0
  37. package/dist/{chunk-5FMWNSAQ.js → chunk-HMUFI3L5.js} +3 -3
  38. package/dist/{chunk-5FMWNSAQ.js.map → chunk-HMUFI3L5.js.map} +1 -1
  39. package/dist/{chunk-ZDSZGV5F.js → chunk-IBUY53DN.js} +59 -12
  40. package/dist/chunk-IBUY53DN.js.map +1 -0
  41. package/dist/{chunk-XBMCUMZT.js → chunk-IN466NSZ.js} +4 -4
  42. package/dist/{chunk-XBMCUMZT.js.map → chunk-IN466NSZ.js.map} +1 -1
  43. package/dist/{chunk-RTD5KAM4.js → chunk-IRGI7Q62.js} +10 -3
  44. package/dist/chunk-IRGI7Q62.js.map +1 -0
  45. package/dist/{chunk-RBTVXXD5.js → chunk-JIPPMYOM.js} +3 -3
  46. package/dist/{chunk-RBTVXXD5.js.map → chunk-JIPPMYOM.js.map} +1 -1
  47. package/dist/{chunk-GTS2FODO.js → chunk-JKJ7XYLG.js} +35 -3
  48. package/dist/chunk-JKJ7XYLG.js.map +1 -0
  49. package/dist/{chunk-AEOHSR27.js → chunk-KVWSBQNP.js} +3 -3
  50. package/dist/{chunk-AEOHSR27.js.map → chunk-KVWSBQNP.js.map} +1 -1
  51. package/dist/{chunk-ODIJJXXB.js → chunk-NJ2AI2DR.js} +6 -6
  52. package/dist/{chunk-ODIJJXXB.js.map → chunk-NJ2AI2DR.js.map} +1 -1
  53. package/dist/{chunk-5YDCUHJI.js → chunk-PIY5NTXY.js} +3 -3
  54. package/dist/{chunk-5YDCUHJI.js.map → chunk-PIY5NTXY.js.map} +1 -1
  55. package/dist/{chunk-EUGEEYGD.js → chunk-Q6LSBAQK.js} +2 -2
  56. package/dist/{chunk-EUGEEYGD.js.map → chunk-Q6LSBAQK.js.map} +1 -1
  57. package/dist/{chunk-YEQ3BXOY.js → chunk-QCACHN2P.js} +3 -3
  58. package/dist/{chunk-YEQ3BXOY.js.map → chunk-QCACHN2P.js.map} +1 -1
  59. package/dist/{chunk-OPSKLUB4.js → chunk-R2RFFXK7.js} +2 -2
  60. package/dist/{chunk-OPSKLUB4.js.map → chunk-R2RFFXK7.js.map} +1 -1
  61. package/dist/{chunk-R3EU2FFW.js → chunk-UHYS34Z5.js} +4 -4
  62. package/dist/{chunk-R3EU2FFW.js.map → chunk-UHYS34Z5.js.map} +1 -1
  63. package/dist/{chunk-FELWDKLQ.js → chunk-WBRD2T5J.js} +3 -3
  64. package/dist/{chunk-FELWDKLQ.js.map → chunk-WBRD2T5J.js.map} +1 -1
  65. package/dist/{chunk-N5XNEKHC.js → chunk-XZO4TMAQ.js} +226 -48
  66. package/dist/chunk-XZO4TMAQ.js.map +1 -0
  67. package/dist/{chunk-I4VIRPHS.js → chunk-Y6QVVKFN.js} +3 -3
  68. package/dist/{chunk-I4VIRPHS.js.map → chunk-Y6QVVKFN.js.map} +1 -1
  69. package/dist/{chunk-RZ2YIFT6.js → chunk-ZULBOMNO.js} +6 -6
  70. package/dist/{chunk-RZ2YIFT6.js.map → chunk-ZULBOMNO.js.map} +1 -1
  71. package/dist/cli/index.js +36 -36
  72. package/dist/connectors/index.js +7 -7
  73. package/dist/connectors/src/connector-manager.d.ts +15 -0
  74. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  75. package/dist/connectors-shared/index.js +2 -2
  76. package/dist/{ensure-sources-MUS622KB.js → ensure-sources-ONLJKK4T.js} +4 -4
  77. package/dist/{ensure-sources-MUS622KB.js.map → ensure-sources-ONLJKK4T.js.map} +1 -1
  78. package/dist/factory-assets/connectors/box.js +7 -7
  79. package/dist/factory-assets/connectors/deploy.js +7 -7
  80. package/dist/factory-assets/connectors/devserver.js +7 -7
  81. package/dist/factory-assets/connectors/flow/adapter.js +7 -7
  82. package/dist/factory-assets/connectors/flow/run-flow.js +8 -8
  83. package/dist/factory-assets/connectors/flow.js +7 -7
  84. package/dist/factory-assets/connectors/git.js +7 -7
  85. package/dist/factory-assets/connectors/gmail.js +7 -7
  86. package/dist/factory-assets/connectors/googledrive.js +7 -7
  87. package/dist/factory-assets/connectors/local.js +7 -7
  88. package/dist/factory-assets/connectors/mattermost.js +7 -7
  89. package/dist/factory-assets/connectors/memory.js +7 -7
  90. package/dist/factory-assets/connectors/minio.js +7 -7
  91. package/dist/factory-assets/connectors/postgres.js +7 -7
  92. package/dist/factory-assets/connectors/s3.js +7 -7
  93. package/dist/factory-assets/connectors/sharepoint.js +7 -7
  94. package/dist/factory-assets/connectors/sqlite.js +7 -7
  95. package/dist/factory-assets/connectors/static-server.js +7 -7
  96. package/dist/factory-assets/connectors/tunnel.js +7 -7
  97. package/dist/factory-assets/connectors/webdav.js +7 -7
  98. package/dist/factory-assets/connectors/xstate-store.js +7 -7
  99. package/dist/factory-assets/connectors/xstate.js +7 -7
  100. package/dist/{helpers-V3IJWB75.js → helpers-SGWUYZUS.js} +4 -4
  101. package/dist/{helpers-V3IJWB75.js.map → helpers-SGWUYZUS.js.map} +1 -1
  102. package/dist/{library-publish-TXJM76SD.js → library-publish-ZEZA6DAI.js} +6 -6
  103. package/dist/{library-publish-TXJM76SD.js.map → library-publish-ZEZA6DAI.js.map} +1 -1
  104. package/dist/{open-library-ORTV2RUE.js → open-library-OF377L77.js} +5 -5
  105. package/dist/{open-library-ORTV2RUE.js.map → open-library-OF377L77.js.map} +1 -1
  106. package/dist/{project-GI2A75UN.js → project-23QK7474.js} +5 -5
  107. package/dist/{project-GI2A75UN.js.map → project-23QK7474.js.map} +1 -1
  108. package/dist/runner/index.js +12 -12
  109. package/dist/runner/src/compaction/context-window.d.ts +53 -0
  110. package/dist/runner/src/compaction/context-window.d.ts.map +1 -0
  111. package/dist/runner/src/compaction/index.d.ts +1 -0
  112. package/dist/runner/src/compaction/index.d.ts.map +1 -1
  113. package/dist/runner/src/compaction/orchestrator.d.ts +14 -17
  114. package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
  115. package/dist/runner/src/context-usage/collector.d.ts +12 -2
  116. package/dist/runner/src/context-usage/collector.d.ts.map +1 -1
  117. package/dist/runner/src/context-usage/compose.d.ts +10 -2
  118. package/dist/runner/src/context-usage/compose.d.ts.map +1 -1
  119. package/dist/runner/src/managed-codex-bootstrap.d.ts +1 -1
  120. package/dist/runner/src/reconfigure-handler.d.ts +40 -0
  121. package/dist/runner/src/reconfigure-handler.d.ts.map +1 -0
  122. package/dist/runner/src/reply-routing.d.ts +2 -0
  123. package/dist/runner/src/reply-routing.d.ts.map +1 -1
  124. package/dist/runner/src/runner-capabilities.d.ts +48 -1
  125. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  126. package/dist/runner/src/serve.d.ts.map +1 -1
  127. package/dist/runner/src/session-builder.d.ts +2 -2
  128. package/dist/runner/src/session-builder.d.ts.map +1 -1
  129. package/dist/runner/src/session-capability-wiring.d.ts +5 -0
  130. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  131. package/dist/sdk/asset-manager.js +1 -1
  132. package/dist/sdk/bridge.js +5 -5
  133. package/dist/sdk/index.js +12 -12
  134. package/dist/sdk/runner.js +12 -12
  135. package/dist/sdk/session.js +2 -2
  136. package/dist/sdk/store.js +1 -1
  137. package/dist/sdk/transport/ws/client.js +1 -1
  138. package/dist/sdk/transport/ws.js +1 -1
  139. package/dist/sdk/transport.js +1 -1
  140. package/dist/sdk/types.js +1 -1
  141. package/dist/session/index.js +2 -2
  142. package/dist/session/src/bounded-subscriber-transport.d.ts +101 -0
  143. package/dist/session/src/bounded-subscriber-transport.d.ts.map +1 -0
  144. package/dist/session/src/dispatcher.d.ts.map +1 -1
  145. package/dist/session/src/index.d.ts +2 -0
  146. package/dist/session/src/index.d.ts.map +1 -1
  147. package/dist/session/src/types.d.ts +10 -1
  148. package/dist/session/src/types.d.ts.map +1 -1
  149. package/dist/{setup-GLCLE36X.js → setup-WZ3SWZFQ.js} +10 -10
  150. package/dist/{setup-GLCLE36X.js.map → setup-WZ3SWZFQ.js.map} +1 -1
  151. package/dist/{source-N6EKFFH5.js → source-YMKMBOKP.js} +6 -6
  152. package/dist/{source-N6EKFFH5.js.map → source-YMKMBOKP.js.map} +1 -1
  153. package/dist/{source-manifest-publish-BDMY4B4B.js → source-manifest-publish-B3CVM4RW.js} +7 -7
  154. package/dist/{source-manifest-publish-BDMY4B4B.js.map → source-manifest-publish-B3CVM4RW.js.map} +1 -1
  155. package/dist/store/index.js +1 -1
  156. package/dist/store/src/store.d.ts.map +1 -1
  157. package/dist/transport/index.js +1 -1
  158. package/dist/transport/src/ws/client.d.ts +12 -0
  159. package/dist/transport/src/ws/client.d.ts.map +1 -1
  160. package/dist/transport/ws/client.js +1 -1
  161. package/dist/transport/ws.js +1 -1
  162. package/dist/tui/index.js +12 -12
  163. package/dist/types/index.js +1 -1
  164. package/dist/types/src/context-usage.d.ts +16 -2
  165. package/dist/types/src/context-usage.d.ts.map +1 -1
  166. package/dist/types/src/events.d.ts +9 -2
  167. package/dist/types/src/events.d.ts.map +1 -1
  168. package/dist/types/src/index.d.ts +1 -1
  169. package/dist/types/src/index.d.ts.map +1 -1
  170. package/dist/types/src/lifecycle.d.ts +1 -1
  171. package/dist/types/src/lifecycle.d.ts.map +1 -1
  172. package/dist/types/src/version.d.ts +17 -2
  173. package/dist/types/src/version.d.ts.map +1 -1
  174. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  175. package/dist/workspace-plugin/index.js +1 -1
  176. package/package.json +1 -1
  177. package/dist/chunk-GTS2FODO.js.map +0 -1
  178. package/dist/chunk-IZAN5MHL.js.map +0 -1
  179. package/dist/chunk-N5XNEKHC.js.map +0 -1
  180. package/dist/chunk-RTD5KAM4.js.map +0 -1
  181. package/dist/chunk-S5A5MVJN.js.map +0 -1
  182. package/dist/chunk-TVLQTO7E.js.map +0 -1
  183. package/dist/chunk-ZDSZGV5F.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/store-publisher.ts","../cli/src/commands/publish-core.ts"],"names":[],"mappings":"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","file":"chunk-FELWDKLQ.js","sourcesContent":["/**\n * Typed REST client for the AI Asset Store **publisher** surface — the\n * curator-publish flow (`skaile source manifest publish` / `yank`). Thin\n * wrappers over {@link storeFetch}; every method maps 1:1 to an `/api/v1/…`\n * endpoint. The {@link PublisherClient} interface is injectable so the\n * orchestration in `commands/source-manifest-publish.ts` can be unit-tested\n * against a fake without a live store.\n *\n * @docLink cli/dev-guide#store-publisher\n */\n\nimport { getStoreConfig, getStoreToken, type StoreConfig, storeFetch } from \"./store-client.ts\";\n\n/**\n * The publisher REST surface used by the curator-publish flow. Kept minimal —\n * only the endpoints `runPublish` / `runYank` actually call. Response shapes\n * are narrowed to the fields the orchestration reads (the server returns more).\n */\nexport interface PublisherClient {\n /**\n * Identity of the caller. `username` is the Keycloak login (personal-tier\n * namespace); `githubLogin` is the verified GitHub handle when connected —\n * the namespace to publish under when it differs from the login.\n */\n me(): Promise<{ username: string; githubLogin?: string | null }>;\n /** Register (or re-register) a source; returns the created/existing row id. */\n sourcesAdd(body: {\n url: string;\n ref: string;\n sidecarUrl?: string;\n sidecarRef?: string;\n /**\n * Target publisher namespace (the manifest's `publisher`). When it differs\n * from the caller's login username, the store resolves the CLAIMED Publisher\n * for it (the store must already have the claim). Omitted → the store\n * defaults to `@<username>` (personal).\n */\n namespace?: string;\n }): Promise<{ id: string }>;\n /** List sources — used to recover an id when `sourcesAdd` rejects a dup url. */\n sourcesList(): Promise<Array<{ id: string; url: string }>>;\n /** Kick off a source sync; returns the async job id to poll. */\n sourceSync(id: string): Promise<{ jobId: string }>;\n /** Poll a job's terminal status + per-item results. */\n jobGet(\n jobId: string,\n ): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }>;\n /** Discovered publishable candidates for a synced source. */\n sourceCandidates(id: string): Promise<\n Array<{\n id: string;\n name: string;\n version: string;\n kind: string;\n published: boolean;\n assetRoot: string;\n }>\n >;\n /** Per-asset preview — the discovered file set + resolved candidate metadata. */\n assetPreview(id: string): Promise<{\n discoveredFiles: string[];\n candidate: { name: string; version: string; kind: string; publisherNamespace: string };\n }>;\n /**\n * Publish one asset. `dryRun` returns the would-be `{ manifest }` without\n * launching a job; the normal path returns `{ jobId }`.\n */\n assetPublish(\n id: string,\n body: { ref: string; files: string[] },\n dryRun?: boolean,\n ): Promise<{ jobId?: string; manifest?: unknown }>;\n /** Retract a published asset. Response body is ignored. */\n assetUnpublish(id: string): Promise<unknown>;\n /**\n * Read-only \"can I publish under `@<ns>` right now, and if not, what's the\n * path?\" probe. Backs the `publish --dry-run` namespace status line; its\n * `message` is store-authored and meant to be surfaced verbatim.\n */\n namespaceAvailability(ns: string): Promise<{\n namespace: string;\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n claimMethod?: string;\n message: string;\n }>;\n}\n\n/**\n * Construct the real HTTP-backed {@link PublisherClient}. Every call carries a\n * longer timeout than the default store client because publish/sync trigger\n * server-side clone work.\n *\n * @param config - Store connection config; defaults to {@link getStoreConfig}.\n * @param timeoutMs - Per-request abort timeout (default 20s).\n */\nexport function makeHttpPublisherClient(\n config: StoreConfig = getStoreConfig(),\n timeoutMs = 20_000,\n): PublisherClient {\n // Acquire a fresh Keycloak token per call (device-flow session in\n // ~/.skaile/auth.json, refreshed on demand) rather than a static config.jwt.\n const call = async <T>(\n path: string,\n opts?: { method?: string; body?: unknown; params?: Record<string, string> },\n ): Promise<T> => {\n const jwt = await getStoreToken();\n return storeFetch<T>({ ...config, jwt }, path, { timeoutMs, ...opts });\n };\n return {\n me: () => call(\"/api/v1/me\"),\n sourcesAdd: (body) => call(\"/api/v1/sources\", { method: \"POST\", body }),\n sourcesList: () => call(\"/api/v1/sources\"),\n sourceSync: (id) => call(`/api/v1/sources/${id}/sync`, { method: \"POST\", body: {} }),\n jobGet: (jobId) => call(`/api/v1/jobs/${jobId}`),\n sourceCandidates: (id) => call(`/api/v1/sources/${id}/candidates`),\n assetPreview: (id) => call(`/api/v1/assets/${id}/preview`),\n assetPublish: (id, body, dryRun) =>\n call(`/api/v1/assets/${id}/publish`, {\n method: \"POST\",\n body,\n ...(dryRun ? { params: { dryRun: \"1\" } } : {}),\n }),\n assetUnpublish: (id) => call(`/api/v1/assets/${id}/unpublish`, { method: \"POST\", body: {} }),\n namespaceAvailability: (ns) =>\n call(`/api/v1/namespaces/${encodeURIComponent(ns)}/availability`),\n };\n}\n","/**\n * Shared store-interaction core for the two publish front-ends — the curator\n * sidecar flow (`source manifest publish`) and the first-party library flow\n * (`library publish`). Both differ only in their git side-effects + how they\n * resolve the source repo; the store orchestration below (register → sync →\n * candidates → per-asset preview+publish) is identical.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * so the orchestration stays unit/integration-testable without a live store.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport type { SkPublishManifest } from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport type { PublisherClient } from \"../store-publisher.ts\";\n\n/**\n * One-line rendering of a namespace-availability probe for a `--dry-run` plan.\n * The `message` is store-authored (identical to what a real publish would echo)\n * — we only prepend a status glyph so the reader sees green/amber/red at a\n * glance without the CLI re-deriving any authorization logic.\n */\nexport function formatNamespaceAvailability(a: {\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n message: string;\n}): string {\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return `${S.ok(\"✓\")} ${a.message}`;\n case \"claimable-by-you\":\n return `${S.warn(\"!\")} ${a.message}`;\n default:\n return `${S.err(\"✗\")} ${a.message}`;\n }\n}\n\n/**\n * Preflight the target namespace against the store's availability probe BEFORE a\n * publish does any irreversible work (a public git push). Returns `{ ok: false }`\n * with a guided message for `reserved` (not yours) and `claimable-by-you` (must\n * claim first) — the two states a real publish would reject — so the caller can\n * abort with actionable guidance instead of a raw 422 after pushing bytes.\n *\n * The probe is advisory: any failure (offline, older store) returns `{ ok: true }`\n * so the store stays the authority and a valid publish is never blocked.\n */\nexport async function preflightNamespace(\n client: PublisherClient,\n namespace: string,\n): Promise<{ ok: boolean; message?: string }> {\n let a: Awaited<ReturnType<PublisherClient[\"namespaceAvailability\"]>>;\n try {\n a = await client.namespaceAvailability(namespace);\n } catch {\n return { ok: true };\n }\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return { ok: true };\n case \"claimable-by-you\":\n return {\n ok: false,\n message:\n `@${namespace} isn't yours yet — claim it in the store first` +\n `${a.claimMethod ? ` (${a.claimMethod})` : \"\"}, then re-run. ${a.message}`,\n };\n default: // reserved, or any unrecognized future status (fail safe → block)\n return { ok: false, message: `Cannot publish under @${namespace} — ${a.message}` };\n }\n}\n\n/** One candidate row shape the matcher operates on (kind + name are the key). */\ninterface CandidateLike {\n kind: string;\n name: string;\n}\n\n/**\n * Keep only candidates whose `(kind, name)` pair is declared in the manifest.\n * The backend may merge extra assets from the base repo into the candidate\n * list; a publish only touches what the manifest curated/declared.\n */\nexport function matchCandidatesToManifest<T extends CandidateLike>(\n candidates: T[],\n manifest: SkPublishManifest,\n): T[] {\n const wanted = new Set((manifest.assets ?? []).map((a) => `${a.kind}:${a.name}`));\n return candidates.filter((c) => wanted.has(`${c.kind}:${c.name}`));\n}\n\n/** A canonical ref string `kind:@publisher/name[#version]` for reporting. */\nexport function refFor(kind: string, publisher: string, name: string, version?: string): string {\n const base = `${kind}:@${publisher}/${name}`;\n return version ? `${base}#${version}` : base;\n}\n\n/** The bare asset name from a `kind:@publisher/name#version` ref or a plain name. */\nexport function bareName(ref: string): string {\n const afterKind = ref.includes(\":\") ? ref.slice(ref.indexOf(\":\") + 1) : ref;\n const afterScope = afterKind.includes(\"/\")\n ? afterKind.slice(afterKind.indexOf(\"/\") + 1)\n : afterKind;\n return afterScope.split(\"#\")[0];\n}\n\n/**\n * Poll a job until it leaves `running` or the deadline passes. Returns the last\n * observed state — the caller MUST treat a still-`running` result as a timeout\n * (not success), since it means the deadline was hit before the job finished.\n */\nexport async function pollJob(\n client: PublisherClient,\n jobId: string,\n intervalMs = 1_500,\n timeoutMs = 60_000,\n): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }> {\n const deadline = Date.now() + timeoutMs;\n let job = await client.jobGet(jobId);\n while (job.status === \"running\" && Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n job = await client.jobGet(jobId);\n }\n return job;\n}\n\n/**\n * True when a `sourcesAdd` rejection is a duplicate-URL conflict (the source is\n * already registered) — the only error the publish flow recovers from by looking\n * the existing row up. Every other failure (auth, 5xx, network) must propagate.\n */\nexport function isDupSourceError(err: unknown): boolean {\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();\n return /\\b409\\b|conflict|duplicate|already exists|already registered|unique/.test(msg);\n}\n\n/**\n * Register + sync the source, then publish its curated/declared candidates —\n * the store-side steps shared by both publish front-ends. Git side-effects (the\n * sidecar push, or the library commit+push) happen in the caller *before* this;\n * this function is purely store interaction.\n *\n * The sidecar front-end passes `sidecar` (so `sourcesAdd` carries the sidecar\n * pin); the library front-end omits it (the source repo IS the manifest host).\n * `assetName`, when set, narrows publication to the single candidate of that\n * name. Fatal store states (`sourcesAdd` non-dup failure) surface; sync failures\n * and empty candidate sets `process.exit(1)` with the same messages as before.\n */\nexport async function publishToStore(opts: {\n sourceUrl: string;\n ref: string;\n sidecar?: { url: string; ref: string };\n manifest: SkPublishManifest;\n assetName?: string;\n client: PublisherClient;\n}): Promise<{ published: string[] }> {\n const { sourceUrl, ref, sidecar, manifest, assetName, client: pub } = opts;\n\n let sourceId: string;\n try {\n const added = await pub.sourcesAdd({\n url: sourceUrl,\n ref,\n ...(sidecar ? { sidecarUrl: sidecar.url, sidecarRef: sidecar.ref } : {}),\n // Publish under the manifest's declared namespace; the store resolves a\n // claimed Publisher when it differs from the caller's login, else defaults\n // to `@<username>`. Omitted when the manifest carries no publisher.\n ...(manifest.publisher ? { namespace: manifest.publisher } : {}),\n });\n sourceId = added.id;\n } catch (err) {\n // Only a duplicate-url conflict is recoverable (source already registered);\n // auth/5xx/network failures must surface, not silently reuse a stale row.\n if (!isDupSourceError(err)) throw err;\n const rows = await pub.sourcesList();\n const found = rows.find((r) => r.url === sourceUrl);\n if (!found) {\n throw new Error(\n `Source ${sourceUrl} looked already-registered but no owned row matched: ` +\n `${err instanceof Error ? err.message : String(err)}`,\n );\n }\n sourceId = found.id;\n }\n\n const { jobId } = await pub.sourceSync(sourceId);\n const job = await pollJob(pub, jobId);\n if (job.status === \"failed\" || job.status === \"cancelled\") {\n const failed = (job.items ?? []).filter((i) => i.status === \"failed\");\n for (const i of failed) logErr(`sync: ${i.label}: ${i.error ?? \"failed\"}`);\n logErr(`Source sync ${job.status}.`);\n process.exit(1);\n }\n // A still-`running` job means the poll deadline was hit — do NOT proceed on an\n // unfinished sync (it would read incomplete candidates).\n if (job.status === \"running\") {\n logErr(\"Source sync timed out before completing — re-run `publish`, or check the store.\");\n process.exit(1);\n }\n\n let candidates = matchCandidatesToManifest(await pub.sourceCandidates(sourceId), manifest);\n if (assetName) candidates = candidates.filter((c) => c.name === assetName);\n if (candidates.length === 0) {\n logWarn(\"No candidates discovered — check the manifest and the source ref.\");\n process.exit(1);\n }\n\n const published: string[] = [];\n for (const c of candidates) {\n try {\n const preview = await pub.assetPreview(c.id);\n const res = await pub.assetPublish(c.id, { ref, files: preview.discoveredFiles });\n // Publish is async — wait for the job so we only report refs that actually\n // landed, not ones whose import is still in flight or about to fail.\n if (res.jobId) {\n const pubJob = await pollJob(pub, res.jobId);\n if (pubJob.status !== \"succeeded\") {\n const errs = (pubJob.items ?? [])\n .filter((i) => i.status === \"failed\")\n .map((i) => i.error)\n .filter(Boolean);\n logWarn(\n `Publish of ${c.kind}:${c.name} did not succeed (${pubJob.status})` +\n (errs.length ? `: ${errs.join(\"; \")}` : \"\"),\n );\n continue;\n }\n }\n published.push(refFor(c.kind, preview.candidate.publisherNamespace, c.name, c.version));\n } catch (err) {\n logWarn(\n `Failed to publish ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Published ${published.length} asset(s):`);\n for (const r of published) logInfo(` ${r}`);\n return { published };\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/store-publisher.ts","../cli/src/commands/publish-core.ts"],"names":[],"mappings":"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","file":"chunk-WBRD2T5J.js","sourcesContent":["/**\n * Typed REST client for the AI Asset Store **publisher** surface — the\n * curator-publish flow (`skaile source manifest publish` / `yank`). Thin\n * wrappers over {@link storeFetch}; every method maps 1:1 to an `/api/v1/…`\n * endpoint. The {@link PublisherClient} interface is injectable so the\n * orchestration in `commands/source-manifest-publish.ts` can be unit-tested\n * against a fake without a live store.\n *\n * @docLink cli/dev-guide#store-publisher\n */\n\nimport { getStoreConfig, getStoreToken, type StoreConfig, storeFetch } from \"./store-client.ts\";\n\n/**\n * The publisher REST surface used by the curator-publish flow. Kept minimal —\n * only the endpoints `runPublish` / `runYank` actually call. Response shapes\n * are narrowed to the fields the orchestration reads (the server returns more).\n */\nexport interface PublisherClient {\n /**\n * Identity of the caller. `username` is the Keycloak login (personal-tier\n * namespace); `githubLogin` is the verified GitHub handle when connected —\n * the namespace to publish under when it differs from the login.\n */\n me(): Promise<{ username: string; githubLogin?: string | null }>;\n /** Register (or re-register) a source; returns the created/existing row id. */\n sourcesAdd(body: {\n url: string;\n ref: string;\n sidecarUrl?: string;\n sidecarRef?: string;\n /**\n * Target publisher namespace (the manifest's `publisher`). When it differs\n * from the caller's login username, the store resolves the CLAIMED Publisher\n * for it (the store must already have the claim). Omitted → the store\n * defaults to `@<username>` (personal).\n */\n namespace?: string;\n }): Promise<{ id: string }>;\n /** List sources — used to recover an id when `sourcesAdd` rejects a dup url. */\n sourcesList(): Promise<Array<{ id: string; url: string }>>;\n /** Kick off a source sync; returns the async job id to poll. */\n sourceSync(id: string): Promise<{ jobId: string }>;\n /** Poll a job's terminal status + per-item results. */\n jobGet(\n jobId: string,\n ): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }>;\n /** Discovered publishable candidates for a synced source. */\n sourceCandidates(id: string): Promise<\n Array<{\n id: string;\n name: string;\n version: string;\n kind: string;\n published: boolean;\n assetRoot: string;\n }>\n >;\n /** Per-asset preview — the discovered file set + resolved candidate metadata. */\n assetPreview(id: string): Promise<{\n discoveredFiles: string[];\n candidate: { name: string; version: string; kind: string; publisherNamespace: string };\n }>;\n /**\n * Publish one asset. `dryRun` returns the would-be `{ manifest }` without\n * launching a job; the normal path returns `{ jobId }`.\n */\n assetPublish(\n id: string,\n body: { ref: string; files: string[] },\n dryRun?: boolean,\n ): Promise<{ jobId?: string; manifest?: unknown }>;\n /** Retract a published asset. Response body is ignored. */\n assetUnpublish(id: string): Promise<unknown>;\n /**\n * Read-only \"can I publish under `@<ns>` right now, and if not, what's the\n * path?\" probe. Backs the `publish --dry-run` namespace status line; its\n * `message` is store-authored and meant to be surfaced verbatim.\n */\n namespaceAvailability(ns: string): Promise<{\n namespace: string;\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n claimMethod?: string;\n message: string;\n }>;\n}\n\n/**\n * Construct the real HTTP-backed {@link PublisherClient}. Every call carries a\n * longer timeout than the default store client because publish/sync trigger\n * server-side clone work.\n *\n * @param config - Store connection config; defaults to {@link getStoreConfig}.\n * @param timeoutMs - Per-request abort timeout (default 20s).\n */\nexport function makeHttpPublisherClient(\n config: StoreConfig = getStoreConfig(),\n timeoutMs = 20_000,\n): PublisherClient {\n // Acquire a fresh Keycloak token per call (device-flow session in\n // ~/.skaile/auth.json, refreshed on demand) rather than a static config.jwt.\n const call = async <T>(\n path: string,\n opts?: { method?: string; body?: unknown; params?: Record<string, string> },\n ): Promise<T> => {\n const jwt = await getStoreToken();\n return storeFetch<T>({ ...config, jwt }, path, { timeoutMs, ...opts });\n };\n return {\n me: () => call(\"/api/v1/me\"),\n sourcesAdd: (body) => call(\"/api/v1/sources\", { method: \"POST\", body }),\n sourcesList: () => call(\"/api/v1/sources\"),\n sourceSync: (id) => call(`/api/v1/sources/${id}/sync`, { method: \"POST\", body: {} }),\n jobGet: (jobId) => call(`/api/v1/jobs/${jobId}`),\n sourceCandidates: (id) => call(`/api/v1/sources/${id}/candidates`),\n assetPreview: (id) => call(`/api/v1/assets/${id}/preview`),\n assetPublish: (id, body, dryRun) =>\n call(`/api/v1/assets/${id}/publish`, {\n method: \"POST\",\n body,\n ...(dryRun ? { params: { dryRun: \"1\" } } : {}),\n }),\n assetUnpublish: (id) => call(`/api/v1/assets/${id}/unpublish`, { method: \"POST\", body: {} }),\n namespaceAvailability: (ns) =>\n call(`/api/v1/namespaces/${encodeURIComponent(ns)}/availability`),\n };\n}\n","/**\n * Shared store-interaction core for the two publish front-ends — the curator\n * sidecar flow (`source manifest publish`) and the first-party library flow\n * (`library publish`). Both differ only in their git side-effects + how they\n * resolve the source repo; the store orchestration below (register → sync →\n * candidates → per-asset preview+publish) is identical.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * so the orchestration stays unit/integration-testable without a live store.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport type { SkPublishManifest } from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport type { PublisherClient } from \"../store-publisher.ts\";\n\n/**\n * One-line rendering of a namespace-availability probe for a `--dry-run` plan.\n * The `message` is store-authored (identical to what a real publish would echo)\n * — we only prepend a status glyph so the reader sees green/amber/red at a\n * glance without the CLI re-deriving any authorization logic.\n */\nexport function formatNamespaceAvailability(a: {\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n message: string;\n}): string {\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return `${S.ok(\"✓\")} ${a.message}`;\n case \"claimable-by-you\":\n return `${S.warn(\"!\")} ${a.message}`;\n default:\n return `${S.err(\"✗\")} ${a.message}`;\n }\n}\n\n/**\n * Preflight the target namespace against the store's availability probe BEFORE a\n * publish does any irreversible work (a public git push). Returns `{ ok: false }`\n * with a guided message for `reserved` (not yours) and `claimable-by-you` (must\n * claim first) — the two states a real publish would reject — so the caller can\n * abort with actionable guidance instead of a raw 422 after pushing bytes.\n *\n * The probe is advisory: any failure (offline, older store) returns `{ ok: true }`\n * so the store stays the authority and a valid publish is never blocked.\n */\nexport async function preflightNamespace(\n client: PublisherClient,\n namespace: string,\n): Promise<{ ok: boolean; message?: string }> {\n let a: Awaited<ReturnType<PublisherClient[\"namespaceAvailability\"]>>;\n try {\n a = await client.namespaceAvailability(namespace);\n } catch {\n return { ok: true };\n }\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return { ok: true };\n case \"claimable-by-you\":\n return {\n ok: false,\n message:\n `@${namespace} isn't yours yet — claim it in the store first` +\n `${a.claimMethod ? ` (${a.claimMethod})` : \"\"}, then re-run. ${a.message}`,\n };\n default: // reserved, or any unrecognized future status (fail safe → block)\n return { ok: false, message: `Cannot publish under @${namespace} — ${a.message}` };\n }\n}\n\n/** One candidate row shape the matcher operates on (kind + name are the key). */\ninterface CandidateLike {\n kind: string;\n name: string;\n}\n\n/**\n * Keep only candidates whose `(kind, name)` pair is declared in the manifest.\n * The backend may merge extra assets from the base repo into the candidate\n * list; a publish only touches what the manifest curated/declared.\n */\nexport function matchCandidatesToManifest<T extends CandidateLike>(\n candidates: T[],\n manifest: SkPublishManifest,\n): T[] {\n const wanted = new Set((manifest.assets ?? []).map((a) => `${a.kind}:${a.name}`));\n return candidates.filter((c) => wanted.has(`${c.kind}:${c.name}`));\n}\n\n/** A canonical ref string `kind:@publisher/name[#version]` for reporting. */\nexport function refFor(kind: string, publisher: string, name: string, version?: string): string {\n const base = `${kind}:@${publisher}/${name}`;\n return version ? `${base}#${version}` : base;\n}\n\n/** The bare asset name from a `kind:@publisher/name#version` ref or a plain name. */\nexport function bareName(ref: string): string {\n const afterKind = ref.includes(\":\") ? ref.slice(ref.indexOf(\":\") + 1) : ref;\n const afterScope = afterKind.includes(\"/\")\n ? afterKind.slice(afterKind.indexOf(\"/\") + 1)\n : afterKind;\n return afterScope.split(\"#\")[0];\n}\n\n/**\n * Poll a job until it leaves `running` or the deadline passes. Returns the last\n * observed state — the caller MUST treat a still-`running` result as a timeout\n * (not success), since it means the deadline was hit before the job finished.\n */\nexport async function pollJob(\n client: PublisherClient,\n jobId: string,\n intervalMs = 1_500,\n timeoutMs = 60_000,\n): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }> {\n const deadline = Date.now() + timeoutMs;\n let job = await client.jobGet(jobId);\n while (job.status === \"running\" && Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n job = await client.jobGet(jobId);\n }\n return job;\n}\n\n/**\n * True when a `sourcesAdd` rejection is a duplicate-URL conflict (the source is\n * already registered) — the only error the publish flow recovers from by looking\n * the existing row up. Every other failure (auth, 5xx, network) must propagate.\n */\nexport function isDupSourceError(err: unknown): boolean {\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();\n return /\\b409\\b|conflict|duplicate|already exists|already registered|unique/.test(msg);\n}\n\n/**\n * Register + sync the source, then publish its curated/declared candidates —\n * the store-side steps shared by both publish front-ends. Git side-effects (the\n * sidecar push, or the library commit+push) happen in the caller *before* this;\n * this function is purely store interaction.\n *\n * The sidecar front-end passes `sidecar` (so `sourcesAdd` carries the sidecar\n * pin); the library front-end omits it (the source repo IS the manifest host).\n * `assetName`, when set, narrows publication to the single candidate of that\n * name. Fatal store states (`sourcesAdd` non-dup failure) surface; sync failures\n * and empty candidate sets `process.exit(1)` with the same messages as before.\n */\nexport async function publishToStore(opts: {\n sourceUrl: string;\n ref: string;\n sidecar?: { url: string; ref: string };\n manifest: SkPublishManifest;\n assetName?: string;\n client: PublisherClient;\n}): Promise<{ published: string[] }> {\n const { sourceUrl, ref, sidecar, manifest, assetName, client: pub } = opts;\n\n let sourceId: string;\n try {\n const added = await pub.sourcesAdd({\n url: sourceUrl,\n ref,\n ...(sidecar ? { sidecarUrl: sidecar.url, sidecarRef: sidecar.ref } : {}),\n // Publish under the manifest's declared namespace; the store resolves a\n // claimed Publisher when it differs from the caller's login, else defaults\n // to `@<username>`. Omitted when the manifest carries no publisher.\n ...(manifest.publisher ? { namespace: manifest.publisher } : {}),\n });\n sourceId = added.id;\n } catch (err) {\n // Only a duplicate-url conflict is recoverable (source already registered);\n // auth/5xx/network failures must surface, not silently reuse a stale row.\n if (!isDupSourceError(err)) throw err;\n const rows = await pub.sourcesList();\n const found = rows.find((r) => r.url === sourceUrl);\n if (!found) {\n throw new Error(\n `Source ${sourceUrl} looked already-registered but no owned row matched: ` +\n `${err instanceof Error ? err.message : String(err)}`,\n );\n }\n sourceId = found.id;\n }\n\n const { jobId } = await pub.sourceSync(sourceId);\n const job = await pollJob(pub, jobId);\n if (job.status === \"failed\" || job.status === \"cancelled\") {\n const failed = (job.items ?? []).filter((i) => i.status === \"failed\");\n for (const i of failed) logErr(`sync: ${i.label}: ${i.error ?? \"failed\"}`);\n logErr(`Source sync ${job.status}.`);\n process.exit(1);\n }\n // A still-`running` job means the poll deadline was hit — do NOT proceed on an\n // unfinished sync (it would read incomplete candidates).\n if (job.status === \"running\") {\n logErr(\"Source sync timed out before completing — re-run `publish`, or check the store.\");\n process.exit(1);\n }\n\n let candidates = matchCandidatesToManifest(await pub.sourceCandidates(sourceId), manifest);\n if (assetName) candidates = candidates.filter((c) => c.name === assetName);\n if (candidates.length === 0) {\n logWarn(\"No candidates discovered — check the manifest and the source ref.\");\n process.exit(1);\n }\n\n const published: string[] = [];\n for (const c of candidates) {\n try {\n const preview = await pub.assetPreview(c.id);\n const res = await pub.assetPublish(c.id, { ref, files: preview.discoveredFiles });\n // Publish is async — wait for the job so we only report refs that actually\n // landed, not ones whose import is still in flight or about to fail.\n if (res.jobId) {\n const pubJob = await pollJob(pub, res.jobId);\n if (pubJob.status !== \"succeeded\") {\n const errs = (pubJob.items ?? [])\n .filter((i) => i.status === \"failed\")\n .map((i) => i.error)\n .filter(Boolean);\n logWarn(\n `Publish of ${c.kind}:${c.name} did not succeed (${pubJob.status})` +\n (errs.length ? `: ${errs.join(\"; \")}` : \"\"),\n );\n continue;\n }\n }\n published.push(refFor(c.kind, preview.candidate.publisherNamespace, c.name, c.version));\n } catch (err) {\n logWarn(\n `Failed to publish ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Published ${published.length} asset(s):`);\n for (const r of published) logInfo(` ${r}`);\n return { published };\n}\n"]}
@@ -1,24 +1,24 @@
1
- import { WorkspacePlugin } from './chunk-OPSKLUB4.js';
2
- import { buildWorkspaceToolDefs } from './chunk-5FMWNSAQ.js';
1
+ import { WorkspacePlugin } from './chunk-R2RFFXK7.js';
2
+ import { buildWorkspaceToolDefs } from './chunk-HMUFI3L5.js';
3
3
  import { findAiAssetsRoot } from './chunk-7IH3RKKK.js';
4
4
  import { WebSocketServerTransport } from './chunk-73ZXUUL6.js';
5
5
  import { assembleSystemPrompt, buildCapabilitiesPromptSection } from './chunk-W3UDISS2.js';
6
6
  import { prepareNativePolicy, codexInstanceEnvironment, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult } from './chunk-PE3A6FFW.js';
7
- import { resolveFlowPath } from './chunk-SY2HSULI.js';
7
+ import { resolveFlowPath } from './chunk-3GOU3VEH.js';
8
8
  import { findAiAssetsRoot as findAiAssetsRoot$1, deployCatalogEntry, undeployCatalogEntry } from './chunk-Q6NDQ6BH.js';
9
- import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, driveOrchestratorTurn, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-ZDSZGV5F.js';
9
+ import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, driveOrchestratorTurn, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-IBUY53DN.js';
10
10
  import { loadYamlConnectorDeclarations, withMaterializedConnectorDeclarations, SecretProviderChain, ConnectorStartupError, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-MC2MF4U5.js';
11
- import { EventNormalizer } from './chunk-XBMCUMZT.js';
11
+ import { EventNormalizer } from './chunk-IN466NSZ.js';
12
12
  import { probeResumeTranscript, transcriptStoreForRuntime } from './chunk-6S5KL76M.js';
13
13
  import { CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
14
- import { dispatchCapability } from './chunk-RLACUE4X.js';
14
+ import { dispatchCapability } from './chunk-D3UARV3Z.js';
15
15
  import { classifyClaudeSdkError } from './chunk-BGY4KTU6.js';
16
16
  import { agentExecRequested } from './chunk-YROR332M.js';
17
- import { createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv, AI_PROVIDER_PRESETS } from './chunk-RTD5KAM4.js';
17
+ import { toAgentEffort, createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv, AI_PROVIDER_PRESETS, AgentDriver } from './chunk-IRGI7Q62.js';
18
18
  import { loadFlow } from './chunk-KTCMBEEB.js';
19
19
  import { parseFlowDefinition } from './chunk-ALLCAFHQ.js';
20
20
  import { renderStimulusPrompt } from './chunk-RQLL7L72.js';
21
- import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-S5A5MVJN.js';
21
+ import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-GRBB4CQL.js';
22
22
  import { resolveSettings, loadProviderRegistry } from './chunk-UWU572Q6.js';
23
23
  import { resolveRuntimeAssets } from './chunk-5RHPNNWP.js';
24
24
  import { resolveDriverPaths } from './chunk-K5GBV4SA.js';
@@ -2715,7 +2715,11 @@ async function createAgentSession(config) {
2715
2715
  ]);
2716
2716
  logAssembledSystemPrompt(systemPrompt, sessionLog);
2717
2717
  const thinking = config.thinking ?? wsConfig.agent_config?.default?.thinking;
2718
- const effort = config.effort ?? (managed ? void 0 : wsConfig.agent_config?.default?.effort);
2718
+ const wsEffort = managed ? void 0 : wsConfig.agent_config?.default?.effort;
2719
+ const effort = config.effort ?? toAgentEffort(wsEffort);
2720
+ if (config.effort === void 0 && wsEffort !== void 0 && effort === void 0) {
2721
+ sessionLog.warn("ignoring unknown effort", { effort: wsEffort, source: "skaile.yaml" });
2722
+ }
2719
2723
  const maxTurns = maxTurnsOverride ?? manifest?.runtime?.max_turns;
2720
2724
  let driver;
2721
2725
  try {
@@ -4501,6 +4505,55 @@ async function handleCredentialRotatedSignal(deps) {
4501
4505
  }
4502
4506
  }
4503
4507
 
4508
+ // runner/src/reconfigure-handler.ts
4509
+ function driverAppliesReconfigure(driver) {
4510
+ return typeof driver.reconfigure === "function" && driver.reconfigure !== AgentDriver.prototype.reconfigure;
4511
+ }
4512
+ function applyReconfigurePatch(config, patch) {
4513
+ if (patch.model !== void 0) {
4514
+ config.model = patch.model;
4515
+ if (config.modelRef !== void 0) config.modelRef = patch.model;
4516
+ }
4517
+ if (patch.thinking !== void 0) config.thinking = patch.thinking;
4518
+ if (patch.effort !== void 0) config.effort = patch.effort;
4519
+ }
4520
+ function carryLiveReconfigure(config, patch, wireAgentConfigChanged) {
4521
+ if (wireAgentConfigChanged || !patch) return void 0;
4522
+ applyReconfigurePatch(config, patch);
4523
+ return patch;
4524
+ }
4525
+ function buildReconfigureHandler(deps) {
4526
+ const { getDriver, rememberPatch, log } = deps;
4527
+ return async (patch) => {
4528
+ const fields = Object.keys(patch).join(", ");
4529
+ const driver = getDriver();
4530
+ if (!driver) {
4531
+ log(`[reconfigure] no driver is running; ${fields} not applied`);
4532
+ return {
4533
+ ok: false,
4534
+ code: "no_driver",
4535
+ message: "No agent driver is running; the change applies when the session next starts."
4536
+ };
4537
+ }
4538
+ const driverId = driver.driverInfo?.id ?? "unknown";
4539
+ if (!driverAppliesReconfigure(driver)) {
4540
+ log(
4541
+ `[reconfigure] driver ${driverId} cannot apply a live reconfigure; ${fields} not applied`
4542
+ );
4543
+ return {
4544
+ ok: false,
4545
+ code: "not_supported",
4546
+ message: `The ${driverId} driver cannot change ${fields} live; the change applies when the session next starts.`
4547
+ };
4548
+ }
4549
+ driver.reconfigure(patch);
4550
+ rememberPatch(patch);
4551
+ const model = driver.getModel() ?? null;
4552
+ log(`[reconfigure] driver ${driverId} took ${fields} (model=${model ?? "(default)"})`);
4553
+ return { ok: true, model };
4554
+ };
4555
+ }
4556
+
4504
4557
  // runner/src/runtime-session-emit.ts
4505
4558
  function planRuntimeSessionEmit(input) {
4506
4559
  const { driverSessionId, model, capabilitySignature, lastEmitted } = input;
@@ -4898,7 +4951,9 @@ function awaitAgentEnd(driver, prompt, timeoutMs) {
4898
4951
  async function routeReply(deps) {
4899
4952
  const current = deps.getDriver();
4900
4953
  if (current.hasPendingQuestion()) {
4901
- return current.answerQuestion(deps.answer, deps.question, deps.requestId) ? "answered" : "fresh-turn";
4954
+ if (!current.answerQuestion(deps.answer, deps.question, deps.requestId)) return "fresh-turn";
4955
+ deps.onAnswered?.();
4956
+ return "answered";
4902
4957
  }
4903
4958
  await deps.awaitSwap();
4904
4959
  return "fresh-turn";
@@ -5003,6 +5058,68 @@ var EventGapBuffer = class _EventGapBuffer {
5003
5058
  }
5004
5059
  };
5005
5060
 
5061
+ // runner/src/compaction/context-window.ts
5062
+ var DEFAULT_CONTEXT_WINDOW = 2e5;
5063
+ var ONE_MILLION_CONTEXT_WINDOW = 1e6;
5064
+ var ONE_MILLION_ALIAS_PATTERN = /\[1m\]|-1m$/i;
5065
+ var ContextWindowResolver = class {
5066
+ constructor(opts = {}) {
5067
+ this.opts = opts;
5068
+ }
5069
+ opts;
5070
+ key = null;
5071
+ lastReported = null;
5072
+ contextReport = null;
5073
+ last = null;
5074
+ /** Whether any non-assumed window was ever resolved; the first one is not a change. */
5075
+ everKnown = false;
5076
+ resolve(driver) {
5077
+ const model = driver.getModel?.() || null;
5078
+ this.syncKey(model);
5079
+ const resolved = this.pick(driver.getContextWindow(), model);
5080
+ const firstKnown = !this.everKnown && this.last?.source === "assumed";
5081
+ if (this.last && !firstKnown && this.last.window !== resolved.window) {
5082
+ this.opts.warn?.(
5083
+ `[context-window] window changed ${this.last.window} (${this.last.source}) -> ${resolved.window} (${resolved.source}), model=${model ?? "unknown"}, seat=${this.opts.seat?.() ?? "unknown"}`
5084
+ );
5085
+ }
5086
+ this.last = resolved;
5087
+ if (resolved.source !== "assumed") this.everKnown = true;
5088
+ return resolved;
5089
+ }
5090
+ /** Record the window a fresh harness measurement gave (claude-sdk: `/context` `maxTokens`). */
5091
+ noteContextReport(driver, window) {
5092
+ if (!window || window <= 0) return;
5093
+ this.syncKey(driver.getModel?.() || null);
5094
+ this.contextReport = window;
5095
+ }
5096
+ pick(driverWindow, model) {
5097
+ const reported = driverWindow && driverWindow > 0 ? driverWindow : null;
5098
+ if (model && ONE_MILLION_ALIAS_PATTERN.test(model)) {
5099
+ if (reported !== null && reported >= ONE_MILLION_CONTEXT_WINDOW) {
5100
+ this.lastReported = reported;
5101
+ return { window: reported, source: "reported" };
5102
+ }
5103
+ return { window: ONE_MILLION_CONTEXT_WINDOW, source: "alias" };
5104
+ }
5105
+ if (reported !== null) {
5106
+ this.lastReported = reported;
5107
+ return { window: reported, source: "reported" };
5108
+ }
5109
+ if (this.lastReported !== null) return { window: this.lastReported, source: "last-known" };
5110
+ if (this.contextReport !== null)
5111
+ return { window: this.contextReport, source: "context-report" };
5112
+ return { window: DEFAULT_CONTEXT_WINDOW, source: "assumed" };
5113
+ }
5114
+ syncKey(model) {
5115
+ const key = `${model ?? ""}\0${this.opts.seat?.() ?? ""}`;
5116
+ if (key === this.key) return;
5117
+ this.key = key;
5118
+ this.lastReported = null;
5119
+ this.contextReport = null;
5120
+ }
5121
+ };
5122
+
5006
5123
  // runner/src/compaction/prompt.ts
5007
5124
  var DEFAULT_COMPACTION_PROMPT = `You are being asked to compact this conversation into a structured summary.
5008
5125
  This summary will replace the full conversation history when the session
@@ -5128,9 +5245,6 @@ var TokenThresholdStrategy = class {
5128
5245
  // runner/src/compaction/orchestrator.ts
5129
5246
  var MIN_SUMMARY_CHARS = 200;
5130
5247
  var MAX_COMPRESSION_RATIO = 0.9;
5131
- var DEFAULT_CONTEXT_WINDOW = 2e5;
5132
- var ONE_MILLION_CONTEXT_WINDOW = 1e6;
5133
- var ONE_MILLION_ALIAS_PATTERN = /\[1m\]|-1m$/i;
5134
5248
  var DEFAULT_COMPACTION_TIMEOUT_MS = 10 * 6e4;
5135
5249
  function compactionTimeoutMs() {
5136
5250
  const raw = Number(process.env.SKAILE_COMPACTION_TIMEOUT_MS);
@@ -5170,18 +5284,6 @@ function contextTokens(usage) {
5170
5284
  const cacheCreation = usage?.cacheCreationTokens ?? 0;
5171
5285
  return Math.max(input, cacheRead) + cacheCreation;
5172
5286
  }
5173
- function resolveContextWindow(driverWindow, model) {
5174
- if (model && ONE_MILLION_ALIAS_PATTERN.test(model)) {
5175
- return Math.max(driverWindow ?? 0, ONE_MILLION_CONTEXT_WINDOW);
5176
- }
5177
- return driverWindow || DEFAULT_CONTEXT_WINDOW;
5178
- }
5179
- function reportedContextWindow(driverWindow, model) {
5180
- if (model && ONE_MILLION_ALIAS_PATTERN.test(model)) {
5181
- return Math.max(driverWindow ?? 0, ONE_MILLION_CONTEXT_WINDOW);
5182
- }
5183
- return driverWindow && driverWindow > 0 ? driverWindow : null;
5184
- }
5185
5287
  function detectRateLimitInSummary(text2) {
5186
5288
  if (text2.length > RATE_LIMIT_TEXT_MAX_CHARS) return false;
5187
5289
  return RATE_LIMIT_TEXT_PATTERNS.some((p) => p.test(text2));
@@ -5200,6 +5302,7 @@ var CompactionOrchestrator = class {
5200
5302
  strategy;
5201
5303
  config;
5202
5304
  opts;
5305
+ contextWindows;
5203
5306
  _isCompacting = false;
5204
5307
  /** Whether {@link CompactionOrchestratorOptions.onCompactionStart} has fired for the current call. */
5205
5308
  _startFired = false;
@@ -5220,6 +5323,11 @@ var CompactionOrchestrator = class {
5220
5323
  this.opts = opts;
5221
5324
  this.config = { ...COMPACTION_DEFAULTS, ...opts.config };
5222
5325
  this.strategy = new TokenThresholdStrategy(this.config);
5326
+ this.contextWindows = opts.contextWindows ?? new ContextWindowResolver({ warn: (line) => opts.onLog?.(line) });
5327
+ }
5328
+ /** The window the fill is measured against, and where it came from. */
5329
+ resolveContextWindow() {
5330
+ return this.contextWindows.resolve(this.driver);
5223
5331
  }
5224
5332
  /**
5225
5333
  * How full the context window is. Prefers the driver's per-call figure; the
@@ -5234,14 +5342,12 @@ var CompactionOrchestrator = class {
5234
5342
  }
5235
5343
  /**
5236
5344
  * The context fill, in tokens, at which auto-compaction triggers — the same
5237
- * window and tier {@link shouldCompact} uses. `null` when compaction is off.
5345
+ * tier {@link shouldCompact} uses. Pass the window a caller already resolved
5346
+ * so the point it reports is computed from exactly that window. `null` when
5347
+ * compaction is off.
5238
5348
  */
5239
- compactAtTokens() {
5349
+ compactAtTokens(contextWindow = this.resolveContextWindow().window) {
5240
5350
  if (!this.config.enabled) return null;
5241
- const contextWindow = resolveContextWindow(
5242
- this.driver.getContextWindow(),
5243
- this.driver.getModel() ?? null
5244
- );
5245
5351
  return Math.round(
5246
5352
  contextWindow * resolveCompactionThresholdPercent(contextWindow, this.config) / 100
5247
5353
  );
@@ -5253,10 +5359,7 @@ var CompactionOrchestrator = class {
5253
5359
  shouldCompact() {
5254
5360
  if (!this.config.enabled) return false;
5255
5361
  const usage = this.driver.getTokenUsage();
5256
- const contextWindow = resolveContextWindow(
5257
- this.driver.getContextWindow(),
5258
- this.driver.getModel() ?? null
5259
- );
5362
+ const contextWindow = this.resolveContextWindow().window;
5260
5363
  const estimatedTokens = this.contextFill(usage);
5261
5364
  if (estimatedTokens <= 0) return false;
5262
5365
  return this.strategy.shouldCompact({
@@ -6066,15 +6169,16 @@ function composeContextUsageSnapshot(input) {
6066
6169
  used = sumBuckets(buckets);
6067
6170
  totalFidelity = used > 0 ? "estimated" : "unknown";
6068
6171
  }
6069
- const window = input.contextWindow ?? (fresh ? report.contextWindow ?? null : null);
6070
- if (window !== null && window > 0) {
6071
- const threshold = input.autoCompactAt !== null ? Math.min(input.autoCompactAt, window) : window;
6172
+ const window = input.contextWindow !== null && input.contextWindow > 0 ? input.contextWindow : null;
6173
+ const autoCompactAt = window !== null ? input.autoCompactAt : null;
6174
+ if (window !== null) {
6175
+ const threshold = autoCompactAt !== null ? Math.min(autoCompactAt, window) : window;
6072
6176
  buckets.set("free", {
6073
6177
  id: "free",
6074
6178
  tokens: Math.max(0, threshold - used),
6075
6179
  fidelity: totalFidelity
6076
6180
  });
6077
- if (input.autoCompactAt !== null) {
6181
+ if (autoCompactAt !== null) {
6078
6182
  buckets.set("compaction-buffer", {
6079
6183
  id: "compaction-buffer",
6080
6184
  tokens: Math.max(0, window - Math.max(used, threshold)),
@@ -6085,10 +6189,11 @@ function composeContextUsageSnapshot(input) {
6085
6189
  return {
6086
6190
  provider: input.provider,
6087
6191
  model: input.model,
6088
- contextWindow: window !== null && window > 0 ? window : null,
6192
+ contextWindow: window,
6193
+ ...window !== null && input.contextWindowSource ? { contextWindowSource: input.contextWindowSource } : {},
6089
6194
  usedTokens: used,
6090
6195
  totalFidelity,
6091
- autoCompactAt: input.autoCompactAt,
6196
+ autoCompactAt,
6092
6197
  buckets: BUCKET_ORDER.flatMap((id) => {
6093
6198
  const bucket = buckets.get(id);
6094
6199
  return bucket ? [bucket] : [];
@@ -6260,6 +6365,7 @@ var ContextUsageCollector = class {
6260
6365
  constructor(deps) {
6261
6366
  this.deps = deps;
6262
6367
  this.estimator = deps.estimator ?? defaultTokenEstimator;
6368
+ this.contextWindows = deps.contextWindows ?? new ContextWindowResolver();
6263
6369
  this.tracker = new TranscriptTokenTracker(this.estimator);
6264
6370
  }
6265
6371
  deps;
@@ -6269,6 +6375,7 @@ var ContextUsageCollector = class {
6269
6375
  inflight = /* @__PURE__ */ new Map();
6270
6376
  skills = null;
6271
6377
  capabilityMemo = null;
6378
+ contextWindows;
6272
6379
  /** A driver was (re)built; everything measured or cached about the old one is void. */
6273
6380
  onDriverBuilt(opts) {
6274
6381
  this.tracker.reset(opts);
@@ -6328,14 +6435,20 @@ var ContextUsageCollector = class {
6328
6435
  const usage = driver?.getTokenUsage() ?? null;
6329
6436
  const perCall = driver?.getContextTokens?.() ?? null;
6330
6437
  const fill = opts.trigger === "compaction" ? null : perCall ?? (usage ? contextTokens(usage) : null);
6438
+ let window = null;
6439
+ if (driver) {
6440
+ if (reportFresh) this.contextWindows.noteContextReport(driver, report?.contextWindow);
6441
+ window = this.contextWindows.resolve(driver);
6442
+ }
6331
6443
  const snapshot = composeContextUsageSnapshot({
6332
6444
  provider: this.deps.provider(),
6333
6445
  model,
6334
6446
  trigger: opts.trigger,
6335
6447
  capturedAt: (this.deps.now?.() ?? /* @__PURE__ */ new Date()).toISOString(),
6336
6448
  contextTokens: fill,
6337
- contextWindow: driver ? reportedContextWindow(driver.getContextWindow(), model || null) : null,
6338
- autoCompactAt: this.deps.autoCompactAt(),
6449
+ contextWindow: window?.window ?? null,
6450
+ ...window ? { contextWindowSource: window.source } : {},
6451
+ autoCompactAt: window ? this.deps.autoCompactAt(window.window) : null,
6339
6452
  systemPromptSections: this.deps.systemPromptSections(),
6340
6453
  report,
6341
6454
  reportFresh,
@@ -6793,6 +6906,13 @@ var setStateInput = z7.strictObject({
6793
6906
  var lifecycleInput = z7.strictObject({
6794
6907
  phase: z7.enum(["hibernate", "close", "compact"])
6795
6908
  });
6909
+ var reconfigureInputSchema = z7.strictObject({
6910
+ model: z7.string().trim().min(1).optional(),
6911
+ thinking: z7.enum(["adaptive", "enabled", "disabled"]).optional(),
6912
+ effort: z7.enum(["low", "medium", "high", "xhigh", "max"]).optional()
6913
+ }).refine((p) => p.model !== void 0 || p.thinking !== void 0 || p.effort !== void 0, {
6914
+ message: "a reconfigure names at least one of model, thinking, effort"
6915
+ });
6796
6916
  var VALID_LOG_STORE_LEVELS = /* @__PURE__ */ new Set(["debug", "info", "warn", "error"]);
6797
6917
  function buildRunnerCapabilities(handlers) {
6798
6918
  return [
@@ -6967,6 +7087,24 @@ function buildRunnerCapabilities(handlers) {
6967
7087
  }
6968
7088
  return handlers.lifecycle(input);
6969
7089
  }
7090
+ }),
7091
+ defineCapability({
7092
+ name: "runner.reconfigure",
7093
+ displayName: "Reconfigure agent",
7094
+ description: "Change the running agent's model, thinking mode or effort without a restart. Applies from the next turn; a turn in progress finishes on the old settings. Answers no_driver or not_supported when the change cannot apply live.",
7095
+ side: "agent",
7096
+ origin: RUNNER_CAP_ORIGIN,
7097
+ audience: ["runtime"],
7098
+ kind: "effect",
7099
+ input: reconfigureInputSchema,
7100
+ handler: async (input) => {
7101
+ if (!handlers.reconfigure) return notImplemented("runner.reconfigure");
7102
+ const patch = {};
7103
+ if (input.model !== void 0) patch.model = input.model;
7104
+ if (input.thinking !== void 0) patch.thinking = input.thinking;
7105
+ if (input.effort !== void 0) patch.effort = input.effort;
7106
+ return handlers.reconfigure(patch);
7107
+ }
6970
7108
  })
6971
7109
  ];
6972
7110
  }
@@ -6987,6 +7125,8 @@ function wireSessionCapabilities(deps) {
6987
7125
  detachSkillInstance,
6988
7126
  registerLiveAttachedMcp,
6989
7127
  scheduleDriverRestartForToolChanges,
7128
+ getDriver,
7129
+ rememberReconfigure,
6990
7130
  log
6991
7131
  } = deps;
6992
7132
  capabilityRegistry.setRemoteInvoker(remoteCapabilityInvoker);
@@ -7044,6 +7184,11 @@ function wireSessionCapabilities(deps) {
7044
7184
  getCompactionOrchestrator,
7045
7185
  getResourceManager,
7046
7186
  log
7187
+ }),
7188
+ reconfigure: buildReconfigureHandler({
7189
+ getDriver,
7190
+ rememberPatch: rememberReconfigure,
7191
+ log
7047
7192
  })
7048
7193
  });
7049
7194
  for (const cap of runnerCaps) {
@@ -8217,6 +8362,13 @@ async function startAgentServer(opts) {
8217
8362
  wsConfig.secrets?.timeoutMs ?? 3e4;
8218
8363
  const diskProfileHasAgentSettings = (p) => !!p && !!(p.driver || p.model || p.thinking || p.effort);
8219
8364
  function buildSessionConfig(secretProvider2, credentialEnv, fallbackConnectorDeclarations) {
8365
+ const wireEffort = toAgentEffort(wireAgentConfig?.effort);
8366
+ if (wireAgentConfig?.effort && !wireEffort) {
8367
+ serverLog.warn("ignoring unknown effort", {
8368
+ effort: wireAgentConfig.effort,
8369
+ source: "agentConfig"
8370
+ });
8371
+ }
8220
8372
  return {
8221
8373
  projectDir: opts.projectDir,
8222
8374
  agentDir,
@@ -8243,7 +8395,7 @@ async function startAgentServer(opts) {
8243
8395
  // entry references. Omitted entirely when nothing resolved.
8244
8396
  ...credentialEnv && Object.keys(credentialEnv).length > 0 ? { credentialEnv } : {},
8245
8397
  ...wireAgentConfig?.thinking ? { thinking: wireAgentConfig.thinking } : {},
8246
- ...wireAgentConfig?.effort ? { effort: wireAgentConfig.effort } : {},
8398
+ ...wireEffort ? { effort: wireEffort } : {},
8247
8399
  // Every claude-sdk driver carries the flow tools, so a run can start mid-turn.
8248
8400
  extraInProcessMcpServers: buildPermanentFlowMcpServers,
8249
8401
  // Protocol v2 `<CAPABILITIES>` block — joins each registered capability's
@@ -8332,6 +8484,10 @@ async function startAgentServer(opts) {
8332
8484
  });
8333
8485
  let sessionConfig;
8334
8486
  let agentSession;
8487
+ const contextWindows = new ContextWindowResolver({
8488
+ seat: () => aiProviderConfigId,
8489
+ warn: (line) => serverLog.warn(line)
8490
+ });
8335
8491
  const contextUsage = new ContextUsageCollector({
8336
8492
  driver: () => driver,
8337
8493
  provider: () => agentSession?.driverType ?? "unknown",
@@ -8340,7 +8496,8 @@ async function startAgentServer(opts) {
8340
8496
  (cap) => (cap.audience ?? ["llm", "user"]).includes("llm") && !cap.name.startsWith("host.") && !cap.name.startsWith("runner.")
8341
8497
  ),
8342
8498
  readSkills: () => readSkillListings(join(opts.projectDir, activeSkillsDir())),
8343
- autoCompactAt: () => compactionOrchestrator?.compactAtTokens() ?? null
8499
+ autoCompactAt: (window) => compactionOrchestrator?.compactAtTokens(window) ?? null,
8500
+ contextWindows
8344
8501
  });
8345
8502
  function noteAgentSessionBuilt(resumeSessionId2) {
8346
8503
  contextUsage.onDriverBuilt({ resuming: !!resumeSessionId2 || !!managedCodex });
@@ -8355,6 +8512,7 @@ async function startAgentServer(opts) {
8355
8512
  let managedInitFingerprint;
8356
8513
  let managedInitComplete = false;
8357
8514
  let appliedWireAgentConfigKey;
8515
+ let liveReconfigurePatch;
8358
8516
  let wireConnectorDeclarationsApplied = false;
8359
8517
  const stagedSkillDirs = /* @__PURE__ */ new Map();
8360
8518
  const withSkillFsLock = createSerialLock();
@@ -8608,6 +8766,7 @@ async function startAgentServer(opts) {
8608
8766
  compactionOrchestrator = new CompactionOrchestrator({
8609
8767
  driver,
8610
8768
  config: compactionConfig,
8769
+ contextWindows,
8611
8770
  onCompactionStart: (trigger) => {
8612
8771
  compacting = true;
8613
8772
  gateHold = compactionGate.begin();
@@ -9098,6 +9257,12 @@ async function startAgentServer(opts) {
9098
9257
  credentialEnv,
9099
9258
  fallbackConnectorDeclarations
9100
9259
  );
9260
+ const incomingWireAgentConfigKey = wireAgentConfig ? JSON.stringify(wireAgentConfig) : void 0;
9261
+ liveReconfigurePatch = carryLiveReconfigure(
9262
+ sessionConfig,
9263
+ liveReconfigurePatch,
9264
+ incomingWireAgentConfigKey !== appliedWireAgentConfigKey
9265
+ );
9101
9266
  let needsWireFallbackRecreate = false;
9102
9267
  const agentSessionExistedBeforeThisInit = !!agentSession;
9103
9268
  if (!agentSession) {
@@ -9148,6 +9313,11 @@ async function startAgentServer(opts) {
9148
9313
  detachSkillInstance,
9149
9314
  registerLiveAttachedMcp,
9150
9315
  scheduleDriverRestartForToolChanges,
9316
+ getDriver: () => driver ?? null,
9317
+ rememberReconfigure: (patch) => {
9318
+ liveReconfigurePatch = { ...liveReconfigurePatch, ...patch };
9319
+ applyReconfigurePatch(sessionConfig, patch);
9320
+ },
9151
9321
  log
9152
9322
  });
9153
9323
  return { needsWireFallbackRecreate, needsWireAgentConfigRecreate };
@@ -9787,7 +9957,15 @@ async function startAgentServer(opts) {
9787
9957
  awaitSwap: () => driverSwapGate.awaitSwap(),
9788
9958
  answer: cmd.answer,
9789
9959
  question: cmd.question,
9790
- requestId: cmd.requestId
9960
+ requestId: cmd.requestId,
9961
+ // Tells every other attached client the question is answered, so none
9962
+ // keeps a stale question card or a shut status gate.
9963
+ onAnswered: () => sendEvent({
9964
+ type: "question_reply",
9965
+ answer: cmd.answer,
9966
+ ...cmd.question !== void 0 ? { question: cmd.question } : {},
9967
+ ...cmd.requestId !== void 0 ? { requestId: cmd.requestId } : {}
9968
+ })
9791
9969
  });
9792
9970
  if (routed === "answered") return;
9793
9971
  if (!driver.acceptsReplyAsPrompt) return;
@@ -10383,5 +10561,5 @@ function touchSession(state) {
10383
10561
  }
10384
10562
 
10385
10563
  export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, DEFAULT_FLOW_MUTATE_CONNECTOR_WAIT_MS, MOUNT_LIST_MAX_DEPTH, MOUNT_LIST_MAX_ENTRIES, MOUNT_READ_DEADLINE_FACTOR, MOUNT_STAT_BUDGET_MS, MOUNT_STAT_MAX_ENTRIES, MOUNT_TREE_OP_DEADLINE_FACTOR, MarkdownStreamer, PreInitRingSink, ResourceOperationError, SESSION_ROOT_WRITABLE_DIRS, SESSION_ROOT_WRITABLE_FILES, WS_AUTH_TOKEN_ENV, WS_AUTH_TOKEN_FILE_ENV, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, buildStoreSnapshotReplay, builtinCapabilities, capabilityLogInstance, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, computeDirectoryTotals, connectorRefreshKind, createAgentSession, createFlowConnectorReadiness, createManagedCodexSubpromptDriver, createSessionStimulusBus, defineCapability, deleteSession, dispatchResourceRequest, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureClaudeSettingsDisablesConnectors, ensureGitConfigInclude, executeConnectorMutate, extractClaudeAiOauthExpiresAt, flowStartNeedsDriverRestart, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, handleSessionRootResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isSessionRootPathAllowed, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadManagedCodexHostConfig, loadSession, loadSessionById, mcpAuthSecretKey, newSession, nulTailPaddingLength, pickFlowToolTarget, pickRepointedManager, planFlowMutate, prepareCodexTools, reconcilePendingDecisions, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, rejectPendingCapabilityCallsOnDisconnect, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, supportsLiveToolUpdates, takeRunnerWsAuthToken, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
10386
- //# sourceMappingURL=chunk-N5XNEKHC.js.map
10387
- //# sourceMappingURL=chunk-N5XNEKHC.js.map
10564
+ //# sourceMappingURL=chunk-XZO4TMAQ.js.map
10565
+ //# sourceMappingURL=chunk-XZO4TMAQ.js.map