@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.
- package/CHANGELOG.md +28 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-HKPNPO7N.js → asset-feeds-6TCDMWCJ.js} +4 -4
- package/dist/{asset-feeds-HKPNPO7N.js.map → asset-feeds-6TCDMWCJ.js.map} +1 -1
- package/dist/asset-manager/index.js +1 -1
- package/dist/bridge/drivers/claude-sdk.js +115 -6
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +2 -2
- package/dist/bridge/drivers/continue.js +3 -3
- package/dist/bridge/drivers/echo.js +3 -3
- package/dist/bridge/drivers/gemini.js +5 -5
- package/dist/bridge/drivers/goose.js +3 -3
- package/dist/bridge/drivers/omp.js +4 -4
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +3 -3
- package/dist/bridge/drivers/qwen.js +5 -5
- package/dist/bridge/index.js +5 -5
- package/dist/bridge/src/drivers/claude-sdk.d.ts +23 -0
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp.d.ts +1 -1
- package/dist/bridge/src/types.d.ts +17 -2
- package/dist/bridge/src/types.d.ts.map +1 -1
- package/dist/{chunk-SY2HSULI.js → chunk-3GOU3VEH.js} +3 -3
- package/dist/{chunk-SY2HSULI.js.map → chunk-3GOU3VEH.js.map} +1 -1
- package/dist/{chunk-HA674IQL.js → chunk-47MUF565.js} +6 -6
- package/dist/{chunk-HA674IQL.js.map → chunk-47MUF565.js.map} +1 -1
- package/dist/{chunk-ES4E6RDZ.js → chunk-52OD6PJ4.js} +3 -3
- package/dist/{chunk-ES4E6RDZ.js.map → chunk-52OD6PJ4.js.map} +1 -1
- package/dist/{chunk-TVLQTO7E.js → chunk-7LZJRVKJ.js} +9 -3
- package/dist/chunk-7LZJRVKJ.js.map +1 -0
- package/dist/{chunk-RLACUE4X.js → chunk-D3UARV3Z.js} +3 -3
- package/dist/{chunk-RLACUE4X.js.map → chunk-D3UARV3Z.js.map} +1 -1
- package/dist/{chunk-IZAN5MHL.js → chunk-F4ECQAN3.js} +165 -4
- package/dist/chunk-F4ECQAN3.js.map +1 -0
- package/dist/{chunk-S5A5MVJN.js → chunk-GRBB4CQL.js} +4 -4
- package/dist/chunk-GRBB4CQL.js.map +1 -0
- package/dist/{chunk-5FMWNSAQ.js → chunk-HMUFI3L5.js} +3 -3
- package/dist/{chunk-5FMWNSAQ.js.map → chunk-HMUFI3L5.js.map} +1 -1
- package/dist/{chunk-ZDSZGV5F.js → chunk-IBUY53DN.js} +59 -12
- package/dist/chunk-IBUY53DN.js.map +1 -0
- package/dist/{chunk-XBMCUMZT.js → chunk-IN466NSZ.js} +4 -4
- package/dist/{chunk-XBMCUMZT.js.map → chunk-IN466NSZ.js.map} +1 -1
- package/dist/{chunk-RTD5KAM4.js → chunk-IRGI7Q62.js} +10 -3
- package/dist/chunk-IRGI7Q62.js.map +1 -0
- package/dist/{chunk-RBTVXXD5.js → chunk-JIPPMYOM.js} +3 -3
- package/dist/{chunk-RBTVXXD5.js.map → chunk-JIPPMYOM.js.map} +1 -1
- package/dist/{chunk-GTS2FODO.js → chunk-JKJ7XYLG.js} +35 -3
- package/dist/chunk-JKJ7XYLG.js.map +1 -0
- package/dist/{chunk-AEOHSR27.js → chunk-KVWSBQNP.js} +3 -3
- package/dist/{chunk-AEOHSR27.js.map → chunk-KVWSBQNP.js.map} +1 -1
- package/dist/{chunk-ODIJJXXB.js → chunk-NJ2AI2DR.js} +6 -6
- package/dist/{chunk-ODIJJXXB.js.map → chunk-NJ2AI2DR.js.map} +1 -1
- package/dist/{chunk-5YDCUHJI.js → chunk-PIY5NTXY.js} +3 -3
- package/dist/{chunk-5YDCUHJI.js.map → chunk-PIY5NTXY.js.map} +1 -1
- package/dist/{chunk-EUGEEYGD.js → chunk-Q6LSBAQK.js} +2 -2
- package/dist/{chunk-EUGEEYGD.js.map → chunk-Q6LSBAQK.js.map} +1 -1
- package/dist/{chunk-YEQ3BXOY.js → chunk-QCACHN2P.js} +3 -3
- package/dist/{chunk-YEQ3BXOY.js.map → chunk-QCACHN2P.js.map} +1 -1
- package/dist/{chunk-OPSKLUB4.js → chunk-R2RFFXK7.js} +2 -2
- package/dist/{chunk-OPSKLUB4.js.map → chunk-R2RFFXK7.js.map} +1 -1
- package/dist/{chunk-R3EU2FFW.js → chunk-UHYS34Z5.js} +4 -4
- package/dist/{chunk-R3EU2FFW.js.map → chunk-UHYS34Z5.js.map} +1 -1
- package/dist/{chunk-FELWDKLQ.js → chunk-WBRD2T5J.js} +3 -3
- package/dist/{chunk-FELWDKLQ.js.map → chunk-WBRD2T5J.js.map} +1 -1
- package/dist/{chunk-N5XNEKHC.js → chunk-XZO4TMAQ.js} +226 -48
- package/dist/chunk-XZO4TMAQ.js.map +1 -0
- package/dist/{chunk-I4VIRPHS.js → chunk-Y6QVVKFN.js} +3 -3
- package/dist/{chunk-I4VIRPHS.js.map → chunk-Y6QVVKFN.js.map} +1 -1
- package/dist/{chunk-RZ2YIFT6.js → chunk-ZULBOMNO.js} +6 -6
- package/dist/{chunk-RZ2YIFT6.js.map → chunk-ZULBOMNO.js.map} +1 -1
- package/dist/cli/index.js +36 -36
- package/dist/connectors/index.js +7 -7
- package/dist/connectors/src/connector-manager.d.ts +15 -0
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors-shared/index.js +2 -2
- package/dist/{ensure-sources-MUS622KB.js → ensure-sources-ONLJKK4T.js} +4 -4
- package/dist/{ensure-sources-MUS622KB.js.map → ensure-sources-ONLJKK4T.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +7 -7
- package/dist/factory-assets/connectors/deploy.js +7 -7
- package/dist/factory-assets/connectors/devserver.js +7 -7
- package/dist/factory-assets/connectors/flow/adapter.js +7 -7
- package/dist/factory-assets/connectors/flow/run-flow.js +8 -8
- package/dist/factory-assets/connectors/flow.js +7 -7
- package/dist/factory-assets/connectors/git.js +7 -7
- package/dist/factory-assets/connectors/gmail.js +7 -7
- package/dist/factory-assets/connectors/googledrive.js +7 -7
- package/dist/factory-assets/connectors/local.js +7 -7
- package/dist/factory-assets/connectors/mattermost.js +7 -7
- package/dist/factory-assets/connectors/memory.js +7 -7
- package/dist/factory-assets/connectors/minio.js +7 -7
- package/dist/factory-assets/connectors/postgres.js +7 -7
- package/dist/factory-assets/connectors/s3.js +7 -7
- package/dist/factory-assets/connectors/sharepoint.js +7 -7
- package/dist/factory-assets/connectors/sqlite.js +7 -7
- package/dist/factory-assets/connectors/static-server.js +7 -7
- package/dist/factory-assets/connectors/tunnel.js +7 -7
- package/dist/factory-assets/connectors/webdav.js +7 -7
- package/dist/factory-assets/connectors/xstate-store.js +7 -7
- package/dist/factory-assets/connectors/xstate.js +7 -7
- package/dist/{helpers-V3IJWB75.js → helpers-SGWUYZUS.js} +4 -4
- package/dist/{helpers-V3IJWB75.js.map → helpers-SGWUYZUS.js.map} +1 -1
- package/dist/{library-publish-TXJM76SD.js → library-publish-ZEZA6DAI.js} +6 -6
- package/dist/{library-publish-TXJM76SD.js.map → library-publish-ZEZA6DAI.js.map} +1 -1
- package/dist/{open-library-ORTV2RUE.js → open-library-OF377L77.js} +5 -5
- package/dist/{open-library-ORTV2RUE.js.map → open-library-OF377L77.js.map} +1 -1
- package/dist/{project-GI2A75UN.js → project-23QK7474.js} +5 -5
- package/dist/{project-GI2A75UN.js.map → project-23QK7474.js.map} +1 -1
- package/dist/runner/index.js +12 -12
- package/dist/runner/src/compaction/context-window.d.ts +53 -0
- package/dist/runner/src/compaction/context-window.d.ts.map +1 -0
- package/dist/runner/src/compaction/index.d.ts +1 -0
- package/dist/runner/src/compaction/index.d.ts.map +1 -1
- package/dist/runner/src/compaction/orchestrator.d.ts +14 -17
- package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
- package/dist/runner/src/context-usage/collector.d.ts +12 -2
- package/dist/runner/src/context-usage/collector.d.ts.map +1 -1
- package/dist/runner/src/context-usage/compose.d.ts +10 -2
- package/dist/runner/src/context-usage/compose.d.ts.map +1 -1
- package/dist/runner/src/managed-codex-bootstrap.d.ts +1 -1
- package/dist/runner/src/reconfigure-handler.d.ts +40 -0
- package/dist/runner/src/reconfigure-handler.d.ts.map +1 -0
- package/dist/runner/src/reply-routing.d.ts +2 -0
- package/dist/runner/src/reply-routing.d.ts.map +1 -1
- package/dist/runner/src/runner-capabilities.d.ts +48 -1
- package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +2 -2
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/runner/src/session-capability-wiring.d.ts +5 -0
- package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +1 -1
- package/dist/sdk/bridge.js +5 -5
- package/dist/sdk/index.js +12 -12
- package/dist/sdk/runner.js +12 -12
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/store.js +1 -1
- package/dist/sdk/transport/ws/client.js +1 -1
- package/dist/sdk/transport/ws.js +1 -1
- package/dist/sdk/transport.js +1 -1
- package/dist/sdk/types.js +1 -1
- package/dist/session/index.js +2 -2
- package/dist/session/src/bounded-subscriber-transport.d.ts +101 -0
- package/dist/session/src/bounded-subscriber-transport.d.ts.map +1 -0
- package/dist/session/src/dispatcher.d.ts.map +1 -1
- package/dist/session/src/index.d.ts +2 -0
- package/dist/session/src/index.d.ts.map +1 -1
- package/dist/session/src/types.d.ts +10 -1
- package/dist/session/src/types.d.ts.map +1 -1
- package/dist/{setup-GLCLE36X.js → setup-WZ3SWZFQ.js} +10 -10
- package/dist/{setup-GLCLE36X.js.map → setup-WZ3SWZFQ.js.map} +1 -1
- package/dist/{source-N6EKFFH5.js → source-YMKMBOKP.js} +6 -6
- package/dist/{source-N6EKFFH5.js.map → source-YMKMBOKP.js.map} +1 -1
- package/dist/{source-manifest-publish-BDMY4B4B.js → source-manifest-publish-B3CVM4RW.js} +7 -7
- package/dist/{source-manifest-publish-BDMY4B4B.js.map → source-manifest-publish-B3CVM4RW.js.map} +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/src/store.d.ts.map +1 -1
- package/dist/transport/index.js +1 -1
- package/dist/transport/src/ws/client.d.ts +12 -0
- package/dist/transport/src/ws/client.d.ts.map +1 -1
- package/dist/transport/ws/client.js +1 -1
- package/dist/transport/ws.js +1 -1
- package/dist/tui/index.js +12 -12
- package/dist/types/index.js +1 -1
- package/dist/types/src/context-usage.d.ts +16 -2
- package/dist/types/src/context-usage.d.ts.map +1 -1
- package/dist/types/src/events.d.ts +9 -2
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/lifecycle.d.ts +1 -1
- package/dist/types/src/lifecycle.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +17 -2
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +2 -2
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-GTS2FODO.js.map +0 -1
- package/dist/chunk-IZAN5MHL.js.map +0 -1
- package/dist/chunk-N5XNEKHC.js.map +0 -1
- package/dist/chunk-RTD5KAM4.js.map +0 -1
- package/dist/chunk-S5A5MVJN.js.map +0 -1
- package/dist/chunk-TVLQTO7E.js.map +0 -1
- 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":";;;;AA+FO,SAAS,uBAAA,CACd,MAAA,GAAsB,cAAA,EAAe,EACrC,YAAY,GAAA,EACK;AAGjB,EAAA,MAAM,IAAA,GAAO,OACX,IAAA,EACA,IAAA,KACe;AACf,IAAA,MAAM,GAAA,GAAM,MAAM,aAAA,EAAc;AAChC,IAAA,OAAO,UAAA,CAAc,EAAE,GAAG,MAAA,EAAQ,GAAA,EAAI,EAAG,IAAA,EAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAM,CAAA;AAAA,EACvE,CAAA;AACA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAM,IAAA,CAAK,YAAY,CAAA;AAAA,IAC3B,UAAA,EAAY,CAAC,IAAA,KAAS,IAAA,CAAK,mBAAmB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,IACtE,WAAA,EAAa,MAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,IACzC,UAAA,EAAY,CAAC,EAAA,KAAO,IAAA,CAAK,CAAA,gBAAA,EAAmB,EAAE,CAAA,KAAA,CAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IACnF,QAAQ,CAAC,KAAA,KAAU,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/C,kBAAkB,CAAC,EAAA,KAAO,IAAA,CAAK,CAAA,gBAAA,EAAmB,EAAE,CAAA,WAAA,CAAa,CAAA;AAAA,IACjE,cAAc,CAAC,EAAA,KAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,EAAE,CAAA,QAAA,CAAU,CAAA;AAAA,IACzD,YAAA,EAAc,CAAC,EAAA,EAAI,IAAA,EAAM,WACvB,IAAA,CAAK,CAAA,eAAA,EAAkB,EAAE,CAAA,QAAA,CAAA,EAAY;AAAA,MACnC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,GAAI,SAAS,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA,EAAI,EAAE,GAAI;AAAC,KAC7C,CAAA;AAAA,IACH,cAAA,EAAgB,CAAC,EAAA,KAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,EAAE,CAAA,UAAA,CAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IAC3F,qBAAA,EAAuB,CAAC,EAAA,KACtB,IAAA,CAAK,sBAAsB,kBAAA,CAAmB,EAAE,CAAC,CAAA,aAAA,CAAe;AAAA,GACpE;AACF;;;ACvGO,SAAS,4BAA4B,CAAA,EAGjC;AACT,EAAA,QAAQ,EAAE,MAAA;AAAQ,IAChB,KAAK,cAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,GAAG,CAAA,CAAE,EAAA,CAAG,QAAG,CAAC,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA;AAAA,IAClC,KAAK,kBAAA;AACH,MAAA,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA;AAAA,IACpC;AACE,MAAA,OAAO,GAAG,CAAA,CAAE,GAAA,CAAI,QAAG,CAAC,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA,CAAA;AAAA;AAEvC;AAYA,eAAsB,kBAAA,CACpB,QACA,SAAA,EAC4C;AAC5C,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI;AACF,IAAA,CAAA,GAAI,MAAM,MAAA,CAAO,qBAAA,CAAsB,SAAS,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB;AACA,EAAA,QAAQ,EAAE,MAAA;AAAQ,IAChB,KAAK,cAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,OAAA,EACE,CAAA,CAAA,EAAI,SAAS,CAAA,mDAAA,EACV,CAAA,CAAE,WAAA,GAAc,CAAA,EAAA,EAAK,CAAA,CAAE,WAAW,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,eAAA,EAAkB,EAAE,OAAO,CAAA;AAAA,OAC5E;AAAA,IACF;AACE,MAAA,OAAO,EAAE,IAAI,KAAA,EAAO,OAAA,EAAS,yBAAyB,SAAS,CAAA,QAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAA,EAAG;AAAA;AAEvF;AAaO,SAAS,yBAAA,CACd,YACA,QAAA,EACK;AACL,EAAA,MAAM,SAAS,IAAI,GAAA,CAAA,CAAK,QAAA,CAAS,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,EAAE,CAAC,CAAA;AAChF,EAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,EAAE,CAAC,CAAA;AACnE;AAGO,SAAS,MAAA,CAAO,IAAA,EAAc,SAAA,EAAmB,IAAA,EAAc,OAAA,EAA0B;AAC9F,EAAA,MAAM,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,SAAS,IAAI,IAAI,CAAA,CAAA;AAC1C,EAAA,OAAO,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,IAAA;AAC1C;AAGO,SAAS,SAAS,GAAA,EAAqB;AAC5C,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA;AACxE,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,GACrC,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,GAC1C,SAAA;AACJ,EAAA,OAAO,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAChC;AAOA,eAAsB,QACpB,MAAA,EACA,KAAA,EACA,UAAA,GAAa,IAAA,EACb,YAAY,GAAA,EACmF;AAC/F,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,IAAI,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AACnC,EAAA,OAAO,IAAI,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,GAAA,KAAQ,QAAA,EAAU;AACxD,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,UAAU,CAAC,CAAA;AAClD,IAAA,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,iBAAiB,GAAA,EAAuB;AACtD,EAAA,MAAM,GAAA,GAAA,CAAO,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,MAAA,CAAO,GAAG,GAAG,WAAA,EAAY;AAC3E,EAAA,OAAO,qEAAA,CAAsE,KAAK,GAAG,CAAA;AACvF;AAcA,eAAsB,eAAe,IAAA,EAOA;AACnC,EAAA,MAAM,EAAE,WAAW,GAAA,EAAK,OAAA,EAAS,UAAU,SAAA,EAAW,MAAA,EAAQ,KAAI,GAAI,IAAA;AAEtE,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,UAAA,CAAW;AAAA,MACjC,GAAA,EAAK,SAAA;AAAA,MACL,GAAA;AAAA,MACA,GAAI,OAAA,GAAU,EAAE,UAAA,EAAY,OAAA,CAAQ,KAAK,UAAA,EAAY,OAAA,CAAQ,GAAA,EAAI,GAAI,EAAC;AAAA;AAAA;AAAA;AAAA,MAItE,GAAI,SAAS,SAAA,GAAY,EAAE,WAAW,QAAA,CAAS,SAAA,KAAc;AAAC,KAC/D,CAAA;AACD,IAAA,QAAA,GAAW,KAAA,CAAM,EAAA;AAAA,EACnB,SAAS,GAAA,EAAK;AAGZ,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAG,CAAA,EAAG,MAAM,GAAA;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,EAAY;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,OAAA,EAAU,SAAS,CAAA,qDAAA,EACd,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OACvD;AAAA,IACF;AACA,IAAA,QAAA,GAAW,KAAA,CAAM,EAAA;AAAA,EACnB;AAEA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,GAAA,CAAI,WAAW,QAAQ,CAAA;AAC/C,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AACpC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,QAAA,IAAY,GAAA,CAAI,WAAW,WAAA,EAAa;AACzD,IAAA,MAAM,MAAA,GAAA,CAAU,GAAA,CAAI,KAAA,IAAS,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA;AACpE,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,MAAA,CAAO,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,KAAA,IAAS,QAAQ,CAAA,CAAE,CAAA;AACzE,IAAA,MAAA,CAAO,CAAA,YAAA,EAAe,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACnC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,IAAA,MAAA,CAAO,sFAAiF,CAAA;AACxF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,aAAa,yBAAA,CAA0B,MAAM,IAAI,gBAAA,CAAiB,QAAQ,GAAG,QAAQ,CAAA;AACzF,EAAA,IAAI,SAAA,eAAwB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACzE,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,wEAAmE,CAAA;AAC3E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,YAAA,CAAa,EAAE,EAAE,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,CAAA,CAAE,EAAA,EAAI,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,CAAQ,eAAA,EAAiB,CAAA;AAGhF,MAAA,IAAI,IAAI,KAAA,EAAO;AACb,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,EAAK,IAAI,KAAK,CAAA;AAC3C,QAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAM,QAAQ,MAAA,CAAO,KAAA,IAAS,EAAC,EAC5B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA,CACnC,IAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA,CAClB,OAAO,OAAO,CAAA;AACjB,UAAA,OAAA;AAAA,YACE,cAAc,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,kBAAA,EAAqB,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,IAC7D,KAAK,MAAA,GAAS,CAAA,EAAA,EAAK,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAAA,WAC5C;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,IAAA,EAAM,OAAA,CAAQ,SAAA,CAAU,kBAAA,EAAoB,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,IACxF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA;AAAA,QACE,CAAA,kBAAA,EAAqB,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAC5F;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,CAAA,UAAA,EAAa,SAAA,CAAU,MAAM,CAAA,UAAA,CAAY,CAAA;AAC/C,EAAA,KAAA,MAAW,CAAA,IAAK,SAAA,EAAW,OAAA,CAAQ,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAC3C,EAAA,OAAO,EAAE,SAAA,EAAU;AACrB","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-
|
|
2
|
-
import { buildWorkspaceToolDefs } from './chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
6070
|
-
|
|
6071
|
-
|
|
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 (
|
|
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
|
|
6192
|
+
contextWindow: window,
|
|
6193
|
+
...window !== null && input.contextWindowSource ? { contextWindowSource: input.contextWindowSource } : {},
|
|
6089
6194
|
usedTokens: used,
|
|
6090
6195
|
totalFidelity,
|
|
6091
|
-
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:
|
|
6338
|
-
|
|
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
|
-
...
|
|
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-
|
|
10387
|
-
//# sourceMappingURL=chunk-
|
|
10564
|
+
//# sourceMappingURL=chunk-XZO4TMAQ.js.map
|
|
10565
|
+
//# sourceMappingURL=chunk-XZO4TMAQ.js.map
|