@skaile/workspaces 4.29.0 → 4.29.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.
Files changed (114) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/{asset-feeds-3P3XWCCZ.js → asset-feeds-46K7CTW2.js} +4 -4
  3. package/dist/{asset-feeds-3P3XWCCZ.js.map → asset-feeds-46K7CTW2.js.map} +1 -1
  4. package/dist/asset-manager/index.js +1 -1
  5. package/dist/{chunk-2ZFE2R7S.js → chunk-3LIUBF5P.js} +2 -2
  6. package/dist/{chunk-2ZFE2R7S.js.map → chunk-3LIUBF5P.js.map} +1 -1
  7. package/dist/{chunk-LFZEN3XG.js → chunk-6X4DHKHP.js} +3 -3
  8. package/dist/{chunk-LFZEN3XG.js.map → chunk-6X4DHKHP.js.map} +1 -1
  9. package/dist/{chunk-7P6OPPG4.js → chunk-7NC3VL6Z.js} +3 -3
  10. package/dist/{chunk-7P6OPPG4.js.map → chunk-7NC3VL6Z.js.map} +1 -1
  11. package/dist/{chunk-TFH6Z4KZ.js → chunk-7SLRVWKR.js} +3 -3
  12. package/dist/{chunk-TFH6Z4KZ.js.map → chunk-7SLRVWKR.js.map} +1 -1
  13. package/dist/{chunk-AMJSC6SU.js → chunk-C56FCYFU.js} +3 -3
  14. package/dist/{chunk-AMJSC6SU.js.map → chunk-C56FCYFU.js.map} +1 -1
  15. package/dist/{chunk-PZL6BEWG.js → chunk-DIQDYNXZ.js} +3 -3
  16. package/dist/{chunk-PZL6BEWG.js.map → chunk-DIQDYNXZ.js.map} +1 -1
  17. package/dist/{chunk-3XMGAODZ.js → chunk-G3YTK6UI.js} +9 -9
  18. package/dist/{chunk-3XMGAODZ.js.map → chunk-G3YTK6UI.js.map} +1 -1
  19. package/dist/{chunk-3TZECMBB.js → chunk-GYBCW4S7.js} +6 -6
  20. package/dist/{chunk-3TZECMBB.js.map → chunk-GYBCW4S7.js.map} +1 -1
  21. package/dist/{chunk-DQ64NLMC.js → chunk-K3IBZ2UZ.js} +3 -3
  22. package/dist/{chunk-DQ64NLMC.js.map → chunk-K3IBZ2UZ.js.map} +1 -1
  23. package/dist/{chunk-FUKJ4IU6.js → chunk-LIEOC4JE.js} +34 -15
  24. package/dist/chunk-LIEOC4JE.js.map +1 -0
  25. package/dist/{chunk-Y42A2ZBB.js → chunk-NGQVRFQJ.js} +4 -4
  26. package/dist/{chunk-Y42A2ZBB.js.map → chunk-NGQVRFQJ.js.map} +1 -1
  27. package/dist/{chunk-KPRZHEEI.js → chunk-ORH2BZEM.js} +155 -85
  28. package/dist/chunk-ORH2BZEM.js.map +1 -0
  29. package/dist/{chunk-I4C4AHZB.js → chunk-PJY4J37J.js} +3 -3
  30. package/dist/{chunk-I4C4AHZB.js.map → chunk-PJY4J37J.js.map} +1 -1
  31. package/dist/{chunk-G6NTA3BZ.js → chunk-SZEICOXM.js} +6 -6
  32. package/dist/{chunk-G6NTA3BZ.js.map → chunk-SZEICOXM.js.map} +1 -1
  33. package/dist/{chunk-BGSM22L6.js → chunk-T57M3SST.js} +6 -6
  34. package/dist/{chunk-BGSM22L6.js.map → chunk-T57M3SST.js.map} +1 -1
  35. package/dist/{chunk-ULLMVMAN.js → chunk-UDFWBALP.js} +3 -3
  36. package/dist/{chunk-ULLMVMAN.js.map → chunk-UDFWBALP.js.map} +1 -1
  37. package/dist/{chunk-YNJRENVU.js → chunk-UQ3JFN4N.js} +2 -2
  38. package/dist/{chunk-YNJRENVU.js.map → chunk-UQ3JFN4N.js.map} +1 -1
  39. package/dist/{chunk-YO654LTQ.js → chunk-YVWUHPQW.js} +43 -66
  40. package/dist/chunk-YVWUHPQW.js.map +1 -0
  41. package/dist/{chunk-2MD6TJWZ.js → chunk-YYH5EVPM.js} +3 -3
  42. package/dist/{chunk-2MD6TJWZ.js.map → chunk-YYH5EVPM.js.map} +1 -1
  43. package/dist/{chunk-LZRA54EP.js → chunk-ZKX5KY2K.js} +2 -2
  44. package/dist/{chunk-LZRA54EP.js.map → chunk-ZKX5KY2K.js.map} +1 -1
  45. package/dist/cli/index.js +37 -37
  46. package/dist/connectors/index.js +7 -7
  47. package/dist/{ensure-sources-3NKAGEBJ.js → ensure-sources-HH4CCGY5.js} +4 -4
  48. package/dist/{ensure-sources-3NKAGEBJ.js.map → ensure-sources-HH4CCGY5.js.map} +1 -1
  49. package/dist/factory-assets/connectors/box.js +7 -7
  50. package/dist/factory-assets/connectors/deploy.js +7 -7
  51. package/dist/factory-assets/connectors/devserver.js +7 -7
  52. package/dist/factory-assets/connectors/flow/CONNECTOR.md +6 -2
  53. package/dist/factory-assets/connectors/flow/adapter.js +7 -7
  54. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -1
  55. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  56. package/dist/factory-assets/connectors/flow/contract/output-fields.d.ts +28 -0
  57. package/dist/factory-assets/connectors/flow/contract/output-fields.d.ts.map +1 -0
  58. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +5 -0
  59. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  60. package/dist/factory-assets/connectors/flow/contract.js +4 -4
  61. package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts +2 -7
  62. package/dist/factory-assets/connectors/flow/engine/output-schema.d.ts.map +1 -1
  63. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  64. package/dist/factory-assets/connectors/flow/prompt-fragments.js +3 -3
  65. package/dist/factory-assets/connectors/flow/run-flow.js +8 -8
  66. package/dist/factory-assets/connectors/flow.js +7 -7
  67. package/dist/factory-assets/connectors/git/CONNECTOR.md +2 -0
  68. package/dist/factory-assets/connectors/git/driver.d.ts +3 -2
  69. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  70. package/dist/factory-assets/connectors/git.js +7 -7
  71. package/dist/factory-assets/connectors/gmail.js +7 -7
  72. package/dist/factory-assets/connectors/googledrive.js +7 -7
  73. package/dist/factory-assets/connectors/local.js +7 -7
  74. package/dist/factory-assets/connectors/mattermost.js +7 -7
  75. package/dist/factory-assets/connectors/memory.js +7 -7
  76. package/dist/factory-assets/connectors/minio.js +7 -7
  77. package/dist/factory-assets/connectors/postgres.js +7 -7
  78. package/dist/factory-assets/connectors/s3.js +7 -7
  79. package/dist/factory-assets/connectors/sharepoint.js +7 -7
  80. package/dist/factory-assets/connectors/sqlite.js +7 -7
  81. package/dist/factory-assets/connectors/static-server.js +7 -7
  82. package/dist/factory-assets/connectors/tunnel.js +7 -7
  83. package/dist/factory-assets/connectors/webdav.js +7 -7
  84. package/dist/factory-assets/connectors/xstate-store.js +7 -7
  85. package/dist/factory-assets/connectors/xstate.js +7 -7
  86. package/dist/{flows-4X6PVPPH.js → flows-6WUQ2J4X.js} +3 -3
  87. package/dist/{flows-4X6PVPPH.js.map → flows-6WUQ2J4X.js.map} +1 -1
  88. package/dist/{helpers-WHBQSVBQ.js → helpers-BKOX66EA.js} +4 -4
  89. package/dist/{helpers-WHBQSVBQ.js.map → helpers-BKOX66EA.js.map} +1 -1
  90. package/dist/{library-publish-4APUZRJV.js → library-publish-PCY3ULAA.js} +10 -10
  91. package/dist/{library-publish-4APUZRJV.js.map → library-publish-PCY3ULAA.js.map} +1 -1
  92. package/dist/{open-library-QTC5PH7Y.js → open-library-R73XWQNW.js} +9 -9
  93. package/dist/{open-library-QTC5PH7Y.js.map → open-library-R73XWQNW.js.map} +1 -1
  94. package/dist/{project-3K6VBQIV.js → project-7RHUAYUZ.js} +5 -5
  95. package/dist/{project-3K6VBQIV.js.map → project-7RHUAYUZ.js.map} +1 -1
  96. package/dist/runner/index.js +13 -13
  97. package/dist/sdk/asset-manager.js +1 -1
  98. package/dist/sdk/flow.js +4 -4
  99. package/dist/sdk/index.js +13 -13
  100. package/dist/sdk/runner.js +13 -13
  101. package/dist/{setup-K37IWBVQ.js → setup-MYJDFOCG.js} +5 -5
  102. package/dist/{setup-K37IWBVQ.js.map → setup-MYJDFOCG.js.map} +1 -1
  103. package/dist/{source-DMSYJIY6.js → source-SKGXVE7I.js} +10 -10
  104. package/dist/{source-DMSYJIY6.js.map → source-SKGXVE7I.js.map} +1 -1
  105. package/dist/{source-manifest-publish-VJSEWCG7.js → source-manifest-publish-QSZRNMSM.js} +11 -11
  106. package/dist/{source-manifest-publish-VJSEWCG7.js.map → source-manifest-publish-QSZRNMSM.js.map} +1 -1
  107. package/dist/tui/index.js +13 -13
  108. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  109. package/dist/workspace-plugin/adapters/omp.js +3 -3
  110. package/dist/workspace-plugin/index.js +1 -1
  111. package/package.json +1 -1
  112. package/dist/chunk-FUKJ4IU6.js.map +0 -1
  113. package/dist/chunk-KPRZHEEI.js.map +0 -1
  114. package/dist/chunk-YO654LTQ.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { logErr } from './chunk-TFH6Z4KZ.js';
