@skaile/workspaces 1.15.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +271 -0
- package/dist/{asset-feeds-MWEMXMZA.js → asset-feeds-7VQVISDI.js} +25 -24
- package/dist/asset-feeds-7VQVISDI.js.map +1 -0
- package/dist/asset-manager/catalog-deployer.js +13 -1
- package/dist/asset-manager/index.js +10 -9
- package/dist/asset-manager/installer.js +7 -6
- package/dist/asset-manager/src/catalog-deployer.d.ts +70 -5
- package/dist/asset-manager/src/catalog-deployer.d.ts.map +1 -1
- package/dist/asset-manager/src/index.d.ts +22 -17
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/bridge/drivers/claude-sdk.js +108 -56
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +3 -2
- package/dist/bridge/drivers/codex.js.map +1 -1
- package/dist/bridge/drivers/continue.js +4 -3
- package/dist/bridge/drivers/continue.js.map +1 -1
- package/dist/bridge/drivers/echo.js +3 -2
- package/dist/bridge/drivers/echo.js.map +1 -1
- package/dist/bridge/drivers/gemini.js +5 -4
- package/dist/bridge/drivers/goose.js +4 -3
- package/dist/bridge/drivers/goose.js.map +1 -1
- package/dist/bridge/drivers/omp.js +3 -2
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +4 -3
- package/dist/bridge/drivers/opencode.js.map +1 -1
- package/dist/bridge/drivers/qwen.js +5 -4
- package/dist/bridge/drivers/qwen.js.map +1 -1
- package/dist/bridge/index.js +4 -3
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/scrub-transcript.d.ts +21 -1
- package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +1 -1
- package/dist/{chunk-344DEXZS.js → chunk-35ELAMQ5.js} +4 -4
- package/dist/{chunk-344DEXZS.js.map → chunk-35ELAMQ5.js.map} +1 -1
- package/dist/{chunk-73HV7RV3.js → chunk-6FJH63NN.js} +4 -4
- package/dist/{chunk-73HV7RV3.js.map → chunk-6FJH63NN.js.map} +1 -1
- package/dist/{chunk-ISA7R7PK.js → chunk-72EOJJOM.js} +82 -38
- package/dist/chunk-72EOJJOM.js.map +1 -0
- package/dist/chunk-7GOCNYUV.js +300 -0
- package/dist/chunk-7GOCNYUV.js.map +1 -0
- package/dist/{chunk-TFIFNDT2.js → chunk-A5OYCQGT.js} +4 -4
- package/dist/{chunk-TFIFNDT2.js.map → chunk-A5OYCQGT.js.map} +1 -1
- package/dist/{chunk-KY5NY7LB.js → chunk-BCTU4TN7.js} +11 -11
- package/dist/chunk-BCTU4TN7.js.map +1 -0
- package/dist/chunk-BEAIJRVF.js +159 -0
- package/dist/chunk-BEAIJRVF.js.map +1 -0
- package/dist/chunk-BK3WL3QK.js +10 -0
- package/dist/chunk-BK3WL3QK.js.map +1 -0
- package/dist/{chunk-BI2NKPA4.js → chunk-CA5CWLGN.js} +3 -2
- package/dist/chunk-CA5CWLGN.js.map +1 -0
- package/dist/{chunk-2TSSCHCQ.js → chunk-CKVIN4H3.js} +5 -5
- package/dist/{chunk-2TSSCHCQ.js.map → chunk-CKVIN4H3.js.map} +1 -1
- package/dist/{chunk-GXC3TYMQ.js → chunk-CZZRDYT4.js} +70 -32
- package/dist/chunk-CZZRDYT4.js.map +1 -0
- package/dist/{chunk-MNKUZUN2.js → chunk-DRXDEL3A.js} +3 -3
- package/dist/{chunk-MNKUZUN2.js.map → chunk-DRXDEL3A.js.map} +1 -1
- package/dist/{chunk-Z6NGK5YC.js → chunk-DY2AK577.js} +3 -3
- package/dist/{chunk-Z6NGK5YC.js.map → chunk-DY2AK577.js.map} +1 -1
- package/dist/chunk-DYMWJAL4.js +552 -0
- package/dist/chunk-DYMWJAL4.js.map +1 -0
- package/dist/{chunk-ACXLKNIM.js → chunk-E7HKNQTH.js} +10 -4
- package/dist/chunk-E7HKNQTH.js.map +1 -0
- package/dist/{chunk-O5VCUU6D.js → chunk-KUZEIKZH.js} +4 -4
- package/dist/{chunk-O5VCUU6D.js.map → chunk-KUZEIKZH.js.map} +1 -1
- package/dist/{chunk-RADBQ5XJ.js → chunk-KYLWY3A7.js} +10 -10
- package/dist/{chunk-RADBQ5XJ.js.map → chunk-KYLWY3A7.js.map} +1 -1
- package/dist/{chunk-2BQBWWFX.js → chunk-LBZP2IYG.js} +6 -6
- package/dist/chunk-LBZP2IYG.js.map +1 -0
- package/dist/{chunk-MZV6WCF3.js → chunk-MAN7AGQJ.js} +3 -3
- package/dist/{chunk-MZV6WCF3.js.map → chunk-MAN7AGQJ.js.map} +1 -1
- package/dist/{chunk-7J7LQP6T.js → chunk-MMD2KQ3A.js} +31 -19
- package/dist/chunk-MMD2KQ3A.js.map +1 -0
- package/dist/{chunk-NRXVS7E4.js → chunk-NYCJ7B27.js} +19 -11
- package/dist/chunk-NYCJ7B27.js.map +1 -0
- package/dist/{chunk-ACWCVB5Q.js → chunk-ORZW7MMO.js} +3 -3
- package/dist/{chunk-ACWCVB5Q.js.map → chunk-ORZW7MMO.js.map} +1 -1
- package/dist/{chunk-M5GJT3D7.js → chunk-OYX22NJL.js} +3 -3
- package/dist/{chunk-M5GJT3D7.js.map → chunk-OYX22NJL.js.map} +1 -1
- package/dist/{chunk-MJEUK6VJ.js → chunk-QIQTYN7F.js} +3 -3
- package/dist/{chunk-MJEUK6VJ.js.map → chunk-QIQTYN7F.js.map} +1 -1
- package/dist/{chunk-2IJFUAZB.js → chunk-RK3HU3H3.js} +123 -18
- package/dist/chunk-RK3HU3H3.js.map +1 -0
- package/dist/{chunk-5NZ56R63.js → chunk-ST3DLLNZ.js} +18 -6
- package/dist/chunk-ST3DLLNZ.js.map +1 -0
- package/dist/{chunk-MTM6C7IS.js → chunk-SVL4EZJT.js} +463 -251
- package/dist/chunk-SVL4EZJT.js.map +1 -0
- package/dist/{chunk-JB35MVBN.js → chunk-U5POE4BA.js} +4 -298
- package/dist/chunk-U5POE4BA.js.map +1 -0
- package/dist/{chunk-DB264AVQ.js → chunk-UAQVFATZ.js} +8 -8
- package/dist/{chunk-DB264AVQ.js.map → chunk-UAQVFATZ.js.map} +1 -1
- package/dist/{chunk-DPUZJI45.js → chunk-UVW3R6S7.js} +72 -37
- package/dist/chunk-UVW3R6S7.js.map +1 -0
- package/dist/{chunk-STQOPWPS.js → chunk-VCU4NPUS.js} +4 -4
- package/dist/{chunk-STQOPWPS.js.map → chunk-VCU4NPUS.js.map} +1 -1
- package/dist/{chunk-MB6563TL.js → chunk-WCWXDW22.js} +3 -3
- package/dist/{chunk-MB6563TL.js.map → chunk-WCWXDW22.js.map} +1 -1
- package/dist/{chunk-EKGB4ZWR.js → chunk-WZPADAE7.js} +255 -136
- package/dist/chunk-WZPADAE7.js.map +1 -0
- package/dist/{chunk-SRWIVMJI.js → chunk-Y3JVBJ3Y.js} +5 -5
- package/dist/{chunk-SRWIVMJI.js.map → chunk-Y3JVBJ3Y.js.map} +1 -1
- package/dist/{chunk-3EBFDMZC.js → chunk-Y662DNQQ.js} +14 -3
- package/dist/chunk-Y662DNQQ.js.map +1 -0
- package/dist/cli/index.js +348 -128
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/asset-feeds.d.ts +2 -2
- package/dist/cli/src/asset-feeds.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +51 -2
- package/dist/cli/src/commands/catalog.d.ts.map +1 -1
- package/dist/cli/src/commands/connector.d.ts +1 -1
- package/dist/cli/src/commands/connector.d.ts.map +1 -1
- package/dist/cli/src/commands/logs.d.ts.map +1 -1
- package/dist/cli/src/commands/manage.d.ts +30 -3
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts +5 -2
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/connectors/config.js +7 -6
- package/dist/connectors/index.js +9 -8
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
- package/dist/connectors/src/watcher.d.ts.map +1 -1
- package/dist/connectors/src/worktree.d.ts +20 -2
- package/dist/connectors/src/worktree.d.ts.map +1 -1
- package/dist/core/index.js +6 -5
- package/dist/core/logging.js +2 -1
- package/dist/core/manifest.js +2 -1
- package/dist/core/runtime-assets.js +4 -3
- package/dist/core/src/fs-deadline.d.ts +84 -0
- package/dist/core/src/fs-deadline.d.ts.map +1 -0
- package/dist/core/src/index.d.ts +4 -3
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +142 -18
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts +2 -2
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/runtime-assets.d.ts.map +1 -1
- package/dist/core/src/subprocess.d.ts +33 -1
- package/dist/core/src/subprocess.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts +1 -1
- package/dist/core/src/walker.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +9 -2
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +3 -2
- package/dist/deploy/index.js +12 -7
- package/dist/deploy/index.js.map +1 -1
- package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
- package/dist/discovery/index.js +3 -2
- package/dist/{ensure-sources-QGL44IRI.js → ensure-sources-JLVHHZI2.js} +13 -12
- package/dist/ensure-sources-JLVHHZI2.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +9 -8
- package/dist/factory-assets/connectors/deploy/CONNECTOR.md +19 -0
- package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/deploy.js +9 -8
- package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/devserver.js +9 -8
- package/dist/factory-assets/connectors/flow/CONNECTOR.md +3 -1
- package/dist/factory-assets/connectors/flow/adapter.d.ts +2 -1
- package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/adapter.js +9 -8
- package/dist/factory-assets/connectors/flow/engine.js +6 -5
- package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +9 -2
- package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/prompt-fragments.js +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +11 -10
- package/dist/factory-assets/connectors/flow.js +9 -8
- package/dist/factory-assets/connectors/git/driver.d.ts +12 -1
- package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
- package/dist/factory-assets/connectors/git.js +9 -8
- package/dist/factory-assets/connectors/gmail.js +9 -8
- package/dist/factory-assets/connectors/googledrive.js +9 -8
- package/dist/factory-assets/connectors/local/driver.d.ts +25 -1
- package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -1
- package/dist/factory-assets/connectors/local.js +9 -8
- package/dist/factory-assets/connectors/mattermost.js +9 -8
- package/dist/factory-assets/connectors/memory.js +9 -8
- package/dist/factory-assets/connectors/minio.js +9 -8
- package/dist/factory-assets/connectors/postgres.js +9 -8
- package/dist/factory-assets/connectors/s3/driver.d.ts +15 -0
- package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -1
- package/dist/factory-assets/connectors/s3.js +9 -8
- package/dist/factory-assets/connectors/sharepoint.js +9 -8
- package/dist/factory-assets/connectors/sqlite/adapter.d.ts +8 -1
- package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/sqlite.js +9 -8
- package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/static-server.js +9 -8
- package/dist/factory-assets/connectors/tunnel.js +9 -8
- package/dist/factory-assets/connectors/webdav.js +9 -8
- package/dist/factory-assets/connectors/xstate/adapter.d.ts +6 -0
- package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/xstate-store.js +9 -8
- package/dist/factory-assets/connectors/xstate.js +9 -8
- package/dist/flows-LV5WYJ2I.js +20 -0
- package/dist/{flows-FHWBCLXF.js.map → flows-LV5WYJ2I.js.map} +1 -1
- package/dist/{helpers-FMWODXTW.js → helpers-PJ3CPUUL.js} +13 -12
- package/dist/{helpers-FMWODXTW.js.map → helpers-PJ3CPUUL.js.map} +1 -1
- package/dist/library/index.js +8 -7
- package/dist/library/install.js +6 -5
- package/dist/{library-publish-7YDHQGBN.js → library-publish-HVZRCE3C.js} +16 -15
- package/dist/library-publish-HVZRCE3C.js.map +1 -0
- package/dist/{open-library-O6T3ELPK.js → open-library-RMI2FTQ4.js} +14 -13
- package/dist/{open-library-O6T3ELPK.js.map → open-library-RMI2FTQ4.js.map} +1 -1
- package/dist/{paths-5QJJBAND.js → paths-JSVTQAVW.js} +11 -10
- package/dist/{paths-5QJJBAND.js.map → paths-JSVTQAVW.js.map} +1 -1
- package/dist/plugin-registry/src/deploy-helpers.d.ts +1 -1
- package/dist/{plugin-store-ZBJZ7F6D.js → plugin-store-7TVJB2TS.js} +8 -7
- package/dist/plugin-store-7TVJB2TS.js.map +1 -0
- package/dist/{project-HAMLHLD5.js → project-P636MSYT.js} +14 -13
- package/dist/{project-HAMLHLD5.js.map → project-P636MSYT.js.map} +1 -1
- package/dist/resolver/index.js +13 -1
- package/dist/resolver/src/types.d.ts +7 -0
- package/dist/resolver/src/types.d.ts.map +1 -1
- package/dist/resolver/src/validator.d.ts +8 -1
- package/dist/resolver/src/validator.d.ts.map +1 -1
- package/dist/runner/index.js +14 -13
- package/dist/runner/src/external-mcp.d.ts +1 -1
- package/dist/runner/src/external-mcp.d.ts.map +1 -1
- package/dist/runner/src/mcp-prompt.d.ts +7 -3
- package/dist/runner/src/mcp-prompt.d.ts.map +1 -1
- package/dist/runner/src/mcp-runtime-handlers.d.ts +12 -0
- package/dist/runner/src/mcp-runtime-handlers.d.ts.map +1 -1
- package/dist/runner/src/mixin-resolver.d.ts.map +1 -1
- package/dist/runner/src/recipe-resolver.d.ts +20 -6
- package/dist/runner/src/recipe-resolver.d.ts.map +1 -1
- package/dist/runner/src/resource-handler.d.ts +43 -0
- package/dist/runner/src/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/resources.d.ts +12 -5
- package/dist/runner/src/resources.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts +5 -5
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +9 -0
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/runner/src/session-capability-wiring.d.ts +5 -0
- package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
- package/dist/runner/src/workspace-migration.d.ts +37 -3
- package/dist/runner/src/workspace-migration.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +10 -9
- package/dist/sdk/bridge.js +4 -3
- package/dist/sdk/core.js +6 -5
- package/dist/sdk/flow.js +6 -5
- package/dist/sdk/index.js +14 -13
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +13 -1
- package/dist/sdk/runner.js +14 -13
- package/dist/sdk/session.js +1 -1
- package/dist/sdk/store.js +1 -1
- package/dist/session/index.js +1 -1
- package/dist/session/src/dispatcher.d.ts.map +1 -1
- package/dist/{setup-WJPNUE32.js → setup-OYW3W3XK.js} +10 -9
- package/dist/setup-OYW3W3XK.js.map +1 -0
- package/dist/skills-QY5PHBD3.js +20 -0
- package/dist/{skills-BMI6H7HI.js.map → skills-QY5PHBD3.js.map} +1 -1
- package/dist/{source-ITDH4367.js → source-63CHWDC2.js} +15 -14
- package/dist/{source-ITDH4367.js.map → source-63CHWDC2.js.map} +1 -1
- package/dist/{source-manifest-publish-RMHC7R6M.js → source-manifest-publish-DLASGDK5.js} +17 -16
- package/dist/source-manifest-publish-DLASGDK5.js.map +1 -0
- package/dist/store/index.js +1 -1
- package/dist/store/src/store.d.ts +9 -0
- package/dist/store/src/store.d.ts.map +1 -1
- package/dist/tui/index.js +14 -13
- package/dist/tui/index.js.map +1 -1
- package/dist/validator-RN64BKFW.js +5 -0
- package/dist/{validator-VF5M764T.js.map → validator-RN64BKFW.js.map} +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +18 -5
- package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
- package/dist/workspace-plugin/adapters/omp.js +10 -10
- package/dist/workspace-plugin/index.js +3 -2
- package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
- package/dist/workspace-plugin/src/utils/ai-assets.d.ts +11 -6
- package/dist/workspace-plugin/src/utils/ai-assets.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/asset-feeds-MWEMXMZA.js.map +0 -1
- package/dist/chunk-2BQBWWFX.js.map +0 -1
- package/dist/chunk-2IJFUAZB.js.map +0 -1
- package/dist/chunk-3EBFDMZC.js.map +0 -1
- package/dist/chunk-5NZ56R63.js.map +0 -1
- package/dist/chunk-7J7LQP6T.js.map +0 -1
- package/dist/chunk-ACXLKNIM.js.map +0 -1
- package/dist/chunk-BI2NKPA4.js.map +0 -1
- package/dist/chunk-BQCGFPHW.js +0 -345
- package/dist/chunk-BQCGFPHW.js.map +0 -1
- package/dist/chunk-DPUZJI45.js.map +0 -1
- package/dist/chunk-EKGB4ZWR.js.map +0 -1
- package/dist/chunk-GXC3TYMQ.js.map +0 -1
- package/dist/chunk-ISA7R7PK.js.map +0 -1
- package/dist/chunk-JB35MVBN.js.map +0 -1
- package/dist/chunk-KY5NY7LB.js.map +0 -1
- package/dist/chunk-LV2HPH3C.js +0 -73
- package/dist/chunk-LV2HPH3C.js.map +0 -1
- package/dist/chunk-MTM6C7IS.js.map +0 -1
- package/dist/chunk-NRXVS7E4.js.map +0 -1
- package/dist/chunk-XCBG2KDC.js +0 -23
- package/dist/chunk-XCBG2KDC.js.map +0 -1
- package/dist/ensure-sources-QGL44IRI.js.map +0 -1
- package/dist/flows-FHWBCLXF.js +0 -7
- package/dist/library-publish-7YDHQGBN.js.map +0 -1
- package/dist/plugin-store-ZBJZ7F6D.js.map +0 -1
- package/dist/setup-WJPNUE32.js.map +0 -1
- package/dist/skills-BMI6H7HI.js +0 -7
- package/dist/source-manifest-publish-RMHC7R6M.js.map +0 -1
- package/dist/validator-VF5M764T.js +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/drivers/omp.ts"],"names":[],"mappings":"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","file":"omp.js","sourcesContent":["import { type ChildProcess, execFile, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport { type AgentConfig, AgentDriver, type AgentError, type DriverInfo } from \"../types.js\";\n\n/**\n * Build the explicit env whitelist forwarded to the omp child process.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment. PATH / HOME / USER / HOSTNAME\n * are required for omp to function; the API key passes through so omp\n * can authenticate against the LLM; any `PI_*` keys are app-specific\n * config the host operator may have set explicitly.\n *\n * Test seams (`OMP_BRIDGE_*`, `FAKE_OMP_*`) are passed through so the\n * subprocess harness in `tests/omp-driver.test.ts` can drive a fake-omp\n * script via env-driven mode flags.\n *\n * @docLink packages/bridge/concepts#omp-env-whitelist\n */\nfunction buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\"ANTHROPIC_API_KEY\", \"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\"];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(\"PI_\") || key.startsWith(\"OMP_BRIDGE_\") || key.startsWith(\"FAKE_OMP_\")) {\n out[key] = value;\n }\n }\n return out;\n}\n\ninterface OmpEvent {\n type: string;\n data?: unknown;\n id?: string;\n success?: boolean;\n error?: string;\n message?: OmpMessage;\n [key: string]: unknown;\n}\n\ninterface OmpMessage {\n role?: string;\n content?: string | OmpContentBlock[];\n}\n\ninterface OmpContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\n/**\n * Agent driver for the oh-my-pi (omp) coding agent.\n *\n * Spawns `omp --mode rpc` as a child process and communicates via newline-delimited\n * JSON-RPC over stdin/stdout. Model-agnostic: supports any LLM provider.\n *\n * @see https://github.com/can1357/oh-my-pi\n *\n * @remarks\n * **Session persistence** — omp writes JSONL session files to `<cwd>/.omp/sessions/`\n * (via `--session-dir`). After each turn (`agent_end`), sends a `get_state` RPC to\n * capture the native session ID and emits a `session_info` event so the forge layer\n * can persist it. On the next spawn, callers pass `resumeSessionId` to restore omp's\n * native context.\n *\n * **stderrBuffer** — collects the last 20 lines of stderr so they can be appended to\n * crash error messages for diagnostics without blocking the stdout readline loop.\n *\n * **systemPrompt injection** — omp does not accept a system prompt string directly.\n * The driver writes `AgentConfig.systemPrompt` to `<cwd>/.omp/system.md` and passes\n * the path via `--append-system-prompt` before spawning.\n *\n * **agentDir** — maps to the `PI_CODING_AGENT_DIR` environment variable. omp reads the\n * GitAgent directory at this path natively (agent.yaml, SOUL.md, RULES.md, knowledge/).\n *\n * @docLink packages/bridge/drivers#omp-driver\n */\nexport class OmpDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"omp\");\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private reqId = 0;\n private config: AgentConfig;\n private ready = false;\n private startPromise: Promise<void> | null = null;\n private stderrBuffer: string[] = [];\n private prevText = \"\";\n /** OMP session ID captured via `get_state` after each turn. */\n private _ompSessionId?: string;\n /** Per-turn settlement handlers; non-null only while a prompt is in flight. */\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\n\n override get runtimeSessionId(): string | undefined {\n return this._ompSessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n /**\n * @param config - Driver configuration. omp-relevant fields:\n * - `cwd` — working directory; omp session files are stored under `<cwd>/.omp/sessions/`.\n * - `model` / `provider` — forwarded as `--model [provider/]model`.\n * - `systemPrompt` — written to `<cwd>/.omp/system.md` and appended via `--append-system-prompt`.\n * - `agentDir` — sets `PI_CODING_AGENT_DIR`; omp reads agent identity from this directory.\n * - `sshKeyPath` — injected as `GIT_SSH_COMMAND` for authenticated git operations.\n * - `resumeSessionId` — omp session UUID to restore via `--session <id>`.\n */\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n public async start(): Promise<void> {\n if (this.proc) return;\n if (this.startPromise) return this.startPromise;\n this.startPromise = this._start();\n return this.startPromise;\n }\n\n private async _start(): Promise<void> {\n const args = [\"--mode\", \"rpc\"];\n\n // ── Session persistence ───────────────────────────────────────────────────\n // Store OMP session files in <cwd>/.omp/sessions/ so they survive process\n // restarts. The caller passes resumeSessionId to restore a prior session.\n const sessionDir = path.join(this.config.cwd, \".omp\", \"sessions\");\n await fs.mkdir(sessionDir, { recursive: true });\n args.push(\"--session-dir\", sessionDir);\n\n if (this.config.resumeSessionId) {\n this.log.info(\"resuming OMP session\", { sessionId: this.config.resumeSessionId });\n args.push(\"--session\", this.config.resumeSessionId);\n }\n\n if (this.config.model) {\n const modelArg = this.config.provider\n ? `${this.config.provider}/${this.config.model}`\n : this.config.model;\n args.push(\"--model\", modelArg);\n }\n\n // ── System prompt injection ───────────────────────────────────────────────\n // omp does not accept a system prompt string directly; it reads from a file.\n // We write it to .omp/system.md (inside the project cwd) and pass the path\n // via --append-system-prompt. This file is overwritten on each driver start.\n //\n // In flow mode (factory-assets/connectors/flow/run-flow.ts conductFlow), systemPrompt carries the full agent\n // identity (SOUL + RULES + knowledge + connector docs) because no agentDir is set.\n // In REPL mode (agent.ts buildDriver), systemPrompt carries only connector docs\n // because PI_CODING_AGENT_DIR already gives omp the full agent identity.\n if (this.config.systemPrompt) {\n const ompDir = path.join(this.config.cwd, \".omp\");\n await fs.mkdir(ompDir, { recursive: true });\n const systemFile = path.join(ompDir, \"system.md\");\n await fs.writeFile(systemFile, this.config.systemPrompt);\n args.push(\"--append-system-prompt\", systemFile);\n }\n\n // Explicit env whitelist for the omp child process. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned subprocess. `this.config.env`, when\n // supplied, fully overrides the whitelist (used by tests + advanced\n // callers).\n const env: Record<string, string> = this.config.env\n ? { ...(this.config.env as Record<string, string>) }\n : buildOmpChildEnv(process.env);\n // ── Main-agent handoff ────────────────────────────────────────────────────\n // PI_CODING_AGENT_DIR is the omp equivalent of `claude --agent <name>`.\n // omp reads the GitAgent directory at this path natively: agent.yaml for the\n // manifest, SOUL.md for identity, RULES.md for constraints, knowledge/ for domain\n // context. The path may be the source directory (agentDir in REPL mode) or a\n // rendered copy installed by ompRenderer under .omp/agents/<name>/.\n // Unlike the claude-sdk path, no prior `skaile install` is required for REPL mode\n // because omp reads the source directory directly via this env variable.\n if (this.config.agentDir) {\n env.PI_CODING_AGENT_DIR = this.config.agentDir;\n }\n if (this.config.sshKeyPath) {\n env.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n\n // test-only: `OMP_BRIDGE_BIN` overrides the binary name and `OMP_BRIDGE_PREARGS`\n // (space-delimited) supplies any leading args (e.g. a JS script path when the\n // override binary is `node` or `bun`). Used by the subprocess harness tests in\n // `tests/omp-driver.test.ts` to point spawn at a fake-omp script without\n // monkey-patching `node:child_process`. Both are ignored in production.\n const overrideBin = process.env.OMP_BRIDGE_BIN;\n const overridePreArgs = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n const spawnBin = overrideBin || \"omp\";\n const spawnArgs = overrideBin ? [...overridePreArgs, ...args] : args;\n\n return new Promise<void>((resolve, reject) => {\n this.log.info(\"spawning omp\", {\n bin: spawnBin,\n args: spawnArgs,\n cwd: this.config.cwd,\n });\n if (env.PI_CODING_AGENT_DIR)\n this.log.debug(\"env: PI_CODING_AGENT_DIR set\", { value: env.PI_CODING_AGENT_DIR });\n if (env.GIT_SSH_COMMAND) this.log.debug(\"env: GIT_SSH_COMMAND set\");\n\n // Cast to ChildProcess: spawn infers ChildProcessWithoutNullStreams for\n // pipe stdio, but bun-types doesn't expose EventEmitter.on on that subtype.\n const proc = spawn(spawnBin, spawnArgs, {\n cwd: this.config.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n // bun-types 1.3.11 omits EventEmitter.on from ChildProcess; cast to subscribe.\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"process error\", err, { detail });\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n if (!this.ready) reject(err);\n // Settle any in-flight turn so a process-level error cannot hang prompt().\n this.rejectTurn(Object.assign(new Error(detail.message), { detail }));\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const crashed = code !== null && code !== 0;\n if (crashed) {\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${lastStderr}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint:\n lastStderr || \"The agent process exited unexpectedly. Try sending your prompt again.\",\n };\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n this.cleanup();\n // Settle any in-flight turn: an exit before `agent_end` means the turn\n // can never complete normally, so reject rather than leak a pending promise.\n this.rejectTurn(\n new Error(\n crashed\n ? `omp process crashed (exit code ${code})`\n : `omp process exited before the turn completed${signal ? ` (signal ${signal})` : \"\"}`,\n ),\n );\n this.emit(\"exit\", { code, signal });\n });\n\n if (proc.stdout) {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n // bun-types 1.3.11 omits EventEmitter.on from readline.Interface; cast to subscribe.\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => {\n if (!line.trim()) return;\n try {\n const event: OmpEvent = JSON.parse(line);\n this.handleEvent(event);\n } catch {\n this.log.debug(\"stdout\", { line });\n }\n });\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.warn(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n const startTime = Date.now();\n const readyTimeout = setTimeout(() => {\n if (!this.ready) {\n this.log.warn(\"ready timeout, proceeding\", { timeoutMs: 5000 });\n this.ready = true;\n resolve();\n }\n }, 5000);\n\n this.once(\"ready\", () => {\n clearTimeout(readyTimeout);\n if (!this.ready) {\n this.log.info(\"process ready\", { elapsedMs: Date.now() - startTime });\n this.ready = true;\n resolve();\n }\n });\n });\n }\n\n private extractMessageText(msg: OmpMessage): string {\n if (!msg) return \"\";\n const c = msg.content;\n if (typeof c === \"string\") return c;\n if (Array.isArray(c))\n return c\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text)\n .join(\"\");\n return \"\";\n }\n\n private handleEvent(event: OmpEvent) {\n if (event.type === \"ready\") {\n this.emit(\"ready\");\n return;\n }\n if (event.type === \"response\") {\n if (!event.success && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { type: \"error\", error: event.error, detail });\n }\n this.emit(`response:${event.id}`, event);\n return;\n }\n if (event.type === \"error\" && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { ...event, detail });\n return;\n }\n // Compute text delta for message_update events\n if (event.type === \"message_update\" && event.message) {\n const text = this.extractMessageText(event.message);\n let delta = \"\";\n if (text.startsWith(this.prevText)) {\n delta = text.slice(this.prevText.length);\n } else {\n // Content restructured (e.g. thinking blocks changed) — emit full text as delta\n delta = text;\n }\n this.prevText = text;\n this.emit(\"agent-event\", { ...event, _textDelta: delta });\n return;\n }\n // Reset delta tracking on message boundaries\n if (\n event.type === \"message_start\" ||\n event.type === \"message_end\" ||\n event.type === \"agent_end\"\n ) {\n this.prevText = \"\";\n }\n // After each turn ends, capture the OMP session ID so callers can persist it\n // and pass it as resumeSessionId on the next spawn.\n if (event.type === \"agent_end\") {\n void this.captureSessionId();\n }\n this.emit(\"agent-event\", event);\n // Resolve AFTER emitting so listeners observing the turn see `agent_end`\n // before the caller's `prompt()` await unblocks.\n if (event.type === \"agent_end\") {\n this.resolveTurn();\n }\n }\n\n /**\n * Resolve the in-flight prompt turn (on `agent_end`). Idempotent — a turn\n * settles at most once, so a stray second `agent_end` is harmless.\n */\n private resolveTurn(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n /**\n * Reject the in-flight prompt turn (process crash/error). Settling here keeps\n * `prompt()` from hanging forever when the child dies before `agent_end`.\n */\n private rejectTurn(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\n }\n\n /**\n * Query OMP for the current session ID via `get_state` RPC.\n * Emits a `session_info` event on success so the forge layer can persist the ID.\n * Failures are silently swallowed — session tracking is best-effort.\n */\n private async captureSessionId(): Promise<void> {\n try {\n const id = this.nextId();\n const response = await new Promise<OmpEvent>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(\"get_state timeout\")), 5000);\n this.once(`response:${id}`, (resp: OmpEvent) => {\n clearTimeout(timer);\n resolve(resp);\n });\n try {\n this.send({ id, type: \"get_state\" });\n } catch (err) {\n clearTimeout(timer);\n reject(err);\n }\n });\n\n if (response.success && response.data) {\n const data = response.data as Record<string, unknown>;\n const sessionId = data.sessionId as string | undefined;\n const sessionFile = data.sessionFile as string | undefined;\n if (sessionId) {\n this._ompSessionId = sessionId;\n this.log.debug(\"omp session id assigned\", { sessionId });\n this.emit(\"agent-event\", {\n type: \"session_info\",\n driverSessionId: sessionId,\n ...(sessionFile ? { sessionFile } : {}),\n });\n }\n }\n } catch {\n // get_state is best-effort — OMP may not support it yet or the process\n // may have exited. The short-term history injection fallback still works.\n }\n }\n\n private nextId(): string {\n return `req-${++this.reqId}`;\n }\n\n private send(msg: object): void {\n if (!this.proc?.stdin?.writable) {\n const detail: AgentError = {\n message: \"omp process not running\",\n category: \"process\",\n retryable: true,\n hint: \"The agent process is not available. It will restart automatically on the next prompt.\",\n };\n const err = Object.assign(new Error(detail.message), { detail });\n throw err;\n }\n this.proc.stdin.write(`${JSON.stringify(msg)}\\n`);\n }\n\n /**\n * Sends a prompt to the omp process via JSON-RPC and resolves when the turn\n * completes (after the `agent_end` event), honoring the `AgentDriver.prompt`\n * contract so driver-agnostic callers can await turn completion uniformly.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * If the child process errors or exits before `agent_end`, the returned promise\n * rejects rather than hanging.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running, its stdin is closed, or\n * the child crashes/exits before the turn completes.\n */\n public async prompt(message: string): Promise<void> {\n await this.start();\n const id = this.nextId();\n\n // Install the per-turn resolver BEFORE sending: omp can stream a fast\n // `agent_end` on the next readline tick, and if the resolver isn't wired\n // yet that event would be missed and prompt() would hang forever.\n const turnPromise = new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n });\n\n try {\n this.send({ id, type: \"prompt\", message });\n } catch (err) {\n this.turnResolve = null;\n this.turnReject = null;\n throw err;\n }\n\n await turnPromise;\n }\n\n /**\n * Sends an in-band abort RPC to the omp process, requesting it to stop the\n * current turn without terminating the child process.\n *\n * @remarks This is a best-effort signal — omp may not honour the abort\n * immediately. The process remains alive after `abort()`.\n */\n public async abort(): Promise<void> {\n if (!this.proc) return;\n const id = this.nextId();\n this.send({ id, type: \"abort\" });\n }\n\n /** `true` when the omp child process is alive and has not been killed. */\n public get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends SIGTERM to the omp child process and performs cleanup.\n *\n * The driver instance must not be reused after `kill()`. Create a new\n * `OmpDriver` to start a fresh session.\n */\n kill(): void {\n if (this.proc) {\n this.proc.kill(\"SIGTERM\");\n this.cleanup();\n }\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n await this.start();\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: \"omp command not found\",\n category: \"config\",\n retryable: false,\n hint: \"The omp agent is not installed or not on your PATH. Install it and try again.\",\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: \"Permission denied running omp\",\n category: \"config\",\n retryable: false,\n hint: \"Check file permissions for the omp binary.\",\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: \"An unexpected process error occurred. Try sending your prompt again.\",\n };\n }\n\n private classifyErrorMessage(msg: string): AgentError {\n // Shared keyword buckets live in error-classifier.ts; only the hint copy is omp-specific.\n const generic = classifyGenericErrorMessage(msg);\n if (!generic) return { message: msg, category: \"unknown\", retryable: true };\n\n const lower = msg.toLowerCase();\n const hint =\n generic.category === \"auth\"\n ? \"Check your API key configuration in Settings.\"\n : generic.category === \"rate_limit\"\n ? \"You have hit the provider rate limit. Wait a moment and try again.\"\n : generic.category === \"network\"\n ? \"A network error occurred. Check your connection and try again.\"\n : // model: distinguish unavailable-model from over-long-context.\n lower.includes(\"model\")\n ? \"The selected model is not available. Change the model in settings.\"\n : \"The conversation is too long. Start a new session or choose a model with a larger context window.\";\n return { message: msg, category: generic.category, retryable: generic.retryable, hint };\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return new Promise((resolve, reject) => {\n execFile(\"omp\", [\"--list-models\"], { timeout: 10_000 }, (err, stdout, stderr) => {\n if (err) {\n reject(new Error(`omp --list-models failed: ${stderr || err.message}`));\n return;\n }\n const models: ModelEntry[] = [];\n let inCanonical = false;\n let headerSkipped = false;\n for (const raw of stdout.split(\"\\n\")) {\n const line = raw.trimEnd();\n if (!inCanonical) {\n if (line.startsWith(\"Canonical models\")) inCanonical = true;\n continue;\n }\n if (!headerSkipped) {\n headerSkipped = true;\n continue;\n }\n // blank line or a new section header ends the canonical block\n if (line === \"\" || (!line.startsWith(\" \") && line.endsWith(\"models\"))) break;\n const canonical = line.split(/\\s{2,}/)[0]?.trim();\n if (canonical) models.push({ id: canonical, name: canonical });\n }\n resolve(models);\n });\n });\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n this.ready = false;\n this.startPromise = null;\n this.stderrBuffer = [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the omp driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const ompDriverTarget: DriverTarget<AgentConfig> = {\n id: \"omp\",\n displayName: BUILTIN_DRIVER_CATALOG.omp?.name ?? \"omp (oh-my-pi)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OmpDriver(config),\n listModels: async (apiKeys) =>\n new OmpDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/drivers/omp.ts"],"names":[],"mappings":"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","file":"omp.js","sourcesContent":["import { type ChildProcess, execFile, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport { type AgentConfig, AgentDriver, type AgentError, type DriverInfo } from \"../types.js\";\n\n/**\n * Build the explicit env whitelist forwarded to the omp child process.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment. PATH / HOME / USER / HOSTNAME\n * are required for omp to function; the API key passes through so omp\n * can authenticate against the LLM; any `PI_*` keys are app-specific\n * config the host operator may have set explicitly.\n *\n * Test seams (`OMP_BRIDGE_*`, `FAKE_OMP_*`) are passed through so the\n * subprocess harness in `tests/omp-driver.test.ts` can drive a fake-omp\n * script via env-driven mode flags.\n *\n * @docLink packages/bridge/concepts#omp-env-whitelist\n */\nfunction buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\"ANTHROPIC_API_KEY\", \"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\"];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(\"PI_\") || key.startsWith(\"OMP_BRIDGE_\") || key.startsWith(\"FAKE_OMP_\")) {\n out[key] = value;\n }\n }\n return out;\n}\n\ninterface OmpEvent {\n type: string;\n data?: unknown;\n id?: string;\n success?: boolean;\n error?: string;\n message?: OmpMessage;\n [key: string]: unknown;\n}\n\ninterface OmpMessage {\n role?: string;\n content?: string | OmpContentBlock[];\n}\n\ninterface OmpContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\n/**\n * Agent driver for the oh-my-pi (omp) coding agent.\n *\n * Spawns `omp --mode rpc` as a child process and communicates via newline-delimited\n * JSON-RPC over stdin/stdout. Model-agnostic: supports any LLM provider.\n *\n * @see https://github.com/can1357/oh-my-pi\n *\n * @remarks\n * **Session persistence** — omp writes JSONL session files to `<cwd>/.omp/sessions/`\n * (via `--session-dir`). After each turn (`agent_end`), sends a `get_state` RPC to\n * capture the native session ID and emits a `session_info` event so the forge layer\n * can persist it. On the next spawn, callers pass `resumeSessionId` to restore omp's\n * native context.\n *\n * **stderrBuffer** — collects the last 20 lines of stderr so they can be appended to\n * crash error messages for diagnostics without blocking the stdout readline loop.\n *\n * **systemPrompt injection** — omp does not accept a system prompt string directly.\n * The driver writes `AgentConfig.systemPrompt` to `<cwd>/.omp/system.md` and passes\n * the path via `--append-system-prompt` before spawning.\n *\n * **agentDir** — maps to the `PI_CODING_AGENT_DIR` environment variable. omp reads the\n * GitAgent directory at this path natively (agent.yaml, SOUL.md, RULES.md, knowledge/).\n *\n * @docLink packages/bridge/drivers#omp-driver\n */\nexport class OmpDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"omp\");\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private reqId = 0;\n private config: AgentConfig;\n private ready = false;\n private startPromise: Promise<void> | null = null;\n private stderrBuffer: string[] = [];\n private prevText = \"\";\n /** OMP session ID captured via `get_state` after each turn. */\n private _ompSessionId?: string;\n /** Per-turn settlement handlers; non-null only while a prompt is in flight. */\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\n\n override get runtimeSessionId(): string | undefined {\n return this._ompSessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n /**\n * @param config - Driver configuration. omp-relevant fields:\n * - `cwd` — working directory; omp session files are stored under `<cwd>/.omp/sessions/`.\n * - `model` / `provider` — forwarded as `--model [provider/]model`.\n * - `systemPrompt` — written to `<cwd>/.omp/system.md` and appended via `--append-system-prompt`.\n * - `agentDir` — sets `PI_CODING_AGENT_DIR`; omp reads agent identity from this directory.\n * - `sshKeyPath` — injected as `GIT_SSH_COMMAND` for authenticated git operations.\n * - `resumeSessionId` — omp session UUID to restore via `--session <id>`.\n */\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n public async start(): Promise<void> {\n if (this.proc) return;\n if (this.startPromise) return this.startPromise;\n this.startPromise = this._start();\n return this.startPromise;\n }\n\n private async _start(): Promise<void> {\n const args = [\"--mode\", \"rpc\"];\n\n // ── Session persistence ───────────────────────────────────────────────────\n // Store OMP session files in <cwd>/.omp/sessions/ so they survive process\n // restarts. The caller passes resumeSessionId to restore a prior session.\n const sessionDir = path.join(this.config.cwd, \".omp\", \"sessions\");\n await fs.mkdir(sessionDir, { recursive: true });\n args.push(\"--session-dir\", sessionDir);\n\n if (this.config.resumeSessionId) {\n this.log.info(\"resuming OMP session\", { sessionId: this.config.resumeSessionId });\n args.push(\"--session\", this.config.resumeSessionId);\n }\n\n if (this.config.model) {\n const modelArg = this.config.provider\n ? `${this.config.provider}/${this.config.model}`\n : this.config.model;\n args.push(\"--model\", modelArg);\n }\n\n // ── System prompt injection ───────────────────────────────────────────────\n // omp does not accept a system prompt string directly; it reads from a file.\n // We write it to .omp/system.md (inside the project cwd) and pass the path\n // via --append-system-prompt. This file is overwritten on each driver start.\n //\n // In flow mode (factory-assets/connectors/flow/run-flow.ts conductFlow), systemPrompt carries the full agent\n // identity (SOUL + RULES + knowledge + connector docs) because no agentDir is set.\n // In REPL mode (agent.ts buildDriver), systemPrompt carries only connector docs\n // because PI_CODING_AGENT_DIR already gives omp the full agent identity.\n if (this.config.systemPrompt) {\n const ompDir = path.join(this.config.cwd, \".omp\");\n await fs.mkdir(ompDir, { recursive: true });\n const systemFile = path.join(ompDir, \"system.md\");\n await fs.writeFile(systemFile, this.config.systemPrompt);\n args.push(\"--append-system-prompt\", systemFile);\n }\n\n // Explicit env whitelist for the omp child process. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned subprocess. `this.config.env`, when\n // supplied, fully overrides the whitelist (used by tests + advanced\n // callers).\n const env: Record<string, string> = this.config.env\n ? { ...(this.config.env as Record<string, string>) }\n : buildOmpChildEnv(process.env);\n // ── Main-agent handoff ────────────────────────────────────────────────────\n // PI_CODING_AGENT_DIR is the omp equivalent of `claude --agent <name>`.\n // omp reads the GitAgent directory at this path natively: agent.yaml for the\n // manifest, SOUL.md for identity, RULES.md for constraints, knowledge/ for domain\n // context. The path may be the source directory (agentDir in REPL mode) or a\n // rendered copy installed by ompRenderer under .omp/agents/<name>/.\n // Unlike the claude-sdk path, no prior `skaile install` is required for REPL mode\n // because omp reads the source directory directly via this env variable.\n if (this.config.agentDir) {\n env.PI_CODING_AGENT_DIR = this.config.agentDir;\n }\n if (this.config.sshKeyPath) {\n env.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n\n // test-only: `OMP_BRIDGE_BIN` overrides the binary name and `OMP_BRIDGE_PREARGS`\n // (space-delimited) supplies any leading args (e.g. a JS script path when the\n // override binary is `node` or `bun`). Used by the subprocess harness tests in\n // `tests/omp-driver.test.ts` to point spawn at a fake-omp script without\n // monkey-patching `node:child_process`. Both are ignored in production.\n const overrideBin = process.env.OMP_BRIDGE_BIN;\n const overridePreArgs = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n const spawnBin = overrideBin || \"omp\";\n const spawnArgs = overrideBin ? [...overridePreArgs, ...args] : args;\n\n return new Promise<void>((resolve, reject) => {\n this.log.info(\"spawning omp\", {\n bin: spawnBin,\n args: spawnArgs,\n cwd: this.config.cwd,\n });\n if (env.PI_CODING_AGENT_DIR)\n this.log.debug(\"env: PI_CODING_AGENT_DIR set\", { value: env.PI_CODING_AGENT_DIR });\n if (env.GIT_SSH_COMMAND) this.log.debug(\"env: GIT_SSH_COMMAND set\");\n\n // Cast to ChildProcess: spawn infers ChildProcessWithoutNullStreams for\n // pipe stdio, but bun-types doesn't expose EventEmitter.on on that subtype.\n const proc = spawn(spawnBin, spawnArgs, {\n cwd: this.config.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n // bun-types 1.3.11 omits EventEmitter.on from ChildProcess; cast to subscribe.\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"process error\", err, { detail });\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n if (!this.ready) reject(err);\n // Settle any in-flight turn so a process-level error cannot hang prompt().\n this.rejectTurn(Object.assign(new Error(detail.message), { detail }));\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const crashed = code !== null && code !== 0;\n if (crashed) {\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${lastStderr}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint:\n lastStderr || \"The agent process exited unexpectedly. Try sending your prompt again.\",\n };\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n this.cleanup();\n // Settle any in-flight turn: an exit before `agent_end` means the turn\n // can never complete normally, so reject rather than leak a pending promise.\n this.rejectTurn(\n new Error(\n crashed\n ? `omp process crashed (exit code ${code})`\n : `omp process exited before the turn completed${signal ? ` (signal ${signal})` : \"\"}`,\n ),\n );\n this.emit(\"exit\", { code, signal });\n });\n\n if (proc.stdout) {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n // bun-types 1.3.11 omits EventEmitter.on from readline.Interface; cast to subscribe.\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => {\n if (!line.trim()) return;\n try {\n const event: OmpEvent = JSON.parse(line);\n this.handleEvent(event);\n } catch {\n this.log.debug(\"stdout\", { line });\n }\n });\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.warn(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n const startTime = Date.now();\n const readyTimeout = setTimeout(() => {\n if (!this.ready) {\n this.log.warn(\"ready timeout, proceeding\", { timeoutMs: 5000 });\n this.ready = true;\n resolve();\n }\n }, 5000);\n\n this.once(\"ready\", () => {\n clearTimeout(readyTimeout);\n if (!this.ready) {\n this.log.info(\"process ready\", { elapsedMs: Date.now() - startTime });\n this.ready = true;\n resolve();\n }\n });\n });\n }\n\n private extractMessageText(msg: OmpMessage): string {\n if (!msg) return \"\";\n const c = msg.content;\n if (typeof c === \"string\") return c;\n if (Array.isArray(c))\n return c\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text)\n .join(\"\");\n return \"\";\n }\n\n private handleEvent(event: OmpEvent) {\n if (event.type === \"ready\") {\n this.emit(\"ready\");\n return;\n }\n if (event.type === \"response\") {\n if (!event.success && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { type: \"error\", error: event.error, detail });\n }\n this.emit(`response:${event.id}`, event);\n return;\n }\n if (event.type === \"error\" && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { ...event, detail });\n return;\n }\n // Compute text delta for message_update events\n if (event.type === \"message_update\" && event.message) {\n const text = this.extractMessageText(event.message);\n let delta = \"\";\n if (text.startsWith(this.prevText)) {\n delta = text.slice(this.prevText.length);\n } else {\n // Content restructured (e.g. thinking blocks changed) — emit full text as delta\n delta = text;\n }\n this.prevText = text;\n this.emit(\"agent-event\", { ...event, _textDelta: delta });\n return;\n }\n // Reset delta tracking on message boundaries\n if (\n event.type === \"message_start\" ||\n event.type === \"message_end\" ||\n event.type === \"agent_end\"\n ) {\n this.prevText = \"\";\n }\n // After each turn ends, capture the OMP session ID so callers can persist it\n // and pass it as resumeSessionId on the next spawn.\n if (event.type === \"agent_end\") {\n void this.captureSessionId();\n }\n this.emit(\"agent-event\", event);\n // Resolve AFTER emitting so listeners observing the turn see `agent_end`\n // before the caller's `prompt()` await unblocks.\n if (event.type === \"agent_end\") {\n this.resolveTurn();\n }\n }\n\n /**\n * Resolve the in-flight prompt turn (on `agent_end`). Idempotent — a turn\n * settles at most once, so a stray second `agent_end` is harmless.\n */\n private resolveTurn(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n /**\n * Reject the in-flight prompt turn (process crash/error). Settling here keeps\n * `prompt()` from hanging forever when the child dies before `agent_end`.\n */\n private rejectTurn(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\n }\n\n /**\n * Query OMP for the current session ID via `get_state` RPC.\n * Emits a `session_info` event on success so the forge layer can persist the ID.\n * Failures are silently swallowed — session tracking is best-effort.\n */\n private async captureSessionId(): Promise<void> {\n try {\n const id = this.nextId();\n const response = await new Promise<OmpEvent>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(\"get_state timeout\")), 5000);\n this.once(`response:${id}`, (resp: OmpEvent) => {\n clearTimeout(timer);\n resolve(resp);\n });\n try {\n this.send({ id, type: \"get_state\" });\n } catch (err) {\n clearTimeout(timer);\n reject(err);\n }\n });\n\n if (response.success && response.data) {\n const data = response.data as Record<string, unknown>;\n const sessionId = data.sessionId as string | undefined;\n const sessionFile = data.sessionFile as string | undefined;\n if (sessionId) {\n this._ompSessionId = sessionId;\n this.log.debug(\"omp session id assigned\", { sessionId });\n this.emit(\"agent-event\", {\n type: \"session_info\",\n driverSessionId: sessionId,\n ...(sessionFile ? { sessionFile } : {}),\n });\n }\n }\n } catch {\n // get_state is best-effort — OMP may not support it yet or the process\n // may have exited. The short-term history injection fallback still works.\n }\n }\n\n private nextId(): string {\n return `req-${++this.reqId}`;\n }\n\n private send(msg: object): void {\n if (!this.proc?.stdin?.writable) {\n const detail: AgentError = {\n message: \"omp process not running\",\n category: \"process\",\n retryable: true,\n hint: \"The agent process is not available. It will restart automatically on the next prompt.\",\n };\n const err = Object.assign(new Error(detail.message), { detail });\n throw err;\n }\n this.proc.stdin.write(`${JSON.stringify(msg)}\\n`);\n }\n\n /**\n * Sends a prompt to the omp process via JSON-RPC and resolves when the turn\n * completes (after the `agent_end` event), honoring the `AgentDriver.prompt`\n * contract so driver-agnostic callers can await turn completion uniformly.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * If the child process errors or exits before `agent_end`, the returned promise\n * rejects rather than hanging.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running, its stdin is closed, or\n * the child crashes/exits before the turn completes.\n */\n public async prompt(message: string): Promise<void> {\n await this.start();\n const id = this.nextId();\n\n // Install the per-turn resolver BEFORE sending: omp can stream a fast\n // `agent_end` on the next readline tick, and if the resolver isn't wired\n // yet that event would be missed and prompt() would hang forever.\n const turnPromise = new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n });\n\n try {\n this.send({ id, type: \"prompt\", message });\n } catch (err) {\n this.turnResolve = null;\n this.turnReject = null;\n throw err;\n }\n\n await turnPromise;\n }\n\n /**\n * Sends an in-band abort RPC to the omp process, requesting it to stop the\n * current turn without terminating the child process.\n *\n * @remarks This is a best-effort signal — omp may not honour the abort\n * immediately. The process remains alive after `abort()`.\n */\n public async abort(): Promise<void> {\n if (!this.proc) return;\n const id = this.nextId();\n this.send({ id, type: \"abort\" });\n }\n\n /** `true` when the omp child process is alive and has not been killed. */\n public get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends SIGTERM to the omp child process and performs cleanup.\n *\n * The driver instance must not be reused after `kill()`. Create a new\n * `OmpDriver` to start a fresh session.\n */\n kill(): void {\n if (this.proc) {\n this.proc.kill(\"SIGTERM\");\n this.cleanup();\n }\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n await this.start();\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: \"omp command not found\",\n category: \"config\",\n retryable: false,\n hint: \"The omp agent is not installed or not on your PATH. Install it and try again.\",\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: \"Permission denied running omp\",\n category: \"config\",\n retryable: false,\n hint: \"Check file permissions for the omp binary.\",\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: \"An unexpected process error occurred. Try sending your prompt again.\",\n };\n }\n\n private classifyErrorMessage(msg: string): AgentError {\n // Shared keyword buckets live in error-classifier.ts; only the hint copy is omp-specific.\n const generic = classifyGenericErrorMessage(msg);\n if (!generic) return { message: msg, category: \"unknown\", retryable: true };\n\n const lower = msg.toLowerCase();\n const hint =\n generic.category === \"auth\"\n ? \"Check your API key configuration in Settings.\"\n : generic.category === \"rate_limit\"\n ? \"You have hit the provider rate limit. Wait a moment and try again.\"\n : generic.category === \"network\"\n ? \"A network error occurred. Check your connection and try again.\"\n : // model: distinguish unavailable-model from over-long-context.\n lower.includes(\"model\")\n ? \"The selected model is not available. Change the model in settings.\"\n : \"The conversation is too long. Start a new session or choose a model with a larger context window.\";\n return { message: msg, category: generic.category, retryable: generic.retryable, hint };\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return new Promise((resolve, reject) => {\n execFile(\"omp\", [\"--list-models\"], { timeout: 10_000 }, (err, stdout, stderr) => {\n if (err) {\n reject(new Error(`omp --list-models failed: ${stderr || err.message}`));\n return;\n }\n const models: ModelEntry[] = [];\n let inCanonical = false;\n let headerSkipped = false;\n for (const raw of stdout.split(\"\\n\")) {\n const line = raw.trimEnd();\n if (!inCanonical) {\n if (line.startsWith(\"Canonical models\")) inCanonical = true;\n continue;\n }\n if (!headerSkipped) {\n headerSkipped = true;\n continue;\n }\n // blank line or a new section header ends the canonical block\n if (line === \"\" || (!line.startsWith(\" \") && line.endsWith(\"models\"))) break;\n const canonical = line.split(/\\s{2,}/)[0]?.trim();\n if (canonical) models.push({ id: canonical, name: canonical });\n }\n resolve(models);\n });\n });\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n this.ready = false;\n this.startPromise = null;\n this.stderrBuffer = [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the omp driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const ompDriverTarget: DriverTarget<AgentConfig> = {\n id: \"omp\",\n displayName: BUILTIN_DRIVER_CATALOG.omp?.name ?? \"omp (oh-my-pi)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OmpDriver(config),\n listModels: async (apiKeys) =>\n new OmpDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-
|
|
1
|
+
import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-DRXDEL3A.js';
|
|
2
2
|
import '../../chunk-GAH4YRCI.js';
|
|
3
|
-
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-
|
|
3
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
|
|
4
4
|
import '../../chunk-6E6PKKAD.js';
|
|
5
|
-
import '../../chunk-
|
|
5
|
+
import '../../chunk-U5POE4BA.js';
|
|
6
|
+
import '../../chunk-7GOCNYUV.js';
|
|
6
7
|
import '../../chunk-NSBPE2FW.js';
|
|
7
8
|
import * as z from 'zod';
|
|
8
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"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","file":"opencode.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source\n * coding agent.\n *\n * Spawns `opencode run \"<prompt>\" --format json` per turn and maps OpenCode's\n * JSON event stream to the unified {@link AgentEvent} stream. Model-agnostic:\n * the model is passed as `provider/model` via `-m`, and provider API keys are\n * forwarded through the environment.\n *\n * @remarks\n * - The prompt is a **positional argument** — OpenCode's `-p` flag is a\n * basic-auth password, not the prompt.\n * - Session resume via `-s <id>`; the session id is captured from the run's\n * session event and emitted as `session_info`.\n * - OpenCode's `run --format json` event field names are not fully pinned\n * upstream; {@link handleJson} reads them defensively.\n *\n * @see https://github.com/sst/opencode\n * @docLink packages/bridge/drivers#opencode-driver\n */\nexport class OpenCodeDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"opencode\");\n protected readonly defaultBin = \"opencode\";\n protected readonly productName = \"OpenCode\";\n protected readonly envPrefix = \"OPENCODE\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", message, \"--format\", \"json\"];\n const model =\n this.config.provider && this.config.model\n ? `${this.config.provider}/${this.config.model}`\n : this.config.model;\n if (model) args.push(\"-m\", model);\n if (resumeId) args.push(\"-s\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"GEMINI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n \"GROQ_API_KEY\",\n ]);\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"session\":\n case \"session.start\":\n case \"init\":\n this.captureSession(json.id ?? json.sessionId ?? json.session?.id);\n break;\n\n case \"message\":\n case \"message.part\":\n case \"part\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool\":\n case \"tool_use\":\n case \"tool.start\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool.end\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n case \"done\":\n case \"finish\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the opencode driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const opencodeDriverTarget: DriverTarget<AgentConfig> = {\n id: \"opencode\",\n displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? \"OpenCode\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OpenCodeDriver(config),\n};\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { GeminiFamilyDriver } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
1
|
+
import { GeminiFamilyDriver } from '../../chunk-KUZEIKZH.js';
|
|
2
|
+
import '../../chunk-DRXDEL3A.js';
|
|
3
3
|
import { fetchProviderModels } from '../../chunk-BMQKMOQY.js';
|
|
4
4
|
import '../../chunk-GAH4YRCI.js';
|
|
5
|
-
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-
|
|
5
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ORZW7MMO.js';
|
|
6
6
|
import '../../chunk-6E6PKKAD.js';
|
|
7
|
-
import '../../chunk-
|
|
7
|
+
import '../../chunk-U5POE4BA.js';
|
|
8
|
+
import '../../chunk-7GOCNYUV.js';
|
|
8
9
|
import '../../chunk-NSBPE2FW.js';
|
|
9
10
|
import * as z from 'zod';
|
|
10
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/drivers/qwen.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/drivers/qwen.ts"],"names":[],"mappings":";;;;;;;;;;;AA0BO,IAAM,UAAA,GAAN,cAAyB,kBAAA,CAAmB;AAAA,EACxC,UAAA,GAAyB;AAAA,IAChC,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,IAAA;AAAA,IACf,mBAAA,EAAqB;AAAA,GACvB;AAAA,EAEmB,GAAA,GAAc,gBAAgB,MAAM,CAAA;AAAA,EACpC,UAAA,GAAa,MAAA;AAAA,EACb,WAAA,GAAc,WAAA;AAAA,EACd,SAAA,GAAY,MAAA;AAAA,EAErB,SAAA,CAAU,SAAiB,QAAA,EAAwC;AAC3E,IAAA,MAAM,OAAO,CAAC,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,eAAe,4BAA4B,CAAA;AAC9E,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,KAAK,IAAA,EAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AACxD,IAAA,IAAI,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,QAAA,GAAmC;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,gBAAA,EAAkB,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAC9E,IAAA,MAAM,GAAA,GACJ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,UACrB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAA,IACrB,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,cAAA,IACjB,QAAQ,GAAA,CAAI,cAAA;AACd,IAAA,IAAI,GAAA,MAAS,cAAA,GAAiB,GAAA;AAC9B,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,YAAA,GAAe,KAAK,MAAA,CAAO,KAAA;AACtD,IAAA,GAAA,CAAI,0BAAA,GAA6B,GAAA;AACjC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEU,WAAA,GAAsB;AAC9B,IAAA,OAAO,kGAAA;AAAA,EACT;AAAA,EAEA,MAAe,UAAA,GAAoC;AACjD,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,QAAA,EAAU,GAAG,CAAA;AACtD,IAAA,OAAO,MAAA,CAAO,EAAA,GAAK,MAAA,CAAO,MAAA,GAAS,EAAC;AAAA,EACtC;AACF;AAMO,IAAM,gBAAA,GAA8C;AAAA,EACzD,EAAA,EAAI,MAAA;AAAA,EACJ,WAAA,EAAa,sBAAA,CAAuB,IAAA,EAAM,IAAA,IAAQ,WAAA;AAAA,EAClD,UAAA,EAAY,CAAA;AAAA,EACZ,YAAA,EAAgB,CAAA,CAAA,MAAA,CAAoB,MAAM,IAAI,CAAA;AAAA,EAC9C,QAAQ,OAAO,MAAA,EAAQ,IAAA,KAAS,IAAI,WAAW,MAAM,CAAA;AAAA,EACrD,UAAA,EAAY,OAAO,OAAA,KACjB,IAAI,WAAW,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,IAAO,SAAA,EAAW,YAAA,EAAc,OAAA,EAAS,EAAE,UAAA;AAC7E","file":"qwen.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, type ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { GeminiFamilyDriver } from \"./gemini.js\";\n\n/**\n * Agent driver for **Qwen Code** (`qwen`) — a fork of Gemini CLI.\n *\n * Reuses {@link GeminiFamilyDriver}'s stream-json event mapping. Unlike Gemini,\n * Qwen is **model-agnostic / OpenAI-compatible**: it reads `OPENAI_API_KEY`,\n * `OPENAI_BASE_URL`, and `OPENAI_MODEL`, so it works against any\n * OpenAI-completions endpoint (Alibaba DashScope by default).\n *\n * @remarks\n * - Spawns `qwen -p \"<prompt>\" -o stream-json --include-partial-messages`.\n * - Sets `QWEN_CODE_UNATTENDED_RETRY=1` so the CLI backs off on 429/529 in\n * unattended driver contexts.\n * - Supports headless session resume via `--resume <id>`.\n *\n * @see https://github.com/QwenLM/qwen-code\n * @docLink packages/bridge/drivers#qwen-driver\n */\nexport class QwenDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"qwen\",\n name: \"Qwen Code\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"qwen\");\n protected readonly defaultBin = \"qwen\";\n protected readonly productName = \"Qwen Code\";\n protected readonly envPrefix = \"QWEN\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"-o\", \"stream-json\", \"--include-partial-messages\"];\n if (this.config.model) args.push(\"-m\", this.config.model);\n if (resumeId) args.push(\"--resume\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"OPENAI_API_KEY\", \"OPENAI_BASE_URL\", \"OPENAI_MODEL\"]);\n const key =\n this.config.apiKeys?.openai ??\n this.config.apiKeys?.qwen ??\n this.config.env?.OPENAI_API_KEY ??\n process.env.OPENAI_API_KEY;\n if (key) env.OPENAI_API_KEY = key;\n if (this.config.model) env.OPENAI_MODEL = this.config.model;\n env.QWEN_CODE_UNATTENDED_RETRY = \"1\";\n return env;\n }\n\n protected installHint(): string {\n return \"Qwen Code is not installed or not on your PATH. Install it with `npm i -g @qwen-code/qwen-code`.\";\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n const key = this.config.apiKeys?.openai ?? process.env.OPENAI_API_KEY;\n if (!key) return [];\n const result = await fetchProviderModels(\"openai\", key);\n return result.ok ? result.models : [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the qwen driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const qwenDriverTarget: DriverTarget<AgentConfig> = {\n id: \"qwen\",\n displayName: BUILTIN_DRIVER_CATALOG.qwen?.name ?? \"Qwen Code\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new QwenDriver(config),\n listModels: async (apiKeys) =>\n new QwenDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
|
package/dist/bridge/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-
|
|
1
|
+
export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-OYX22NJL.js';
|
|
2
2
|
export { CLOUD_SECRET_ENV_KEYS, SUPPORTED_CLOUDS, buildClaudeCloudEnv } from '../chunk-ISQWMBKD.js';
|
|
3
3
|
export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-RRVQAE5D.js';
|
|
4
4
|
export { STATIC_MODELS, fetchProviderModels, getModels, getStaticModels } from '../chunk-BMQKMOQY.js';
|
|
5
5
|
export { AccountUnavailableError, AuthError, classifyClaudeSdkError, reclassifyAuthAsAccountUnavailable } from '../chunk-GAH4YRCI.js';
|
|
6
|
-
export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-
|
|
6
|
+
export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-ORZW7MMO.js';
|
|
7
7
|
import '../chunk-6E6PKKAD.js';
|
|
8
|
-
import '../chunk-
|
|
8
|
+
import '../chunk-U5POE4BA.js';
|
|
9
|
+
import '../chunk-7GOCNYUV.js';
|
|
9
10
|
import '../chunk-NSBPE2FW.js';
|
|
10
11
|
//# sourceMappingURL=index.js.map
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-sdk.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/claude-sdk.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAUnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAUvE,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EACL,KAAK,WAAW,EAChB,WAAW,EAIX,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AAsJrB,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyC;IAC7D,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAA6C;IACxD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAM;IACtB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB,CAAK;IAChC,oGAAoG;IACpG,OAAO,CAAC,qBAAqB,CAAS;IAEtC,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAAyB;IACtC,gDAAgD;IAChD,OAAO,CAAC,WAAW,CAA6B;IAChD,4CAA4C;IAC5C,OAAO,CAAC,UAAU,CAAuC;IACzD;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAoC;IACtD,6DAA6D;IAC7D,OAAO,CAAC,aAAa,CAAS;IAC9B,oFAAoF;IACpF,OAAO,CAAC,gBAAgB,CAAK;IAC7B,oFAAoF;IACpF,OAAO,CAAC,cAAc,CAA8C;IACpE;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB,CAAS;IACjC,sEAAsE;IACtE,OAAO,CAAC,UAAU,CAAS;IAC3B,+DAA+D;IAC/D,OAAO,CAAC,SAAS,CAAM;IACvB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe,CAKP;IAChB,qDAAqD;IACrD,OAAO,CAAC,cAAc,CAA0B;IAChD,uDAAuD;IACvD,OAAO,CAAC,WAAW,CAA2B;IAC9C,oEAAoE;IACpE,OAAO,CAAC,cAAc,CAAuB;IAC7C;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;;;;;;;;;;;;OAcG;gBACS,MAAM,EAAE,WAAW;IAK/B,IAAa,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAElD;IAEQ,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI;IAMrF,QAAQ,IAAI,MAAM,GAAG,SAAS;IAIvC;;;;;OAKG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;;;;;;;;;;;;OAcG;IACI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C;;;;;OAKG;YACW,SAAS;IAmJvB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,uBAAuB;IAO/B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAarB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA4B/B;;;;;;;OAOG;
|
|
1
|
+
{"version":3,"file":"claude-sdk.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/claude-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,20 @@
|
|
|
31
31
|
* JSONL line, and reproducing the SDK's message-assembly is fragile. A full
|
|
32
32
|
* scan is index-free and repairs every poisoned block in one pass.
|
|
33
33
|
*
|
|
34
|
+
* **Async and line-streaming since #454.** A Claude Code transcript is routinely
|
|
35
|
+
* multi-megabyte (base64 images inline in `tool_result` blocks), and this runs on
|
|
36
|
+
* a failed turn *and before every resume* — inside the single-threaded `skaile
|
|
37
|
+
* serve` loop. The previous `readFileSync` + `writeFileSync` + `renameSync` held
|
|
38
|
+
* the loop for the whole file and materialised it twice over as one string. Both
|
|
39
|
+
* passes now stream line by line off a `createReadStream`, so the loop is yielded
|
|
40
|
+
* between lines and peak memory is one JSONL line rather than the whole file, and
|
|
41
|
+
* every I/O phase is deadline-bounded.
|
|
42
|
+
*
|
|
43
|
+
* Streaming was chosen over a worker thread: the work is I/O-bound rather than
|
|
44
|
+
* CPU-bound (per-line `JSON.parse` on a yielded loop is not what stalls a turn),
|
|
45
|
+
* and a worker would add a structured-clone of the same multi-MB payload plus a
|
|
46
|
+
* thread lifecycle to a path that must never block a turn.
|
|
47
|
+
*
|
|
34
48
|
* @module
|
|
35
49
|
*/
|
|
36
50
|
/**
|
|
@@ -104,10 +118,16 @@ export declare function sniffImageMediaType(base64: string): string | null;
|
|
|
104
118
|
* Safe to call after a turn has failed: the SDK query is dead at that point,
|
|
105
119
|
* and the next resume re-reads the transcript from disk.
|
|
106
120
|
*
|
|
121
|
+
* **Async since #454.** Two streaming passes rather than one whole-file read:
|
|
122
|
+
* pass 1 counts repairs without writing anything, and pass 2 runs only when
|
|
123
|
+
* pass 1 found something. The common case — the preventive scrub of a clean
|
|
124
|
+
* transcript before every resume — is therefore one streaming read and zero
|
|
125
|
+
* writes, and a clean transcript is still left byte-for-byte untouched.
|
|
126
|
+
*
|
|
107
127
|
* @param opts - Config directory, session id, and an optional logger.
|
|
108
128
|
* @returns A {@link ScrubTranscriptResult}. When `changed` is `true` the
|
|
109
129
|
* caller may retry the resume with the same session id.
|
|
110
130
|
* @category Transcript repair
|
|
111
131
|
*/
|
|
112
|
-
export declare function scrubPoisonedTranscript(opts: ScrubTranscriptOptions): ScrubTranscriptResult
|
|
132
|
+
export declare function scrubPoisonedTranscript(opts: ScrubTranscriptOptions): Promise<ScrubTranscriptResult>;
|
|
113
133
|
//# sourceMappingURL=scrub-transcript.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrub-transcript.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/scrub-transcript.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scrub-transcript.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/scrub-transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAQH;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwCjE;AAgMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAsFhC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { installFromManifest } from './chunk-UKJMQZV6.js';
|
|
2
|
-
import { readManifestSourceConfig, discoverAssetsInTree, isManifestMode } from './chunk-
|
|
3
|
-
import { mergeLegacyEntriesInto, getGlobalCacheDir, resolveSourcePublisher, migrateLegacyDir, globalCacheRoot } from './chunk-
|
|
2
|
+
import { readManifestSourceConfig, discoverAssetsInTree, isManifestMode } from './chunk-MAN7AGQJ.js';
|
|
3
|
+
import { mergeLegacyEntriesInto, getGlobalCacheDir, resolveSourcePublisher, migrateLegacyDir, globalCacheRoot } from './chunk-72EOJJOM.js';
|
|
4
4
|
import { encodeSkaileManifest } from './chunk-P4VHQA4N.js';
|
|
5
5
|
import { parseAssetRef } from './chunk-GEEW6SY2.js';
|
|
6
6
|
import { PresetManifestSchema } from './chunk-IRORTHGA.js';
|
|
@@ -3908,5 +3908,5 @@ function detectWorkspaceVersion(dir, filename = "skaile.yaml") {
|
|
|
3908
3908
|
}
|
|
3909
3909
|
|
|
3910
3910
|
export { AssignmentNotFoundError, CatalogCache, CatalogConfigSchema, CatalogHttpError, DuplicateAssignmentError, DuplicateLibraryNameError, GitSyncDriver, InstanceHasConsumersError, InstanceNotFoundError, InterpolationError, KNOWN_ASSET_KINDS, KnowledgeManifestSchema, LIBRARY_BACKENDS, LIBRARY_OWNERSHIPS, LIBRARY_STRUCTURES, LOCAL_CATALOG_URL, LibraryConfigSchema, LibraryError, LibraryInstanceRefSchema, LibraryManager, LibrarySectionSchema, LibrarySyncError, LocalCatalogSource, LocalIndex, LocalSyncDriver, LockAssignmentSchema, LockFileSchema, OfflineError, OperationNotPermittedError, PIN_POLICIES, PinPolicySchema, PresetAppliedSchema, PresetExpandedSchema, RemoteCatalogSource, RequiresEdgeSchema, RestCatalogSource, SidecarGit, SkaileConfigSchema, SourceNotFoundError, TarballHashMismatchError, UserLibraryNotFoundError, WorkspaceConfigV2Schema, applyNonStructuralUpgrade, applyPreset, applyPresetFromData, classifyRef, createEmptyLockFile, deriveSlug, detectChanges, detectNestedPresetRefs, detectWorkspaceVersion, evaluateUpgrade, extractLibraryInstanceId, extractReferencedKeys, filterKey, getConfigDefaults, getDefaultValue, getSidecarRoot, getStoreManifestsDir, getStoreRoot, hasInterpolationTokens, interpolate, isLocalCatalogUrl, isSecretPlaceholder, knowledgeKindProvider, listSidecarSlugsOnDisk, loadLockFile, loadWorkspaceV2, migrateSidecarsToStoreIfNeeded, migrateWorkspaceConfig, parsePreset, parsePresetYaml, parseWorkspaceV2, projectConfigPath, queryInstancePickerChoices, resolveAllItems, resolveConfig, resolveIndexPath, resolveItem, resolveLibraryDir, resolvePin, resolveSidecarPaths, saveConfig, saveLockFile, saveWorkspaceV2, sha256Hex, skaileHomeDir, storeSecrets, trpcGetUrl, userConfigPath, validateAllPlaceholders, validateKnowledge, validateNestingDepth, validatePlaceholder, writeCuratedManifest, writeManifestIfMissing };
|
|
3911
|
-
//# sourceMappingURL=chunk-
|
|
3912
|
-
//# sourceMappingURL=chunk-
|
|
3911
|
+
//# sourceMappingURL=chunk-35ELAMQ5.js.map
|
|
3912
|
+
//# sourceMappingURL=chunk-35ELAMQ5.js.map
|