@skaile/workspaces 1.16.0 → 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 +265 -0
- package/dist/{asset-feeds-WIBEP37F.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-WSTY3AWY.js → chunk-6FJH63NN.js} +4 -4
- package/dist/{chunk-WSTY3AWY.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-BYS6JDZB.js → chunk-DY2AK577.js} +3 -3
- package/dist/{chunk-BYS6JDZB.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-YULV7UTU.js → chunk-KYLWY3A7.js} +10 -10
- package/dist/{chunk-YULV7UTU.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-FIUGSIKC.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-C4KVFALU.js → chunk-QIQTYN7F.js} +3 -3
- package/dist/{chunk-C4KVFALU.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-6POODADP.js → chunk-SVL4EZJT.js} +453 -250
- 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-MO43URUI.js → chunk-UAQVFATZ.js} +7 -7
- package/dist/{chunk-MO43URUI.js.map → chunk-UAQVFATZ.js.map} +1 -1
- package/dist/{chunk-A22KZ7GZ.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-BG4XVMG2.js → chunk-WZPADAE7.js} +254 -135
- package/dist/chunk-WZPADAE7.js.map +1 -0
- package/dist/{chunk-EPWY2ABE.js → chunk-Y3JVBJ3Y.js} +5 -5
- package/dist/{chunk-EPWY2ABE.js.map → chunk-Y3JVBJ3Y.js.map} +1 -1
- package/dist/cli/index.js +347 -127
- 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 +8 -7
- package/dist/connectors/src/connector-manager.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-RSTZONIE.js → ensure-sources-JLVHHZI2.js} +13 -12
- package/dist/ensure-sources-JLVHHZI2.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +8 -7
- 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 +8 -7
- package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/devserver.js +8 -7
- package/dist/factory-assets/connectors/flow/adapter.js +8 -7
- package/dist/factory-assets/connectors/flow/engine.js +6 -5
- package/dist/factory-assets/connectors/flow/run-flow.js +10 -9
- package/dist/factory-assets/connectors/flow.js +8 -7
- 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 +8 -7
- package/dist/factory-assets/connectors/gmail.js +8 -7
- package/dist/factory-assets/connectors/googledrive.js +8 -7
- 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 +8 -7
- package/dist/factory-assets/connectors/mattermost.js +8 -7
- package/dist/factory-assets/connectors/memory.js +8 -7
- package/dist/factory-assets/connectors/minio.js +8 -7
- package/dist/factory-assets/connectors/postgres.js +8 -7
- 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 +8 -7
- package/dist/factory-assets/connectors/sharepoint.js +8 -7
- 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 +8 -7
- package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/static-server.js +8 -7
- package/dist/factory-assets/connectors/tunnel.js +8 -7
- package/dist/factory-assets/connectors/webdav.js +8 -7
- 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 +8 -7
- package/dist/factory-assets/connectors/xstate.js +8 -7
- package/dist/flows-LV5WYJ2I.js +20 -0
- package/dist/{flows-FHWBCLXF.js.map → flows-LV5WYJ2I.js.map} +1 -1
- package/dist/{helpers-GUUWPPAX.js → helpers-PJ3CPUUL.js} +13 -12
- package/dist/{helpers-GUUWPPAX.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-UKKSJP7V.js → library-publish-HVZRCE3C.js} +16 -15
- package/dist/library-publish-HVZRCE3C.js.map +1 -0
- package/dist/{open-library-VALRYGFV.js → open-library-RMI2FTQ4.js} +14 -13
- package/dist/{open-library-VALRYGFV.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-IRUJLIVX.js → project-P636MSYT.js} +14 -13
- package/dist/{project-IRUJLIVX.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 +13 -12
- 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 +13 -12
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +13 -1
- package/dist/sdk/runner.js +13 -12
- 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-5KDURFBS.js → source-63CHWDC2.js} +15 -14
- package/dist/{source-5KDURFBS.js.map → source-63CHWDC2.js.map} +1 -1
- package/dist/{source-manifest-publish-DPQI44D3.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 +13 -12
- 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-WIBEP37F.js.map +0 -1
- package/dist/chunk-2BQBWWFX.js.map +0 -1
- package/dist/chunk-2IJFUAZB.js.map +0 -1
- package/dist/chunk-5NZ56R63.js.map +0 -1
- package/dist/chunk-6POODADP.js.map +0 -1
- package/dist/chunk-7J7LQP6T.js.map +0 -1
- package/dist/chunk-A22KZ7GZ.js.map +0 -1
- package/dist/chunk-ACXLKNIM.js.map +0 -1
- package/dist/chunk-BG4XVMG2.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-FIUGSIKC.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-XCBG2KDC.js +0 -23
- package/dist/chunk-XCBG2KDC.js.map +0 -1
- package/dist/ensure-sources-RSTZONIE.js.map +0 -1
- package/dist/flows-FHWBCLXF.js +0 -7
- package/dist/library-publish-UKKSJP7V.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-DPQI44D3.js.map +0 -1
- package/dist/validator-VF5M764T.js +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"source-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"source-63CHWDC2.js"}
|
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import { makeHttpPublisherClient, refFor, publishToStore, bareName } from './chunk-
|
|
2
|
-
import { sourceClonePath, resolveSourceArg } from './chunk-
|
|
3
|
-
import { isStoreAuthenticated } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import { logErr, S, logInfo, logOk, logWarn } from './chunk-
|
|
1
|
+
import { makeHttpPublisherClient, refFor, publishToStore, bareName } from './chunk-6FJH63NN.js';
|
|
2
|
+
import { sourceClonePath, resolveSourceArg } from './chunk-KYLWY3A7.js';
|
|
3
|
+
import { isStoreAuthenticated } from './chunk-WCWXDW22.js';
|
|
4
|
+
import './chunk-Y3JVBJ3Y.js';
|
|
5
|
+
import { logErr, S, logInfo, logOk, logWarn } from './chunk-DY2AK577.js';
|
|
6
6
|
import './chunk-HPGV54O4.js';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
7
|
+
import './chunk-UVW3R6S7.js';
|
|
8
|
+
import './chunk-35ELAMQ5.js';
|
|
9
9
|
import './chunk-UKJMQZV6.js';
|
|
10
10
|
import './chunk-R7FOF242.js';
|
|
11
|
-
import './chunk-
|
|
11
|
+
import './chunk-MAN7AGQJ.js';
|
|
12
12
|
import './chunk-JXT46QFC.js';
|
|
13
|
-
import './chunk-
|
|
13
|
+
import './chunk-VCU4NPUS.js';
|
|
14
14
|
import './chunk-CGYEHQOX.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-ST3DLLNZ.js';
|
|
16
16
|
import './chunk-K5GBV4SA.js';
|
|
17
17
|
import './chunk-ZAP2BDHG.js';
|
|
18
|
-
import './chunk-
|
|
19
|
-
import { sourceCacheKey } from './chunk-
|
|
18
|
+
import './chunk-MMD2KQ3A.js';
|
|
19
|
+
import { sourceCacheKey } from './chunk-72EOJJOM.js';
|
|
20
20
|
import { decodeSkaileManifest, encodeSkaileManifest } from './chunk-P4VHQA4N.js';
|
|
21
|
-
import './chunk-
|
|
21
|
+
import './chunk-DYMWJAL4.js';
|
|
22
22
|
import './chunk-GEEW6SY2.js';
|
|
23
23
|
import './chunk-F3HNW354.js';
|
|
24
24
|
import './chunk-MENCWIHW.js';
|
|
25
|
-
import './chunk-
|
|
25
|
+
import './chunk-U5POE4BA.js';
|
|
26
|
+
import './chunk-7GOCNYUV.js';
|
|
26
27
|
import './chunk-KTBKW2FI.js';
|
|
27
28
|
import './chunk-UQ6LFBPZ.js';
|
|
28
29
|
import './chunk-IEX5YV4R.js';
|
|
@@ -226,5 +227,5 @@ async function runYank(arg, opts, client) {
|
|
|
226
227
|
}
|
|
227
228
|
|
|
228
229
|
export { getSidecarRepo, normalizePublishedManifest, pushSidecarManifest, runPublish, runYank, saveSidecarRepo };
|
|
229
|
-
//# sourceMappingURL=source-manifest-publish-
|
|
230
|
-
//# sourceMappingURL=source-manifest-publish-
|
|
230
|
+
//# sourceMappingURL=source-manifest-publish-DLASGDK5.js.map
|
|
231
|
+
//# sourceMappingURL=source-manifest-publish-DLASGDK5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../cli/src/commands/source-manifest-publish.ts"],"names":[],"mappings":"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","file":"source-manifest-publish-DLASGDK5.js","sourcesContent":["/**\n * `skaile source manifest publish` / `yank` — the curator-publish flow. Takes a\n * locally-curated sidecar manifest (over a foreign public GitHub repo) and:\n *\n * 1. Pushes the curated `skaile.manifest.yaml` to the curator's OWN public\n * \"sidecar\" repo (bytes stay in the foreign source; the sidecar holds only\n * the manifest pointing at it).\n * 2. Registers the foreign source + the sidecar (url + pinned commit) with the\n * store, syncs it, and publishes each curated asset.\n *\n * `yank` is the inverse: unpublish each currently-published asset of the source.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * (default HTTP client); git side-effects go through an injectable `spawn`. Both\n * seams keep the pure helpers + orchestration unit/integration-testable without a\n * live store or a real remote.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport {\n decodeSkaileManifest,\n encodeSkaileManifest,\n type SkPublishManifest,\n sourceCacheKey,\n} from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport { makeHttpPublisherClient, type PublisherClient } from \"../store-publisher.ts\";\nimport { isStoreAuthenticated } from \"../store-client.ts\";\nimport { bareName, publishToStore, refFor } from \"./publish-core.ts\";\nimport { sourceClonePath } from \"./source.ts\";\nimport { resolveSourceArg } from \"./source-manifest.ts\";\n\n/** The fixed filename a sidecar repo carries at its root. */\nconst SIDECAR_MANIFEST_FILENAME = \"skaile.manifest.yaml\";\n\n/** Injectable spawn contract — the subset of `spawnSync` these helpers use. */\ntype SpawnLike = typeof spawnSync;\n\n/**\n * Return a copy of `manifest` normalized for publication under `namespace`:\n * the top-level `publisher` is set to `namespace` and every per-asset\n * `publisher` override is removed so all assets inherit the top-level one.\n * Pure — the input is not mutated.\n */\nexport function normalizePublishedManifest(\n manifest: SkPublishManifest,\n namespace: string,\n): SkPublishManifest {\n const assets = (manifest.assets ?? []).map((a) => {\n const { publisher: _drop, ...rest } = a;\n return rest;\n });\n return { ...manifest, publisher: namespace, assets };\n}\n\n// ── Sidecar-repo association (~/.skaile/settings.json) ────────────────────────\n\n/**\n * Path to the user settings file — the same `~/.skaile/settings.json` the store\n * client reads tokens from. Resolves the `.skaile` root exactly as `getStoreRoot`\n * does (`SKAILE_HOME` when set — it IS the `.skaile` dir — else `~/.skaile`), so\n * the sidecar association lives beside the store manifests under one convention\n * and tests isolate through the same `SKAILE_HOME` seam.\n */\nfunction settingsFile(): string {\n const root = process.env.SKAILE_HOME ?? join(homedir(), \".skaile\");\n return join(root, \"settings.json\");\n}\n\nfunction readSettings(): Record<string, any> {\n const file = settingsFile();\n if (!existsSync(file)) return {};\n try {\n return JSON.parse(readFileSync(file, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\n/**\n * The sidecar repo URL previously associated with a source `slug`, if any.\n * Reads `settings.sidecarRepos?.[slug]?.repo`.\n */\nexport function getSidecarRepo(slug: string): string | undefined {\n const settings = readSettings();\n return settings.sidecarRepos?.[slug]?.repo;\n}\n\n/**\n * Persist the sidecar repo URL for a source `slug`, preserving every other\n * settings key. Stored as an object (`{ repo }`) so a `path` (or other fields)\n * can be added later without a schema migration.\n */\nexport function saveSidecarRepo(slug: string, repo: string): void {\n const file = settingsFile();\n mkdirSync(dirname(file), { recursive: true });\n const settings = readSettings();\n const sidecarRepos = { ...(settings.sidecarRepos ?? {}) };\n sidecarRepos[slug] = { ...(sidecarRepos[slug] ?? {}), repo };\n settings.sidecarRepos = sidecarRepos;\n writeFileSync(file, JSON.stringify(settings, null, 2), \"utf-8\");\n}\n\n// ── Sidecar push ──────────────────────────────────────────────────────────────\n\n/**\n * Run a git command in `cwd` via the injected spawn, throwing with the captured\n * stderr on failure. Returns trimmed stdout.\n */\nfunction git(spawn: SpawnLike, cwd: string, args: string[]): string {\n const res = spawn(\"git\", [\"-C\", cwd, ...args], { encoding: \"utf-8\" });\n if (res.status !== 0) {\n const stderr = (res.stderr ?? \"\").toString().trim();\n throw new Error(`git ${args.join(\" \")} failed: ${stderr || `exit ${res.status}`}`);\n }\n return (res.stdout ?? \"\").toString().trim();\n}\n\n/**\n * Clone the curator's sidecar repo, write the curated manifest at its root, and\n * commit + push. Returns the pushed commit sha (used to pin the store source).\n *\n * Idempotent re-publish: when the manifest is unchanged `git commit` fails with\n * \"nothing to commit\" — we swallow that and return the current HEAD so a no-op\n * re-run still yields a valid pin. Any push/auth failure surfaces as a thrown\n * Error carrying git's stderr.\n */\nexport function pushSidecarManifest(opts: {\n sidecarRepoUrl: string;\n manifestText: string;\n spawn?: SpawnLike;\n}): { commitSha: string } {\n const spawn = opts.spawn ?? spawnSync;\n // Dedicated dir next to the source clone cache; wipe any stale clone first so\n // a re-publish always starts from a clean shallow checkout of the remote.\n const cloneDir = `${sourceClonePath(sourceCacheKey(opts.sidecarRepoUrl))}-sidecar-push`;\n rmSync(cloneDir, { recursive: true, force: true });\n mkdirSync(dirname(cloneDir), { recursive: true });\n\n // The clone is scratch — always remove it afterwards (success or failure) so a\n // failed push never leaves a stale checkout in the cache dir.\n try {\n const cloneRes = spawn(\"git\", [\"clone\", \"--depth\", \"1\", opts.sidecarRepoUrl, cloneDir], {\n encoding: \"utf-8\",\n });\n if (cloneRes.status !== 0) {\n const stderr = (cloneRes.stderr ?? \"\").toString().trim();\n throw new Error(\n `git clone ${opts.sidecarRepoUrl} failed: ${stderr || `exit ${cloneRes.status}`}`,\n );\n }\n\n writeFileSync(join(cloneDir, SIDECAR_MANIFEST_FILENAME), opts.manifestText, \"utf-8\");\n git(spawn, cloneDir, [\"add\", SIDECAR_MANIFEST_FILENAME]);\n\n // Fixed bot identity via -c so the commit succeeds regardless of the curator's\n // git config (the sidecar push is a machine action, not authored work).\n const commitRes = spawn(\n \"git\",\n [\n \"-C\",\n cloneDir,\n \"-c\",\n \"user.email=publish@skaile.store\",\n \"-c\",\n \"user.name=skaile\",\n \"commit\",\n \"-m\",\n \"chore(sidecar): publish curated manifest\",\n ],\n { encoding: \"utf-8\" },\n );\n if (commitRes.status !== 0) {\n const out = `${commitRes.stdout ?? \"\"}${commitRes.stderr ?? \"\"}`;\n // Nothing changed → idempotent re-publish; keep the existing HEAD.\n if (!/nothing to commit/i.test(out)) {\n throw new Error(`git commit failed: ${out.trim() || `exit ${commitRes.status}`}`);\n }\n } else {\n // `push origin HEAD` (not a bare `push`) so a fresh sidecar repo with an\n // unborn/renamed default branch still gets its branch created on the remote.\n git(spawn, cloneDir, [\"push\", \"origin\", \"HEAD\"]);\n }\n\n return { commitSha: git(spawn, cloneDir, [\"rev-parse\", \"HEAD\"]) };\n } finally {\n rmSync(cloneDir, { recursive: true, force: true });\n }\n}\n\n// ── Orchestration ───────────────────────────────────────────────────────────\n\n/**\n * `source manifest publish <src>` — publish a curated sidecar manifest to the\n * store. See the module header for the full flow. Store calls go through\n * `client` (default HTTP); git side-effects through `spawn` (default\n * `spawnSync`). The auth gate is enforced only for the default HTTP client so\n * injected fakes bypass it.\n */\nexport async function runPublish(\n arg: string,\n opts: {\n projectDir: string;\n as?: string;\n sidecarRepo?: string;\n ref?: string;\n dryRun?: boolean;\n },\n client?: PublisherClient,\n spawn: SpawnLike = spawnSync,\n): Promise<void> {\n const injected = client !== undefined;\n const pub = client ?? makeHttpPublisherClient();\n\n const { url, slug, manifestFile } = resolveSourceArg(arg, opts.projectDir);\n\n if (!existsSync(manifestFile)) {\n logErr(\n `No curated manifest for \"${slug}\" at ${S.dim(manifestFile)} — ` +\n \"run `skaile source manifest init` first.\",\n );\n process.exit(1);\n }\n\n const { manifest, diagnostics } = decodeSkaileManifest(readFileSync(manifestFile, \"utf-8\"));\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics.filter((x) => x.severity === \"error\")) {\n logErr(`${d.code}: ${d.message}`);\n }\n logErr(\n \"The curated manifest has errors — fix them with `skaile source manifest edit` / \" +\n \"`verify` before publishing.\",\n );\n process.exit(1);\n }\n\n // A real publish makes store calls (+ `me()` when `--as` is omitted), so it\n // needs a token. `--dry-run` is an offline preview: never gate it on auth.\n const authed = injected || isStoreAuthenticated();\n if (!opts.dryRun && !authed) {\n logErr(\"Not signed in — run `skaile store login` first.\");\n process.exit(1);\n }\n\n // Namespace: `--as` wins; else the caller's verified identity. Prefer the\n // GitHub handle (`githubLogin`) over the store login (`username`) — for a user\n // whose login differs from their GitHub handle the login namespace may be\n // reserved (matches the CLI's `resolveLibraryPublisher` precedence). In an\n // unauthenticated dry-run we cannot call `me()`, so show a placeholder.\n let namespace: string;\n if (opts.as) namespace = opts.as;\n else if (authed) {\n const me = await pub.me();\n // `||` not `??`: an empty-string githubLogin (partially-connected account) is\n // not a usable namespace — fall back to the login rather than publish under \"\".\n namespace = me.githubLogin || me.username;\n } else namespace = \"<your store username>\";\n\n const normalized = normalizePublishedManifest(manifest, namespace);\n const publishedText = encodeSkaileManifest(normalized);\n\n const wouldBeRefs = (normalized.assets ?? []).map((a) =>\n refFor(a.kind, namespace, a.name, a.version ?? normalized.version),\n );\n\n if (opts.dryRun) {\n const sidecar = opts.sidecarRepo ?? getSidecarRepo(slug) ?? \"<none — pass --sidecar-repo>\";\n logInfo(`Publish plan for ${S.bold(slug)}:`);\n logInfo(` namespace: ${namespace}`);\n logInfo(` sidecar repo: ${sidecar}`);\n logInfo(` source ref: ${opts.ref ?? \"main\"}`);\n logInfo(` would publish ${wouldBeRefs.length} asset(s):`);\n for (const r of wouldBeRefs) logInfo(` ${r}`);\n return;\n }\n\n const sidecarRepoUrl = opts.sidecarRepo ?? getSidecarRepo(slug);\n if (!sidecarRepoUrl) {\n logErr(\n \"No sidecar repo associated with this source. Pass \" +\n `${S.cmd(\"--sidecar-repo https://github.com/<you>/<repo>\")} — it must be a ` +\n \"PUBLIC GitHub repo you own; the curated manifest is committed there and the \" +\n \"store pins to that commit.\",\n );\n process.exit(1);\n }\n if (opts.sidecarRepo) saveSidecarRepo(slug, sidecarRepoUrl);\n\n const { commitSha } = pushSidecarManifest({ sidecarRepoUrl, manifestText: publishedText, spawn });\n logOk(`Pushed curated manifest to ${S.dim(sidecarRepoUrl)} @ ${commitSha.slice(0, 10)}.`);\n\n // The FOREIGN repo's ref to ingest (branch/sha). Defaults to `main`.\n const sourceRef = opts.ref ?? \"main\";\n\n const { published } = await publishToStore({\n sourceUrl: url,\n ref: sourceRef,\n sidecar: { url: sidecarRepoUrl, ref: commitSha },\n manifest: normalized,\n client: pub,\n });\n\n if (published.length > 0) {\n logInfo(`Consumers can now install them with \\`skaile add ${published[0]}\\`.`);\n }\n}\n\n/**\n * `source manifest yank <src>` — unpublish the source's published assets (all,\n * or the single asset matching `opts.asset`'s name). Auth-gated like publish.\n */\nexport async function runYank(\n arg: string,\n opts: { projectDir: string; asset?: string },\n client?: PublisherClient,\n): Promise<void> {\n const injected = client !== undefined;\n const pub = client ?? makeHttpPublisherClient();\n\n const { url, slug } = resolveSourceArg(arg, opts.projectDir);\n\n if (!injected && !isStoreAuthenticated()) {\n logErr(\"Not signed in — run `skaile store login` first.\");\n process.exit(1);\n }\n\n const rows = await pub.sourcesList();\n const source = rows.find((r) => r.url === url);\n if (!source) {\n logErr(`Source \"${slug}\" is not registered in the store — nothing to yank.`);\n process.exit(1);\n }\n\n // Optionally narrow to a single asset by name (accept a bare name or a ref).\n const targetName = opts.asset ? bareName(opts.asset) : undefined;\n const candidates = (await pub.sourceCandidates(source.id)).filter(\n (c) => c.published && (!targetName || c.name === targetName),\n );\n if (candidates.length === 0) {\n logWarn(\"No published assets matched — nothing to yank.\");\n return;\n }\n\n const yanked: string[] = [];\n for (const c of candidates) {\n try {\n await pub.assetUnpublish(c.id);\n yanked.push(`${c.kind}:${c.name}`);\n } catch (err) {\n logWarn(\n `Failed to yank ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Yanked ${yanked.length} asset(s):`);\n for (const r of yanked) logInfo(` ${r}`);\n}\n"]}
|
package/dist/store/index.js
CHANGED
|
@@ -122,6 +122,9 @@ export declare class AgentStore implements SubscribableStore<AgentStoreSnapshot>
|
|
|
122
122
|
* Called by transport wrappers that cannot use the `onStatusChange`
|
|
123
123
|
* callback (e.g. tRPC subscriptions that track status externally).
|
|
124
124
|
*
|
|
125
|
+
* Writing the status the store already holds is a no-op: it neither rotates
|
|
126
|
+
* the snapshot nor notifies listeners.
|
|
127
|
+
*
|
|
125
128
|
* @param status - The new connection status.
|
|
126
129
|
*/
|
|
127
130
|
setStatus(status: ConnectionStatus): void;
|
|
@@ -171,6 +174,12 @@ export declare class AgentStore implements SubscribableStore<AgentStoreSnapshot>
|
|
|
171
174
|
initialMessages?: Message[];
|
|
172
175
|
}): AgentStore;
|
|
173
176
|
private _handleEvent;
|
|
177
|
+
/**
|
|
178
|
+
* Finalize buffered streaming text as a `text` Message.
|
|
179
|
+
*
|
|
180
|
+
* @returns true when text was flushed; false when there was nothing to flush,
|
|
181
|
+
* so callers can skip a notify that would change nothing.
|
|
182
|
+
*/
|
|
174
183
|
private _flushStreaming;
|
|
175
184
|
private _appendMessage;
|
|
176
185
|
private _notify;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../store/src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEZ,UAAU,EAGV,OAAO,EAGR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../store/src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createAgentSession } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
import { createAgentSession } from '../chunk-WZPADAE7.js';
|
|
2
|
+
import '../chunk-QIQTYN7F.js';
|
|
3
3
|
import '../chunk-X5YPJV4N.js';
|
|
4
4
|
import '../chunk-W3UDISS2.js';
|
|
5
5
|
import '../chunk-O7SG5PC2.js';
|
|
@@ -7,31 +7,32 @@ import '../chunk-7QBNJTTQ.js';
|
|
|
7
7
|
import '../chunk-WQ7DE5UC.js';
|
|
8
8
|
import '../chunk-GTS2FODO.js';
|
|
9
9
|
import '../chunk-32NA4TVC.js';
|
|
10
|
-
import '../chunk-
|
|
10
|
+
import '../chunk-OYX22NJL.js';
|
|
11
11
|
import '../chunk-ISQWMBKD.js';
|
|
12
12
|
import '../chunk-RRVQAE5D.js';
|
|
13
13
|
import '../chunk-BMQKMOQY.js';
|
|
14
14
|
import '../chunk-GAH4YRCI.js';
|
|
15
|
-
import '../chunk-
|
|
16
|
-
import '../chunk-
|
|
17
|
-
import '../chunk-
|
|
18
|
-
import { loadConnectorDeclarations } from '../chunk-
|
|
15
|
+
import '../chunk-ORZW7MMO.js';
|
|
16
|
+
import '../chunk-BEAIJRVF.js';
|
|
17
|
+
import '../chunk-SVL4EZJT.js';
|
|
18
|
+
import { loadConnectorDeclarations } from '../chunk-CKVIN4H3.js';
|
|
19
19
|
import '../chunk-6E6PKKAD.js';
|
|
20
20
|
import '../chunk-HPGV54O4.js';
|
|
21
21
|
import '../chunk-Y662DNQQ.js';
|
|
22
22
|
import '../chunk-IFGTRL2I.js';
|
|
23
23
|
import '../chunk-RDE43ORT.js';
|
|
24
|
-
import { resolveSettings } from '../chunk-
|
|
24
|
+
import { resolveSettings } from '../chunk-ST3DLLNZ.js';
|
|
25
25
|
import '../chunk-K5GBV4SA.js';
|
|
26
26
|
import '../chunk-ZAP2BDHG.js';
|
|
27
|
-
import '../chunk-
|
|
28
|
-
import { resolveAgentDir } from '../chunk-
|
|
27
|
+
import '../chunk-MMD2KQ3A.js';
|
|
28
|
+
import { resolveAgentDir } from '../chunk-72EOJJOM.js';
|
|
29
29
|
import '../chunk-P4VHQA4N.js';
|
|
30
|
-
import '../chunk-
|
|
30
|
+
import '../chunk-DYMWJAL4.js';
|
|
31
31
|
import '../chunk-GEEW6SY2.js';
|
|
32
32
|
import '../chunk-F3HNW354.js';
|
|
33
33
|
import '../chunk-MENCWIHW.js';
|
|
34
|
-
import '../chunk-
|
|
34
|
+
import '../chunk-U5POE4BA.js';
|
|
35
|
+
import '../chunk-7GOCNYUV.js';
|
|
35
36
|
import '../chunk-NSBPE2FW.js';
|
|
36
37
|
import { existsSync, readFileSync, statSync, readdirSync } from 'fs';
|
|
37
38
|
import { resolve, join, basename, parse, dirname } from 'path';
|
package/dist/tui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../tui/src/repl-renderer.ts","../../tui/src/repl-session.ts","../../tui/src/telemetry.ts","../../tui/src/repl.ts"],"names":["text","pc","resolve"],"mappings":"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","file":"index.js","sourcesContent":["import type { OutputLine } from \"@skaile/workspaces\";\nimport pc from \"picocolors\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Render a single OutputLine to an ANSI-colored string for terminal display.\n *\n * Each `OutputLine` variant is mapped to a distinct colour: user input (cyan/bold),\n * agent text (plain), tool calls (blue italic), questions (yellow), errors (red),\n * status/system messages (dim italic), subagent lifecycle (blue/green italic), and\n * separator lines (dim dashes). Returns an empty string for unrecognised variants.\n *\n * @param line - The typed output line to render.\n * @returns ANSI-coloured string ready for terminal output.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLine(line: OutputLine): string {\n switch (line.type) {\n case \"user\":\n return pc.cyan(pc.bold(`> ${line.content}`));\n case \"text\":\n return line.content;\n case \"tool\":\n return pc.blue(pc.italic(` Running: \\`${line.name}\\`...`));\n case \"question\":\n return pc.yellow(`?? ${line.text}\\n Reply below.`);\n case \"error\":\n return pc.red(`Error: ${line.message}`);\n case \"status\":\n return pc.dim(pc.italic(`${line.phase}...`));\n case \"system\":\n return pc.dim(pc.italic(line.message));\n case \"subagent\": {\n const icon = line.status === \"started\" ? \"▶\" : \"✓\";\n const color = line.status === \"started\" ? pc.blue : pc.green;\n return color(pc.italic(` ${icon} ${line.name}: ${line.description}`));\n }\n case \"separator\":\n return pc.dim(\"─\".repeat(60));\n default:\n return \"\";\n }\n}\n\n/**\n * Render a telemetry log entry to an ANSI string, or null to suppress.\n *\n * Formats `generation` entries with model name, token counts, cost, and duration;\n * `span_end` entries for `tool_call` and `agent_turn` kinds; and `trace_start` /\n * `trace_end` lifecycle entries. All output is styled dim for visual de-emphasis.\n * Returns `null` for entry kinds that should not appear in the log panel.\n *\n * @param entry - The structured telemetry event to render.\n * @returns Dim ANSI string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLog(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return pc.dim(`[gen] ${entry.model} ${tokens}${cost}${dur}`);\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return pc.dim(`[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`);\n }\n if (entry.spanKind === \"agent_turn\") {\n return pc.dim(`[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`);\n }\n return null;\n case \"trace_start\":\n return pc.dim(`[trace] ${entry.name} started`);\n case \"trace_end\":\n return pc.dim(`[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`);\n default:\n return null;\n }\n}\n","/**\n * Slim event bridge: maps AgentDriver events to rendered console lines.\n * No React, no ink, no UI state — just event → string → callback.\n */\n\nimport type { OutputLine, SessionState } from \"@skaile/workspaces\";\nimport type { AgentEvent } from \"@skaile/workspaces/bridge\";\nimport type { AgentSession } from \"@skaile/workspaces/runner\";\nimport { renderLine, renderLog } from \"./repl-renderer.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Handle returned by {@link createReplSession} for controlling an active REPL session.\n *\n * `state` reflects the current lifecycle state (`idle`, `active`, or `stopped`).\n * Call `send(text)` to forward a user message to the agent driver; the state\n * transitions to `active` until the driver emits `agent_end`. Call `stop()` to\n * terminate the driver and dispose of the underlying agent session.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface ReplSessionHandle {\n readonly state: SessionState;\n send(text: string): void;\n stop(): void;\n}\n\n/**\n * Options for {@link createReplSession}.\n *\n * @param session - The agent session returned by `createAgentSession`.\n * @param onLine - Callback invoked with an ANSI-rendered string for each output line.\n * @param onLog - Callback invoked with a log string for each telemetry event (if verbose).\n * @param onStateChange - Callback invoked whenever the session state changes.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface CreateReplSessionOpts {\n session: AgentSession;\n onLine?: (line: string) => void;\n onLog?: (line: string) => void;\n onStateChange?: (state: SessionState) => void;\n}\n\n/**\n * Create a slim event bridge that maps `AgentEvent` stream to rendered console lines.\n *\n * Subscribes to `agent-event` on the session driver and converts each event type\n * (`message_update`, `tool_call`, `error`, `agent_end`, `turn_end`, `subagent`) to\n * an `OutputLine`, renders it via {@link renderLine}, and forwards the string to\n * `opts.onLine`. Text content is buffered internally and flushed line-by-line as\n * newlines arrive. Returns a {@link ReplSessionHandle} for sending messages and\n * stopping the session.\n *\n * @param opts - Session, output callbacks, and state-change hook.\n * @returns Handle for sending messages and observing session state.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createReplSession(opts: CreateReplSessionOpts): ReplSessionHandle {\n const { session, onLine, onLog, onStateChange } = opts;\n\n let state: SessionState = \"idle\";\n let textBuffer = \"\";\n\n function emit(outputLine: OutputLine) {\n const rendered = renderLine(outputLine);\n if (rendered) onLine?.(rendered);\n }\n\n function setState(s: SessionState) {\n state = s;\n onStateChange?.(s);\n }\n\n // Buffer the incoming text delta and flush every completed (newline-terminated)\n // line; returns the new buffer holding the trailing partial line.\n function handleMessageUpdate(event: AgentEvent, buffer: string): string {\n const delta = (event as any)._textDelta as string | undefined;\n if (!delta) return buffer;\n let next = buffer + delta;\n const lines = next.split(\"\\n\");\n if (lines.length > 1) {\n for (let i = 0; i < lines.length - 1; i++) {\n emit({ type: \"text\", content: lines[i]! });\n }\n next = lines[lines.length - 1]!;\n }\n return next;\n }\n\n function handleToolCall(event: AgentEvent) {\n const name = (event as any).tool?.name ?? (event as any).name ?? \"unknown\";\n emit({ type: \"tool\", name });\n }\n\n function handleError(event: AgentEvent) {\n const msg = (event as any).error ?? \"Unknown error\";\n emit({ type: \"error\", message: String(msg) });\n if ((event as any).fatal) setState(\"stopped\");\n }\n\n // Flush any buffered text, emit a separator, and (on agent_end) go idle;\n // returns the cleared buffer.\n function handleTurnBoundary(event: AgentEvent, buffer: string): string {\n if (buffer.trim()) {\n emit({ type: \"text\", content: buffer });\n }\n emit({ type: \"separator\" });\n if (event.type === \"agent_end\") setState(\"idle\");\n return \"\";\n }\n\n function handleSubagent(event: AgentEvent) {\n const raw = event as any;\n if (raw.type !== \"subagent\") return;\n const status = raw.status === \"finished\" ? \"finished\" : \"started\";\n emit({\n type: \"subagent\",\n name: raw.name ?? \"subagent\",\n status,\n description: raw.description ?? \"\",\n });\n }\n\n session.driver.on(\"agent-event\", (event: AgentEvent) => {\n switch (event.type) {\n case \"message_update\":\n textBuffer = handleMessageUpdate(event, textBuffer);\n break;\n case \"tool_call\":\n handleToolCall(event);\n break;\n case \"error\":\n handleError(event);\n break;\n case \"agent_end\":\n case \"turn_end\":\n textBuffer = handleTurnBoundary(event, textBuffer);\n break;\n case \"session_info\":\n break;\n default:\n handleSubagent(event);\n break;\n }\n });\n\n return {\n get state() {\n return state;\n },\n\n send(text: string) {\n if (state === \"stopped\") return;\n setState(\"active\");\n textBuffer = \"\";\n session.driver.prompt(text).catch((err: Error) => {\n emit({ type: \"error\", message: err.message });\n setState(\"idle\");\n });\n },\n\n stop() {\n setState(\"stopped\");\n session.driver.kill();\n session.dispose();\n },\n };\n}\n\n/**\n * Create a telemetry sink that pipes {@link TelemetryLogEntry} events to the log callback.\n *\n * Wraps {@link renderLog} so that only displayable entries (generation, span_end for\n * tool/turn, trace lifecycle) are forwarded. Entries that `renderLog` returns `null`\n * for are silently suppressed. The returned function is used in `startRepl` to drain\n * buffered telemetry and to wire up live forwarding during the session.\n *\n * @param onLog - Callback invoked with an ANSI-rendered log string.\n * @returns A function that accepts a `TelemetryLogEntry` and routes it to `onLog`.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createTelemetrySink(\n onLog: (line: string) => void,\n): (entry: TelemetryLogEntry) => void {\n return (entry) => {\n const text = renderLog(entry);\n if (text) onLog(text);\n };\n}\n","/**\n * Local telemetry sink that emits structured events to the TUI log panel.\n *\n * Implements `TelemetryProvider` so it can be injected into `createAgentSession`\n * without any HTTP or OpenTelemetry overhead. Instead of exporting spans over a\n * network, it converts each lifecycle event (trace start/end, span start/end,\n * generation, metric) into a {@link TelemetryLogEntry} and forwards it via the\n * `onEvent` callback. The REPL uses this to optionally display timing and token\n * cost inline when `--verbose` is active.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type {\n Attributes,\n GenerationEvent,\n Span,\n SpanKind,\n SpanOptions,\n SpanResult,\n TelemetryProvider,\n Trace,\n TraceOptions,\n} from \"@skaile/workspaces/telemetry\";\n\n// ── Telemetry log entry types ────────────────────────────────────────────────\n\n/**\n * A structured telemetry event emitted by {@link TuiTelemetryProvider}.\n *\n * Discriminated union over `kind`. The TUI renders a subset of these (generation,\n * span_end for tool/turn, trace lifecycle) and suppresses the rest. Used as input\n * to {@link formatTelemetryEntry} and {@link renderLog}.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport type TelemetryLogEntry =\n | { kind: \"trace_start\"; traceId: string; name: string; traceKind: string }\n | { kind: \"trace_end\"; traceId: string; status: string; durationMs: number }\n | { kind: \"span_start\"; spanId: string; name: string; spanKind: SpanKind }\n | {\n kind: \"span_end\";\n spanId: string;\n name: string;\n spanKind: SpanKind;\n status: string;\n durationMs: number;\n }\n | {\n kind: \"generation\";\n model: string;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n durationMs: number;\n }\n | { kind: \"metric\"; name: string; value: number };\n\n// ── Internal span tracking ───────────────────────────────────────────────────\n\ninterface SpanRecord {\n spanId: string;\n traceId: string;\n name: string;\n spanKind: SpanKind;\n startTime: number;\n}\n\n// ── Provider ─────────────────────────────────────────────────────────────────\n\nexport class TuiTelemetryProvider implements TelemetryProvider {\n private readonly onEvent: (entry: TelemetryLogEntry) => void;\n private readonly spans = new Map<string, SpanRecord>();\n private readonly traces = new Map<string, { name: string; startTime: number }>();\n\n constructor(onEvent: (entry: TelemetryLogEntry) => void) {\n this.onEvent = onEvent;\n }\n\n startTrace(opts: TraceOptions): Trace {\n const traceId = randomUUID().replace(/-/g, \"\");\n const rootSpan: Span = { spanId: randomUUID().slice(0, 16), traceId };\n\n this.traces.set(traceId, { name: opts.name, startTime: Date.now() });\n this.onEvent({ kind: \"trace_start\", traceId, name: opts.name, traceKind: opts.kind });\n\n return { traceId, rootSpan };\n }\n\n endTrace(trace: Trace, result?: SpanResult): void {\n const record = this.traces.get(trace.traceId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"trace_end\",\n traceId: trace.traceId,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.traces.delete(trace.traceId);\n }\n }\n\n startSpan(parent: Trace | Span, opts: SpanOptions): Span {\n const spanId = randomUUID().slice(0, 16);\n const traceId = parent.traceId;\n const span: Span = { spanId, traceId };\n\n this.spans.set(spanId, {\n spanId,\n traceId,\n name: opts.name,\n spanKind: opts.kind,\n startTime: Date.now(),\n });\n\n this.onEvent({ kind: \"span_start\", spanId, name: opts.name, spanKind: opts.kind });\n return span;\n }\n\n endSpan(span: Span, result?: SpanResult): void {\n const record = this.spans.get(span.spanId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"span_end\",\n spanId: span.spanId,\n name: record.name,\n spanKind: record.spanKind,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.spans.delete(span.spanId);\n }\n }\n\n addEvent(_span: Span, _name: string, _attrs?: Attributes): void {\n // Silently ignored — events are not surfaced in TUI\n }\n\n logGeneration(_span: Span, generation: GenerationEvent): void {\n this.onEvent({\n kind: \"generation\",\n model: generation.model,\n inputTokens: generation.inputTokens ?? 0,\n outputTokens: generation.outputTokens ?? 0,\n costUsd: generation.costUsd ?? 0,\n durationMs: generation.durationMs,\n });\n }\n\n recordMetric(name: string, value: number, _tags?: Record<string, string>): void {\n this.onEvent({ kind: \"metric\", name, value });\n }\n\n async flush(): Promise<void> {}\n async shutdown(): Promise<void> {\n this.spans.clear();\n this.traces.clear();\n }\n}\n\n// ── Log formatting ───────────────────────────────────────────────────────────\n\n/**\n * Format a {@link TelemetryLogEntry} into a human-readable string for the log panel.\n *\n * Produces plain (no ANSI) strings suitable for structured logging or non-terminal\n * output. The format mirrors {@link renderLog} but without colour codes: generation\n * entries include model, token counts, cost, and duration; span_end entries for\n * `tool_call` and `agent_turn` kinds include name, status, and duration; trace\n * lifecycle entries include name and elapsed time. Returns `null` for entry kinds\n * that should not be displayed.\n *\n * @param entry - The structured telemetry event to format.\n * @returns Human-readable string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport function formatTelemetryEntry(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return `[gen] ${entry.model} ${tokens}${cost}${dur}`;\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return `[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`;\n }\n if (entry.spanKind === \"agent_turn\") {\n return `[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`;\n }\n return null;\n case \"trace_start\":\n return `[trace] ${entry.name} started`;\n case \"trace_end\":\n return `[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`;\n default:\n return null;\n }\n}\n","/**\n * Simple @clack-based agent REPL.\n * No React, no ink, no alt-screen — just a scrolling terminal.\n *\n * Design: clack's text() blocks until user submits, so agent output\n * flows naturally between prompts — no readline interleaving issues.\n * Loop: await text() → send → await idle → loop\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, join, parse, resolve } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { loadConnectorDeclarations } from \"@skaile/workspaces/connectors\";\nimport { resolveAgentDir, resolveSettings } from \"@skaile/workspaces/core\";\nimport { createAgentSession } from \"@skaile/workspaces/runner\";\nimport pc from \"picocolors\";\nimport { createReplSession, createTelemetrySink } from \"./repl-session.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\nimport { TuiTelemetryProvider } from \"./telemetry.js\";\n\nfunction findAiAssetsRoot(startDir: string): string | undefined {\n let current = resolve(startDir);\n const root = parse(current).root;\n while (current !== root) {\n const candidate = join(current, \"ai-assets\");\n try {\n if (statSync(candidate).isDirectory()) return candidate;\n } catch {}\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\nfunction countSkills(projectDir: string): number {\n const aiAssetsRoot = findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return 0;\n let count = 0;\n const walk = (dir: string) => {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n if (entries.some((e) => e.isFile() && e.name === \"SKILL.md\")) {\n count++;\n return;\n }\n for (const e of entries) {\n if (e.isDirectory()) walk(join(dir, e.name));\n }\n };\n walk(aiAssetsRoot);\n return count;\n}\n\n/**\n * Options for {@link startRepl}.\n *\n * @param projectDir - Absolute path to the project root. Used to locate the agent dir, settings, and skill count.\n * @param cwd - Working directory passed to the agent process. Defaults to `projectDir`.\n * @param driver - Agent driver override (`\"omp\"` or `\"claude-sdk\"`). Falls back to settings resolution.\n * @param model - Model name passed to the agent driver.\n * @param provider - Provider name passed to the agent driver.\n * @param resume - When `true`, load the last session ID from `.skaile/last_session` and resume it.\n * @param resumeSessionId - Explicit session ID to resume. Takes precedence over `resume`.\n * @param verbose - When `true`, show telemetry log lines inline between prompts. Default: `false`.\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport interface ReplOptions {\n projectDir: string;\n cwd?: string;\n driver?: string;\n model?: string;\n provider?: string;\n resume?: boolean;\n resumeSessionId?: string;\n /** When true, show telemetry log lines inline. Default: false. */\n verbose?: boolean;\n}\n\n/**\n * Inject the ephemeral OMP workspace extension when the resolved driver is `omp`.\n *\n * Writes `.omp/extensions/skaile.ts` under {@link agentCwd} and returns a cleanup\n * callback that removes it. For non-`omp` drivers this is a no-op (returns `undefined`).\n */\nasync function injectOmpExtension(\n resolvedDriver: string,\n projectDir: string,\n agentCwd: string,\n): Promise<(() => void) | undefined> {\n if (resolvedDriver !== \"omp\") return undefined;\n\n const fsAsync = await import(\"node:fs/promises\");\n const pathMod = await import(\"node:path\");\n const { WorkspacePlugin } = await import(\"@skaile/workspaces/workspace-plugin\");\n\n const plugin = new WorkspacePlugin({ projectDir });\n const src = await plugin.buildOmpExtensionSource();\n const extPath = pathMod.default.join(agentCwd, \".omp\", \"extensions\", \"skaile.ts\");\n await fsAsync.default.mkdir(pathMod.default.dirname(extPath), { recursive: true });\n await fsAsync.default.writeFile(extPath, src);\n return () => {\n fsAsync.default.unlink(extPath).catch(() => {});\n };\n}\n\n/**\n * Resolve the session ID to resume, honoring the explicit `resumeSessionId` first\n * and otherwise reading `.skaile/last_session` when `resume` is set.\n */\nfunction resolveResumeSessionId(projectDir: string, opts: ReplOptions): string | undefined {\n let resumeSessionId = opts.resumeSessionId;\n if (!resumeSessionId && opts.resume) {\n const sessionFile = join(projectDir, \".skaile\", \"last_session\");\n try {\n if (existsSync(sessionFile)) {\n resumeSessionId = readFileSync(sessionFile, \"utf-8\").trim() || undefined;\n }\n } catch {}\n }\n return resumeSessionId;\n}\n\n/** Print the REPL intro banner with project, agent, and resume metadata. */\nfunction printBanner(args: {\n projectDir: string;\n displayDriver: string;\n displayModel: string;\n agentDir: string | undefined;\n resumeSessionId: string | undefined;\n}): void {\n const { projectDir, displayDriver, displayModel, agentDir, resumeSessionId } = args;\n\n const skillCount = countSkills(projectDir);\n let connectorCount = 0;\n try {\n connectorCount = loadConnectorDeclarations(projectDir).length;\n } catch {}\n const agentName = agentDir ? basename(agentDir) : \"(none)\";\n\n p.intro(`${pc.bold(\"skaile repl\")} ${pc.dim(`— ${displayDriver} / ${displayModel}`)}`);\n p.log.info(pc.dim(`Project: ${projectDir}`));\n p.log.info(pc.dim(`Agent: ${agentName} · ${skillCount} skills · ${connectorCount} connectors`));\n if (resumeSessionId) p.log.info(pc.dim(`Resumed: ${resumeSessionId.slice(0, 12)}...`));\n p.log.info(pc.dim(\"Type /help for commands, Ctrl+C to quit.\"));\n}\n\n/** Discriminated outcome of handling a single line of REPL input. */\ntype ReplInputAction = \"quit\" | \"continue\" | \"send\";\n\n/**\n * Handle a trimmed line of REPL input that is a slash command (or empty).\n *\n * Returns `\"quit\"` to terminate the loop, `\"continue\"` to skip to the next prompt,\n * or `\"send\"` to forward the line to the agent. `setShowLog` toggles verbose output\n * for the `/log` command.\n */\nfunction handleReplInput(\n trimmed: string,\n showLog: boolean,\n setShowLog: (v: boolean) => void,\n): ReplInputAction {\n if (!trimmed) return \"continue\";\n\n if (trimmed === \"/quit\" || trimmed === \"/q\") {\n return \"quit\";\n }\n if (trimmed === \"/help\" || trimmed === \"/h\" || trimmed === \"/?\") {\n p.log.info(\n [\n \" /help, /h — this help\",\n \" /log — toggle verbose log output\",\n \" /quit, /q — exit\",\n \" Ctrl+C — exit\",\n ].join(\"\\n\"),\n );\n return \"continue\";\n }\n if (trimmed === \"/log\") {\n const next = !showLog;\n setShowLog(next);\n p.log.info(`Log output: ${next ? \"on\" : \"off\"}`);\n return \"continue\";\n }\n\n return \"send\";\n}\n\n/**\n * Start the scrolling REPL for an interactive agent conversation.\n *\n * Initialises the agent session (including OMP extension injection when the driver is `omp`),\n * prints a banner with project metadata, then enters a `@clack/prompts` input loop.\n * Each iteration awaits user input, forwards it to the agent via {@link createReplSession},\n * and blocks until the agent signals `idle` or `stopped`. Slash commands (`/help`, `/log`,\n * `/quit`) are handled before the message reaches the agent.\n *\n * @param opts - Configuration for the REPL session.\n * @returns Resolves when the session ends (user quit or fatal error).\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport async function startRepl(opts: ReplOptions): Promise<void> {\n const projectDir = resolve(opts.projectDir);\n const agentCwd = opts.cwd ? resolve(opts.cwd) : projectDir;\n\n // ── OMP workspace extension injection ──────────────────────────────\n const settings = await resolveSettings(projectDir, { driver: opts.driver });\n const resolvedDriver = settings.driver ?? \"omp\";\n const ompCleanup = await injectOmpExtension(resolvedDriver, projectDir, agentCwd);\n\n // ── Session resume ─────────────────────────────────────────────────\n const resumeSessionId = resolveResumeSessionId(projectDir, opts);\n\n // ── Telemetry ──────────────────────────────────────────────────────\n const telemetryBuffer: TelemetryLogEntry[] = [];\n const telemetry = new TuiTelemetryProvider((entry) => {\n telemetryBuffer.push(entry);\n });\n const trace = telemetry.startTrace({ name: \"skaile-repl\", kind: \"chat_session\" });\n\n // ── Create agent session ───────────────────────────────────────────\n const agentDir = resolveAgentDir(projectDir) ?? undefined;\n const session = await createAgentSession({\n projectDir,\n cwd: agentCwd !== projectDir ? agentCwd : undefined,\n agentDir,\n driver: opts.driver ?? resolvedDriver,\n model: opts.model,\n provider: opts.provider,\n resumeSessionId,\n telemetry,\n trace,\n onLog: () => {},\n });\n\n await session.driver.start();\n\n // ── Output + state tracking ────────────────────────────────────────\n let showLog = opts.verbose ?? false;\n let idleResolve: (() => void) | undefined;\n\n const write = (line: string) => {\n p.log.message(line);\n };\n\n const writeLog = (line: string) => {\n if (showLog) p.log.step(line);\n };\n\n // ── Create REPL session ────────────────────────────────────────────\n const replSession = createReplSession({\n session,\n onLine: write,\n onLog: writeLog,\n onStateChange: (state) => {\n if (state === \"idle\" || state === \"stopped\") {\n idleResolve?.();\n }\n },\n });\n\n // Drain buffered telemetry\n const sink = createTelemetrySink(writeLog);\n for (const entry of telemetryBuffer) sink(entry);\n telemetryBuffer.length = 0;\n\n // ── Banner ─────────────────────────────────────────────────────────\n printBanner({\n projectDir,\n displayDriver: session.driverType ?? resolvedDriver,\n displayModel: session.model ?? opts.model ?? \"default\",\n agentDir,\n resumeSessionId,\n });\n\n // ── REPL loop ──────────────────────────────────────────────────────\n function shutdown() {\n replSession.stop();\n telemetry.endTrace(trace, { status: \"ok\" });\n void telemetry.shutdown();\n ompCleanup?.();\n p.outro(\"Bye.\");\n process.exit(0);\n }\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n while (replSession.state !== \"stopped\") {\n const input = await p.text({\n message: pc.gray(\">>>\"),\n placeholder: \"\",\n });\n\n if (p.isCancel(input)) {\n shutdown();\n return;\n }\n\n const trimmed = (input as string).trim();\n const action = handleReplInput(trimmed, showLog, (v) => {\n showLog = v;\n });\n if (action === \"quit\") {\n shutdown();\n return;\n }\n if (action === \"continue\") continue;\n\n const idlePromise = new Promise<void>((resolve) => {\n idleResolve = resolve;\n });\n replSession.send(trimmed);\n await idlePromise;\n }\n\n shutdown();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../tui/src/repl-renderer.ts","../../tui/src/repl-session.ts","../../tui/src/telemetry.ts","../../tui/src/repl.ts"],"names":["text","pc","resolve"],"mappings":"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","file":"index.js","sourcesContent":["import type { OutputLine } from \"@skaile/workspaces\";\nimport pc from \"picocolors\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Render a single OutputLine to an ANSI-colored string for terminal display.\n *\n * Each `OutputLine` variant is mapped to a distinct colour: user input (cyan/bold),\n * agent text (plain), tool calls (blue italic), questions (yellow), errors (red),\n * status/system messages (dim italic), subagent lifecycle (blue/green italic), and\n * separator lines (dim dashes). Returns an empty string for unrecognised variants.\n *\n * @param line - The typed output line to render.\n * @returns ANSI-coloured string ready for terminal output.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLine(line: OutputLine): string {\n switch (line.type) {\n case \"user\":\n return pc.cyan(pc.bold(`> ${line.content}`));\n case \"text\":\n return line.content;\n case \"tool\":\n return pc.blue(pc.italic(` Running: \\`${line.name}\\`...`));\n case \"question\":\n return pc.yellow(`?? ${line.text}\\n Reply below.`);\n case \"error\":\n return pc.red(`Error: ${line.message}`);\n case \"status\":\n return pc.dim(pc.italic(`${line.phase}...`));\n case \"system\":\n return pc.dim(pc.italic(line.message));\n case \"subagent\": {\n const icon = line.status === \"started\" ? \"▶\" : \"✓\";\n const color = line.status === \"started\" ? pc.blue : pc.green;\n return color(pc.italic(` ${icon} ${line.name}: ${line.description}`));\n }\n case \"separator\":\n return pc.dim(\"─\".repeat(60));\n default:\n return \"\";\n }\n}\n\n/**\n * Render a telemetry log entry to an ANSI string, or null to suppress.\n *\n * Formats `generation` entries with model name, token counts, cost, and duration;\n * `span_end` entries for `tool_call` and `agent_turn` kinds; and `trace_start` /\n * `trace_end` lifecycle entries. All output is styled dim for visual de-emphasis.\n * Returns `null` for entry kinds that should not appear in the log panel.\n *\n * @param entry - The structured telemetry event to render.\n * @returns Dim ANSI string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#repl-renderer\n */\nexport function renderLog(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return pc.dim(`[gen] ${entry.model} ${tokens}${cost}${dur}`);\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return pc.dim(`[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`);\n }\n if (entry.spanKind === \"agent_turn\") {\n return pc.dim(`[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`);\n }\n return null;\n case \"trace_start\":\n return pc.dim(`[trace] ${entry.name} started`);\n case \"trace_end\":\n return pc.dim(`[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`);\n default:\n return null;\n }\n}\n","/**\n * Slim event bridge: maps AgentDriver events to rendered console lines.\n * No React, no ink, no UI state — just event → string → callback.\n */\n\nimport type { OutputLine, SessionState } from \"@skaile/workspaces\";\nimport type { AgentEvent } from \"@skaile/workspaces/bridge\";\nimport type { AgentSession } from \"@skaile/workspaces/runner\";\nimport { renderLine, renderLog } from \"./repl-renderer.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\n\n/**\n * Handle returned by {@link createReplSession} for controlling an active REPL session.\n *\n * `state` reflects the current lifecycle state (`idle`, `active`, or `stopped`).\n * Call `send(text)` to forward a user message to the agent driver; the state\n * transitions to `active` until the driver emits `agent_end`. Call `stop()` to\n * terminate the driver and dispose of the underlying agent session.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface ReplSessionHandle {\n readonly state: SessionState;\n send(text: string): void;\n stop(): void;\n}\n\n/**\n * Options for {@link createReplSession}.\n *\n * @param session - The agent session returned by `createAgentSession`.\n * @param onLine - Callback invoked with an ANSI-rendered string for each output line.\n * @param onLog - Callback invoked with a log string for each telemetry event (if verbose).\n * @param onStateChange - Callback invoked whenever the session state changes.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport interface CreateReplSessionOpts {\n session: AgentSession;\n onLine?: (line: string) => void;\n onLog?: (line: string) => void;\n onStateChange?: (state: SessionState) => void;\n}\n\n/**\n * Create a slim event bridge that maps `AgentEvent` stream to rendered console lines.\n *\n * Subscribes to `agent-event` on the session driver and converts each event type\n * (`message_update`, `tool_call`, `error`, `agent_end`, `turn_end`, `subagent`) to\n * an `OutputLine`, renders it via {@link renderLine}, and forwards the string to\n * `opts.onLine`. Text content is buffered internally and flushed line-by-line as\n * newlines arrive. Returns a {@link ReplSessionHandle} for sending messages and\n * stopping the session.\n *\n * @param opts - Session, output callbacks, and state-change hook.\n * @returns Handle for sending messages and observing session state.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createReplSession(opts: CreateReplSessionOpts): ReplSessionHandle {\n const { session, onLine, onLog, onStateChange } = opts;\n\n let state: SessionState = \"idle\";\n let textBuffer = \"\";\n\n function emit(outputLine: OutputLine) {\n const rendered = renderLine(outputLine);\n if (rendered) onLine?.(rendered);\n }\n\n function setState(s: SessionState) {\n state = s;\n onStateChange?.(s);\n }\n\n // Buffer the incoming text delta and flush every completed (newline-terminated)\n // line; returns the new buffer holding the trailing partial line.\n function handleMessageUpdate(event: AgentEvent, buffer: string): string {\n const delta = (event as any)._textDelta as string | undefined;\n if (!delta) return buffer;\n let next = buffer + delta;\n const lines = next.split(\"\\n\");\n if (lines.length > 1) {\n for (let i = 0; i < lines.length - 1; i++) {\n emit({ type: \"text\", content: lines[i]! });\n }\n next = lines[lines.length - 1]!;\n }\n return next;\n }\n\n function handleToolCall(event: AgentEvent) {\n const name = (event as any).tool?.name ?? (event as any).name ?? \"unknown\";\n emit({ type: \"tool\", name });\n }\n\n function handleError(event: AgentEvent) {\n const msg = (event as any).error ?? \"Unknown error\";\n emit({ type: \"error\", message: String(msg) });\n if ((event as any).fatal) setState(\"stopped\");\n }\n\n // Flush any buffered text, emit a separator, and (on agent_end) go idle;\n // returns the cleared buffer.\n function handleTurnBoundary(event: AgentEvent, buffer: string): string {\n if (buffer.trim()) {\n emit({ type: \"text\", content: buffer });\n }\n emit({ type: \"separator\" });\n if (event.type === \"agent_end\") setState(\"idle\");\n return \"\";\n }\n\n function handleSubagent(event: AgentEvent) {\n const raw = event as any;\n if (raw.type !== \"subagent\") return;\n const status = raw.status === \"finished\" ? \"finished\" : \"started\";\n emit({\n type: \"subagent\",\n name: raw.name ?? \"subagent\",\n status,\n description: raw.description ?? \"\",\n });\n }\n\n session.driver.on(\"agent-event\", (event: AgentEvent) => {\n switch (event.type) {\n case \"message_update\":\n textBuffer = handleMessageUpdate(event, textBuffer);\n break;\n case \"tool_call\":\n handleToolCall(event);\n break;\n case \"error\":\n handleError(event);\n break;\n case \"agent_end\":\n case \"turn_end\":\n textBuffer = handleTurnBoundary(event, textBuffer);\n break;\n case \"session_info\":\n break;\n default:\n handleSubagent(event);\n break;\n }\n });\n\n return {\n get state() {\n return state;\n },\n\n send(text: string) {\n if (state === \"stopped\") return;\n setState(\"active\");\n textBuffer = \"\";\n session.driver.prompt(text).catch((err: Error) => {\n emit({ type: \"error\", message: err.message });\n setState(\"idle\");\n });\n },\n\n stop() {\n setState(\"stopped\");\n session.driver.kill();\n session.dispose();\n },\n };\n}\n\n/**\n * Create a telemetry sink that pipes {@link TelemetryLogEntry} events to the log callback.\n *\n * Wraps {@link renderLog} so that only displayable entries (generation, span_end for\n * tool/turn, trace lifecycle) are forwarded. Entries that `renderLog` returns `null`\n * for are silently suppressed. The returned function is used in `startRepl` to drain\n * buffered telemetry and to wire up live forwarding during the session.\n *\n * @param onLog - Callback invoked with an ANSI-rendered log string.\n * @returns A function that accepts a `TelemetryLogEntry` and routes it to `onLog`.\n *\n * @docLink packages/tui/concepts#repl-session\n */\nexport function createTelemetrySink(\n onLog: (line: string) => void,\n): (entry: TelemetryLogEntry) => void {\n return (entry) => {\n const text = renderLog(entry);\n if (text) onLog(text);\n };\n}\n","/**\n * Local telemetry sink that emits structured events to the TUI log panel.\n *\n * Implements `TelemetryProvider` so it can be injected into `createAgentSession`\n * without any HTTP or OpenTelemetry overhead. Instead of exporting spans over a\n * network, it converts each lifecycle event (trace start/end, span start/end,\n * generation, metric) into a {@link TelemetryLogEntry} and forwards it via the\n * `onEvent` callback. The REPL uses this to optionally display timing and token\n * cost inline when `--verbose` is active.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type {\n Attributes,\n GenerationEvent,\n Span,\n SpanKind,\n SpanOptions,\n SpanResult,\n TelemetryProvider,\n Trace,\n TraceOptions,\n} from \"@skaile/workspaces/telemetry\";\n\n// ── Telemetry log entry types ────────────────────────────────────────────────\n\n/**\n * A structured telemetry event emitted by {@link TuiTelemetryProvider}.\n *\n * Discriminated union over `kind`. The TUI renders a subset of these (generation,\n * span_end for tool/turn, trace lifecycle) and suppresses the rest. Used as input\n * to {@link formatTelemetryEntry} and {@link renderLog}.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport type TelemetryLogEntry =\n | { kind: \"trace_start\"; traceId: string; name: string; traceKind: string }\n | { kind: \"trace_end\"; traceId: string; status: string; durationMs: number }\n | { kind: \"span_start\"; spanId: string; name: string; spanKind: SpanKind }\n | {\n kind: \"span_end\";\n spanId: string;\n name: string;\n spanKind: SpanKind;\n status: string;\n durationMs: number;\n }\n | {\n kind: \"generation\";\n model: string;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n durationMs: number;\n }\n | { kind: \"metric\"; name: string; value: number };\n\n// ── Internal span tracking ───────────────────────────────────────────────────\n\ninterface SpanRecord {\n spanId: string;\n traceId: string;\n name: string;\n spanKind: SpanKind;\n startTime: number;\n}\n\n// ── Provider ─────────────────────────────────────────────────────────────────\n\nexport class TuiTelemetryProvider implements TelemetryProvider {\n private readonly onEvent: (entry: TelemetryLogEntry) => void;\n private readonly spans = new Map<string, SpanRecord>();\n private readonly traces = new Map<string, { name: string; startTime: number }>();\n\n constructor(onEvent: (entry: TelemetryLogEntry) => void) {\n this.onEvent = onEvent;\n }\n\n startTrace(opts: TraceOptions): Trace {\n const traceId = randomUUID().replace(/-/g, \"\");\n const rootSpan: Span = { spanId: randomUUID().slice(0, 16), traceId };\n\n this.traces.set(traceId, { name: opts.name, startTime: Date.now() });\n this.onEvent({ kind: \"trace_start\", traceId, name: opts.name, traceKind: opts.kind });\n\n return { traceId, rootSpan };\n }\n\n endTrace(trace: Trace, result?: SpanResult): void {\n const record = this.traces.get(trace.traceId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"trace_end\",\n traceId: trace.traceId,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.traces.delete(trace.traceId);\n }\n }\n\n startSpan(parent: Trace | Span, opts: SpanOptions): Span {\n const spanId = randomUUID().slice(0, 16);\n const traceId = parent.traceId;\n const span: Span = { spanId, traceId };\n\n this.spans.set(spanId, {\n spanId,\n traceId,\n name: opts.name,\n spanKind: opts.kind,\n startTime: Date.now(),\n });\n\n this.onEvent({ kind: \"span_start\", spanId, name: opts.name, spanKind: opts.kind });\n return span;\n }\n\n endSpan(span: Span, result?: SpanResult): void {\n const record = this.spans.get(span.spanId);\n if (record) {\n const durationMs = Date.now() - record.startTime;\n this.onEvent({\n kind: \"span_end\",\n spanId: span.spanId,\n name: record.name,\n spanKind: record.spanKind,\n status: result?.status ?? \"ok\",\n durationMs,\n });\n this.spans.delete(span.spanId);\n }\n }\n\n addEvent(_span: Span, _name: string, _attrs?: Attributes): void {\n // Silently ignored — events are not surfaced in TUI\n }\n\n logGeneration(_span: Span, generation: GenerationEvent): void {\n this.onEvent({\n kind: \"generation\",\n model: generation.model,\n inputTokens: generation.inputTokens ?? 0,\n outputTokens: generation.outputTokens ?? 0,\n costUsd: generation.costUsd ?? 0,\n durationMs: generation.durationMs,\n });\n }\n\n recordMetric(name: string, value: number, _tags?: Record<string, string>): void {\n this.onEvent({ kind: \"metric\", name, value });\n }\n\n async flush(): Promise<void> {}\n async shutdown(): Promise<void> {\n this.spans.clear();\n this.traces.clear();\n }\n}\n\n// ── Log formatting ───────────────────────────────────────────────────────────\n\n/**\n * Format a {@link TelemetryLogEntry} into a human-readable string for the log panel.\n *\n * Produces plain (no ANSI) strings suitable for structured logging or non-terminal\n * output. The format mirrors {@link renderLog} but without colour codes: generation\n * entries include model, token counts, cost, and duration; span_end entries for\n * `tool_call` and `agent_turn` kinds include name, status, and duration; trace\n * lifecycle entries include name and elapsed time. Returns `null` for entry kinds\n * that should not be displayed.\n *\n * @param entry - The structured telemetry event to format.\n * @returns Human-readable string, or `null` if the entry should be suppressed.\n *\n * @docLink packages/tui/concepts#tui-telemetry-provider\n */\nexport function formatTelemetryEntry(entry: TelemetryLogEntry): string | null {\n switch (entry.kind) {\n case \"generation\": {\n const tokens = `${entry.inputTokens}↑ ${entry.outputTokens}↓`;\n const cost = entry.costUsd > 0 ? ` $${entry.costUsd.toFixed(4)}` : \"\";\n const dur = entry.durationMs > 0 ? ` ${(entry.durationMs / 1000).toFixed(1)}s` : \"\";\n return `[gen] ${entry.model} ${tokens}${cost}${dur}`;\n }\n case \"span_end\":\n if (entry.spanKind === \"tool_call\") {\n return `[tool] ${entry.name} ${entry.status} ${entry.durationMs}ms`;\n }\n if (entry.spanKind === \"agent_turn\") {\n return `[turn] ${entry.name} ${(entry.durationMs / 1000).toFixed(1)}s`;\n }\n return null;\n case \"trace_start\":\n return `[trace] ${entry.name} started`;\n case \"trace_end\":\n return `[trace] done ${(entry.durationMs / 1000).toFixed(1)}s`;\n default:\n return null;\n }\n}\n","/**\n * Simple @clack-based agent REPL.\n * No React, no ink, no alt-screen — just a scrolling terminal.\n *\n * Design: clack's text() blocks until user submits, so agent output\n * flows naturally between prompts — no readline interleaving issues.\n * Loop: await text() → send → await idle → loop\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, join, parse, resolve } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { loadConnectorDeclarations } from \"@skaile/workspaces/connectors\";\nimport { resolveAgentDir, resolveSettings } from \"@skaile/workspaces/core\";\nimport { createAgentSession } from \"@skaile/workspaces/runner\";\nimport pc from \"picocolors\";\nimport { createReplSession, createTelemetrySink } from \"./repl-session.js\";\nimport type { TelemetryLogEntry } from \"./telemetry.js\";\nimport { TuiTelemetryProvider } from \"./telemetry.js\";\n\nfunction findAiAssetsRoot(startDir: string): string | undefined {\n let current = resolve(startDir);\n const root = parse(current).root;\n while (current !== root) {\n const candidate = join(current, \"ai-assets\");\n try {\n if (statSync(candidate).isDirectory()) return candidate;\n } catch {}\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\nfunction countSkills(projectDir: string): number {\n const aiAssetsRoot = findAiAssetsRoot(projectDir);\n if (!aiAssetsRoot) return 0;\n let count = 0;\n const walk = (dir: string) => {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n if (entries.some((e) => e.isFile() && e.name === \"SKILL.md\")) {\n count++;\n return;\n }\n for (const e of entries) {\n if (e.isDirectory()) walk(join(dir, e.name));\n }\n };\n walk(aiAssetsRoot);\n return count;\n}\n\n/**\n * Options for {@link startRepl}.\n *\n * @param projectDir - Absolute path to the project root. Used to locate the agent dir, settings, and skill count.\n * @param cwd - Working directory passed to the agent process. Defaults to `projectDir`.\n * @param driver - Agent driver override (`\"omp\"` or `\"claude-sdk\"`). Falls back to settings resolution.\n * @param model - Model name passed to the agent driver.\n * @param provider - Provider name passed to the agent driver.\n * @param resume - When `true`, load the last session ID from `.skaile/last_session` and resume it.\n * @param resumeSessionId - Explicit session ID to resume. Takes precedence over `resume`.\n * @param verbose - When `true`, show telemetry log lines inline between prompts. Default: `false`.\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport interface ReplOptions {\n projectDir: string;\n cwd?: string;\n driver?: string;\n model?: string;\n provider?: string;\n resume?: boolean;\n resumeSessionId?: string;\n /** When true, show telemetry log lines inline. Default: false. */\n verbose?: boolean;\n}\n\n/**\n * Inject the ephemeral OMP workspace extension when the resolved driver is `omp`.\n *\n * Writes `.omp/extensions/skaile.ts` under {@link agentCwd} and returns a cleanup\n * callback that removes it. For non-`omp` drivers this is a no-op (returns `undefined`).\n */\nasync function injectOmpExtension(\n resolvedDriver: string,\n projectDir: string,\n agentCwd: string,\n): Promise<(() => void) | undefined> {\n if (resolvedDriver !== \"omp\") return undefined;\n\n const fsAsync = await import(\"node:fs/promises\");\n const pathMod = await import(\"node:path\");\n const { WorkspacePlugin } = await import(\"@skaile/workspaces/workspace-plugin\");\n\n const plugin = new WorkspacePlugin({ projectDir });\n const src = await plugin.buildOmpExtensionSource();\n const extPath = pathMod.default.join(agentCwd, \".omp\", \"extensions\", \"skaile.ts\");\n await fsAsync.default.mkdir(pathMod.default.dirname(extPath), { recursive: true });\n await fsAsync.default.writeFile(extPath, src);\n return () => {\n fsAsync.default.unlink(extPath).catch(() => {});\n };\n}\n\n/**\n * Resolve the session ID to resume, honoring the explicit `resumeSessionId` first\n * and otherwise reading `.skaile/last_session` when `resume` is set.\n */\nfunction resolveResumeSessionId(projectDir: string, opts: ReplOptions): string | undefined {\n let resumeSessionId = opts.resumeSessionId;\n if (!resumeSessionId && opts.resume) {\n const sessionFile = join(projectDir, \".skaile\", \"last_session\");\n try {\n if (existsSync(sessionFile)) {\n resumeSessionId = readFileSync(sessionFile, \"utf-8\").trim() || undefined;\n }\n } catch {}\n }\n return resumeSessionId;\n}\n\n/** Print the REPL intro banner with project, agent, and resume metadata. */\nfunction printBanner(args: {\n projectDir: string;\n displayDriver: string;\n displayModel: string;\n agentDir: string | undefined;\n resumeSessionId: string | undefined;\n}): void {\n const { projectDir, displayDriver, displayModel, agentDir, resumeSessionId } = args;\n\n const skillCount = countSkills(projectDir);\n let connectorCount = 0;\n try {\n connectorCount = loadConnectorDeclarations(projectDir).length;\n } catch {}\n const agentName = agentDir ? basename(agentDir) : \"(none)\";\n\n p.intro(`${pc.bold(\"skaile repl\")} ${pc.dim(`— ${displayDriver} / ${displayModel}`)}`);\n p.log.info(pc.dim(`Project: ${projectDir}`));\n p.log.info(pc.dim(`Agent: ${agentName} · ${skillCount} skills · ${connectorCount} connectors`));\n if (resumeSessionId) p.log.info(pc.dim(`Resumed: ${resumeSessionId.slice(0, 12)}...`));\n p.log.info(pc.dim(\"Type /help for commands, Ctrl+C to quit.\"));\n}\n\n/** Discriminated outcome of handling a single line of REPL input. */\ntype ReplInputAction = \"quit\" | \"continue\" | \"send\";\n\n/**\n * Handle a trimmed line of REPL input that is a slash command (or empty).\n *\n * Returns `\"quit\"` to terminate the loop, `\"continue\"` to skip to the next prompt,\n * or `\"send\"` to forward the line to the agent. `setShowLog` toggles verbose output\n * for the `/log` command.\n */\nfunction handleReplInput(\n trimmed: string,\n showLog: boolean,\n setShowLog: (v: boolean) => void,\n): ReplInputAction {\n if (!trimmed) return \"continue\";\n\n if (trimmed === \"/quit\" || trimmed === \"/q\") {\n return \"quit\";\n }\n if (trimmed === \"/help\" || trimmed === \"/h\" || trimmed === \"/?\") {\n p.log.info(\n [\n \" /help, /h — this help\",\n \" /log — toggle verbose log output\",\n \" /quit, /q — exit\",\n \" Ctrl+C — exit\",\n ].join(\"\\n\"),\n );\n return \"continue\";\n }\n if (trimmed === \"/log\") {\n const next = !showLog;\n setShowLog(next);\n p.log.info(`Log output: ${next ? \"on\" : \"off\"}`);\n return \"continue\";\n }\n\n return \"send\";\n}\n\n/**\n * Start the scrolling REPL for an interactive agent conversation.\n *\n * Initialises the agent session (including OMP extension injection when the driver is `omp`),\n * prints a banner with project metadata, then enters a `@clack/prompts` input loop.\n * Each iteration awaits user input, forwards it to the agent via {@link createReplSession},\n * and blocks until the agent signals `idle` or `stopped`. Slash commands (`/help`, `/log`,\n * `/quit`) are handled before the message reaches the agent.\n *\n * @param opts - Configuration for the REPL session.\n * @returns Resolves when the session ends (user quit or fatal error).\n *\n * @docLink packages/tui/concepts#start-repl\n */\nexport async function startRepl(opts: ReplOptions): Promise<void> {\n const projectDir = resolve(opts.projectDir);\n const agentCwd = opts.cwd ? resolve(opts.cwd) : projectDir;\n\n // ── OMP workspace extension injection ──────────────────────────────\n const settings = await resolveSettings(projectDir, { driver: opts.driver });\n const resolvedDriver = settings.driver ?? \"omp\";\n const ompCleanup = await injectOmpExtension(resolvedDriver, projectDir, agentCwd);\n\n // ── Session resume ─────────────────────────────────────────────────\n const resumeSessionId = resolveResumeSessionId(projectDir, opts);\n\n // ── Telemetry ──────────────────────────────────────────────────────\n const telemetryBuffer: TelemetryLogEntry[] = [];\n const telemetry = new TuiTelemetryProvider((entry) => {\n telemetryBuffer.push(entry);\n });\n const trace = telemetry.startTrace({ name: \"skaile-repl\", kind: \"chat_session\" });\n\n // ── Create agent session ───────────────────────────────────────────\n const agentDir = resolveAgentDir(projectDir) ?? undefined;\n const session = await createAgentSession({\n projectDir,\n cwd: agentCwd !== projectDir ? agentCwd : undefined,\n agentDir,\n driver: opts.driver ?? resolvedDriver,\n model: opts.model,\n provider: opts.provider,\n resumeSessionId,\n telemetry,\n trace,\n onLog: () => {},\n });\n\n await session.driver.start();\n\n // ── Output + state tracking ────────────────────────────────────────\n let showLog = opts.verbose ?? false;\n let idleResolve: (() => void) | undefined;\n\n const write = (line: string) => {\n p.log.message(line);\n };\n\n const writeLog = (line: string) => {\n if (showLog) p.log.step(line);\n };\n\n // ── Create REPL session ────────────────────────────────────────────\n const replSession = createReplSession({\n session,\n onLine: write,\n onLog: writeLog,\n onStateChange: (state) => {\n if (state === \"idle\" || state === \"stopped\") {\n idleResolve?.();\n }\n },\n });\n\n // Drain buffered telemetry\n const sink = createTelemetrySink(writeLog);\n for (const entry of telemetryBuffer) sink(entry);\n telemetryBuffer.length = 0;\n\n // ── Banner ─────────────────────────────────────────────────────────\n printBanner({\n projectDir,\n displayDriver: session.driverType ?? resolvedDriver,\n displayModel: session.model ?? opts.model ?? \"default\",\n agentDir,\n resumeSessionId,\n });\n\n // ── REPL loop ──────────────────────────────────────────────────────\n function shutdown() {\n replSession.stop();\n telemetry.endTrace(trace, { status: \"ok\" });\n void telemetry.shutdown();\n ompCleanup?.();\n p.outro(\"Bye.\");\n process.exit(0);\n }\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n while (replSession.state !== \"stopped\") {\n const input = await p.text({\n message: pc.gray(\">>>\"),\n placeholder: \"\",\n });\n\n if (p.isCancel(input)) {\n shutdown();\n return;\n }\n\n const trimmed = (input as string).trim();\n const action = handleReplInput(trimmed, showLog, (v) => {\n showLog = v;\n });\n if (action === \"quit\") {\n shutdown();\n return;\n }\n if (action === \"continue\") continue;\n\n const idlePromise = new Promise<void>((resolve) => {\n idleResolve = resolve;\n });\n replSession.send(trimmed);\n await idlePromise;\n }\n\n shutdown();\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"validator-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"validator-RN64BKFW.js"}
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { mountList, mountSync, mountStatus, mountRead, connectorList, connectorRead, connectorWrite, connectorSearch, connectorExec, connectorLoadSkill, connectorDescribe } from '../../chunk-26L2B6P6.js';
|
|
2
|
-
import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from '../../chunk-
|
|
2
|
+
import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from '../../chunk-LBZP2IYG.js';
|
|
3
3
|
import { sessionList, sessionGet } from '../../chunk-R6O6YWU7.js';
|
|
4
|
-
import { skillList, skillListDomains, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from '../../chunk-
|
|
5
|
-
import '../../chunk-
|
|
6
|
-
import { workspaceValidate, workspaceInfo, workspaceTestSecret, workspaceReload } from '../../chunk-
|
|
7
|
-
import '../../chunk-
|
|
4
|
+
import { skillList, skillListDomains, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from '../../chunk-BCTU4TN7.js';
|
|
5
|
+
import '../../chunk-BK3WL3QK.js';
|
|
6
|
+
import { workspaceValidate, workspaceInfo, workspaceTestSecret, workspaceReload } from '../../chunk-E7HKNQTH.js';
|
|
7
|
+
import '../../chunk-CZZRDYT4.js';
|
|
8
8
|
import '../../chunk-X5YPJV4N.js';
|
|
9
|
+
import '../../chunk-BEAIJRVF.js';
|
|
10
|
+
import '../../chunk-ST3DLLNZ.js';
|
|
11
|
+
import '../../chunk-K5GBV4SA.js';
|
|
12
|
+
import '../../chunk-ZAP2BDHG.js';
|
|
13
|
+
import '../../chunk-MMD2KQ3A.js';
|
|
14
|
+
import '../../chunk-72EOJJOM.js';
|
|
15
|
+
import '../../chunk-P4VHQA4N.js';
|
|
16
|
+
import '../../chunk-DYMWJAL4.js';
|
|
17
|
+
import '../../chunk-GEEW6SY2.js';
|
|
18
|
+
import '../../chunk-F3HNW354.js';
|
|
19
|
+
import '../../chunk-MENCWIHW.js';
|
|
20
|
+
import '../../chunk-U5POE4BA.js';
|
|
21
|
+
import '../../chunk-7GOCNYUV.js';
|
|
9
22
|
import '../../chunk-NSBPE2FW.js';
|
|
10
23
|
import * as zNS from 'zod';
|
|
11
24
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../workspace-plugin/src/adapters/mcp.ts"],"names":["z"],"mappings":"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","file":"mcp.js","sourcesContent":["// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport type { WorkspacePlugin } from \"../plugin.js\";\nimport {\n connectorDescribe,\n connectorExec,\n connectorList,\n connectorLoadSkill,\n connectorRead,\n connectorSearch,\n connectorWrite,\n mountList,\n mountRead,\n mountStatus,\n mountSync,\n} from \"../tools/connectors.js\";\nimport {\n flowFindFlowForSession,\n flowGetSession,\n flowList,\n flowListSessions,\n flowShow,\n} from \"../tools/flows.js\";\nimport { sessionGet, sessionList } from \"../tools/sessions.js\";\nimport {\n skillCheckRequirements,\n skillGetPreamble,\n skillList,\n skillListDomains,\n skillSearch,\n skillShow,\n} from \"../tools/skills.js\";\nimport {\n workspaceInfo,\n workspaceReload,\n workspaceTestSecret,\n workspaceValidate,\n} from \"../tools/validator.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n/**\n * One workspace plugin tool — name, description, a zod raw-shape input schema,\n * and an async handler returning a `ToolResult`.\n *\n * Carries **zero MCP/SDK dependency**: the same definitions feed both the\n * in-process Claude Agent SDK server ({@link buildWorkspaceMcpServer}) and the\n * raw stdio MCP server ({@link buildWorkspaceMcpStdioServer}).\n */\nexport interface WorkspaceToolDef {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: any) => Promise<unknown>;\n}\n\n/**\n * Build the 28 workspace plugin tool definitions.\n *\n * Tool groups:\n * - 4 mount tools (`mount_list`, `mount_sync`, `mount_status`, `mount_read`)\n * - 5 flow tools (`flow_list`, `flow_show`, `flow_list_sessions`, `flow_get_session`, `flow_find_flow_for_session`)\n * - 6 skill tools (`skill_list`, `skill_list_domains`, `skill_show`, `skill_search`, `skill_check_requirements`, `skill_get_preamble`)\n * - 2 session tools (`session_list`, `session_get`)\n * - 7 connector tools (`connector_list`, `connector_read`, `connector_write`, `connector_search`, `connector_exec`, `connector_load_skill`, `connector_describe`)\n * - 4 workspace tools (`workspace_validate`, `workspace_info`, `workspace_test_secret`, `workspace_reload`)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The 28 tool definitions, free of any MCP/SDK coupling.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildWorkspaceToolDefs(plugin: WorkspacePlugin): WorkspaceToolDef[] {\n const z: any = zStatic;\n\n const driver = plugin.driver ?? \"omp\";\n const p = plugin.projectDir;\n\n return [\n // Mount tools\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n inputSchema: {},\n handler: async () => mountList(plugin.connectorManager),\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount — pull latest from remote (git, S3, WebDAV).\",\n inputSchema: { mount_id: z.string().describe(\"Mount ID from mount_list\") },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountSync(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_status\",\n description: \"Get the mount status and last sync time for a mount.\",\n inputSchema: { mount_id: z.string() },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountStatus(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_read\",\n description: \"Read a file from a mounted mount by path.\",\n inputSchema: {\n mount_id: z.string(),\n path: z.string().describe(\"Relative path within the mount\"),\n },\n handler: async ({ mount_id, path }: { mount_id: string; path: string }) =>\n mountRead(plugin.connectorManager, mount_id, path),\n },\n // Flow tools\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n inputSchema: {},\n handler: async () => flowList(p),\n },\n {\n name: \"flow_show\",\n description: \"Show full flow definition (nodes + edges) for a flow ID.\",\n inputSchema: { flow_id: z.string().describe(\"Flow ID from flow_list\") },\n handler: async ({ flow_id }: { flow_id: string }) => flowShow(p, flow_id),\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past and active flow run sessions for this workspace.\",\n inputSchema: {},\n handler: async () => flowListSessions(p),\n },\n {\n name: \"flow_get_session\",\n description: \"Get driver metadata for a specific flow run session.\",\n inputSchema: { run_id: z.string().describe(\"Run ID from flow_list_sessions\") },\n handler: async ({ run_id }: { run_id: string }) => flowGetSession(p, run_id),\n },\n {\n name: \"flow_find_flow_for_session\",\n description: \"Resolve and return the flow definition used in a past session.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => flowFindFlowForSession(p, run_id),\n },\n // Skill tools\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog, optionally filtered by domain.\",\n inputSchema: { domain: z.string().optional().describe(\"Domain name filter\") },\n handler: async ({ domain }: { domain?: string }) => skillList(p, domain),\n },\n {\n name: \"skill_list_domains\",\n description: \"List all skill domains (top-level ai-assets directories with skills).\",\n inputSchema: {},\n handler: async () => skillListDomains(p),\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill ID.\",\n inputSchema: { skill_id: z.string().describe(\"Skill ID from skill_list\") },\n handler: async ({ skill_id }: { skill_id: string }) => skillShow(p, skill_id),\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n inputSchema: { query: z.string() },\n handler: async ({ query }: { query: string }) => skillSearch(p, query),\n },\n {\n name: \"skill_check_requirements\",\n description: \"Validate that all skill prerequisites are met in the target directory.\",\n inputSchema: {\n skill_id: z.string(),\n target_dir: z\n .string()\n .optional()\n .describe(\"Directory to check against (default: projectDir)\"),\n },\n handler: async ({ skill_id, target_dir }: { skill_id: string; target_dir?: string }) =>\n skillCheckRequirements(p, skill_id, target_dir ?? p),\n },\n {\n name: \"skill_get_preamble\",\n description: \"Get the REQUIRES/INPUT/READS/WRITES DSL preamble for a skill.\",\n inputSchema: { skill_id: z.string() },\n handler: async ({ skill_id }: { skill_id: string }) => skillGetPreamble(p, skill_id),\n },\n // Session tools\n {\n name: \"session_list\",\n description: \"List all past agent run sessions for this workspace, sorted newest first.\",\n inputSchema: {},\n handler: async () => sessionList(p),\n },\n {\n name: \"session_get\",\n description: \"Get full metadata for a specific session by run ID.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => sessionGet(p, run_id),\n },\n // Connector tools\n {\n name: \"connector_list\",\n description: \"List all connectors declared in skaile.yaml with their connection status.\",\n inputSchema: {},\n handler: async () => connectorList(plugin.connectorManager),\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID from connector_list\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) =>\n connectorRead(plugin.connectorManager, connector_id, path),\n },\n {\n name: \"connector_write\",\n description: \"Write content to a connector by path.\",\n inputSchema: {\n connector_id: z.string(),\n path: z.string(),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => connectorWrite(plugin.connectorManager, connector_id, path, content),\n },\n {\n name: \"connector_search\",\n description: \"Search within a connector by query string.\",\n inputSchema: {\n connector_id: z.string(),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) =>\n connectorSearch(plugin.connectorManager, connector_id, query),\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n inputSchema: {\n connector_id: z.string(),\n operation: z.string().describe(\"Operation name from connector_describe\"),\n args: z.record(z.string(), z.unknown()).describe(\"Operation arguments\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => connectorExec(plugin.connectorManager, connector_id, operation, args),\n },\n {\n name: \"connector_load_skill\",\n description: \"Load the rendered skill body for a connector (operations + usage).\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorLoadSkill(plugin.connectorManager, connector_id),\n },\n {\n name: \"connector_describe\",\n description: \"Describe a connector's capabilities via its RuntimeSkillDescriptor.\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorDescribe(plugin.connectorManager, connector_id),\n },\n // Validator tools\n {\n name: \"workspace_validate\",\n description: \"Run a full health check: connectors, mounts, secrets, driver binary.\",\n inputSchema: {},\n handler: async () => workspaceValidate(plugin, driver),\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration: driver, model, provider, resource counts.\",\n inputSchema: {},\n handler: async () => workspaceInfo(plugin, driver, plugin.provider, plugin.model),\n },\n {\n name: \"workspace_test_secret\",\n description: \"Test resolution of one secret reference (env:VAR, forge:key).\",\n inputSchema: { ref: z.string().describe(\"Secret ref e.g. env:ANTHROPIC_API_KEY\") },\n handler: async ({ ref }: { ref: string }) => workspaceTestSecret(ref),\n },\n {\n name: \"workspace_reload\",\n description: \"Re-read skaile.yaml and re-sync the plugin state.\",\n inputSchema: {},\n handler: async () => workspaceReload(plugin),\n },\n ];\n}\n\n/**\n * Build the **in-process** workspace MCP server via the Claude Agent SDK's\n * `createSdkMcpServer`. This shape is what the runner embeds into a Claude\n * Agent SDK `query()` call — the runner *is* the Claude Agent SDK host.\n *\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is not installed\n * (graceful degradation for non-Claude-Code environments).\n *\n * For the standalone `skaile mcp-server` stdio subprocess use\n * {@link buildWorkspaceMcpStdioServer} / {@link runMcpServerStdio} instead —\n * those carry no Claude Agent SDK dependency.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The SDK MCP server object or `null` if the SDK is unavailable.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpServer(plugin: WorkspacePlugin): Promise<unknown | null> {\n let sdk: any;\n try {\n sdk = await import(\"@anthropic-ai/claude-agent-sdk\");\n } catch {\n return null;\n }\n return sdk.createSdkMcpServer({\n name: \"skaile-workspace\",\n tools: buildWorkspaceToolDefs(plugin),\n });\n}\n\n/**\n * Build a **raw stdio** workspace MCP server on `@modelcontextprotocol/sdk` —\n * no Claude Agent SDK. This is the correct shape for the `skaile mcp-server`\n * stdio subprocess that MCP-client agents (Claude Code, Codex, …) spawn.\n * Runs on plain Node.\n *\n * The returned server is not yet connected — call `.connect(transport)` (or\n * use {@link runMcpServerStdio}).\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns A `McpServer` with all 28 workspace tools registered.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpStdioServer(plugin: WorkspacePlugin): Promise<any> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\" as string);\n const server = new McpServer({ name: \"skaile-workspace\", version: \"1.0.0\" });\n for (const def of buildWorkspaceToolDefs(plugin)) {\n server.registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n def.handler,\n );\n }\n return server;\n}\n\n/**\n * Start the workspace MCP server over stdio transport.\n *\n * Builds the raw `@modelcontextprotocol/sdk` server via\n * {@link buildWorkspaceMcpStdioServer} and connects a `StdioServerTransport`.\n * No `@anthropic-ai/claude-agent-sdk` dependency anywhere on this path.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function runMcpServerStdio(plugin: WorkspacePlugin): Promise<void> {\n const server = await buildWorkspaceMcpStdioServer(plugin);\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\" as string\n );\n await server.connect(new StdioServerTransport());\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../workspace-plugin/src/adapters/mcp.ts"],"names":["z"],"mappings":"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","file":"mcp.js","sourcesContent":["// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport type { WorkspacePlugin } from \"../plugin.js\";\nimport {\n connectorDescribe,\n connectorExec,\n connectorList,\n connectorLoadSkill,\n connectorRead,\n connectorSearch,\n connectorWrite,\n mountList,\n mountRead,\n mountStatus,\n mountSync,\n} from \"../tools/connectors.js\";\nimport {\n flowFindFlowForSession,\n flowGetSession,\n flowList,\n flowListSessions,\n flowShow,\n} from \"../tools/flows.js\";\nimport { sessionGet, sessionList } from \"../tools/sessions.js\";\nimport {\n skillCheckRequirements,\n skillGetPreamble,\n skillList,\n skillListDomains,\n skillSearch,\n skillShow,\n} from \"../tools/skills.js\";\nimport {\n workspaceInfo,\n workspaceReload,\n workspaceTestSecret,\n workspaceValidate,\n} from \"../tools/validator.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n/**\n * One workspace plugin tool — name, description, a zod raw-shape input schema,\n * and an async handler returning a `ToolResult`.\n *\n * Carries **zero MCP/SDK dependency**: the same definitions feed both the\n * in-process Claude Agent SDK server ({@link buildWorkspaceMcpServer}) and the\n * raw stdio MCP server ({@link buildWorkspaceMcpStdioServer}).\n */\nexport interface WorkspaceToolDef {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: any) => Promise<unknown>;\n}\n\n/**\n * Build the 28 workspace plugin tool definitions.\n *\n * Tool groups:\n * - 4 mount tools (`mount_list`, `mount_sync`, `mount_status`, `mount_read`)\n * - 5 flow tools (`flow_list`, `flow_show`, `flow_list_sessions`, `flow_get_session`, `flow_find_flow_for_session`)\n * - 6 skill tools (`skill_list`, `skill_list_domains`, `skill_show`, `skill_search`, `skill_check_requirements`, `skill_get_preamble`)\n * - 2 session tools (`session_list`, `session_get`)\n * - 7 connector tools (`connector_list`, `connector_read`, `connector_write`, `connector_search`, `connector_exec`, `connector_load_skill`, `connector_describe`)\n * - 4 workspace tools (`workspace_validate`, `workspace_info`, `workspace_test_secret`, `workspace_reload`)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The 28 tool definitions, free of any MCP/SDK coupling.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildWorkspaceToolDefs(plugin: WorkspacePlugin): WorkspaceToolDef[] {\n const z: any = zStatic;\n\n const driver = plugin.driver ?? \"omp\";\n const p = plugin.projectDir;\n\n return [\n // Mount tools\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n inputSchema: {},\n handler: async () => mountList(plugin.connectorManager),\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount — pull latest from remote (git, S3, WebDAV).\",\n inputSchema: { mount_id: z.string().describe(\"Mount ID from mount_list\") },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountSync(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_status\",\n description: \"Get the mount status and last sync time for a mount.\",\n inputSchema: { mount_id: z.string() },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountStatus(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_read\",\n description: \"Read a file from a mounted mount by path.\",\n inputSchema: {\n mount_id: z.string(),\n path: z.string().describe(\"Relative path within the mount\"),\n },\n handler: async ({ mount_id, path }: { mount_id: string; path: string }) =>\n mountRead(plugin.connectorManager, mount_id, path),\n },\n // Flow tools\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n inputSchema: {},\n handler: async () => flowList(p),\n },\n {\n name: \"flow_show\",\n description: \"Show full flow definition (nodes + edges) for a flow ID.\",\n inputSchema: { flow_id: z.string().describe(\"Flow ID from flow_list\") },\n handler: async ({ flow_id }: { flow_id: string }) => flowShow(p, flow_id),\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past and active flow run sessions for this workspace.\",\n inputSchema: {},\n handler: async () => flowListSessions(p),\n },\n {\n name: \"flow_get_session\",\n description: \"Get driver metadata for a specific flow run session.\",\n inputSchema: { run_id: z.string().describe(\"Run ID from flow_list_sessions\") },\n handler: async ({ run_id }: { run_id: string }) => flowGetSession(p, run_id),\n },\n {\n name: \"flow_find_flow_for_session\",\n description: \"Resolve and return the flow definition used in a past session.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => flowFindFlowForSession(p, run_id),\n },\n // Skill tools\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog, optionally filtered by domain.\",\n inputSchema: { domain: z.string().optional().describe(\"Domain name filter\") },\n handler: async ({ domain }: { domain?: string }) => skillList(p, domain),\n },\n {\n name: \"skill_list_domains\",\n description: \"List all skill domains (top-level ai-assets directories with skills).\",\n inputSchema: {},\n handler: async () => skillListDomains(p),\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill ID.\",\n inputSchema: { skill_id: z.string().describe(\"Skill ID from skill_list\") },\n handler: async ({ skill_id }: { skill_id: string }) => skillShow(p, skill_id),\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n inputSchema: { query: z.string() },\n handler: async ({ query }: { query: string }) => skillSearch(p, query),\n },\n {\n name: \"skill_check_requirements\",\n description: \"Validate that all skill prerequisites are met in the target directory.\",\n inputSchema: {\n skill_id: z.string(),\n target_dir: z\n .string()\n .optional()\n .describe(\"Directory to check against (default: projectDir)\"),\n },\n handler: async ({ skill_id, target_dir }: { skill_id: string; target_dir?: string }) =>\n skillCheckRequirements(p, skill_id, target_dir ?? p),\n },\n {\n name: \"skill_get_preamble\",\n description: \"Get the REQUIRES/INPUT/READS/WRITES DSL preamble for a skill.\",\n inputSchema: { skill_id: z.string() },\n handler: async ({ skill_id }: { skill_id: string }) => skillGetPreamble(p, skill_id),\n },\n // Session tools\n {\n name: \"session_list\",\n description: \"List all past agent run sessions for this workspace, sorted newest first.\",\n inputSchema: {},\n handler: async () => sessionList(p),\n },\n {\n name: \"session_get\",\n description: \"Get full metadata for a specific session by run ID.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => sessionGet(p, run_id),\n },\n // Connector tools\n {\n name: \"connector_list\",\n description: \"List all connectors declared in skaile.yaml with their connection status.\",\n inputSchema: {},\n handler: async () => connectorList(plugin.connectorManager),\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID from connector_list\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) =>\n connectorRead(plugin.connectorManager, connector_id, path),\n },\n {\n name: \"connector_write\",\n description: \"Write content to a connector by path.\",\n inputSchema: {\n connector_id: z.string(),\n path: z.string(),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => connectorWrite(plugin.connectorManager, connector_id, path, content),\n },\n {\n name: \"connector_search\",\n description: \"Search within a connector by query string.\",\n inputSchema: {\n connector_id: z.string(),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) =>\n connectorSearch(plugin.connectorManager, connector_id, query),\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n inputSchema: {\n connector_id: z.string(),\n operation: z.string().describe(\"Operation name from connector_describe\"),\n args: z.record(z.string(), z.unknown()).describe(\"Operation arguments\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => connectorExec(plugin.connectorManager, connector_id, operation, args),\n },\n {\n name: \"connector_load_skill\",\n description: \"Load the rendered skill body for a connector (operations + usage).\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorLoadSkill(plugin.connectorManager, connector_id),\n },\n {\n name: \"connector_describe\",\n description: \"Describe a connector's capabilities via its RuntimeSkillDescriptor.\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorDescribe(plugin.connectorManager, connector_id),\n },\n // Validator tools\n {\n name: \"workspace_validate\",\n description: \"Run a full health check: connectors, mounts, secrets, driver binary.\",\n inputSchema: {},\n handler: async () => workspaceValidate(plugin, driver),\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration: driver, model, provider, resource counts.\",\n inputSchema: {},\n handler: async () => workspaceInfo(plugin, driver, plugin.provider, plugin.model),\n },\n {\n name: \"workspace_test_secret\",\n description: \"Test resolution of one secret reference (env:VAR, forge:key).\",\n inputSchema: { ref: z.string().describe(\"Secret ref e.g. env:ANTHROPIC_API_KEY\") },\n handler: async ({ ref }: { ref: string }) => workspaceTestSecret(ref),\n },\n {\n name: \"workspace_reload\",\n description: \"Re-read skaile.yaml and re-sync the plugin state.\",\n inputSchema: {},\n handler: async () => workspaceReload(plugin),\n },\n ];\n}\n\n/**\n * Build the **in-process** workspace MCP server via the Claude Agent SDK's\n * `createSdkMcpServer`. This shape is what the runner embeds into a Claude\n * Agent SDK `query()` call — the runner *is* the Claude Agent SDK host.\n *\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is not installed\n * (graceful degradation for non-Claude-Code environments).\n *\n * For the standalone `skaile mcp-server` stdio subprocess use\n * {@link buildWorkspaceMcpStdioServer} / {@link runMcpServerStdio} instead —\n * those carry no Claude Agent SDK dependency.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The SDK MCP server object or `null` if the SDK is unavailable.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpServer(plugin: WorkspacePlugin): Promise<unknown | null> {\n let sdk: any;\n try {\n sdk = await import(\"@anthropic-ai/claude-agent-sdk\");\n } catch {\n return null;\n }\n return sdk.createSdkMcpServer({\n name: \"skaile-workspace\",\n tools: buildWorkspaceToolDefs(plugin),\n });\n}\n\n/**\n * Build a **raw stdio** workspace MCP server on `@modelcontextprotocol/sdk` —\n * no Claude Agent SDK. This is the correct shape for the `skaile mcp-server`\n * stdio subprocess that MCP-client agents (Claude Code, Codex, …) spawn.\n * Runs on plain Node.\n *\n * The returned server is not yet connected — call `.connect(transport)` (or\n * use {@link runMcpServerStdio}).\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns A `McpServer` with all 28 workspace tools registered.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpStdioServer(plugin: WorkspacePlugin): Promise<any> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\" as string);\n const server = new McpServer({ name: \"skaile-workspace\", version: \"1.0.0\" });\n for (const def of buildWorkspaceToolDefs(plugin)) {\n server.registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n def.handler,\n );\n }\n return server;\n}\n\n/**\n * Start the workspace MCP server over stdio transport.\n *\n * Builds the raw `@modelcontextprotocol/sdk` server via\n * {@link buildWorkspaceMcpStdioServer} and connects a `StdioServerTransport`.\n * No `@anthropic-ai/claude-agent-sdk` dependency anywhere on this path.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function runMcpServerStdio(plugin: WorkspacePlugin): Promise<void> {\n const server = await buildWorkspaceMcpStdioServer(plugin);\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\" as string\n );\n await server.connect(new StdioServerTransport());\n}\n"]}
|