2
- import { flowKindProvider } from './chunk-YO654LTQ.js';
1
+ import { logErr } from './chunk-7SLRVWKR.js';
2
+ import { flowKindProvider } from './chunk-YVWUHPQW.js';
3
3
  import { knowledgeKindProvider } from './chunk-UFWADBG6.js';
4
4
  import { createDefaultRegistry } from './chunk-HGPSZXZP.js';
5
5
 
@@ -103,5 +103,5 @@ async function openLibraryManager() {
103
103
  }
104
104
 
105
105
  export { LocalCatalogDisabledError, createFullRegistry, openCatalogSource, openLibrary, openLibraryManager, resolveCatalogSource };
106
- //# sourceMappingURL=chunk-Y42A2ZBB.js.map
107
- //# sourceMappingURL=chunk-Y42A2ZBB.js.map
106
+ //# sourceMappingURL=chunk-NGQVRFQJ.js.map
107
+ //# sourceMappingURL=chunk-NGQVRFQJ.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-Y42A2ZBB.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-NGQVRFQJ.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,4 +1,4 @@
1
- import * as z from 'zod';
1
+ import * as z2 from 'zod';
2
2
 
3
3
  // factory-assets/connectors/flow/contract/classifier.ts
4
4
  var RESERVED_CLASSIFIER_FIELDS = ["confidence", "calibrated"];
