@skaile/workspaces 4.31.0 → 4.32.1
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 +16 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-XNL4NQBM.js → asset-feeds-TOJQTJYS.js} +4 -4
- package/dist/{asset-feeds-XNL4NQBM.js.map → asset-feeds-TOJQTJYS.js.map} +1 -1
- package/dist/asset-manager/index.js +1 -1
- package/dist/bridge/drivers/claude-sdk.js +4 -4
- 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/opencode.js +3 -3
- package/dist/bridge/drivers/qwen.js +5 -5
- package/dist/bridge/index.js +5 -5
- package/dist/{chunk-D6L7RQGP.js → chunk-223FKFTC.js} +7 -7
- package/dist/{chunk-D6L7RQGP.js.map → chunk-223FKFTC.js.map} +1 -1
- package/dist/{chunk-MX7LCQUQ.js → chunk-34ZVTPDV.js} +4 -4
- package/dist/chunk-34ZVTPDV.js.map +1 -0
- package/dist/{chunk-AVXSY4WO.js → chunk-3DZGPJU5.js} +3 -3
- package/dist/{chunk-AVXSY4WO.js.map → chunk-3DZGPJU5.js.map} +1 -1
- package/dist/{chunk-JV2YHKOY.js → chunk-3GMRVUDA.js} +4 -4
- package/dist/{chunk-JV2YHKOY.js.map → chunk-3GMRVUDA.js.map} +1 -1
- package/dist/{chunk-JXTW3VCT.js → chunk-BU53MUL5.js} +3 -3
- package/dist/{chunk-JXTW3VCT.js.map → chunk-BU53MUL5.js.map} +1 -1
- package/dist/{chunk-XSVWRISC.js → chunk-CYESHAXV.js} +6 -6
- package/dist/{chunk-XSVWRISC.js.map → chunk-CYESHAXV.js.map} +1 -1
- package/dist/{chunk-VYNIZDAD.js → chunk-DMNYWLED.js} +3 -3
- package/dist/{chunk-VYNIZDAD.js.map → chunk-DMNYWLED.js.map} +1 -1
- package/dist/{chunk-NHABMUXY.js → chunk-E2IZD74W.js} +3 -3
- package/dist/{chunk-NHABMUXY.js.map → chunk-E2IZD74W.js.map} +1 -1
- package/dist/{chunk-J3UD57GK.js → chunk-EOX3QH74.js} +271 -30
- package/dist/chunk-EOX3QH74.js.map +1 -0
- package/dist/{chunk-5KJLMR23.js → chunk-G3N2ZCOJ.js} +2 -2
- package/dist/{chunk-5KJLMR23.js.map → chunk-G3N2ZCOJ.js.map} +1 -1
- package/dist/{chunk-2RIM7HAG.js → chunk-IT7ZHRCK.js} +6 -6
- package/dist/{chunk-2RIM7HAG.js.map → chunk-IT7ZHRCK.js.map} +1 -1
- package/dist/{chunk-RTQTWQHW.js → chunk-IXGNQP7Z.js} +3 -3
- package/dist/{chunk-RTQTWQHW.js.map → chunk-IXGNQP7Z.js.map} +1 -1
- package/dist/{chunk-ATRQ2PKM.js → chunk-JYWEWJ46.js} +2 -2
- package/dist/{chunk-ATRQ2PKM.js.map → chunk-JYWEWJ46.js.map} +1 -1
- package/dist/{chunk-CMHRZOHQ.js → chunk-MNA22VPT.js} +4 -4
- package/dist/{chunk-CMHRZOHQ.js.map → chunk-MNA22VPT.js.map} +1 -1
- package/dist/{chunk-WORPEN3X.js → chunk-MVSF6AB4.js} +2 -2
- package/dist/{chunk-WORPEN3X.js.map → chunk-MVSF6AB4.js.map} +1 -1
- package/dist/{chunk-7ZXENJLO.js → chunk-NJVXDRQY.js} +3 -3
- package/dist/{chunk-7ZXENJLO.js.map → chunk-NJVXDRQY.js.map} +1 -1
- package/dist/{chunk-OGPNWRWU.js → chunk-OS4SXZTQ.js} +3 -3
- package/dist/{chunk-OGPNWRWU.js.map → chunk-OS4SXZTQ.js.map} +1 -1
- package/dist/{chunk-A62RPNIZ.js → chunk-TGLCW25T.js} +3 -3
- package/dist/{chunk-A62RPNIZ.js.map → chunk-TGLCW25T.js.map} +1 -1
- package/dist/{chunk-GH3BHLBF.js → chunk-U2I2BRCP.js} +6 -6
- package/dist/{chunk-GH3BHLBF.js.map → chunk-U2I2BRCP.js.map} +1 -1
- package/dist/{chunk-M42SMH7V.js → chunk-UNUQGYCW.js} +3 -3
- package/dist/{chunk-M42SMH7V.js.map → chunk-UNUQGYCW.js.map} +1 -1
- package/dist/{chunk-FF5L6IV3.js → chunk-XVGB3K4B.js} +3 -3
- package/dist/{chunk-FF5L6IV3.js.map → chunk-XVGB3K4B.js.map} +1 -1
- package/dist/{chunk-4UGEZIMA.js → chunk-ZRE4N6ZA.js} +3 -3
- package/dist/{chunk-4UGEZIMA.js.map → chunk-ZRE4N6ZA.js.map} +1 -1
- package/dist/cli/index.js +35 -35
- package/dist/connectors/index.js +7 -7
- package/dist/connectors-shared/index.js +2 -2
- package/dist/{ensure-sources-NEZZ6YY7.js → ensure-sources-UJBLBTXI.js} +4 -4
- package/dist/{ensure-sources-NEZZ6YY7.js.map → ensure-sources-UJBLBTXI.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-XJEFDCMQ.js → helpers-QSRBM6LP.js} +4 -4
- package/dist/{helpers-XJEFDCMQ.js.map → helpers-QSRBM6LP.js.map} +1 -1
- package/dist/{library-publish-N726WYMF.js → library-publish-JTS2PA2P.js} +6 -6
- package/dist/{library-publish-N726WYMF.js.map → library-publish-JTS2PA2P.js.map} +1 -1
- package/dist/{open-library-D6ACC3TX.js → open-library-PIUYBOZI.js} +5 -5
- package/dist/{open-library-D6ACC3TX.js.map → open-library-PIUYBOZI.js.map} +1 -1
- package/dist/{project-NRCGUOM4.js → project-Y2BU3TSB.js} +5 -5
- package/dist/{project-NRCGUOM4.js.map → project-Y2BU3TSB.js.map} +1 -1
- package/dist/runner/index.js +11 -11
- package/dist/runner/src/resource-handler.d.ts +8 -0
- package/dist/runner/src/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/skill-staging.d.ts +39 -1
- package/dist/runner/src/skill-staging.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 +11 -11
- package/dist/sdk/runner.js +11 -11
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/types.js +1 -1
- package/dist/session/index.js +2 -2
- package/dist/{setup-3GHCXHOO.js → setup-VY5L44XZ.js} +10 -10
- package/dist/{setup-3GHCXHOO.js.map → setup-VY5L44XZ.js.map} +1 -1
- package/dist/{source-OAIEGNQB.js → source-CKD4YPK4.js} +6 -6
- package/dist/{source-OAIEGNQB.js.map → source-CKD4YPK4.js.map} +1 -1
- package/dist/{source-manifest-publish-DQTXHT4V.js → source-manifest-publish-KTSEBNHY.js} +7 -7
- package/dist/{source-manifest-publish-DQTXHT4V.js.map → source-manifest-publish-KTSEBNHY.js.map} +1 -1
- package/dist/tui/index.js +11 -11
- package/dist/types/index.js +1 -1
- package/dist/types/src/events.d.ts +53 -1
- 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/version.d.ts +11 -1
- 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-J3UD57GK.js.map +0 -1
- package/dist/chunk-MX7LCQUQ.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../connectors/src/connect-error-kind.ts"],"names":[],"mappings":";;;AAuBO,IAAM,2BAAA,GAA8B;AAYpC,SAAS,yBAAyB,GAAA,EAA8C;AACrF,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,+BAA+B,GAAA,CAAA,EAAM;AACpF,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAS,IAAgC,2BAA2B,CAAA;AAC1E,EAAA,OAAQ,qBAAA,CAA6C,QAAA,CAAS,KAAK,CAAA,GAC9D,KAAA,GACD,MAAA;AACN;AAOO,SAAS,oBAAA,CAAwB,KAAQ,IAAA,EAA6B;AAC3E,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,+BAA+B,GAAA,CAAA,EAAM;AACpF,IAAA,IAAI;AACF,MAAC,GAAA,CAAgC,2BAA2B,CAAA,GAAI,IAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAMO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAChD,CAAU,2BAA2B;AAAA,EACrC,WAAA,CAAY,SAAiB,IAAA,EAA0B;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,2BAA2B,CAAA,GAAI,IAAA;AAAA,EACtC;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../connectors/src/connect-error-kind.ts"],"names":[],"mappings":";;;AAuBO,IAAM,2BAAA,GAA8B;AAYpC,SAAS,yBAAyB,GAAA,EAA8C;AACrF,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,+BAA+B,GAAA,CAAA,EAAM;AACpF,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAS,IAAgC,2BAA2B,CAAA;AAC1E,EAAA,OAAQ,qBAAA,CAA6C,QAAA,CAAS,KAAK,CAAA,GAC9D,KAAA,GACD,MAAA;AACN;AAOO,SAAS,oBAAA,CAAwB,KAAQ,IAAA,EAA6B;AAC3E,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,+BAA+B,GAAA,CAAA,EAAM;AACpF,IAAA,IAAI;AACF,MAAC,GAAA,CAAgC,2BAA2B,CAAA,GAAI,IAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAMO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAChD,CAAU,2BAA2B;AAAA,EACrC,WAAA,CAAY,SAAiB,IAAA,EAA0B;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,2BAA2B,CAAA,GAAI,IAAA;AAAA,EACtC;AACF","file":"chunk-DMNYWLED.js","sourcesContent":["/**\n * The driver-side contract for classifying a connect failure: how a thrower\n * says which {@link ConnectorErrorKind} its error is. Read by the manager's\n * `classifyConnectError` (`classify-connect-error.ts`) into the `errorKind`\n * field of `connector_status` error events.\n *\n * Depends on nothing but `types`, so the `connectors-shared` subpath can\n * re-export it to out-of-tree drivers.\n *\n * @docLink packages/connectors/concepts#connector-manager\n */\n\nimport { CONNECTOR_ERROR_KINDS, type ConnectorErrorKind } from \"@skaile/workspaces/types\";\n\n/**\n * The property a thrown error carries its kind on.\n *\n * Namespaced because it is read off any thrown object: a bare `errorKind` is\n * a name a library's own error may already use, and a value that happened to\n * read `\"config\"` would silently misroute the failure. A plain string key\n * rather than a symbol, so a driver with no import from this package can still\n * set it: `throw Object.assign(new Error(msg), { skaileConnectErrorKind: \"config\" })`.\n */\nexport const CONNECT_ERROR_KIND_PROPERTY = \"skaileConnectErrorKind\";\n\n/**\n * The shape of an error that declares its kind. For classes that must spell the\n * key out instead of computing it (see the git driver's `TokenMediatorError`):\n * `implements` keeps the literal tied to {@link CONNECT_ERROR_KIND_PROPERTY}.\n */\nexport type DeclaresConnectErrorKind = {\n readonly [CONNECT_ERROR_KIND_PROPERTY]: ConnectorErrorKind;\n};\n\n/** The kind `err` declares for itself, or `undefined` when it declares none (or an unknown one). */\nexport function declaredConnectErrorKind(err: unknown): ConnectorErrorKind | undefined {\n if (err === null || typeof err !== \"object\" || !(CONNECT_ERROR_KIND_PROPERTY in err)) {\n return undefined;\n }\n const value = (err as Record<string, unknown>)[CONNECT_ERROR_KIND_PROPERTY];\n return (CONNECTOR_ERROR_KINDS as readonly unknown[]).includes(value)\n ? (value as ConnectorErrorKind)\n : undefined;\n}\n\n/**\n * Stamp `kind` onto `err` unless it already declares one, and return it for\n * rethrowing. For throw sites that know what a failure means but throw an\n * error they did not construct (a failed `git` child, say).\n */\nexport function withConnectErrorKind<T>(err: T, kind: ConnectorErrorKind): T {\n if (err !== null && typeof err === \"object\" && !(CONNECT_ERROR_KIND_PROPERTY in err)) {\n try {\n (err as Record<string, unknown>)[CONNECT_ERROR_KIND_PROPERTY] = kind;\n } catch {\n // Frozen or sealed: unclassified beats replacing the real error with a TypeError.\n }\n }\n return err;\n}\n\n/**\n * An `Error` carrying an explicit {@link ConnectorErrorKind}, for throw sites\n * that build their own error.\n */\nexport class ClassifiedConnectError extends Error {\n readonly [CONNECT_ERROR_KIND_PROPERTY]: ConnectorErrorKind;\n constructor(message: string, kind: ConnectorErrorKind) {\n super(message);\n this.name = \"ClassifiedConnectError\";\n this[CONNECT_ERROR_KIND_PROPERTY] = kind;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logErr } from './chunk-
|
|
1
|
+
import { logErr } from './chunk-IXGNQP7Z.js';
|
|
2
2
|
import { flowKindProvider } from './chunk-JULFGNQN.js';
|
|
3
3
|
import { knowledgeKindProvider } from './chunk-BR2IXOWX.js';
|
|
4
4
|
import { createDefaultRegistry } from './chunk-HGPSZXZP.js';
|
|
@@ -103,5 +103,5 @@ async function openLibraryManager() {
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
export { LocalCatalogDisabledError, createFullRegistry, openCatalogSource, openLibrary, openLibraryManager, resolveCatalogSource };
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
106
|
+
//# sourceMappingURL=chunk-E2IZD74W.js.map
|
|
107
|
+
//# sourceMappingURL=chunk-E2IZD74W.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/src/open-registry.ts","../cli/src/open-library.ts"],"names":["source"],"mappings":"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","file":"chunk-NHABMUXY.js","sourcesContent":["/**\n * open-registry.ts — shared helper to create a full AssetKindRegistry.\n *\n * Bootstraps the registry with all built-in providers (9 core + preset)\n * from @skaile/discovery, plus the extension kind providers (flow from\n * @skaile/workspaces/factory-assets/connectors/flow/engine, knowledge from @skaile/library).\n *\n * This is the single registration point for the CLI. All code paths\n * that need a registry (source sync, lib-status, etc.) should use this.\n */\n\nimport type { AssetKindRegistry } from \"@skaile/workspaces/discovery\";\nimport { createDefaultRegistry } from \"@skaile/workspaces/discovery\";\nimport { flowKindProvider } from \"@skaile/workspaces/factory-assets/connectors/flow/engine\";\nimport { knowledgeKindProvider } from \"@skaile/workspaces/library\";\n\n/**\n * Create a fully-configured AssetKindRegistry with all known providers.\n *\n * Registers:\n * - 9 core kinds (skill, agent, connector, mount, mcp-server, contract, prompt, persona, ruleset)\n * - preset (composition entity)\n * - flow (extension, from @skaile/workspaces/factory-assets/connectors/flow/engine)\n * - knowledge (extension, from @skaile/library)\n *\n * @returns An unfrozen registry (auto-freezes on first read)\n */\nexport function createFullRegistry(): AssetKindRegistry {\n const registry = createDefaultRegistry();\n registry.register(flowKindProvider);\n registry.register(knowledgeKindProvider);\n return registry;\n}\n","/**\n * open-library.ts — shared helpers to open the LocalIndex and the configured\n * Catalog source.\n *\n * Lazy-loads the `@skaile/workspaces/library` subpath and returns the\n * LocalIndex instance (backed by `@libsql/client`; runs on Node and Bun).\n * The catalog-source helper reads\n * `~/.skaile/config.yaml` (and project-level overlay if `projectDir` is given)\n * to decide between {@link RemoteCatalogSource} (default — points at\n * `https://skaile.store`) and a {@link LocalCatalogSource} bound to the most\n * recent local library registered via `skaile source add`.\n */\n\nimport { logErr } from \"./helpers.ts\";\nimport { createFullRegistry } from \"./open-registry.ts\";\n\n/** Thrown by {@link openCatalogSource} when `catalog.url` is the `local` sentinel. */\nexport class LocalCatalogDisabledError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LocalCatalogDisabledError\";\n }\n}\n\n/**\n * Open the LocalIndex with the full kind registry. Exits with code 1\n * if the library directory cannot be created.\n *\n * @returns A `LocalIndex` instance ready for use.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openLibrary() {\n try {\n const { LocalIndex } = await import(\"@skaile/workspaces/library\");\n return new LocalIndex({ kindRegistry: createFullRegistry() });\n } catch (err) {\n logErr(`Could not open LocalIndex: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Resolve the configured **remote** Catalog source for the CLI.\n *\n * Reads `~/.skaile/config.yaml` (plus the optional project-level overlay) and\n * returns a {@link RemoteCatalogSource} pointing at `catalog.url` (default:\n * `https://skaile.store`). The `cache_ttl: 0` config flag flips the source\n * into air-gapped mode: network reads are disabled, only `skaile update`\n * performs refreshes.\n *\n * **Local-mode rejection.** If the resolved config has `catalog.url: local`\n * this helper throws — callers wanting the dispatched local-or-remote source\n * must use {@link resolveCatalogSource}. Remote-only consumers like\n * `skaile update --catalog-only` rely on this strict behaviour.\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A configured {@link RemoteCatalogSource}.\n * @throws When `catalog.url` is the `local` sentinel.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<\n | import(\"@skaile/workspaces/library\").RemoteCatalogSource\n | import(\"@skaile/workspaces/library\").RestCatalogSource\n> {\n const { resolveConfig, RemoteCatalogSource, RestCatalogSource, isLocalCatalogUrl } = await import(\n \"@skaile/workspaces/library\"\n );\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n if (isLocalCatalogUrl(baseUrl)) {\n throw new LocalCatalogDisabledError(\n \"catalog.url is set to 'local' — remote catalog is disabled. \" +\n \"Use `skaile source add <path>` + `skaile source sync` for local sources, \" +\n \"or set `catalog.url: https://skaile.store` in ~/.skaile/config.yaml.\",\n );\n }\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n if (cfg.catalog.framing === \"rest\") {\n return new RestCatalogSource({ baseUrl, cacheTtlMs });\n }\n return new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n}\n\n/**\n * Resolved catalog source plus a close handle for releasing any underlying\n * resources (e.g. the `LocalIndex` SQLite connection in local mode).\n *\n * Callers MUST invoke `close()` when done — typically in a `finally` block.\n * For remote-mode sources `close()` is a no-op, but the contract is uniform\n * so consumers don't have to branch.\n *\n * @docLink cli/dev-guide#open-library\n */\nexport interface ResolvedCatalogSource {\n /** The {@link ICatalogSource} ready for use. */\n source: import(\"@skaile/workspaces/library\").ICatalogSource;\n /** Release any underlying resources (SQLite handle in local mode). */\n close(): void;\n}\n\n/**\n * Resolve the configured Catalog source — local or remote — based on\n * `~/.skaile/config.yaml`.\n *\n * Dispatch:\n * - `catalog.url: local` → opens {@link LocalIndex}, picks the most recently\n * registered local library whose `path` still exists on disk, and returns a\n * {@link LocalCatalogSource} bound to that library. Throws if no usable\n * local library is registered.\n * - any URL → returns {@link RemoteCatalogSource} (same as\n * {@link openCatalogSource}).\n *\n * The returned `close()` releases the underlying `LocalIndex` SQLite handle\n * in local mode (no-op in remote mode). Callers MUST invoke it — typically in\n * a `finally` block — to satisfy `library/CLAUDE.md` § \"Notes for Consumers\".\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A `ResolvedCatalogSource` carrying the source and a close handle.\n * @throws When `local` is configured but no usable local library is registered.\n * @docLink cli/dev-guide#open-library\n */\nexport async function resolveCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<ResolvedCatalogSource> {\n const {\n resolveConfig,\n RemoteCatalogSource,\n RestCatalogSource,\n LocalCatalogSource,\n isLocalCatalogUrl,\n } = await import(\"@skaile/workspaces/library\");\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n\n if (isLocalCatalogUrl(baseUrl)) {\n const fs = await import(\"node:fs\");\n const library = await openLibrary();\n try {\n const sources = await library.listSources();\n type LibraryRow = (typeof sources)[number];\n // Type-narrow: `path` is required for local libraries after the filter.\n const usable = sources\n .filter(\n (s): s is LibraryRow & { path: string } =>\n s.backend === \"local\" && typeof s.path === \"string\" && s.path.length > 0,\n )\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n if (usable.length === 0) {\n throw new Error(\n \"catalog.url is set to 'local' but no local library is registered. \" +\n \"Run `skaile source add <path>` first, then `skaile source sync`.\",\n );\n }\n\n // Prefer the most recently added library whose path still exists.\n const present = usable.find((s) => fs.existsSync(s.path));\n if (!present) {\n const head = usable[0];\n throw new Error(\n `catalog.url is set to 'local' but every registered local library has a missing path on disk. ` +\n `Most recent: ${head.path} (library ${head.id}). ` +\n `Re-register with \\`skaile source add <existing-path>\\` or run \\`skaile source list\\` to inspect.`,\n );\n }\n\n const source = new LocalCatalogSource(\n library,\n present.id,\n present.path,\n createFullRegistry(),\n );\n return { source, close: () => library.close() };\n } catch (err) {\n // Release the handle on any failure during dispatch — otherwise the\n // SQLite WAL state leaks for the lifetime of the process.\n library.close();\n throw err;\n }\n }\n\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n const source =\n cfg.catalog.framing === \"rest\"\n ? new RestCatalogSource({ baseUrl, cacheTtlMs })\n : new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n return { source, close: () => {} };\n}\n\n/**\n * Open the LibraryManager bound to the active LocalIndex.\n * Caller owns lifetime — must call `close()` (returned helper closes the\n * underlying LocalIndex).\n *\n * @docLink cli/dev-guide#open-library\n */\nexport async function openLibraryManager(): Promise<{\n manager: import(\"@skaile/workspaces/library\").LibraryManager;\n library: import(\"@skaile/workspaces/library\").LocalIndex;\n close: () => void;\n}> {\n const { LibraryManager } = await import(\"@skaile/workspaces/library\");\n const library = await openLibrary();\n const manager = new LibraryManager(library);\n return { manager, library, close: () => library.close() };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../cli/src/open-registry.ts","../cli/src/open-library.ts"],"names":["source"],"mappings":"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","file":"chunk-E2IZD74W.js","sourcesContent":["/**\n * open-registry.ts — shared helper to create a full AssetKindRegistry.\n *\n * Bootstraps the registry with all built-in providers (9 core + preset)\n * from @skaile/discovery, plus the extension kind providers (flow from\n * @skaile/workspaces/factory-assets/connectors/flow/engine, knowledge from @skaile/library).\n *\n * This is the single registration point for the CLI. All code paths\n * that need a registry (source sync, lib-status, etc.) should use this.\n */\n\nimport type { AssetKindRegistry } from \"@skaile/workspaces/discovery\";\nimport { createDefaultRegistry } from \"@skaile/workspaces/discovery\";\nimport { flowKindProvider } from \"@skaile/workspaces/factory-assets/connectors/flow/engine\";\nimport { knowledgeKindProvider } from \"@skaile/workspaces/library\";\n\n/**\n * Create a fully-configured AssetKindRegistry with all known providers.\n *\n * Registers:\n * - 9 core kinds (skill, agent, connector, mount, mcp-server, contract, prompt, persona, ruleset)\n * - preset (composition entity)\n * - flow (extension, from @skaile/workspaces/factory-assets/connectors/flow/engine)\n * - knowledge (extension, from @skaile/library)\n *\n * @returns An unfrozen registry (auto-freezes on first read)\n */\nexport function createFullRegistry(): AssetKindRegistry {\n const registry = createDefaultRegistry();\n registry.register(flowKindProvider);\n registry.register(knowledgeKindProvider);\n return registry;\n}\n","/**\n * open-library.ts — shared helpers to open the LocalIndex and the configured\n * Catalog source.\n *\n * Lazy-loads the `@skaile/workspaces/library` subpath and returns the\n * LocalIndex instance (backed by `@libsql/client`; runs on Node and Bun).\n * The catalog-source helper reads\n * `~/.skaile/config.yaml` (and project-level overlay if `projectDir` is given)\n * to decide between {@link RemoteCatalogSource} (default — points at\n * `https://skaile.store`) and a {@link LocalCatalogSource} bound to the most\n * recent local library registered via `skaile source add`.\n */\n\nimport { logErr } from \"./helpers.ts\";\nimport { createFullRegistry } from \"./open-registry.ts\";\n\n/** Thrown by {@link openCatalogSource} when `catalog.url` is the `local` sentinel. */\nexport class LocalCatalogDisabledError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LocalCatalogDisabledError\";\n }\n}\n\n/**\n * Open the LocalIndex with the full kind registry. Exits with code 1\n * if the library directory cannot be created.\n *\n * @returns A `LocalIndex` instance ready for use.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openLibrary() {\n try {\n const { LocalIndex } = await import(\"@skaile/workspaces/library\");\n return new LocalIndex({ kindRegistry: createFullRegistry() });\n } catch (err) {\n logErr(`Could not open LocalIndex: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Resolve the configured **remote** Catalog source for the CLI.\n *\n * Reads `~/.skaile/config.yaml` (plus the optional project-level overlay) and\n * returns a {@link RemoteCatalogSource} pointing at `catalog.url` (default:\n * `https://skaile.store`). The `cache_ttl: 0` config flag flips the source\n * into air-gapped mode: network reads are disabled, only `skaile update`\n * performs refreshes.\n *\n * **Local-mode rejection.** If the resolved config has `catalog.url: local`\n * this helper throws — callers wanting the dispatched local-or-remote source\n * must use {@link resolveCatalogSource}. Remote-only consumers like\n * `skaile update --catalog-only` rely on this strict behaviour.\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A configured {@link RemoteCatalogSource}.\n * @throws When `catalog.url` is the `local` sentinel.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<\n | import(\"@skaile/workspaces/library\").RemoteCatalogSource\n | import(\"@skaile/workspaces/library\").RestCatalogSource\n> {\n const { resolveConfig, RemoteCatalogSource, RestCatalogSource, isLocalCatalogUrl } = await import(\n \"@skaile/workspaces/library\"\n );\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n if (isLocalCatalogUrl(baseUrl)) {\n throw new LocalCatalogDisabledError(\n \"catalog.url is set to 'local' — remote catalog is disabled. \" +\n \"Use `skaile source add <path>` + `skaile source sync` for local sources, \" +\n \"or set `catalog.url: https://skaile.store` in ~/.skaile/config.yaml.\",\n );\n }\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n if (cfg.catalog.framing === \"rest\") {\n return new RestCatalogSource({ baseUrl, cacheTtlMs });\n }\n return new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n}\n\n/**\n * Resolved catalog source plus a close handle for releasing any underlying\n * resources (e.g. the `LocalIndex` SQLite connection in local mode).\n *\n * Callers MUST invoke `close()` when done — typically in a `finally` block.\n * For remote-mode sources `close()` is a no-op, but the contract is uniform\n * so consumers don't have to branch.\n *\n * @docLink cli/dev-guide#open-library\n */\nexport interface ResolvedCatalogSource {\n /** The {@link ICatalogSource} ready for use. */\n source: import(\"@skaile/workspaces/library\").ICatalogSource;\n /** Release any underlying resources (SQLite handle in local mode). */\n close(): void;\n}\n\n/**\n * Resolve the configured Catalog source — local or remote — based on\n * `~/.skaile/config.yaml`.\n *\n * Dispatch:\n * - `catalog.url: local` → opens {@link LocalIndex}, picks the most recently\n * registered local library whose `path` still exists on disk, and returns a\n * {@link LocalCatalogSource} bound to that library. Throws if no usable\n * local library is registered.\n * - any URL → returns {@link RemoteCatalogSource} (same as\n * {@link openCatalogSource}).\n *\n * The returned `close()` releases the underlying `LocalIndex` SQLite handle\n * in local mode (no-op in remote mode). Callers MUST invoke it — typically in\n * a `finally` block — to satisfy `library/CLAUDE.md` § \"Notes for Consumers\".\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A `ResolvedCatalogSource` carrying the source and a close handle.\n * @throws When `local` is configured but no usable local library is registered.\n * @docLink cli/dev-guide#open-library\n */\nexport async function resolveCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<ResolvedCatalogSource> {\n const {\n resolveConfig,\n RemoteCatalogSource,\n RestCatalogSource,\n LocalCatalogSource,\n isLocalCatalogUrl,\n } = await import(\"@skaile/workspaces/library\");\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n\n if (isLocalCatalogUrl(baseUrl)) {\n const fs = await import(\"node:fs\");\n const library = await openLibrary();\n try {\n const sources = await library.listSources();\n type LibraryRow = (typeof sources)[number];\n // Type-narrow: `path` is required for local libraries after the filter.\n const usable = sources\n .filter(\n (s): s is LibraryRow & { path: string } =>\n s.backend === \"local\" && typeof s.path === \"string\" && s.path.length > 0,\n )\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n if (usable.length === 0) {\n throw new Error(\n \"catalog.url is set to 'local' but no local library is registered. \" +\n \"Run `skaile source add <path>` first, then `skaile source sync`.\",\n );\n }\n\n // Prefer the most recently added library whose path still exists.\n const present = usable.find((s) => fs.existsSync(s.path));\n if (!present) {\n const head = usable[0];\n throw new Error(\n `catalog.url is set to 'local' but every registered local library has a missing path on disk. ` +\n `Most recent: ${head.path} (library ${head.id}). ` +\n `Re-register with \\`skaile source add <existing-path>\\` or run \\`skaile source list\\` to inspect.`,\n );\n }\n\n const source = new LocalCatalogSource(\n library,\n present.id,\n present.path,\n createFullRegistry(),\n );\n return { source, close: () => library.close() };\n } catch (err) {\n // Release the handle on any failure during dispatch — otherwise the\n // SQLite WAL state leaks for the lifetime of the process.\n library.close();\n throw err;\n }\n }\n\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n const source =\n cfg.catalog.framing === \"rest\"\n ? new RestCatalogSource({ baseUrl, cacheTtlMs })\n : new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n return { source, close: () => {} };\n}\n\n/**\n * Open the LibraryManager bound to the active LocalIndex.\n * Caller owns lifetime — must call `close()` (returned helper closes the\n * underlying LocalIndex).\n *\n * @docLink cli/dev-guide#open-library\n */\nexport async function openLibraryManager(): Promise<{\n manager: import(\"@skaile/workspaces/library\").LibraryManager;\n library: import(\"@skaile/workspaces/library\").LocalIndex;\n close: () => void;\n}> {\n const { LibraryManager } = await import(\"@skaile/workspaces/library\");\n const library = await openLibrary();\n const manager = new LibraryManager(library);\n return { manager, library, close: () => library.close() };\n}\n"]}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { WorkspacePlugin } from './chunk-
|
|
2
|
-
import { buildWorkspaceToolDefs } from './chunk-
|
|
1
|
+
import { WorkspacePlugin } from './chunk-JYWEWJ46.js';
|
|
2
|
+
import { buildWorkspaceToolDefs } from './chunk-BU53MUL5.js';
|
|
3
3
|
import { findAiAssetsRoot } from './chunk-7IH3RKKK.js';
|
|
4
4
|
import { WebSocketServerTransport } from './chunk-5LKOAX7I.js';
|
|
5
5
|
import { assembleSystemPrompt, buildCapabilitiesPromptSection } from './chunk-W3UDISS2.js';
|
|
6
6
|
import { prepareNativePolicy, codexInstanceEnvironment, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult } from './chunk-HCYS7GFP.js';
|
|
7
|
-
import { resolveFlowPath } from './chunk-
|
|
7
|
+
import { resolveFlowPath } from './chunk-OS4SXZTQ.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, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, driveOrchestratorTurn, buildSdkFlowTools } from './chunk-
|
|
10
|
-
import { loadYamlConnectorDeclarations, withMaterializedConnectorDeclarations, SecretProviderChain, ConnectorStartupError, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-2JANXYTJ.js';
|
|
11
|
-
import { EventNormalizer } from './chunk-
|
|
9
|
+
import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, driveOrchestratorTurn, buildSdkFlowTools } from './chunk-223FKFTC.js';
|
|
10
|
+
import { loadYamlConnectorDeclarations, withMaterializedConnectorDeclarations, SecretProviderChain, ConnectorStartupError, EnvSecretProvider, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-2JANXYTJ.js';
|
|
11
|
+
import { EventNormalizer } from './chunk-MNA22VPT.js';
|
|
12
12
|
import { probeResumeTranscript, transcriptStoreForRuntime } from './chunk-LX3FKVLL.js';
|
|
13
13
|
import { scopeReconfigureModel } from './chunk-EINLFFP6.js';
|
|
14
14
|
import { CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
|
|
15
|
-
import { dispatchCapability } from './chunk-
|
|
15
|
+
import { dispatchCapability } from './chunk-XVGB3K4B.js';
|
|
16
16
|
import { classifyClaudeSdkError } from './chunk-XBSQ4KMC.js';
|
|
17
17
|
import { agentExecRequested } from './chunk-YROR332M.js';
|
|
18
|
-
import { toAgentEffort, createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv, AI_PROVIDER_PRESETS, AgentDriver } from './chunk-
|
|
18
|
+
import { toAgentEffort, createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv, AI_PROVIDER_PRESETS, AgentDriver } from './chunk-MVSF6AB4.js';
|
|
19
19
|
import { loadFlow } from './chunk-JULFGNQN.js';
|
|
20
20
|
import { parseFlowDefinition } from './chunk-DIQDYNXZ.js';
|
|
21
21
|
import { renderStimulusPrompt } from './chunk-K3IBZ2UZ.js';
|
|
22
|
-
import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-
|
|
22
|
+
import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-34ZVTPDV.js';
|
|
23
23
|
import { resolveSettings, loadProviderRegistry } from './chunk-WPISSDEI.js';
|
|
24
24
|
import { resolveRuntimeAssets } from './chunk-5RHPNNWP.js';
|
|
25
25
|
import { resolveDriverPaths } from './chunk-K5GBV4SA.js';
|
|
26
|
-
import { resolveSkWorkspaceConfig, resolveAgentDir, loadMcpServerDeclarations, COMPACTION_DEFAULTS, resolveCompactionThresholdPercent, validateAssetRecipeAttr, deriveSingleMaterializedMcpDeclaration, stageMaterializedSkills, readSkillAllowList, isStagedSkillMarkerFor, unstageSkill } from './chunk-DF7C3KZK.js';
|
|
26
|
+
import { resolveSkWorkspaceConfig, resolveAgentDir, loadMcpServerDeclarations, COMPACTION_DEFAULTS, resolveCompactionThresholdPercent, validateAssetRecipeAttr, deriveSingleMaterializedMcpDeclaration, stageMaterializedSkills, readSkillAllowList, isStagedSkillMarkerFor, unstageSkill, STAGED_SKILL_MARKER } from './chunk-DF7C3KZK.js';
|
|
27
27
|
import { withFsDeadline, FsDeadlineError, fsDeadlineMs, parseFrontmatter, tryWithFsDeadline } from './chunk-2FBPAR2V.js';
|
|
28
28
|
import { parseAssetRef } from './chunk-GEEW6SY2.js';
|
|
29
29
|
import { resolveLogStoreConfig, createLogStoreFromConfig, OnLogBridgeSink, WsLogSink, resolveLogsRetention, enforceLogsRetention } from './chunk-JMKB7IB4.js';
|
|
@@ -36,7 +36,7 @@ import { Marked } from 'marked';
|
|
|
36
36
|
import { markedTerminal } from 'marked-terminal';
|
|
37
37
|
import fs4, { readFile, readdir, lstat, stat, rm, unlink, mkdir, writeFile, realpath, rename, open, readlink, mkdtemp } from 'fs/promises';
|
|
38
38
|
import { createHash, randomBytes, timingSafeEqual, randomUUID } from 'crypto';
|
|
39
|
-
import { unlinkSync, readFileSync, existsSync, lstatSync, realpathSync, mkdirSync, writeFileSync, watch, chmodSync, accessSync
|
|
39
|
+
import { constants, unlinkSync, readFileSync, existsSync, lstatSync, realpathSync, mkdirSync, writeFileSync, watch, chmodSync, accessSync } from 'fs';
|
|
40
40
|
import { homedir } from 'os';
|
|
41
41
|
import * as z7 from 'zod';
|
|
42
42
|
import { z } from 'zod';
|
|
@@ -3666,6 +3666,74 @@ var MOUNT_LIST_MAX_DEPTH = 32;
|
|
|
3666
3666
|
var MOUNT_LIST_MAX_ENTRIES = 1e4;
|
|
3667
3667
|
var MOUNT_TREE_OP_DEADLINE_FACTOR = 4;
|
|
3668
3668
|
var MOUNT_READ_DEADLINE_FACTOR = 4;
|
|
3669
|
+
var MOUNT_READ_MAX_CHUNK_BYTES = 8 * 1024 * 1024;
|
|
3670
|
+
function parseReadRange(options) {
|
|
3671
|
+
const offset = options?.offset;
|
|
3672
|
+
const length = options?.length;
|
|
3673
|
+
if (offset === void 0 && length === void 0) return null;
|
|
3674
|
+
for (const [name, value] of [
|
|
3675
|
+
["offset", offset],
|
|
3676
|
+
["length", length]
|
|
3677
|
+
]) {
|
|
3678
|
+
if (value !== void 0 && !(Number.isSafeInteger(value) && value >= 0)) {
|
|
3679
|
+
throw new ResourceOperationError(
|
|
3680
|
+
`Invalid read range: ${name} must be a non-negative integer`,
|
|
3681
|
+
"invalid_range"
|
|
3682
|
+
);
|
|
3683
|
+
}
|
|
3684
|
+
}
|
|
3685
|
+
return {
|
|
3686
|
+
offset: offset ?? 0,
|
|
3687
|
+
length: Math.min(length ?? MOUNT_READ_MAX_CHUNK_BYTES, MOUNT_READ_MAX_CHUNK_BYTES)
|
|
3688
|
+
};
|
|
3689
|
+
}
|
|
3690
|
+
async function readMountRange(targetPath, range, authoritativeSize) {
|
|
3691
|
+
const authSize = authoritativeSize ? await authoritativeSize() : null;
|
|
3692
|
+
const opening = open(targetPath, "r");
|
|
3693
|
+
let fh;
|
|
3694
|
+
try {
|
|
3695
|
+
fh = await withFsDeadline(`open ${targetPath}`, () => opening);
|
|
3696
|
+
} catch (err) {
|
|
3697
|
+
void opening.then((h) => h.close()).catch(() => {
|
|
3698
|
+
});
|
|
3699
|
+
throw err;
|
|
3700
|
+
}
|
|
3701
|
+
try {
|
|
3702
|
+
const st = await withFsDeadline(`fstat ${targetPath}`, () => fh.stat());
|
|
3703
|
+
if (!st.isFile()) {
|
|
3704
|
+
throw new Error(`Not a file: ${targetPath}`);
|
|
3705
|
+
}
|
|
3706
|
+
let size = st.size;
|
|
3707
|
+
if (authSize !== null && authSize >= 0 && authSize < size) size = authSize;
|
|
3708
|
+
const want = Math.max(0, Math.min(range.length, size - range.offset));
|
|
3709
|
+
const buf = Buffer.alloc(want);
|
|
3710
|
+
let filled = 0;
|
|
3711
|
+
await withFsDeadline(
|
|
3712
|
+
`read ${targetPath} @${range.offset}+${want}`,
|
|
3713
|
+
async () => {
|
|
3714
|
+
while (filled < want) {
|
|
3715
|
+
const { bytesRead } = await fh.read(buf, filled, want - filled, range.offset + filled);
|
|
3716
|
+
if (bytesRead === 0) break;
|
|
3717
|
+
filled += bytesRead;
|
|
3718
|
+
}
|
|
3719
|
+
},
|
|
3720
|
+
fsDeadlineMs() * MOUNT_READ_DEADLINE_FACTOR
|
|
3721
|
+
);
|
|
3722
|
+
const modifiedAt = isoTime(st.mtime);
|
|
3723
|
+
return {
|
|
3724
|
+
bytes: buf.subarray(0, filled),
|
|
3725
|
+
range: {
|
|
3726
|
+
offset: range.offset,
|
|
3727
|
+
length: filled,
|
|
3728
|
+
size,
|
|
3729
|
+
...modifiedAt ? { modifiedAt } : {}
|
|
3730
|
+
}
|
|
3731
|
+
};
|
|
3732
|
+
} finally {
|
|
3733
|
+
void fh.close().catch(() => {
|
|
3734
|
+
});
|
|
3735
|
+
}
|
|
3736
|
+
}
|
|
3669
3737
|
var MOUNT_STAT_MAX_ENTRIES = 5e4;
|
|
3670
3738
|
var MOUNT_STAT_BUDGET_MS = 1e4;
|
|
3671
3739
|
var MOUNT_STAT_CONCURRENCY = 16;
|
|
@@ -3831,6 +3899,22 @@ async function handleMountResourceRequest(command, manager, emit) {
|
|
|
3831
3899
|
}
|
|
3832
3900
|
case "read": {
|
|
3833
3901
|
const contentType = getMimeType(basename(targetPath));
|
|
3902
|
+
const readRange = parseReadRange(options);
|
|
3903
|
+
if (readRange) {
|
|
3904
|
+
const sizeFn2 = getAuthoritativeSize(entry.handle.state);
|
|
3905
|
+
const chunk = await readMountRange(
|
|
3906
|
+
targetPath,
|
|
3907
|
+
readRange,
|
|
3908
|
+
sizeFn2 ? () => sizeFn2(reqPath ?? "") : void 0
|
|
3909
|
+
);
|
|
3910
|
+
data = {
|
|
3911
|
+
data: chunk.bytes.toString("base64"),
|
|
3912
|
+
contentType,
|
|
3913
|
+
encoding: "binary",
|
|
3914
|
+
range: chunk.range
|
|
3915
|
+
};
|
|
3916
|
+
break;
|
|
3917
|
+
}
|
|
3834
3918
|
const buf = await withFsDeadline(
|
|
3835
3919
|
`readFile ${targetPath}`,
|
|
3836
3920
|
() => readFile(targetPath),
|
|
@@ -4960,13 +5044,88 @@ async function isStillOurs(record2, path6, timeoutMs) {
|
|
|
4960
5044
|
const st = await tryWithFsDeadline(`lstat ${path6}`, () => lstat(path6), null, timeoutMs);
|
|
4961
5045
|
return st?.isDirectory() === true && st.dev === record2.dev && st.ino === record2.ino && st.birthtimeMs === record2.birthtimeMs;
|
|
4962
5046
|
}
|
|
5047
|
+
async function recordLoadedSkillDigests(loaded, projectDir, skillsDir, names, opts) {
|
|
5048
|
+
for (const name of names) {
|
|
5049
|
+
if (opts.driverUp && opts.previouslyStaged.has(name)) continue;
|
|
5050
|
+
const path6 = join(projectDir, skillsDir, name);
|
|
5051
|
+
loaded.set(name, { path: path6, digest: await stagedSkillDigest(path6) });
|
|
5052
|
+
}
|
|
5053
|
+
}
|
|
5054
|
+
var DIGEST_DEADLINE_FACTOR = 4;
|
|
5055
|
+
var DIGEST_MAX_BYTES = 64 * 1024 * 1024;
|
|
5056
|
+
var DIGEST_CHUNK_BYTES = 64 * 1024;
|
|
5057
|
+
var DIGEST_OPEN_FLAGS = constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK;
|
|
5058
|
+
async function stagedSkillDigest(dir, timeoutMs) {
|
|
5059
|
+
return tryWithFsDeadline(
|
|
5060
|
+
`digest ${dir}`,
|
|
5061
|
+
async () => {
|
|
5062
|
+
const hash = createHash("sha256");
|
|
5063
|
+
let budget = DIGEST_MAX_BYTES;
|
|
5064
|
+
const hashFile = async (path6) => {
|
|
5065
|
+
const fh = await open(path6, DIGEST_OPEN_FLAGS);
|
|
5066
|
+
try {
|
|
5067
|
+
const st = await fh.stat();
|
|
5068
|
+
if (!st.isFile()) throw new Error(`not a regular file: ${path6}`);
|
|
5069
|
+
if (st.size > budget) throw new Error("skill too large to digest");
|
|
5070
|
+
const buf = Buffer.alloc(DIGEST_CHUNK_BYTES);
|
|
5071
|
+
let total = 0;
|
|
5072
|
+
for (; ; ) {
|
|
5073
|
+
const { bytesRead } = await fh.read(buf, 0, buf.length, null);
|
|
5074
|
+
if (bytesRead === 0) break;
|
|
5075
|
+
total += bytesRead;
|
|
5076
|
+
if (total > budget) throw new Error("skill too large to digest");
|
|
5077
|
+
hash.update(buf.subarray(0, bytesRead));
|
|
5078
|
+
}
|
|
5079
|
+
budget -= total;
|
|
5080
|
+
hash.update(`\0${total}\0`);
|
|
5081
|
+
} finally {
|
|
5082
|
+
await fh.close();
|
|
5083
|
+
}
|
|
5084
|
+
};
|
|
5085
|
+
const walk = async (rel) => {
|
|
5086
|
+
const here = rel ? join(dir, rel) : dir;
|
|
5087
|
+
if (rel && !(await lstat(here)).isDirectory()) throw new Error(`not a dir: ${here}`);
|
|
5088
|
+
const entries = await readdir(here, { withFileTypes: true });
|
|
5089
|
+
entries.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
5090
|
+
for (const entry of entries) {
|
|
5091
|
+
if (!rel && entry.name === STAGED_SKILL_MARKER) continue;
|
|
5092
|
+
const path6 = rel ? `${rel}/${entry.name}` : entry.name;
|
|
5093
|
+
if (entry.isDirectory()) {
|
|
5094
|
+
hash.update(`d\0${path6}\0`);
|
|
5095
|
+
await walk(path6);
|
|
5096
|
+
} else if (entry.isSymbolicLink()) {
|
|
5097
|
+
hash.update(`l\0${path6}\0${await readlink(join(dir, path6))}\0`);
|
|
5098
|
+
} else if (entry.isFile()) {
|
|
5099
|
+
hash.update(`f\0${path6}\0`);
|
|
5100
|
+
await hashFile(join(dir, path6));
|
|
5101
|
+
} else {
|
|
5102
|
+
hash.update(`o\0${path6}\0`);
|
|
5103
|
+
}
|
|
5104
|
+
}
|
|
5105
|
+
};
|
|
5106
|
+
await walk("");
|
|
5107
|
+
return hash.digest("hex");
|
|
5108
|
+
},
|
|
5109
|
+
null,
|
|
5110
|
+
fsDeadlineMs() * DIGEST_DEADLINE_FACTOR
|
|
5111
|
+
);
|
|
5112
|
+
}
|
|
4963
5113
|
async function attachStagedSkill(deps, name) {
|
|
4964
5114
|
try {
|
|
4965
5115
|
const skillsDir = deps.skillsDir();
|
|
4966
|
-
const
|
|
5116
|
+
const dirName = name.includes("/") ? name.split("/").pop() : name;
|
|
5117
|
+
const { staged, unchanged } = await deps.withSkillFsLock(async () => {
|
|
5118
|
+
const dest = join(deps.projectDir, skillsDir, dirName);
|
|
5119
|
+
const loaded = deps.stagedSkillDirs.has(dirName) ? deps.loadedSkillDigests.get(dirName) : void 0;
|
|
4967
5120
|
const names = await stageMaterializedSkills(deps.projectDir, skillsDir, { declared: [name] });
|
|
5121
|
+
let same = false;
|
|
5122
|
+
if (names.includes(dirName)) {
|
|
5123
|
+
const digest = await stagedSkillDigest(dest);
|
|
5124
|
+
same = digest !== null && loaded?.path === dest && loaded.digest === digest;
|
|
5125
|
+
if (!same) deps.loadedSkillDigests.set(dirName, { path: dest, digest });
|
|
5126
|
+
}
|
|
4968
5127
|
await recordStagedSkills(deps.stagedSkillDirs, deps.projectDir, skillsDir, names);
|
|
4969
|
-
return names;
|
|
5128
|
+
return { staged: names, unchanged: same ? dirName : null };
|
|
4970
5129
|
});
|
|
4971
5130
|
if (staged.length === 0) {
|
|
4972
5131
|
return {
|
|
@@ -4975,9 +5134,16 @@ async function attachStagedSkill(deps, name) {
|
|
|
4975
5134
|
message: `no materialized skill matching "${name}" under .skaile/assets/skill`
|
|
4976
5135
|
};
|
|
4977
5136
|
}
|
|
4978
|
-
deps.log(`[serve] runner.attach_instance staged skill(s): ${staged.join(", ")}`);
|
|
4979
5137
|
const live = deps.driverStarted();
|
|
4980
|
-
|
|
5138
|
+
const toRestart = staged.filter((s) => s !== unchanged);
|
|
5139
|
+
if (toRestart.length === 0) {
|
|
5140
|
+
deps.log(
|
|
5141
|
+
`[serve] runner.attach_instance: skill ${staged.join(", ")} already staged and unchanged \u2014 no driver restart`
|
|
5142
|
+
);
|
|
5143
|
+
return { ok: true, id: name, live, toolCount: 0 };
|
|
5144
|
+
}
|
|
5145
|
+
deps.log(`[serve] runner.attach_instance staged skill(s): ${toRestart.join(", ")}`);
|
|
5146
|
+
deps.scheduleSkillRestart(toRestart.map((s) => ({ name: s, action: "add" })));
|
|
4981
5147
|
return { ok: true, id: name, live, toolCount: 0 };
|
|
4982
5148
|
} catch (err) {
|
|
4983
5149
|
return {
|
|
@@ -8787,7 +8953,10 @@ async function startAgentServer(opts) {
|
|
|
8787
8953
|
let appliedWireAgentConfigKey;
|
|
8788
8954
|
let liveReconfigurePatch;
|
|
8789
8955
|
let wireConnectorDeclarationsApplied = false;
|
|
8956
|
+
let lastInitSharedState;
|
|
8790
8957
|
const stagedSkillDirs = /* @__PURE__ */ new Map();
|
|
8958
|
+
const loadedSkillDigests = /* @__PURE__ */ new Map();
|
|
8959
|
+
let bootRestageDone = false;
|
|
8791
8960
|
const withSkillFsLock = createSerialLock();
|
|
8792
8961
|
const stageDeclaredSkills = createCoalescedTask(
|
|
8793
8962
|
withSkillFsLock,
|
|
@@ -8797,11 +8966,17 @@ async function startAgentServer(opts) {
|
|
|
8797
8966
|
skillsDir
|
|
8798
8967
|
);
|
|
8799
8968
|
const names = declared.length > 0 ? await stageMaterializedSkills(opts.projectDir, skillsDir, { declared }) : [];
|
|
8969
|
+
const previouslyStaged = new Set(stagedSkillDirs.keys());
|
|
8970
|
+
await recordLoadedSkillDigests(loadedSkillDigests, opts.projectDir, skillsDir, names, {
|
|
8971
|
+
driverUp: bootRestageDone && driverStarted,
|
|
8972
|
+
previouslyStaged
|
|
8973
|
+
});
|
|
8800
8974
|
await recordStagedSkills(stagedSkillDirs, opts.projectDir, skillsDir, names);
|
|
8801
8975
|
return { removed, staged: names };
|
|
8802
8976
|
}
|
|
8803
8977
|
);
|
|
8804
8978
|
await restageMaterializedSkills(false);
|
|
8979
|
+
bootRestageDone = true;
|
|
8805
8980
|
async function restageMaterializedSkills(allowRestart) {
|
|
8806
8981
|
if (managedHost) return;
|
|
8807
8982
|
try {
|
|
@@ -8829,10 +9004,15 @@ async function startAgentServer(opts) {
|
|
|
8829
9004
|
}
|
|
8830
9005
|
if (removed.length === 0 && newlyStaged.length === 0) return;
|
|
8831
9006
|
if (allowRestart && driverStarted) {
|
|
8832
|
-
|
|
8833
|
-
|
|
8834
|
-
|
|
8835
|
-
|
|
9007
|
+
try {
|
|
9008
|
+
await restartDriverForSkillChanges([
|
|
9009
|
+
...removed.map((s) => ({ name: s, action: "remove" })),
|
|
9010
|
+
...newlyStaged.map((s) => ({ name: s, action: "add" }))
|
|
9011
|
+
]);
|
|
9012
|
+
} catch (err) {
|
|
9013
|
+
for (const s of newlyStaged) loadedSkillDigests.delete(s);
|
|
9014
|
+
throw err;
|
|
9015
|
+
}
|
|
8836
9016
|
}
|
|
8837
9017
|
} catch (err) {
|
|
8838
9018
|
log(
|
|
@@ -8852,7 +9032,7 @@ async function startAgentServer(opts) {
|
|
|
8852
9032
|
if (secretsMode === "provisioned") {
|
|
8853
9033
|
log("[serve] secrets mode: provisioned \u2014 waiting for provision_secrets command");
|
|
8854
9034
|
} else {
|
|
8855
|
-
sessionConfig = buildSessionConfig();
|
|
9035
|
+
sessionConfig = buildSessionConfig(new EnvSecretProvider());
|
|
8856
9036
|
agentSession = await createAgentSession(sessionConfig);
|
|
8857
9037
|
emitSystemPromptComposed(agentSession, sendEvent);
|
|
8858
9038
|
noteAgentSessionBuilt(sessionConfig.resumeSessionId);
|
|
@@ -9649,6 +9829,7 @@ async function startAgentServer(opts) {
|
|
|
9649
9829
|
}
|
|
9650
9830
|
async function rebuildAgentSession(overrides) {
|
|
9651
9831
|
const disposedManager = agentSession.resourceManager;
|
|
9832
|
+
const sharedStateSnapshots = await snapshotInitSharedState();
|
|
9652
9833
|
const disposeStartedAt = Date.now();
|
|
9653
9834
|
await agentSession.dispose();
|
|
9654
9835
|
if (managedHost && managedBootstrapClosed) throw new Error("CODEX_RUNTIME_UNSUPPORTED");
|
|
@@ -9673,14 +9854,67 @@ async function startAgentServer(opts) {
|
|
|
9673
9854
|
resourceManager,
|
|
9674
9855
|
disposedManager
|
|
9675
9856
|
);
|
|
9676
|
-
if (resourceManager !== null && resourceManager !== disposedManager && repointed !== resourceManager) {
|
|
9677
|
-
log(
|
|
9678
|
-
"[serve] WARNING: recreate displaced a lazily-created sharedState resource manager \u2014 registered shared-state stores were dropped and must be re-registered"
|
|
9679
|
-
);
|
|
9680
|
-
}
|
|
9681
9857
|
resourceManager = repointed;
|
|
9858
|
+
await reRegisterInitSharedState(sharedStateSnapshots);
|
|
9682
9859
|
agentSession.startWatching();
|
|
9683
9860
|
}
|
|
9861
|
+
async function snapshotInitSharedState() {
|
|
9862
|
+
const snapshots = /* @__PURE__ */ new Map();
|
|
9863
|
+
if (!lastInitSharedState || !resourceManager) return snapshots;
|
|
9864
|
+
for (const stateConfig of lastInitSharedState) {
|
|
9865
|
+
if (!resourceManager.has(stateConfig.id)) continue;
|
|
9866
|
+
try {
|
|
9867
|
+
const raw = await resourceManager.executeOp(stateConfig.id, "get", {});
|
|
9868
|
+
const state = raw ? JSON.parse(raw) : {};
|
|
9869
|
+
if (state && typeof state === "object" && !Array.isArray(state)) {
|
|
9870
|
+
snapshots.set(stateConfig.id, state);
|
|
9871
|
+
}
|
|
9872
|
+
} catch (err) {
|
|
9873
|
+
serverLog.warn("shared-state store could not be read before the driver recreate", {
|
|
9874
|
+
id: stateConfig.id,
|
|
9875
|
+
error: err instanceof Error ? err.message : String(err)
|
|
9876
|
+
});
|
|
9877
|
+
}
|
|
9878
|
+
}
|
|
9879
|
+
return snapshots;
|
|
9880
|
+
}
|
|
9881
|
+
async function reRegisterInitSharedState(snapshots) {
|
|
9882
|
+
if (!lastInitSharedState) return;
|
|
9883
|
+
const missing = lastInitSharedState.filter((c) => !resourceManager?.has(c.id));
|
|
9884
|
+
if (missing.length === 0 || !ensureResourceManagerForSharedState()) return;
|
|
9885
|
+
const ids = [];
|
|
9886
|
+
const restored = [];
|
|
9887
|
+
for (const stateConfig of missing) {
|
|
9888
|
+
if (!await registerSharedStateStore(stateConfig)) continue;
|
|
9889
|
+
ids.push(stateConfig.id);
|
|
9890
|
+
const snapshot = snapshots.get(stateConfig.id);
|
|
9891
|
+
if (snapshot && await restoreSharedStateSnapshot(stateConfig, snapshot)) {
|
|
9892
|
+
restored.push(stateConfig.id);
|
|
9893
|
+
}
|
|
9894
|
+
}
|
|
9895
|
+
if (ids.length > 0) {
|
|
9896
|
+
serverLog.info("shared-state stores re-registered after the driver recreate", {
|
|
9897
|
+
ids,
|
|
9898
|
+
restored
|
|
9899
|
+
});
|
|
9900
|
+
}
|
|
9901
|
+
await rebuildMcpToolsForNewStores(ids.length);
|
|
9902
|
+
}
|
|
9903
|
+
async function restoreSharedStateSnapshot(stateConfig, snapshot) {
|
|
9904
|
+
try {
|
|
9905
|
+
await resourceManager.executeOp(stateConfig.id, "merge", { data: snapshot });
|
|
9906
|
+
for (const key of Object.keys(stateConfig.initialState ?? {})) {
|
|
9907
|
+
if (!(key in snapshot)) await resourceManager.executeOp(stateConfig.id, "delete", { key });
|
|
9908
|
+
}
|
|
9909
|
+
return true;
|
|
9910
|
+
} catch (err) {
|
|
9911
|
+
serverLog.warn("shared-state store state could not be restored after the driver recreate", {
|
|
9912
|
+
id: stateConfig.id,
|
|
9913
|
+
error: err instanceof Error ? err.message : String(err)
|
|
9914
|
+
});
|
|
9915
|
+
return false;
|
|
9916
|
+
}
|
|
9917
|
+
}
|
|
9684
9918
|
async function recreateSessionForInit(pendingResumeSessionId) {
|
|
9685
9919
|
await recreateAgentSession({
|
|
9686
9920
|
...aiProviderConfigId ? { aiProviderConfigId } : {},
|
|
@@ -9690,6 +9924,7 @@ async function startAgentServer(opts) {
|
|
|
9690
9924
|
});
|
|
9691
9925
|
}
|
|
9692
9926
|
async function applyInitSharedState(sharedState) {
|
|
9927
|
+
lastInitSharedState = sharedState;
|
|
9693
9928
|
if (!ensureResourceManagerForSharedState()) {
|
|
9694
9929
|
sendEvent({ type: "configured" });
|
|
9695
9930
|
return false;
|
|
@@ -9844,8 +10079,12 @@ async function startAgentServer(opts) {
|
|
|
9844
10079
|
projectDir: opts.projectDir,
|
|
9845
10080
|
skillsDir: () => activeSkillsDir(),
|
|
9846
10081
|
stagedSkillDirs,
|
|
10082
|
+
loadedSkillDigests,
|
|
9847
10083
|
withSkillFsLock,
|
|
9848
|
-
|
|
10084
|
+
// A failed restart never loaded the new copy; forget it so a re-attach restarts.
|
|
10085
|
+
scheduleSkillRestart: (actions) => scheduleDriverRestartForSkillChanges(actions, () => {
|
|
10086
|
+
for (const a of actions) loadedSkillDigests.delete(a.name);
|
|
10087
|
+
}),
|
|
9849
10088
|
driverStarted: () => driverStarted,
|
|
9850
10089
|
log
|
|
9851
10090
|
};
|
|
@@ -9895,8 +10134,9 @@ async function startAgentServer(opts) {
|
|
|
9895
10134
|
}))
|
|
9896
10135
|
});
|
|
9897
10136
|
}
|
|
9898
|
-
function scheduleDriverRestartForSkillChanges(catalogActions) {
|
|
10137
|
+
function scheduleDriverRestartForSkillChanges(catalogActions, onFailed) {
|
|
9899
10138
|
void restartDriverForSkillChanges(catalogActions).catch((err) => {
|
|
10139
|
+
onFailed?.();
|
|
9900
10140
|
serverLog.warn(
|
|
9901
10141
|
`[serve] background driver restart for skill changes failed: ${err instanceof Error ? err.message : String(err)}`
|
|
9902
10142
|
);
|
|
@@ -10079,6 +10319,7 @@ async function startAgentServer(opts) {
|
|
|
10079
10319
|
log(
|
|
10080
10320
|
`[serve] configure cfg keys=${Object.keys(cfg).join(",")} sharedState=${cfg.sharedState ? cfg.sharedState.length : "undefined"} resourceManager=${resourceManager ? "set" : "null"}`
|
|
10081
10321
|
);
|
|
10322
|
+
if (cfg.sharedState) lastInitSharedState = cfg.sharedState;
|
|
10082
10323
|
if (!managedCodex && aiProviderConfigId) {
|
|
10083
10324
|
aiCredentialRefreshScheduler.ensureArmed();
|
|
10084
10325
|
}
|
|
@@ -10877,6 +11118,6 @@ function touchSession(state) {
|
|
|
10877
11118
|
return { ...state, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
10878
11119
|
}
|
|
10879
11120
|
|
|
10880
|
-
export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CONNECTOR_MUTATE_NOT_READY, 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, flowRunDrivesTurns, flowStartNeedsDriverRestart, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, handleSessionRootResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isSessionRootPathAllowed, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadManagedCodexHostConfig, loadSession, loadSessionById, mcpAuthSecretKey, newSession, nulTailPaddingLength, pickChatFlowTarget, pickFlowToolTarget, pickRepointedManager, planFlowMutate, prepareCodexTools, reconcilePendingDecisions, recreateKeepingLiveFlows, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, rejectPendingCapabilityCallsOnDisconnect, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, restoredRunHasWorkToResume, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, supportsLiveToolUpdates, takeRunnerWsAuthToken, toActiveFlowTarget, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
|
|
10881
|
-
//# sourceMappingURL=chunk-
|
|
10882
|
-
//# sourceMappingURL=chunk-
|
|
11121
|
+
export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CONNECTOR_MUTATE_NOT_READY, 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_READ_MAX_CHUNK_BYTES, 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, flowRunDrivesTurns, flowStartNeedsDriverRestart, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, handleSessionRootResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isSessionRootPathAllowed, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadManagedCodexHostConfig, loadSession, loadSessionById, mcpAuthSecretKey, newSession, nulTailPaddingLength, pickChatFlowTarget, pickFlowToolTarget, pickRepointedManager, planFlowMutate, prepareCodexTools, reconcilePendingDecisions, recreateKeepingLiveFlows, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, rejectPendingCapabilityCallsOnDisconnect, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, restoredRunHasWorkToResume, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, supportsLiveToolUpdates, takeRunnerWsAuthToken, toActiveFlowTarget, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
|
|
11122
|
+
//# sourceMappingURL=chunk-EOX3QH74.js.map
|
|
11123
|
+
//# sourceMappingURL=chunk-EOX3QH74.js.map
|