@skaile/workspaces 0.8.5 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -1
- package/README.md +2 -2
- package/dist/asset-manager/index.js +12 -12
- package/dist/asset-manager/installer.js +10 -10
- package/dist/asset-manager/renderers.js +2 -2
- package/dist/asset-manager/scaffold.js +10 -10
- package/dist/base-assets/connectors/deploy/adapter.d.ts +21 -19
- package/dist/base-assets/connectors/deploy/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/deploy.js +10 -10
- package/dist/base-assets/connectors/devserver/adapter.d.ts +14 -12
- package/dist/base-assets/connectors/devserver/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/devserver.js +10 -10
- package/dist/base-assets/connectors/flow/adapter.d.ts +13 -10
- package/dist/base-assets/connectors/flow/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/flow/adapter.js +10 -10
- package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts +5 -167
- package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -1
- package/dist/base-assets/connectors/flow/engine.js +1 -1
- package/dist/base-assets/connectors/flow/index.d.ts +1 -1
- package/dist/base-assets/connectors/flow/index.d.ts.map +1 -1
- package/dist/base-assets/connectors/flow/run-flow.d.ts.map +1 -1
- package/dist/base-assets/connectors/flow/run-flow.js +12 -12
- package/dist/base-assets/connectors/flow.js +10 -10
- package/dist/base-assets/{mounts → connectors}/git/driver.d.ts +34 -32
- package/dist/base-assets/connectors/git/driver.d.ts.map +1 -0
- package/dist/base-assets/connectors/git.js +20 -0
- package/dist/base-assets/connectors/gmail/adapter.d.ts +16 -15
- package/dist/base-assets/connectors/gmail/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/gmail.js +10 -10
- package/dist/base-assets/connectors/local/driver.d.ts +28 -0
- package/dist/base-assets/connectors/local/driver.d.ts.map +1 -0
- package/dist/base-assets/connectors/local.js +20 -0
- package/dist/base-assets/connectors/mattermost/adapter.d.ts +23 -22
- package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/mattermost.js +10 -10
- package/dist/base-assets/connectors/memory/adapter.d.ts +18 -17
- package/dist/base-assets/connectors/memory/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/memory.js +10 -10
- package/dist/base-assets/connectors/minio/adapter.d.ts +17 -16
- package/dist/base-assets/connectors/minio/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/minio.js +10 -10
- package/dist/base-assets/connectors/postgres/adapter.d.ts +17 -21
- package/dist/base-assets/connectors/postgres/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/postgres.js +10 -10
- package/dist/base-assets/connectors/redis/adapter.d.ts +19 -19
- package/dist/base-assets/connectors/redis/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/redis.js +10 -10
- package/dist/base-assets/connectors/s3/driver.d.ts +46 -0
- package/dist/base-assets/connectors/s3/driver.d.ts.map +1 -0
- package/dist/base-assets/connectors/s3.js +20 -0
- package/dist/base-assets/connectors/sharepoint/driver.d.ts +34 -0
- package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -0
- package/dist/base-assets/connectors/sharepoint.js +20 -0
- package/dist/base-assets/connectors/sqlite/adapter.d.ts +16 -16
- package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/sqlite.js +10 -10
- package/dist/base-assets/connectors/static-server/adapter.d.ts +16 -12
- package/dist/base-assets/connectors/static-server/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/static-server.js +10 -10
- package/dist/base-assets/connectors/tunnel/adapter.d.ts +14 -12
- package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/tunnel.js +10 -10
- package/dist/base-assets/connectors/webdav/driver.d.ts +35 -0
- package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -0
- package/dist/base-assets/connectors/webdav.js +20 -0
- package/dist/base-assets/connectors/xstate/adapter.d.ts +18 -16
- package/dist/base-assets/connectors/xstate/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/xstate-store/adapter.d.ts +20 -19
- package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/xstate-store.js +10 -10
- package/dist/base-assets/connectors/xstate.js +10 -10
- package/dist/base-assets/connectors/yjs/adapter.d.ts +22 -21
- package/dist/base-assets/connectors/yjs/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/yjs.js +10 -10
- package/dist/base-assets/index.js.map +1 -1
- package/dist/bridge/drivers/claude-sdk.js +215 -4
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +2 -2
- package/dist/bridge/drivers/echo.js +2 -2
- package/dist/bridge/drivers/omp.js +2 -2
- package/dist/bridge/index.js +3 -3
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/scrub-transcript.d.ts +113 -0
- package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +1 -0
- package/dist/bridge/src/types.d.ts +2 -2
- package/dist/bridge/src/types.d.ts.map +1 -1
- package/dist/{chunk-V37HONL7.js → chunk-24UIWON4.js} +61 -6
- package/dist/chunk-24UIWON4.js.map +1 -0
- package/dist/{chunk-JLPC4YWT.js → chunk-37JKX6D7.js} +3 -4
- package/dist/chunk-37JKX6D7.js.map +1 -0
- package/dist/{chunk-DOMCYP7D.js → chunk-42OQF7UU.js} +227 -21
- package/dist/chunk-42OQF7UU.js.map +1 -0
- package/dist/{chunk-65CYXYUW.js → chunk-4RUVG5GX.js} +50 -5
- package/dist/chunk-4RUVG5GX.js.map +1 -0
- package/dist/{chunk-MJHLQRJJ.js → chunk-5IC6CJL4.js} +11 -29
- package/dist/chunk-5IC6CJL4.js.map +1 -0
- package/dist/{chunk-GVOLEJG5.js → chunk-6DEGWPAR.js} +3 -3
- package/dist/{chunk-GVOLEJG5.js.map → chunk-6DEGWPAR.js.map} +1 -1
- package/dist/{chunk-7HLNUSNE.js → chunk-6FNCZYJY.js} +3 -3
- package/dist/{chunk-7HLNUSNE.js.map → chunk-6FNCZYJY.js.map} +1 -1
- package/dist/{chunk-D5IH3QMH.js → chunk-7R6W5EQR.js} +20 -19
- package/dist/chunk-7R6W5EQR.js.map +1 -0
- package/dist/{chunk-MBBTBKAS.js → chunk-AE6GCXGL.js} +3 -3
- package/dist/{chunk-MBBTBKAS.js.map → chunk-AE6GCXGL.js.map} +1 -1
- package/dist/{chunk-TS6VCR4W.js → chunk-DIKFRNCS.js} +3 -3
- package/dist/{chunk-TS6VCR4W.js.map → chunk-DIKFRNCS.js.map} +1 -1
- package/dist/{chunk-7HCGI2GW.js → chunk-DTL7S57T.js} +37 -29
- package/dist/chunk-DTL7S57T.js.map +1 -0
- package/dist/{chunk-7H7EOIRH.js → chunk-EBMFCF4P.js} +2 -2
- package/dist/{chunk-7H7EOIRH.js.map → chunk-EBMFCF4P.js.map} +1 -1
- package/dist/{chunk-3W7Z74ZP.js → chunk-EPGHAOEU.js} +5856 -5822
- package/dist/chunk-EPGHAOEU.js.map +1 -0
- package/dist/{chunk-CSUBFKAN.js → chunk-GAZINYCS.js} +4 -4
- package/dist/{chunk-CSUBFKAN.js.map → chunk-GAZINYCS.js.map} +1 -1
- package/dist/{chunk-Y46TBPLI.js → chunk-GCJXPUHG.js} +3 -3
- package/dist/{chunk-Y46TBPLI.js.map → chunk-GCJXPUHG.js.map} +1 -1
- package/dist/{chunk-46T37EBP.js → chunk-GKIA2PU5.js} +7 -35
- package/dist/chunk-GKIA2PU5.js.map +1 -0
- package/dist/{chunk-EE3XTJ62.js → chunk-I3S4BAAR.js} +7 -7
- package/dist/{chunk-EE3XTJ62.js.map → chunk-I3S4BAAR.js.map} +1 -1
- package/dist/{chunk-ZUQIXLRJ.js → chunk-ICS76R4T.js} +14 -14
- package/dist/chunk-ICS76R4T.js.map +1 -0
- package/dist/{chunk-CCKGX5AS.js → chunk-K3TMZI6D.js} +3 -3
- package/dist/{chunk-CCKGX5AS.js.map → chunk-K3TMZI6D.js.map} +1 -1
- package/dist/{chunk-AIGWF3TJ.js → chunk-LDUNTZB6.js} +46 -4
- package/dist/chunk-LDUNTZB6.js.map +1 -0
- package/dist/{chunk-UMMBL7SW.js → chunk-M2NLRGIX.js} +5 -5
- package/dist/{chunk-UMMBL7SW.js.map → chunk-M2NLRGIX.js.map} +1 -1
- package/dist/{chunk-Z3RER6YZ.js → chunk-NELZIQ2E.js} +42 -42
- package/dist/chunk-NELZIQ2E.js.map +1 -0
- package/dist/chunk-PBWMV5GM.js +171 -0
- package/dist/chunk-PBWMV5GM.js.map +1 -0
- package/dist/{chunk-NYJKXVG6.js → chunk-QZ6PY73K.js} +160 -188
- package/dist/chunk-QZ6PY73K.js.map +1 -0
- package/dist/chunk-R7FOF242.js +59 -0
- package/dist/chunk-R7FOF242.js.map +1 -0
- package/dist/{chunk-XEGHWFAX.js → chunk-SVNFQSU3.js} +5 -10
- package/dist/chunk-SVNFQSU3.js.map +1 -0
- package/dist/{chunk-44ZICIN4.js → chunk-TODD4VNR.js} +9 -3
- package/dist/chunk-TODD4VNR.js.map +1 -0
- package/dist/{chunk-77CUYYO3.js → chunk-VAJB2UJ5.js} +5 -5
- package/dist/{chunk-77CUYYO3.js.map → chunk-VAJB2UJ5.js.map} +1 -1
- package/dist/{chunk-Q5URN24L.js → chunk-W75ASXH4.js} +23 -27
- package/dist/chunk-W75ASXH4.js.map +1 -0
- package/dist/{chunk-5CSE3QL2.js → chunk-XIVOEUAF.js} +5 -5
- package/dist/{chunk-5CSE3QL2.js.map → chunk-XIVOEUAF.js.map} +1 -1
- package/dist/{chunk-BVHFSUFM.js → chunk-ZHLRRT5D.js} +4 -25
- package/dist/chunk-ZHLRRT5D.js.map +1 -0
- package/dist/{chunk-6UQ66R46.js → chunk-ZWIG55ZX.js} +2 -2
- package/dist/{chunk-6UQ66R46.js.map → chunk-ZWIG55ZX.js.map} +1 -1
- package/dist/cli/index.js +321 -300
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/connector.d.ts +2 -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/project.d.ts +73 -3
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/session-logs/local-query.d.ts +3 -4
- package/dist/cli/src/commands/session-logs/local-query.d.ts.map +1 -1
- package/dist/cli/src/commands/session-logs/local-tail.d.ts +0 -3
- package/dist/cli/src/commands/session-logs/local-tail.d.ts.map +1 -1
- package/dist/cli/src/commands/session-logs/sqlite-row.d.ts +0 -26
- package/dist/cli/src/commands/session-logs/sqlite-row.d.ts.map +1 -1
- package/dist/cli/src/index.d.ts +1 -1
- package/dist/connectors/config.js +7 -7
- package/dist/connectors/index.js +10 -10
- package/dist/connectors/rclone.js +1 -1
- package/dist/connectors/src/config.d.ts +9 -10
- package/dist/connectors/src/config.d.ts.map +1 -1
- package/dist/connectors/src/connector-base.d.ts +23 -0
- package/dist/connectors/src/connector-base.d.ts.map +1 -0
- package/dist/connectors/src/connector-manager.d.ts +158 -58
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors/src/connector-prompt.d.ts +72 -0
- package/dist/connectors/src/connector-prompt.d.ts.map +1 -0
- package/dist/connectors/src/connector-registry.d.ts +34 -35
- package/dist/connectors/src/connector-registry.d.ts.map +1 -1
- package/dist/connectors/src/connector-types.d.ts +147 -60
- package/dist/connectors/src/connector-types.d.ts.map +1 -1
- package/dist/connectors/src/index.d.ts +17 -23
- package/dist/connectors/src/index.d.ts.map +1 -1
- package/dist/connectors/src/npm-installer.d.ts +2 -2
- package/dist/connectors/src/npm-installer.d.ts.map +1 -1
- package/dist/connectors/src/rclone-process-manager.d.ts +1 -1
- package/dist/connectors/src/secrets.d.ts +3 -3
- package/dist/connectors/src/watcher.d.ts +3 -3
- package/dist/connectors/src/watcher.d.ts.map +1 -1
- package/dist/connectors-PTCSHCHZ.js +5 -0
- package/dist/{connectors-7WS2KOSZ.js.map → connectors-PTCSHCHZ.js.map} +1 -1
- package/dist/core/index.js +6 -6
- package/dist/core/logging.js +1 -1
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/runtime-assets.js +4 -4
- package/dist/core/src/index.d.ts +4 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/logging/index.d.ts +2 -0
- package/dist/core/src/logging/index.d.ts.map +1 -1
- package/dist/core/src/logging/sinks/sqlite-runtime.d.ts +24 -0
- package/dist/core/src/logging/sinks/sqlite-runtime.d.ts.map +1 -0
- package/dist/core/src/logging/sinks/sqlite-sink.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +2 -23
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +1 -1
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/runtime-assets.d.ts +12 -13
- package/dist/core/src/runtime-assets.d.ts.map +1 -1
- package/dist/core/src/subprocess.d.ts +35 -0
- package/dist/core/src/subprocess.d.ts.map +1 -0
- package/dist/core/src/workspace-config.d.ts +32 -10
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +3 -3
- package/dist/discovery/index.js +4 -4
- package/dist/discovery/src/builtin-providers.d.ts +5 -4
- package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
- package/dist/discovery/src/index.d.ts +1 -1
- package/dist/discovery/src/index.d.ts.map +1 -1
- package/dist/discovery/src/source-config.d.ts +24 -233
- package/dist/discovery/src/source-config.d.ts.map +1 -1
- package/dist/{flows-ZULSVHX5.js → flows-6BNO4GKK.js} +3 -3
- package/dist/{flows-ZULSVHX5.js.map → flows-6BNO4GKK.js.map} +1 -1
- package/dist/library/index.js +6 -5
- package/dist/library/src/config.d.ts +25 -77
- package/dist/library/src/config.d.ts.map +1 -1
- package/dist/library/src/index.d.ts +2 -0
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/install/install-from-manifest.d.ts +80 -0
- package/dist/library/src/install/install-from-manifest.d.ts.map +1 -0
- package/dist/library/src/install/source-fetch-github.d.ts +43 -0
- package/dist/library/src/install/source-fetch-github.d.ts.map +1 -0
- package/dist/library/src/knowledge/knowledge-manifest.d.ts +3 -17
- package/dist/library/src/knowledge/knowledge-manifest.d.ts.map +1 -1
- package/dist/library/src/library.d.ts +6 -0
- package/dist/library/src/library.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +41 -0
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/schema.d.ts +19 -0
- package/dist/library/src/local/schema.d.ts.map +1 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts +22 -0
- package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
- package/dist/library/src/user-library.d.ts +1 -2
- package/dist/library/src/user-library.d.ts.map +1 -1
- package/dist/library/src/workspace-config.d.ts +45 -243
- package/dist/library/src/workspace-config.d.ts.map +1 -1
- package/dist/open-library-S6FK4N4S.js +13 -0
- package/dist/{open-library-N5T5HRTS.js.map → open-library-S6FK4N4S.js.map} +1 -1
- package/dist/{provider-QXKEDXWJ.js → provider-GAWKFQ3T.js} +20 -4
- package/dist/provider-GAWKFQ3T.js.map +1 -0
- package/dist/runner/index.js +15 -15
- package/dist/runner/src/builtin-capabilities.d.ts.map +1 -1
- package/dist/runner/src/define-capability.d.ts +1 -1
- package/dist/runner/src/define-capability.d.ts.map +1 -1
- package/dist/runner/src/refresh-flag-dispatcher.d.ts +20 -20
- package/dist/runner/src/refresh-flag-dispatcher.d.ts.map +1 -1
- package/dist/runner/src/resource-handler.d.ts +8 -6
- package/dist/runner/src/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/resources.d.ts +14 -22
- package/dist/runner/src/resources.d.ts.map +1 -1
- package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +5 -7
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/runner/src/workspace-migration.d.ts +2 -2
- package/dist/runner/src/workspace-migration.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +12 -12
- package/dist/sdk/bridge.js +3 -3
- package/dist/sdk/core.js +6 -6
- package/dist/sdk/flow.js +1 -1
- package/dist/sdk/index.js +15 -15
- package/dist/sdk/runner.js +15 -15
- package/dist/sdk/session.js +1 -1
- package/dist/sdk/telemetry.js +1 -1
- package/dist/sdk/transport/ws/server.js +1 -1
- package/dist/sdk/transport/ws.js +1 -1
- package/dist/sdk/transport.js +1 -1
- package/dist/session/index.js +1 -1
- package/dist/session/src/dispatcher.d.ts +4 -1
- package/dist/session/src/dispatcher.d.ts.map +1 -1
- package/dist/{setup-BMTC562F.js → setup-PHFPBDBI.js} +10 -10
- package/dist/{setup-BMTC562F.js.map → setup-PHFPBDBI.js.map} +1 -1
- package/dist/source-fetch-github-QN4LLTL5.js +4 -0
- package/dist/source-fetch-github-QN4LLTL5.js.map +1 -0
- package/dist/store-client-BM3IBDPT.js +14 -0
- package/dist/{store-client-X7Y7D5QX.js.map → store-client-BM3IBDPT.js.map} +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/transport/index.js +1 -1
- package/dist/transport/src/ws/server.d.ts +11 -8
- package/dist/transport/src/ws/server.d.ts.map +1 -1
- package/dist/transport/ws/server.js +1 -1
- package/dist/transport/ws.js +1 -1
- package/dist/tui/index.js +16 -25
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/src/repl.d.ts.map +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/events.d.ts +6 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/install-manifest.d.ts +33 -0
- package/dist/types/src/install-manifest.d.ts.map +1 -0
- package/dist/types/src/manifests/_shared.d.ts +39 -100
- package/dist/types/src/manifests/_shared.d.ts.map +1 -1
- package/dist/types/src/manifests/agent.d.ts +43 -248
- package/dist/types/src/manifests/agent.d.ts.map +1 -1
- package/dist/types/src/manifests/connector.d.ts +7 -107
- package/dist/types/src/manifests/connector.d.ts.map +1 -1
- package/dist/types/src/manifests/contract.d.ts +10 -75
- package/dist/types/src/manifests/contract.d.ts.map +1 -1
- package/dist/types/src/manifests/mcp-server.d.ts +9 -29
- package/dist/types/src/manifests/mcp-server.d.ts.map +1 -1
- package/dist/types/src/manifests/mount.d.ts +4 -76
- package/dist/types/src/manifests/mount.d.ts.map +1 -1
- package/dist/types/src/manifests/persona.d.ts +10 -75
- package/dist/types/src/manifests/persona.d.ts.map +1 -1
- package/dist/types/src/manifests/preset.d.ts +82 -642
- package/dist/types/src/manifests/preset.d.ts.map +1 -1
- package/dist/types/src/manifests/prompt.d.ts +10 -75
- package/dist/types/src/manifests/prompt.d.ts.map +1 -1
- package/dist/types/src/manifests/ruleset.d.ts +10 -75
- package/dist/types/src/manifests/ruleset.d.ts.map +1 -1
- package/dist/types/src/manifests/skill.d.ts +46 -2328
- package/dist/types/src/manifests/skill.d.ts.map +1 -1
- package/dist/validator-47SQUW3J.js +5 -0
- package/dist/{validator-764EQNM3.js.map → validator-47SQUW3J.js.map} +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +8 -9
- package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
- package/dist/workspace-plugin/adapters/omp.js +19 -18
- package/dist/workspace-plugin/adapters/omp.js.map +1 -1
- package/dist/workspace-plugin/index.js +2 -2
- package/dist/workspace-plugin/src/adapters/mcp.d.ts.map +1 -1
- package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
- package/dist/workspace-plugin/src/plugin.d.ts +5 -3
- package/dist/workspace-plugin/src/plugin.d.ts.map +1 -1
- package/dist/workspace-plugin/src/tools/connectors.d.ts +38 -0
- package/dist/workspace-plugin/src/tools/connectors.d.ts.map +1 -1
- package/dist/workspace-plugin/src/tools/validator.d.ts +6 -4
- package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
- package/package.json +217 -117
- package/dist/base-assets/mounts/git/driver.d.ts.map +0 -1
- package/dist/base-assets/mounts/git.js +0 -20
- package/dist/base-assets/mounts/local/driver.d.ts +0 -27
- package/dist/base-assets/mounts/local/driver.d.ts.map +0 -1
- package/dist/base-assets/mounts/local.js +0 -20
- package/dist/base-assets/mounts/s3/driver.d.ts +0 -27
- package/dist/base-assets/mounts/s3/driver.d.ts.map +0 -1
- package/dist/base-assets/mounts/s3.js +0 -20
- package/dist/base-assets/mounts/sharepoint/driver.d.ts +0 -31
- package/dist/base-assets/mounts/sharepoint/driver.d.ts.map +0 -1
- package/dist/base-assets/mounts/sharepoint.js +0 -20
- package/dist/base-assets/mounts/webdav/driver.d.ts +0 -32
- package/dist/base-assets/mounts/webdav/driver.d.ts.map +0 -1
- package/dist/base-assets/mounts/webdav.js +0 -20
- package/dist/chunk-3W7Z74ZP.js.map +0 -1
- package/dist/chunk-44ZICIN4.js.map +0 -1
- package/dist/chunk-46T37EBP.js.map +0 -1
- package/dist/chunk-65CYXYUW.js.map +0 -1
- package/dist/chunk-7HCGI2GW.js.map +0 -1
- package/dist/chunk-AIGWF3TJ.js.map +0 -1
- package/dist/chunk-BVHFSUFM.js.map +0 -1
- package/dist/chunk-D5IH3QMH.js.map +0 -1
- package/dist/chunk-DOMCYP7D.js.map +0 -1
- package/dist/chunk-JLPC4YWT.js.map +0 -1
- package/dist/chunk-MJHLQRJJ.js.map +0 -1
- package/dist/chunk-NYJKXVG6.js.map +0 -1
- package/dist/chunk-Q5URN24L.js.map +0 -1
- package/dist/chunk-QT2KQHDT.js +0 -49
- package/dist/chunk-QT2KQHDT.js.map +0 -1
- package/dist/chunk-V37HONL7.js.map +0 -1
- package/dist/chunk-XEGHWFAX.js.map +0 -1
- package/dist/chunk-XOSBNBB6.js +0 -155
- package/dist/chunk-XOSBNBB6.js.map +0 -1
- package/dist/chunk-Z3RER6YZ.js.map +0 -1
- package/dist/chunk-ZUQIXLRJ.js.map +0 -1
- package/dist/cli/src/commands/mount.d.ts +0 -22
- package/dist/cli/src/commands/mount.d.ts.map +0 -1
- package/dist/connectors/src/adapters/base.d.ts +0 -66
- package/dist/connectors/src/adapters/base.d.ts.map +0 -1
- package/dist/connectors/src/connector-tools.d.ts +0 -61
- package/dist/connectors/src/connector-tools.d.ts.map +0 -1
- package/dist/connectors/src/drivers/base.d.ts +0 -44
- package/dist/connectors/src/drivers/base.d.ts.map +0 -1
- package/dist/connectors/src/mount-manager.d.ts +0 -147
- package/dist/connectors/src/mount-manager.d.ts.map +0 -1
- package/dist/connectors/src/mount-prompt.d.ts +0 -13
- package/dist/connectors/src/mount-prompt.d.ts.map +0 -1
- package/dist/connectors/src/mount-registry.d.ts +0 -61
- package/dist/connectors/src/mount-registry.d.ts.map +0 -1
- package/dist/connectors/src/mount-types.d.ts +0 -222
- package/dist/connectors/src/mount-types.d.ts.map +0 -1
- package/dist/connectors-7WS2KOSZ.js +0 -5
- package/dist/mounts-PQLFYD2C.js +0 -5
- package/dist/mounts-PQLFYD2C.js.map +0 -1
- package/dist/open-library-N5T5HRTS.js +0 -12
- package/dist/provider-QXKEDXWJ.js.map +0 -1
- package/dist/store-client-X7Y7D5QX.js +0 -14
- package/dist/validator-764EQNM3.js +0 -5
- package/dist/workspace-plugin/src/tools/mounts.d.ts +0 -51
- package/dist/workspace-plugin/src/tools/mounts.d.ts.map +0 -1
- /package/dist/base-assets/{mounts → connectors}/git.js.map +0 -0
- /package/dist/base-assets/{mounts → connectors}/local.js.map +0 -0
- /package/dist/base-assets/{mounts → connectors}/s3.js.map +0 -0
- /package/dist/base-assets/{mounts → connectors}/sharepoint.js.map +0 -0
- /package/dist/base-assets/{mounts → connectors}/webdav.js.map +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../connectors/src/adapters/base.ts","../base-assets/connectors/memory/adapter.ts","../base-assets/connectors/postgres/adapter.ts","../base-assets/connectors/redis/adapter.ts","../base-assets/connectors/sqlite/adapter.ts","../base-assets/connectors/xstate/adapter.ts","../base-assets/connectors/xstate-store/adapter.ts","../base-assets/connectors/yjs/adapter.ts","../base-assets/connectors/gmail/adapter.ts","../base-assets/connectors/minio/adapter.ts","../base-assets/connectors/mattermost/adapter.ts","../base-assets/connectors/devserver/adapter.ts","../base-assets/connectors/static-server/adapter.ts","../base-assets/connectors/tunnel/adapter.ts","../base-assets/connectors/deploy/adapter.ts","../connectors/src/connector-registry.ts","../connectors/src/connector-types.ts","../connectors/src/connector-manager.ts","../connectors/src/connector-tools.ts","../connectors/src/drivers/base.ts","../connectors/src/log-buffer.ts","../connectors/src/credential-helper-script.ts","../connectors/src/managed-gitconfig.ts","../base-assets/mounts/local/driver.ts","../base-assets/mounts/git/driver.ts","../base-assets/mounts/s3/driver.ts","../base-assets/mounts/webdav/driver.ts","../base-assets/mounts/sharepoint/driver.ts","../connectors/src/mount-registry.ts","../connectors/src/mount-types.ts","../connectors/src/mount-manager.ts","../connectors/src/mount-prompt.ts","../connectors/src/npm-installer.ts","../connectors/src/watcher.ts","../connectors/src/worktree.ts","../base-assets/connectors/flow/adapter.ts"],"names":["createAdapter","table","result","writeFileSync","existsSync","readFileSync","resolve","join","instanceToStatus","t","z","dirname","mkdirSync","execSync","credentialTag","renameSync","stat","createDriver","isFleetManaged","ensureFleetMounted","readdir","CACHE_BASE","factories","_registered","require","git"],"mappings":"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","file":"chunk-3W7Z74ZP.js","sourcesContent":["/**\n * AbstractConnectorAdapter — base class for connector adapters.\n *\n * Extend this class to register with ConnectorManager via registerConnectorAdapter().\n * Provides default no-op implementations for optional lifecycle methods and a\n * default watch() that emits nothing.\n *\n * Subclasses MUST implement: connect, disconnect, describeOperations, executeOp.\n * Base CRUD methods throw by default — override what makes sense.\n */\n\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport type {\n ConnectorAdapter,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n} from \"../connector-types.js\";\nimport type { SecretProvider } from \"../secrets.js\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n WatchHandle,\n WatchOptions,\n} from \"../shared-types.js\";\n\nexport abstract class AbstractConnectorAdapter implements ConnectorAdapter {\n abstract readonly name: string;\n\n /**\n * Per-instance logger. Initialised to a placeholder; replaced by\n * ConnectorManager via setLogger() with\n * `{ kind:\"connector\", subkind:<driver>, instance:<id> }` once the\n * declaration is known. Use `this.log.info/warn/error/debug` from any\n * adapter method.\n */\n protected log: Logger = createLogger({ kind: \"connector\", subkind: \"unknown\" });\n\n setLogger(logger: Logger): void {\n this.log = logger;\n }\n\n /**\n * Callback set by the default watch() implementation. Call\n * `this.emitChange?.({ path, action, source: 'operation' })` after mutations\n * to emit change events to ConnectorManager.watchAll() subscribers.\n */\n protected emitChange?: (event: ConnectorChangeEvent) => void;\n\n abstract connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle>;\n abstract disconnect(handle: ConnectorHandle): Promise<void>;\n abstract describeOperations(handle: ConnectorHandle): OperationDescriptor[];\n abstract executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string>;\n\n /**\n * @throws {Error} Always — override in subclasses that support read.\n */\n async read(_handle: ConnectorHandle, _path: string): Promise<ConnectorContent | null> {\n throw new Error(`${this.name} adapter does not support read()`);\n }\n /**\n * @throws {Error} Always — override in subclasses that support write.\n */\n async write(_handle: ConnectorHandle, _path: string, _content: ConnectorContent): Promise<void> {\n throw new Error(`${this.name} adapter does not support write()`);\n }\n /**\n * @throws {Error} Always — override in subclasses that support delete.\n */\n async delete(_handle: ConnectorHandle, _path: string): Promise<boolean> {\n throw new Error(`${this.name} adapter does not support delete()`);\n }\n /**\n * @throws {Error} Always — override in subclasses that support list.\n */\n async list(\n _handle: ConnectorHandle,\n _path?: string,\n _options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n throw new Error(`${this.name} adapter does not support list()`);\n }\n /**\n * @throws {Error} Always — override in subclasses that support search.\n */\n async search(\n _handle: ConnectorHandle,\n _query: string,\n _options?: SearchOptions,\n ): Promise<SearchResult[]> {\n throw new Error(`${this.name} adapter does not support search()`);\n }\n\n /**\n * Default watch implementation. Stores the callback in emitChange so subclasses\n * can call `this.emitChange?.({ path, action, source })` after mutations.\n * Returns a no-op WatchHandle that clears emitChange on close.\n */\n watch(\n _handle: ConnectorHandle,\n callback: (event: ConnectorChangeEvent) => void,\n _options?: WatchOptions,\n ): WatchHandle {\n this.emitChange = callback;\n return {\n close: async () => {\n this.emitChange = undefined;\n },\n };\n }\n\n async onHibernate(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n async onSessionClose(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n protected makeHandle(declaration: ConnectorDeclaration, state: unknown): ConnectorHandle {\n return {\n id: declaration.id,\n driver: this.name,\n access: declaration.access,\n connected: true,\n state,\n };\n }\n}\n","/**\n * MemoryAdapter — in-process key-value store.\n * Not mountable. Used for scratch state, agent-to-agent coordination, config.\n */\n\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\n\ninterface MemoryState {\n store: Map<string, string>;\n namespace: string;\n}\n\n/**\n * Connector adapter for an in-process key-value store. Useful for scratch state, agent coordination, and config.\n * No external dependencies — the store lives entirely in process memory and is cleared on disconnect.\n * @docLink packages/base-assets/concepts#memory-connector\n */\nexport class MemoryAdapter extends AbstractConnectorAdapter {\n readonly name = \"memory\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const namespace = String(declaration.options?.namespace ?? declaration.id);\n return this.makeHandle(declaration, { store: new Map(), namespace } satisfies MemoryState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n (handle.state as MemoryState).store.clear();\n handle.connected = false;\n }\n\n private store(handle: ConnectorHandle): Map<string, string> {\n return (handle.state as MemoryState).store;\n }\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const value = this.store(handle).get(path);\n if (value === undefined) return null;\n return { data: value, contentType: \"application/json\" };\n }\n\n override async write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n const isNew = !this.store(handle).has(path);\n this.store(handle).set(\n path,\n typeof content.data === \"string\" ? content.data : content.data.toString(\"utf-8\"),\n );\n this.emitChange?.({ path, action: isNew ? \"create\" : \"edit\", source: \"operation\" });\n }\n\n override async delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const deleted = this.store(handle).delete(path);\n if (deleted) this.emitChange?.({ path, action: \"delete\", source: \"operation\" });\n return deleted;\n }\n\n override async list(\n handle: ConnectorHandle,\n path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const prefix = path ?? \"\";\n const entries: ConnectorEntry[] = [];\n for (const key of this.store(handle).keys()) {\n if (prefix && !key.startsWith(prefix)) continue;\n if (options?.glob && !matchGlob(key, options.glob)) continue;\n if (options?.limit && entries.length >= options.limit) break;\n entries.push({ name: key, path: key, type: \"key\" });\n }\n return entries;\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n for (const [key, value] of this.store(handle)) {\n if (options?.maxResults && results.length >= options.maxResults) break;\n if (key.includes(query) || value.includes(query)) {\n results.push({ path: key, snippet: value.slice(0, 200) });\n }\n }\n return results;\n }\n\n describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"get\",\n description: \"Get value by key\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key name\" }],\n examples: ['get --key \"config:theme\"'],\n },\n {\n name: \"set\",\n description: \"Set a key-value pair\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Key name\" },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"Value (stored as string)\",\n },\n ],\n examples: ['set --key \"status\" --value \"running\"'],\n },\n {\n name: \"keys\",\n description: \"List all keys matching a pattern\",\n accessLevel: \"read\",\n args: [\n {\n name: \"pattern\",\n type: \"string\",\n required: false,\n description: \"Glob pattern (default: all)\",\n },\n ],\n },\n {\n name: \"del\",\n description: \"Delete a key\",\n accessLevel: \"write\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key to delete\" }],\n },\n ];\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n switch (operation) {\n case \"get\": {\n const key = String(args.key ?? \"\");\n const value = this.store(handle).get(key);\n return value ?? \"\";\n }\n case \"set\": {\n const key = String(args.key ?? \"\");\n const value = String(args.value ?? \"\");\n const isNew = !this.store(handle).has(key);\n this.store(handle).set(key, value);\n this.emitChange?.({ path: key, action: isNew ? \"create\" : \"edit\", source: \"operation\" });\n return \"OK\";\n }\n case \"keys\": {\n const pattern = args.pattern ? String(args.pattern) : undefined;\n const keys = [...this.store(handle).keys()];\n const filtered = pattern ? keys.filter((k) => matchGlob(k, pattern)) : keys;\n return JSON.stringify(filtered);\n }\n case \"del\": {\n const key = String(args.key ?? \"\");\n const deleted = this.store(handle).delete(key);\n if (deleted) this.emitChange?.({ path: key, action: \"delete\", source: \"operation\" });\n return deleted ? \"Deleted\" : \"Not found\";\n }\n default:\n throw new Error(`Memory adapter has no operation: ${operation}`);\n }\n }\n}\n\nfunction matchGlob(str: string, pattern: string): boolean {\n const regex = new RegExp(`^${pattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\")}$`);\n return regex.test(str);\n}\n\n/**\n * Creates a new MemoryAdapter instance.\n * @returns Configured MemoryAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#memory-connector-factory\n */\nexport function createAdapter(): MemoryAdapter {\n return new MemoryAdapter();\n}\n","/**\n * PostgresAdapter — PostgreSQL database resource.\n * Not mountable (but supports snapshot sync to dump schema + sample data).\n * Custom operations: query, schema, execute.\n *\n * Requires `pg` as an optional peer dependency.\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveAuth, AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type { SecretProvider } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface PgState {\n pool: any; // pg.Pool\n dsn: string;\n}\n\n/**\n * Connector adapter for PostgreSQL databases — provides query, schema inspection, and execute operations.\n * Also supports snapshot sync that dumps schema and sample data to JSON files. Requires the `pg` optional peer dependency.\n * @docLink packages/base-assets/concepts#postgres-connector\n */\nexport class PostgresAdapter extends AbstractConnectorAdapter {\n readonly name = \"postgres\";\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"dsn\",\n label: \"Connection String\",\n description: \"PostgreSQL connection URL (e.g. postgres://user:pass@host/db)\",\n type: \"url\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n ];\n }\n\n describeSkill(\n _handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const dsn = String(declaration.options?.dsn ?? \"\");\n let hostLabel = declaration.id;\n try {\n hostLabel = new URL(dsn).hostname;\n } catch {}\n return {\n id: declaration.id,\n name: `PostgreSQL — ${hostLabel}`,\n description: `Query PostgreSQL database at ${hostLabel}`,\n category: \"database\",\n access: declaration.access,\n toolNames:\n declaration.access === \"read-write\" ? [\"query\", \"schema\", \"execute\"] : [\"query\", \"schema\"],\n };\n }\n\n async connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const started = Date.now();\n const dsn =\n resolvedFields?.dsn ??\n resolveAuth(declaration.auth, secrets) ??\n String(declaration.options?.dsn ?? \"\");\n if (!dsn) {\n this.log.error(\"connect failed: missing dsn\", undefined);\n throw new Error(\"PostgresAdapter requires auth (connection string) or options.dsn\");\n }\n\n let host = \"(unknown)\";\n try {\n host = new URL(dsn).hostname;\n } catch {}\n this.log.info(\"connect start\", { host });\n\n try {\n const pgPkg = \"pg\";\n const pg = (await import(/* @vite-ignore */ pgPkg)) as any;\n const Pool = pg.default?.Pool ?? pg.Pool;\n const pool = new Pool({ connectionString: dsn });\n\n // Verify connectivity\n const client = await pool.connect();\n client.release();\n\n this.log.info(\"connect ok\", { host, durationMs: Date.now() - started });\n return this.makeHandle(declaration, { pool, dsn } satisfies PgState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { host });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { pool } = handle.state as PgState;\n await pool.end();\n handle.connected = false;\n }\n\n private pool(handle: ConnectorHandle): any {\n return (handle.state as PgState).pool;\n }\n\n // Base ops map to table/row access via path convention: <table>/<pk>\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const parts = path.split(\"/\");\n if (parts.length === 1) {\n // Read table schema\n const table = parts[0]!;\n const result = await this.pool(handle).query(\n `SELECT column_name, data_type, is_nullable, column_default\n FROM information_schema.columns WHERE table_name = $1 ORDER BY ordinal_position`,\n [table],\n );\n if (result.rows.length === 0) return null;\n return { data: JSON.stringify(result.rows, null, 2), contentType: \"application/json\" };\n }\n // Read row by PK: <table>/<pk_value>\n const [table, pk] = parts;\n const result = await this.pool(handle).query(`SELECT * FROM \"${table}\" WHERE id = $1 LIMIT 1`, [\n pk,\n ]);\n if (result.rows.length === 0) return null;\n return { data: JSON.stringify(result.rows[0], null, 2), contentType: \"application/json\" };\n }\n\n override async list(\n handle: ConnectorHandle,\n path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n if (!path) {\n // List tables\n const result = await this.pool(handle).query(\n `SELECT table_name FROM information_schema.tables\n WHERE table_schema = 'public' ORDER BY table_name`,\n );\n return result.rows.map((r: any) => ({\n name: r.table_name,\n path: r.table_name,\n type: \"directory\" as const,\n }));\n }\n // List rows in a table\n const limit = options?.limit ?? 100;\n const result = await this.pool(handle).query(`SELECT * FROM \"${path}\" LIMIT $1`, [limit]);\n return result.rows.map((row: any, i: number) => ({\n name: String(row.id ?? i),\n path: `${path}/${row.id ?? i}`,\n type: \"row\" as const,\n }));\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n // Search across all text columns in all tables\n const tables = await this.list(handle);\n const results: SearchResult[] = [];\n const maxResults = options?.maxResults ?? 50;\n\n for (const table of tables) {\n if (results.length >= maxResults) break;\n try {\n const cols = await this.pool(handle).query(\n `SELECT column_name FROM information_schema.columns\n WHERE table_name = $1 AND data_type IN ('text', 'character varying', 'varchar')`,\n [table.name],\n );\n if (cols.rows.length === 0) continue;\n\n const conditions = cols.rows\n .map((c: any) => `\"${c.column_name}\"::text ILIKE $1`)\n .join(\" OR \");\n const searchResult = await this.pool(handle).query(\n `SELECT * FROM \"${table.name}\" WHERE ${conditions} LIMIT $2`,\n [`%${query}%`, maxResults - results.length],\n );\n for (const row of searchResult.rows) {\n results.push({\n path: `${table.name}/${row.id ?? \"?\"}`,\n snippet: JSON.stringify(row).slice(0, 200),\n });\n }\n } catch {\n // Skip tables that error (permissions, etc.)\n }\n }\n return results;\n }\n\n /**\n * Snapshot sync — dumps schema + sample data to JSON files for offline browsing.\n */\n async sync(\n handle: ConnectorHandle,\n targetDir: string,\n _options?: SyncOptions,\n ): Promise<SyncResult> {\n mkdirSync(targetDir, { recursive: true });\n let filesWritten = 0;\n\n // Dump full schema\n const schemaResult = await this.pool(handle).query(\n `SELECT table_name, column_name, data_type, is_nullable, column_default\n FROM information_schema.columns\n WHERE table_schema = 'public'\n ORDER BY table_name, ordinal_position`,\n );\n writeFileSync(join(targetDir, \"schema.json\"), JSON.stringify(schemaResult.rows, null, 2));\n filesWritten++;\n\n // Dump sample data per table\n const tablesDir = join(targetDir, \"tables\");\n mkdirSync(tablesDir, { recursive: true });\n const tables = await this.list(handle);\n const sampleRows = Number((handle.state as any)?.sampleRows ?? 100);\n\n for (const table of tables) {\n try {\n const data = await this.pool(handle).query(`SELECT * FROM \"${table.name}\" LIMIT $1`, [\n sampleRows,\n ]);\n writeFileSync(join(tablesDir, `${table.name}.json`), JSON.stringify(data.rows, null, 2));\n filesWritten++;\n } catch {\n // Skip inaccessible tables\n }\n }\n\n return { filesWritten, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"query\",\n description: \"Execute a read-only SQL query. Returns JSON rows.\",\n accessLevel: \"read\",\n args: [\n { name: \"sql\", type: \"string\", required: true, description: \"SQL SELECT statement\" },\n {\n name: \"params\",\n type: \"json\",\n required: false,\n description: \"Query parameters as JSON array\",\n },\n ],\n examples: [\n 'query --sql \"SELECT id, name FROM users LIMIT 10\"',\n \"query --sql \\\"SELECT * FROM orders WHERE user_id = $1\\\" --params '[42]'\",\n ],\n },\n {\n name: \"schema\",\n description: \"Inspect database schema — tables, columns, types, constraints.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"table\",\n type: \"string\",\n required: false,\n description: \"Specific table (omit for full schema)\",\n },\n ],\n examples: [\"schema\", \"schema --table users\"],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push({\n name: \"execute\",\n description: \"Execute a SQL mutation (INSERT, UPDATE, DELETE). Returns affected row count.\",\n accessLevel: \"write\",\n args: [\n { name: \"sql\", type: \"string\", required: true, description: \"SQL statement\" },\n {\n name: \"params\",\n type: \"json\",\n required: false,\n description: \"Query parameters as JSON array\",\n },\n ],\n examples: [\n \"execute --sql \\\"UPDATE users SET active = true WHERE id = $1\\\" --params '[42]'\",\n ],\n });\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const pool = this.pool(handle);\n\n switch (operation) {\n case \"query\": {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const params = args.params\n ? typeof args.params === \"string\"\n ? JSON.parse(args.params)\n : args.params\n : [];\n const queryStart = Date.now();\n try {\n const result = await pool.query(sql, params);\n const ms = Date.now() - queryStart;\n if (ms > 1000) {\n this.log.warn(\"slow query\", { ms, sql: sql.slice(0, 200) });\n }\n return JSON.stringify(result.rows, null, 2);\n } catch (err) {\n this.log.error(\"query failed\", err, { sql: sql.slice(0, 200) });\n throw err;\n }\n }\n case \"schema\": {\n const table = args.table ? String(args.table) : undefined;\n if (table) {\n const result = await pool.query(\n `SELECT column_name, data_type, is_nullable, column_default\n FROM information_schema.columns WHERE table_name = $1 ORDER BY ordinal_position`,\n [table],\n );\n return JSON.stringify(result.rows, null, 2);\n }\n // Full schema: tables + row counts\n const tables = await pool.query(\n `SELECT t.table_name,\n (SELECT count(*) FROM information_schema.columns c WHERE c.table_name = t.table_name) as column_count\n FROM information_schema.tables t\n WHERE t.table_schema = 'public' ORDER BY t.table_name`,\n );\n return JSON.stringify(tables.rows, null, 2);\n }\n case \"execute\": {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const params = args.params\n ? typeof args.params === \"string\"\n ? JSON.parse(args.params)\n : args.params\n : [];\n const result = await pool.query(sql, params);\n return JSON.stringify({ rowCount: result.rowCount, command: result.command });\n }\n default:\n throw new Error(`PostgresAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new PostgresAdapter instance.\n * @returns Configured PostgresAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#postgres-connector-factory\n */\nexport function createAdapter(): PostgresAdapter {\n return new PostgresAdapter();\n}\n","/**\n * RedisAdapter — Redis/KeyDB/Valkey key-value store resource.\n * Not mountable. Custom operations: get, set, keys, del, ttl, info.\n *\n * Requires `ioredis` as an optional peer dependency.\n */\n\nimport { resolveAuth, AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type { SecretProvider } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface RedisState {\n client: any; // ioredis instance\n namespace: string;\n}\n\n/**\n * Connector adapter for Redis, KeyDB, and Valkey key-value stores.\n * Provides get, set, keys, del, ttl, and info operations. Requires the `ioredis` optional peer dependency.\n * @docLink packages/base-assets/concepts#redis-connector\n */\nexport class RedisAdapter extends AbstractConnectorAdapter {\n readonly name = \"redis\";\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"url\",\n label: \"Redis URL\",\n description: \"Redis connection URL (e.g. redis://localhost:6379)\",\n type: \"url\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n ];\n }\n\n describeSkill(\n _handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const url = String(declaration.options?.url ?? \"\");\n let hostLabel = declaration.id;\n try {\n hostLabel = new URL(url).hostname;\n } catch {}\n return {\n id: declaration.id,\n name: `Redis — ${hostLabel}`,\n description: `Key-value store at ${hostLabel}`,\n category: \"kv\",\n access: declaration.access,\n toolNames: [\"get\", \"keys\", \"ttl\", \"info\"],\n };\n }\n\n async connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const started = Date.now();\n const url =\n resolvedFields?.url ??\n resolveAuth(declaration.auth, secrets) ??\n String(declaration.options?.url ?? \"\");\n if (!url) {\n this.log.error(\"connect failed: missing url\", undefined);\n throw new Error(\"RedisAdapter requires auth (URL) or options.url\");\n }\n\n let host = \"(unknown)\";\n try {\n host = new URL(url).hostname;\n } catch {}\n this.log.info(\"connect start\", { host });\n\n try {\n const ioredisPkg = \"ioredis\";\n const mod = (await import(/* @vite-ignore */ ioredisPkg)) as any;\n const Redis = mod.default ?? mod.Redis ?? mod;\n const client = new Redis(url, { lazyConnect: true, maxRetriesPerRequest: 2 });\n await client.connect();\n\n const namespace = String(declaration.options?.namespace ?? \"\");\n\n this.log.info(\"connect ok\", { host, durationMs: Date.now() - started });\n return this.makeHandle(declaration, { client, namespace } satisfies RedisState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { host });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { client } = handle.state as RedisState;\n await client.quit();\n handle.connected = false;\n }\n\n private client(handle: ConnectorHandle): any {\n return (handle.state as RedisState).client;\n }\n\n private nsKey(handle: ConnectorHandle, key: string): string {\n const ns = (handle.state as RedisState).namespace;\n return ns ? `${ns}:${key}` : key;\n }\n\n private stripNs(handle: ConnectorHandle, key: string): string {\n const ns = (handle.state as RedisState).namespace;\n return ns && key.startsWith(`${ns}:`) ? key.slice(ns.length + 1) : key;\n }\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const value = await this.client(handle).get(this.nsKey(handle, path));\n if (value === null) return null;\n return { data: value, contentType: \"application/json\" };\n }\n\n override async write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n const data = typeof content.data === \"string\" ? content.data : content.data.toString(\"utf-8\");\n await this.client(handle).set(this.nsKey(handle, path), data);\n }\n\n override async delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const count = await this.client(handle).del(this.nsKey(handle, path));\n return count > 0;\n }\n\n override async list(\n handle: ConnectorHandle,\n path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const ns = (handle.state as RedisState).namespace;\n const pattern = path\n ? this.nsKey(handle, path.endsWith(\"*\") ? path : `${path}*`)\n : ns\n ? `${ns}:*`\n : \"*\";\n\n const keys: string[] = [];\n let cursor = \"0\";\n const limit = options?.limit ?? 1000;\n\n do {\n const [next, batch] = await this.client(handle).scan(cursor, \"MATCH\", pattern, \"COUNT\", 100);\n cursor = next;\n keys.push(...batch);\n if (keys.length >= limit) break;\n } while (cursor !== \"0\");\n\n return keys.slice(0, limit).map((k) => ({\n name: this.stripNs(handle, k),\n path: this.stripNs(handle, k),\n type: \"key\" as const,\n }));\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n // SCAN + GET for matching values (expensive but functional)\n const entries = await this.list(handle, undefined, { limit: options?.maxResults ?? 100 });\n const results: SearchResult[] = [];\n\n for (const entry of entries) {\n if (options?.maxResults && results.length >= options.maxResults) break;\n if (entry.name.includes(query)) {\n results.push({ path: entry.name });\n continue;\n }\n const value = await this.client(handle).get(this.nsKey(handle, entry.name));\n if (value?.includes(query)) {\n results.push({ path: entry.name, snippet: value.slice(0, 200) });\n }\n }\n return results;\n }\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get\",\n description: \"Get value by key.\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Redis key\" }],\n examples: ['get --key \"config:theme\"'],\n },\n {\n name: \"keys\",\n description: \"List keys matching a glob pattern.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"pattern\",\n type: \"string\",\n required: false,\n description: \"Glob pattern (default: *)\",\n },\n ],\n examples: [\"keys\", 'keys --pattern \"user:*\"'],\n },\n {\n name: \"ttl\",\n description:\n \"Get remaining time-to-live for a key (seconds, -1 if no expiry, -2 if key does not exist).\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Redis key\" }],\n },\n {\n name: \"info\",\n description: \"Get Redis server info (memory, clients, keyspace stats).\",\n accessLevel: \"read\",\n args: [\n {\n name: \"section\",\n type: \"string\",\n required: false,\n description: \"Info section (memory, clients, keyspace, all)\",\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"set\",\n description: \"Set a key-value pair with optional TTL.\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Redis key\" },\n { name: \"value\", type: \"string\", required: true, description: \"Value to store\" },\n { name: \"ttl\", type: \"number\", required: false, description: \"Expiry in seconds\" },\n ],\n examples: [\n 'set --key \"status\" --value \"running\"',\n 'set --key \"cache:token\" --value \"abc\" --ttl 3600',\n ],\n },\n {\n name: \"del\",\n description: \"Delete one or more keys.\",\n accessLevel: \"write\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key to delete\" }],\n examples: ['del --key \"temp:session\"'],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const client = this.client(handle);\n\n switch (operation) {\n case \"get\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const value = await client.get(this.nsKey(handle, key));\n return value ?? \"\";\n }\n case \"set\": {\n const key = String(args.key ?? \"\");\n const value = String(args.value ?? \"\");\n const fullKey = this.nsKey(handle, key);\n if (args.ttl) {\n await client.set(fullKey, value, \"EX\", Number(args.ttl));\n } else {\n await client.set(fullKey, value);\n }\n return \"OK\";\n }\n case \"keys\": {\n const pattern = args.pattern ? String(args.pattern) : \"*\";\n const entries = await this.list(handle, pattern.endsWith(\"*\") ? pattern : `${pattern}*`);\n return JSON.stringify(entries.map((e) => e.name));\n }\n case \"del\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const count = await client.del(this.nsKey(handle, key));\n return count > 0 ? \"Deleted\" : \"Not found\";\n }\n case \"ttl\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const ttl = await client.ttl(this.nsKey(handle, key));\n return String(ttl);\n }\n case \"info\": {\n const section = args.section ? String(args.section) : undefined;\n const info = section ? await client.info(section) : await client.info();\n return info;\n }\n default:\n throw new Error(`RedisAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new RedisAdapter instance.\n * @returns Configured RedisAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#redis-connector-factory\n */\nexport function createAdapter(): RedisAdapter {\n return new RedisAdapter();\n}\n","/**\n * SQLiteAdapter — SQLite database resource via sql.js (WASM).\n * Not mountable. Custom operations: query, schema, execute.\n *\n * Uses sql.js — SQLite compiled to WebAssembly. Runs on Node, Bun, and\n * browsers without native compilation or platform-specific binaries.\n *\n * Requires `sql.js` as an optional peer dependency.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolveAuth, AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type { SecretProvider } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface SqliteState {\n db: any; // sql.js Database instance\n dbPath: string;\n readonly: boolean;\n}\n\n/**\n * Connector adapter for SQLite databases via sql.js (WASM). Supports in-memory and file-backed databases.\n * Provides query, schema inspection, and execute operations. Requires the `sql.js` optional peer dependency.\n * @docLink packages/base-assets/concepts#sqlite-connector\n */\nexport class SQLiteAdapter extends AbstractConnectorAdapter {\n readonly name = \"sqlite\";\n\n async connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const started = Date.now();\n const dbPath =\n resolveAuth(declaration.auth, secrets) ?? String(declaration.options?.path ?? \"\");\n if (!dbPath) {\n this.log.error(\"connect failed: missing path\", undefined);\n throw new Error(\"SQLiteAdapter requires auth (db path) or options.path\");\n }\n this.log.info(\"connect start\", { dbPath });\n\n const sqljsPkg = \"sql.js\";\n const initSqlJs = await import(/* @vite-ignore */ sqljsPkg).then((m) => m.default ?? m);\n const SQL = await initSqlJs();\n\n const isReadonly = declaration.access === \"read-only\";\n let db: any;\n\n if (dbPath === \":memory:\") {\n db = new SQL.Database();\n } else if (existsSync(dbPath)) {\n const buffer = readFileSync(dbPath);\n db = new SQL.Database(buffer);\n } else if (!isReadonly) {\n // Create new database file\n db = new SQL.Database();\n } else {\n this.log.error(\"connect failed: db file not found\", undefined, { dbPath });\n throw new Error(`SQLite database not found: ${dbPath}`);\n }\n\n this.log.info(\"connect ok\", { dbPath, durationMs: Date.now() - started });\n\n // Enable WAL mode for file-backed databases (not supported in sql.js but\n // harmless — sql.js operates in-memory and flushes to disk on save)\n if (!isReadonly && dbPath !== \":memory:\") {\n try {\n db.run(\"PRAGMA journal_mode = WAL\");\n } catch {\n /* ignored in WASM */\n }\n }\n\n return this.makeHandle(declaration, { db, dbPath, readonly: isReadonly } satisfies SqliteState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { db, dbPath, readonly: isReadonly } = handle.state as SqliteState;\n // Persist changes to disk before closing (sql.js is in-memory)\n if (!isReadonly && dbPath !== \":memory:\") {\n this.saveToDisk(db, dbPath);\n }\n db.close();\n handle.connected = false;\n }\n\n private db(handle: ConnectorHandle): any {\n return (handle.state as SqliteState).db;\n }\n\n /** sql.js operates in-memory — flush to disk explicitly. */\n private saveToDisk(db: any, dbPath: string): void {\n try {\n const data = db.export();\n const buffer = Buffer.from(data);\n writeFileSync(dbPath, buffer);\n } catch {\n /* best-effort */\n }\n }\n\n /** Run a query that returns rows. sql.js uses stmt.getAsObject() pattern. */\n private queryRows(db: any, sql: string, params?: unknown[]): Record<string, unknown>[] {\n const stmt = db.prepare(sql);\n if (params?.length) stmt.bind(params);\n const rows: Record<string, unknown>[] = [];\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n stmt.free();\n return rows;\n }\n\n /** Run a statement that modifies data. Returns changes count. */\n private runStmt(db: any, sql: string, params?: unknown[]): number {\n if (params?.length) {\n db.run(sql, params);\n } else {\n db.run(sql);\n }\n const changes = db.getRowsModified();\n return changes;\n }\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const parts = path.split(\"/\");\n if (parts.length === 1) {\n const table = parts[0]!;\n const info = this.queryRows(this.db(handle), `PRAGMA table_info(\"${table}\")`);\n if (info.length === 0) return null;\n return { data: JSON.stringify(info, null, 2), contentType: \"application/json\" };\n }\n const [table, rowid] = parts;\n const rows = this.queryRows(this.db(handle), `SELECT * FROM \"${table}\" WHERE rowid = ?`, [\n rowid,\n ]);\n if (rows.length === 0) return null;\n return { data: JSON.stringify(rows[0], null, 2), contentType: \"application/json\" };\n }\n\n override async list(\n handle: ConnectorHandle,\n path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n if (!path) {\n const tables = this.queryRows(\n this.db(handle),\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name\",\n );\n return tables.map((t: any) => ({\n name: t.name,\n path: t.name,\n type: \"directory\" as const,\n }));\n }\n const limit = options?.limit ?? 100;\n const rows = this.queryRows(this.db(handle), `SELECT rowid, * FROM \"${path}\" LIMIT ?`, [limit]);\n return rows.map((row: any) => ({\n name: String(row.rowid ?? row.id ?? \"?\"),\n path: `${path}/${row.rowid ?? row.id ?? \"?\"}`,\n type: \"row\" as const,\n }));\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n const tables = await this.list(handle);\n const results: SearchResult[] = [];\n const maxResults = options?.maxResults ?? 50;\n\n for (const table of tables) {\n if (results.length >= maxResults) break;\n try {\n const info = this.queryRows(this.db(handle), `PRAGMA table_info(\"${table.name}\")`);\n const textCols = info.filter((c: any) => /text|varchar|char/i.test(String(c.type ?? \"\")));\n if (textCols.length === 0) continue;\n\n const conditions = textCols.map((c: any) => `\"${c.name}\" LIKE ?`).join(\" OR \");\n const params: unknown[] = textCols.map(() => `%${query}%`);\n params.push(maxResults - results.length);\n const rows = this.queryRows(\n this.db(handle),\n `SELECT rowid, * FROM \"${table.name}\" WHERE ${conditions} LIMIT ?`,\n params,\n );\n\n for (const row of rows) {\n results.push({\n path: `${table.name}/${row.rowid ?? \"?\"}`,\n snippet: JSON.stringify(row).slice(0, 200),\n });\n }\n } catch {\n // Skip inaccessible tables\n }\n }\n return results;\n }\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"query\",\n description: \"Execute a read-only SQL query. Returns JSON rows.\",\n accessLevel: \"read\",\n args: [\n { name: \"sql\", type: \"string\", required: true, description: \"SQL SELECT statement\" },\n ],\n examples: [\n 'query --sql \"SELECT * FROM users LIMIT 10\"',\n 'query --sql \"SELECT count(*) as total FROM orders\"',\n ],\n },\n {\n name: \"schema\",\n description: \"Inspect database schema — tables and their columns.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"table\",\n type: \"string\",\n required: false,\n description: \"Specific table (omit for all tables)\",\n },\n ],\n examples: [\"schema\", \"schema --table users\"],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push({\n name: \"execute\",\n description:\n \"Execute a SQL statement (INSERT, UPDATE, DELETE, CREATE). Returns changes count.\",\n accessLevel: \"write\",\n args: [{ name: \"sql\", type: \"string\", required: true, description: \"SQL statement\" }],\n examples: [\"execute --sql \\\"INSERT INTO users (name) VALUES ('Alice')\\\"\"],\n });\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const db = this.db(handle);\n const state = handle.state as SqliteState;\n\n switch (operation) {\n case \"query\": {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const rows = this.queryRows(db, sql);\n return JSON.stringify(rows, null, 2);\n }\n case \"schema\": {\n const table = args.table ? String(args.table) : undefined;\n if (table) {\n const info = this.queryRows(db, `PRAGMA table_info(\"${table}\")`);\n return JSON.stringify(info, null, 2);\n }\n const tables = this.queryRows(\n db,\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name\",\n );\n const result: Record<string, any> = {};\n for (const t of tables) {\n result[t.name as string] = this.queryRows(db, `PRAGMA table_info(\"${t.name}\")`);\n }\n return JSON.stringify(result, null, 2);\n }\n case \"execute\": {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const changes = this.runStmt(db, sql);\n // Persist after mutation\n if (!state.readonly && state.dbPath !== \":memory:\") {\n this.saveToDisk(db, state.dbPath);\n }\n return JSON.stringify({ changes });\n }\n default:\n throw new Error(`SQLiteAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new SQLiteAdapter instance.\n * @returns Configured SQLiteAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#sqlite-connector-factory\n */\nexport function createAdapter(): SQLiteAdapter {\n return new SQLiteAdapter();\n}\n","/**\n * XStateAdapter — full state machine resource via XState v5.\n * Not mountable. Provides guarded transitions, entry/exit actions,\n * context, and serializable snapshots.\n *\n * Requires `xstate` (v5+) as an optional peer dependency.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface XStateState {\n actor: any; // XState Actor\n machine: any; // XState Machine (for introspection)\n definition: any; // Raw definition object\n history: Array<{ event: string; from: string; to: string; at: string }>;\n onChange?: (snapshot: { value: any; context: any }) => void;\n actions: Record<string, (...args: any[]) => void>;\n guards: Record<string, (...args: any[]) => boolean>;\n}\n\n/**\n * Connector adapter for XState v5 state machines — drives guarded transitions, tracks history, and exposes the current state and context to agents.\n * Machine definitions can be provided inline or loaded from a JSON/YAML file. Requires the `xstate` optional peer dependency.\n * @docLink packages/base-assets/concepts#xstate-connector\n */\nexport class XStateAdapter extends AbstractConnectorAdapter {\n readonly name = \"xstate\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const xstatePkg = \"xstate\";\n const xstate = (await import(/* @vite-ignore */ xstatePkg)) as any;\n const { createMachine, createActor } = xstate;\n\n // Load machine definition\n let definition = declaration.options?.machine as Record<string, unknown> | undefined;\n if (!definition && declaration.options?.definitionPath) {\n const defPath = String(declaration.options.definitionPath);\n if (!existsSync(defPath)) throw new Error(`Machine definition not found: ${defPath}`);\n const raw = readFileSync(defPath, \"utf-8\");\n if (defPath.endsWith(\".json\")) {\n definition = JSON.parse(raw);\n } else {\n const { parse } = (await import(/* @vite-ignore */ \"yaml\")) as any;\n definition = parse(raw);\n }\n }\n\n if (!definition)\n throw new Error(\"XStateAdapter requires options.machine or options.definitionPath\");\n\n const state: XStateState = {\n actor: null,\n machine: null,\n definition,\n history: [],\n actions: {},\n guards: {},\n };\n\n // Build the machine — actions and guards are proxied so they can be\n // registered after connection (by the runner or Nuxt server)\n const actionProxy: Record<string, (...args: any[]) => void> = {};\n const guardProxy: Record<string, (...args: any[]) => boolean> = {};\n\n // Collect action/guard names from definition\n const actionNames = this.collectNames(definition, \"actions\");\n const guardNames = this.collectNames(definition, \"guard\");\n\n for (const name of actionNames) {\n actionProxy[name] = (...args: any[]) => {\n if (state.actions[name]) state.actions[name](...args);\n };\n }\n for (const name of guardNames) {\n guardProxy[name] = (...args: any[]) => {\n return state.guards[name] ? state.guards[name](...args) : true;\n };\n }\n\n const machineConfig = {\n ...definition,\n // Ensure context is an object\n context: definition.context ?? {},\n };\n\n const machine = createMachine(machineConfig, {\n actions: actionProxy,\n guards: guardProxy,\n });\n\n const actor = createActor(machine);\n\n // Track state changes\n actor.subscribe((snapshot: any) => {\n state.onChange?.({ value: snapshot.value, context: snapshot.context });\n });\n\n actor.start();\n\n state.actor = actor;\n state.machine = machine;\n\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const s = handle.state as XStateState;\n s.actor?.stop();\n handle.connected = false;\n }\n\n private s(handle: ConnectorHandle): XStateState {\n return handle.state as XStateState;\n }\n\n /**\n * Register action implementations. Call after connect().\n */\n registerActions(\n handle: ConnectorHandle,\n actions: Record<string, (...args: any[]) => void>,\n ): void {\n Object.assign(this.s(handle).actions, actions);\n }\n\n /**\n * Register guard implementations. Call after connect().\n */\n registerGuards(\n handle: ConnectorHandle,\n guards: Record<string, (...args: any[]) => boolean>,\n ): void {\n Object.assign(this.s(handle).guards, guards);\n }\n\n /**\n * Register a callback fired on every state change.\n */\n onStateChange(\n handle: ConnectorHandle,\n cb: (snapshot: { value: any; context: any }) => void,\n ): void {\n this.s(handle).onChange = cb;\n }\n\n // ── Base operations ────────────────────────────────────────────────────\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const snapshot = this.s(handle).actor.getSnapshot();\n if (path === \"\" || path === \"state\") {\n return { data: JSON.stringify(snapshot.value), contentType: \"application/json\" };\n }\n if (path === \"context\") {\n return { data: JSON.stringify(snapshot.context, null, 2), contentType: \"application/json\" };\n }\n // Read a specific context key\n const value = snapshot.context?.[path];\n if (value === undefined) return null;\n return { data: JSON.stringify(value), contentType: \"application/json\" };\n }\n\n override async list(\n handle: ConnectorHandle,\n _path?: string,\n _options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const snapshot = this.s(handle).actor.getSnapshot();\n const entries: ConnectorEntry[] = [\n { name: \"state\", path: \"state\", type: \"key\" },\n { name: \"context\", path: \"context\", type: \"key\" },\n ];\n if (snapshot.context && typeof snapshot.context === \"object\") {\n for (const key of Object.keys(snapshot.context)) {\n entries.push({ name: key, path: `context/${key}`, type: \"key\" });\n }\n }\n return entries;\n }\n\n override async search(handle: ConnectorHandle, query: string): Promise<SearchResult[]> {\n const snapshot = this.s(handle).actor.getSnapshot();\n const full = JSON.stringify({ value: snapshot.value, context: snapshot.context });\n if (full.includes(query)) {\n return [{ path: \"state\", snippet: full.slice(0, 200) }];\n }\n return [];\n }\n\n // ── Custom operations ──────────────────────────────────────────────────\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get_state\",\n description: \"Get the current state value, context, and list of available transitions.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"get_definition\",\n description: \"Get the machine definition (states, transitions, guards).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"history\",\n description: \"Get the transition history log.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"limit\",\n type: \"number\",\n required: false,\n description: \"Max entries (default: 50)\",\n },\n ],\n },\n {\n name: \"can\",\n description: \"Check if a specific event/transition is currently allowed.\",\n accessLevel: \"read\",\n args: [\n { name: \"event\", type: \"string\", required: true, description: \"Event type to check\" },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push({\n name: \"send\",\n description: \"Send an event to the state machine, triggering a transition if valid.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"event\",\n type: \"string\",\n required: true,\n description: \"Event type (e.g., SUBMIT, APPROVE)\",\n },\n { name: \"data\", type: \"json\", required: false, description: \"Event payload data (JSON)\" },\n ],\n examples: [\"send --event APPROVE\", 'send --event SUBMIT --data \\'{\"reviewer\":\"alice\"}\\''],\n });\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const s = this.s(handle);\n\n switch (operation) {\n case \"get_state\": {\n const snapshot = s.actor.getSnapshot();\n const nextEvents = this.getAvailableEvents(handle);\n return JSON.stringify(\n {\n value: snapshot.value,\n context: snapshot.context,\n availableEvents: nextEvents,\n },\n null,\n 2,\n );\n }\n\n case \"get_definition\":\n return JSON.stringify(s.definition, null, 2);\n\n case \"history\": {\n const limit = Number(args.limit ?? 50);\n return JSON.stringify(s.history.slice(-limit), null, 2);\n }\n\n case \"can\": {\n const event = String(args.event ?? \"\");\n const snapshot = s.actor.getSnapshot();\n const can =\n snapshot.can?.({ type: event }) ?? this.getAvailableEvents(handle).includes(event);\n return JSON.stringify({ event, allowed: can });\n }\n\n case \"send\": {\n const eventType = String(args.event ?? args._positional ?? \"\");\n if (!eventType) return \"Error: event argument is required\";\n\n const snapshot = s.actor.getSnapshot();\n const fromState =\n typeof snapshot.value === \"string\" ? snapshot.value : JSON.stringify(snapshot.value);\n\n let eventPayload: Record<string, unknown> = { type: eventType };\n if (args.data) {\n const data = typeof args.data === \"string\" ? JSON.parse(args.data) : args.data;\n eventPayload = { type: eventType, ...data };\n }\n\n s.actor.send(eventPayload);\n\n const newSnapshot = s.actor.getSnapshot();\n const toState =\n typeof newSnapshot.value === \"string\"\n ? newSnapshot.value\n : JSON.stringify(newSnapshot.value);\n\n const transitioned = fromState !== toState;\n s.history.push({\n event: eventType,\n from: fromState,\n to: toState,\n at: new Date().toISOString(),\n });\n\n // Cap history\n if (s.history.length > 500) s.history = s.history.slice(-500);\n\n if (transitioned) {\n this.emitChange?.({ path: `state`, action: \"edit\", source: \"operation\" });\n }\n\n return JSON.stringify(\n {\n transitioned,\n from: fromState,\n to: toState,\n context: newSnapshot.context,\n availableEvents: this.getAvailableEvents(handle),\n },\n null,\n 2,\n );\n }\n\n default:\n throw new Error(`XStateAdapter has no operation: ${operation}`);\n }\n }\n\n // ── Private helpers ────────────────────────────────────────────────────\n\n private getAvailableEvents(handle: ConnectorHandle): string[] {\n const snapshot = this.s(handle).actor.getSnapshot();\n const currentState = typeof snapshot.value === \"string\" ? snapshot.value : null;\n if (!currentState) return [];\n const stateDef = this.s(handle).definition?.states?.[currentState];\n if (!stateDef?.on) return [];\n return Object.keys(stateDef.on);\n }\n\n /** Collect all named actions or guards from a machine definition tree. */\n private collectNames(def: any, key: \"actions\" | \"guard\"): string[] {\n const names = new Set<string>();\n const walk = (obj: any) => {\n if (!obj || typeof obj !== \"object\") return;\n if (key === \"actions\") {\n for (const field of [\"actions\", \"entry\", \"exit\"]) {\n const val = obj[field];\n if (typeof val === \"string\") names.add(val);\n if (Array.isArray(val))\n val.forEach((v: any) => {\n if (typeof v === \"string\") names.add(v);\n });\n }\n }\n if (key === \"guard\" && typeof obj.guard === \"string\") {\n names.add(obj.guard);\n }\n for (const v of Object.values(obj)) {\n if (v && typeof v === \"object\") walk(v);\n }\n };\n walk(def);\n return [...names];\n }\n}\n\n/**\n * Creates a new XStateAdapter instance.\n * @returns Configured XStateAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#xstate-connector-factory\n */\nexport function createAdapter(): XStateAdapter {\n return new XStateAdapter();\n}\n","/**\n * XStateStoreAdapter — lightweight typed event store via @xstate/store.\n * Not mountable. Provides a shared event-driven store between UI and agents.\n *\n * Requires `@xstate/store` as an optional peer dependency.\n */\n\nimport { AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface StoreState {\n store: any; // @xstate/store Store instance\n history: Array<{ event: string; payload: unknown; at: string }>;\n onChange?: (snapshot: Record<string, unknown>) => void;\n}\n\n/**\n * Connector adapter for `@xstate/store` — a lightweight event-driven key-value store shared between agents and UI clients.\n * Provides get, set, merge, and reset operations with an event history log. Requires the `@xstate/store` optional peer dependency.\n * @docLink packages/base-assets/concepts#xstate-store-connector\n */\nexport class XStateStoreAdapter extends AbstractConnectorAdapter {\n readonly name = \"xstate-store\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const { createStore } = (await import(\"@xstate/store\")) as any;\n\n const initial = (declaration.options?.initial as Record<string, unknown>) ?? {};\n\n // Create a dynamic store that accepts get/set/merge/delete events\n const store = createStore({\n context: { ...initial },\n on: {\n set: (ctx: Record<string, unknown>, event: { key: string; value: unknown }) => ({\n ...ctx,\n [event.key]: event.value,\n }),\n merge: (ctx: Record<string, unknown>, event: { data: Record<string, unknown> }) => ({\n ...ctx,\n ...event.data,\n }),\n delete: (ctx: Record<string, unknown>, event: { key: string }) => {\n const next = { ...ctx };\n delete next[event.key];\n return next;\n },\n reset: (_ctx: Record<string, unknown>, event: { initial?: Record<string, unknown> }) => ({\n ...(event.initial ?? initial),\n }),\n },\n });\n\n const state: StoreState = { store, history: [] };\n\n // Wire up subscription for change notifications\n store.subscribe((snapshot: any) => {\n state.onChange?.(snapshot.context);\n });\n\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n handle.connected = false;\n }\n\n private state(handle: ConnectorHandle): StoreState {\n return handle.state as StoreState;\n }\n\n private context(handle: ConnectorHandle): Record<string, unknown> {\n return this.state(handle).store.getSnapshot().context;\n }\n\n /**\n * Register a callback fired on every state change.\n */\n onStoreChange(handle: ConnectorHandle, cb: (snapshot: Record<string, unknown>) => void): void {\n (handle.state as StoreState).onChange = cb;\n }\n\n // ── Base operations (map to KV-like access on the context) ─────────────\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const ctx = this.context(handle);\n if (path === \"*\") {\n if (Object.keys(ctx).length === 0) return null;\n return { data: JSON.stringify(ctx, null, 2), contentType: \"application/json\" };\n }\n const value = ctx[path];\n if (value === undefined) return null;\n return { data: JSON.stringify(value), contentType: \"application/json\" };\n }\n\n override async write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n const data = typeof content.data === \"string\" ? content.data : content.data.toString(\"utf-8\");\n let value: unknown;\n try {\n value = JSON.parse(data);\n } catch {\n value = data;\n }\n this.state(handle).store.send({ type: \"set\", key: path, value });\n this.recordHistory(handle, \"set\", { key: path, value });\n }\n\n override async delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const ctx = this.context(handle);\n if (!(path in ctx)) return false;\n this.state(handle).store.send({ type: \"delete\", key: path });\n this.recordHistory(handle, \"delete\", { key: path });\n return true;\n }\n\n override async list(\n handle: ConnectorHandle,\n _path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const ctx = this.context(handle);\n let keys = Object.keys(ctx);\n if (options?.glob) {\n const regex = new RegExp(`^${options.glob.replace(/\\*/g, \".*\")}$`);\n keys = keys.filter((k) => regex.test(k));\n }\n if (options?.limit) keys = keys.slice(0, options.limit);\n return keys.map((k) => ({ name: k, path: k, type: \"key\" as const }));\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n const ctx = this.context(handle);\n const results: SearchResult[] = [];\n for (const [key, value] of Object.entries(ctx)) {\n if (options?.maxResults && results.length >= options.maxResults) break;\n const str = JSON.stringify(value);\n if (key.includes(query) || str.includes(query)) {\n results.push({ path: key, snippet: str.slice(0, 200) });\n }\n }\n return results;\n }\n\n // ── Custom operations ──────────────────────────────────────────────────\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get\",\n description: \"Get the full store snapshot (all keys and values).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"get_key\",\n description: \"Get a single value by key.\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key name\" }],\n },\n {\n name: \"history\",\n description: \"Get the event history log.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"limit\",\n type: \"number\",\n required: false,\n description: \"Max entries (default: 50)\",\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"set\",\n description: \"Set a key to a value.\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Key name\" },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"Value (JSON-encoded for objects)\",\n },\n ],\n examples: [\"set --key theme --value '\\\"dark\\\"'\", \"set --key count --value 42\"],\n },\n {\n name: \"merge\",\n description: \"Merge an object into the store context (shallow merge).\",\n accessLevel: \"write\",\n args: [\n {\n name: \"data\",\n type: \"json\",\n required: true,\n description: \"JSON object to merge into context\",\n },\n ],\n examples: ['merge --data \\'{\"theme\":\"dark\",\"locale\":\"de\"}\\''],\n },\n {\n name: \"reset\",\n description: \"Reset the store to its initial context.\",\n accessLevel: \"write\",\n args: [],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const s = this.state(handle);\n\n switch (operation) {\n case \"get\":\n return JSON.stringify(this.context(handle), null, 2);\n\n case \"get_key\": {\n const key = String(args.key ?? \"\");\n const value = this.context(handle)[key];\n return value !== undefined ? JSON.stringify(value) : \"\";\n }\n\n case \"history\": {\n const limit = Number(args.limit ?? 50);\n return JSON.stringify(s.history.slice(-limit), null, 2);\n }\n\n case \"set\": {\n const key = String(args.key ?? \"\");\n let value: unknown = args.value;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n /* keep as string */\n }\n }\n const hadKey = key in this.context(handle);\n s.store.send({ type: \"set\", key, value });\n this.recordHistory(handle, \"set\", { key, value });\n this.emitChange?.({ path: key, action: hadKey ? \"edit\" : \"create\", source: \"operation\" });\n return \"OK\";\n }\n\n case \"merge\": {\n let data = args.data;\n if (typeof data === \"string\") data = JSON.parse(data);\n s.store.send({ type: \"merge\", data });\n this.recordHistory(handle, \"merge\", { data });\n if (typeof data === \"object\" && data !== null) {\n const ctx = this.context(handle);\n for (const key of Object.keys(data as Record<string, unknown>)) {\n this.emitChange?.({\n path: key,\n action: key in ctx ? \"edit\" : \"create\",\n source: \"operation\",\n });\n }\n }\n return \"OK\";\n }\n\n case \"reset\": {\n s.store.send({ type: \"reset\" });\n s.history = [];\n this.emitChange?.({ path: \"\", action: \"edit\", source: \"operation\" });\n return \"OK\";\n }\n\n default:\n throw new Error(`XStateStoreAdapter has no operation: ${operation}`);\n }\n }\n\n private recordHistory(handle: ConnectorHandle, event: string, payload: unknown): void {\n const s = this.state(handle);\n s.history.push({ event, payload, at: new Date().toISOString() });\n if (s.history.length > 500) s.history = s.history.slice(-500);\n }\n}\n\n/**\n * Creates a new XStateStoreAdapter instance.\n * @returns Configured XStateStoreAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#xstate-store-connector-factory\n */\nexport function createAdapter(): XStateStoreAdapter {\n return new XStateStoreAdapter();\n}\n","/**\n * YjsAdapter — CRDT-based shared document state via Yjs.\n * Not mountable. Provides real-time collaborative state that merges\n * concurrent edits from multiple agents and UI clients.\n *\n * Requires `yjs` as an optional peer dependency.\n */\n\nimport { AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface YjsState {\n doc: any; // Y.Doc\n root: any; // Y.Map (root map)\n history: Array<{ op: string; key: string; at: string }>;\n onChange?: (snapshot: Record<string, unknown>, changed: string[]) => void;\n}\n\n/**\n * Connector adapter for Yjs CRDT-based shared document state — enables real-time collaborative state that merges concurrent edits from multiple agents and UI clients.\n * Compatible with Hocuspocus and y-websocket provider connections via `getDoc()`. Requires the `yjs` optional peer dependency.\n * @docLink packages/base-assets/concepts#yjs-connector\n */\nexport class YjsAdapter extends AbstractConnectorAdapter {\n readonly name = \"yjs\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const yjsPkg = \"yjs\";\n const Y = (await import(/* @vite-ignore */ yjsPkg)) as any;\n\n const doc = new Y.Doc();\n const root = doc.getMap(\"root\");\n\n // Apply initial values\n const initial = declaration.options?.initial as Record<string, unknown> | undefined;\n if (initial) {\n doc.transact(() => {\n for (const [key, value] of Object.entries(initial)) {\n root.set(key, this.toYjsValue(Y, value));\n }\n });\n }\n\n const state: YjsState = { doc, root, history: [] };\n\n // Observe changes\n root.observe((event: any) => {\n const changed: string[] = [];\n event.changes.keys.forEach((_change: any, key: string) => {\n changed.push(key);\n });\n if (changed.length > 0 && state.onChange) {\n state.onChange(root.toJSON(), changed);\n }\n });\n\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const s = handle.state as YjsState;\n s.doc.destroy();\n handle.connected = false;\n }\n\n private s(handle: ConnectorHandle): YjsState {\n return handle.state as YjsState;\n }\n\n /**\n * Get the Y.Doc for external provider connections (Hocuspocus, y-websocket).\n */\n getDoc(handle: ConnectorHandle): unknown {\n return this.s(handle).doc;\n }\n\n /**\n * Register a callback fired on every change to the root map.\n */\n onDocChange(\n handle: ConnectorHandle,\n cb: (snapshot: Record<string, unknown>, changedKeys: string[]) => void,\n ): void {\n this.s(handle).onChange = cb;\n }\n\n // ── Base operations ────────────────────────────────────────────────────\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const root = this.s(handle).root;\n const value = root.get(path);\n if (value === undefined) return null;\n const resolved = this.fromYjsValue(value);\n return { data: JSON.stringify(resolved), contentType: \"application/json\" };\n }\n\n override async write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n const data = typeof content.data === \"string\" ? content.data : content.data.toString(\"utf-8\");\n let value: unknown;\n try {\n value = JSON.parse(data);\n } catch {\n value = data;\n }\n\n const Y = await this.getY();\n const root = this.s(handle).root;\n this.s(handle).doc.transact(() => {\n root.set(path, this.toYjsValue(Y, value));\n });\n this.recordHistory(handle, \"set\", path);\n }\n\n override async delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const root = this.s(handle).root;\n if (!root.has(path)) return false;\n root.delete(path);\n this.recordHistory(handle, \"delete\", path);\n return true;\n }\n\n override async list(\n handle: ConnectorHandle,\n _path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const root = this.s(handle).root;\n const entries: ConnectorEntry[] = [];\n for (const key of root.keys()) {\n if (options?.limit && entries.length >= options.limit) break;\n entries.push({ name: key, path: key, type: \"key\" });\n }\n return entries;\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n const root = this.s(handle).root;\n const results: SearchResult[] = [];\n for (const key of root.keys()) {\n if (options?.maxResults && results.length >= options.maxResults) break;\n const value = root.get(key);\n const str = JSON.stringify(this.fromYjsValue(value));\n if (key.includes(query) || str.includes(query)) {\n results.push({ path: key, snippet: str.slice(0, 200) });\n }\n }\n return results;\n }\n\n // ── Custom operations ──────────────────────────────────────────────────\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"snapshot\",\n description: \"Get the full document snapshot (all keys and values).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"get\",\n description: \"Get a single value by key.\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key name\" }],\n },\n {\n name: \"keys\",\n description: \"List all keys in the document.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"history\",\n description: \"Get the local operation history.\",\n accessLevel: \"read\",\n args: [{ name: \"limit\", type: \"number\", required: false, description: \"Max entries\" }],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"set\",\n description: \"Set a key to a value. Merges with concurrent writes via CRDT.\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Key name\" },\n {\n name: \"value\",\n type: \"string\",\n required: true,\n description: \"Value (JSON-encoded for objects)\",\n },\n ],\n examples: [\n \"set --key theme --value '\\\"dark\\\"'\",\n \"set --key config --value '{\\\"debug\\\":true}'\",\n ],\n },\n {\n name: \"merge\",\n description: \"Merge an object into the document (each key set independently via CRDT).\",\n accessLevel: \"write\",\n args: [\n { name: \"data\", type: \"json\", required: true, description: \"JSON object to merge\" },\n ],\n },\n {\n name: \"del\",\n description: \"Delete a key from the document.\",\n accessLevel: \"write\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key to delete\" }],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const s = this.s(handle);\n const Y = await this.getY();\n\n switch (operation) {\n case \"snapshot\":\n return JSON.stringify(s.root.toJSON(), null, 2);\n\n case \"get\": {\n const key = String(args.key ?? \"\");\n const value = s.root.get(key);\n return value !== undefined ? JSON.stringify(this.fromYjsValue(value)) : \"\";\n }\n\n case \"keys\":\n return JSON.stringify([...s.root.keys()]);\n\n case \"history\": {\n const limit = Number(args.limit ?? 50);\n return JSON.stringify(s.history.slice(-limit), null, 2);\n }\n\n case \"set\": {\n const key = String(args.key ?? \"\");\n let value: unknown = args.value;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n /* keep as string */\n }\n }\n const hadKey = s.root.has(key);\n s.doc.transact(() => {\n s.root.set(key, this.toYjsValue(Y, value));\n });\n this.recordHistory(handle, \"set\", key);\n this.emitChange?.({ path: key, action: hadKey ? \"edit\" : \"create\", source: \"operation\" });\n return \"OK\";\n }\n\n case \"merge\": {\n let data = args.data;\n if (typeof data === \"string\") data = JSON.parse(data);\n if (typeof data !== \"object\" || data === null) return \"Error: data must be a JSON object\";\n s.doc.transact(() => {\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n s.root.set(key, this.toYjsValue(Y, value));\n }\n });\n for (const key of Object.keys(data as Record<string, unknown>)) {\n this.recordHistory(handle, \"set\", key);\n this.emitChange?.({\n path: key,\n action: s.root.has(key) ? \"edit\" : \"create\",\n source: \"operation\",\n });\n }\n return \"OK\";\n }\n\n case \"del\": {\n const key = String(args.key ?? \"\");\n if (!s.root.has(key)) return \"Not found\";\n s.root.delete(key);\n this.recordHistory(handle, \"delete\", key);\n this.emitChange?.({ path: key, action: \"delete\", source: \"operation\" });\n return \"Deleted\";\n }\n\n default:\n throw new Error(`YjsAdapter has no operation: ${operation}`);\n }\n }\n\n // ── Private helpers ────────────────────────────────────────────────────\n\n private async getY(): Promise<any> {\n const yjsPkg = \"yjs\";\n return import(/* @vite-ignore */ yjsPkg);\n }\n\n /** Convert a JS value to a Yjs-compatible value. */\n private toYjsValue(Y: any, value: unknown): any {\n if (value === null || value === undefined) return value;\n if (typeof value !== \"object\") return value;\n if (Array.isArray(value)) {\n const arr = new Y.Array();\n for (const item of value) arr.push([this.toYjsValue(Y, item)]);\n return arr;\n }\n const map = new Y.Map();\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n map.set(k, this.toYjsValue(Y, v));\n }\n return map;\n }\n\n /** Convert a Yjs value back to plain JS. */\n private fromYjsValue(value: any): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value?.toJSON === \"function\") return value.toJSON();\n return value;\n }\n\n private recordHistory(handle: ConnectorHandle, op: string, key: string): void {\n const s = this.s(handle);\n s.history.push({ op, key, at: new Date().toISOString() });\n if (s.history.length > 500) s.history = s.history.slice(-500);\n }\n}\n\n/**\n * Creates a new YjsAdapter instance.\n * @returns Configured YjsAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#yjs-connector-factory\n */\nexport function createAdapter(): YjsAdapter {\n return new YjsAdapter();\n}\n","/**\n * GmailAdapter — connect to Gmail via Google API OAuth.\n *\n * Auth: oauth:google:<account> — managed by OAuthSecretProvider.\n * Peer dependency: googleapis (lazy-loaded).\n */\n\nimport { resolveAuth, AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\nimport type { OperationDescriptor, SecretProvider } from \"@skaile/workspaces/connectors\";\n\ninterface GmailState {\n account: string;\n accessToken: string;\n gmail: any; // googleapis gmail client\n}\n\n/**\n * Connector adapter for Gmail — provides read and send access to email messages and drafts via the Google API.\n * Authenticates using OAuth2 (managed by OAuthSecretProvider). Requires the `googleapis` optional peer dependency.\n * @docLink packages/base-assets/concepts#gmail-connector\n */\nexport class GmailAdapter extends AbstractConnectorAdapter {\n readonly name = \"gmail\";\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"account\",\n label: \"Gmail Account\",\n description: \"Email address — used to label this connector and scope the OAuth token\",\n type: \"text\",\n required: true,\n sensitive: false,\n group: \"Connection\",\n },\n {\n key: \"auth\",\n label: \"Authentication\",\n description: \"OAuth access token for this Gmail account. Click to authorize.\",\n type: \"oauth\",\n oauthService: \"google\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n ];\n }\n\n describeSkill(\n _handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const account = String(declaration.options?.account ?? \"unknown\");\n return {\n id: declaration.id,\n name: `Gmail — ${account}`,\n description: `Read and write email for ${account}`,\n category: \"email\",\n access: declaration.access,\n toolNames:\n declaration.access === \"read-write\"\n ? [\"list_messages\", \"get_message\", \"send_message\", \"search_messages\", \"create_draft\"]\n : [\"list_messages\", \"get_message\", \"search_messages\"],\n };\n }\n\n async connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const account = resolvedFields?.account ?? String(declaration.options?.account ?? \"\");\n const accessToken = resolvedFields?.auth ?? resolveAuth(declaration.auth, secrets) ?? \"\";\n\n if (!accessToken) {\n this.log.warn(\"OAuth access token missing or refresh failed\", { account });\n throw new Error(`GmailAdapter requires OAuth access token for account \"${account}\"`);\n }\n\n this.log.info(\"connect\", { account });\n const googleapisPkg = \"googleapis\";\n const { google } = (await import(/* @vite-ignore */ googleapisPkg)) as any;\n const auth = new google.auth.OAuth2();\n auth.setCredentials({ access_token: accessToken });\n const gmail = google.gmail({ version: \"v1\", auth });\n\n return this.makeHandle(declaration, { account, accessToken, gmail } as GmailState);\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n }\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"list_messages\",\n description: \"List messages in the inbox or a label\",\n accessLevel: \"read\",\n args: [\n {\n name: \"label\",\n type: \"string\",\n required: false,\n description: \"Label ID (default: INBOX)\",\n },\n {\n name: \"limit\",\n type: \"number\",\n required: false,\n description: \"Max results (default: 20)\",\n },\n ],\n },\n {\n name: \"get_message\",\n description: \"Fetch a full message by ID\",\n accessLevel: \"read\",\n args: [{ name: \"id\", type: \"string\", required: true, description: \"Message ID\" }],\n },\n {\n name: \"search_messages\",\n description: \"Search messages using Gmail query syntax\",\n accessLevel: \"read\",\n args: [\n { name: \"query\", type: \"string\", required: true, description: \"Gmail search query\" },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"send_message\",\n description: \"Send an email\",\n accessLevel: \"write\",\n args: [\n { name: \"to\", type: \"string\", required: true, description: \"Recipient address\" },\n { name: \"subject\", type: \"string\", required: true, description: \"Subject line\" },\n { name: \"body\", type: \"string\", required: true, description: \"Message body\" },\n {\n name: \"html\",\n type: \"boolean\",\n required: false,\n description: \"Set to true if body is HTML\",\n },\n ],\n },\n {\n name: \"create_draft\",\n description: \"Create a draft without sending\",\n accessLevel: \"write\",\n args: [\n { name: \"to\", type: \"string\", required: true, description: \"Recipient address\" },\n { name: \"subject\", type: \"string\", required: true, description: \"Subject line\" },\n { name: \"body\", type: \"string\", required: true, description: \"Message body\" },\n ],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const { gmail, account } = handle.state as GmailState;\n\n switch (operation) {\n case \"list_messages\": {\n const res = await gmail.users.messages.list({\n userId: \"me\",\n labelIds: [String(args.label ?? \"INBOX\")],\n maxResults: Number(args.limit ?? 20),\n });\n return JSON.stringify(res.data.messages ?? [], null, 2);\n }\n case \"get_message\": {\n const res = await gmail.users.messages.get({\n userId: \"me\",\n id: String(args.id),\n format: \"full\",\n });\n return JSON.stringify(res.data, null, 2);\n }\n case \"search_messages\": {\n const res = await gmail.users.messages.list({ userId: \"me\", q: String(args.query) });\n return JSON.stringify(res.data.messages ?? [], null, 2);\n }\n case \"send_message\": {\n const raw = this.buildRawMessage(\n account,\n String(args.to),\n String(args.subject),\n String(args.body),\n Boolean(args.html),\n );\n await gmail.users.messages.send({ userId: \"me\", requestBody: { raw } });\n return \"Message sent.\";\n }\n case \"create_draft\": {\n const raw = this.buildRawMessage(\n account,\n String(args.to),\n String(args.subject),\n String(args.body),\n false,\n );\n const res = await gmail.users.drafts.create({\n userId: \"me\",\n requestBody: { message: { raw } },\n });\n return `Draft created: ${res.data.id}`;\n }\n default:\n throw new Error(`GmailAdapter has no operation \"${operation}\"`);\n }\n }\n\n private buildRawMessage(\n from: string,\n to: string,\n subject: string,\n body: string,\n html: boolean,\n ): string {\n const contentType = html ? \"text/html\" : \"text/plain\";\n const message = [\n `From: ${from}`,\n `To: ${to}`,\n `Subject: ${subject}`,\n `MIME-Version: 1.0`,\n `Content-Type: ${contentType}; charset=utf-8`,\n \"\",\n body,\n ].join(\"\\n\");\n return Buffer.from(message).toString(\"base64url\");\n }\n}\n\n/**\n * Creates a new GmailAdapter instance.\n * @returns Configured GmailAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#gmail-connector-factory\n */\nexport function createAdapter(): GmailAdapter {\n return new GmailAdapter();\n}\n","/**\n * MinIOAdapter — S3-compatible object storage via MinIO.\n *\n * Auth: access-key + secret-key resolved via SecretProviderChain.\n * Peer dependency: minio (lazy-loaded).\n */\n\nimport { resolveAuth, AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n SecretProvider,\n ConnectorContent,\n ConnectorEntry,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface MinIOState {\n client: any; // minio.Client\n bucket: string;\n endpoint: string;\n}\n\n/**\n * Connector adapter for MinIO and S3-compatible object storage.\n * Provides list, get, put, delete, and presign operations against a single bucket. Requires the `minio` optional peer dependency.\n * @docLink packages/base-assets/concepts#minio-connector\n */\nexport class MinIOAdapter extends AbstractConnectorAdapter {\n readonly name = \"minio\";\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"endpoint\",\n label: \"MinIO Endpoint\",\n type: \"url\",\n required: true,\n sensitive: false,\n group: \"Connection\",\n },\n {\n key: \"bucket\",\n label: \"Bucket\",\n type: \"text\",\n required: true,\n sensitive: false,\n group: \"Connection\",\n },\n {\n key: \"region\",\n label: \"Region\",\n type: \"text\",\n required: false,\n sensitive: false,\n group: \"Connection\",\n default: \"us-east-1\",\n },\n {\n key: \"use-ssl\",\n label: \"Use SSL\",\n type: \"boolean\",\n required: false,\n sensitive: false,\n group: \"Connection\",\n default: \"true\",\n },\n {\n key: \"access-key\",\n label: \"Access Key\",\n type: \"api-key\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n {\n key: \"secret-key\",\n label: \"Secret Key\",\n type: \"password\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n ];\n }\n\n describeSkill(\n _handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const endpoint = String(declaration.options?.endpoint ?? \"minio\");\n const bucket = String(declaration.options?.bucket ?? \"unknown\");\n return {\n id: declaration.id,\n name: `MinIO — ${bucket}`,\n description: `Object storage at ${endpoint}, bucket: ${bucket}`,\n category: \"storage\",\n access: declaration.access,\n toolNames: [\"list_objects\", \"get_object\", \"put_object\", \"delete_object\", \"presign\"],\n };\n }\n\n async connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const endpoint = resolvedFields?.endpoint ?? String(declaration.options?.endpoint ?? \"\");\n const bucket = resolvedFields?.bucket ?? String(declaration.options?.bucket ?? \"\");\n const accessKey =\n resolvedFields?.[\"access-key\"] ??\n resolveAuth(declaration.options?.[\"access-key\"] as string, secrets) ??\n \"\";\n const secretKey =\n resolvedFields?.[\"secret-key\"] ??\n resolveAuth(declaration.options?.[\"secret-key\"] as string, secrets) ??\n \"\";\n const useSSL =\n (resolvedFields?.[\"use-ssl\"] ?? declaration.options?.[\"use-ssl\"] ?? \"true\") !== \"false\";\n\n if (!endpoint) throw new Error(\"MinIOAdapter requires an endpoint\");\n if (!bucket) throw new Error(\"MinIOAdapter requires a bucket\");\n if (!accessKey || !secretKey)\n throw new Error(\"MinIOAdapter requires access-key and secret-key\");\n\n this.log.info(\"connect start\", { endpoint, bucket });\n try {\n const minioMod = \"minio\";\n const { Client } = (await import(/* @vite-ignore */ minioMod)) as any;\n const url = new URL(endpoint);\n const client = new Client({\n endPoint: url.hostname,\n port: url.port ? Number(url.port) : useSSL ? 443 : 80,\n useSSL,\n accessKey,\n secretKey,\n });\n\n await client.bucketExists(bucket);\n this.log.info(\"connect ok\", { endpoint, bucket });\n\n return this.makeHandle(declaration, { client, bucket, endpoint } as MinIOState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { endpoint, bucket });\n throw err;\n }\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n }\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"list_objects\",\n description: \"List objects in the bucket\",\n accessLevel: \"read\",\n args: [\n {\n name: \"prefix\",\n type: \"string\",\n required: false,\n description: \"Object key prefix filter\",\n },\n {\n name: \"recursive\",\n type: \"boolean\",\n required: false,\n description: \"List recursively (default: false)\",\n },\n ],\n },\n {\n name: \"get_object\",\n description: \"Download an object and return its content\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Object key\" }],\n },\n {\n name: \"presign\",\n description: \"Generate a pre-signed URL for temporary access\",\n accessLevel: \"read\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Object key\" },\n {\n name: \"expiry\",\n type: \"number\",\n required: false,\n description: \"Expiry in seconds (default: 3600)\",\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"put_object\",\n description: \"Upload content as an object\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Object key\" },\n { name: \"content\", type: \"string\", required: true, description: \"Object content\" },\n {\n name: \"content-type\",\n type: \"string\",\n required: false,\n description: \"MIME type (default: text/plain)\",\n },\n ],\n },\n {\n name: \"delete_object\",\n description: \"Delete an object from the bucket\",\n accessLevel: \"write\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Object key\" }],\n },\n );\n }\n\n return ops;\n }\n\n override async list(handle: ConnectorHandle, path?: string): Promise<ConnectorEntry[]> {\n const { client, bucket } = handle.state as MinIOState;\n const entries: ConnectorEntry[] = [];\n const stream = client.listObjects(bucket, path ?? \"\", false);\n return new Promise((resolve, reject) => {\n stream.on(\"data\", (obj: any) => {\n entries.push({\n name: obj.name,\n path: obj.name,\n type: \"file\",\n size: obj.size,\n modifiedAt: obj.lastModified,\n });\n });\n stream.on(\"end\", () => resolve(entries));\n stream.on(\"error\", reject);\n });\n }\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const { client, bucket } = handle.state as MinIOState;\n const chunks: Buffer[] = [];\n const stream = await client.getObject(bucket, path);\n return new Promise((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stream.on(\"end\", () => resolve({ data: Buffer.concat(chunks).toString() }));\n stream.on(\"error\", reject);\n });\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const { client, bucket } = handle.state as MinIOState;\n\n switch (operation) {\n case \"list_objects\":\n return JSON.stringify(await this.list(handle, String(args.prefix ?? \"\")), null, 2);\n case \"get_object\": {\n const content = await this.read(handle, String(args.key));\n return content?.data?.toString() ?? \"(empty)\";\n }\n case \"put_object\": {\n const content = String(args.content ?? \"\");\n const contentType = String(args[\"content-type\"] ?? \"text/plain\");\n const buf = Buffer.from(content);\n await client.putObject(bucket, String(args.key), buf, buf.length, {\n \"Content-Type\": contentType,\n });\n return \"Object uploaded.\";\n }\n case \"delete_object\": {\n await client.removeObject(bucket, String(args.key));\n return \"Object deleted.\";\n }\n case \"presign\":\n return await client.presignedGetObject(\n bucket,\n String(args.key),\n Number(args.expiry ?? 3600),\n );\n default:\n throw new Error(`MinIOAdapter has no operation \"${operation}\"`);\n }\n }\n}\n\n/**\n * Creates a new MinIOAdapter instance.\n * @returns Configured MinIOAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#minio-connector-factory\n */\nexport function createAdapter(): MinIOAdapter {\n return new MinIOAdapter();\n}\n","/**\n * MattermostAdapter — connect to Mattermost via REST API v4.\n *\n * Auth: env:MM_BOT_TOKEN or inline bot token.\n * No npm peer dependencies — uses native fetch + WebSocket (Bun builtins).\n */\n\nimport { resolveAuth, AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n OperationDescriptor,\n SecretProvider,\n} from \"@skaile/workspaces/connectors\";\n\ninterface MattermostState {\n url: string;\n token: string;\n channelFilter: Set<string>;\n botUserId: string;\n}\n\n/**\n * Connector adapter for Mattermost — reads and posts messages via the REST API v4.\n * No npm peer dependencies; uses native fetch and Bun WebSocket. Authenticates with a bot token.\n * @docLink packages/base-assets/concepts#mattermost-connector\n */\nexport class MattermostAdapter extends AbstractConnectorAdapter {\n readonly name = \"mattermost\";\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"url\",\n label: \"Server URL\",\n description: \"Mattermost server URL (e.g. https://chat.example.com)\",\n type: \"url\",\n required: true,\n sensitive: false,\n group: \"Connection\",\n example: \"https://chat.example.com\",\n },\n {\n key: \"token\",\n label: \"Bot Token\",\n description: \"Bot user access token from Mattermost\",\n type: \"api-key\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n {\n key: \"channels\",\n label: \"Channel Filter\",\n description: \"Comma-separated channel IDs to restrict operations to.\",\n type: \"text\",\n required: false,\n sensitive: false,\n group: \"Options\",\n },\n ];\n }\n\n describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const state = handle.state as MattermostState;\n const channelCount = state.channelFilter.size;\n const scope = channelCount > 0 ? `${channelCount} channel(s)` : \"all channels\";\n return {\n id: declaration.id,\n name: `Mattermost — ${scope}`,\n description: `Read and write messages in Mattermost (${scope})`,\n category: \"messaging\",\n access: declaration.access,\n toolNames:\n declaration.access === \"read-write\"\n ? [\n \"list_channels\",\n \"get_channel\",\n \"list_posts\",\n \"get_thread\",\n \"create_post\",\n \"reply_to_thread\",\n \"update_post\",\n \"search_posts\",\n \"get_user\",\n ]\n : [\n \"list_channels\",\n \"get_channel\",\n \"list_posts\",\n \"get_thread\",\n \"search_posts\",\n \"get_user\",\n ],\n };\n }\n\n async connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const url = (resolvedFields?.url ?? String(declaration.options?.url ?? \"\")).replace(/\\/$/, \"\");\n const token = resolvedFields?.token ?? resolveAuth(declaration.auth, secrets) ?? \"\";\n const channelsRaw = resolvedFields?.channels ?? String(declaration.options?.channels ?? \"\");\n\n if (!url) throw new Error(\"MattermostAdapter requires a server URL\");\n if (!token) throw new Error(\"MattermostAdapter requires a bot token\");\n\n this.log.info(\"connect start\", { url });\n const channelFilter = new Set(\n channelsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n try {\n const me = await this.apiGet(url, token, \"/api/v4/users/me\");\n const botUserId = String((me as Record<string, unknown>).id ?? \"\");\n if (!botUserId) throw new Error(\"MattermostAdapter: failed to authenticate\");\n\n this.log.info(\"connect ok\", { url, botUserId });\n return this.makeHandle(declaration, {\n url,\n token,\n channelFilter,\n botUserId,\n } satisfies MattermostState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { url });\n throw err;\n }\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n }\n\n async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const state = handle.state as MattermostState;\n try {\n const post = await this.apiGet(state.url, state.token, `/api/v4/posts/${path}`);\n return { data: JSON.stringify(post, null, 2), contentType: \"application/json\" };\n } catch {\n return null;\n }\n }\n\n async write(handle: ConnectorHandle, path: string, content: ConnectorContent): Promise<void> {\n if (handle.access === \"read-only\")\n throw new Error(\"MattermostAdapter: write denied — read-only\");\n const state = handle.state as MattermostState;\n const message = typeof content === \"string\" ? content : String(content.data ?? \"\");\n await this.apiPut(state.url, state.token, `/api/v4/posts/${path}`, { id: path, message });\n this.emitChange?.({ path, action: \"edit\", source: \"operation\" });\n }\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"list_channels\",\n description: \"List channels the bot has access to\",\n accessLevel: \"read\",\n args: [\n { name: \"team_id\", type: \"string\", required: false, description: \"Team ID\" },\n {\n name: \"limit\",\n type: \"number\",\n required: false,\n description: \"Max results (default: 50)\",\n },\n ],\n },\n {\n name: \"get_channel\",\n description: \"Get channel details by ID\",\n accessLevel: \"read\",\n args: [{ name: \"channel_id\", type: \"string\", required: true, description: \"Channel ID\" }],\n },\n {\n name: \"list_posts\",\n description: \"List recent posts in a channel\",\n accessLevel: \"read\",\n args: [\n { name: \"channel_id\", type: \"string\", required: true, description: \"Channel ID\" },\n {\n name: \"limit\",\n type: \"number\",\n required: false,\n description: \"Max results (default: 30)\",\n },\n {\n name: \"before\",\n type: \"string\",\n required: false,\n description: \"Post ID to paginate before\",\n },\n ],\n },\n {\n name: \"get_thread\",\n description: \"Get all posts in a thread\",\n accessLevel: \"read\",\n args: [{ name: \"post_id\", type: \"string\", required: true, description: \"Root post ID\" }],\n },\n {\n name: \"search_posts\",\n description: \"Search posts across channels\",\n accessLevel: \"read\",\n args: [\n { name: \"terms\", type: \"string\", required: true, description: \"Search terms\" },\n { name: \"team_id\", type: \"string\", required: false, description: \"Scope to a team\" },\n ],\n },\n {\n name: \"get_user\",\n description: \"Get user details by ID\",\n accessLevel: \"read\",\n args: [{ name: \"user_id\", type: \"string\", required: true, description: \"User ID\" }],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"create_post\",\n description: \"Post a new message\",\n accessLevel: \"write\",\n args: [\n { name: \"channel_id\", type: \"string\", required: true, description: \"Channel ID\" },\n { name: \"message\", type: \"string\", required: true, description: \"Message content\" },\n ],\n },\n {\n name: \"reply_to_thread\",\n description: \"Reply to a thread\",\n accessLevel: \"write\",\n args: [\n { name: \"channel_id\", type: \"string\", required: true, description: \"Channel ID\" },\n { name: \"root_id\", type: \"string\", required: true, description: \"Root post ID\" },\n { name: \"message\", type: \"string\", required: true, description: \"Reply content\" },\n ],\n },\n {\n name: \"update_post\",\n description: \"Edit an existing post\",\n accessLevel: \"write\",\n args: [\n { name: \"post_id\", type: \"string\", required: true, description: \"Post ID\" },\n { name: \"message\", type: \"string\", required: true, description: \"Updated content\" },\n ],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as MattermostState;\n\n switch (operation) {\n case \"list_channels\": {\n const teamId = args.team_id ? String(args.team_id) : undefined;\n const limit = Number(args.limit ?? 50);\n const endpoint = teamId\n ? `/api/v4/users/me/teams/${teamId}/channels?per_page=${limit}`\n : `/api/v4/users/me/channels?per_page=${limit}`;\n const channels = await this.apiGet(state.url, state.token, endpoint);\n return JSON.stringify(\n this.filterChannels(channels as unknown[], state.channelFilter),\n null,\n 2,\n );\n }\n case \"get_channel\": {\n this.assertChannelAccess(String(args.channel_id), state.channelFilter);\n return JSON.stringify(\n await this.apiGet(state.url, state.token, `/api/v4/channels/${args.channel_id}`),\n null,\n 2,\n );\n }\n case \"list_posts\": {\n const cid = String(args.channel_id);\n this.assertChannelAccess(cid, state.channelFilter);\n const limit = Number(args.limit ?? 30);\n const before = args.before ? `&before=${args.before}` : \"\";\n return JSON.stringify(\n await this.apiGet(\n state.url,\n state.token,\n `/api/v4/channels/${cid}/posts?per_page=${limit}${before}`,\n ),\n null,\n 2,\n );\n }\n case \"get_thread\":\n return JSON.stringify(\n await this.apiGet(state.url, state.token, `/api/v4/posts/${args.post_id}/thread`),\n null,\n 2,\n );\n case \"search_posts\": {\n const body: Record<string, unknown> = { terms: String(args.terms), is_or_search: false };\n if (args.team_id) body.team_id = String(args.team_id);\n return JSON.stringify(\n await this.apiPost(state.url, state.token, \"/api/v4/posts/search\", body),\n null,\n 2,\n );\n }\n case \"get_user\":\n return JSON.stringify(\n await this.apiGet(state.url, state.token, `/api/v4/users/${args.user_id}`),\n null,\n 2,\n );\n case \"create_post\": {\n this.assertWriteAccess(handle);\n const cid = String(args.channel_id);\n this.assertChannelAccess(cid, state.channelFilter);\n const post = await this.apiPost(state.url, state.token, \"/api/v4/posts\", {\n channel_id: cid,\n message: String(args.message),\n });\n const postId = String((post as Record<string, unknown>).id ?? \"\");\n this.emitChange?.({\n path: `channels/${cid}/posts/${postId}`,\n action: \"create\",\n source: \"operation\",\n });\n return JSON.stringify(post, null, 2);\n }\n case \"reply_to_thread\": {\n this.assertWriteAccess(handle);\n const cid = String(args.channel_id);\n this.assertChannelAccess(cid, state.channelFilter);\n const post = await this.apiPost(state.url, state.token, \"/api/v4/posts\", {\n channel_id: cid,\n root_id: String(args.root_id),\n message: String(args.message),\n });\n const postId = String((post as Record<string, unknown>).id ?? \"\");\n this.emitChange?.({\n path: `channels/${cid}/posts/${postId}`,\n action: \"create\",\n source: \"operation\",\n });\n return JSON.stringify(post, null, 2);\n }\n case \"update_post\": {\n this.assertWriteAccess(handle);\n const pid = String(args.post_id);\n const updated = await this.apiPut(state.url, state.token, `/api/v4/posts/${pid}`, {\n id: pid,\n message: String(args.message),\n });\n this.emitChange?.({ path: `posts/${pid}`, action: \"edit\", source: \"operation\" });\n return JSON.stringify(updated, null, 2);\n }\n default:\n throw new Error(`MattermostAdapter has no operation \"${operation}\"`);\n }\n }\n\n private assertWriteAccess(handle: ConnectorHandle): void {\n if (handle.access === \"read-only\")\n throw new Error(\"MattermostAdapter: operation denied — read-only\");\n }\n\n private assertChannelAccess(channelId: string, filter: Set<string>): void {\n if (filter.size > 0 && !filter.has(channelId))\n throw new Error(`MattermostAdapter: channel \"${channelId}\" not in filter`);\n }\n\n private filterChannels(channels: unknown[], filter: Set<string>): unknown[] {\n if (filter.size === 0) return channels;\n return channels.filter((ch) => {\n const id = (ch as Record<string, unknown>).id;\n return typeof id === \"string\" && filter.has(id);\n });\n }\n\n private async apiGet(baseUrl: string, token: string, path: string): Promise<unknown> {\n const res = await fetch(baseUrl + path, { headers: { Authorization: `Bearer ${token}` } });\n if (!res.ok) {\n const body = await res.text();\n this.log.warn(\"REST error\", { method: \"GET\", endpoint: path, status: res.status });\n throw new Error(`Mattermost GET ${path}: ${res.status} ${body}`);\n }\n return res.json();\n }\n\n private async apiPost(\n baseUrl: string,\n token: string,\n path: string,\n body: unknown,\n ): Promise<unknown> {\n const res = await fetch(baseUrl + path, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${token}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Mattermost POST ${path}: ${res.status} ${await res.text()}`);\n return res.json();\n }\n\n private async apiPut(\n baseUrl: string,\n token: string,\n path: string,\n body: unknown,\n ): Promise<unknown> {\n const res = await fetch(baseUrl + path, {\n method: \"PUT\",\n headers: { Authorization: `Bearer ${token}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`Mattermost PUT ${path}: ${res.status} ${await res.text()}`);\n return res.json();\n }\n}\n\n/**\n * Creates a new MattermostAdapter instance.\n * @returns Configured MattermostAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#mattermost-connector-factory\n */\nexport function createAdapter(): MattermostAdapter {\n return new MattermostAdapter();\n}\n","/**\n * DevServerAdapter — process management service connector.\n *\n * Manages dev server processes (Vite, Nuxt, Next, etc.) with port allocation,\n * health checks, log capture, and optional git worktree isolation.\n *\n * Category: service\n */\n\nimport {\n AbstractConnectorAdapter,\n LogBuffer,\n PortPool,\n createWorktree,\n findGitRoot,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\n// ── Internal types ───────────────────────────────────────────────────────────\n\ninterface ServiceInstance {\n id: string;\n pid: number;\n port: number;\n cwd: string;\n status: \"starting\" | \"healthy\" | \"unhealthy\" | \"stopped\" | \"crashed\";\n startedAt: string;\n command?: string;\n env?: Record<string, string>;\n ref?: string;\n worktreePath?: string;\n worktreeCleanup?: () => Promise<void>;\n healthEndpoint?: string;\n managed: boolean;\n restartable: boolean;\n process?: { pid: number; kill(signal?: number): void; exited: Promise<number> };\n logBuffer?: LogBuffer;\n}\n\ninterface DevServerState {\n instances: Map<string, ServiceInstance>;\n pool: PortPool;\n repoRoot: string | null;\n worktreeDir: string;\n logBufferSize: number;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function pipeToBuffer(stream: ReadableStream<Uint8Array>, buf: LogBuffer): Promise<void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf.pushLines(decoder.decode(value));\n }\n } catch {\n /* stream closed */\n }\n}\n\nlet idCounter = 0;\n\n// ── Adapter ──────────────────────────────────────────────────────────────────\n\n/**\n * Connector adapter for managing dev server processes — spawns, tracks, and stops processes with port allocation, health checks, and log capture.\n * Supports optional git worktree isolation for per-instance code snapshots.\n * @docLink packages/base-assets/concepts#devserver-connector\n */\nexport class DevServerAdapter extends AbstractConnectorAdapter {\n readonly name = \"devserver\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const opts = declaration.options ?? {};\n const portRange = (opts.port_range as [number, number]) ?? [3000, 3099];\n let repoRoot: string | null = null;\n try {\n repoRoot = findGitRoot(process.cwd());\n } catch {}\n\n const state: DevServerState = {\n instances: new Map(),\n pool: new PortPool(portRange),\n repoRoot,\n worktreeDir: String(opts.worktree_dir ?? \".skaile/worktrees\"),\n logBufferSize: Number(opts.log_buffer_size ?? 500),\n };\n\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n await this._stopAll(handle);\n handle.connected = false;\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._stopAll(handle);\n return undefined;\n }\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n const state = handle.state as DevServerState;\n await this._stopAll(handle);\n return `Stopped ${state.instances.size} dev server instances for hibernation`;\n }\n\n private async _stopAll(handle: ConnectorHandle): Promise<void> {\n const state = handle.state as DevServerState;\n for (const [id, inst] of [...state.instances.entries()]) {\n if (inst.managed && inst.process) await this._killProcess(inst, state);\n state.instances.delete(id);\n }\n }\n\n private async _killProcess(inst: ServiceInstance, state: DevServerState): Promise<void> {\n if (!inst.process) return;\n try {\n inst.process.kill(15);\n } catch {}\n const exited = await Promise.race([\n inst.process.exited.then(() => true),\n new Promise<false>((r) => setTimeout(() => r(false), 5000)),\n ]);\n if (!exited) {\n try {\n inst.process.kill(9);\n } catch {}\n }\n inst.status = \"stopped\";\n state.pool.release(inst.port);\n if (inst.worktreeCleanup) {\n try {\n await inst.worktreeCleanup();\n } catch {}\n }\n }\n\n describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"start\",\n description: \"Spawn a dev server process.\",\n accessLevel: \"write\",\n args: [\n { name: \"command\", type: \"string\", required: true, description: \"Shell command to run\" },\n { name: \"cwd\", type: \"string\", required: false, description: \"Working directory\" },\n {\n name: \"ref\",\n type: \"string\",\n required: false,\n description: \"Git ref for worktree isolation\",\n },\n { name: \"port\", type: \"number\", required: false, description: \"Explicit port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Instance label\" },\n {\n name: \"env\",\n type: \"json\",\n required: false,\n description: \"Additional environment variables\",\n },\n {\n name: \"health_endpoint\",\n type: \"string\",\n required: false,\n description: \"Health check URL\",\n },\n ],\n examples: ['start --command \"bun run dev\" --label \"frontend\"'],\n },\n {\n name: \"register\",\n description: \"Track an externally started process.\",\n accessLevel: \"write\",\n args: [\n { name: \"pid\", type: \"number\", required: true, description: \"Process ID\" },\n { name: \"port\", type: \"number\", required: true, description: \"Port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Instance label\" },\n { name: \"cwd\", type: \"string\", required: false, description: \"Working directory\" },\n {\n name: \"health_endpoint\",\n type: \"string\",\n required: false,\n description: \"Health check URL\",\n },\n ],\n },\n {\n name: \"stop\",\n description: \"Stop a dev server instance.\",\n accessLevel: \"write\",\n args: [{ name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" }],\n },\n {\n name: \"restart\",\n description: \"Restart a managed instance.\",\n accessLevel: \"write\",\n args: [{ name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" }],\n },\n {\n name: \"status\",\n description: \"Check instance health.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"instance\",\n type: \"string\",\n required: false,\n description: \"Instance ID (omit for all)\",\n },\n ],\n },\n {\n name: \"logs\",\n description: \"Get recent stdout/stderr.\",\n accessLevel: \"read\",\n args: [\n { name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" },\n {\n name: \"lines\",\n type: \"number\",\n required: false,\n description: \"Number of lines (default: 50)\",\n },\n ],\n },\n {\n name: \"list_instances\",\n description: \"List all tracked instances.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"free_port\",\n description: \"Allocate a port from the pool.\",\n accessLevel: \"read\",\n args: [],\n },\n ];\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as DevServerState;\n if (\n [\"start\", \"register\", \"stop\", \"restart\"].includes(operation) &&\n handle.access === \"read-only\"\n ) {\n throw new Error(`DevServerAdapter: \"${operation}\" requires read-write access`);\n }\n\n switch (operation) {\n case \"start\":\n return this._opStart(handle, state, args);\n case \"register\":\n return this._opRegister(state, args);\n case \"stop\":\n return this._opStop(state, args);\n case \"restart\":\n return this._opRestart(handle, state, args);\n case \"status\":\n return this._opStatus(state, args);\n case \"logs\":\n return this._opLogs(state, args);\n case \"list_instances\":\n return this._opListInstances(state);\n case \"free_port\":\n return this._opFreePort(state);\n default:\n throw new Error(`DevServerAdapter: unknown operation \"${operation}\"`);\n }\n }\n\n private async _opStart(\n handle: ConnectorHandle,\n state: DevServerState,\n args: Record<string, unknown>,\n ): Promise<string> {\n const command = args.command ? String(args.command) : undefined;\n if (!command) throw new Error(\"start requires a command argument\");\n let cwd = args.cwd ? String(args.cwd) : process.cwd();\n const ref = args.ref ? String(args.ref) : undefined;\n const label = args.label ? String(args.label) : `srv-${++idCounter}`;\n const userEnv = (args.env as Record<string, string>) ?? {};\n const healthEndpoint = args.health_endpoint ? String(args.health_endpoint) : undefined;\n\n let worktreePath: string | undefined;\n let worktreeCleanup: (() => Promise<void>) | undefined;\n if (ref) {\n if (!state.repoRoot) throw new Error(\"start with ref requires a git repository\");\n const wt = await createWorktree({\n repoRoot: state.repoRoot,\n ref,\n baseDir: state.worktreeDir,\n label,\n owner: handle.id,\n });\n cwd = wt.path;\n worktreePath = wt.path;\n worktreeCleanup = wt.cleanup;\n }\n\n let port: number;\n if (args.port !== undefined && args.port !== null) {\n port = Number(args.port);\n if (!(await PortPool.isPortFree(port))) throw new Error(`Port ${port} is already in use`);\n state.pool.reserve(port);\n } else {\n port = await state.pool.allocate();\n }\n\n const resolvedHealth = healthEndpoint\n ? healthEndpoint.replace(/\\bPORT\\b/g, String(port))\n : `http://localhost:${port}/`;\n this.log.info(\"spawn dev server\", { label, command, cwd, port });\n const proc = Bun.spawn([\"sh\", \"-c\", command], {\n cwd,\n env: { ...process.env, ...userEnv, PORT: String(port) },\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const logBuffer = new LogBuffer(state.logBufferSize);\n pipeToBuffer(proc.stdout as ReadableStream<Uint8Array>, logBuffer);\n pipeToBuffer(proc.stderr as ReadableStream<Uint8Array>, logBuffer);\n\n const instance: ServiceInstance = {\n id: label,\n pid: proc.pid,\n port,\n cwd,\n status: \"starting\",\n startedAt: new Date().toISOString(),\n command,\n env: userEnv,\n ref,\n worktreePath,\n worktreeCleanup,\n healthEndpoint: resolvedHealth,\n managed: true,\n restartable: true,\n process: proc,\n logBuffer,\n };\n state.instances.set(label, instance);\n proc.exited.then((code: number | null) => {\n this.log.info(\"dev server exited\", { label, exitCode: code });\n if (instance.status !== \"stopped\") {\n instance.status = code === 0 ? \"stopped\" : \"crashed\";\n if (code !== 0 && code !== null) {\n this.log.warn(\"dev server crashed\", { label, exitCode: code });\n }\n this.emitChange?.({\n path: `instance/${instance.id}`,\n action: \"delete\",\n source: \"operation\",\n });\n }\n });\n\n return JSON.stringify({ instance_id: label, pid: proc.pid, port, cwd });\n }\n\n private async _opRegister(state: DevServerState, args: Record<string, unknown>): Promise<string> {\n const pid = Number(args.pid);\n const port = Number(args.port);\n if (!pid || Number.isNaN(pid)) throw new Error(\"register requires a valid pid\");\n if (!port || Number.isNaN(port)) throw new Error(\"register requires a valid port\");\n if (!isPidAlive(pid)) throw new Error(`PID ${pid} is not alive`);\n if (await PortPool.isPortFree(port)) throw new Error(`Port ${port} is not bound`);\n\n const label = args.label ? String(args.label) : `ext-${pid}`;\n state.pool.reserve(port);\n state.instances.set(label, {\n id: label,\n pid,\n port,\n cwd: args.cwd ? String(args.cwd) : process.cwd(),\n status: \"healthy\",\n startedAt: new Date().toISOString(),\n healthEndpoint: args.health_endpoint\n ? String(args.health_endpoint)\n : `http://localhost:${port}/`,\n managed: false,\n restartable: false,\n });\n return JSON.stringify({ instance_id: label });\n }\n\n private async _opStop(state: DevServerState, args: Record<string, unknown>): Promise<string> {\n const id = String(args.instance ?? \"\");\n const inst = state.instances.get(id);\n if (!inst) throw new Error(`Instance \"${id}\" not found`);\n if (inst.managed && inst.process) await this._killProcess(inst, state);\n else state.pool.release(inst.port);\n state.instances.delete(id);\n this.emitChange?.({ path: `instance/${id}`, action: \"delete\", source: \"operation\" });\n return JSON.stringify({ stopped: true });\n }\n\n private async _opRestart(\n handle: ConnectorHandle,\n state: DevServerState,\n args: Record<string, unknown>,\n ): Promise<string> {\n const id = String(args.instance ?? \"\");\n const inst = state.instances.get(id);\n if (!inst) throw new Error(`Instance \"${id}\" not found`);\n if (!inst.managed || !inst.restartable) throw new Error(`Instance \"${id}\" is not restartable`);\n const { command, cwd, env, port, healthEndpoint } = inst;\n if (inst.process) await this._killProcess(inst, state);\n state.instances.delete(id);\n state.pool.reserve(port);\n return this._opStart(handle, state, {\n command,\n cwd,\n env,\n port,\n label: id,\n health_endpoint: healthEndpoint,\n });\n }\n\n private async _opStatus(state: DevServerState, args: Record<string, unknown>): Promise<string> {\n if (args.instance) {\n const inst = state.instances.get(String(args.instance));\n if (!inst) throw new Error(`Instance \"${args.instance}\" not found`);\n await this._refreshStatus(inst);\n return JSON.stringify(instanceToStatus(inst));\n }\n for (const inst of state.instances.values()) await this._refreshStatus(inst);\n return JSON.stringify([...state.instances.values()].map(instanceToStatus));\n }\n\n private async _refreshStatus(inst: ServiceInstance): Promise<void> {\n if (inst.status === \"stopped\") return;\n if (!isPidAlive(inst.pid)) {\n inst.status = \"crashed\";\n return;\n }\n if (inst.healthEndpoint) {\n try {\n const res = await fetch(inst.healthEndpoint, { signal: AbortSignal.timeout(3000) });\n inst.status = res.ok ? \"healthy\" : \"unhealthy\";\n } catch {\n inst.status = \"unhealthy\";\n }\n } else {\n inst.status = \"healthy\";\n }\n }\n\n private _opLogs(state: DevServerState, args: Record<string, unknown>): string {\n const inst = state.instances.get(String(args.instance ?? \"\"));\n if (!inst) throw new Error(`Instance \"${args.instance}\" not found`);\n if (!inst.managed) throw new Error(`Cannot retrieve logs for non-managed instance`);\n return inst.logBuffer!.tail(args.lines ? Number(args.lines) : 50).join(\"\\n\");\n }\n\n private _opListInstances(state: DevServerState): string {\n return JSON.stringify(\n [...state.instances.values()].map((i) => ({\n id: i.id,\n pid: i.pid,\n port: i.port,\n status: i.status,\n ref: i.ref,\n managed: i.managed,\n started_at: i.startedAt,\n cwd: i.cwd,\n })),\n );\n }\n\n private async _opFreePort(state: DevServerState): Promise<string> {\n return JSON.stringify({ port: await state.pool.allocate() });\n }\n\n describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n return {\n id: declaration.id,\n name: `Dev Server — ${declaration.id}`,\n description:\n \"Manage dev server processes with port allocation, health checks, and log capture.\",\n category: \"service\",\n access: declaration.access,\n toolNames: this.describeOperations(handle).map((o) => o.name),\n };\n }\n}\n\nfunction instanceToStatus(inst: ServiceInstance) {\n return {\n id: inst.id,\n pid: inst.pid,\n port: inst.port,\n status: inst.status,\n managed: inst.managed,\n restartable: inst.restartable,\n ref: inst.ref,\n cwd: inst.cwd,\n started_at: inst.startedAt,\n health_endpoint: inst.healthEndpoint,\n uptime_ms: Date.now() - new Date(inst.startedAt).getTime(),\n };\n}\n\n/**\n * Creates a new DevServerAdapter instance.\n * @returns Configured DevServerAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#devserver-connector-factory\n */\nexport function createAdapter(): DevServerAdapter {\n return new DevServerAdapter();\n}\n","/**\n * StaticServerAdapter — serve a directory of static files over HTTP via Bun.\n * Category: service\n */\n\nimport { join } from \"node:path\";\nimport {\n AbstractConnectorAdapter,\n PortPool,\n createWorktree,\n findGitRoot,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface StaticInstance {\n id: string;\n port: number;\n dir: string;\n server: ReturnType<typeof Bun.serve>;\n ref?: string;\n worktreePath?: string;\n worktreeCleanup?: () => Promise<void>;\n startedAt: string;\n status: \"healthy\" | \"stopped\";\n}\n\ninterface StaticServerState {\n instances: Map<string, StaticInstance>;\n pool: PortPool;\n repoRoot: string | null;\n worktreeDir: string;\n}\n\nconst DEFAULT_PORT_RANGE: [number, number] = [14000, 14099];\nconst DEFAULT_WORKTREE_DIR = \"/tmp/skaile-static-worktrees\";\n\n/**\n * Connector adapter for serving static file directories over HTTP using Bun's built-in server.\n * Supports multiple concurrent instances, port allocation, and optional git worktree isolation.\n * @docLink packages/base-assets/concepts#static-server-connector\n */\nexport class StaticServerAdapter extends AbstractConnectorAdapter {\n readonly name = \"static\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const range = (declaration.options?.port_range as [number, number]) ?? DEFAULT_PORT_RANGE;\n const worktreeDir = String(declaration.options?.worktree_dir ?? DEFAULT_WORKTREE_DIR);\n let repoRoot: string | null = null;\n try {\n repoRoot = findGitRoot(process.cwd());\n } catch {}\n\n return this.makeHandle(declaration, {\n instances: new Map(),\n pool: new PortPool(range),\n repoRoot,\n worktreeDir,\n } as StaticServerState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n await this._stopAll(handle);\n handle.connected = false;\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._stopAll(handle);\n return undefined;\n }\n\n private async _stopAll(handle: ConnectorHandle): Promise<void> {\n const state = handle.state as StaticServerState;\n for (const [, instance] of state.instances) {\n instance.server.stop(true);\n instance.status = \"stopped\";\n if (instance.worktreeCleanup) {\n try {\n await instance.worktreeCleanup();\n } catch {}\n }\n state.pool.release(instance.port);\n }\n state.instances.clear();\n }\n\n describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"serve\",\n description: \"Serve a directory of static files over HTTP.\",\n accessLevel: \"write\",\n args: [\n { name: \"dir\", type: \"string\", required: true, description: \"Directory to serve\" },\n { name: \"port\", type: \"number\", required: false, description: \"Explicit port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Instance label\" },\n { name: \"ref\", type: \"string\", required: false, description: \"Git ref for worktree\" },\n ],\n },\n {\n name: \"stop\",\n description: \"Stop a static server.\",\n accessLevel: \"write\",\n args: [{ name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" }],\n },\n {\n name: \"status\",\n description: \"Get instance status.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"instance\",\n type: \"string\",\n required: false,\n description: \"Instance ID (omit for all)\",\n },\n ],\n },\n {\n name: \"list_instances\",\n description: \"List all active instances.\",\n accessLevel: \"read\",\n args: [],\n },\n { name: \"free_port\", description: \"Reserve a free port.\", accessLevel: \"read\", args: [] },\n ];\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as StaticServerState;\n if ((operation === \"serve\" || operation === \"stop\") && handle.access === \"read-only\") {\n throw new Error(`StaticServerAdapter: \"${operation}\" requires read-write access`);\n }\n\n switch (operation) {\n case \"serve\": {\n let dir = args.dir ? String(args.dir) : \"\";\n if (!dir && !args.ref) throw new Error(\"serve requires a dir or ref\");\n const label = args.label ? String(args.label) : `static-${Date.now()}`;\n const port = args.port ? Number(args.port) : await state.pool.allocate();\n if (args.port) state.pool.reserve(port);\n\n let worktreePath: string | undefined;\n let worktreeCleanup: (() => Promise<void>) | undefined;\n let ref: string | undefined;\n\n if (args.ref) {\n if (!state.repoRoot) throw new Error(\"ref-based serving requires a git repository\");\n ref = String(args.ref);\n const wt = await createWorktree({\n repoRoot: state.repoRoot,\n ref,\n baseDir: state.worktreeDir,\n label,\n owner: `static:${label}`,\n });\n worktreePath = wt.path;\n worktreeCleanup = wt.cleanup;\n dir = dir ? join(wt.path, dir) : wt.path;\n }\n\n const serveDir = dir;\n const server = Bun.serve({\n port,\n fetch(req) {\n const url = new URL(req.url);\n let filePath = join(serveDir, url.pathname);\n if (filePath.endsWith(\"/\")) filePath = join(filePath, \"index.html\");\n return new Response(Bun.file(filePath));\n },\n });\n\n state.instances.set(label, {\n id: label,\n port,\n dir: serveDir,\n server,\n ref,\n worktreePath,\n worktreeCleanup,\n startedAt: new Date().toISOString(),\n status: \"healthy\",\n });\n this.emitChange?.({ path: label, action: \"create\", source: \"operation\" });\n return JSON.stringify({ instance_id: label, port, url: `http://localhost:${port}` });\n }\n\n case \"stop\": {\n const id = String(args.instance ?? \"\");\n const instance = state.instances.get(id);\n if (!instance) throw new Error(`Instance \"${id}\" not found`);\n instance.server.stop(true);\n instance.status = \"stopped\";\n state.pool.release(instance.port);\n if (instance.worktreeCleanup) {\n try {\n await instance.worktreeCleanup();\n } catch {}\n }\n state.instances.delete(id);\n this.emitChange?.({ path: id, action: \"delete\", source: \"operation\" });\n return JSON.stringify({ stopped: true });\n }\n\n case \"status\": {\n if (args.instance) {\n const inst = state.instances.get(String(args.instance));\n if (!inst) throw new Error(`Instance \"${args.instance}\" not found`);\n return JSON.stringify(instanceToStatus(inst));\n }\n return JSON.stringify([...state.instances.values()].map(instanceToStatus));\n }\n\n case \"list_instances\":\n return JSON.stringify(\n [...state.instances.values()].map((i) => ({\n id: i.id,\n port: i.port,\n dir: i.dir,\n url: `http://localhost:${i.port}`,\n ref: i.ref,\n status: i.status,\n started_at: i.startedAt,\n })),\n );\n\n case \"free_port\":\n return JSON.stringify({ port: await state.pool.allocate() });\n\n default:\n throw new Error(`StaticServerAdapter: unknown operation \"${operation}\"`);\n }\n }\n\n describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n return {\n id: declaration.id,\n name: \"Static File Server\",\n description: \"Serve directories of static files over HTTP using Bun.\",\n category: \"service\",\n access: handle.access,\n toolNames: this.describeOperations(handle).map((o) => o.name),\n };\n }\n}\n\nfunction instanceToStatus(instance: StaticInstance) {\n return {\n id: instance.id,\n port: instance.port,\n dir: instance.dir,\n url: `http://localhost:${instance.port}`,\n ref: instance.ref,\n status: instance.status,\n started_at: instance.startedAt,\n uptime_ms: Date.now() - new Date(instance.startedAt).getTime(),\n };\n}\n\n/**\n * Creates a new StaticServerAdapter instance.\n * @returns Configured StaticServerAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#static-server-connector-factory\n */\nexport function createAdapter(): StaticServerAdapter {\n return new StaticServerAdapter();\n}\n","/**\n * TunnelAdapter — expose local ports to the internet via cloudflare/ngrok/mock.\n * Category: service\n */\n\nimport { AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface TunnelInstance {\n id: string;\n port: number;\n publicUrl: string;\n process?: { kill(): void };\n startedAt: string;\n status: \"connected\" | \"disconnected\";\n}\n\ninterface TunnelState {\n provider: string;\n tunnels: Map<string, TunnelInstance>;\n}\n\n/**\n * Connector adapter for exposing local ports to the internet via Cloudflare Tunnel or ngrok.\n * Manages tunnel lifecycle (expose, close, status) and supports a mock provider for testing.\n * @docLink packages/base-assets/concepts#tunnel-connector\n */\nexport class TunnelAdapter extends AbstractConnectorAdapter {\n readonly name = \"tunnel\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const provider = String(declaration.options?.provider ?? \"cloudflare\");\n this.log.info(\"connect\", { id: declaration.id, provider });\n if (provider !== \"mock\") {\n const cli = provider === \"cloudflare\" ? \"cloudflared\" : \"ngrok\";\n const found = await checkCliExists(cli);\n if (!found) {\n this.log.error(\"connect failed: CLI not found\", undefined, { cli });\n throw new Error(`TunnelAdapter: \"${cli}\" not found on PATH.`);\n }\n }\n return this.makeHandle(declaration, { provider, tunnels: new Map() } as TunnelState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n await this._closeAll(handle);\n handle.connected = false;\n }\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._closeAll(handle);\n return undefined;\n }\n\n private async _closeAll(handle: ConnectorHandle): Promise<void> {\n const state = handle.state as TunnelState;\n for (const [id, tunnel] of state.tunnels) {\n tunnel.process?.kill();\n tunnel.status = \"disconnected\";\n this.emitChange?.({ path: id, action: \"delete\", source: \"operation\" });\n }\n state.tunnels.clear();\n }\n\n describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"expose\",\n description: \"Create a tunnel to a local port.\",\n accessLevel: \"write\",\n args: [\n { name: \"port\", type: \"number\", required: true, description: \"Local port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Tunnel label\" },\n {\n name: \"subdomain\",\n type: \"string\",\n required: false,\n description: \"Requested subdomain\",\n },\n ],\n },\n {\n name: \"close\",\n description: \"Tear down a tunnel.\",\n accessLevel: \"write\",\n args: [{ name: \"tunnel\", type: \"string\", required: true, description: \"Tunnel ID\" }],\n },\n {\n name: \"status\",\n description: \"Get tunnel status.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"tunnel\",\n type: \"string\",\n required: false,\n description: \"Tunnel ID (omit for all)\",\n },\n ],\n },\n { name: \"list\", description: \"List all active tunnels.\", accessLevel: \"read\", args: [] },\n ];\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as TunnelState;\n if ((operation === \"expose\" || operation === \"close\") && handle.access === \"read-only\") {\n throw new Error(`TunnelAdapter: \"${operation}\" requires read-write access`);\n }\n\n switch (operation) {\n case \"expose\": {\n const port = Number(args.port);\n if (!port || Number.isNaN(port)) throw new Error(\"expose requires a valid port\");\n const label = args.label ? String(args.label) : String(port);\n let publicUrl: string;\n let proc: TunnelInstance[\"process\"] | undefined;\n if (state.provider === \"mock\") {\n publicUrl = `http://mock-tunnel-${label}.localhost`;\n } else if (state.provider === \"cloudflare\") {\n const result = await spawnCloudflaredTunnel(port);\n publicUrl = result.url;\n proc = result.process;\n } else if (state.provider === \"ngrok\") {\n const result = await spawnNgrokTunnel(port);\n publicUrl = result.url;\n proc = result.process;\n } else throw new Error(`Unknown provider \"${state.provider}\"`);\n const tunnel: TunnelInstance = {\n id: label,\n port,\n publicUrl,\n process: proc,\n startedAt: new Date().toISOString(),\n status: \"connected\",\n };\n state.tunnels.set(label, tunnel);\n this.log.info(\"tunnel exposed\", { label, port, publicUrl });\n this.emitChange?.({ path: label, action: \"create\", source: \"operation\" });\n return JSON.stringify({ tunnel_id: label, public_url: publicUrl });\n }\n case \"close\": {\n const id = String(args.tunnel ?? \"\");\n const tunnel = state.tunnels.get(id);\n if (!tunnel) throw new Error(`Tunnel \"${id}\" not found`);\n tunnel.process?.kill();\n tunnel.status = \"disconnected\";\n state.tunnels.delete(id);\n this.emitChange?.({ path: id, action: \"delete\", source: \"operation\" });\n return JSON.stringify({ closed: true });\n }\n case \"status\": {\n if (args.tunnel) {\n const t = state.tunnels.get(String(args.tunnel));\n if (!t) throw new Error(`Tunnel \"${args.tunnel}\" not found`);\n return JSON.stringify(tunnelToStatus(t));\n }\n return JSON.stringify([...state.tunnels.values()].map(tunnelToStatus));\n }\n case \"list\":\n return JSON.stringify(\n [...state.tunnels.values()].map((t) => ({\n id: t.id,\n port: t.port,\n public_url: t.publicUrl,\n status: t.status,\n started_at: t.startedAt,\n })),\n );\n default:\n throw new Error(`TunnelAdapter: unknown operation \"${operation}\"`);\n }\n }\n\n describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const state = handle.state as TunnelState;\n return {\n id: declaration.id,\n name: `Tunnel — ${state.provider}`,\n description: `Expose local ports to the internet via ${state.provider}.`,\n category: \"service\",\n access: handle.access,\n toolNames: this.describeOperations(handle).map((o) => o.name),\n };\n }\n}\n\nfunction tunnelToStatus(t: TunnelInstance) {\n return {\n id: t.id,\n port: t.port,\n public_url: t.publicUrl,\n status: t.status,\n started_at: t.startedAt,\n uptime_ms: Date.now() - new Date(t.startedAt).getTime(),\n };\n}\n\nasync function checkCliExists(cli: string): Promise<boolean> {\n try {\n const proc = Bun.spawn([\"which\", cli], { stdout: \"pipe\", stderr: \"pipe\" });\n return (await proc.exited) === 0;\n } catch {\n return false;\n }\n}\n\nasync function spawnCloudflaredTunnel(\n port: number,\n): Promise<{ url: string; process: { kill(): void } }> {\n return new Promise((resolve, reject) => {\n const proc = Bun.spawn([\"cloudflared\", \"tunnel\", \"--url\", `http://localhost:${port}`], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const decoder = new TextDecoder();\n const reader = proc.stderr.getReader();\n const readLoop = async () => {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const chunk = decoder.decode(value);\n const match = chunk.match(/https:\\/\\/[^\\s\"]+\\.trycloudflare\\.com/);\n if (match) {\n resolve({ url: match[0], process: proc });\n return;\n }\n }\n reject(new Error(\"cloudflared: failed to parse public URL\"));\n };\n readLoop().catch(reject);\n setTimeout(() => reject(new Error(\"cloudflared: timed out\")), 30_000);\n });\n}\n\nasync function spawnNgrokTunnel(port: number): Promise<{ url: string; process: { kill(): void } }> {\n const proc = Bun.spawn([\"ngrok\", \"http\", String(port)], { stdout: \"pipe\", stderr: \"pipe\" });\n const deadline = Date.now() + 15_000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 500));\n try {\n const res = await fetch(\"http://localhost:4040/api/tunnels\");\n if (res.ok) {\n const data = (await res.json()) as { tunnels?: Array<{ public_url: string }> };\n const t = data.tunnels?.find((t) => t.public_url.startsWith(\"https://\"));\n if (t) return { url: t.public_url, process: proc };\n }\n } catch {}\n }\n proc.kill();\n throw new Error(\"ngrok: timed out\");\n}\n\n/**\n * Creates a new TunnelAdapter instance.\n * @returns Configured TunnelAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#tunnel-connector-factory\n */\nexport function createAdapter(): TunnelAdapter {\n return new TunnelAdapter();\n}\n","/**\n * DeployAdapter — build at a git ref and push to remote deployment targets.\n *\n * Supported providers: mock, fly, vercel, docker-push, rsync.\n * Only `mock` is fully implemented.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { AbstractConnectorAdapter } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface DeployState {\n provider: string;\n defaults: Record<string, string>;\n deployments: Map<string, DeploymentRecord>;\n repoRoot: string | null;\n worktreeDir: string;\n}\n\ninterface DeploymentRecord {\n id: string;\n url: string;\n ref?: string;\n buildCommand: string;\n buildDir: string;\n deployedAt: string;\n status: \"deploying\" | \"live\" | \"failed\" | \"removed\";\n}\n\n/**\n * Connector adapter for building and deploying to remote targets.\n * Supports push, status, list, teardown, and logs operations. Currently implements the `mock` provider; fly, vercel, docker-push, and rsync are planned.\n * @docLink packages/base-assets/concepts#deploy-connector\n */\nexport class DeployAdapter extends AbstractConnectorAdapter {\n readonly name = \"deploy\";\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const provider = String(declaration.options?.provider ?? \"mock\");\n this.log.info(\"connect\", { id: declaration.id, provider });\n const defaults: Record<string, string> = {};\n for (const [k, v] of Object.entries(declaration.options ?? {})) {\n if (k !== \"provider\" && typeof v === \"string\") defaults[k] = v;\n }\n let repoRoot: string | null = null;\n try {\n repoRoot = execSync(\"git rev-parse --show-toplevel\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {}\n return this.makeHandle(declaration, {\n provider,\n defaults,\n deployments: new Map(),\n repoRoot,\n worktreeDir: process.cwd(),\n } as DeployState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n handle.connected = false;\n }\n override async onSessionClose(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n override async onHibernate(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"push\",\n description: \"Build and deploy.\",\n accessLevel: \"write\",\n args: [\n { name: \"build_command\", type: \"string\", required: true, description: \"Build command\" },\n {\n name: \"build_dir\",\n type: \"string\",\n required: true,\n description: \"Build output directory\",\n },\n { name: \"ref\", type: \"string\", required: false, description: \"Git ref\" },\n { name: \"label\", type: \"string\", required: false, description: \"Deployment label\" },\n {\n name: \"target_overrides\",\n type: \"json\",\n required: false,\n description: \"Provider overrides\",\n },\n ],\n },\n {\n name: \"status\",\n description: \"Get deployment status.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"deployment\",\n type: \"string\",\n required: false,\n description: \"Deployment ID (omit for all)\",\n },\n ],\n },\n { name: \"list\", description: \"List all deployments.\", accessLevel: \"read\", args: [] },\n {\n name: \"teardown\",\n description: \"Remove a deployment.\",\n accessLevel: \"write\",\n args: [\n { name: \"deployment\", type: \"string\", required: true, description: \"Deployment ID\" },\n ],\n },\n {\n name: \"logs\",\n description: \"Fetch remote logs.\",\n accessLevel: \"read\",\n args: [\n { name: \"deployment\", type: \"string\", required: true, description: \"Deployment ID\" },\n {\n name: \"lines\",\n type: \"number\",\n required: false,\n description: \"Number of lines (default: 100)\",\n },\n ],\n },\n ];\n }\n\n describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const state = handle.state as DeployState;\n return {\n id: declaration.id,\n name: `Deploy — ${state.provider}`,\n description: `Build and deploy to ${state.provider}.`,\n category: \"service\",\n access: handle.access,\n toolNames: [\"push\", \"status\", \"list\", \"teardown\", \"logs\"],\n };\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as DeployState;\n switch (operation) {\n case \"push\":\n return this.opPush(handle, state, args);\n case \"status\":\n return this.opStatus(state, args);\n case \"list\":\n return this.opList(state);\n case \"teardown\":\n return this.opTeardown(handle, state, args);\n case \"logs\":\n return this.opLogs(state, args);\n default:\n throw new Error(`DeployAdapter has no operation: ${operation}`);\n }\n }\n\n private async opPush(\n handle: ConnectorHandle,\n state: DeployState,\n args: Record<string, unknown>,\n ): Promise<string> {\n if (handle.access === \"read-only\") throw new Error(\"push requires read-write access\");\n const buildCommand = String(args.build_command ?? \"\");\n const buildDir = String(args.build_dir ?? \"\");\n if (!buildCommand) throw new Error(\"push: build_command required\");\n if (!buildDir) throw new Error(\"push: build_dir required\");\n const deploymentId = args.label ? String(args.label) : `deploy-${Date.now()}`;\n this.log.info(\"build start\", {\n deploymentId,\n buildCommand,\n buildDir,\n provider: state.provider,\n });\n try {\n let result: string;\n switch (state.provider) {\n case \"mock\":\n result = this.mockPush(state, {\n deploymentId,\n buildCommand,\n buildDir,\n ref: args.ref ? String(args.ref) : undefined,\n });\n break;\n default:\n throw new Error(`Provider \"${state.provider}\" is not yet implemented`);\n }\n this.log.info(\"build success\", { deploymentId });\n return result;\n } catch (err) {\n this.log.error(\"build failed\", err, { deploymentId });\n throw err;\n }\n }\n\n private mockPush(\n state: DeployState,\n opts: { deploymentId: string; buildCommand: string; buildDir: string; ref?: string },\n ): string {\n const record: DeploymentRecord = {\n id: opts.deploymentId,\n url: `https://mock.deploy.example.com/${opts.deploymentId}`,\n ref: opts.ref,\n buildCommand: opts.buildCommand,\n buildDir: opts.buildDir,\n deployedAt: new Date().toISOString(),\n status: \"live\",\n };\n state.deployments.set(opts.deploymentId, record);\n return JSON.stringify({ deployment_id: record.id, url: record.url, ref: record.ref ?? null });\n }\n\n private opStatus(state: DeployState, args: Record<string, unknown>): string {\n const id = args.deployment ? String(args.deployment) : undefined;\n if (id) {\n const r = state.deployments.get(id);\n if (!r) throw new Error(`Deployment not found: ${id}`);\n return JSON.stringify(this.ser(r));\n }\n return JSON.stringify([...state.deployments.values()].map((r) => this.ser(r)));\n }\n\n private opList(state: DeployState): string {\n return JSON.stringify([...state.deployments.values()].map((r) => this.ser(r)));\n }\n\n private opTeardown(\n handle: ConnectorHandle,\n state: DeployState,\n args: Record<string, unknown>,\n ): string {\n if (handle.access === \"read-only\") throw new Error(\"teardown requires read-write access\");\n const id = args.deployment ? String(args.deployment) : undefined;\n if (!id) throw new Error(\"teardown: deployment required\");\n if (state.provider === \"mock\") {\n if (!state.deployments.delete(id)) throw new Error(`Not found: ${id}`);\n return JSON.stringify({ removed: true });\n }\n throw new Error(`Provider \"${state.provider}\" does not support teardown yet`);\n }\n\n private opLogs(state: DeployState, args: Record<string, unknown>): string {\n const id = args.deployment ? String(args.deployment) : undefined;\n if (!id) throw new Error(\"logs: deployment required\");\n if (state.provider === \"mock\")\n return JSON.stringify({ deployment: id, logs: \"No logs available for mock provider.\" });\n throw new Error(`Provider \"${state.provider}\" does not support logs yet`);\n }\n\n private ser(r: DeploymentRecord): Record<string, unknown> {\n return {\n id: r.id,\n url: r.url,\n ref: r.ref ?? null,\n status: r.status,\n deployedAt: r.deployedAt,\n buildCommand: r.buildCommand,\n buildDir: r.buildDir,\n };\n }\n}\n\n/**\n * Creates a new DeployAdapter instance.\n * @returns Configured DeployAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#deploy-connector-factory\n */\nexport function createAdapter(): DeployAdapter {\n return new DeployAdapter();\n}\n","/**\n * Connector adapter registry.\n *\n * Built-in adapters from `@skaile/base-assets` are pre-registered here via\n * static ESM imports of their subpath exports so they are bundled into any\n * `bun --compile`'d agent binary AND any tsup-emitted ESM tarball. The\n * catalog path in `ConnectorManager.resolveAdapter`\n * (`await import(adapterPath)` of raw TS) is a dev-only fallback for\n * project-local third-party adapters — it cannot work inside a compiled\n * binary because bun cannot share its bundled symbol graph with\n * externally-loaded TS files (the import silently hangs while trying to\n * resolve `@skaile/workspaces/connectors` against an absent `node_modules`).\n *\n * **Static import discipline.** Every subpath specifier below must be a\n * string-literal `from \"@skaile/workspaces/base-assets/connectors/<name>\"` —\n * never aliased through a variable. Indirection defeats `bun --compile`'s\n * static analysis and silently drops the module from the binary.\n * Regression test: `tests/connector-tools-regression.test.ts`.\n */\n\nimport type { ConnectorAdapter, ConnectorAdapterFactory } from \"./connector-types.js\";\n\n// Static subpath imports — string literals only.\nimport { createAdapter as createFlowAdapter } from \"@skaile/workspaces/base-assets/connectors/flow\";\nimport { createAdapter as createMemoryAdapter } from \"@skaile/workspaces/base-assets/connectors/memory\";\nimport { createAdapter as createPostgresAdapter } from \"@skaile/workspaces/base-assets/connectors/postgres\";\nimport { createAdapter as createRedisAdapter } from \"@skaile/workspaces/base-assets/connectors/redis\";\nimport { createAdapter as createSqliteAdapter } from \"@skaile/workspaces/base-assets/connectors/sqlite\";\nimport { createAdapter as createXstateAdapter } from \"@skaile/workspaces/base-assets/connectors/xstate\";\nimport { createAdapter as createXstateStoreAdapter } from \"@skaile/workspaces/base-assets/connectors/xstate-store\";\nimport { createAdapter as createYjsAdapter } from \"@skaile/workspaces/base-assets/connectors/yjs\";\nimport { createAdapter as createGmailAdapter } from \"@skaile/workspaces/base-assets/connectors/gmail\";\nimport { createAdapter as createMinioAdapter } from \"@skaile/workspaces/base-assets/connectors/minio\";\nimport { createAdapter as createMattermostAdapter } from \"@skaile/workspaces/base-assets/connectors/mattermost\";\nimport { createAdapter as createDevserverAdapter } from \"@skaile/workspaces/base-assets/connectors/devserver\";\n// Subpath is `static-server`; registry key (CONNECTOR.md `name:`) is `static`.\nimport { createAdapter as createStaticAdapter } from \"@skaile/workspaces/base-assets/connectors/static-server\";\nimport { createAdapter as createTunnelAdapter } from \"@skaile/workspaces/base-assets/connectors/tunnel\";\nimport { createAdapter as createDeployAdapter } from \"@skaile/workspaces/base-assets/connectors/deploy\";\n\nconst factories = new Map<string, ConnectorAdapterFactory>();\n\n/**\n * Register a connector adapter factory under `name`. Overwrites any existing registration.\n * @param name - Adapter key used in `skaile.yaml` `driver:` fields (e.g. `\"postgres\"`, `\"redis\"`).\n * @param factory - Factory function that returns a fresh adapter instance.\n * @docLink packages/connectors/api-reference#register-connector-adapter\n */\nexport function registerConnectorAdapter(name: string, factory: ConnectorAdapterFactory): void {\n factories.set(name, factory);\n}\n\n/**\n * Get a connector adapter by name, calling its factory.\n * @param name - Adapter key (e.g. `\"postgres\"`).\n * @returns A fresh adapter instance.\n * @throws {Error} when no adapter is registered under `name`.\n * @docLink packages/connectors/api-reference#get-connector-adapter\n */\nexport function getConnectorAdapter(name: string): ConnectorAdapter {\n const factory = factories.get(name);\n if (!factory) {\n throw new Error(\n `Unknown connector adapter: \"${name}\". Available: ${[...factories.keys()].join(\", \") || \"none\"}`,\n );\n }\n return factory();\n}\n\n/**\n * Get a connector adapter by name, or return `undefined` if not registered.\n * @param name - Adapter key.\n * @returns A fresh adapter instance or `undefined`.\n * @docLink packages/connectors/api-reference#try-get-connector-adapter\n */\nexport function tryGetConnectorAdapter(name: string): ConnectorAdapter | undefined {\n const factory = factories.get(name);\n return factory ? factory() : undefined;\n}\n\n/**\n * Return the names of all currently registered connector adapters.\n * @returns Array of adapter keys (e.g. `[\"postgres\", \"redis\", \"memory\"]`).\n * @docLink packages/connectors/api-reference#list-connector-adapters\n */\nexport function listConnectorAdapters(): string[] {\n return [...factories.keys()];\n}\n\nlet _registered = false;\n\n/**\n * Register every built-in connector adapter from `@skaile/base-assets`.\n *\n * Factories close over the statically-imported `createAdapter` functions\n * at the top of this file. Both `bun --compile` and tsup follow the\n * string-literal `import ... from \"@skaile/workspaces/base-assets/connectors/...\"`\n * specifiers at build time and bundle the adapter plus its transitive\n * `@skaile/*` deps. This sidesteps the catalog path's runtime TS-import hang.\n */\nexport function registerBuiltinConnectorAdapters(): void {\n if (_registered) return;\n _registered = true;\n\n registerConnectorAdapter(\"flow\", () => createFlowAdapter());\n\n // Built-ins from @skaile/base-assets\n registerConnectorAdapter(\"memory\", () => createMemoryAdapter());\n registerConnectorAdapter(\"postgres\", () => createPostgresAdapter());\n registerConnectorAdapter(\"redis\", () => createRedisAdapter());\n registerConnectorAdapter(\"sqlite\", () => createSqliteAdapter());\n registerConnectorAdapter(\"xstate\", () => createXstateAdapter());\n registerConnectorAdapter(\"xstate-store\", () => createXstateStoreAdapter());\n registerConnectorAdapter(\"yjs\", () => createYjsAdapter());\n registerConnectorAdapter(\"gmail\", () => createGmailAdapter());\n registerConnectorAdapter(\"minio\", () => createMinioAdapter());\n registerConnectorAdapter(\"mattermost\", () => createMattermostAdapter());\n registerConnectorAdapter(\"devserver\", () => createDevserverAdapter());\n // Subpath is `static-server`; registry key (CONNECTOR.md `name:`) is `static`.\n registerConnectorAdapter(\"static\", () => createStaticAdapter());\n registerConnectorAdapter(\"tunnel\", () => createTunnelAdapter());\n registerConnectorAdapter(\"deploy\", () => createDeployAdapter());\n}\n","/**\n * Connector adapter infrastructure types.\n *\n * Connectors are external data backends (databases, KV stores, object stores,\n * in-process state, etc.) that agents access through injected tools. Adapters\n * bridge the gap between the backend's native API and the uniform interface\n * agents consume. Connectors do not mount to the filesystem — for filesystem\n * projection use mounts instead.\n *\n * @docLink packages/connectors/concepts#connector-types\n */\n\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n WatchHandle,\n WatchOptions,\n} from \"./shared-types.js\";\n\nexport type { OperationDescriptor } from \"./shared-types.js\";\n\nimport type { SecretProvider } from \"./secrets.js\";\n\n// ── Connector declaration (runtime config, resolved from skaile.yaml) ────────\n\n/**\n * Parsed connector configuration from `skaile.yaml`, passed to `ConnectorAdapter.connect()` and held by `ConnectorManager`.\n * @docLink packages/connectors/concepts#connector-declaration\n */\nexport interface ConnectorDeclaration {\n /** Unique identifier for this connector instance. */\n id: string;\n /** Driver type: \"postgres\", \"redis\", \"memory\", \"xstate\", \"yjs\", etc. */\n driver: string;\n /** Access level enforced by the manager. */\n access: \"read-only\" | \"read-write\";\n /** Credential reference: \"env:VAR_NAME\" or inline value. */\n auth?: string;\n /** Driver-specific configuration. */\n options?: Record<string, unknown>;\n}\n\n// ── Connector handle (returned by adapter.connect) ───────────────────────────\n\n/**\n * Live state of a connected backend, returned by `ConnectorAdapter.connect()` and held by `ConnectorManager`.\n * @docLink packages/connectors/concepts#connector-handle\n */\nexport interface ConnectorHandle {\n /** Connector declaration ID. */\n readonly id: string;\n /** Driver name. */\n readonly driver: string;\n /** Effective access level. */\n readonly access: \"read-only\" | \"read-write\";\n /** Whether the adapter is connected. */\n connected: boolean;\n /** Adapter-specific state (connection pool, client, etc.). Opaque to callers. */\n state: unknown;\n}\n\n// ── Connector change event ────────────────────────────────────────────────────\n\n/**\n * Change event emitted by a connector adapter's `watch()` implementation.\n * @docLink packages/connectors/concepts#connector-change-event\n */\nexport interface ConnectorChangeEvent {\n /** Relative path, key, table name, node ID, etc. */\n path: string;\n /** What happened. */\n action: \"create\" | \"edit\" | \"delete\";\n /** What caused the change. */\n source: \"operation\" | \"remote\" | \"filesystem\";\n}\n\n// ── ConnectorManager info ────────────────────────────────────────────────────\n\n/**\n * Summary of a connected connector returned by `ConnectorManager.listConnectors()`.\n * @docLink packages/connectors/concepts#connector-info\n */\nexport interface ConnectorInfo {\n id: string;\n driver: string;\n access: \"read-only\" | \"read-write\";\n /** Operation names this connector exposes as agent tools (via describeOperations). */\n operations: string[];\n}\n\n/**\n * Bulk connect/disconnect result returned by `ConnectorManager.connectAll()` and `disconnectAll()`.\n * @docLink packages/connectors/concepts#connector-report\n */\nexport interface ConnectorReport {\n results: Array<{ id: string; connected: boolean; error?: string }>;\n}\n\n// ── Field spec (connector credential/config declarations) ────────────────────\n\n/**\n * Input types for `ConnectorFieldSpec`. Controls validation rules and the Forge UI affordance.\n * @docLink packages/connectors/concepts#field-type\n */\nexport type FieldType =\n | \"text\" // plain string\n | \"password\" // sensitive; always stored via SecretProvider\n | \"api-key\" // alias for password with specific UI affordance\n | \"url\" // validated URL string\n | \"oauth\" // triggers OAuth flow; oauthService required\n | \"select\" // enum; choices required and non-empty\n | \"boolean\" // default must be \"true\" or \"false\" if provided\n | \"number\"; // default must be a parseable numeric string if provided\n\n/**\n * Declares one credential or configuration field that a connector adapter requires.\n * Used by `ConnectorManager.resolveFields()` and the Forge settings UI.\n * @docLink packages/connectors/concepts#connector-field-spec\n */\nexport interface ConnectorFieldSpec {\n /** Machine name used as the options key in skaile.yaml. */\n key: string;\n /** Human-readable label for the forge settings UI. */\n label: string;\n /** Tooltip / help text. */\n description?: string;\n /** Input type. Controls validation rules and UI affordance in the forge settings panel. */\n type: FieldType;\n /** Whether the adapter refuses to connect when this field is missing. */\n required: boolean;\n /** String fallback used when not provided and not required. */\n default?: string;\n /** Forge UI masks the value; value is never logged. */\n sensitive: boolean;\n /** UI grouping: \"Authentication\", \"Connection\", \"Options\". */\n group?: string;\n /**\n * Required when type === \"select\"; must be non-empty.\n */\n choices?: string[];\n /**\n * Required when type === \"oauth\".\n * Identifies the OAuth service, e.g. \"google\".\n * Used to call OAuthSecretProvider.initiateFlow(oauthService, account).\n * oauth fields must be declared AFTER any field they reference (e.g., \"account\").\n */\n oauthService?: string;\n /** Example value shown as placeholder text in the forge settings UI. */\n example?: string;\n}\n\n/**\n * Thrown by `ConnectorManager.connectAll()` and `resolveFields()` when a required\n * adapter field cannot be resolved through the `SecretProviderChain`. Carries the\n * connector ID, the missing field spec, the ref that was tried, and the available\n * providers for actionable error messages.\n * @docLink packages/connectors/concepts#connector-field-missing-error\n */\nexport class ConnectorFieldMissingError extends Error {\n readonly connectorId: string;\n readonly field: ConnectorFieldSpec;\n readonly triedRef: string;\n readonly availableProviders: string[];\n\n constructor(opts: {\n connectorId: string;\n field: ConnectorFieldSpec;\n triedRef: string;\n availableProviders: string[];\n }) {\n super(\n `Connector \"${opts.connectorId}\" is missing required field \"${opts.field.key}\" ` +\n `(tried: ${opts.triedRef || \"(none)\"}). ` +\n `Available providers: ${opts.availableProviders.join(\", \") || \"(none)\"}`,\n );\n this.name = \"ConnectorFieldMissingError\";\n this.connectorId = opts.connectorId;\n this.field = opts.field;\n this.triedRef = opts.triedRef;\n this.availableProviders = opts.availableProviders;\n }\n}\n\n// ── Runtime skill descriptor ──────────────────────────────────────────────────\n\n/**\n * Instance-specific skill descriptor returned by `ConnectorAdapter.describeSkill()`.\n * Returned by `ConnectorManager.listSkills()` to surface connector capabilities to the agent.\n * @docLink packages/connectors/concepts#runtime-skill-descriptor\n */\nexport interface RuntimeSkillDescriptor {\n /** Connector instance id, e.g. \"gmail-work\". */\n id: string;\n /** Short label: \"Gmail — work@company.com\". */\n name: string;\n /** Instance-specific description: \"Read and write email for work@company.com\". */\n description: string;\n /** Category for grouping in the forge UI. */\n category: string;\n access: \"read-only\" | \"read-write\";\n /** Operation names (without loading full defs) for agent planning. */\n toolNames: string[];\n}\n\n// ── Adapter interface ────────────────────────────────────────────────────────\n\n/**\n * Contract all connector adapters must implement. Each adapter bridges one\n * backend type (postgres, redis, memory, etc.) to the uniform interface consumed\n * by `ConnectorManager` and agent tools.\n *\n * The interface follows an optional-hook pattern: only `connect`, `disconnect`,\n * `describeOperations`, and `executeOp` are required. Base CRUD methods\n * (`read`, `write`, `delete`, `list`, `search`) are optional and default to\n * throwing \"not supported\". Lifecycle hooks (`describeFields`, `describeSkill`,\n * `watch`, `onHibernate`, `onSessionClose`) are fully optional.\n * @docLink packages/connectors/concepts#connector-adapter\n */\nexport interface ConnectorAdapter {\n readonly name: string;\n\n // ── Lifecycle ──\n\n /**\n * Establish a connection to the backend. Receives resolvedFields when the\n * adapter implements describeFields() and ConnectorManager.resolveFields()\n * has been called.\n */\n connect(\n declaration: ConnectorDeclaration,\n secrets?: SecretProvider,\n resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle>;\n /** Close the connection and release resources. */\n disconnect(handle: ConnectorHandle): Promise<void>;\n\n // ── Base operations ──\n /** Fetch content at a path/key. */\n read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null>;\n /** Store content at a path/key. */\n write(handle: ConnectorHandle, path: string, content: ConnectorContent): Promise<void>;\n /** Remove a path/key. Returns true if deleted, false if not found. */\n delete(handle: ConnectorHandle, path: string): Promise<boolean>;\n /** Enumerate entries at a path/prefix. */\n list(handle: ConnectorHandle, path?: string, options?: ListOptions): Promise<ConnectorEntry[]>;\n /** Full-text or semantic search across entries. */\n search(handle: ConnectorHandle, query: string, options?: SearchOptions): Promise<SearchResult[]>;\n\n // ── Self-description ──\n /** Return the custom operations this adapter exposes beyond base CRUD. */\n describeOperations(handle: ConnectorHandle): OperationDescriptor[];\n /** Execute a custom operation by name. */\n executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string>;\n\n // ── Field + skill declarations (optional) ──\n\n /**\n * Declare the credentials and config fields this adapter requires.\n * ConnectorManager calls this before connect() and resolves the values\n * via the SecretProviderChain, passing the result as resolvedFields.\n * oauth fields must be declared after any fields they depend on.\n */\n describeFields?(): ConnectorFieldSpec[];\n\n /**\n * Return an instance-specific skill descriptor for the skill catalog.\n * May access declaration.options (non-sensitive config only).\n * Must NOT access secret values.\n * ConnectorManager provides a default descriptor from id + driver if absent.\n */\n describeSkill?(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor;\n\n // ── Watch (optional) ──\n watch?(\n handle: ConnectorHandle,\n callback: (event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle;\n\n // ── Session lifecycle (optional) ──\n /** Called before container hibernation. Adapters should persist unsaved state. */\n onHibernate?(handle: ConnectorHandle): Promise<string | undefined>;\n /** Called when the session is closing. Adapters should finalize work. */\n onSessionClose?(handle: ConnectorHandle): Promise<string | undefined>;\n}\n\n// ── Adapter factory ──────────────────────────────────────────────────────────\n\n/**\n * Factory function signature used by the connector registry.\n * @docLink packages/connectors/api-reference#connector-adapter-factory\n */\nexport type ConnectorAdapterFactory = () => ConnectorAdapter;\n","/**\n * ConnectorManager — central coordinator for connector lifecycle, dispatch,\n * and tool generation. Connectors do not mount to the filesystem; for\n * filesystem projection use `MountManager` instead.\n *\n * @docLink packages/connectors/concepts#connector-manager\n */\n\nimport { dirname, resolve } from \"node:path\";\nimport type { CatalogEntry } from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { TelemetryProvider, Trace } from \"@skaile/workspaces/telemetry\";\nimport type { ConnectorStatusEvent, Logger } from \"@skaile/workspaces/types\";\nimport { registerConnectorAdapter, tryGetConnectorAdapter } from \"./connector-registry.js\";\nimport type {\n ConnectorAdapter,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n ConnectorInfo,\n ConnectorReport,\n RuntimeSkillDescriptor,\n} from \"./connector-types.js\";\nimport { ConnectorFieldMissingError } from \"./connector-types.js\";\nimport type { SecretProvider, SecretProviderChain } from \"./secrets.js\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n WatchHandle,\n WatchOptions,\n} from \"./shared-types.js\";\n\n// ── Internal state ────────────────────────────────────────────────────────────\n\ninterface ConnectedConnector {\n adapter: ConnectorAdapter;\n handle: ConnectorHandle;\n declaration: ConnectorDeclaration;\n watchHandle?: WatchHandle;\n}\n\ninterface LifecycleResult {\n id: string;\n ok: boolean;\n error?: string;\n detail?: string;\n}\n\n// ── Module-level helpers ───────────────────────────────────────────────────────\n\nconst KNOWN_PREFIXES = [\"env:\", \"forge:\", \"op:\", \"kp:\", \"oauth:\"];\n\nfunction hasKnownPrefix(ref: string): boolean {\n return KNOWN_PREFIXES.some((p) => ref.startsWith(p));\n}\n\nasync function resolveFields(\n declaration: ConnectorDeclaration,\n fields: ConnectorFieldSpec[],\n chain: SecretProviderChain,\n): Promise<Record<string, string>> {\n const resolved: Record<string, string> = {};\n\n for (const field of fields) {\n let value: string | undefined;\n\n if (field.type === \"oauth\") {\n const account = resolved.account ?? \"\";\n const oauthRef = `oauth:${field.oauthService}:${account}`;\n await chain.prepareRef(oauthRef); // may throw OAuthRequiredError\n value = chain.resolve(oauthRef);\n } else {\n const rawValue = declaration.options?.[field.key];\n if (rawValue !== undefined) {\n const raw = String(rawValue);\n value = hasKnownPrefix(raw) ? chain.resolve(raw) : raw;\n } else {\n value = field.default;\n }\n }\n\n if (value === undefined && field.required) {\n throw new ConnectorFieldMissingError({\n connectorId: declaration.id,\n field,\n triedRef: String(declaration.options?.[field.key] ?? \"(none)\"),\n availableProviders: chain.capabilities(),\n });\n }\n\n if (value !== undefined) resolved[field.key] = value;\n }\n\n return resolved;\n}\n\nfunction buildDefaultSkillDescriptor(\n adapter: ConnectorAdapter,\n declaration: ConnectorDeclaration,\n handle: ConnectorHandle,\n): RuntimeSkillDescriptor {\n return {\n id: declaration.id,\n name: `${adapter.name} — ${declaration.id}`,\n description: `${adapter.name} connector (${declaration.id})`,\n category: adapter.name,\n access: declaration.access,\n toolNames: adapter.describeOperations(handle).map((o) => o.name),\n };\n}\n\nfunction buildSkillBody(\n descriptor: RuntimeSkillDescriptor,\n ops: OperationDescriptor[],\n shellAccess: boolean,\n): string {\n const lines: string[] = [\n `## ${descriptor.name}`,\n \"\",\n descriptor.description,\n `Access: ${descriptor.access}`,\n \"\",\n ];\n\n if (ops.length > 0) {\n lines.push(\"### Operations\", \"\");\n for (const op of ops) {\n const argStr = op.args\n .map((a) =>\n a.required\n ? `--${a.name} ${a.type.toUpperCase()}`\n : `[--${a.name} ${a.type.toUpperCase()}]`,\n )\n .join(\" \");\n if (shellAccess) {\n lines.push(`**${op.name}** — ${op.description}`);\n lines.push(\n ` skaile connector ${descriptor.id} ${op.name}${argStr ? ` ${argStr}` : \"\"}`,\n \"\",\n );\n } else {\n lines.push(`**${op.name}** — ${op.description}`);\n lines.push(` connector_exec connector_id=\"${descriptor.id}\" operation=\"${op.name}\"`, \"\");\n }\n }\n }\n\n lines.push(\"### Base operations\", \"\");\n if (shellAccess) {\n lines.push(\n ` skaile connector ${descriptor.id} read <path>`,\n ` skaile connector ${descriptor.id} list [path]`,\n ` skaile connector ${descriptor.id} search <query>`,\n );\n } else {\n lines.push(\n ` connector_read connector_id=\"${descriptor.id}\" path=<path>`,\n ` connector_list_entries connector_id=\"${descriptor.id}\"`,\n ` connector_search connector_id=\"${descriptor.id}\" query=<query>`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n// ── Manager options ────────────────────────────────────────────────────────────\n\n/**\n * Options for `ConnectorManager`. Pass as the second argument to the constructor.\n *\n * @example\n * ```typescript\n * const manager = new ConnectorManager(chain, {\n * onStatusChange: (event) => transport.send(event),\n * });\n * ```\n */\nexport interface ConnectorManagerOptions {\n /**\n * Called whenever a connector's connection state changes.\n *\n * Fired from both the bulk `connectAll()` path and the hot-plug `connect()` path.\n * Status values: `\"connecting\"` → `\"connected\"` | `\"error\"`, and `\"disconnected\"`\n * after `disconnect()` / `disconnectAll()`.\n */\n onStatusChange?: (event: ConnectorStatusEvent) => void;\n\n /** Optional telemetry provider for span instrumentation. */\n telemetry?: TelemetryProvider;\n /** Optional active trace to attach connector spans to. */\n trace?: Trace;\n /** Catalog entries for dynamic adapter resolution (registry-first, catalog-fallback). */\n catalogEntries?: CatalogEntry[];\n}\n\n// ── Manager ───────────────────────────────────────────────────────────────────\n\n/**\n * Manages connection lifecycle, CRUD dispatch, skill catalog, and tool generation\n * for all connectors declared in `skaile.yaml`. Resolves adapters from the registry\n * or catalog. Accepts an optional `onStatusChange` callback for live status updates.\n * @docLink packages/connectors/concepts#connector-manager\n */\nexport class ConnectorManager {\n private connectors = new Map<string, ConnectedConnector>();\n private readonly chain?: SecretProviderChain;\n /** @deprecated Pass SecretProviderChain instead */\n // @TODO: Code-Review: legacy SecretProvider back-compat field — remove once all callers pass SecretProviderChain; the conditional in the constructor (line ~228) also needs removal\n private readonly secrets?: SecretProvider;\n private readonly catalogEntries: CatalogEntry[];\n private readonly mgrLog: Logger;\n\n /**\n * @param chain - Optional SecretProviderChain (or legacy SecretProvider) for resolving\n * credential references. Pass a SecretProviderChain to enable field resolution via\n * describeFields(); a bare SecretProvider is accepted for backwards compatibility.\n * @param opts - Optional manager options, e.g. onStatusChange callback.\n */\n constructor(\n chain?: SecretProviderChain | SecretProvider,\n private readonly opts: ConnectorManagerOptions = {},\n ) {\n // Accept both chain and legacy SecretProvider\n if (chain && typeof chain === \"object\" && \"prepareRef\" in chain) {\n this.chain = chain as SecretProviderChain;\n } else {\n this.secrets = chain as SecretProvider | undefined;\n }\n this.catalogEntries = opts.catalogEntries ?? [];\n this.mgrLog = createLogger({ kind: \"connector\", subkind: \"manager\" });\n }\n\n // ── Private helpers ─────────────────────────────────────────────────────────\n\n private async resolveAdapter(driver: string): Promise<ConnectorAdapter> {\n // 1. Check local registry (programmatically registered adapters)\n const registered = tryGetConnectorAdapter(driver);\n if (registered) return registered;\n\n // 2. Catalog lookup\n const entry = this.catalogEntries.find((e) => e.kind === \"connector\" && e.name === driver);\n if (!entry) {\n throw new Error(\n `Unknown connector adapter: \"${driver}\". ` +\n `Run 'skaile search connector' to see available drivers.`,\n );\n }\n\n // 3. Dynamic import from source path\n const entryPoint = (entry.metadata?.entry as string) ?? \"./adapter.ts\";\n const adapterPath = resolve(dirname(entry.source), entryPoint);\n const mod = await import(adapterPath);\n if (typeof mod.createAdapter !== \"function\") {\n throw new Error(`Connector \"${driver}\" at ${adapterPath} does not export createAdapter()`);\n }\n const adapter: ConnectorAdapter = mod.createAdapter();\n\n // Cache in registry for subsequent calls\n registerConnectorAdapter(driver, () => adapter);\n return adapter;\n }\n\n private async connectAdapter(\n declaration: ConnectorDeclaration,\n adapter: ConnectorAdapter,\n ): Promise<ConnectorHandle> {\n if (this.chain && adapter.describeFields) {\n const fields = adapter.describeFields();\n const resolvedFields = await resolveFields(declaration, fields, this.chain);\n return adapter.connect(declaration, undefined, resolvedFields);\n }\n // Legacy path: pass chain or secrets as SecretProvider\n return adapter.connect(declaration, this.chain ?? this.secrets);\n }\n\n private async withSpan<T>(\n name: string,\n attrs: Record<string, string | number | boolean>,\n fn: () => Promise<T>,\n ): Promise<T> {\n const telemetry = this.opts?.telemetry;\n const trace = this.opts?.trace;\n if (!telemetry || !trace) return fn();\n\n const span = telemetry.startSpan(trace, {\n name,\n kind: \"connector_op\",\n attributes: attrs,\n });\n\n try {\n const result = await fn();\n telemetry.endSpan(span, { status: \"ok\" });\n return result;\n } catch (err) {\n telemetry.endSpan(span, {\n status: \"error\",\n error: (err as Error).message,\n });\n throw err;\n }\n }\n\n // ── Bulk lifecycle ──────────────────────────────────────────────────────────\n\n /**\n * Connect all declared connectors. resolveFields() is called automatically for\n * adapters that implement describeFields().\n *\n * @returns ConnectorReport with per-connector success/error status.\n */\n async connectAll(declarations: ConnectorDeclaration[]): Promise<ConnectorReport> {\n this.mgrLog.info(\"connectAll start\", { count: declarations.length });\n const results: ConnectorReport[\"results\"] = [];\n\n for (const decl of declarations) {\n try {\n const adapter = await this.resolveAdapter(decl.driver);\n const adapterLog = createLogger({\n kind: \"connector\",\n subkind: adapter.name ?? decl.driver,\n instance: decl.id,\n });\n (adapter as { setLogger?: (l: Logger) => void }).setLogger?.(adapterLog);\n const handle = await this.withSpan(\n \"connector.connect\",\n {\n \"skaile.connector.id\": decl.id,\n \"skaile.connector.driver\": decl.driver,\n \"skaile.connector.operation\": \"connect\",\n },\n () => this.connectAdapter(decl, adapter),\n );\n this.connectors.set(decl.id, { adapter, handle, declaration: decl });\n results.push({ id: decl.id, connected: true });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"connected\",\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.mgrLog.error(\"connect failed\", err, { id: decl.id, driver: decl.driver });\n results.push({ id: decl.id, connected: false, error: msg });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"error\",\n error: msg,\n });\n }\n }\n\n this.mgrLog.info(\"connectAll complete\", {\n connected: results.filter((r) => r.connected).length,\n failed: results.filter((r) => !r.connected).length,\n });\n return { results };\n }\n\n /** Disconnect all connectors and stop all watchers. */\n async disconnectAll(): Promise<void> {\n this.mgrLog.info(\"disconnectAll start\", { count: this.connectors.size });\n await this.unwatchAll();\n for (const [id, entry] of this.connectors) {\n try {\n await entry.adapter.disconnect(entry.handle);\n } catch {\n // Best-effort cleanup\n }\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: id,\n status: \"disconnected\",\n });\n }\n this.connectors.clear();\n this.mgrLog.info(\"disconnectAll complete\");\n }\n\n // ── Hot-plug ────────────────────────────────────────────────────────────────\n\n /**\n * Connect a single connector (hot-plug). Resolves fields if the adapter declares them.\n *\n * @returns The ConnectorHandle for subsequent operations.\n */\n async connect(declaration: ConnectorDeclaration): Promise<ConnectorHandle> {\n const adapter = await this.resolveAdapter(declaration.driver);\n const adapterLog = createLogger({\n kind: \"connector\",\n subkind: adapter.name ?? declaration.driver,\n instance: declaration.id,\n });\n (adapter as { setLogger?: (l: Logger) => void }).setLogger?.(adapterLog);\n try {\n const handle = await this.withSpan(\n \"connector.connect\",\n {\n \"skaile.connector.id\": declaration.id,\n \"skaile.connector.driver\": declaration.driver,\n \"skaile.connector.operation\": \"connect\",\n },\n () => this.connectAdapter(declaration, adapter),\n );\n this.connectors.set(declaration.id, { adapter, handle, declaration });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: declaration.id,\n status: \"connected\",\n });\n return handle;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: declaration.id,\n status: \"error\",\n error: msg,\n });\n throw err;\n }\n }\n\n /**\n * Disconnect a single connector by ID.\n *\n * @throws {Error} if the connector is not found\n */\n async disconnect(id: string): Promise<void> {\n const entry = this.get(id);\n if (entry.watchHandle) {\n try {\n await entry.watchHandle.close();\n } catch {\n // Best-effort cleanup\n }\n }\n await this.withSpan(\n \"connector.disconnect\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.adapter.name,\n \"skaile.connector.operation\": \"disconnect\",\n },\n async () => {\n try {\n await entry.adapter.disconnect(entry.handle);\n } finally {\n this.connectors.delete(id);\n }\n },\n );\n }\n\n // ── Watch ───────────────────────────────────────────────────────────────────\n\n /**\n * Start filesystem/operation watchers for all connected connectors.\n *\n * @returns Array of WatchHandle for cleanup (managed internally; use unwatchAll() to stop).\n */\n watchAll(\n callback: (connectorId: string, event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): void {\n for (const [id, entry] of this.connectors) {\n if (!entry.adapter.watch) continue;\n try {\n entry.watchHandle = entry.adapter.watch(\n entry.handle,\n (event) => callback(id, event),\n options,\n );\n } catch {\n // Best-effort — adapter may not support watching in current state\n }\n }\n }\n\n /** Stop all active watchers. */\n async unwatchAll(): Promise<void> {\n for (const [, entry] of this.connectors) {\n if (entry.watchHandle) {\n try {\n await entry.watchHandle.close();\n } catch {\n // Best-effort cleanup\n }\n entry.watchHandle = undefined;\n }\n }\n }\n\n // ── Session lifecycle ───────────────────────────────────────────────────────\n\n async hibernateAll(): Promise<LifecycleResult[]> {\n return this.runLifecycleHook(\"onHibernate\");\n }\n\n async closeAll(): Promise<LifecycleResult[]> {\n return this.runLifecycleHook(\"onSessionClose\");\n }\n\n private async runLifecycleHook(\n hook: \"onHibernate\" | \"onSessionClose\",\n ): Promise<LifecycleResult[]> {\n const results: LifecycleResult[] = [];\n\n for (const [id, entry] of this.connectors) {\n const fn = entry.adapter[hook];\n if (!fn) {\n results.push({ id, ok: true });\n continue;\n }\n try {\n const detail = await fn.call(entry.adapter, entry.handle);\n results.push({ id, ok: true, detail: detail ?? undefined });\n } catch (err) {\n results.push({\n id,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return results;\n }\n\n // ── Discovery ───────────────────────────────────────────────────────────────\n\n /**\n * Return the ConnectorHandle for a connected connector.\n *\n * @returns The handle or undefined if not connected (internal; callers use get() which throws).\n * @throws {Error} if the connector is not found\n */\n get(id: string): ConnectedConnector {\n const entry = this.connectors.get(id);\n if (!entry) throw new Error(`Connector not found: \"${id}\"`);\n return entry;\n }\n\n has(id: string): boolean {\n return this.connectors.has(id);\n }\n\n /**\n * Return summary info for all currently connected connectors.\n *\n * @returns Array of ConnectorInfo\n */\n listConnectors(): ConnectorInfo[] {\n return [...this.connectors.entries()].map(([id, entry]) => ({\n id,\n driver: entry.adapter.name,\n access: entry.declaration.access,\n operations: entry.adapter.describeOperations(entry.handle).map((o) => o.name),\n }));\n }\n\n getOperations(id: string): OperationDescriptor[] {\n const entry = this.get(id);\n return entry.adapter.describeOperations(entry.handle);\n }\n\n // ── Skill catalog ───────────────────────────────────────────────────────────\n\n /**\n * Return RuntimeSkillDescriptors for all connected adapters that implement describeSkill().\n * Adapters without describeSkill() receive a default descriptor built from id + driver.\n *\n * @returns Descriptors for all connected adapters.\n */\n listSkills(): RuntimeSkillDescriptor[] {\n return [...this.connectors.values()].map(({ adapter, handle, declaration }) =>\n adapter.describeSkill\n ? adapter.describeSkill(handle, declaration)\n : buildDefaultSkillDescriptor(adapter, declaration, handle),\n );\n }\n\n /**\n * Return the rendered skill body for a single connector.\n *\n * @param id - Connector ID.\n * @param shellAccess - When true, the adapter has access to shell tools; affects\n * the rendered CLI vs SDK tool call style in the skill body.\n * @throws {Error} if not connected or adapter doesn't implement describeSkill\n */\n loadSkill(id: string, shellAccess = true): string {\n const entry = this.connectors.get(id);\n if (!entry) throw new Error(`Connector not connected: ${id}`);\n const { adapter, handle, declaration } = entry;\n const descriptor = adapter.describeSkill\n ? adapter.describeSkill(handle, declaration)\n : buildDefaultSkillDescriptor(adapter, declaration, handle);\n const ops = adapter.describeOperations(handle);\n return buildSkillBody(descriptor, ops, shellAccess);\n }\n\n // ── Base CRUD dispatch (access-controlled) ─────────────────────────────────\n\n async read(id: string, path: string): Promise<ConnectorContent | null> {\n const { adapter, handle } = this.get(id);\n return this.withSpan(\n \"connector.read\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": adapter.name,\n \"skaile.connector.operation\": \"read\",\n },\n () => adapter.read(handle, path),\n );\n }\n\n async write(id: string, path: string, content: ConnectorContent): Promise<void> {\n const entry = this.get(id);\n if (entry.declaration.access === \"read-only\") {\n throw new Error(`Connector \"${id}\" is read-only`);\n }\n return this.withSpan(\n \"connector.write\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.adapter.name,\n \"skaile.connector.operation\": \"write\",\n },\n () => entry.adapter.write(entry.handle, path, content),\n );\n }\n\n async delete(id: string, path: string): Promise<boolean> {\n const entry = this.get(id);\n if (entry.declaration.access === \"read-only\") {\n throw new Error(`Connector \"${id}\" is read-only`);\n }\n return this.withSpan(\n \"connector.delete\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.adapter.name,\n \"skaile.connector.operation\": \"delete\",\n },\n () => entry.adapter.delete(entry.handle, path),\n );\n }\n\n async list(id: string, path?: string, options?: ListOptions): Promise<ConnectorEntry[]> {\n const { adapter, handle } = this.get(id);\n return this.withSpan(\n \"connector.list\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": adapter.name,\n \"skaile.connector.operation\": \"list\",\n },\n () => adapter.list(handle, path, options),\n );\n }\n\n async search(id: string, query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const { adapter, handle } = this.get(id);\n return this.withSpan(\n \"connector.search\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": adapter.name,\n \"skaile.connector.operation\": \"search\",\n },\n () => adapter.search(handle, query, options),\n );\n }\n\n // ── Custom operations ───────────────────────────────────────────────────────\n\n async executeOp(id: string, operation: string, args: Record<string, unknown>): Promise<string> {\n const entry = this.get(id);\n\n const ops = entry.adapter.describeOperations(entry.handle);\n const opDesc = ops.find((o) => o.name === operation);\n if (!opDesc) {\n throw new Error(\n `Connector \"${id}\" has no operation \"${operation}\". Available: ${ops.map((o) => o.name).join(\", \")}`,\n );\n }\n if (opDesc.accessLevel === \"write\" && entry.declaration.access === \"read-only\") {\n throw new Error(\n `Operation \"${operation}\" requires write access but connector \"${id}\" is read-only`,\n );\n }\n\n return this.withSpan(\n \"connector.executeOp\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.adapter.name,\n \"skaile.connector.operation\": operation,\n },\n () => entry.adapter.executeOp(entry.handle, operation, args),\n );\n }\n}\n","/**\n * Tool generation — builds agent tools from ConnectorManager state.\n *\n * Two outputs:\n * 1. SDK tool definitions (for Claude Agent SDK via createSdkMcpServer)\n * 2. System prompt section (for all agent frameworks)\n *\n * Fixed 7-tool surface (+ optional connector_exec when shell unavailable):\n * connector_list — enumerate live connectors with id, driver, access, ops\n * connector_load_skill — load full instructions for one connector\n * connector_read — read at path\n * connector_write — write at path\n * connector_list_entries — list entries\n * connector_search — search\n * connector_delete — delete at path\n * connector_exec — execute custom op (only when shellAccess=false)\n */\n\n// 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 { ConnectorManager } from \"./connector-manager.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n// ── Options ───────────────────────────────────────────────────────────────────\n\n/**\n * Options for `buildSdkConnectorTools`. Allows injecting a pre-loaded SDK and Zod instance,\n * and controls whether `connector_exec` is included when shell access is unavailable.\n * @docLink packages/connectors/api-reference#connector-tool-options\n */\nexport interface ConnectorToolOptions {\n /** Pre-loaded `@anthropic-ai/claude-agent-sdk` instance (optional; auto-imported if absent). */\n sdk?: any;\n /** Pre-loaded `zod` namespace (optional; uses static import if absent). */\n z?: any;\n /** Whether the agent has shell access. Defaults to true. When true, `connector_exec` is omitted. */\n shellAccess?: boolean;\n}\n\n/**\n * Options for `buildConnectorPromptSection`.\n * @docLink packages/connectors/api-reference#connector-prompt-options\n */\nexport interface ConnectorPromptOptions {\n /** Override driver type label shown in the prompt. */\n driverType?: string;\n /** Whether the agent has shell access. Defaults to true. Affects CLI vs SDK tool examples. */\n shellAccess?: boolean;\n}\n\n// ── SDK tool builder ──────────────────────────────────────────────────────────\n\n/**\n * Build an in-process MCP server exposing connector tools for the Claude Agent SDK.\n * Returns the server config to pass as `mcpServers` in the SDK query options.\n * Returns `null` if `@anthropic-ai/claude-agent-sdk` is not available.\n * @param manager - Connected `ConnectorManager`.\n * @param options - Optional SDK/Zod overrides and shell access flag.\n * @returns MCP server config object or `null`.\n * @docLink packages/connectors/api-reference#build-sdk-connector-tools\n */\nexport async function buildSdkConnectorTools(\n manager: ConnectorManager,\n options?: ConnectorToolOptions,\n): Promise<unknown | null> {\n const shellAccess = options?.shellAccess ?? true;\n\n let sdk: any = options?.sdk;\n if (!sdk) {\n try {\n sdk = await import(\"@anthropic-ai/claude-agent-sdk\");\n } catch {\n return null;\n }\n }\n\n const z: any = options?.z ?? zStatic;\n\n const tools: any[] = [];\n\n // ── Discovery ──\n\n tools.push({\n name: \"connector_list\",\n description:\n \"List all currently registered connectors with their id, driver, access mode, and available operations. Use this to discover connectors that may have been added after session start (e.g. shared-state stores like 'presence' or 'session' pushed by the host).\",\n inputSchema: {},\n handler: async () => {\n try {\n const entries = manager.listConnectors();\n return { content: [{ type: \"text\" as const, text: JSON.stringify(entries, null, 2) }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_load_skill\",\n description:\n \"Load full instructions for a specific connector into context. Returns a markdown document describing the connector and its available CLI commands.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID (use connector_list to enumerate)\"),\n },\n handler: async ({ connector_id }: { connector_id: string }) => {\n try {\n const body = manager.loadSkill(connector_id, shellAccess);\n return { content: [{ type: \"text\" as const, text: body }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n // ── Base CRUD ──\n\n tools.push({\n name: \"connector_read\",\n description:\n 'Read content from a connector by path. For KV stores, path is the key. For databases, path is \"table/pk\".',\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) => {\n try {\n const content = await manager.read(connector_id, path);\n return {\n content: [{ type: \"text\" as const, text: content?.data?.toString() ?? \"(empty)\" }],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_write\",\n description: \"Write content to a connector at a path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().describe(\"Path within the connector\"),\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 }) => {\n try {\n await manager.write(connector_id, path, { data: content });\n return { content: [{ type: \"text\" as const, text: \"Written.\" }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_list_entries\",\n description: \"List entries in a connector (files, keys, rows, etc).\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().optional().describe(\"Path prefix or directory\"),\n recursive: z.boolean().optional().describe(\"Include nested entries\"),\n },\n handler: async ({\n connector_id,\n path,\n recursive,\n }: {\n connector_id: string;\n path?: string;\n recursive?: boolean;\n }) => {\n try {\n const entries = await manager.list(connector_id, path, { recursive });\n return { content: [{ type: \"text\" as const, text: JSON.stringify(entries, null, 2) }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_search\",\n description: \"Search within a connector for matching content.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) => {\n try {\n const results = await manager.search(connector_id, query);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(results, null, 2) }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_delete\",\n description: \"Delete an entry from a connector.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().describe(\"Path to delete\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) => {\n try {\n const ok = await manager.delete(connector_id, path);\n return { content: [{ type: \"text\" as const, text: ok ? \"Deleted.\" : \"Not found.\" }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n // ── Fallback: connector_exec (only when no shell access) ──\n\n if (!shellAccess) {\n tools.push({\n name: \"connector_exec\",\n description:\n \"Execute a custom connector operation by name. Use only when shell access is unavailable. Load the connector skill first to see available operations and their arguments.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n operation: z.string().describe(\"Operation name (e.g. 'send_message', 'query')\"),\n args: z\n .record(z.unknown())\n .describe(\"Named arguments for the operation (without -- prefix)\"),\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 }) => {\n try {\n const result = await manager.executeOp(connector_id, operation, args);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n }\n\n return sdk.createSdkMcpServer({ name: \"skaile-connectors\", tools });\n}\n\n// ── System prompt section builder ─────────────────────────────────────────────\n\n/**\n * Build a markdown section describing available connectors for the agent's system prompt.\n * Included for all agent frameworks (SDK and CLI). Adapts tool call syntax based on `shellAccess`.\n * @param manager - Connected `ConnectorManager`.\n * @param options - Optional driver type label and shell access flag.\n * @returns Markdown string or an empty string when no connectors are active.\n * @docLink packages/connectors/api-reference#build-connector-prompt-section\n */\nexport function buildConnectorPromptSection(\n manager: ConnectorManager,\n options?: ConnectorPromptOptions | string,\n): string {\n // Support legacy string argument for backwards compatibility\n const opts: ConnectorPromptOptions =\n typeof options === \"string\" ? { driverType: options } : (options ?? {});\n\n const resources = manager.listConnectors();\n if (resources.length === 0) return \"\";\n\n const shellAccess = opts.shellAccess ?? true;\n const lines: string[] = [\"## Connectors\", \"\"];\n\n lines.push(\"Currently registered connectors (id — driver, access):\");\n for (const r of resources) {\n lines.push(`- \\`${r.id}\\` — ${r.driver}, ${r.access}`);\n }\n lines.push(\"\");\n lines.push(\n \"Additional connectors may be registered mid-session by the host — notably shared-state stores (driver: `xstate-store`, e.g. `session`, `presence`, per-component stores). Re-enumerate with `connector_list` whenever you need the live set.\",\n );\n lines.push(\"\");\n\n if (shellAccess) {\n lines.push(\"Discover connectors:\");\n lines.push(\"- `connector_list` tool — returns the live connector set as JSON.\");\n lines.push(\"- `skaile connector list` (CLI) — shell equivalent.\");\n lines.push(\"- `skaile connector <id> --ops` — list a connector's operations.\");\n lines.push(\n \"Call the `connector_load_skill` tool to load a connector's full instructions into context.\",\n );\n lines.push(\n \"Interact with connectors via their CLI commands (see loaded skill body for exact syntax).\",\n );\n } else {\n lines.push(\"Discover connectors with the `connector_list` tool (returns live JSON).\");\n lines.push(\n \"Call the `connector_load_skill` tool to load a connector's full instructions into context.\",\n );\n lines.push(\n \"Use the `connector_exec` tool to execute connector operations — do not use CLI commands.\",\n );\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * AbstractMountDriver — base class for mount drivers.\n *\n * Extend this class to register with MountManager via registerMountDriver().\n * Provides a default no-op watch() implementation — override to emit filesystem\n * change events when the driver supports them.\n *\n * Subclasses MUST implement: mount, unmount, sync.\n * Lifecycle hooks (onHibernate, onSessionClose) have no-op defaults.\n */\n\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport type { MountDeclaration, MountDriver, MountHandle, TokenMediator } from \"../mount-types.js\";\nimport type { SecretProvider } from \"../secrets.js\";\nimport type { SyncOptions, SyncResult } from \"../shared-types.js\";\n\nexport abstract class AbstractMountDriver implements MountDriver {\n abstract readonly name: string;\n\n /**\n * Per-instance logger. Initialised to a placeholder; replaced by MountManager\n * via setLogger() with `{ kind:\"mount\", subkind:<driver>, instance:<id> }`\n * once the declaration is known. Use `this.log.info/warn/error/debug` from\n * any driver method.\n */\n protected log: Logger = createLogger({ kind: \"mount\", subkind: \"unknown\" });\n\n setLogger(logger: Logger): void {\n this.log = logger;\n }\n\n /**\n * Mount the source content into targetDir and return a handle.\n * Implementations should create targetDir if it doesn't exist.\n *\n * @param declaration - Mount configuration from skaile.yaml\n * @param targetDir - Absolute path to the directory where content will be mounted\n * @param secrets - Secret provider for resolving credential references\n * @param tokenMediator - Optional callback for `auth: backend` mounts to\n * request short-lived tokens from the platform's credential mediator.\n */\n abstract mount(\n declaration: MountDeclaration,\n targetDir: string,\n secrets?: SecretProvider,\n tokenMediator?: TokenMediator,\n ): Promise<MountHandle>;\n /** Unmount and release all resources held by this mount. */\n abstract unmount(handle: MountHandle): Promise<void>;\n /** Pull the latest remote state into the mounted directory. */\n abstract sync(handle: MountHandle, options?: SyncOptions): Promise<SyncResult>;\n\n async onHibernate(_handle: MountHandle): Promise<string | undefined> {\n return undefined;\n }\n async onSessionClose(_handle: MountHandle): Promise<string | undefined> {\n return undefined;\n }\n\n protected makeHandle(\n declaration: MountDeclaration,\n mountPath: string,\n state: unknown,\n ): MountHandle {\n return {\n id: declaration.id,\n driver: this.name,\n access: declaration.access,\n mountPath,\n mounted: true,\n state,\n };\n }\n}\n","/**\n * LogBuffer — fixed-capacity ring buffer for capturing process stdout/stderr lines.\n * When the buffer is full, the oldest lines are evicted (FIFO).\n * @docLink packages/connectors/api-reference#log-buffer\n */\n\nexport class LogBuffer {\n private readonly lines: string[] = [];\n private readonly capacity: number;\n\n constructor(capacity = 500) {\n this.capacity = capacity;\n }\n\n /** Append a single line. */\n push(line: string): void {\n this.lines.push(line);\n if (this.lines.length > this.capacity) {\n this.lines.shift();\n }\n }\n\n /** Split text on newlines and push each line (preserves empty lines). */\n pushLines(text: string): void {\n const lines = text.split(\"\\n\");\n // Avoid pushing a trailing empty string from \"text\\n\".split(\"\\n\")\n for (let i = 0; i < lines.length; i++) {\n if (i === lines.length - 1 && lines[i] === \"\") break;\n this.push(lines[i]!);\n }\n }\n\n /** Return the last `n` lines. */\n tail(n: number): string[] {\n return this.lines.slice(-n);\n }\n\n /** Clear all stored lines. */\n clear(): void {\n this.lines.length = 0;\n }\n\n /** Current number of stored lines. */\n get size(): number {\n return this.lines.length;\n }\n}\n","/**\n * Credential helper script renderer — generates a POSIX `sh` script that git\n * invokes via `credential.<urlPrefix>.helper = !sh <path>` to fetch credentials\n * for a Tier-2 git mount.\n *\n * The script implements the wake-mid-401 hardening described in\n * `_devlog/specs/2026-05-07-unified-credential-mediation.md` § Step 9a:\n *\n * 1. On `op = get`, stat the credentials file and compute its age (mtime).\n * 2. If age > triggerAgeSec, touch the refresh-flag file. The runner watches\n * this path via `fs.watch` and mints a fresh access token + rewrites the\n * credentials file when it sees the change.\n * 3. Poll the credentials file's mtime in 200ms increments until the mtime\n * advances OR waitTimeoutMs elapses.\n * 4. Translate the credentials file (`scheme://user:pass@host <tag>` lines —\n * git's `store --file=` format) into the helper-output format git\n * expects (`username=<value>\\npassword=<value>\\n`). Filters lines by the\n * mount's url-prefix tag so multi-mount workspaces stay isolated.\n *\n * **Cross-platform**: targets POSIX `sh` (Linux + macOS). Avoids bashisms so\n * `dash`, `ash`, and `busybox sh` all work. The two GNU/BSD divergence points\n * are handled inline:\n *\n * - `stat -c %Y <file>` (GNU/Linux) vs `stat -f %m <file>` (BSD/macOS) —\n * try GNU first, fall back to BSD, default to 0.\n * - `sleep 0.2` is non-portable — use `usleep 200000` when present, else\n * fall back to `sleep 1`.\n *\n * The credentials file format is unchanged (Option B in the Step 9a plan):\n * `scheme://user:pass@host <tag>` per mount, written by `writeMountBlock`.\n * The helper script does the translation to `username=<>\\npassword=<>\\n`\n * inline so we don't have to change the on-disk format and break Step 1A\n * back-compat.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md`.\n */\n\n/** Required arguments for {@link renderCredentialHelperScript}. */\nexport interface RenderHelperOpts {\n /** Absolute path to the per-mount credentials file. */\n credentialsPath: string;\n /**\n * Absolute path to the workspace-level refresh-request flag file. The\n * runner watches this file via `fs.watch` and triggers a token refresh on\n * `change`.\n */\n refreshFlagPath: string;\n /**\n * Tag emitted by `writeMountBlock` on the credential line for this mount\n * (e.g. `# skaile-mount: workspace`). The helper greps for lines ending in\n * this tag so concurrent mounts in the same credentials file stay isolated.\n */\n credentialTag: string;\n /**\n * Touch the refresh-flag if the credentials file is older than this (in\n * seconds). Default: 300 (5 minutes — comfortably shorter than the typical\n * 1-hour Anthropic OAuth lifetime, well clear of the 5-minute pre-expiry\n * refresh window scheduled by the driver).\n */\n triggerAgeSec?: number;\n /**\n * Maximum time to wait for the credentials file mtime to advance after\n * touching the refresh-flag (in milliseconds). Default: 5000 (5 seconds —\n * long enough for the runner's debounced watcher + token mediator round-\n * trip; short enough that a stuck backend doesn't block git for minutes).\n */\n waitTimeoutMs?: number;\n}\n\n/**\n * Render the credential-helper script body. The returned string should be\n * written to disk with mode `0755` (owner rwx, group/other rx) so git can\n * execute it.\n *\n * `git` invokes credential helpers with one of three operations as `$1`:\n * - `get` — read credentials. We respond with the helper-output format.\n * - `store` — git wants us to remember a credential. We're a one-way\n * read-only helper; ignore.\n * - `erase` — git wants us to forget a credential. Same — ignore.\n *\n * Only `get` triggers the refresh-flag dance. Other ops exit silently with 0\n * so git falls back to the next helper in the chain (or its own prompt).\n *\n * The script also drains stdin on `get` because git always pipes the request\n * envelope (host, protocol, path, etc.) into the helper's stdin. Leaving it\n * unread can wedge git's helper FD.\n */\nexport function renderCredentialHelperScript(opts: RenderHelperOpts): string {\n const triggerAgeSec = opts.triggerAgeSec ?? 300;\n const waitTimeoutMs = opts.waitTimeoutMs ?? 5_000;\n // Round timeout up to whole seconds for the `sleep 1` fallback path.\n const waitTimeoutSec = Math.max(1, Math.ceil(waitTimeoutMs / 1_000));\n\n // Embed paths verbatim. Operators are responsible for not including funky\n // characters in their workspace path; we already control these (they live\n // under `<projectDir>/.skaile/`).\n const credPath = opts.credentialsPath;\n const flagPath = opts.refreshFlagPath;\n const tag = opts.credentialTag;\n\n return `#!/bin/sh\n# Generated by skaile-runner -- do not edit.\n# Tier-2 git credential helper: serves the latest cached token and triggers a\n# wake-mid-401 refresh when the credentials file is older than ${triggerAgeSec}s.\n# Spec: _devlog/specs/2026-05-07-unified-credential-mediation.md\n\nset -u\n\nop=\"\\${1:-}\"\n# 'store' and 'erase' are no-ops -- this is a read-only helper. Other ops\n# (none today) also bail silently so we don't break future git versions.\n[ \"$op\" = \"get\" ] || exit 0\n\nCRED_FILE='${credPath}'\nFLAG_FILE='${flagPath}'\nTAG='${tag}'\n\n# Drain stdin: git always pipes the request envelope. Leaving it unread can\n# wedge git's helper FD. We don't actually need any of it -- the credentials\n# file already keys by URL prefix via the helper's gitconfig block.\ncat > /dev/null 2>&1 || true\n\n# Bail silently if the credentials file is missing or empty: git falls\n# through to the next helper or its own prompt.\n[ -s \"$CRED_FILE\" ] || exit 0\n\n# Cross-platform mtime in epoch seconds: GNU stat -c first (Linux), then BSD\n# stat -f (macOS), then 0 if neither is present (in which case we skip the\n# refresh-flag dance entirely and just serve what we have).\nget_mtime() {\n stat -c %Y \"$1\" 2>/dev/null || stat -f %m \"$1\" 2>/dev/null || echo 0\n}\n\nnow=$(date +%s 2>/dev/null || echo 0)\nmtime=$(get_mtime \"$CRED_FILE\")\nage=$((now - mtime))\n\nif [ \"$age\" -gt ${triggerAgeSec} ]; then\n # Touch the refresh-flag (atomic open+close emits 'change' to fs.watch).\n : > \"$FLAG_FILE\" 2>/dev/null || true\n\n # Poll for the credentials file mtime to advance. usleep gives sub-second\n # resolution where available; sleep 1 is the portable fallback.\n end=$((now + ${waitTimeoutSec}))\n while :; do\n cur=$(date +%s 2>/dev/null || echo 0)\n if [ \"$cur\" -ge \"$end\" ]; then\n break\n fi\n new_mtime=$(get_mtime \"$CRED_FILE\")\n if [ \"$new_mtime\" -gt \"$mtime\" ]; then\n break\n fi\n if command -v usleep >/dev/null 2>&1; then\n usleep 200000\n else\n sleep 1\n fi\n done\nfi\n\n# Find the credential line for THIS mount (matched by the trailing tag) and\n# translate from git's 'store --file=' format ('scheme://user:pass@host <tag>')\n# into the helper-output format ('username=<>\\\\npassword=<>\\\\n'). If there's\n# more than one matching line (shouldn't happen but defence-in-depth), we\n# take the last one (most recently written).\nline=$(grep -F \" $TAG\" \"$CRED_FILE\" 2>/dev/null | tail -n 1)\n[ -n \"$line\" ] || exit 0\n\n# Strip the trailing ' <TAG>' from the URL.\nurl=\\${line% *}\n# Extract user:pass between scheme:// and @host.\n# scheme://user:pass@host -> user:pass\nuserinfo=\\${url#*://}\nuserinfo=\\${userinfo%@*}\nuser=\\${userinfo%%:*}\npass=\\${userinfo#*:}\n\n# git wants line-oriented key=value pairs followed by a blank line.\nprintf 'username=%s\\\\n' \"$user\"\nprintf 'password=%s\\\\n' \"$pass\"\nprintf '\\\\n'\n`;\n}\n","/**\n * Managed gitconfig writer — runner-managed credential helper config for\n * Tier-2 mount credentials.\n *\n * The runner exposes `<workspace>/.skaile/managed-gitconfig` to the agent\n * process via `GIT_CONFIG_GLOBAL` (with a fallback `[include]` in\n * `~/.gitconfig`). Each Tier-2 mount writes a tagged block into this file\n * pointing `credential.<urlPrefix>.helper` at the shared `git-credentials`\n * store, plus a single line into the credentials store carrying the actual\n * token. Refresh = atomically rewrite the credential line; the helper picks\n * up the new token on the next git network op.\n *\n * Keying is by **URL prefix**, not bare host: two mounts on `github.com`\n * with disjoint org prefixes (`https://github.com/orgA/`,\n * `https://github.com/orgB/`) coexist via narrower\n * `credential.<prefix>.helper` entries. Same prefix declared by two mounts\n * with different tokens is a true collision and throws\n * {@link ManagedGitconfigCollisionError}.\n *\n * Spec: `_devlog/specs/2026-05-05-git-credential-tiers.md`.\n */\n\nimport {\n chmodSync,\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n writeSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\n/**\n * Thrown when two mounts try to register a credential helper for the same\n * URL prefix with different tokens. The operator must either narrow the URL\n * prefixes (per-org paths) or consolidate the mounts.\n */\nexport class ManagedGitconfigCollisionError extends Error {\n readonly urlPrefix: string;\n readonly existingMountId: string;\n readonly newMountId: string;\n\n constructor(urlPrefix: string, existingMountId: string, newMountId: string) {\n super(\n `Mount '${newMountId}' tried to register URL prefix '${urlPrefix}' ` +\n `but mount '${existingMountId}' already owns it with a different credential. ` +\n `Narrow the prefixes (e.g. include the org segment) or consolidate the mounts.`,\n );\n this.name = \"ManagedGitconfigCollisionError\";\n this.urlPrefix = urlPrefix;\n this.existingMountId = existingMountId;\n this.newMountId = newMountId;\n }\n}\n\n/** Required arguments for {@link writeMountBlock}. */\nexport interface WriteMountBlockOptions {\n /** Mount declaration id; used as the block tag. */\n mountId: string;\n /**\n * URL prefix the credential should authenticate, e.g.\n * `https://github.com` or `https://github.com/orgA/`. Trailing slashes are\n * preserved verbatim (git treats them as different scopes).\n */\n urlPrefix: string;\n /**\n * The token to expose. Written to {@link credentialsPath} as\n * `https://x-access-token:<token>@<host>` for the helper to read.\n */\n token: string;\n /** Absolute path to the managed-gitconfig file. */\n gitconfigPath: string;\n /** Absolute path to the git-credentials store. */\n credentialsPath: string;\n /**\n * Optional: when set, the credential block points `helper = !sh <path>` at\n * this script instead of the static `store --file=` form. The script is\n * the wake-mid-401 helper rendered by `renderCredentialHelperScript` —\n * stats the credentials file's mtime, touches a refresh-flag if the cached\n * token is stale, and translates the `store --file=` line format into the\n * helper-output format git expects.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md` Step 9a.\n */\n helperScriptPath?: string;\n}\n\n/** Required arguments for {@link removeMountBlock}. */\nexport interface RemoveMountBlockOptions {\n /** Mount declaration id whose block should be removed. */\n mountId: string;\n /** Absolute path to the managed-gitconfig file. */\n gitconfigPath: string;\n /** Absolute path to the git-credentials store. */\n credentialsPath: string;\n}\n\n/** Required arguments for {@link atomicReplaceCredential}. */\nexport interface AtomicReplaceCredentialOptions {\n /** Mount id (used to find the matching credential line). */\n mountId: string;\n /** URL prefix the credential is keyed by. Same value passed to writeMountBlock. */\n urlPrefix: string;\n /** New token to install. */\n token: string;\n /** Absolute path to the git-credentials store. */\n credentialsPath: string;\n}\n\n// ── Block markers ────────────────────────────────────────────────────────────\n\nconst blockStart = (mountId: string) => `# skaile-mount: ${mountId}`;\nconst blockEnd = (mountId: string) => `# skaile-mount: ${mountId} (end)`;\nconst credentialTag = (mountId: string) => `# skaile-mount: ${mountId}`;\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction readFileOrEmpty(path: string): string {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Write a string atomically: tmp file in the same dir, then rename. POSIX\n * rename is atomic on the same filesystem, which is the property we need\n * for refresh-time replacement.\n */\nfunction atomicWrite(path: string, content: string, mode: number): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n const tmp = `${path}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;\n const fd = openSync(tmp, \"w\", mode);\n try {\n writeSync(fd, content);\n } finally {\n closeSync(fd);\n }\n // Some filesystems honor O_CREAT mode but ignore later edits; reassert.\n chmodSync(tmp, mode);\n renameSync(tmp, path);\n}\n\n/**\n * Extract the `[mountId, content]` block list from a managed-gitconfig file.\n * Anything outside a recognized block is returned as a single anonymous\n * `[\"\", content]` entry to preserve unknown lines on rewrite. This keeps the\n * function idempotent against an empty / hand-edited file.\n */\nfunction parseBlocks(text: string): Array<{ mountId: string; lines: string[] }> {\n const blocks: Array<{ mountId: string; lines: string[] }> = [];\n let current: { mountId: string; lines: string[] } | null = null;\n\n for (const line of text.split(\"\\n\")) {\n const startMatch = line.match(/^# skaile-mount: (\\S+)$/);\n const endMatch = line.match(/^# skaile-mount: (\\S+) \\(end\\)$/);\n\n if (startMatch) {\n if (current) blocks.push(current);\n current = { mountId: startMatch[1] ?? \"\", lines: [line] };\n continue;\n }\n if (endMatch) {\n if (current) {\n current.lines.push(line);\n blocks.push(current);\n current = null;\n }\n continue;\n }\n if (current) {\n current.lines.push(line);\n } else {\n // Foreign content (user edits, leading blank lines). Keep it out of any\n // block by stashing under the special \"\" id.\n const last = blocks[blocks.length - 1];\n if (last && last.mountId === \"\") {\n last.lines.push(line);\n } else {\n blocks.push({ mountId: \"\", lines: [line] });\n }\n }\n }\n if (current) blocks.push(current);\n\n // Trim trailing empty foreign block.\n while (blocks.length > 0) {\n const last = blocks[blocks.length - 1];\n if (last && last.mountId === \"\" && last.lines.every((l) => l.trim() === \"\")) {\n blocks.pop();\n } else {\n break;\n }\n }\n return blocks;\n}\n\nfunction renderBlocks(blocks: Array<{ mountId: string; lines: string[] }>): string {\n if (blocks.length === 0) return \"\";\n // Join lines, preserving the per-block lines structure. Make sure file ends\n // with a single trailing newline so git's parser is happy.\n const out = blocks.map((b) => b.lines.join(\"\\n\")).join(\"\\n\");\n return out.endsWith(\"\\n\") ? out : `${out}\\n`;\n}\n\nfunction buildBlock(\n mountId: string,\n urlPrefix: string,\n credentialsPath: string,\n helperScriptPath?: string,\n): string[] {\n // Step 9a: when a helperScriptPath is provided, point at the dynamic\n // wake-mid-401 helper instead of the static `store --file=` form. The\n // helper handles stale-token detection + refresh-flag dance and translates\n // the on-disk format into git's helper-output format. See\n // `credential-helper-script.ts`.\n const helperLine = helperScriptPath\n ? `\\thelper = !sh ${helperScriptPath}`\n : `\\thelper = store --file=${credentialsPath}`;\n return [blockStart(mountId), `[credential \"${urlPrefix}\"]`, helperLine, blockEnd(mountId)];\n}\n\nfunction buildCredentialLine(urlPrefix: string, token: string, mountId: string): string {\n // Strip a trailing slash so the credential URL matches what git emits when\n // it queries the helper. Git stores credentials as `scheme://user:pass@host`\n // with no path component.\n const u = new URL(urlPrefix);\n const host = u.host;\n const scheme = u.protocol.replace(/:$/, \"\");\n return `${scheme}://x-access-token:${token}@${host} ${credentialTag(mountId)}`;\n}\n\nfunction readCredentialLines(path: string): string[] {\n return readFileOrEmpty(path)\n .split(\"\\n\")\n .filter((l) => l.length > 0);\n}\n\nfunction writeCredentialLines(path: string, lines: string[]): void {\n const content = lines.length > 0 ? `${lines.join(\"\\n\")}\\n` : \"\";\n // Mode 0640: owner (skaile-runner) read+write, group (skaile) read-only.\n // Under UID separation (Step 4 of git-credential-tiers), the runner runs as\n // skaile-runner with primary group skaile so the agent process (uid skaile)\n // can read the credentials store via group membership while only the runner\n // can rewrite it.\n atomicWrite(path, content, 0o640);\n}\n\nfunction findExistingBlock(\n blocks: Array<{ mountId: string; lines: string[] }>,\n mountId: string,\n): { mountId: string; lines: string[] } | undefined {\n return blocks.find((b) => b.mountId === mountId);\n}\n\nfunction blockUrlPrefix(block: { lines: string[] }): string | undefined {\n for (const line of block.lines) {\n const m = line.match(/^\\[credential \"(.+)\"\\]$/);\n if (m) return m[1];\n }\n return undefined;\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Write a credential-helper block for `mountId` into the managed-gitconfig\n * file, and (re)write the matching line in the git-credentials store.\n * Idempotent: re-running with the same arguments is a no-op aside from\n * refreshing the on-disk token. Detects collisions where another mount\n * already owns the same `urlPrefix` and throws\n * {@link ManagedGitconfigCollisionError}.\n *\n * Files are created with mode `0640` — owner (skaile-runner) read+write,\n * group (skaile) read-only. See {@link writeCredentialLines} for the\n * UID-separation rationale.\n */\nexport function writeMountBlock(opts: WriteMountBlockOptions): void {\n const { mountId, urlPrefix, token, gitconfigPath, credentialsPath, helperScriptPath } = opts;\n\n // ── Gitconfig: insert/replace the tagged block ──────────────────────────\n const text = readFileOrEmpty(gitconfigPath);\n const blocks = parseBlocks(text);\n\n // Collision check: any *other* mount block declaring the same urlPrefix?\n for (const b of blocks) {\n if (b.mountId === \"\" || b.mountId === mountId) continue;\n const otherPrefix = blockUrlPrefix(b);\n if (otherPrefix === urlPrefix) {\n throw new ManagedGitconfigCollisionError(urlPrefix, b.mountId, mountId);\n }\n }\n\n const newBlock = {\n mountId,\n lines: buildBlock(mountId, urlPrefix, credentialsPath, helperScriptPath),\n };\n const existing = findExistingBlock(blocks, mountId);\n if (existing) {\n existing.lines = newBlock.lines;\n } else {\n blocks.push(newBlock);\n }\n atomicWrite(gitconfigPath, renderBlocks(blocks), 0o640);\n\n // ── Credentials store: insert/replace the tagged line ───────────────────\n const lines = readCredentialLines(credentialsPath);\n const tag = credentialTag(mountId);\n const filtered = lines.filter((l) => !l.endsWith(tag));\n filtered.push(buildCredentialLine(urlPrefix, token, mountId));\n writeCredentialLines(credentialsPath, filtered);\n}\n\n/**\n * Remove the block tagged for `mountId` from the managed-gitconfig file and\n * the matching credential line. Best-effort: missing files / missing block\n * are not errors.\n */\nexport function removeMountBlock(opts: RemoveMountBlockOptions): void {\n const { mountId, gitconfigPath, credentialsPath } = opts;\n\n // ── Gitconfig ──\n const text = readFileOrEmpty(gitconfigPath);\n if (text.length > 0) {\n const blocks = parseBlocks(text).filter((b) => b.mountId !== mountId);\n atomicWrite(gitconfigPath, renderBlocks(blocks), 0o640);\n }\n\n // ── Credentials ──\n const lines = readCredentialLines(credentialsPath);\n const tag = credentialTag(mountId);\n const filtered = lines.filter((l) => !l.endsWith(tag));\n if (filtered.length !== lines.length) {\n writeCredentialLines(credentialsPath, filtered);\n }\n}\n\n/**\n * Write (or refresh) the credential-helper script at `scriptPath` with mode\n * `0755` so git can execute it via `helper = !sh <scriptPath>`. Idempotent —\n * re-rendering with identical opts produces the same script body, so re-runs\n * are safe. Atomic rename so a concurrent git invocation never sees a\n * half-written file.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md` Step 9a.\n */\nexport function writeHelperScript(scriptPath: string, body: string): void {\n // Mode 0755: owner rwx, group/other rx — git executes the script as the\n // agent uid which is in the skaile group; rx for group is the safer choice\n // than rx for other.\n atomicWrite(scriptPath, body, 0o755);\n}\n\n/**\n * Replace just the credential line for `mountId` atomically — refresh path.\n * The gitconfig block (which only points at the helper) does not need to\n * change; the helper re-reads the credentials file on every git network op.\n *\n * Throws if no existing line is found for `mountId` — the caller is\n * expected to have written the initial block via {@link writeMountBlock}.\n */\nexport function atomicReplaceCredential(opts: AtomicReplaceCredentialOptions): void {\n const { mountId, urlPrefix, token, credentialsPath } = opts;\n const lines = readCredentialLines(credentialsPath);\n const tag = credentialTag(mountId);\n const without = lines.filter((l) => !l.endsWith(tag));\n if (without.length === lines.length) {\n throw new Error(\n `atomicReplaceCredential: no existing credential line for mount '${mountId}' in ${credentialsPath}`,\n );\n }\n without.push(buildCredentialLine(urlPrefix, token, mountId));\n writeCredentialLines(credentialsPath, without);\n}\n","/**\n * LocalDriver — passthrough to a local directory.\n * Mount copies (or symlinks) a source directory into the volume mount point.\n */\n\nimport { cpSync, existsSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { SecretProvider } from \"@skaile/workspaces/connectors\";\nimport type {\n SyncOptions,\n SyncResult,\n WatchHandle,\n WatchOptions,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n MountChangeEvent,\n MountDeclaration,\n MountHandle,\n} from \"@skaile/workspaces/connectors\";\nimport { createFsWatcher } from \"@skaile/workspaces/connectors\";\nimport { AbstractMountDriver } from \"@skaile/workspaces/connectors\";\n\ninterface LocalState {\n /** Resolved absolute path to the source directory. */\n sourceDir: string;\n}\n\n/**\n * Mount driver for local filesystem directories — copies the source directory into the mount target on mount and syncs on demand.\n * No external dependencies; ideal for development and local file access.\n * @docLink packages/base-assets/concepts#local-mount\n */\nexport class LocalDriver extends AbstractMountDriver {\n readonly name = \"local\";\n\n async mount(\n declaration: MountDeclaration,\n targetDir: string,\n _secrets?: SecretProvider,\n ): Promise<MountHandle> {\n const started = Date.now();\n this.log.info(\"mount start\", { source: declaration.source, targetDir });\n const sourceDir = resolve(String(declaration.source));\n if (!existsSync(sourceDir)) {\n this.log.error(\"mount failed: source path does not exist\", undefined, {\n sourceDir,\n });\n throw new Error(`Local source path does not exist: ${sourceDir}`);\n }\n\n mkdirSync(targetDir, { recursive: true });\n\n // Copy source to target (skip if same path or target inside source)\n const src = resolve(sourceDir);\n const tgt = resolve(targetDir);\n if (src !== tgt && !tgt.startsWith(`${src}/`)) {\n cpSync(src, tgt, { recursive: true });\n }\n\n this.log.info(\"mount ok\", { targetDir, durationMs: Date.now() - started });\n return this.makeHandle(declaration, targetDir, { sourceDir } satisfies LocalState);\n }\n\n async unmount(_handle: MountHandle): Promise<void> {\n this.log.info(\"unmount\");\n // No-op for local filesystem — don't delete the mount directory\n }\n\n async sync(handle: MountHandle, _options?: SyncOptions): Promise<SyncResult> {\n this.log.debug(\"sync start\");\n const { sourceDir } = handle.state as LocalState;\n const src = resolve(sourceDir);\n const tgt = resolve(handle.mountPath);\n\n if (src === tgt || tgt.startsWith(`${src}/`)) {\n this.log.debug(\"sync ok (no-op: source equals target)\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n mkdirSync(handle.mountPath, { recursive: true });\n cpSync(src, handle.mountPath, { recursive: true });\n\n this.log.debug(\"sync ok\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n watch(\n handle: MountHandle,\n callback: (event: MountChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle {\n let fsWatcher: WatchHandle | null = null;\n\n createFsWatcher(handle.mountPath, callback, options).then((w) => {\n fsWatcher = w;\n });\n\n return {\n close: async () => {\n await fsWatcher?.close();\n },\n };\n }\n}\n\n/**\n * Creates a new LocalDriver instance.\n * @returns Configured LocalDriver ready to be registered in the mount registry.\n * @docLink packages/base-assets/api-reference#local-mount-factory\n */\nexport function createDriver(): LocalDriver {\n return new LocalDriver();\n}\n","/**\n * GitDriver — git repository volume.\n * Mounts a git repo by cloning/pulling to a local directory.\n * Session-aware: auto-branching, lifecycle hooks (hibernate/close), periodic fetch/rebase.\n */\n\nimport { execSync } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { resolveAuthRef } from \"@skaile/workspaces/connectors\";\nimport type {\n MountAuthRef,\n SecretProvider,\n TokenMediator,\n TokenMediatorResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n SyncOptions,\n SyncResult,\n WatchHandle,\n WatchOptions,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n MountChangeEvent,\n MountDeclaration,\n MountHandle,\n} from \"@skaile/workspaces/connectors\";\nimport { createFsWatcher } from \"@skaile/workspaces/connectors\";\nimport { AbstractMountDriver } from \"@skaile/workspaces/connectors\";\nimport {\n atomicReplaceCredential,\n removeMountBlock,\n renderCredentialHelperScript,\n writeHelperScript,\n writeMountBlock,\n} from \"@skaile/workspaces/connectors\";\n\n// ── Session/sync/lifecycle config parsed from declaration.options ────────────\n\ninterface GitSessionConfig {\n enabled: boolean;\n slug?: string;\n isMain: boolean;\n branchPrefix: string;\n}\n\ninterface GitSyncConfig {\n fetchIntervalSec: number;\n autoRebase: boolean;\n autoPull: boolean;\n}\n\ninterface GitLifecycleConfig {\n commitOnHibernate: boolean;\n pushOnHibernate: boolean;\n mergeOnClose: boolean;\n pushOnClose: boolean;\n /** Auto-commit after N ms of no file changes. 0 = disabled. Default: 30000 (30s). */\n autoCommitIdleMs: number;\n /** Push to remote after each auto-commit. */\n pushAfterCommit: boolean;\n}\n\ninterface GitState {\n /** URL of the remote repository. */\n url: string;\n /** Base branch to track (e.g. \"main\"). */\n branch: string;\n /** Active branch (may differ from base when session branching is active). */\n activeBranch: string;\n /** Auth token for HTTPS URLs. */\n token?: string;\n /** Session branching config. */\n session: GitSessionConfig;\n /** Periodic fetch/rebase config. */\n sync: GitSyncConfig;\n /** Lifecycle hook config. */\n lifecycle: GitLifecycleConfig;\n /** Periodic fetch timer ID. */\n fetchTimer?: ReturnType<typeof setInterval>;\n /** Auto-commit idle timer ID. */\n autoCommitTimer?: ReturnType<typeof setTimeout>;\n /** Callback for emitting change events (set by watch()). */\n emitChange?: (event: MountChangeEvent) => void;\n /**\n * Tier-2 managed-gitconfig paths populated when `exposeAccessToken` is on.\n * Cleared on `unmount`/`onSessionClose` so the credential is removed\n * promptly. Absent for Tier-1 mounts.\n */\n managedGitconfig?: {\n gitconfigPath: string;\n credentialsPath: string;\n urlPrefix: string;\n };\n /**\n * Token mediator captured at mount time for use by refresh ticks. Only\n * populated for `auth: backend` mounts; absent for `pat:` and anonymous\n * mounts.\n */\n tokenMediator?: TokenMediator;\n /**\n * Active refresh timer. Set only when the resolved token came from the\n * backend mediator and carried a finite expiry. Cleared on every\n * reschedule and on teardown.\n */\n refreshTimer?: ReturnType<typeof setTimeout>;\n}\n\nfunction parseSessionConfig(opts: Record<string, unknown> | undefined): GitSessionConfig {\n const raw = (opts?.session as Record<string, unknown>) ?? {};\n return {\n enabled: Boolean(raw.enabled ?? false),\n slug: raw.slug != null ? String(raw.slug) : undefined,\n isMain: Boolean(raw.isMain ?? true),\n branchPrefix: String(raw.branchPrefix ?? \"session/\"),\n };\n}\n\nfunction parseSyncConfig(opts: Record<string, unknown> | undefined): GitSyncConfig {\n const raw = (opts?.sync as Record<string, unknown>) ?? {};\n return {\n fetchIntervalSec: Number(raw.fetchIntervalSec ?? 0),\n autoRebase: Boolean(raw.autoRebase ?? false),\n autoPull: Boolean(raw.autoPull ?? false),\n };\n}\n\nfunction parseLifecycleConfig(opts: Record<string, unknown> | undefined): GitLifecycleConfig {\n const raw = (opts?.lifecycle as Record<string, unknown>) ?? {};\n return {\n commitOnHibernate: Boolean(raw.commitOnHibernate ?? true),\n pushOnHibernate: Boolean(raw.pushOnHibernate ?? true),\n mergeOnClose: Boolean(raw.mergeOnClose ?? true),\n pushOnClose: Boolean(raw.pushOnClose ?? true),\n autoCommitIdleMs: Number(raw.autoCommitIdleMs ?? 30_000),\n pushAfterCommit: Boolean(raw.pushAfterCommit ?? false),\n };\n}\n\n// ── Git helpers ──────────────────────────────────────────────────────────────\n\nfunction git(cmd: string, cwd: string, timeout = 30_000): string {\n return execSync(`git ${cmd}`, { cwd, encoding: \"utf-8\", timeout, stdio: \"pipe\" }).trim();\n}\n\nfunction hasChanges(cwd: string): boolean {\n const status = git(\"status --porcelain\", cwd);\n return status.length > 0;\n}\n\n/**\n * True when `dir` is empty (no entries, including no dotfiles) or when\n * `readdirSync` fails (e.g. dir does not exist). The \"fails → empty\" mapping\n * is intentional: the caller is about to `mkdir` and proceed, so a missing\n * dir is functionally equivalent to an empty one.\n */\nfunction isDirEmpty(dir: string): boolean {\n try {\n return readdirSync(dir).length === 0;\n } catch {\n return true;\n }\n}\n\nfunction commitAll(cwd: string, message: string): string | null {\n if (!hasChanges(cwd)) return null;\n git(\"add -A\", cwd);\n return git(`commit -m ${JSON.stringify(message)}`, cwd);\n}\n\n/**\n * Structured error used when the backend credential mediator refuses or\n * cannot deliver a token. Carries the wire-format error code so callers\n * (mount manager, retry loop, audit log) can branch on it.\n *\n * @docLink packages/base-assets/concepts#git-mount-mediation\n */\nclass TokenMediatorError extends Error {\n readonly code: TokenMediatorResult extends infer R\n ? R extends { ok: false; code: infer C }\n ? C\n : never\n : never;\n constructor(\n message: string,\n code: \"not-configured\" | \"revoked\" | \"provider-error\" | \"backend-error\" | \"timeout\",\n mountId: string,\n ) {\n super(`Git mount '${mountId}': backend mediator ${code} — ${message}`);\n this.name = \"TokenMediatorError\";\n this.code = code as never;\n }\n}\n\n// ── Driver ──────────────────────────────────────────────────────────────────\n\n/**\n * Mount driver for git repositories — clones or pulls on mount, supports session branching, periodic fetch/rebase, and lifecycle hooks (hibernate commit/push, session close merge).\n * Also supports Tier-2 managed credential injection via `GIT_CONFIG_GLOBAL` for agent-facing `git` CLI access.\n *\n * Token acquisition for `auth: backend` mounts is mediated by the runner: the\n * driver calls the injected `tokenMediator` callback (which sends a\n * `request_access_token` command over the transport and awaits the matching\n * `access_token_response` event). Local provider minting (OAuth, GitHub App)\n * has been removed — the platform owns dispatch.\n *\n * @docLink packages/base-assets/concepts#git-mount\n */\nexport class GitDriver extends AbstractMountDriver {\n readonly name = \"git\";\n\n async mount(\n declaration: MountDeclaration,\n targetDir: string,\n secrets?: SecretProvider,\n tokenMediator?: TokenMediator,\n ): Promise<MountHandle> {\n const started = Date.now();\n const opts = declaration.options;\n const url = String(declaration.source);\n const branch = String(opts?.branch ?? \"main\");\n\n if (!url) {\n this.log.error(\"mount failed: missing source URL\", undefined);\n throw new Error(\"Git driver requires a source URL\");\n }\n\n this.log.info(\"mount start\", { url, branch, targetDir });\n\n // Resolve auth ref and (when present) the initial token. For `backend`\n // refs the token comes from the platform mediator; for `pat:env:NAME`\n // it falls back to the secrets chain. Anonymous (no `auth:`) mounts\n // remain supported for public repos.\n const initial = await this.acquireInitialToken(declaration, secrets, tokenMediator);\n\n const session = parseSessionConfig(opts);\n const sync = parseSyncConfig(opts);\n const lifecycle = parseLifecycleConfig(opts);\n\n const state: GitState = {\n url,\n branch,\n activeBranch: branch,\n token: initial.token,\n session,\n sync,\n lifecycle,\n tokenMediator: initial.authRef?.kind === \"backend\" ? tokenMediator : undefined,\n };\n\n // Clone or pull\n const authUrl = this.authUrl(state);\n\n // Minimal-mount policy: `mount()` never auto-syncs with the remote.\n // The lifecycle hooks (`pushOnHibernate`, `pushAfterCommit`,\n // `sync.autoPull`) and the explicit `sync()` method are the only paths\n // that touch the network with the existing checkout. Recreating a\n // container is therefore idempotent — the on-disk dir is preserved.\n //\n // Three cases:\n // - `.git` exists → use as-is. No pull, no reset.\n // - dir empty → fresh clone (only network fetch on mount).\n // - dir populated, no `.git` → `git init` + `remote add origin` so\n // lifecycle hooks (commit/push) can do their job. No fetch, no\n // reset, no clean. Existing files become uncommitted-on-init; the\n // agent or `pushAfterCommit` reconciles with remote later.\n try {\n if (existsSync(join(targetDir, \".git\"))) {\n if (this.isInitialisedCheckout(targetDir)) {\n // Functional working checkout — leave it alone. Sync is the\n // lifecycle's job (push on hibernate, periodic fetch, etc.).\n this.log.info(\"found existing checkout — using as-is\", { branch, targetDir });\n } else {\n // `.git` is present but has no resolved HEAD — typically the\n // residue of a prior `initInPlace` call (origin configured, no\n // objects fetched) or an aborted clone. Bootstrap content from\n // the remote *once*, then future mounts hit the as-is path\n // above.\n this.log.info(\"found empty .git — bootstrapping from origin\", { branch });\n this.bootstrapFromOrigin(targetDir, branch, authUrl);\n this.log.info(\"bootstrap ok\", { branch, durationMs: Date.now() - started });\n }\n } else {\n mkdirSync(targetDir, { recursive: true });\n if (isDirEmpty(targetDir)) {\n this.log.info(\"clone start\", { url, branch });\n execSync(`git clone --branch ${branch} --single-branch ${authUrl} ${targetDir}`, {\n timeout: 120_000,\n stdio: \"pipe\",\n });\n this.log.info(\"clone ok\", { branch, durationMs: Date.now() - started });\n } else {\n // Populated dir without `.git`. Typical causes: previous mount\n // aborted mid-clone; bind-mount of a worktree whose `.git` FILE\n // points outside the container. We DO NOT overwrite the files —\n // they are likely the user's last working state. We just bring\n // git tracking back online so lifecycle hooks work.\n this.log.warn(\"target non-empty without .git — initialising in place\", { targetDir });\n this.initInPlace(targetDir, authUrl);\n this.log.info(\"init in place ok\", { durationMs: Date.now() - started });\n }\n }\n } catch (err) {\n this.log.error(\"mount preparation failed\", err, { url, branch });\n throw err;\n }\n\n // Session branching: create and checkout a session branch for non-main sessions\n if (session.enabled && !session.isMain && session.slug) {\n const sessionBranch = `${session.branchPrefix}${session.slug}`;\n try {\n git(`rev-parse --verify origin/${sessionBranch}`, targetDir);\n git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);\n } catch {\n git(`checkout -b ${sessionBranch}`, targetDir);\n }\n state.activeBranch = sessionBranch;\n this.log.info(\"session branch checked out\", { sessionBranch });\n }\n\n // Start periodic fetch if configured\n if (sync.fetchIntervalSec > 0) {\n this.startPeriodicFetch(state, targetDir);\n }\n\n // Tier-2: when `exposeAccessToken` is on (top-level on the declaration),\n // wire the resolved credential into a managed-gitconfig file so the\n // agent's interactive `git` can authenticate against this host.\n // Path comes from `GIT_CONFIG_GLOBAL` set by the runner; absent in\n // CLI/standalone contexts (Tier-1 stays the default there).\n if (declaration.exposeAccessToken === true) {\n try {\n this.exposeManagedCredential(declaration, state, url, initial);\n } catch (err) {\n this.log.error(\"managed-gitconfig write failed\", err, { mountId: declaration.id });\n throw err;\n }\n }\n\n this.log.info(\"mount ok\", {\n targetDir,\n activeBranch: state.activeBranch,\n durationMs: Date.now() - started,\n });\n return this.makeHandle(declaration, targetDir, state);\n }\n\n /**\n * Public refresh entry-point used by the runner's wake-mid-401 handler when\n * the credential-helper script touches the workspace refresh-flag. Calls\n * the same internal refresh path as the scheduled timer, but with\n * `reason: 'retry-401'` so the platform can distinguish proactive refreshes\n * from emergency ones in audit logs.\n *\n * No-op when:\n * - the handle was not minted with `exposeAccessToken: true`\n * (no `managedGitconfig` on state), or\n * - the mount was not provisioned with a `tokenMediator` (PAT path —\n * the script will keep serving the static token and the user must\n * rotate the PAT manually).\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md` Step 9a.\n */\n async refreshExposedCredential(mountId: string, handle: MountHandle): Promise<void> {\n const s = handle.state as GitState;\n if (!s.managedGitconfig || !s.tokenMediator) return;\n const { credentialsPath, urlPrefix } = s.managedGitconfig;\n const result = await s.tokenMediator({ mountId, reason: \"retry-401\" });\n if (!result.ok) {\n this.log.warn(\"refresh-flag-driven mediation failed\", {\n mountId,\n code: result.code,\n message: result.message,\n });\n return;\n }\n atomicReplaceCredential({\n mountId,\n urlPrefix,\n token: result.token,\n credentialsPath,\n });\n s.token = result.token;\n this.log.info(\"refresh\", {\n event: \"refresh\",\n tier: 2,\n provider: \"backend\",\n scope: urlPrefix,\n reason: \"retry-401\",\n expiresAt: result.expiresAt,\n ...(result.scope ? { permissions: result.scope } : {}),\n });\n // Reschedule the proactive timer so the next pre-expiry tick still fires.\n if (result.expiresAt) {\n this.scheduleRefresh(mountId, s, new Date(result.expiresAt));\n }\n }\n\n async unmount(handle: MountHandle): Promise<void> {\n this.log.info(\"unmount\");\n const s = handle.state as GitState;\n if (s.fetchTimer) {\n clearInterval(s.fetchTimer);\n s.fetchTimer = undefined;\n }\n if (s.autoCommitTimer) {\n clearTimeout(s.autoCommitTimer);\n s.autoCommitTimer = undefined;\n }\n this.teardownManagedCredential(handle.id, s);\n }\n\n async sync(handle: MountHandle, _options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as GitState;\n this.log.debug(\"sync (pull) start\", { branch: s.activeBranch });\n try {\n git(`pull origin ${s.activeBranch}`, handle.mountPath, 60_000);\n this.log.debug(\"sync ok\");\n } catch (err) {\n this.log.error(\"sync failed\", err, { branch: s.activeBranch });\n throw err;\n }\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n // ── Watch ──────────────────────────────────────────────────────────────────\n\n watch(\n handle: MountHandle,\n callback: (event: MountChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle {\n const s = handle.state as GitState;\n\n // Wrap callback to reset auto-commit timer on every file change\n s.emitChange = (event: MountChangeEvent) => {\n callback(event);\n this.resetAutoCommitTimer(s, handle.mountPath);\n };\n\n let fsWatcher: WatchHandle | null = null;\n\n const ignored = [...(options?.ignored ?? []), \"**/.git/**\"];\n createFsWatcher(handle.mountPath, s.emitChange, { ...options, ignored }).then((w) => {\n fsWatcher = w;\n });\n\n return {\n close: async () => {\n s.emitChange = undefined;\n await fsWatcher?.close();\n },\n };\n }\n\n // ── Session lifecycle ──────────────────────────────────────────────────────\n\n override async onHibernate(handle: MountHandle): Promise<string | undefined> {\n this.log.info(\"hibernate\");\n const s = handle.state as GitState;\n const lc = s.lifecycle;\n if (!lc.commitOnHibernate) return;\n\n const result = commitAll(handle.mountPath, `skaile: hibernate snapshot`);\n if (!result) return \"Nothing to commit.\";\n\n const sha = git(\"rev-parse --short HEAD\", handle.mountPath);\n\n if (lc.pushOnHibernate) {\n try {\n git(`push origin ${s.activeBranch}`, handle.mountPath, 60_000);\n this.log.info(\"push ok\", { branch: s.activeBranch });\n } catch (err) {\n this.log.error(\"push failed\", err, { branch: s.activeBranch });\n throw err;\n }\n }\n\n return `Committed ${sha} on ${s.activeBranch}${lc.pushOnHibernate ? \" (pushed)\" : \"\"}`;\n }\n\n override async onSessionClose(handle: MountHandle): Promise<string | undefined> {\n this.log.info(\"session closed\");\n const s = handle.state as GitState;\n const lc = s.lifecycle;\n const details: string[] = [];\n\n // Commit any remaining work on the session branch\n const commitResult = commitAll(handle.mountPath, `skaile: session close`);\n if (commitResult) {\n const sha = git(\"rev-parse --short HEAD\", handle.mountPath);\n details.push(`Committed ${sha}`);\n }\n\n // Push session branch\n if (lc.pushOnClose || lc.mergeOnClose) {\n git(`push origin ${s.activeBranch}`, handle.mountPath, 60_000);\n details.push(`Pushed ${s.activeBranch}`);\n }\n\n // Merge session branch into base branch\n if (lc.mergeOnClose && s.activeBranch !== s.branch) {\n git(`checkout ${s.branch}`, handle.mountPath);\n git(`pull origin ${s.branch}`, handle.mountPath, 60_000);\n try {\n git(`merge ${s.activeBranch}`, handle.mountPath);\n } catch {\n const resolved = this.resolveConflictsOrAbort(s, handle.mountPath, \"merge\");\n if (resolved) {\n details.push(\"Resolved merge conflicts (created .conflict files)\");\n }\n }\n\n if (lc.pushOnClose) {\n git(`push origin ${s.branch}`, handle.mountPath, 60_000);\n }\n\n details.push(`Merged ${s.activeBranch} into ${s.branch}`);\n }\n\n // Tier-2: best-effort teardown of the agent-facing credential when the\n // session closes. The runner also tears mounts down on container shutdown,\n // but the host may invoke `onSessionClose` first.\n this.teardownManagedCredential(handle.id, s);\n\n return details.join(\"; \") || undefined;\n }\n\n // ── Private: managed gitconfig (Tier-2 credential exposure) ──────────────\n\n /**\n * Compute the URL prefix used to scope the credential helper. We key on\n * host plus the first path segment when one is present (e.g. for\n * `https://github.com/orgA/repo.git` we register\n * `https://github.com/orgA/`). This lets two mounts on the same host with\n * disjoint org prefixes coexist; same-host repos under one org just\n * share the same scope.\n */\n private deriveUrlPrefix(url: string): string {\n const u = new URL(url);\n const segments = u.pathname.split(\"/\").filter(Boolean);\n if (segments.length > 0) {\n return `${u.protocol}//${u.host}/${segments[0]}/`;\n }\n return `${u.protocol}//${u.host}`;\n }\n\n /**\n * Acquire the initial credential for a mount.\n *\n * `auth:` accepts the post-2026-05-06 grammar:\n * - `backend` → request a token from the platform mediator\n * (preferred for any platform-backed session).\n * - `pat:env:NAME` → static token from the secrets chain\n * (standalone CLI / non-platform contexts).\n *\n * Anonymous mounts (`auth` unset) succeed without a token — the\n * `git clone`/`git pull` calls still work for public repos.\n *\n * @returns The parsed auth ref, the resolved token (when any), and the\n * `expiresAt` timestamp surfaced by the mediator (used to schedule a\n * refresh tick when the credential is exposed to the agent CLI).\n */\n private async acquireInitialToken(\n declaration: MountDeclaration,\n secrets: SecretProvider | undefined,\n tokenMediator: TokenMediator | undefined,\n ): Promise<{\n authRef: MountAuthRef | undefined;\n token: string | undefined;\n expiresAt: Date | null;\n scope?: string[];\n }> {\n if (!declaration.auth) {\n return { authRef: undefined, token: undefined, expiresAt: null };\n }\n const authRef = resolveAuthRef(declaration.auth, declaration.id);\n if (!authRef) {\n return { authRef: undefined, token: undefined, expiresAt: null };\n }\n\n if (authRef.kind === \"backend\") {\n if (!tokenMediator) {\n throw new Error(\n `Mount '${declaration.id}' uses 'auth: backend' but no token mediator is wired ` +\n `(standalone CLI does not have one — use 'pat:env:NAME' instead).`,\n );\n }\n const result = await tokenMediator({ mountId: declaration.id, reason: \"initial\" });\n if (!result.ok) {\n this.log.error(\"backend mediator refused initial token\", undefined, {\n mountId: declaration.id,\n code: result.code,\n message: result.message,\n });\n throw new TokenMediatorError(result.message, result.code, declaration.id);\n }\n return {\n authRef,\n token: result.token,\n expiresAt: result.expiresAt ? new Date(result.expiresAt) : null,\n ...(result.scope ? { scope: result.scope } : {}),\n };\n }\n\n // PAT path — resolve via secrets chain when available, fall back to\n // process.env for standalone CLI contexts.\n const inner = authRef.value;\n let token: string | undefined;\n if (secrets) {\n token = secrets.resolve(inner);\n } else if (inner.startsWith(\"env:\")) {\n token = process.env[inner.slice(4)];\n } else {\n token = inner;\n }\n if (!token) {\n throw new Error(\n `PAT auth ref '${authRef.raw}' did not resolve to a token. ` +\n `Provision '${authRef.value}' in the SecretProviderChain.`,\n );\n }\n return { authRef, token, expiresAt: null };\n }\n\n private exposeManagedCredential(\n declaration: MountDeclaration,\n state: GitState,\n url: string,\n initial: {\n authRef: MountAuthRef | undefined;\n token: string | undefined;\n expiresAt: Date | null;\n scope?: string[];\n },\n ): void {\n const token = initial.token;\n if (!token) {\n this.log.warn(\"managed-gitconfig: skipped — no token resolved\", {\n mountId: declaration.id,\n });\n return;\n }\n if (!url.startsWith(\"https://\") && !url.startsWith(\"http://\")) {\n this.log.warn(\"managed-gitconfig: skipped — non-http remote\", {\n mountId: declaration.id,\n url,\n });\n return;\n }\n\n const gitconfigPath = process.env.GIT_CONFIG_GLOBAL;\n if (!gitconfigPath) {\n this.log.warn(\"managed-gitconfig: GIT_CONFIG_GLOBAL not set — agent CLI auth will not work\", {\n mountId: declaration.id,\n });\n return;\n }\n const skaileDir = dirname(gitconfigPath);\n const credentialsPath = join(skaileDir, \"git-credentials\");\n const urlPrefix = this.deriveUrlPrefix(url);\n\n // Step 9a: write a per-mount credential-helper script so the agent's\n // interactive `git` can refresh stale tokens mid-401 by signalling the\n // runner via a refresh-flag file. The runner watches that flag and\n // re-mints tokens on `change`. The script is per-mount (not per-\n // workspace) because each one carries its own credentialsPath + tag.\n const refreshFlagPath = join(skaileDir, \"refresh-request\");\n const helperScriptPath = join(skaileDir, `credential-helper-${declaration.id}.sh`);\n const credentialTag = `# skaile-mount: ${declaration.id}`;\n const scriptBody = renderCredentialHelperScript({\n credentialsPath,\n refreshFlagPath,\n credentialTag,\n });\n try {\n writeHelperScript(helperScriptPath, scriptBody);\n } catch (err) {\n this.log.warn(\n \"managed-gitconfig: failed to write credential-helper script -- falling back to static helper\",\n {\n mountId: declaration.id,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n\n writeMountBlock({\n mountId: declaration.id,\n urlPrefix,\n token,\n gitconfigPath,\n credentialsPath,\n helperScriptPath,\n });\n\n state.managedGitconfig = { gitconfigPath, credentialsPath, urlPrefix };\n\n const providerKind = initial.authRef?.kind ?? \"pat\";\n const isRefreshable = providerKind === \"backend\" && initial.expiresAt !== null;\n\n // Spec'd schema: kind=mount, subkind=git, instance=<id>, data.event=mint,\n // data.tier=2, data.provider, data.scope. PAT path is static — flag the\n // warning so operators see \"no refresh\" in the logs.\n this.log.info(\"mint\", {\n event: \"mint\",\n origin: \"tier-2\",\n tier: 2,\n provider: providerKind,\n scope: urlPrefix,\n expiresAt: initial.expiresAt ? initial.expiresAt.toISOString() : null,\n ...(initial.scope ? { permissions: initial.scope } : {}),\n ...(isRefreshable ? {} : { warning: \"static-credential\" }),\n });\n\n // Backend-mediated tokens with finite expiry → schedule the rotation\n // tick. The 5-minute lead lets the long-push 401 retry path re-read the\n // new token via `credential.helper store` before the in-flight token\n // expires.\n if (isRefreshable && state.tokenMediator && initial.expiresAt) {\n this.scheduleRefresh(declaration.id, state, initial.expiresAt);\n }\n }\n\n /**\n * Schedule the next refresh of the credential file.\n *\n * Cancels any existing timer first so re-mounts (and the test harness)\n * do not double-fire. Uses a 5-minute lead per spec; if the lead is\n * negative (very short-lived test tokens) we fall back to a tiny delay\n * so the timer still fires in deterministic order.\n */\n private scheduleRefresh(mountId: string, state: GitState, expiresAt: Date): void {\n if (state.refreshTimer) {\n clearTimeout(state.refreshTimer);\n state.refreshTimer = undefined;\n }\n const FIVE_MINUTES_MS = 5 * 60 * 1000;\n const delay = Math.max(1_000, expiresAt.getTime() - Date.now() - FIVE_MINUTES_MS);\n state.refreshTimer = setTimeout(() => {\n this.refreshManagedCredential(mountId, state).catch((err) => {\n this.log.error(\"managed-gitconfig refresh failed\", err, { mountId });\n });\n }, delay);\n }\n\n private async refreshManagedCredential(mountId: string, state: GitState): Promise<void> {\n if (!state.managedGitconfig || !state.tokenMediator) return;\n const { credentialsPath, urlPrefix } = state.managedGitconfig;\n\n const result = await state.tokenMediator({ mountId, reason: \"refresh\" });\n if (!result.ok) {\n this.log.error(\"backend mediator refused refresh\", undefined, {\n mountId,\n code: result.code,\n message: result.message,\n });\n // Best-effort retry once after 30s on transient errors. On a second\n // failure we surface via the existing log channel and stop scheduling\n // — the next git operation will hit a 401 and the manager will\n // restart the mount via its existing failure path.\n if (result.code === \"backend-error\" || result.code === \"provider-error\") {\n if (state.refreshTimer) {\n clearTimeout(state.refreshTimer);\n state.refreshTimer = undefined;\n }\n state.refreshTimer = setTimeout(() => {\n this.refreshManagedCredential(mountId, state).catch((err) => {\n this.log.error(\"managed-gitconfig refresh retry failed\", err, { mountId });\n });\n }, 30_000);\n }\n return;\n }\n\n atomicReplaceCredential({\n mountId,\n urlPrefix,\n token: result.token,\n credentialsPath,\n });\n state.token = result.token;\n\n this.log.info(\"refresh\", {\n event: \"refresh\",\n tier: 2,\n provider: \"backend\",\n scope: urlPrefix,\n expiresAt: result.expiresAt,\n ...(result.scope ? { permissions: result.scope } : {}),\n });\n\n if (result.expiresAt) {\n this.scheduleRefresh(mountId, state, new Date(result.expiresAt));\n }\n }\n\n private teardownManagedCredential(mountId: string, state: GitState): void {\n if (state.refreshTimer) {\n clearTimeout(state.refreshTimer);\n state.refreshTimer = undefined;\n }\n if (!state.managedGitconfig) return;\n try {\n removeMountBlock({\n mountId,\n gitconfigPath: state.managedGitconfig.gitconfigPath,\n credentialsPath: state.managedGitconfig.credentialsPath,\n });\n this.log.info(\"teardown\", {\n event: \"teardown\",\n tier: 2,\n scope: state.managedGitconfig.urlPrefix,\n });\n } catch (err) {\n this.log.warn(\"managed-gitconfig: teardown best-effort failed\", {\n mountId,\n error: err instanceof Error ? err.message : String(err),\n });\n } finally {\n state.managedGitconfig = undefined;\n state.tokenMediator = undefined;\n }\n }\n\n // ── Private: in-place git init ───────────────────────────────────────────\n\n /**\n * Bring a populated, non-git directory under git tracking without\n * touching the working tree. Runs only on the \"dir populated, no `.git`\"\n * branch of `mount()` — exactly when a previous mount aborted before\n * `.git` was written, or when the bind-mounted host dir's `.git` FILE\n * pointed outside the container.\n *\n * The intent is to preserve whatever the agent last had on disk. We\n * therefore:\n * - `git init` — creates `.git/`; does not modify any existing file.\n * - `git remote add origin <authUrl>` — wires up the remote so the\n * normal lifecycle hooks (`pushOnHibernate`, `pushAfterCommit`)\n * have a target.\n *\n * Deliberately omitted:\n * - `fetch` — would touch the network on every recreate. The lifecycle\n * handles sync explicitly (periodic `fetch`/`pull` via\n * `sync.autoPull`, push on hibernate, etc.).\n * - `checkout -f` / `reset --hard` / `clean -fd` — would discard the\n * user's last on-disk state. The agent or autocommit reconciles\n * with the remote later.\n *\n * Token persistence: the auth URL gets written into `.git/config`\n * exactly like the `git clone <authUrl>` path does — token-rotation\n * handling is external to this method (managed-gitconfig credential\n * helper refresh in Tier-2 mounts).\n */\n private initInPlace(targetDir: string, authUrl: string): void {\n git(\"init\", targetDir, 10_000);\n // Replace any existing origin (idempotent across re-mounts).\n try {\n git(\"remote remove origin\", targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n execSync(`git remote add origin ${authUrl}`, {\n cwd: targetDir,\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: \"pipe\",\n });\n }\n\n /**\n * True when `<targetDir>/.git` contains at least one resolvable commit\n * (i.e. `HEAD` points at a real object). False when `.git` is an empty\n * shell — e.g. just-initialised but never fetched, or all refs deleted.\n *\n * Used by `mount()` to tell the difference between a working agent\n * checkout (preserve, don't touch) and a half-initialised one\n * (bootstrap by fetching from origin).\n */\n private isInitialisedCheckout(targetDir: string): boolean {\n try {\n git(\"rev-parse HEAD\", targetDir, 5_000);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * One-shot bootstrap path for the \"`.git` exists but is empty\" state.\n *\n * Runs `fetch --depth=1 origin <branch>` followed by `checkout -B\n * <branch> origin/<branch>` so the working tree gets the remote\n * content. Before the checkout, any untracked file whose path also\n * exists in the remote tree is renamed to `<path>.local` so the user\n * (or previous agent run) does not lose data. Other untracked files\n * are left in place.\n *\n * Deliberately not destructive: we never `clean -fd` and never\n * `reset --hard`. Files that do not conflict with the remote stay\n * exactly where they are.\n *\n * Auth-URL handling matches `initInPlace`: a pre-existing `origin`\n * remote is replaced with the authed URL so the fetch works even\n * after token rotation. This persists the token in `.git/config`\n * the same way `git clone <authUrl>` does — token-rotation handling\n * is external to this driver method.\n */\n private bootstrapFromOrigin(targetDir: string, branch: string, authUrl: string): void {\n // Ensure origin points at the current authed URL — handles the case\n // where the previous `initInPlace` wrote a stale token, or the\n // remote was never configured at all.\n try {\n git(\"remote remove origin\", targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n execSync(`git remote add origin ${authUrl}`, {\n cwd: targetDir,\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: \"pipe\",\n });\n git(`fetch --depth=1 origin ${branch}`, targetDir, 120_000);\n this.preserveConflictingUntracked(targetDir, branch);\n git(`checkout -B ${branch} origin/${branch}`, targetDir, 30_000);\n try {\n git(`branch --set-upstream-to=origin/${branch} ${branch}`, targetDir, 5_000);\n } catch {\n /* best-effort */\n }\n }\n\n /**\n * Walk the remote tree at `origin/<branch>` and rename any untracked\n * working-tree file whose path also exists there. Renames go to\n * `<path>.local`; on `.local` collision a millisecond suffix is\n * appended so nothing is overwritten.\n *\n * This makes the subsequent `git checkout -B <branch> origin/<branch>`\n * safe: without it, `checkout` aborts with \"untracked working tree\n * files would be overwritten\" the moment any local file collides with\n * a tracked path on the remote.\n *\n * Files in the local tree whose paths are NOT in the remote tree are\n * left untouched — they are pure local additions and survive the\n * bootstrap.\n */\n private preserveConflictingUntracked(targetDir: string, branch: string): void {\n let remoteFiles: string[] = [];\n try {\n remoteFiles = git(`ls-tree -r origin/${branch} --name-only`, targetDir, 30_000)\n .split(\"\\n\")\n .filter(Boolean);\n } catch (err) {\n this.log.warn(\"ls-tree failed — skipping untracked preservation\", {\n branch,\n error: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n for (const relPath of remoteFiles) {\n const fullPath = join(targetDir, relPath);\n if (!existsSync(fullPath)) continue;\n let dest = `${fullPath}.local`;\n if (existsSync(dest)) {\n dest = `${fullPath}.local.${Date.now()}`;\n }\n try {\n renameSync(fullPath, dest);\n this.log.info(\"preserved local file as .local\", { path: relPath, dest });\n } catch (err) {\n this.log.warn(\"failed to preserve local file — checkout may fail\", {\n path: relPath,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n // ── Private: auth URL ─────────────────────────────────────────────────────\n\n private authUrl(s: GitState): string {\n if (s.token && s.url.startsWith(\"https://\")) {\n const urlObj = new URL(s.url);\n urlObj.username = \"x-access-token\";\n urlObj.password = s.token;\n return urlObj.toString();\n }\n return s.url;\n }\n\n // ── Periodic fetch ─────────────────────────────────────────────────────────\n\n private startPeriodicFetch(s: GitState, mountPath: string): void {\n if (s.fetchTimer) clearInterval(s.fetchTimer);\n\n const intervalMs = s.sync.fetchIntervalSec * 1000;\n s.fetchTimer = setInterval(() => {\n try {\n git(\"fetch origin\", mountPath, 60_000);\n if (s.sync.autoRebase && s.activeBranch !== s.branch) {\n try {\n git(`rebase origin/${s.branch}`, mountPath, 60_000);\n } catch {\n this.resolveConflictsOrAbort(s, mountPath, \"rebase\");\n }\n } else if (s.sync.autoPull) {\n git(`pull origin ${s.activeBranch}`, mountPath, 60_000);\n }\n } catch {\n // Periodic fetch is best-effort\n }\n }, intervalMs);\n }\n\n // ── Conflict resolution ──────────────────────────────────────────────────\n\n /**\n * Attempt to resolve merge/rebase conflicts by keeping \"ours\" and copying\n * \"theirs\" to a .conflict file. If resolution fails entirely, abort.\n * Returns true if conflicts were resolved, false if aborted.\n */\n private resolveConflictsOrAbort(\n s: GitState,\n mountPath: string,\n mode: \"rebase\" | \"merge\",\n ): boolean {\n try {\n const conflicted = git(\"diff --name-only --diff-filter=U\", mountPath)\n .split(\"\\n\")\n .filter(Boolean);\n\n if (conflicted.length === 0) return false;\n\n for (const file of conflicted) {\n this.resolveFileConflict(mountPath, file);\n }\n\n // Continue the rebase/merge\n if (mode === \"rebase\") {\n git(\"-c core.editor=true rebase --continue\", mountPath, 30_000);\n } else {\n git(`commit --no-edit`, mountPath);\n }\n\n // Emit change events for conflict files\n for (const file of conflicted) {\n const ext = file.includes(\".\") ? file.slice(file.lastIndexOf(\".\")) : \"\";\n const base = file.includes(\".\") ? file.slice(0, file.lastIndexOf(\".\")) : file;\n s.emitChange?.({\n path: `${base}.conflict${ext}`,\n action: \"create\",\n source: \"sync\",\n });\n }\n\n return true;\n } catch {\n // Abort if resolution fails\n try {\n if (mode === \"rebase\") {\n git(\"rebase --abort\", mountPath);\n } else {\n git(\"merge --abort\", mountPath);\n }\n } catch {\n /* already clean */\n }\n return false;\n }\n }\n\n /**\n * For a single conflicted file: keep \"ours\", save \"theirs\" as .conflict file.\n */\n private resolveFileConflict(root: string, file: string): void {\n const ext = file.includes(\".\") ? file.slice(file.lastIndexOf(\".\")) : \"\";\n const base = file.includes(\".\") ? file.slice(0, file.lastIndexOf(\".\")) : file;\n const conflictPath = `${base}.conflict${ext}`;\n\n try {\n // Extract \"theirs\" version (stage 3)\n const theirs = git(`show :3:${file}`, root);\n writeFileSync(join(root, conflictPath), theirs);\n } catch {\n // If we can't get theirs, copy the conflicted file as-is\n const fullPath = join(root, file);\n if (existsSync(fullPath)) {\n const content = readFileSync(fullPath, \"utf-8\");\n writeFileSync(join(root, conflictPath), content);\n }\n }\n\n try {\n // Keep \"ours\" version (stage 2)\n const ours = git(`show :2:${file}`, root);\n writeFileSync(join(root, file), ours);\n } catch {\n // Strip conflict markers, keeping our sections\n const fullPath = join(root, file);\n if (existsSync(fullPath)) {\n const content = readFileSync(fullPath, \"utf-8\");\n writeFileSync(fullPath, this.stripConflictKeepOurs(content));\n }\n }\n\n git(`add ${file} ${conflictPath}`, root);\n }\n\n private stripConflictKeepOurs(content: string): string {\n return content.replace(/<<<<<<< .*\\n/g, \"\").replace(/=======\\n[\\s\\S]*?>>>>>>> .*\\n/g, \"\");\n }\n\n // ── Auto-commit on idle ────────────────────────────────────────────────────\n\n private resetAutoCommitTimer(s: GitState, mountPath: string): void {\n if (s.lifecycle.autoCommitIdleMs <= 0) return;\n if (s.autoCommitTimer) clearTimeout(s.autoCommitTimer);\n s.autoCommitTimer = setTimeout(() => {\n this.performAutoCommit(s, mountPath);\n }, s.lifecycle.autoCommitIdleMs);\n }\n\n private performAutoCommit(s: GitState, mountPath: string): void {\n try {\n const message = this.generateCommitMessage(mountPath);\n const result = commitAll(mountPath, message);\n if (!result) return;\n if (s.lifecycle.pushAfterCommit) {\n try {\n git(`push origin ${s.activeBranch}`, mountPath, 60_000);\n } catch {\n // Push is best-effort\n }\n }\n } catch {\n // Auto-commit is best-effort\n }\n }\n\n private generateCommitMessage(mountPath: string): string {\n try {\n git(\"add -A\", mountPath);\n const stat = git(\"diff --cached --stat\", mountPath);\n const lines = stat.split(\"\\n\").filter((l) => l.includes(\"|\"));\n if (lines.length === 0) return \"skaile: auto-save\";\n const files = lines.map((l) => l.split(\"|\")[0]!.trim());\n if (files.length === 1) return `Update ${files[0]}`;\n return `Update ${files.length} files`;\n } catch {\n return \"skaile: auto-save\";\n }\n }\n}\n\n/**\n * Creates a new GitDriver instance.\n * @returns Configured GitDriver ready to be registered in the mount registry.\n * @docLink packages/base-assets/api-reference#git-mount-factory\n */\nexport function createDriver(): GitDriver {\n return new GitDriver();\n}\n","/**\n * S3Driver — AWS S3 / S3-compatible object storage volume.\n * Mounts by syncing objects to a local directory.\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { resolveAuth } from \"@skaile/workspaces/connectors\";\nimport type { SecretProvider } from \"@skaile/workspaces/connectors\";\nimport type { SyncOptions, SyncResult } from \"@skaile/workspaces/connectors\";\nimport type { MountDeclaration, MountHandle } from \"@skaile/workspaces/connectors\";\nimport { AbstractMountDriver } from \"@skaile/workspaces/connectors\";\n\nconst s3Pkg = \"@aws-sdk/client-s3\";\n\ninterface S3State {\n client: any; // S3Client\n bucket: string;\n prefix: string;\n region: string;\n}\n\n/**\n * Mount driver for AWS S3 and S3-compatible object storage — downloads all objects from a bucket prefix into a local directory on mount and re-downloads on sync.\n * Requires the `@aws-sdk/client-s3` optional peer dependency.\n * @docLink packages/base-assets/concepts#s3-mount\n */\nexport class S3Driver extends AbstractMountDriver {\n readonly name = \"s3\";\n\n async mount(\n declaration: MountDeclaration,\n targetDir: string,\n secrets?: SecretProvider,\n ): Promise<MountHandle> {\n const started = Date.now();\n const opts = declaration.options;\n const bucket = String(opts?.bucket ?? \"\");\n if (!bucket) {\n this.log.error(\"mount failed: missing bucket option\", undefined);\n throw new Error(\"S3Driver requires options.bucket\");\n }\n\n const prefix = String(opts?.prefix ?? \"\");\n const region = String(opts?.region ?? \"us-east-1\");\n const endpoint = opts?.endpoint ? String(opts.endpoint) : undefined;\n this.log.info(\"mount start\", { bucket, prefix, region, endpoint, targetDir });\n\n const s3Mod = (await import(/* @vite-ignore */ s3Pkg)) as any;\n const S3Client = s3Mod.S3Client;\n\n const clientConfig: any = { region };\n if (endpoint) clientConfig.endpoint = endpoint;\n\n const profile = resolveAuth(declaration.auth, secrets);\n if (profile) {\n process.env.AWS_PROFILE = profile;\n }\n\n const client = new S3Client(clientConfig);\n const state: S3State = { client, bucket, prefix, region };\n\n // Initial sync: download objects to targetDir\n mkdirSync(targetDir, { recursive: true });\n try {\n const result = await this.downloadAll(state, targetDir);\n this.log.info(\"mount ok\", {\n targetDir,\n filesWritten: result.filesWritten,\n durationMs: Date.now() - started,\n });\n return this.makeHandle(declaration, targetDir, state);\n } catch (err) {\n this.log.error(\"mount failed\", err, { bucket, targetDir });\n throw err;\n }\n }\n\n async unmount(handle: MountHandle): Promise<void> {\n this.log.info(\"unmount\");\n const { client } = handle.state as S3State;\n client.destroy?.();\n }\n\n async sync(handle: MountHandle, _options?: SyncOptions): Promise<SyncResult> {\n this.log.debug(\"sync start\");\n const state = handle.state as S3State;\n try {\n const result = await this.downloadAll(state, handle.mountPath);\n this.log.debug(\"sync ok\", { filesWritten: result.filesWritten });\n return result;\n } catch (err) {\n this.log.error(\"sync failed\", err);\n throw err;\n }\n }\n\n private async downloadAll(state: S3State, targetDir: string): Promise<SyncResult> {\n const s3Mod = (await import(/* @vite-ignore */ s3Pkg)) as any;\n const { client, bucket, prefix } = state;\n\n // List all objects\n const entries: Array<{ key: string; relPath: string }> = [];\n let continuationToken: string | undefined;\n\n do {\n const resp = await client.send(\n new s3Mod.ListObjectsV2Command({\n Bucket: bucket,\n Prefix: prefix,\n MaxKeys: 1000,\n ContinuationToken: continuationToken,\n }),\n );\n\n for (const obj of resp.Contents ?? []) {\n const relPath =\n prefix && obj.Key?.startsWith(prefix) ? obj.Key.slice(prefix.length) : obj.Key;\n if (!relPath) continue;\n entries.push({ key: obj.Key, relPath });\n }\n\n continuationToken = resp.IsTruncated ? resp.NextContinuationToken : undefined;\n } while (continuationToken);\n\n // Download each file\n let filesWritten = 0;\n for (const { key, relPath } of entries) {\n try {\n const resp = await client.send(new s3Mod.GetObjectCommand({ Bucket: bucket, Key: key }));\n const body = await resp.Body?.transformToString();\n if (body == null) continue;\n\n const localPath = join(targetDir, relPath);\n mkdirSync(dirname(localPath), { recursive: true });\n writeFileSync(localPath, body);\n filesWritten++;\n } catch (err) {\n this.log.warn(\"object download failed\", {\n key,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { filesWritten, filesDeleted: 0, bytesTransferred: 0 };\n }\n}\n\n/**\n * Creates a new S3Driver instance.\n * @returns Configured S3Driver ready to be registered in the mount registry.\n * @docLink packages/base-assets/api-reference#s3-mount-factory\n */\nexport function createDriver(): S3Driver {\n return new S3Driver();\n}\n","/**\n * WebDAVDriver -- WebDAV server volume backed by rclone FUSE.\n *\n * The whole data plane (enumeration, download, upload, change detection,\n * cache eviction) is delegated to an `rclone mount` subprocess managed by\n * {@link RcloneProcessManager}. This driver only parses the declaration,\n * obscures the password, renders the rclone config, hands it off, and\n * forwards lifecycle hooks.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport type {\n MountDeclaration,\n MountHandle,\n RcloneHandle,\n SecretProvider,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractMountDriver,\n RcloneProcessManager,\n renderWebDAVConfig,\n resolveAuth,\n type WebDAVVendor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface WebDAVState {\n rcloneHandle: RcloneHandle | null;\n fleetManaged?: boolean;\n}\n\n/**\n * Phase 7B: read the comma-separated list of mount ids the host fleet has\n * already bind-mounted into this container at `/skaile/mnt-<id>` (or, for\n * the workspace mount, `/skaile/workspace`). When the current declaration's\n * id is on the list, the driver short-circuits its own rclone spawn.\n *\n * Empty / unset env var means the per-session in-container model from\n * Phase 1 is in effect — the legacy code path runs unchanged.\n */\nfunction isFleetManaged(mountId: string): boolean {\n const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? \"\";\n if (raw.length === 0) return false;\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .includes(mountId);\n}\n\n/**\n * Sanity-check the host bind mount before declaring success. The host\n * process should have the FUSE mount live before the container starts, so\n * we just verify the directory exists and is readable. Polls briefly to\n * absorb any startup race between container start and the kernel\n * publishing the mountpoint inside the container.\n */\nasync function ensureFleetMounted(\n dir: string,\n log: { info: (msg: string, data?: object) => void },\n): Promise<void> {\n const deadline = Date.now() + 3_000;\n let lastErr: unknown = null;\n while (Date.now() < deadline) {\n try {\n const st = await stat(dir);\n if (!st.isDirectory()) {\n throw new Error(`fleet mountpoint ${dir} is not a directory`);\n }\n await readdir(dir);\n log.info(\"fleet bind mount verified\", { dir });\n return;\n } catch (err) {\n lastErr = err;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n throw new Error(\n `fleet mount ${dir} not ready after 3s — check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${\n lastErr instanceof Error ? lastErr.message : String(lastErr)\n }`,\n );\n}\n\ninterface ParsedAuth {\n username: string | null;\n password: string | null;\n bearerToken: string | null;\n}\n\nconst CACHE_BASE = \"/var/cache/skaile\";\nconst ALLOWED_VENDORS: ReadonlySet<WebDAVVendor> = new Set([\n \"nextcloud\",\n \"owncloud\",\n \"sharepoint\",\n \"fastmail\",\n \"other\",\n]);\n\nconst execFileP = promisify(execFile);\n\n/**\n * Mount driver for WebDAV servers (Nextcloud, ownCloud, SharePoint-WebDAV, Fastmail, generic) — delegates the data plane to an `rclone mount` subprocess via `RcloneProcessManager`.\n * Supports fleet-managed mode where the host has pre-mounted the share via `SKAILE_FLEET_MANAGED_MOUNTS`.\n * @docLink packages/base-assets/concepts#webdav-mount\n */\nexport class WebDAVDriver extends AbstractMountDriver {\n readonly name = \"webdav\";\n\n private rclone = new RcloneProcessManager();\n\n async mount(\n declaration: MountDeclaration,\n targetDir: string,\n secrets?: SecretProvider,\n ): Promise<MountHandle> {\n const opts = declaration.options;\n this.log.info(\"mount called\", {\n optionKeys: opts ? Object.keys(opts) : [],\n hasAuth: declaration.auth !== undefined,\n });\n\n // Phase 7B: when the host fleet has already mounted this share, the\n // container received a bind at `targetDir` and there is nothing for\n // the in-container driver to spawn. Verify the bind is live, then\n // produce a no-op handle that the rest of the lifecycle can carry.\n if (isFleetManaged(declaration.id)) {\n this.log.info(\"mount handled by host fleet — skipping in-container rclone spawn\", {\n mountId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n const fleetState: WebDAVState = {\n rcloneHandle: null,\n fleetManaged: true,\n };\n return this.makeHandle(declaration, targetDir, fleetState);\n }\n\n const url = String(declaration.source ?? \"\").trim();\n if (!url) {\n throw new Error(\"WebDAV driver requires declaration.source (server URL)\");\n }\n\n const vendorRaw = opts?.vendor !== undefined ? String(opts.vendor) : \"other\";\n if (!ALLOWED_VENDORS.has(vendorRaw as WebDAVVendor)) {\n throw new Error(\n `WebDAV driver: invalid vendor \"${vendorRaw}\" (allowed: ${[...ALLOWED_VENDORS].join(\", \")})`,\n );\n }\n const vendor = vendorRaw as WebDAVVendor;\n\n const basePath = String(opts?.basePath ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n const remotePath = basePath.length > 0 ? `/${basePath}` : \"/\";\n\n const auth = parseAuth(resolveAuth(declaration.auth, secrets));\n const obscuredPassword = auth.password ? await obscurePassword(auth.password) : null;\n\n const remoteName = `skaile-${declaration.id}`;\n const remote = `${remoteName}:${remotePath}`;\n const cacheDir = `${CACHE_BASE}/${declaration.id}`;\n const vfsCacheMode = declaration.access === \"read-only\" ? \"minimal\" : \"full\";\n\n this.log.info(\"mount params resolved\", {\n url,\n vendor,\n remote,\n cacheDir,\n vfsCacheMode,\n authKind: auth.bearerToken ? \"bearer\" : auth.username ? \"basic\" : \"anonymous\",\n });\n\n const rcloneConfig = renderWebDAVConfig({\n remoteName,\n url,\n vendor,\n username: auth.username,\n obscuredPassword,\n bearerToken: auth.bearerToken,\n });\n\n mkdirSync(CACHE_BASE, { recursive: true });\n mkdirSync(cacheDir, { recursive: true });\n mkdirSync(targetDir, { recursive: true });\n\n const cacheMaxSize = opts?.cacheMaxSize !== undefined ? String(opts.cacheMaxSize) : undefined;\n const cacheMaxAge = opts?.cacheMaxAge !== undefined ? String(opts.cacheMaxAge) : undefined;\n\n const rcloneHandle = await this.rclone.spawn({\n mountId: declaration.id,\n driverName: \"webdav\",\n mountPoint: targetDir,\n cacheDir,\n rcloneConfig,\n remote,\n vfsCacheMode,\n ...(cacheMaxSize !== undefined ? { cacheMaxSize } : {}),\n ...(cacheMaxAge !== undefined ? { cacheMaxAge } : {}),\n log: this.log,\n });\n\n this.log.info(\"mount ready\", { pid: rcloneHandle.pid });\n\n const state: WebDAVState = { rcloneHandle };\n return this.makeHandle(declaration, targetDir, state);\n }\n\n async unmount(handle: MountHandle): Promise<void> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged || !s.rcloneHandle) return;\n await this.rclone.stop(s.rcloneHandle, { graceMs: 30_000 });\n }\n\n async sync(handle: MountHandle, options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged || !s.rcloneHandle) {\n // Host fleet owns the rclone process; flushing is a fleet concern.\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"fleet-managed mount — flush handled by host\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n await this.rclone.flush(s.rcloneHandle);\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"rclone flush complete\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n override async onHibernate(handle: MountHandle): Promise<string | undefined> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged) return \"flushed\";\n await this.sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: MountHandle): Promise<string | undefined> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged) return \"flushed\";\n await this.sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new WebDAVDriver instance.\n * @returns Configured WebDAVDriver ready to be registered in the mount registry.\n * @docLink packages/base-assets/api-reference#webdav-mount-factory\n */\nexport function createDriver(): WebDAVDriver {\n return new WebDAVDriver();\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nfunction parseAuth(raw: string | undefined): ParsedAuth {\n const empty: ParsedAuth = {\n username: null,\n password: null,\n bearerToken: null,\n };\n if (!raw) return empty;\n\n const colonIdx = raw.indexOf(\":\");\n if (colonIdx === -1) {\n return { ...empty, bearerToken: raw };\n }\n\n const username = raw.slice(0, colonIdx);\n const password = raw.slice(colonIdx + 1);\n return { username, password, bearerToken: null };\n}\n\n/**\n * Run `rclone obscure <plain>` and return the trimmed stdout. rclone is\n * required at runtime for this driver and is provisioned in the agent\n * container Dockerfiles; surface a clear error if it is missing in\n * local-dev/test environments.\n */\nasync function obscurePassword(plain: string): Promise<string> {\n try {\n const { stdout } = await execFileP(\"rclone\", [\"obscure\", plain]);\n return stdout.trim();\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === \"ENOENT\") {\n throw new Error(\n \"WebDAV driver: rclone binary not found on PATH (install rclone to use the webdav driver)\",\n );\n }\n throw new Error(\n `WebDAV driver: 'rclone obscure' failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n","/**\n * SharePointDriver — SharePoint/OneDrive volume backed by rclone FUSE.\n *\n * The whole data plane (enumeration, download, upload, change detection,\n * cache eviction) is delegated to an `rclone mount` subprocess managed by\n * {@link RcloneProcessManager}. This driver only parses the declaration,\n * renders the rclone config, hands it off, and forwards lifecycle hooks.\n */\n\nimport { mkdirSync } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport type {\n MountDeclaration,\n MountHandle,\n RcloneHandle,\n SecretProvider,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractMountDriver,\n RcloneProcessManager,\n renderOneDriveConfig,\n resolveAuth,\n} from \"@skaile/workspaces/connectors\";\n\ninterface SharePointState {\n rcloneHandle: RcloneHandle | null;\n fleetManaged?: boolean;\n}\n\n/**\n * Phase 7B: read the comma-separated list of mount ids the host fleet has\n * already bind-mounted into this container at `/skaile/mnt-<id>` (or, for\n * the workspace mount, `/skaile/workspace`). When the current declaration's\n * id is on the list, the driver short-circuits its own rclone spawn.\n *\n * Empty / unset env var means the per-session in-container model from\n * Phase 1 is in effect — the legacy code path runs unchanged.\n */\nfunction isFleetManaged(mountId: string): boolean {\n const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? \"\";\n if (raw.length === 0) return false;\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .includes(mountId);\n}\n\n/**\n * Sanity-check the host bind mount before declaring success. The host\n * process should have the FUSE mount live before the container starts, so\n * we just verify the directory exists and is readable. Polls briefly to\n * absorb any startup race between container start and the kernel\n * publishing the mountpoint inside the container.\n */\nasync function ensureFleetMounted(\n dir: string,\n log: { info: (msg: string, data?: object) => void },\n): Promise<void> {\n const deadline = Date.now() + 3_000;\n let lastErr: unknown = null;\n while (Date.now() < deadline) {\n try {\n const st = await stat(dir);\n if (!st.isDirectory()) {\n throw new Error(`fleet mountpoint ${dir} is not a directory`);\n }\n // readdir surfaces FUSE-side errors that stat cannot (e.g. transport\n // endpoint not connected if the host process died after bind).\n await readdir(dir);\n log.info(\"fleet bind mount verified\", { dir });\n return;\n } catch (err) {\n lastErr = err;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n throw new Error(\n `fleet mount ${dir} not ready after 3s — check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${\n lastErr instanceof Error ? lastErr.message : String(lastErr)\n }`,\n );\n}\n\ninterface ParsedAuth {\n accessToken: string;\n refreshToken: string | null;\n expiresAtMs: number | null;\n tenantId: string | null;\n clientId: string | null;\n clientSecret: string | null;\n}\n\nconst CACHE_BASE = \"/var/cache/skaile\";\n\n/**\n * Mount driver for SharePoint and OneDrive — delegates the data plane to an `rclone mount` subprocess via `RcloneProcessManager` using the OneDrive backend.\n * Supports OAuth2 access tokens with optional refresh, and fleet-managed mode via `SKAILE_FLEET_MANAGED_MOUNTS`.\n * @docLink packages/base-assets/concepts#sharepoint-mount\n */\nexport class SharePointDriver extends AbstractMountDriver {\n readonly name = \"sharepoint\";\n\n private rclone = new RcloneProcessManager();\n\n async mount(\n declaration: MountDeclaration,\n targetDir: string,\n secrets?: SecretProvider,\n ): Promise<MountHandle> {\n const opts = declaration.options;\n this.log.info(\"mount called\", {\n optionKeys: opts ? Object.keys(opts) : [],\n });\n\n // Phase 7B: when the host fleet has already mounted this share, the\n // container received a bind at `targetDir` and there is nothing for\n // the in-container driver to spawn. Verify the bind is live, then\n // produce a no-op handle that the rest of the lifecycle can carry.\n if (isFleetManaged(declaration.id)) {\n this.log.info(\"mount handled by host fleet — skipping in-container rclone spawn\", {\n mountId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n const fleetState: SharePointState = {\n rcloneHandle: null,\n fleetManaged: true,\n };\n return this.makeHandle(declaration, targetDir, fleetState);\n }\n\n const driveId = String(opts?.driveId ?? \"\");\n if (!driveId) {\n throw new Error(\"SharePoint driver requires options.driveId\");\n }\n\n const folderPath = String(opts?.folderPath ?? \"\").trim();\n if (!folderPath) {\n throw new Error(\n \"SharePoint driver requires options.folderPath (rclone backend needs a path string, not just folderId)\",\n );\n }\n\n const basePath = String(opts?.basePath ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n const auth = parseAuthBlob(resolveAuth(declaration.auth, secrets));\n if (!auth.accessToken) {\n throw new Error(\"SharePoint driver requires auth token (e.g. auth: env:SHAREPOINT_TOKEN)\");\n }\n\n const remoteName = `skaile-${declaration.id}`;\n const remotePath = buildRemotePath(folderPath, basePath);\n const remote = `${remoteName}:${remotePath}`;\n const cacheDir = `${CACHE_BASE}/${declaration.id}`;\n const vfsCacheMode = declaration.access === \"read-only\" ? \"minimal\" : \"full\";\n\n this.log.info(\"mount params resolved\", {\n driveId,\n remote,\n cacheDir,\n vfsCacheMode,\n hasRefresh: auth.refreshToken !== null,\n });\n\n const rcloneConfig = renderOneDriveConfig({\n remoteName,\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAtMs: auth.expiresAtMs,\n tenantId: auth.tenantId,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n driveId,\n });\n\n mkdirSync(CACHE_BASE, { recursive: true });\n mkdirSync(cacheDir, { recursive: true });\n mkdirSync(targetDir, { recursive: true });\n\n const cacheMaxSize = opts?.cacheMaxSize !== undefined ? String(opts.cacheMaxSize) : undefined;\n const cacheMaxAge = opts?.cacheMaxAge !== undefined ? String(opts.cacheMaxAge) : undefined;\n\n const rcloneHandle = await this.rclone.spawn({\n mountId: declaration.id,\n driverName: \"sharepoint\",\n mountPoint: targetDir,\n cacheDir,\n rcloneConfig,\n remote,\n vfsCacheMode,\n ...(cacheMaxSize !== undefined ? { cacheMaxSize } : {}),\n ...(cacheMaxAge !== undefined ? { cacheMaxAge } : {}),\n log: this.log,\n });\n\n this.log.info(\"mount ready\", { pid: rcloneHandle.pid });\n\n const state: SharePointState = { rcloneHandle };\n return this.makeHandle(declaration, targetDir, state);\n }\n\n async unmount(handle: MountHandle): Promise<void> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged || !s.rcloneHandle) return;\n await this.rclone.stop(s.rcloneHandle, { graceMs: 30_000 });\n }\n\n async sync(handle: MountHandle, options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged || !s.rcloneHandle) {\n // Host fleet owns the rclone process; flushing is a fleet concern.\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"fleet-managed mount — flush handled by host\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n await this.rclone.flush(s.rcloneHandle);\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"rclone flush complete\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n override async onHibernate(handle: MountHandle): Promise<string | undefined> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged) return \"flushed\";\n await this.sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: MountHandle): Promise<string | undefined> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged) return \"flushed\";\n await this.sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new SharePointDriver instance.\n * @returns Configured SharePointDriver ready to be registered in the mount registry.\n * @docLink packages/base-assets/api-reference#sharepoint-mount-factory\n */\nexport function createDriver(): SharePointDriver {\n return new SharePointDriver();\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nfunction parseAuthBlob(raw: string | undefined): ParsedAuth {\n const empty: ParsedAuth = {\n accessToken: \"\",\n refreshToken: null,\n expiresAtMs: null,\n tenantId: null,\n clientId: null,\n clientSecret: null,\n };\n if (!raw) return empty;\n\n if (!raw.startsWith(\"{\")) {\n return { ...empty, accessToken: raw };\n }\n\n try {\n const parsed = JSON.parse(raw) as {\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n tenantId?: string;\n clientId?: string;\n clientSecret?: string;\n };\n return {\n accessToken: parsed.accessToken ?? \"\",\n refreshToken: parsed.refreshToken ?? null,\n expiresAtMs: parsed.expiresAt ?? null,\n tenantId: parsed.tenantId ?? null,\n clientId: parsed.clientId ?? null,\n clientSecret: parsed.clientSecret ?? null,\n };\n } catch {\n return { ...empty, accessToken: raw };\n }\n}\n\n/**\n * Compose the remote path portion (after `remoteName:`) from a human-readable\n * folder path and an optional sub-base. rclone's onedrive backend takes a\n * path within the drive; an empty path means the drive root.\n */\nfunction buildRemotePath(folderPath: string, basePath: string): string {\n const folder = folderPath.replace(/^\\/+|\\/+$/g, \"\");\n const base = basePath.replace(/^\\/+|\\/+$/g, \"\");\n const joined = [folder, base].filter((p) => p.length > 0).join(\"/\");\n return joined.length > 0 ? `/${joined}` : \"/\";\n}\n","/**\n * Mount driver registry.\n *\n * Built-in mount drivers from `@skaile/base-assets` are pre-registered here\n * via static ESM imports of their subpath exports so they are bundled into\n * any `bun --compile`'d agent binary AND any tsup-emitted ESM tarball.\n * The catalog path in `MountManager.resolveDriver`\n * (`await import(driverPath)` of raw TS) is a dev-only fallback for\n * project-local third-party drivers — it cannot work inside a compiled\n * binary because bun cannot share its bundled symbol graph with\n * externally-loaded TS files (the import silently hangs while trying to\n * resolve `@skaile/workspaces/connectors` against an absent `node_modules`).\n *\n * **Static import discipline.** Every subpath specifier below must be a\n * string-literal `from \"@skaile/workspaces/base-assets/mounts/<name>\"` —\n * never aliased through a variable. The same rule applies in\n * `connector-registry.ts`, `connector-tools.ts`, and `bridge/`; indirection\n * defeats `bun --compile`'s static analysis and silently drops the module\n * from the binary. Regression test:\n * `tests/connector-tools-regression.test.ts`.\n */\n\nimport type { MountDriver, MountDriverFactory } from \"./mount-types.js\";\n\n// Static subpath imports — string literals only.\nimport { createDriver as createLocalDriver } from \"@skaile/workspaces/base-assets/mounts/local\";\nimport { createDriver as createGitDriver } from \"@skaile/workspaces/base-assets/mounts/git\";\nimport { createDriver as createS3Driver } from \"@skaile/workspaces/base-assets/mounts/s3\";\nimport { createDriver as createWebdavDriver } from \"@skaile/workspaces/base-assets/mounts/webdav\";\nimport { createDriver as createSharepointDriver } from \"@skaile/workspaces/base-assets/mounts/sharepoint\";\n\nconst factories = new Map<string, MountDriverFactory>();\n\n/**\n * Register a mount driver factory under `name`. Overwrites any existing registration.\n * @param name - Driver key used in `skaile.yaml` `driver:` fields (e.g. `\"git\"`, `\"s3\"`).\n * @param factory - Factory function that returns a fresh driver instance.\n * @docLink packages/connectors/api-reference#register-mount-driver\n */\nexport function registerMountDriver(name: string, factory: MountDriverFactory): void {\n factories.set(name, factory);\n}\n\n/**\n * Get a mount driver by name, calling its factory.\n * @param name - Driver key (e.g. `\"git\"`).\n * @returns A fresh driver instance.\n * @throws {Error} when no driver is registered under `name`.\n * @docLink packages/connectors/api-reference#get-mount-driver\n */\nexport function getMountDriver(name: string): MountDriver {\n const factory = factories.get(name);\n if (!factory) {\n throw new Error(\n `Unknown mount driver: \"${name}\". Available: ${[...factories.keys()].join(\", \") || \"none\"}`,\n );\n }\n return factory();\n}\n\n/**\n * Get a mount driver by name, or return `undefined` if not registered.\n * @param name - Driver key.\n * @returns A fresh driver instance or `undefined`.\n * @docLink packages/connectors/api-reference#try-get-mount-driver\n */\nexport function tryGetMountDriver(name: string): MountDriver | undefined {\n const factory = factories.get(name);\n return factory ? factory() : undefined;\n}\n\n/**\n * Return the names of all currently registered mount drivers.\n * @returns Array of driver keys (e.g. `[\"git\", \"s3\", \"webdav\"]`).\n * @docLink packages/connectors/api-reference#list-mount-drivers\n */\nexport function listMountDrivers(): string[] {\n return [...factories.keys()];\n}\n\nlet _registered = false;\n\n/**\n * Register every built-in mount driver from `@skaile/base-assets`.\n *\n * Factories close over the statically-imported `createDriver` functions\n * at the top of this file. Both `bun --compile` and tsup follow the\n * string-literal `import ... from \"@skaile/workspaces/base-assets/mounts/...\"`\n * specifiers at build time and bundle the driver plus its transitive\n * `@skaile/*` deps. This sidesteps the catalog path's runtime TS-import hang.\n */\nexport function registerBuiltinMountDrivers(): void {\n if (_registered) return;\n _registered = true;\n\n registerMountDriver(\"local\", () => createLocalDriver());\n registerMountDriver(\"git\", () => createGitDriver());\n registerMountDriver(\"s3\", () => createS3Driver());\n registerMountDriver(\"webdav\", () => createWebdavDriver());\n registerMountDriver(\"sharepoint\", () => createSharepointDriver());\n}\n","/**\n * Mount driver infrastructure types.\n *\n * Mounts are filesystem projections that project remote content (git repos, S3 buckets,\n * WebDAV shares, etc.) into a local directory. Agents read and write files directly\n * through the mount point. The mount driver manages mounting, unmounting, sync,\n * and optional change watching.\n *\n * @docLink packages/connectors/concepts#mount-types\n */\n\nimport type { SecretProvider } from \"./secrets.js\";\nimport type { SyncOptions, SyncResult, WatchHandle, WatchOptions } from \"./shared-types.js\";\n\n// ── Token mediator (Tier-2 credential mediation) ─────────────────────────────\n\n/**\n * Result of a single `TokenMediator` call. Mirrors\n * `AccessTokenResponseEvent.result` from `@skaile/workspaces/types` so the runner\n * can pass it straight through.\n *\n * @docLink packages/connectors/api-reference#token-mediator\n */\nexport type TokenMediatorResult =\n | {\n ok: true;\n /** Access token to use for the next git operation. */\n token: string;\n /**\n * ISO-8601 expiry, or `null` for indefinite tokens (static PATs). Drives\n * whether the driver schedules a refresh tick.\n */\n expiresAt: string | null;\n /** Optional scope/permissions list, surfaced in audit logs. */\n scope?: string[];\n }\n | {\n ok: false;\n code: \"not-configured\" | \"revoked\" | \"provider-error\" | \"backend-error\" | \"timeout\";\n /** Human-readable detail, never carries secrets. */\n message: string;\n };\n\n/**\n * Function signature mount drivers use to acquire a fresh access token from\n * the runner-owned backend mediator. Implemented by the runner: emits a\n * `request_access_token` command over the transport and resolves with the\n * matching `access_token_response` payload.\n *\n * Drivers MUST treat this as the only token source when the parsed\n * `MountAuthRef.kind === 'backend'`. Local minting (PAT, OAuth, GitHub App)\n * has been removed from the runner — provider dispatch lives on the platform.\n *\n * @docLink packages/connectors/api-reference#token-mediator\n */\nexport type TokenMediator = (input: {\n mountId: string;\n reason: \"initial\" | \"refresh\" | \"retry-401\";\n}) => Promise<TokenMediatorResult>;\n\n// ── Mount declaration (runtime config, resolved from skaile.yaml) ────────────\n\n/**\n * Parsed mount configuration from `skaile.yaml`, passed to `MountDriver.mount()` and managed by `MountManager`.\n * @docLink packages/connectors/concepts#mount-declaration\n */\nexport interface MountDeclaration {\n /** Unique identifier for this mount instance. */\n id: string;\n /** Driver type: \"git\", \"s3\", \"webdav\", \"local\", etc. */\n driver: string;\n /** Source URL or path (e.g. repo URL, bucket name, host path). */\n source: string;\n /** Override mount target directory (default: .mounts/<id>/). */\n target?: string;\n /** Access level enforced by the manager. */\n access: \"read-only\" | \"read-write\";\n /** Credential reference: \"env:VAR_NAME\" or inline value. */\n auth?: string;\n /**\n * Whether to watch this mount for filesystem changes.\n * - `true` - always watch (e.g. SharePoint read-only with background sync)\n * - `false` - never watch (e.g. large static mount you don't need change events for)\n * - omitted - auto: watch read-write mounts, skip read-only\n */\n watch?: boolean;\n /**\n * **Expert-only.** When `true`, the mount manager wires the resolved\n * credential into the workspace so the agent's interactive `git`/`curl`\n * tools can authenticate directly against the mount's host. Defaults to\n * `false` — agents have no credential exposure and rely on driver-managed\n * pulls/pushes. See the spec at `_devlog/specs/2026-05-05-git-credential-tiers.md`.\n *\n * Sensitive: enabling this gives prompt-injected agents direct CLI access\n * to whatever scope the credential carries. Refresh-capable providers\n * (OAuth, GitHub App) bound the blast radius via TTL; static PATs do not.\n */\n exposeAccessToken?: boolean;\n /**\n * Optional override for the access token TTL (seconds). When omitted, the\n * provider's natural TTL is used (3600s for GitHub App, ~8h for OAuth, N/A\n * for PAT). Values above the provider's documented maximum are silently\n * lowered to the cap and a `warning=ttl-capped` log entry is emitted.\n */\n accessTokenTTL?: number;\n /** Driver-specific configuration. */\n options?: Record<string, unknown>;\n}\n\n// ── Mount handle (returned by driver.mount) ──────────────────────────────────\n\n/**\n * Live state of a mounted resource, returned by `MountDriver.mount()` and held by `MountManager`.\n * @docLink packages/connectors/concepts#mount-handle\n */\nexport interface MountHandle {\n /** Mount declaration ID. */\n readonly id: string;\n /** Driver name. */\n readonly driver: string;\n /** Effective access level. */\n readonly access: \"read-only\" | \"read-write\";\n /** Absolute path to the mounted directory. */\n readonly mountPath: string;\n /** Whether the resource is currently mounted. */\n mounted: boolean;\n /** Driver-specific state. Opaque to callers. */\n state: unknown;\n}\n\n// ── Mount change event ───────────────────────────────────────────────────────\n\n/**\n * Filesystem change event emitted by a mount driver's `watch()` implementation.\n * @docLink packages/connectors/concepts#mount-change-event\n */\nexport interface MountChangeEvent {\n /** Relative path within the mount. */\n path: string;\n /** What happened. */\n action: \"create\" | \"edit\" | \"delete\" | \"conflict\";\n /** What caused the change. */\n source: \"filesystem\" | \"remote\" | \"sync\";\n}\n\n// ── MountManager info ────────────────────────────────────────────────────────\n\n/**\n * Summary of a mounted resource returned by `MountManager.listMounts()`.\n * @docLink packages/connectors/concepts#mount-info\n */\nexport interface MountInfo {\n id: string;\n driver: string;\n access: \"read-only\" | \"read-write\";\n mountPath: string;\n /** Whether the resource is currently mounted. */\n mounted: boolean;\n /** Source URL or path declared in the mount configuration. */\n source: string;\n}\n\n/**\n * Bulk mount result returned by `MountManager.mountAll()`.\n * @docLink packages/connectors/concepts#mount-report\n */\nexport interface MountReport {\n results: Array<{\n id: string;\n mounted: boolean;\n mountPath?: string;\n error?: string;\n /** Access level of the declaration; preserved so callers can distinguish RW from RO failures. */\n access?: \"read-only\" | \"read-write\";\n }>;\n}\n\n/**\n * Thrown by `MountManager.mountAll` when at least one read-write mount fails\n * and `failOnReadWriteError: true` was set. Carries the full `MountReport` so\n * the caller can inspect successful mounts and read-only failures.\n * @docLink packages/connectors/concepts#mount-startup-error\n */\nexport class MountStartupError extends Error {\n readonly report: MountReport;\n readonly failedReadWriteMounts: ReadonlyArray<{ id: string; error: string }>;\n\n constructor(\n message: string,\n report: MountReport,\n failedReadWriteMounts: ReadonlyArray<{ id: string; error: string }>,\n ) {\n super(message);\n this.name = \"MountStartupError\";\n this.report = report;\n this.failedReadWriteMounts = failedReadWriteMounts;\n }\n}\n\n// ── Driver interface ──────────────────────────────────────────────────────────\n\n/**\n * Contract for mount driver implementations. Drivers mount remote content\n * (git repos, S3 buckets, WebDAV shares) into a local directory. Extend\n * `AbstractMountDriver` for base registration and a default `watch()` no-op.\n * @docLink packages/connectors/concepts#mount-driver\n */\nexport interface MountDriver {\n /** Driver type identifier: \"git\", \"s3\", \"webdav\", \"local\", etc. */\n readonly name: string;\n\n // ── Lifecycle ──\n\n /**\n * Mount the mount's source content into targetDir and return a handle.\n * Creates targetDir if it doesn't exist.\n *\n * @param declaration - Mount configuration from skaile.yaml\n * @param targetDir - Absolute path to the directory where content will be mounted\n * @param secrets - Secret provider for resolving credential references\n * @param tokenMediator - Optional callback used by `auth: backend` git mounts\n * to request short-lived access tokens from the platform's credential\n * mediator. Absent in standalone CLI contexts; required for any mount\n * declaring `auth: backend`.\n */\n mount(\n declaration: MountDeclaration,\n targetDir: string,\n secrets?: SecretProvider,\n tokenMediator?: TokenMediator,\n ): Promise<MountHandle>;\n /** Unmount and release all resources held by this mount. */\n unmount(handle: MountHandle): Promise<void>;\n\n // ── Sync ──\n\n /** Pull the latest remote state into the mounted directory. */\n sync(handle: MountHandle, options?: SyncOptions): Promise<SyncResult>;\n\n // ── Watch (optional — drivers that can detect changes implement this) ──\n\n /**\n * Subscribe to filesystem changes within the mount. The mechanism is\n * driver-specific: OS-level watchers for local/git, periodic diffing for S3/WebDAV.\n */\n watch?(\n handle: MountHandle,\n callback: (event: MountChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle;\n\n // ── Session lifecycle (optional) ──\n\n /**\n * Called before the container hibernates. Drivers should persist\n * unsaved state (e.g. git commit + push). Return a detail string\n * (e.g. commit SHA) or void.\n */\n onHibernate?(handle: MountHandle): Promise<string | undefined>;\n\n /**\n * Called when the session is closing. Drivers should finalize work\n * (e.g. merge branch, push). Return a detail string or void.\n */\n onSessionClose?(handle: MountHandle): Promise<string | undefined>;\n}\n\n// ── Driver factory ────────────────────────────────────────────────────────────\n\n/**\n * Factory function signature used by the mount registry.\n * @docLink packages/connectors/api-reference#mount-driver-factory\n */\nexport type MountDriverFactory = () => MountDriver;\n","/**\n * MountManager — manages mount lifecycle: mount, sync, watch, unmount, hot-plug.\n *\n * Orchestrates `MountDriver` instances resolved from the mount registry.\n * Each mounted resource is tracked by its declaration ID and can be individually\n * mounted, unmounted, synced, or watched at any time (hot-plug).\n *\n * @docLink packages/connectors/concepts#mount-manager\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type { CatalogEntry } from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport { registerMountDriver, tryGetMountDriver } from \"./mount-registry.js\";\nimport {\n type MountChangeEvent,\n type MountDeclaration,\n type MountDriver,\n type MountHandle,\n type MountInfo,\n type MountReport,\n MountStartupError,\n type TokenMediator,\n} from \"./mount-types.js\";\nimport type { PreMintedSecretProvider, SecretProvider } from \"./secrets.js\";\nimport type { SyncOptions, SyncResult, WatchHandle, WatchOptions } from \"./shared-types.js\";\n\ninterface MountedEntry {\n driver: MountDriver;\n handle: MountHandle;\n declaration: MountDeclaration;\n watchHandle?: WatchHandle;\n}\n\ninterface LifecycleResult {\n id: string;\n ok: boolean;\n error?: string;\n detail?: string;\n}\n\n/**\n * Manages the full lifecycle of workspace mounts: mounting, unmounting, syncing,\n * and watching for filesystem changes. Resolves drivers from the registry or catalog.\n * @docLink packages/connectors/concepts#mount-manager\n */\nexport class MountManager {\n private mounts = new Map<string, MountedEntry>();\n readonly workspaceDir: string;\n private readonly secrets?: SecretProvider;\n private readonly catalogEntries: CatalogEntry[];\n private readonly tokenMediator?: TokenMediator;\n private readonly preMintedSecrets?: PreMintedSecretProvider;\n private readonly mgrLog: Logger;\n\n /**\n * @param workspaceDir - Working directory for resolving relative mount paths.\n * @param secretsOrOpts - Optional secret provider, or an options object with\n * `secrets` and/or `catalogEntries` and/or `tokenMediator` and/or\n * `preMintedSecrets`. The token mediator handles refresh + retry-401\n * paths; the pre-minted secret provider answers the initial-mint\n * lookup for `auth: backend` mounts without a round trip to the\n * platform (since v3 / `session_init`).\n */\n constructor(\n workspaceDir: string,\n secretsOrOpts?:\n | SecretProvider\n | {\n secrets?: SecretProvider;\n catalogEntries?: CatalogEntry[];\n tokenMediator?: TokenMediator;\n preMintedSecrets?: PreMintedSecretProvider;\n },\n ) {\n this.workspaceDir = resolve(workspaceDir);\n if (\n secretsOrOpts &&\n typeof secretsOrOpts === \"object\" &&\n (\"catalogEntries\" in secretsOrOpts ||\n \"tokenMediator\" in secretsOrOpts ||\n \"preMintedSecrets\" in secretsOrOpts)\n ) {\n this.secrets = secretsOrOpts.secrets;\n this.catalogEntries = secretsOrOpts.catalogEntries ?? [];\n this.tokenMediator = secretsOrOpts.tokenMediator;\n this.preMintedSecrets = secretsOrOpts.preMintedSecrets;\n } else {\n this.secrets = secretsOrOpts as SecretProvider | undefined;\n this.catalogEntries = [];\n }\n this.mgrLog = createLogger({\n kind: \"mount\",\n subkind: \"manager\",\n instance: this.workspaceDir,\n });\n }\n\n /**\n * Wrap the user-supplied {@link TokenMediator} so that `reason: 'initial'`\n * calls for an `auth: backend` mount first consult the pre-minted\n * credentials delivered with the v3 `session_init` envelope. Falls back\n * to the original mediator for refresh / retry-401 paths and for\n * `reason: 'initial'` lookups that have no pre-minted entry.\n *\n * Built once at construction is tempting but the mediator is set on\n * `this.tokenMediator` after the wrap; building lazily keeps the wrapped\n * surface symmetric with the underlying field.\n */\n private buildWrappedMediator(): TokenMediator | undefined {\n const original = this.tokenMediator;\n const preMinted = this.preMintedSecrets;\n if (!preMinted) return original;\n\n return async ({ mountId, reason }) => {\n if (reason === \"initial\") {\n const mint = preMinted.mintFor(\"mount\", mountId);\n if (mint?.ok) {\n this.mgrLog.debug(\"initial token served from pre-mint\", { mountId });\n return { ok: true, token: mint.token, expiresAt: mint.expiresAt };\n }\n // Pre-mint exists but failed at the platform mediator. Surface the\n // real reason instead of falling through — falling through would\n // either hit the generic \"no runner-side mediator\" message below or\n // (in CLI mode with a wired original) shadow a decision the\n // platform has already made. The runner-side original mediator is\n // only the right answer when there is NO pre-mint entry at all.\n if (mint && !mint.ok) {\n return {\n ok: false,\n code: mint.code ?? \"not-configured\",\n message:\n mint.message ??\n `Mount '${mountId}' pre-mint failed at the backend mediator (no detail provided).`,\n };\n }\n // No pre-mint entry: fall through to the original mediator (e.g.\n // standalone CLI where pre-minting did not happen).\n }\n if (!original) {\n return {\n ok: false,\n code: \"not-configured\",\n message:\n `Mount '${mountId}' requested ${reason} token but no pre-mint ` +\n `is available and no runner-side mediator is wired.`,\n };\n }\n return original({ mountId, reason });\n };\n }\n\n // ── Private helpers ─────────────────────────────────────────────────────────\n\n private async resolveDriver(driver: string): Promise<MountDriver> {\n // 1. Check local registry\n const registered = tryGetMountDriver(driver);\n if (registered) return registered;\n\n // 2. Catalog lookup\n const entry = this.catalogEntries.find((e) => e.kind === \"mount\" && e.name === driver);\n if (!entry) {\n throw new Error(\n `Unknown mount driver: \"${driver}\". ` +\n `Run 'skaile search mount' to see available drivers.`,\n );\n }\n\n // 3. Dynamic import\n const entryPoint = (entry.metadata?.entry as string) ?? \"./driver.ts\";\n const driverPath = resolve(dirname(entry.source), entryPoint);\n const mod = await import(driverPath);\n if (typeof mod.createDriver !== \"function\") {\n throw new Error(`Mount driver \"${driver}\" at ${driverPath} does not export createDriver()`);\n }\n const driverInstance: MountDriver = mod.createDriver();\n\n // Cache in registry\n registerMountDriver(driver, () => driverInstance);\n return driverInstance;\n }\n\n // ── Bulk lifecycle ──────────────────────────────────────────────────────────\n\n /**\n * Mount all declared mounts. Continues mounting remaining mounts even when one fails,\n * so the caller always receives a full report.\n *\n * @param declarations - Mount declarations from `skaile.yaml`.\n * @param options - When `failOnReadWriteError: true`, throws {@link MountStartupError}\n * after collecting the full report if any `read-write` mount failed. Read-only\n * mount failures never throw — they are tolerated as degraded state.\n *\n * @returns MountReport with per-mount success/error/mountPath/access.\n * @throws {MountStartupError} when `failOnReadWriteError` is true and any RW mount failed.\n */\n async mountAll(\n declarations: MountDeclaration[],\n options?: { failOnReadWriteError?: boolean },\n ): Promise<MountReport> {\n this.mgrLog.info(\"mountAll start\", { count: declarations.length });\n const results: MountReport[\"results\"] = [];\n for (const decl of declarations) {\n try {\n const handle = await this.mount(decl);\n results.push({\n id: decl.id,\n mounted: true,\n mountPath: handle.mountPath,\n access: decl.access,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.mgrLog.error(\"mount failed\", err, { id: decl.id, driver: decl.driver });\n results.push({\n id: decl.id,\n mounted: false,\n error: msg,\n access: decl.access,\n });\n }\n }\n const report: MountReport = { results };\n this.mgrLog.info(\"mountAll complete\", {\n mounted: results.filter((r) => r.mounted).length,\n failed: results.filter((r) => !r.mounted).length,\n });\n\n if (options?.failOnReadWriteError) {\n const failedRw = results\n .filter((r) => !r.mounted && r.access === \"read-write\")\n .map((r) => ({ id: r.id, error: r.error ?? \"unknown error\" }));\n if (failedRw.length > 0) {\n const summary = failedRw.map((f) => `\"${f.id}\": ${f.error}`).join(\"; \");\n this.mgrLog.error(\"mountAll failed: required read-write mount(s) failed\", undefined, {\n summary,\n });\n throw new MountStartupError(\n `Required read-write mount(s) failed to mount: ${summary}`,\n report,\n failedRw,\n );\n }\n }\n\n return report;\n }\n\n /** Unmount all mounts and stop all watchers. Best-effort — ignores unmount errors. */\n async unmountAll(): Promise<void> {\n await this.unwatchAll();\n for (const [, entry] of this.mounts) {\n try {\n await entry.driver.unmount(entry.handle);\n } catch {\n /* best-effort */\n }\n }\n this.mounts.clear();\n }\n\n // ── Hot-plug ────────────────────────────────────────────────────────────────\n\n /**\n * Mount a single resource (hot-plug). For local driver with absolute source and no\n * explicit target, binds directly to the source path.\n *\n * @returns The MountHandle with the resolved mountPath.\n */\n async mount(declaration: MountDeclaration): Promise<MountHandle> {\n const driver = await this.resolveDriver(declaration.driver);\n // For local driver with absolute source and no explicit target,\n // use the source path directly (it's already on disk / bind-mounted).\n let absPath: string;\n if (\n declaration.driver === \"local\" &&\n !declaration.target &&\n declaration.source.startsWith(\"/\")\n ) {\n absPath = declaration.source;\n } else {\n const mountPath = declaration.target ?? `.mounts/${declaration.id}`;\n absPath = resolve(this.workspaceDir, mountPath);\n }\n if (!existsSync(absPath)) mkdirSync(absPath, { recursive: true });\n const driverLog = createLogger({\n kind: \"mount\",\n subkind: driver.name,\n instance: declaration.id,\n });\n (driver as { setLogger?: (l: Logger) => void }).setLogger?.(driverLog);\n const handle = await driver.mount(\n declaration,\n absPath,\n this.secrets,\n this.buildWrappedMediator(),\n );\n this.mounts.set(declaration.id, { driver, handle, declaration });\n return handle;\n }\n\n /**\n * Unmount a single mount by ID and stop its watcher.\n *\n * @throws {Error} if the mount is not found\n */\n async unmount(id: string): Promise<void> {\n const entry = this.mounts.get(id);\n if (!entry) throw new Error(`Mount not found: \"${id}\"`);\n this.mgrLog.info(\"unmount\", { id });\n if (entry.watchHandle) {\n try {\n await entry.watchHandle.close();\n } catch {\n /* best-effort */\n }\n }\n await entry.driver.unmount(entry.handle);\n this.mounts.delete(id);\n }\n\n // ── Sync ────────────────────────────────────────────────────────────────────\n\n /** Sync all mounted mounts. */\n async syncAll(options?: SyncOptions): Promise<void> {\n for (const [, entry] of this.mounts) {\n await entry.driver.sync(entry.handle, options);\n }\n }\n\n /**\n * Sync a single mount (pull latest remote state).\n *\n * @throws {Error} if the mount is not found\n */\n async sync(id: string, options?: SyncOptions): Promise<SyncResult> {\n const entry = this.get(id);\n this.mgrLog.debug(\"sync\", { id });\n return entry.driver.sync(entry.handle, options);\n }\n\n // ── Watch ───────────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to filesystem change events for all mounted mounts.\n * Respects the watch flag on each declaration (default: watch read-write, skip read-only).\n * Automatically excludes nested mount paths from parent watchers.\n */\n watchAll(\n callback: (mountId: string, event: MountChangeEvent) => void,\n options?: WatchOptions,\n ): void {\n // Collect all mount paths so we can exclude nested mounts from parent watchers.\n // Without this, a mount at /skaile would recursively scan /skaile/workspace/node_modules\n // even though /skaile/workspace has its own dedicated watcher.\n const allMountPaths = [...this.mounts.values()].map((e) => e.handle.mountPath);\n\n for (const [id, entry] of this.mounts) {\n if (!entry.driver.watch) continue;\n // Respect explicit watch flag; default: watch read-write, skip read-only.\n // Read-only mounts with external sync (e.g. SharePoint) can opt in via watch: true.\n const shouldWatch = entry.declaration.watch ?? entry.declaration.access !== \"read-only\";\n if (!shouldWatch) continue;\n\n // Build per-mount ignore list: exclude mount paths of other mounts\n // that are nested inside this mount's path.\n const myPath = entry.handle.mountPath;\n const nestedPaths = allMountPaths\n .filter((p) => p !== myPath && p.startsWith(`${myPath}/`))\n .map((p) => `${p}/**`);\n const mergedOptions: WatchOptions = {\n ...options,\n ignored: [...(options?.ignored ?? []), ...nestedPaths],\n };\n\n try {\n entry.watchHandle = entry.driver.watch(\n entry.handle,\n (event) => callback(id, event),\n mergedOptions,\n );\n } catch {\n /* best-effort */\n }\n }\n }\n\n /** Stop all active filesystem watchers. */\n async unwatchAll(): Promise<void> {\n for (const [, entry] of this.mounts) {\n if (entry.watchHandle) {\n try {\n await entry.watchHandle.close();\n } catch {\n /* best-effort */\n }\n entry.watchHandle = undefined;\n }\n }\n }\n\n // ── Session lifecycle ───────────────────────────────────────────────────────\n\n async hibernateAll(): Promise<LifecycleResult[]> {\n return this.runLifecycleHook(\"onHibernate\");\n }\n\n async closeAll(): Promise<LifecycleResult[]> {\n return this.runLifecycleHook(\"onSessionClose\");\n }\n\n private async runLifecycleHook(\n hook: \"onHibernate\" | \"onSessionClose\",\n ): Promise<LifecycleResult[]> {\n const results: LifecycleResult[] = [];\n for (const [id, entry] of this.mounts) {\n const fn = entry.driver[hook];\n if (!fn) {\n results.push({ id, ok: true });\n continue;\n }\n try {\n const detail = await fn.call(entry.driver, entry.handle);\n results.push({ id, ok: true, detail: detail ?? undefined });\n } catch (err) {\n results.push({ id, ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n }\n return results;\n }\n\n // ── Discovery ───────────────────────────────────────────────────────────────\n\n /**\n * Return the internal MountedEntry entry for a mount.\n *\n * @throws {Error} if the mount is not found\n */\n get(id: string): MountedEntry {\n const entry = this.mounts.get(id);\n if (!entry) throw new Error(`Mount not found: \"${id}\"`);\n return entry;\n }\n\n has(id: string): boolean {\n return this.mounts.has(id);\n }\n\n /**\n * Return summary info for all currently mounted mounts.\n *\n * @returns Array of MountInfo with paths relative to workspaceDir where possible.\n */\n listMounts(): MountInfo[] {\n return [...this.mounts.entries()].map(([id, entry]) => ({\n id,\n driver: entry.driver.name,\n access: entry.declaration.access,\n mountPath: entry.handle.mountPath.startsWith(this.workspaceDir)\n ? entry.handle.mountPath.slice(this.workspaceDir.length + 1)\n : entry.handle.mountPath,\n mounted: entry.handle.mounted,\n source: entry.declaration.source,\n }));\n }\n\n /**\n * Return the subset of currently mounted mounts whose driver is `git`,\n * surfacing the fields prompt-builders need (source URL +\n * `exposeAccessToken` flag) plus the `auth` ref so consumers (the runner's\n * refresh-flag watcher) can decide whether the mount is eligible for\n * backend-mediated refresh.\n *\n * Used by `buildMountPromptSection` for Tier-1/Tier-2 guidance and by\n * the runner's wake-mid-401 refresh handler.\n */\n listGitMounts(): Array<{\n id: string;\n source: string;\n exposeAccessToken: boolean;\n auth?: string;\n }> {\n const out: Array<{\n id: string;\n source: string;\n exposeAccessToken: boolean;\n auth?: string;\n }> = [];\n for (const [, entry] of this.mounts) {\n if (entry.driver.name !== \"git\") continue;\n out.push({\n id: entry.declaration.id,\n source: entry.declaration.source,\n exposeAccessToken: entry.declaration.exposeAccessToken === true,\n auth: entry.declaration.auth,\n });\n }\n return out;\n }\n}\n","/**\n * Build a markdown section describing mounted resources for the system prompt.\n */\n\nimport type { MountManager } from \"./mount-manager.js\";\n\n/**\n * Build a markdown section describing all mounted resources for the agent's system prompt.\n * Emits a table of mount IDs, drivers, paths, and access levels, plus Tier-1/Tier-2 git auth guidance.\n * @param manager - The `MountManager` after `mountAll()` has been called.\n * @returns Markdown string to append to the system prompt, or an empty string when no mounts are active.\n * @docLink packages/connectors/api-reference#build-mount-prompt-section\n */\nexport function buildMountPromptSection(manager: MountManager): string {\n const mounts = manager.listMounts();\n if (mounts.length === 0) return \"\";\n\n const lines: string[] = [\n \"## Mounts\",\n \"\",\n \"The following directories are mounted resources. Read and write files normally.\",\n \"\",\n \"| Mount | Driver | Path | Access |\",\n \"|---|---|---|---|\",\n ];\n for (const v of mounts) {\n lines.push(`| ${v.id} | ${v.driver} | \\`${v.mountPath}/\\` | ${v.access} |`);\n }\n\n // Tier-2 / Tier-1 git auth note (spec: 2026-05-05-git-credential-tiers).\n // Two branches:\n // - Any git mount with `exposeAccessToken: true` (Tier-2):\n // advertise CLI auth so the agent uses native git for push/pull.\n // - Any git mount with the flag off or unset (Tier-1, the secure default):\n // instruct the agent NOT to retry on auth failures — driver-managed\n // pulls/pushes are the only authenticated path.\n const gitMounts = manager.listGitMounts();\n if (gitMounts.length > 0) {\n const tier2 = gitMounts.filter((m) => m.exposeAccessToken === true);\n const tier1 = gitMounts.filter((m) => m.exposeAccessToken !== true);\n if (tier2.length > 0) {\n const hosts = [...new Set(tier2.map((m) => safeHost(m.source)))].filter(Boolean);\n lines.push(\"\");\n lines.push(\n `> **Git auth (CLI):** the git CLI is authenticated for the duration of this session ` +\n `for ${hosts.map((h) => `\\`${h}\\``).join(\", \")}. Use \\`git push\\` / \\`git pull\\` directly.`,\n );\n }\n if (tier1.length > 0) {\n lines.push(\"\");\n lines.push(\n \"> **Git auth (mount-managed):** `git push` / `git pull` against mount remotes go \" +\n \"through the workspace mount, not the agent. If a network git command fails with \" +\n '\"could not read Username\", do not retry — the credential is intentionally not ' +\n \"exposed to the CLI. Use the workspace's autoPush / autoPull or ask the user to \" +\n 'enable \"Allow agent to use git CLI directly\" on the mount.',\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction safeHost(source: string): string {\n try {\n return new URL(source).host;\n } catch {\n return source;\n }\n}\n","/**\n * NpmInstaller — wraps `bun add` to install peer dependencies for connectors.\n *\n * Accepts an injectable `spawn` function so tests can verify calls without\n * running a real subprocess.\n */\n\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Result returned by the injectable `SpawnFn`.\n * @docLink packages/connectors/api-reference#spawn-result\n */\nexport interface SpawnResult {\n /** Process exit code. Zero means success. */\n exitCode: number;\n /** Combined stdout + stderr output from the subprocess. */\n output: string;\n}\n\n/**\n * Injectable subprocess spawn function used by `installNpmPackages` and test doubles.\n * @docLink packages/connectors/api-reference#spawn-fn\n */\nexport type SpawnFn = (cmd: string[], opts: { cwd: string }) => Promise<SpawnResult>;\n\n/**\n * Options for `installNpmPackages`. Pass a custom `spawn` to test without running real subprocesses.\n * @docLink packages/connectors/api-reference#install-options\n */\nexport interface InstallOptions {\n /** Injectable spawn function. Defaults to a real `Bun.spawn` wrapper. */\n spawn?: SpawnFn;\n}\n\n/**\n * Result returned by `installNpmPackages`.\n * @docLink packages/connectors/api-reference#install-result\n */\nexport interface InstallResult {\n /** `true` when the subprocess exited with code 0. */\n success: boolean;\n /** Combined stdout + stderr from the `bun add` invocation. */\n output: string;\n}\n\n/** Default spawn implementation using Bun's subprocess API. */\nexport async function defaultSpawn(cmd: string[], opts: { cwd: string }): Promise<SpawnResult> {\n const proc = Bun.spawn(cmd, {\n cwd: opts.cwd,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const [stdout, stderr, exitCode] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n proc.exited,\n ]);\n return { exitCode, output: stdout + stderr };\n}\n\n/**\n * Install npm packages as optional peer deps using `bun add --optional`.\n *\n * @param packages Package names to install (e.g. [\"pg\", \"@types/pg\"]).\n * @param projectDir Absolute path to the project root (where bun.lock lives).\n * @param opts Injectable options for testing.\n */\nexport async function installNpmPackages(\n packages: string[],\n projectDir: string,\n opts?: InstallOptions,\n): Promise<InstallResult> {\n if (packages.length === 0) {\n return { success: true, output: \"\" };\n }\n\n const spawnFn = opts?.spawn ?? defaultSpawn;\n const result = await spawnFn([\"bun\", \"add\", \"--optional\", ...packages], {\n cwd: projectDir,\n });\n\n return {\n success: result.exitCode === 0,\n output: result.output,\n };\n}\n\n/**\n * Check whether an npm package can be resolved from `projectDir`'s module\n * graph. Returns true when `require.resolve` finds the package, false on any\n * resolution failure (missing, broken, etc.). Does not load the module — only\n * verifies it can be located.\n *\n * Use this to decide whether `installNpmPackages` needs to run before a\n * connector adapter or mount driver tries to `import` its peer dep.\n */\nexport function isPackageResolvable(pkg: string, projectDir: string): boolean {\n try {\n const require = createRequire(pathToFileURL(`${projectDir}/`).href);\n require.resolve(pkg);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Filter a list of npm packages down to those that cannot be resolved from\n * `projectDir`. Convenience for \"install only what's missing\" call sites.\n */\nexport function findMissingPackages(packages: string[], projectDir: string): string[] {\n return packages.filter((p) => !isPackageResolvable(p, projectDir));\n}\n","/**\n * Shared filesystem watcher factory for mountable adapters.\n *\n * Uses chokidar for cross-platform, debounced file watching.\n *\n * Automatically reads .gitignore from the watched directory and merges\n * those patterns into chokidar's ignore list. This prevents scanning\n * large generated directories (node_modules, dist, .next, etc.) that\n * most projects already declare as ignored.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\n// Static import so bun --compile bundles chokidar into the binary. A dynamic\n// `await import(\"chokidar\")` is not seen by the compiler's static analyzer\n// and fails at runtime inside the /$bunfs/ virtual filesystem.\nimport chokidar from \"chokidar\";\nimport type { MountChangeEvent } from \"./mount-types.js\";\nimport type { WatchHandle, WatchOptions } from \"./shared-types.js\";\n\n/**\n * Convert a glob pattern to a matcher function.\n *\n * Chokidar 5 changed string matchers to exact equality (`===`) instead of\n * glob matching. We convert our patterns to functions so chokidar can still\n * filter correctly.\n */\nfunction globToMatcher(pattern: string): (path: string) => boolean {\n // Simple segment-name patterns: **/NAME/** or **/NAME\n // Match any path that contains /NAME/ or ends with /NAME\n const segmentMatch = pattern.match(/^\\*\\*\\/([^*/?]+)\\/\\*\\*$/);\n if (segmentMatch) {\n const name = segmentMatch[1];\n return (p: string) => p.includes(`/${name}/`) || p.endsWith(`/${name}`) || p === name;\n }\n\n // Dot-prefixed segment: **/.NAME or **/.NAME/**\n const dotSegment = pattern.match(/^\\*\\*\\/(\\.[\\w#]+)(?:\\/\\*\\*)?$/);\n if (dotSegment) {\n const name = dotSegment[1];\n return (p: string) => p.includes(`/${name}/`) || p.endsWith(`/${name}`) || p === name;\n }\n\n // Extension wildcard: **/*.EXT.* or **/*.EXT\n const extMatch = pattern.match(/^\\*\\*\\/\\*(\\.\\w+(?:\\.\\*)?)/);\n if (extMatch) {\n const suffix = extMatch[1];\n if (suffix.endsWith(\".*\")) {\n // e.g. **/*.tmp.* -> match any file with .tmp. in it\n const base = suffix.slice(0, -2);\n return (p: string) => p.includes(base);\n }\n return (p: string) => p.endsWith(suffix);\n }\n\n // Suffix wildcard: **/*SUFFIX (e.g. **/*~)\n const suffixMatch = pattern.match(/^\\*\\*\\/\\*(.+)$/);\n if (suffixMatch) {\n const sfx = suffixMatch[1];\n return (p: string) => p.endsWith(sfx);\n }\n\n // Fallback: convert simple globs to regex\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n const re = new RegExp(`^${escaped}$`);\n return (p: string) => re.test(p);\n}\n\nconst DEFAULT_IGNORED: Array<string | ((path: string) => boolean)> = [\n (p: string) => p.includes(\"/.git/\") || p.endsWith(\"/.git\"),\n (p: string) => p.includes(\"/node_modules/\") || p.endsWith(\"/node_modules\"),\n (p: string) => p.includes(\"/.connectors/\") || p.endsWith(\"/.connectors\"),\n // Atomic-write tempfiles (Bun.write creates `<name>.tmp.<pid>.<ts>` then renames).\n // These vanish between readdir and fs.watch, causing EINVAL that crashes the process.\n (p: string) => /\\.tmp\\.\\d/.test(p),\n // Editor swap/backup files that also race with save operations.\n (p: string) => p.endsWith(\".swp\"),\n (p: string) => p.endsWith(\".swx\"),\n (p: string) => p.includes(\"/.#\"),\n (p: string) => p.endsWith(\"~\"),\n];\nconst DEFAULT_DEBOUNCE_MS = 150;\n\n/**\n * Parse a .gitignore file into glob patterns suitable for chokidar's `ignored` option.\n * Handles comments, blank lines, directory patterns, and root-relative patterns.\n * Negation patterns (!) are skipped - chokidar cannot un-ignore.\n */\nfunction parseGitignore(rootDir: string): Array<(path: string) => boolean> {\n const gitignorePath = join(rootDir, \".gitignore\");\n if (!existsSync(gitignorePath)) return [];\n\n try {\n const content = readFileSync(gitignorePath, \"utf-8\");\n const matchers: Array<(path: string) => boolean> = [];\n\n for (const raw of content.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\") || line.startsWith(\"!\")) continue;\n\n let pattern = line;\n\n // Strip leading / (root-relative -> convert to rootDir-relative)\n if (pattern.startsWith(\"/\")) {\n pattern = pattern.slice(1);\n } else if (!pattern.includes(\"/\")) {\n // Bare name like \"node_modules\" or \"*.log\" -> match anywhere\n pattern = `**/${pattern}`;\n }\n\n // Directory pattern (trailing /) -> ensure it matches contents too\n if (pattern.endsWith(\"/\")) {\n matchers.push(globToMatcher(`${pattern}**`));\n } else {\n matchers.push(globToMatcher(pattern));\n // Also match as directory (e.g. \"dist\" should match \"dist/\" and \"dist/**\")\n if (!pattern.includes(\"*\") && !pattern.includes(\".\")) {\n matchers.push(globToMatcher(`${pattern}/**`));\n }\n }\n }\n\n return matchers;\n } catch {\n return [];\n }\n}\n\ntype ChokidarAction = \"create\" | \"edit\" | \"delete\";\n\nconst CHOKIDAR_EVENT_MAP: Record<string, ChokidarAction> = {\n add: \"create\",\n change: \"edit\",\n unlink: \"delete\",\n addDir: \"create\",\n unlinkDir: \"delete\",\n};\n\n/**\n * Create a cross-platform filesystem watcher on `rootDir` using chokidar.\n * Auto-reads `.gitignore` from `rootDir` and merges those patterns into the ignore list.\n * @param rootDir - Absolute path to the directory to watch.\n * @param callback - Called with each `MountChangeEvent` (create / edit / delete).\n * @param options - Debounce interval and additional ignore patterns.\n * @returns A `WatchHandle` — call `.close()` to stop watching.\n * @docLink packages/connectors/api-reference#create-fs-watcher\n */\nexport async function createFsWatcher(\n rootDir: string,\n callback: (event: MountChangeEvent) => void,\n options?: WatchOptions,\n): Promise<WatchHandle> {\n const log = createLogger({ kind: \"connector\", subkind: \"watcher\", instance: rootDir });\n const gitignorePatterns = parseGitignore(rootDir);\n // Convert any remaining string patterns from options to matcher functions\n // (chokidar 5 treats strings as exact equality, not globs)\n const optionsIgnored = (options?.ignored ?? []).map((entry) =>\n typeof entry === \"string\" ? globToMatcher(entry) : entry,\n );\n const ignored = [...DEFAULT_IGNORED, ...gitignorePatterns, ...optionsIgnored];\n const debounceMs = options?.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n\n const watcher = chokidar.watch(rootDir, {\n ignoreInitial: true,\n ignored,\n awaitWriteFinish: { stabilityThreshold: debounceMs, pollInterval: 50 },\n usePolling: false,\n });\n\n // Swallow transient watch errors (EINVAL/ENOENT when a file vanishes between\n // readdir and fs.watch). Without this handler, chokidar rethrows and the\n // agent process dies.\n watcher.on(\"error\", (err) => {\n const message = err instanceof Error ? err.message : String(err);\n log.warn(\"watcher error (non-fatal)\", { message });\n });\n\n for (const [chokidarEvent, action] of Object.entries(CHOKIDAR_EVENT_MAP)) {\n (watcher as { on(event: string, fn: (fullPath: string) => void): void }).on(\n chokidarEvent,\n (fullPath: string) => {\n const rel = relative(rootDir, fullPath);\n if (!rel || rel.startsWith(\"..\")) return;\n // Normalize to forward slashes\n const normalizedPath = rel.split(\"\\\\\").join(\"/\");\n callback({ path: normalizedPath, action, source: \"filesystem\" });\n },\n );\n }\n\n return {\n close: () => watcher.close(),\n };\n}\n","/**\n * Shared git worktree helper for service connectors.\n *\n * Provides create/cleanup with a cross-adapter ownership registry\n * that prevents one adapter from removing a worktree another is using.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Result of a successful `createWorktree` call. The `cleanup` function removes the\n * worktree when no other owners are registered for the same path.\n * @docLink packages/connectors/api-reference#worktree-result\n */\nexport interface WorktreeResult {\n /** Absolute path to the worktree directory. */\n path: string;\n /** Resolved full SHA of the ref. */\n ref: string;\n /** Branch name if ref was a branch. */\n branch?: string;\n /** Remove the worktree. Fails if other owners exist in registry. */\n cleanup: () => Promise<void>;\n}\n\n/**\n * Summary entry returned by `listWorktrees`.\n * @docLink packages/connectors/api-reference#worktree-info\n */\nexport interface WorktreeInfo {\n /** Absolute path to the worktree. */\n path: string;\n /** HEAD commit SHA. */\n head: string;\n /** Branch reference, if a named branch is checked out. */\n branch?: string;\n}\n\n// ── Registry ────────────────────────────────────────────────────────────────\n\nclass WorktreeRegistryImpl {\n private readonly entries = new Map<string, Set<string>>();\n\n register(path: string, owner: string): void {\n let owners = this.entries.get(path);\n if (!owners) {\n owners = new Set();\n this.entries.set(path, owners);\n }\n owners.add(owner);\n }\n\n deregister(path: string, owner: string): void {\n const owners = this.entries.get(path);\n if (!owners) return;\n owners.delete(owner);\n if (owners.size === 0) this.entries.delete(path);\n }\n\n isInUse(path: string): boolean {\n return (this.entries.get(path)?.size ?? 0) > 0;\n }\n\n owners(path: string): string[] {\n return [...(this.entries.get(path) ?? [])];\n }\n}\n\n/**\n * Module-level singleton registry shared across all service-connector adapters in the same process.\n * Prevents one adapter from removing a worktree that another adapter is still using.\n * @docLink packages/connectors/api-reference#worktree-registry\n */\nexport const worktreeRegistry = new WorktreeRegistryImpl();\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction git(args: string, cwd: string): string {\n return execSync(`git ${args}`, { cwd, encoding: \"utf-8\" }).trim();\n}\n\nfunction resolveRef(repoRoot: string, ref: string): string {\n return git(`rev-parse --verify ${ref}`, repoRoot);\n}\n\n/**\n * Walk up from `fromDir` to find the git repository root.\n * @param fromDir - Any directory inside a git repository.\n * @returns Absolute path to the repository root.\n * @throws {Error} when no git repository is found.\n * @docLink packages/connectors/api-reference#find-git-root\n */\nexport function findGitRoot(fromDir: string): string {\n return git(\"rev-parse --show-toplevel\", fromDir);\n}\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Create a git worktree for `ref` under `baseDir` and register it with `worktreeRegistry`.\n * The returned `WorktreeResult.cleanup()` removes the worktree when no other owners remain.\n * @param opts - Repo root, git ref, base directory, optional label, and owner ID.\n * @returns Path, resolved SHA, branch name, and `cleanup()` function.\n * @throws {Error} if the ref cannot be resolved.\n * @docLink packages/connectors/api-reference#create-worktree\n */\nexport async function createWorktree(opts: {\n repoRoot: string;\n ref: string;\n baseDir: string;\n label?: string;\n owner: string;\n}): Promise<WorktreeResult> {\n const sha = resolveRef(opts.repoRoot, opts.ref);\n const label = opts.label ?? sha.slice(0, 8);\n const wtPath = resolve(opts.baseDir, label);\n\n if (!existsSync(opts.baseDir)) {\n mkdirSync(opts.baseDir, { recursive: true });\n }\n\n git(`worktree add \"${wtPath}\" ${sha} --detach`, opts.repoRoot);\n worktreeRegistry.register(wtPath, opts.owner);\n\n let branch: string | undefined;\n try {\n const refName = git(`rev-parse --abbrev-ref ${opts.ref}`, opts.repoRoot);\n if (refName !== \"HEAD\" && refName !== sha) branch = refName;\n } catch {\n // Not a branch\n }\n\n return {\n path: wtPath,\n ref: sha,\n branch,\n cleanup: async () => {\n worktreeRegistry.deregister(wtPath, opts.owner);\n\n if (worktreeRegistry.isInUse(wtPath)) {\n const remaining = worktreeRegistry.owners(wtPath);\n throw new Error(`worktree in use by: ${remaining.join(\", \")}`);\n }\n\n try {\n git(`worktree remove \"${wtPath}\" --force`, opts.repoRoot);\n } catch {\n // May already be gone\n }\n git(\"worktree prune\", opts.repoRoot);\n },\n };\n}\n\n/**\n * List all git worktrees for a repository.\n * @param repoRoot - Absolute path to the git repository root.\n * @returns Array of `WorktreeInfo` objects parsed from `git worktree list --porcelain`.\n * @docLink packages/connectors/api-reference#list-worktrees\n */\nexport async function listWorktrees(repoRoot: string): Promise<WorktreeInfo[]> {\n const raw = git(\"worktree list --porcelain\", repoRoot);\n const trees: WorktreeInfo[] = [];\n let current: Partial<WorktreeInfo> = {};\n\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) trees.push(current as WorktreeInfo);\n current = { path: line.slice(\"worktree \".length) };\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(\"HEAD \".length);\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.slice(\"branch \".length);\n }\n }\n if (current.path) trees.push(current as WorktreeInfo);\n\n return trees;\n}\n","/**\n * FlowAdapter — live flow execution state exposed as a connector resource.\n *\n * Holds the canonical `FlowExecution` snapshot for a single run and bridges\n * three driving parties:\n *\n * - The **agent** drives nodes to completion by calling tools (`start_node`,\n * `request_approval`, `request_input`, `complete_node`, `skip_node`,\n * `fail_node`, plus read-only `get_state` / `get_available` / `build_handoff`).\n * - The **host** (runner → serve.ts → platform) applies out-of-turn\n * mutations (`applyApproval`, `applyInput`, `retryNode`,\n * `setAutonomousMode`, `cancel`, `hydrate`) in response to user actions.\n * - The **runner's FlowOrchestrator** subscribes to `onChange` to forward\n * `state_changed` events and kick new turns after host-driven mutations.\n *\n * Every state mutation runs through a single `mutate()` helper that clones\n * the current snapshot, applies the change, recomputes derived fields via\n * `computeFlowStateFromSnapshots`, and fires the onChange callback with\n * the full FlowExecution shape. Consumers downstream (platform gateway,\n * frontend hook) see latest-wins snapshots — F4 in the decision log.\n *\n * See `docs/flow-execution.md` for the universal model.\n */\n\nimport {\n computeFlowStateFromSnapshots,\n type FlowDefinition,\n type FlowNode,\n isBlocking,\n} from \"./engine/index.js\";\nimport type {\n Approval,\n ArtifactRef,\n FlowExecution,\n FlowExecutionStatus,\n InputRequest,\n InputSchema,\n NodeError,\n NodeExecution,\n NodeExecutionSnapshot,\n NodeOutput,\n NodeStatus,\n} from \"@skaile/workspaces/types\";\nimport {\n AbstractConnectorAdapter as AbstractAdapter,\n type ConnectorContent,\n type ConnectorDeclaration,\n type ConnectorEntry,\n type ConnectorHandle,\n type ListOptions,\n type OperationDescriptor,\n type SearchOptions,\n type SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport { computeStimulus } from \"./stimulus-driver.js\";\nimport { renderStimulusPrompt } from \"./prompt-fragments.js\";\n\n// ── Stimulus bus surface ─────────────────────────────────────────────────────\n\n/**\n * Minimal structural shape of the runner's `SessionStimulusBus`. Declared\n * locally so the adapter doesn't pull in a runtime dep on\n * `@skaile/workspaces/runner` (which would create a circular workspace import).\n *\n * The runner's `SessionStimulusBus` from `runner/src/session-stimulus.ts`\n * satisfies this structurally; mocks in tests can implement it directly.\n *\n * @docLink packages/base-assets/flow#session-stimulus-bus\n */\nexport interface FlowAdapterStimulusBus {\n signal(\n connectorId: string,\n sig: { promptFragment: string; meta?: Record<string, unknown> },\n ): Promise<void>;\n}\n\n// ── State ───────────────────────────────────────────────────────────────────\n\n/**\n * Internal state stored in the `ConnectorHandle` for the flow adapter.\n * @docLink packages/connectors/concepts#flow-adapter-state\n */\nexport interface FlowAdapterState {\n /** The flow graph definition this adapter is executing. */\n flowDef: FlowDefinition;\n /** Current execution snapshot (authoritative; mutated in place by `mutate()`). */\n execution: FlowExecution;\n /** Callback fired after every state mutation. Set by `FlowOrchestrator` via `onStateChange()`. */\n onChange?: (state: FlowExecution) => void;\n /**\n * Optional `SessionStimulusBus` reference. When provided AND\n * `useBusForStimulus` is true, the adapter computes a `TurnStimulus`\n * after every mutation and fires `bus.signal()` to wake the agent.\n * Phase 3 wiring (2026-05-08): the flag defaults to false everywhere so\n * the legacy orchestrator path remains the only turn driver until Phase 4.\n */\n stimulusBus?: FlowAdapterStimulusBus;\n /**\n * Connector ID used as the `stimulusBus.signal()` queue key. Defaults to\n * the adapter handle's declaration ID (e.g. `flow:<runId>` in serve mode,\n * `flow` in CLI mode).\n */\n connectorId?: string;\n /** Phase 3 feature flag — see {@link FlowAdapterConnectOptions.useBusForStimulus}. */\n useBusForStimulus?: boolean;\n /**\n * Last execution snapshot the adapter signaled to the bus. Used to compute\n * a structural diff in `computeStimulus`, so back-to-back mutations that\n * leave the snapshot unchanged don't fire spurious turn kicks.\n */\n lastSignaledExecution?: FlowExecution;\n}\n\n/**\n * Options the runner passes via `declaration.options` when connecting the `FlowAdapter`.\n * @docLink packages/connectors/concepts#flow-adapter-connect-options\n */\nexport interface FlowAdapterConnectOptions {\n flow: FlowDefinition;\n /**\n * Either a fresh start seed (runId + startedBy) or a full rehydration\n * state. If `execution` is provided, it replaces the default empty\n * state — used on session wake when the host sends the persisted\n * snapshot via `configure.activeFlows`.\n */\n execution?: FlowExecution;\n seed?: {\n runId: string;\n startedBy: string;\n autonomousMode?: boolean;\n };\n /**\n * Optional `SessionStimulusBus` to which this adapter should fire\n * `signal()` calls on every mutation when `useBusForStimulus` is true.\n * Threaded through by the runner's session-construction code (`runFlow`\n * / `serve.ts`). Phase 3 of the flow-connector extraction (2026-05-08)\n * builds the path; Phase 4 flips the flag globally.\n */\n stimulusBus?: FlowAdapterStimulusBus;\n /**\n * Phase 3 feature flag. When `true` AND `stimulusBus` is provided, the\n * adapter computes a turn-kicking stimulus after every mutation and\n * calls `bus.signal()` (fire-and-forget). When `false` (the default),\n * only the legacy `onChange` callback fires — the runner's existing\n * `FlowOrchestrator.onStateChange` subscription remains the only turn\n * driver. Default: `false`.\n */\n useBusForStimulus?: boolean;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nconst now = () => new Date().toISOString();\n\n/** Produce an empty NodeExecution for a node id. */\nfunction emptyNode(nodeId: string): NodeExecution {\n return {\n id: nodeId,\n status: \"not_started\",\n approvalHistory: [],\n inputHistory: [],\n errorHistory: [],\n };\n}\n\n/**\n * Build the starting FlowExecution snapshot for a flow definition — every\n * skill node begins as `not_started`; engine recompute promotes them.\n */\nfunction buildInitialExecution(\n flowDef: FlowDefinition,\n seed: { runId: string; startedBy: string; autonomousMode?: boolean },\n): FlowExecution {\n const nodes: Record<string, NodeExecution> = {};\n for (const n of flowDef.nodes) {\n if (n.type === \"skill\") {\n nodes[n.id] = emptyNode(n.id);\n }\n }\n return {\n runId: seed.runId,\n flowId: flowDef.id,\n flowVersion: flowDef.version,\n status: \"running\",\n startedAt: now(),\n startedBy: seed.startedBy,\n autonomousMode: seed.autonomousMode ?? false,\n nodes,\n focus: [],\n done: false,\n };\n}\n\nfunction toSnapshot(exec: NodeExecution): NodeExecutionSnapshot {\n return {\n status: exec.status,\n approval: exec.approval,\n input: exec.input,\n output: exec.output,\n error: exec.error,\n };\n}\n\nfunction snapshotMap(execution: FlowExecution): Map<string, NodeExecutionSnapshot> {\n const map = new Map<string, NodeExecutionSnapshot>();\n for (const [id, exec] of Object.entries(execution.nodes)) {\n map.set(id, toSnapshot(exec));\n }\n return map;\n}\n\n/**\n * Fail-fast helper. Throws a string Error so the SDK surfaces the reason\n * back to the agent tool-call log.\n */\nfunction assertLegal(cond: unknown, message: string): asserts cond {\n if (!cond) throw new Error(`FlowAdapter: ${message}`);\n}\n\nfunction findNode(flowDef: FlowDefinition, nodeId: string): FlowNode {\n const node = flowDef.nodes.find((n) => n.id === nodeId);\n if (!node) throw new Error(`FlowAdapter: unknown nodeId ${nodeId}`);\n return node;\n}\n\nfunction isOptional(flowDef: FlowDefinition, nodeId: string): boolean {\n return findNode(flowDef, nodeId).data?.optional === true;\n}\n\n// ── Adapter ─────────────────────────────────────────────────────────────────\n\n/**\n * Connector adapter that holds and drives a live `FlowExecution`. Bridges three parties:\n * the agent (via `executeOp` tools), the host runner (via direct methods like `applyApproval`),\n * and the orchestrator (via `onStateChange`). Every mutation runs through a single `mutate()`\n * pipeline that recomputes derived fields and fires `onChange`.\n * @docLink packages/connectors/concepts#flow-adapter\n */\nexport class FlowAdapter extends AbstractAdapter {\n readonly name = \"flow\";\n readonly mountable = false;\n\n // ── Lifecycle ──\n\n async connect(\n declaration: ConnectorDeclaration,\n _secrets?: import(\"@skaile/workspaces/connectors\").SecretProvider,\n _resolvedFields?: Record<string, string>,\n ): Promise<ConnectorHandle> {\n const options = (declaration.options ?? {}) as unknown as FlowAdapterConnectOptions;\n const flowDef = options.flow;\n if (!flowDef) throw new Error(\"FlowAdapter requires options.flow (FlowDefinition)\");\n\n const execution =\n options.execution ??\n buildInitialExecution(\n flowDef,\n options.seed ?? { runId: \"local\", startedBy: \"system\", autonomousMode: false },\n );\n\n const state: FlowAdapterState = {\n flowDef,\n execution,\n stimulusBus: options.stimulusBus,\n connectorId: declaration.id,\n useBusForStimulus: options.useBusForStimulus ?? false,\n };\n // Recompute derived fields (focus, done) once so callers see a\n // consistent shape even if no mutation has happened yet.\n state.execution = this.recompute(state);\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n handle.connected = false;\n }\n\n // ── State change subscription ──\n\n onStateChange(handle: ConnectorHandle, cb: (state: FlowExecution) => void): void {\n this.s(handle).onChange = cb;\n }\n\n /**\n * Replace the current execution snapshot with a host-provided one.\n * Used on container rehydration via the extended `configure` command.\n * Does NOT fire `onChange` — the host already has the state; we don't\n * want to loop it back on startup.\n */\n hydrate(handle: ConnectorHandle, execution: FlowExecution): void {\n const s = this.s(handle);\n s.execution = { ...execution };\n s.execution = this.recompute(s);\n }\n\n // ── Base operations ──\n\n override async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const s = this.s(handle);\n\n if (path === \"\" || path === \"state\") {\n return {\n data: JSON.stringify(s.execution, null, 2),\n contentType: \"application/json\",\n };\n }\n\n if (path.startsWith(\"node/\")) {\n const nodeId = path.slice(5);\n const node = s.flowDef.nodes.find((n) => n.id === nodeId);\n if (!node) return null;\n const exec = s.execution.nodes[nodeId];\n return {\n data: JSON.stringify({ ...node, execution: exec ?? null }, null, 2),\n contentType: \"application/json\",\n };\n }\n\n return null;\n }\n\n override async list(\n handle: ConnectorHandle,\n _path?: string,\n _options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const s = this.s(handle);\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n return nodes.map((n) => ({\n name: n.id,\n path: `node/${n.id}`,\n type: \"key\" as const,\n }));\n }\n\n override async search(\n handle: ConnectorHandle,\n query: string,\n _options?: SearchOptions,\n ): Promise<SearchResult[]> {\n const s = this.s(handle);\n const q = query.toLowerCase();\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n return nodes\n .filter((n) => n.id.toLowerCase().includes(q) || n.status.includes(q))\n .map((n) => ({ path: `node/${n.id}`, snippet: `${n.id} [${n.status}]` }));\n }\n\n // ── Custom operations (agent tool surface) ──\n\n describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get_available\",\n description: \"Get node IDs that are ready to run (all required predecessors complete).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"get_state\",\n description: \"Get the full flow execution snapshot — nodes, statuses, approvals, inputs.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"build_handoff\",\n description:\n \"Build curated context for a node from its completed flow-type predecessors (summaries + artifact refs).\",\n accessLevel: \"read\",\n args: [\n {\n name: \"nodeId\",\n description: \"Target node to build handoff context for\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"validate_node\",\n description: \"Check whether a node is currently runnable.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"nodeId\",\n description: \"Node ID to validate\",\n type: \"string\",\n required: true,\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"start_node\",\n description: \"Mark an available node as running (records startedAt).\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID to start\", type: \"string\", required: true },\n ],\n },\n {\n name: \"request_approval\",\n description:\n \"Request human approval for a running node. Ends your turn — the runner yields until the user approves or rejects.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"summary\",\n description: \"One-paragraph summary of what the user is approving.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"artifacts\",\n description:\n \"JSON array of ArtifactRef objects. Each: { uri, connectorId, kind, lifetime, producedBy }.\",\n type: \"string\",\n required: false,\n },\n ],\n },\n {\n name: \"request_input\",\n description:\n \"Request typed input from the user for a node. Ends your turn. Legal from `available`, `running`, or `awaiting_approval`.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"prompt\",\n description: \"Prompt shown to the user alongside the input widget.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"schema\",\n description:\n \"JSON InputSchema: one of { kind: 'text' }, { kind: 'choice', options: [...] }, { kind: 'form', fields: [...] }, { kind: 'file' }.\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"complete_node\",\n description:\n \"Mark a node as complete with structured output. Requires `awaiting_approval` with an `approved` decision, OR `running` when autonomous mode is on.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID to complete\", type: \"string\", required: true },\n {\n name: \"summary\",\n description: \"2-3 sentence summary of what the node accomplished.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"artifacts\",\n description: \"JSON array of ArtifactRef objects produced by this node.\",\n type: \"string\",\n required: false,\n },\n {\n name: \"concerns\",\n description: \"JSON array of flagged concerns.\",\n type: \"string\",\n required: false,\n },\n ],\n },\n {\n name: \"skip_node\",\n description: \"Skip an optional node. Only valid when the node has `optional: true`.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID to skip\", type: \"string\", required: true },\n ],\n },\n {\n name: \"fail_node\",\n description:\n \"Mark a node as failed. `recoverable: true` transitions back to `available` so the runner can retry; `recoverable: false` marks the node and flow as failed.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"message\",\n description: \"Human-readable failure reason.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"recoverable\",\n description: \"true|false — whether the failure is retryable.\",\n type: \"string\",\n required: false,\n },\n ],\n },\n );\n }\n\n // Host-facing operations — invoked by the runner via `connector_mutate`\n // (Phase 2 of flow-connector extraction). These are NOT exposed to the\n // agent's tool surface; they're the same instance methods the typed flow\n // commands call today, dispatched generically through `executeOp`.\n //\n // Visibility: include them only on read-write handles, matching the\n // existing host-vs-agent boundary.\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"applyApproval\",\n description: \"Host: record an approval decision on a node awaiting approval.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"decision\",\n description: \"approved | rejected\",\n type: \"string\",\n required: true,\n },\n {\n name: \"feedback\",\n description: \"Optional feedback shown alongside the decision.\",\n type: \"string\",\n required: false,\n },\n {\n name: \"decidedBy\",\n description: \"User id of the decider.\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"applyInput\",\n description: \"Host: provide user input for a node awaiting input.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"response\",\n description: \"Input response (shape matches the InputSchema the agent requested).\",\n type: \"json\",\n required: true,\n },\n {\n name: \"providedBy\",\n description: \"User id of the input provider.\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"cancel\",\n description: \"Host: cancel the active flow run.\",\n accessLevel: \"write\",\n args: [],\n },\n {\n name: \"setAutonomousMode\",\n description: \"Host: toggle autonomous mode on the running flow.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"enabled\",\n description: \"true|false — whether autonomous mode is on.\",\n type: \"boolean\",\n required: true,\n },\n ],\n },\n {\n name: \"retryNode\",\n description: \"Host: transition a recoverable failed node back to available.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"requestedBy\",\n description: \"User id of the retry requester (informational).\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"hydrate\",\n description: \"Host: replace the current execution snapshot with a host-provided one.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"state\",\n description: \"FlowExecution snapshot to hydrate into the adapter.\",\n type: \"json\",\n required: true,\n },\n ],\n },\n {\n name: \"start\",\n description:\n \"Host: seed a fresh flow execution. Replaces the adapter's current flow + execution state in-place.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"flow\",\n description: \"FlowDefinition to execute.\",\n type: \"json\",\n required: true,\n },\n {\n name: \"seed\",\n description:\n \"Seed object: { runId, startedBy, autonomousMode? } used to construct the initial FlowExecution.\",\n type: \"json\",\n required: true,\n },\n ],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const s = this.s(handle);\n\n switch (operation) {\n case \"get_available\": {\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n const available = nodes.filter((n) => n.status === \"available\").map((n) => n.id);\n return JSON.stringify(available);\n }\n\n case \"get_state\": {\n return JSON.stringify(s.execution);\n }\n\n case \"build_handoff\": {\n const nodeId = String(args.nodeId ?? \"\");\n return this.buildHandoff(s, nodeId);\n }\n\n case \"validate_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n const node = s.execution.nodes[nodeId];\n if (!node) return JSON.stringify({ valid: false, reason: \"Node not found\" });\n const predsMet = flowPredecessors(s.flowDef, nodeId).every((pid) => {\n const predStatus = s.execution.nodes[pid]?.status ?? \"not_started\";\n return predStatus === \"complete\" || predStatus === \"skipped\";\n });\n return JSON.stringify({\n valid: node.status === \"available\",\n status: node.status,\n predecessorsReady: predsMet,\n });\n }\n\n case \"start_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n return this.doStartNode(handle, nodeId);\n }\n\n case \"request_approval\": {\n const nodeId = String(args.nodeId ?? \"\");\n const summary = String(args.summary ?? \"\");\n const artifacts = safeParseArtifacts(args.artifacts);\n return this.doRequestApproval(handle, nodeId, summary, artifacts);\n }\n\n case \"request_input\": {\n const nodeId = String(args.nodeId ?? \"\");\n const prompt = String(args.prompt ?? \"\");\n const schema = safeParseInputSchema(args.schema);\n return this.doRequestInput(handle, nodeId, prompt, schema);\n }\n\n case \"complete_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n const output: NodeOutput = {\n summary: String(args.summary ?? \"Completed\"),\n artifacts: safeParseArtifacts(args.artifacts),\n concerns: safeParseStringArray(args.concerns),\n };\n return this.doCompleteNode(handle, nodeId, output);\n }\n\n case \"skip_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n return this.doSkipNode(handle, nodeId);\n }\n\n case \"fail_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n const message = String(args.message ?? \"failed\");\n const recoverable =\n args.recoverable === true || args.recoverable === \"true\" || args.recoverable === \"yes\";\n return this.doFailNode(handle, nodeId, message, recoverable);\n }\n\n // ── Host-facing operations (Phase 2 of flow-connector extraction) ──\n // These dispatch to the same instance methods the typed flow commands\n // call today. JSON-stringify the resulting FlowExecution (or `\"\"` for\n // void returns) so the wire surface is uniform across ops.\n\n case \"applyApproval\": {\n const nodeId = String(args.nodeId ?? \"\");\n const decision = args.decision === \"rejected\" ? \"rejected\" : \"approved\";\n const feedback =\n typeof args.feedback === \"string\" && args.feedback.length > 0 ? args.feedback : undefined;\n const decidedBy = String(args.decidedBy ?? \"\");\n this.applyApproval(handle, nodeId, decision, feedback, decidedBy);\n return JSON.stringify(s.execution);\n }\n\n case \"applyInput\": {\n const nodeId = String(args.nodeId ?? \"\");\n const response = args.response;\n const providedBy = String(args.providedBy ?? \"\");\n this.applyInput(handle, nodeId, response, providedBy);\n return JSON.stringify(s.execution);\n }\n\n case \"cancel\": {\n this.cancel(handle);\n return JSON.stringify(s.execution);\n }\n\n case \"setAutonomousMode\": {\n const enabled = args.enabled === true || args.enabled === \"true\";\n this.setAutonomousMode(handle, enabled);\n return JSON.stringify(s.execution);\n }\n\n case \"retryNode\": {\n const nodeId = String(args.nodeId ?? \"\");\n // `requestedBy` is informational only — the adapter doesn't record it\n // (consistent with how the typed `retry_flow_node` handler behaves\n // today; the field is logged at the runner, not in the snapshot).\n void String(args.requestedBy ?? \"\");\n this.retryNode(handle, nodeId);\n return JSON.stringify(s.execution);\n }\n\n case \"hydrate\": {\n const state = args.state as FlowExecution | undefined;\n if (!state || typeof state !== \"object\") {\n throw new Error(\"FlowAdapter: hydrate requires an args.state FlowExecution snapshot\");\n }\n this.hydrate(handle, state);\n return JSON.stringify(s.execution);\n }\n\n case \"start\": {\n const flow = args.flow as FlowDefinition | undefined;\n if (!flow || typeof flow !== \"object\") {\n throw new Error(\"FlowAdapter: start requires args.flow (FlowDefinition)\");\n }\n const seed = (args.seed ?? {}) as {\n runId?: string;\n startedBy?: string;\n autonomousMode?: boolean;\n };\n if (!seed.runId || !seed.startedBy) {\n throw new Error(\"FlowAdapter: start requires args.seed.runId + args.seed.startedBy\");\n }\n // Seed a fresh execution in-place. Same flow used by `connect()` —\n // we reuse `buildInitialExecution` + `recompute` so the adapter\n // produces an identical initial FlowExecution to a fresh connect.\n s.flowDef = flow;\n s.execution = buildInitialExecution(flow, {\n runId: seed.runId,\n startedBy: seed.startedBy,\n autonomousMode: seed.autonomousMode ?? false,\n });\n s.execution = this.recompute(s);\n if (s.onChange) s.onChange(s.execution);\n return JSON.stringify(s.execution);\n }\n\n default:\n throw new Error(`FlowAdapter: Unknown operation: ${operation}`);\n }\n }\n\n // ── Agent-side mutations (tool calls) ─────────────────────────────────────\n\n private doStartNode(handle: ConnectorHandle, nodeId: string): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(node.status === \"available\", `cannot start ${nodeId}: status is ${node.status}`);\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"running\",\n startedAt: now(),\n };\n return JSON.stringify({ ok: true, status: \"running\" });\n });\n }\n\n private doRequestApproval(\n handle: ConnectorHandle,\n nodeId: string,\n summary: string,\n artifacts: ArtifactRef[],\n ): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(\n node.status === \"running\",\n `request_approval requires running, got ${node.status}`,\n );\n const approval: Approval = { requestedAt: now(), summary };\n const history = [...node.approvalHistory, approval];\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"awaiting_approval\",\n approval,\n approvalHistory: history,\n // Stash output so the UI can render the approval card with artifacts\n // before the node reaches `complete`.\n output: { summary, artifacts },\n };\n return JSON.stringify({ ok: true, status: \"awaiting_approval\" });\n });\n }\n\n private doRequestInput(\n handle: ConnectorHandle,\n nodeId: string,\n prompt: string,\n schema: InputSchema,\n ): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(\n node.status === \"available\" ||\n node.status === \"running\" ||\n node.status === \"awaiting_approval\",\n `request_input not legal from ${node.status}`,\n );\n const input: InputRequest = { requestedAt: now(), prompt, schema };\n s.execution.nodes[nodeId] = {\n ...node,\n // Record the prior status so `applyInput` can restore it.\n // We encode this via `inputHistory` — the latest entry's metadata\n // includes the resume status in a convention-only field.\n status: \"awaiting_input\",\n input,\n inputHistory: [\n ...node.inputHistory,\n { ...input, response: { _resumeStatus: node.status } },\n ],\n };\n return JSON.stringify({ ok: true, status: \"awaiting_input\" });\n });\n }\n\n private doCompleteNode(handle: ConnectorHandle, nodeId: string, output: NodeOutput): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n\n const autonomous = s.execution.autonomousMode;\n const approvedPrior =\n node.status === \"awaiting_approval\" && node.approval?.decision === \"approved\";\n const runningAutonomous = node.status === \"running\" && autonomous;\n\n assertLegal(\n approvedPrior || runningAutonomous,\n `complete_node requires awaiting_approval+approved OR running+autonomous; node is ${node.status}${\n node.approval?.decision ? ` with approval ${node.approval.decision}` : \"\"\n }, autonomous=${autonomous}`,\n );\n\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"complete\",\n completedAt: now(),\n output,\n };\n return JSON.stringify({ ok: true, status: \"complete\" });\n });\n }\n\n private doSkipNode(handle: ConnectorHandle, nodeId: string): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(isOptional(s.flowDef, nodeId), `cannot skip required node ${nodeId}`);\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"skipped\",\n completedAt: now(),\n };\n return JSON.stringify({ ok: true, status: \"skipped\" });\n });\n }\n\n private doFailNode(\n handle: ConnectorHandle,\n nodeId: string,\n message: string,\n recoverable: boolean,\n ): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n const error: NodeError = { message, recoverable, at: now() };\n if (recoverable) {\n // Transition back to `available` for the agent to retry within\n // the same turn; keep the failure in history so the next turn\n // sees the prior error context.\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n error,\n errorHistory: [...node.errorHistory, error],\n };\n } else {\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"failed\",\n completedAt: now(),\n error,\n errorHistory: [...node.errorHistory, error],\n };\n }\n return JSON.stringify({ ok: true, status: s.execution.nodes[nodeId].status });\n });\n }\n\n // ── Host-side mutations (not exposed as agent tools) ─────────────────────\n\n /**\n * Record an approval decision on a node currently `awaiting_approval`.\n * `approved` leaves the node in `awaiting_approval` — the agent\n * transitions it to `complete` on the next turn. `rejected` drops the\n * node back to `available` so the agent can retry.\n */\n applyApproval(\n handle: ConnectorHandle,\n nodeId: string,\n decision: \"approved\" | \"rejected\",\n feedback: string | undefined,\n decidedBy: string,\n ): void {\n this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `applyApproval: unknown node ${nodeId}`);\n assertLegal(\n node.status === \"awaiting_approval\",\n `applyApproval: node ${nodeId} is ${node.status}, not awaiting_approval`,\n );\n const base = node.approval ?? { requestedAt: now(), summary: \"\" };\n const approval: Approval = {\n ...base,\n decidedAt: now(),\n decidedBy,\n decision,\n feedback,\n };\n // Replace the tail of history with the decided version so the\n // pointer and the history element stay in sync.\n const history = [...node.approvalHistory];\n if (history.length > 0) history[history.length - 1] = approval;\n else history.push(approval);\n\n if (decision === \"approved\") {\n s.execution.nodes[nodeId] = { ...node, approval, approvalHistory: history };\n } else {\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n approval,\n approvalHistory: history,\n };\n }\n return undefined;\n });\n }\n\n /**\n * Record a user-provided input on a node currently `awaiting_input`.\n * Transitions back to the status the node had before requesting input.\n */\n applyInput(handle: ConnectorHandle, nodeId: string, response: unknown, providedBy: string): void {\n this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `applyInput: unknown node ${nodeId}`);\n assertLegal(\n node.status === \"awaiting_input\",\n `applyInput: node ${nodeId} is ${node.status}, not awaiting_input`,\n );\n\n // Recover the pre-input status from the last history entry's\n // `_resumeStatus` marker (see doRequestInput).\n const last = node.inputHistory[node.inputHistory.length - 1];\n const resumeStatus =\n (last?.response as { _resumeStatus?: NodeStatus } | undefined)?._resumeStatus ?? \"running\";\n\n const updated: InputRequest = {\n ...(node.input ?? { requestedAt: now(), prompt: \"\", schema: { kind: \"text\" } }),\n providedAt: now(),\n providedBy,\n response,\n };\n\n const history = [...node.inputHistory];\n if (history.length > 0) history[history.length - 1] = updated;\n else history.push(updated);\n\n s.execution.nodes[nodeId] = {\n ...node,\n status: resumeStatus,\n input: updated,\n inputHistory: history,\n };\n return undefined;\n });\n }\n\n /**\n * Transition a recoverable failed node back to `available` for retry.\n * Preserves the failure in `errorHistory` so the next turn's agent can\n * see the prior failure context.\n */\n retryNode(handle: ConnectorHandle, nodeId: string): void {\n this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `retryNode: unknown node ${nodeId}`);\n assertLegal(\n node.status === \"failed\" && node.error?.recoverable === true,\n `retryNode: node ${nodeId} is not a recoverable failure (status=${node.status}, recoverable=${node.error?.recoverable})`,\n );\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n error: undefined,\n };\n return undefined;\n });\n }\n\n /** Toggle autonomous mode at the flow-execution level. */\n setAutonomousMode(handle: ConnectorHandle, enabled: boolean): void {\n this.mutate(handle, (s) => {\n s.execution = { ...s.execution, autonomousMode: enabled };\n return undefined;\n });\n }\n\n /** Cancel the flow run. Status transitions to `cancelled`; dependents stay put. */\n cancel(handle: ConnectorHandle): void {\n this.mutate(handle, (s) => {\n s.execution = { ...s.execution, status: \"cancelled\" };\n return undefined;\n });\n }\n\n /** Read-only access to the current FlowExecution snapshot. */\n getExecution(handle: ConnectorHandle): FlowExecution {\n return this.s(handle).execution;\n }\n\n // ── Private helpers ──\n\n private s(handle: ConnectorHandle): FlowAdapterState {\n return handle.state as FlowAdapterState;\n }\n\n /**\n * Central mutation pipeline: runs the mutator, recomputes derived\n * fields, updates the flow-level `status` if the mutation completed\n * or failed the flow, fires `onChange` once, and (Phase 3, 2026-05-08)\n * optionally signals the {@link FlowAdapterStimulusBus} so the runner\n * can kick a turn outside the legacy orchestrator path.\n *\n * The bus signal path is gated by the `useBusForStimulus` flag set at\n * connect time — Phase 3 builds the path; Phase 4 flips the default to\n * true globally and removes the orchestrator's onStateChange\n * subscription.\n */\n private mutate(handle: ConnectorHandle, fn: (s: FlowAdapterState) => unknown): string {\n const s = this.s(handle);\n const previousExecution = s.lastSignaledExecution;\n const result = fn(s);\n s.execution = this.recompute(s);\n if (s.onChange) s.onChange(s.execution);\n\n if (s.useBusForStimulus && s.stimulusBus) {\n const stim = computeStimulus(previousExecution, s.execution);\n if (stim) {\n const fragment = renderStimulusPrompt(stim);\n const connectorId = s.connectorId ?? handle.id;\n // Fire-and-forget — the bus's signal() returns a promise that\n // resolves once the resulting turn drains, but the adapter must\n // not block agent tool-call completion on the next turn settling.\n // Swallow rejections so a downstream turn failure can't propagate\n // back into the synchronous mutate() pipeline.\n s.stimulusBus\n .signal(connectorId, {\n promptFragment: fragment,\n meta: { kind: stim.kind, runId: s.execution.runId },\n })\n .catch(() => {\n /* rejection surfaces via the bus's own logging path */\n });\n s.lastSignaledExecution = s.execution;\n }\n }\n\n return typeof result === \"string\" ? result : JSON.stringify({ ok: true });\n }\n\n /**\n * Recompute derived fields (`focus`, `done`, and the rolled-up flow\n * `status`) from the current node map, without touching per-node\n * state directly.\n */\n private recompute(s: FlowAdapterState): FlowExecution {\n const snapshots = snapshotMap(s.execution);\n const computed = computeFlowStateFromSnapshots(s.flowDef, snapshots);\n\n // Elevate any `not_started` nodes that are now runnable to `available`.\n const nodes = { ...s.execution.nodes };\n for (const ns of computed.nodes) {\n const existing = nodes[ns.nodeId];\n if (!existing) continue;\n if (existing.status === \"not_started\" && ns.status === \"available\") {\n nodes[ns.nodeId] = { ...existing, status: \"available\" };\n }\n if (existing.status === \"available\" && ns.status === \"blocked\") {\n // Rare: a prior-available node became blocked because an upstream\n // transitioned into a failing terminal state. Mark it blocked.\n nodes[ns.nodeId] = { ...existing, status: \"blocked\" };\n }\n }\n\n // Roll up flow-level status when the computation tells us we're done,\n // or when a required node is stuck in `failed`.\n let flowStatus: FlowExecutionStatus = s.execution.status;\n if (flowStatus !== \"cancelled\") {\n const anyRequiredFailed = s.flowDef.nodes\n .filter((n) => n.type === \"skill\" && !(n.data?.optional ?? false))\n .some((n) => nodes[n.id]?.status === \"failed\");\n if (anyRequiredFailed) {\n flowStatus = \"failed\";\n } else if (computed.done) {\n flowStatus = \"complete\";\n } else if (flowStatus !== \"paused\") {\n flowStatus = \"running\";\n }\n }\n\n return {\n ...s.execution,\n status: flowStatus,\n nodes,\n focus: computed.focus,\n done: computed.done && flowStatus === \"complete\",\n };\n }\n\n /**\n * Build curated context for a node by collecting the summaries and\n * artifact refs produced by its upstream flow-type predecessors.\n */\n private buildHandoff(s: FlowAdapterState, nodeId: string): string {\n const deps = flowPredecessors(s.flowDef, nodeId);\n if (deps.length === 0) return \"(no prior context)\";\n\n const sections: string[] = [];\n for (const depId of deps) {\n const exec = s.execution.nodes[depId];\n const output = exec?.output;\n if (!output) continue;\n const artifacts =\n output.artifacts.length > 0\n ? `\\nArtifacts: ${output.artifacts.map((a) => a.uri).join(\", \")}`\n : \"\";\n const concerns =\n output.concerns && output.concerns.length > 0\n ? `\\nConcerns: ${output.concerns.join(\"; \")}`\n : \"\";\n const label = s.flowDef.nodes.find((n) => n.id === depId)?.data?.label ?? depId;\n sections.push(`### ${label} (${exec?.status})\\n${output.summary}${artifacts}${concerns}`);\n }\n\n return sections.length > 0 ? sections.join(\"\\n\\n\") : \"(no prior context)\";\n }\n}\n\n// ── Pure helpers ────────────────────────────────────────────────────────────\n\n/** IDs of nodes connected to `nodeId` via incoming flow-type edges. */\nfunction flowPredecessors(flowDef: FlowDefinition, nodeId: string): string[] {\n return flowDef.edges.filter((e) => e.target === nodeId && e.type === \"flow\").map((e) => e.source);\n}\n\nfunction safeParseStringArray(value: unknown): string[] {\n if (!value) return [];\n if (Array.isArray(value)) return value.map(String);\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.map(String) : [];\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction safeParseArtifacts(value: unknown): ArtifactRef[] {\n if (!value) return [];\n const raw = typeof value === \"string\" ? safeJsonArray(value) : Array.isArray(value) ? value : [];\n return raw\n .filter((r): r is Record<string, unknown> => !!r && typeof r === \"object\")\n .map((r: Record<string, unknown>) => ({\n uri: String(r.uri ?? \"\"),\n connectorId: String(r.connectorId ?? \"workspace\"),\n kind: (r.kind as ArtifactRef[\"kind\"]) ?? \"other\",\n lifetime: (r.lifetime as ArtifactRef[\"lifetime\"]) ?? \"session\",\n producedBy: String(r.producedBy ?? \"\"),\n }));\n}\n\nfunction safeJsonArray(value: string): unknown[] {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction safeParseInputSchema(value: unknown): InputSchema {\n if (value && typeof value === \"object\") return value as InputSchema;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as InputSchema;\n } catch {\n return { kind: \"text\" };\n }\n }\n return { kind: \"text\" };\n}\n\n// Re-export `isBlocking` for convenience so callers don't need two imports\n// when reasoning about node state blocking semantics.\nexport { isBlocking };\n\n/**\n * Factory used by the connector registry. Returns a fresh `FlowAdapter`\n * instance ready to be registered under the `flow` driver name.\n */\nexport function createAdapter(): FlowAdapter {\n return new FlowAdapter();\n}\n"]}
|