@@ -798,15 +798,44 @@ function resolveFlowBindings(bindings, context, nodeOutputOrigin = {}, flowInput
798
798
  }
799
799
  return { values, origins };
800
800
  }
801
- var jsonValue = () => z.json();
802
- var nonEmptyString = z.string().min(1);
803
- var flowAssetIdentity = z.string().regex(
801
+ function consumerExpressions(node) {
802
+ const expressions = (node.contract?.requires ?? []).map(({ expr }) => expr);
803
+ expressions.push(...collectFlowBindingExpressions(node.contract?.input));
804
+ if (node.run?.kind === "router") {
805
+ expressions.push(...node.run.routes.map(({ when }) => when));
806
+ }
807
+ return expressions;
808
+ }
809
+ function readsProducerOutput(node, producerId) {
810
+ return consumerExpressions(node).some(
811
+ (expression) => inspectFlowExpression(expression, false).some(
812
+ ({ path }) => path.startsWith(`nodes.${producerId}.output.fields.`)
813
+ )
814
+ );
815
+ }
816
+ function getConsumedOutputSchema(flow, producerId) {
817
+ const producer = flow.nodes.find(({ id }) => id === producerId);
818
+ const schema = producer?.contract?.output?.fields;
819
+ if (!schema) return void 0;
820
+ return flow.nodes.some(
821
+ (consumer) => consumer.id !== producerId && readsProducerOutput(consumer, producerId)
822
+ ) ? schema : void 0;
823
+ }
824
+ function compileOutputFieldsSchema(schema) {
825
+ return z2.fromJSONSchema(schema);
826
+ }
827
+ function invalidOutputFieldsSchemaMessage(error) {
828
+ return `invalid authored JSON Schema: ${error instanceof Error ? error.message : String(error)}`;
829
+ }
830
+ var jsonValue = () => z2.json();
831
+ var nonEmptyString = z2.string().min(1);
832
+ var flowAssetIdentity = z2.string().regex(
804
833
  /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
805
834
  "Flow identity must be lowercase kebab-case without path separators"
806
835
  );
807
- var jsonSchema = z.record(z.string(), jsonValue());
808
- var bindingName = z.string().regex(FLOW_BINDING_NAME_PATTERN, "Binding name is reserved");
809
- var nodeBindings = z.preprocess(
836
+ var jsonSchema = z2.record(z2.string(), jsonValue());
837
+ var bindingName = z2.string().regex(FLOW_BINDING_NAME_PATTERN, "Binding name is reserved");
838
+ var nodeBindings = z2.preprocess(
810
839
  (value, context) => {
811
840
  if (typeof value === "object" && value !== null) {
812
841
  for (const key of Object.keys(value)) {
@@ -817,7 +846,7 @@ var nodeBindings = z.preprocess(
817
846
  }
818
847
  return value;
819
848
  },
820
- z.record(bindingName, jsonValue())
849
+ z2.record(bindingName, jsonValue())
821
850
  );
822
851
  var MISSING_FIELD = /* @__PURE__ */ Symbol("missing-field");
823
852
  function declaredFieldSchema(schema, path) {
@@ -832,7 +861,7 @@ function declaredFieldSchema(schema, path) {
832
861
  }
833
862
  return current;
834
863
  }
835
- var FlowInputContractSchema = z.strictObject({
864
+ var FlowInputContractSchema = z2.strictObject({
836
865
  schema: jsonSchema,
837
866
  example: jsonValue().optional(),
838
867
  labelField: nonEmptyString.optional()
@@ -847,45 +876,45 @@ var FlowInputContractSchema = z.strictObject({
847
876
  });
848
877
  }
849
878
  });
850
- var FlowOutputContractSchema = z.strictObject({
879
+ var FlowOutputContractSchema = z2.strictObject({
851
880
  schema: jsonSchema
852
881
  });
853
- var PreconditionSchema = z.strictObject({
882
+ var PreconditionSchema = z2.strictObject({
854
883
  expr: nonEmptyString,
855
884
  message: nonEmptyString.optional()
856
885
  });
857
- var ArtifactContractSchema = z.strictObject({
886
+ var ArtifactContractSchema = z2.strictObject({
858
887
  kind: nonEmptyString,
859
- lifetime: z.enum(["session", "persistent"])
888
+ lifetime: z2.enum(["session", "persistent"])
860
889
  });
861
- var NodeOutputContractSchema = z.strictObject({
890
+ var NodeOutputContractSchema = z2.strictObject({
862
891
  fields: jsonSchema.optional(),
863
- artifacts: z.array(ArtifactContractSchema).optional()
892
+ artifacts: z2.array(ArtifactContractSchema).optional()
864
893
  });
865
- var NodeContractSchema = z.strictObject({
866
- requires: z.array(PreconditionSchema).optional(),
894
+ var NodeContractSchema = z2.strictObject({
895
+ requires: z2.array(PreconditionSchema).optional(),
867
896
  input: nodeBindings.optional(),
868
897
  output: NodeOutputContractSchema.optional()
869
898
  });
870
- var NodeGateSchema = z.strictObject({
871
- approval: z.enum(["none", "optional", "mandatory"])
899
+ var NodeGateSchema = z2.strictObject({
900
+ approval: z2.enum(["none", "optional", "mandatory"])
872
901
  });
873
- var NodeControlSchema = z.strictObject({
874
- optional: z.boolean().optional(),
875
- retries: z.number().int().min(0).optional(),
876
- timeoutSec: z.number().positive().optional(),
902
+ var NodeControlSchema = z2.strictObject({
903
+ optional: z2.boolean().optional(),
904
+ retries: z2.number().int().min(0).optional(),
905
+ timeoutSec: z2.number().positive().optional(),
877
906
  parallelGroup: nonEmptyString.optional()
878
907
  });
879
- var runAssets = { assets: z.array(nonEmptyString).optional() };
880
- var modelTier = z.enum(["small", "default", "deep"]);
881
- var AgentRunSchema = z.strictObject({
882
- kind: z.literal("agent"),
908
+ var runAssets = { assets: z2.array(nonEmptyString).optional() };
909
+ var modelTier = z2.enum(["small", "default", "deep"]);
910
+ var AgentRunSchema = z2.strictObject({
911
+ kind: z2.literal("agent"),
883
912
  instruction: nonEmptyString,
884
913
  model: modelTier.optional(),
885
914
  ...runAssets
886
915
  });
887
- var SubpromptRunSchema = z.strictObject({
888
- kind: z.literal("subprompt"),
916
+ var SubpromptRunSchema = z2.strictObject({
917
+ kind: z2.literal("subprompt"),
889
918
  instruction: nonEmptyString,
890
919
  model: modelTier.optional(),
891
920
  ...runAssets
@@ -899,73 +928,77 @@ function invalidCaptureDestinationMessage(kind, nodeId, channel, destination) {
899
928
  const kindLabel = kind === "check" ? "Check" : "Function";
900
929
  return `${kindLabel} node ${nodeId} run.capture.${channel} destination "${destination}" is invalid; expected fields.<name>`;
901
930
  }
931
+ function duplicateCaptureDestinationMessage(kind, nodeId, fieldName) {
932
+ const kindLabel = kind === "check" ? "Check" : "Function";
933
+ return `${kindLabel} node ${nodeId} run.capture.stdout and run.capture.stderr both write fields.${fieldName}; stderr would overwrite stdout, so capture them into different fields`;
934
+ }
902
935
  var deterministicRun = {
903
- runtime: z.enum(["shell", "node", "python"]).optional(),
936
+ runtime: z2.enum(["shell", "node", "python"]).optional(),
904
937
  command: nonEmptyString,
905
938
  cwd: nonEmptyString.optional(),
906
- successExit: z.array(z.number().int()).optional(),
907
- capture: z.strictObject({ stdout: nonEmptyString.optional(), stderr: nonEmptyString.optional() }).optional(),
939
+ successExit: z2.array(z2.number().int()).optional(),
940
+ capture: z2.strictObject({ stdout: nonEmptyString.optional(), stderr: nonEmptyString.optional() }).optional(),
908
941
  ...runAssets
909
942
  };
910
- var FunctionRunSchema = z.strictObject({
911
- kind: z.literal("function"),
943
+ var FunctionRunSchema = z2.strictObject({
944
+ kind: z2.literal("function"),
912
945
  ...deterministicRun
913
946
  });
914
- var CheckRunSchema = z.strictObject({
915
- kind: z.literal("check"),
916
- onFail: z.enum(["escalate", "fail"]).default("escalate"),
947
+ var CheckRunSchema = z2.strictObject({
948
+ kind: z2.literal("check"),
949
+ onFail: z2.enum(["escalate", "fail"]).default("escalate"),
917
950
  ...deterministicRun
918
951
  });
919
- var InputChoiceSchema = z.strictObject({
952
+ var InputChoiceSchema = z2.strictObject({
920
953
  id: nonEmptyString,
921
954
  label: nonEmptyString,
922
955
  description: nonEmptyString.optional()
923
956
  });
924
- var FormFieldSchema = z.strictObject({
957
+ var FormFieldSchema = z2.strictObject({
925
958
  id: nonEmptyString,
926
959
  label: nonEmptyString,
927
- type: z.enum(["text", "textarea", "number", "choice", "file", "date", "boolean"]),
928
- required: z.boolean().optional(),
929
- options: z.array(InputChoiceSchema).optional(),
930
- accept: z.array(nonEmptyString).optional()
960
+ type: z2.enum(["text", "textarea", "number", "choice", "file", "date", "boolean"]),
961
+ required: z2.boolean().optional(),
962
+ options: z2.array(InputChoiceSchema).optional(),
963
+ accept: z2.array(nonEmptyString).optional()
931
964
  });
932
- var InputSchema = z.discriminatedUnion("kind", [
933
- z.strictObject({ kind: z.literal("text"), multiline: z.boolean().optional() }),
934
- z.strictObject({
935
- kind: z.literal("choice"),
936
- options: z.array(InputChoiceSchema).min(1),
937
- multiple: z.boolean().optional()
965
+ var InputSchema = z2.discriminatedUnion("kind", [
966
+ z2.strictObject({ kind: z2.literal("text"), multiline: z2.boolean().optional() }),
967
+ z2.strictObject({
968
+ kind: z2.literal("choice"),
969
+ options: z2.array(InputChoiceSchema).min(1),
970
+ multiple: z2.boolean().optional()
938
971
  }),
939
- z.strictObject({ kind: z.literal("form"), fields: z.array(FormFieldSchema) }),
940
- z.strictObject({
941
- kind: z.literal("file"),
942
- accept: z.array(nonEmptyString).optional(),
943
- maxSize: z.number().positive().optional(),
944
- multiple: z.boolean().optional()
972
+ z2.strictObject({ kind: z2.literal("form"), fields: z2.array(FormFieldSchema) }),
973
+ z2.strictObject({
974
+ kind: z2.literal("file"),
975
+ accept: z2.array(nonEmptyString).optional(),
976
+ maxSize: z2.number().positive().optional(),
977
+ multiple: z2.boolean().optional()
945
978
  })
946
979
  ]);
947
- var GateRunSchema = z.strictObject({
948
- kind: z.literal("gate"),
980
+ var GateRunSchema = z2.strictObject({
981
+ kind: z2.literal("gate"),
949
982
  prompt: nonEmptyString,
950
983
  schema: InputSchema,
951
984
  ...runAssets
952
985
  });
953
- var RouteSchema = z.strictObject({
986
+ var RouteSchema = z2.strictObject({
954
987
  when: nonEmptyString,
955
988
  target: nonEmptyString.nullable()
956
989
  });
957
- var RouterRunSchema = z.strictObject({
958
- kind: z.literal("router"),
959
- routes: z.array(RouteSchema).min(1),
990
+ var RouterRunSchema = z2.strictObject({
991
+ kind: z2.literal("router"),
992
+ routes: z2.array(RouteSchema).min(1),
960
993
  ...runAssets
961
994
  });
962
- var SubFlowRunSchema = z.strictObject({
963
- kind: z.literal("sub-flow"),
995
+ var SubFlowRunSchema = z2.strictObject({
996
+ kind: z2.literal("sub-flow"),
964
997
  flow: flowAssetIdentity,
965
- passContext: z.boolean().optional(),
998
+ passContext: z2.boolean().optional(),
966
999
  ...runAssets
967
1000
  });
968
- var RunSchema = z.discriminatedUnion("kind", [
1001
+ var RunSchema = z2.discriminatedUnion("kind", [
969
1002
  AgentRunSchema,
970
1003
  SubpromptRunSchema,
971
1004
  FunctionRunSchema,
@@ -974,7 +1007,7 @@ var RunSchema = z.discriminatedUnion("kind", [
974
1007
  RouterRunSchema,
975
1008
  SubFlowRunSchema
976
1009
  ]);
977
- var NodeSchema = z.strictObject({
1010
+ var NodeSchema = z2.strictObject({
978
1011
  id: nonEmptyString,
979
1012
  label: nonEmptyString,
980
1013
  description: nonEmptyString,
@@ -984,35 +1017,35 @@ var NodeSchema = z.strictObject({
984
1017
  gate: NodeGateSchema.optional(),
985
1018
  control: NodeControlSchema.optional()
986
1019
  });
987
- var EdgeSchema = z.strictObject({
1020
+ var EdgeSchema = z2.strictObject({
988
1021
  id: nonEmptyString,
989
1022
  source: nonEmptyString,
990
1023
  target: nonEmptyString,
991
- type: z.enum(["flow", "parallel", "optional"])
1024
+ type: z2.enum(["flow", "parallel", "optional"])
992
1025
  });
993
- var FlowDefaultsSchema = z.strictObject({
994
- approval: z.enum(["checkpoint", "auto", "manual"]).optional(),
1026
+ var FlowDefaultsSchema = z2.strictObject({
1027
+ approval: z2.enum(["checkpoint", "auto", "manual"]).optional(),
995
1028
  researchDepth: nonEmptyString.optional(),
996
- autoReview: z.boolean().optional(),
1029
+ autoReview: z2.boolean().optional(),
997
1030
  verbosity: nonEmptyString.optional(),
998
- cliMode: z.boolean().optional(),
1031
+ cliMode: z2.boolean().optional(),
999
1032
  run_input: jsonValue().optional(),
1000
- parameters: z.record(z.string(), jsonValue()).optional()
1033
+ parameters: z2.record(z2.string(), jsonValue()).optional()
1001
1034
  });
1002
- var FlowMetaSchema = z.strictObject({
1035
+ var FlowMetaSchema = z2.strictObject({
1003
1036
  icon: nonEmptyString.optional(),
1004
1037
  category: nonEmptyString.optional(),
1005
- tags: z.array(nonEmptyString).optional(),
1038
+ tags: z2.array(nonEmptyString).optional(),
1006
1039
  stage: nonEmptyString.optional(),
1007
- onboarding: z.strictObject({
1008
- input_style: z.enum(["freeform", "structured", "repo"]),
1040
+ onboarding: z2.strictObject({
1041
+ input_style: z2.enum(["freeform", "structured", "repo"]),
1009
1042
  placeholder: nonEmptyString.optional(),
1010
- fields: z.array(nonEmptyString).optional()
1043
+ fields: z2.array(nonEmptyString).optional()
1011
1044
  }).optional()
1012
1045
  });
1013
- var FlowDefinitionObjectSchema = z.strictObject({
1046
+ var FlowDefinitionObjectSchema = z2.strictObject({
1014
1047
  $schema: nonEmptyString.optional(),
1015
- schemaVersion: z.literal(2),
1048
+ schemaVersion: z2.literal(2),
1016
1049
  id: nonEmptyString,
1017
1050
  version: nonEmptyString,
1018
1051
  name: nonEmptyString,
@@ -1021,8 +1054,8 @@ var FlowDefinitionObjectSchema = z.strictObject({
1021
1054
  output: FlowOutputContractSchema.optional(),
1022
1055
  defaults: FlowDefaultsSchema.optional(),
1023
1056
  entry: nonEmptyString.optional(),
1024
- nodes: z.array(NodeSchema),
1025
- edges: z.array(EdgeSchema),
1057
+ nodes: z2.array(NodeSchema),
1058
+ edges: z2.array(EdgeSchema),
1026
1059
  meta: FlowMetaSchema.optional()
1027
1060
  });
1028
1061
  function parseFlowDefinitionStructure(data) {
@@ -1084,6 +1117,17 @@ var FlowDefinitionSchema = FlowDefinitionObjectSchema.superRefine((flow, context
1084
1117
  message: invalidCaptureDestinationMessage(node.run.kind, node.id, channel, destination)
1085
1118
  });
1086
1119
  }
1120
+ const { stdout, stderr } = node.run.capture ?? {};
1121
+ const stdoutField = stdout === void 0 ? void 0 : captureDestinationFieldName(stdout);
1122
+ if (stdoutField !== void 0 && stderr !== void 0) {
1123
+ if (captureDestinationFieldName(stderr) === stdoutField) {
1124
+ context.addIssue({
1125
+ code: "custom",
1126
+ path: ["nodes", index, "run", "capture", "stderr"],
1127
+ message: duplicateCaptureDestinationMessage(node.run.kind, node.id, stdoutField)
1128
+ });
1129
+ }
1130
+ }
1087
1131
  }
1088
1132
  }
1089
1133
  if (flow.entry !== void 0 && !nodeIds.has(flow.entry)) {
@@ -1209,6 +1253,7 @@ var FlowDefinitionSchema = FlowDefinitionObjectSchema.superRefine((flow, context
1209
1253
  }
1210
1254
  }
1211
1255
  validateClassifierRules(flow, context);
1256
+ validateConsumedOutputSchemasCompile(flow, context);
1212
1257
  const state = /* @__PURE__ */ new Map();
1213
1258
  for (const nodeId of nodeIds) {
1214
1259
  if (state.has(nodeId)) continue;
@@ -1233,6 +1278,31 @@ var FlowDefinitionSchema = FlowDefinitionObjectSchema.superRefine((flow, context
1233
1278
  }
1234
1279
  }
1235
1280
  });
1281
+ function validateConsumedOutputSchemasCompile(flow, context) {
1282
+ for (const [nodeIndex, node] of flow.nodes.entries()) {
1283
+ const fields = node.contract?.output?.fields;
1284
+ if (!fields) continue;
1285
+ let compileError;
1286
+ try {
1287
+ compileOutputFieldsSchema(fields);
1288
+ continue;
1289
+ } catch (error) {
1290
+ compileError = error;
1291
+ }
1292
+ let consumed;
1293
+ try {
1294
+ consumed = getConsumedOutputSchema(flow, node.id) !== void 0;
1295
+ } catch {
1296
+ continue;
1297
+ }
1298
+ if (!consumed) continue;
1299
+ context.addIssue({
1300
+ code: "custom",
1301
+ path: ["nodes", nodeIndex, "contract", "output", "fields"],
1302
+ message: `node ${node.id} contract.output.fields: ${invalidOutputFieldsSchemaMessage(compileError)}`
1303
+ });
1304
+ }
1305
+ }
1236
1306
  var ORDERING_OPERATORS = /* @__PURE__ */ new Set(["<", "<=", ">", ">="]);
1237
1307
  function validateClassifierRules(flow, context) {
1238
1308
  const classifierIds = /* @__PURE__ */ new Set();
@@ -1331,6 +1401,6 @@ function validateClassifierRules(flow, context) {
1331
1401
  }
1332
1402
  }
1333
1403
 
1334
- export { FLOW_CAPTURE_CHANNELS, FLOW_CAPTURE_DESTINATION_PATTERN, FLOW_EXPRESSION_LIMITS, FlowDefinitionSchema, FlowExpressionError, InputSchema, RESERVED_CLASSIFIER_FIELDS, captureDestinationFieldName, checkClassifierShape, classifierDecision, collectFlowBindingExpressions, declaresReservedClassifierField, evaluate, evaluateFlowExpression, hasConstantlyFalsePrecondition, inspectFlowExpression, inspectFlowExpressionComparisons, invalidCaptureDestinationMessage, parseFlowDefinitionStructure, resolveFlowBindings, stableFlowJson, withoutReservedClassifierFields };
1335
- //# sourceMappingURL=chunk-KPRZHEEI.js.map
1336
- //# sourceMappingURL=chunk-KPRZHEEI.js.map
1404
+ export { FLOW_CAPTURE_CHANNELS, FLOW_CAPTURE_DESTINATION_PATTERN, FLOW_EXPRESSION_LIMITS, FlowDefinitionSchema, FlowExpressionError, InputSchema, RESERVED_CLASSIFIER_FIELDS, captureDestinationFieldName, checkClassifierShape, classifierDecision, compileOutputFieldsSchema, declaresReservedClassifierField, duplicateCaptureDestinationMessage, evaluate, evaluateFlowExpression, getConsumedOutputSchema, hasConstantlyFalsePrecondition, inspectFlowExpressionComparisons, invalidCaptureDestinationMessage, invalidOutputFieldsSchemaMessage, parseFlowDefinitionStructure, resolveFlowBindings, stableFlowJson, withoutReservedClassifierFields };
1405
+ //# sourceMappingURL=chunk-ORH2BZEM.js.map
1406
+ //# sourceMappingURL=chunk-ORH2BZEM.js.map