@skaile/workspaces 1.8.1 → 1.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.
Files changed (101) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-Y66NCOQZ.js → asset-feeds-LD6QKJ2R.js} +4 -4
  4. package/dist/{asset-feeds-Y66NCOQZ.js.map → asset-feeds-LD6QKJ2R.js.map} +1 -1
  5. package/dist/asset-manager/index.js +1 -1
  6. package/dist/{chunk-LLNSPJWB.js → chunk-5F3GULZT.js} +3 -3
  7. package/dist/{chunk-LLNSPJWB.js.map → chunk-5F3GULZT.js.map} +1 -1
  8. package/dist/{chunk-Y3UCU4ZK.js → chunk-5LPARFB5.js} +2 -2
  9. package/dist/{chunk-Y3UCU4ZK.js.map → chunk-5LPARFB5.js.map} +1 -1
  10. package/dist/{chunk-TITPPC54.js → chunk-6Q7CNVU3.js} +3 -3
  11. package/dist/{chunk-TITPPC54.js.map → chunk-6Q7CNVU3.js.map} +1 -1
  12. package/dist/{chunk-PP2LOT4W.js → chunk-A2CDJRRH.js} +3 -3
  13. package/dist/{chunk-PP2LOT4W.js.map → chunk-A2CDJRRH.js.map} +1 -1
  14. package/dist/{chunk-FK2L3MTF.js → chunk-HGLQYLZB.js} +336 -245
  15. package/dist/chunk-HGLQYLZB.js.map +1 -0
  16. package/dist/{chunk-VBRXFLIP.js → chunk-JCKGYBWY.js} +24 -16
  17. package/dist/chunk-JCKGYBWY.js.map +1 -0
  18. package/dist/{chunk-O3D4KYFG.js → chunk-JPKWPX5Q.js} +3 -3
  19. package/dist/{chunk-O3D4KYFG.js.map → chunk-JPKWPX5Q.js.map} +1 -1
  20. package/dist/{chunk-THJZ3JZE.js → chunk-MBGSJM7H.js} +6 -6
  21. package/dist/{chunk-THJZ3JZE.js.map → chunk-MBGSJM7H.js.map} +1 -1
  22. package/dist/{chunk-UPZGQZEJ.js → chunk-MW7GNYRT.js} +3 -3
  23. package/dist/{chunk-UPZGQZEJ.js.map → chunk-MW7GNYRT.js.map} +1 -1
  24. package/dist/{chunk-34U5UC6G.js → chunk-SBU73P7R.js} +6 -6
  25. package/dist/{chunk-34U5UC6G.js.map → chunk-SBU73P7R.js.map} +1 -1
  26. package/dist/{chunk-35OWUKOD.js → chunk-VWSR6K7C.js} +2 -2
  27. package/dist/{chunk-35OWUKOD.js.map → chunk-VWSR6K7C.js.map} +1 -1
  28. package/dist/{chunk-PK7Q7MC7.js → chunk-XJOPAGZX.js} +4 -4
  29. package/dist/{chunk-PK7Q7MC7.js.map → chunk-XJOPAGZX.js.map} +1 -1
  30. package/dist/cli/index.js +25 -25
  31. package/dist/connectors/index.js +1 -1
  32. package/dist/connectors/src/credential-helper-script.d.ts +8 -5
  33. package/dist/connectors/src/credential-helper-script.d.ts.map +1 -1
  34. package/dist/connectors/src/managed-gitconfig.d.ts +4 -2
  35. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  36. package/dist/{ensure-sources-NXBYK5GP.js → ensure-sources-S6QBARWF.js} +4 -4
  37. package/dist/{ensure-sources-NXBYK5GP.js.map → ensure-sources-S6QBARWF.js.map} +1 -1
  38. package/dist/factory-assets/connectors/box.js +1 -1
  39. package/dist/factory-assets/connectors/deploy.js +1 -1
  40. package/dist/factory-assets/connectors/devserver.js +1 -1
  41. package/dist/factory-assets/connectors/flow/adapter.d.ts +3 -2
  42. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  43. package/dist/factory-assets/connectors/flow/adapter.js +1 -1
  44. package/dist/factory-assets/connectors/flow/run-flow.js +2 -2
  45. package/dist/factory-assets/connectors/flow.js +1 -1
  46. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  47. package/dist/factory-assets/connectors/git.js +1 -1
  48. package/dist/factory-assets/connectors/gmail.js +1 -1
  49. package/dist/factory-assets/connectors/googledrive.js +1 -1
  50. package/dist/factory-assets/connectors/local.js +1 -1
  51. package/dist/factory-assets/connectors/mattermost.js +1 -1
  52. package/dist/factory-assets/connectors/memory.js +1 -1
  53. package/dist/factory-assets/connectors/minio.js +1 -1
  54. package/dist/factory-assets/connectors/postgres.js +1 -1
  55. package/dist/factory-assets/connectors/s3.js +1 -1
  56. package/dist/factory-assets/connectors/sharepoint.js +1 -1
  57. package/dist/factory-assets/connectors/sqlite.js +1 -1
  58. package/dist/factory-assets/connectors/static-server.js +1 -1
  59. package/dist/factory-assets/connectors/tunnel.js +1 -1
  60. package/dist/factory-assets/connectors/webdav.js +1 -1
  61. package/dist/factory-assets/connectors/xstate-store.js +1 -1
  62. package/dist/factory-assets/connectors/xstate.js +1 -1
  63. package/dist/{helpers-DN4MWOHB.js → helpers-ZZZY7HUJ.js} +4 -4
  64. package/dist/{helpers-DN4MWOHB.js.map → helpers-ZZZY7HUJ.js.map} +1 -1
  65. package/dist/{library-publish-TPWFSO3Q.js → library-publish-NCMIFF3V.js} +6 -6
  66. package/dist/{library-publish-TPWFSO3Q.js.map → library-publish-NCMIFF3V.js.map} +1 -1
  67. package/dist/{open-library-ST2VFQTK.js → open-library-VFS6WIO7.js} +5 -5
  68. package/dist/{open-library-ST2VFQTK.js.map → open-library-VFS6WIO7.js.map} +1 -1
  69. package/dist/{project-4M6QXHCH.js → project-SC7TVEQ6.js} +5 -5
  70. package/dist/{project-4M6QXHCH.js.map → project-SC7TVEQ6.js.map} +1 -1
  71. package/dist/runner/index.js +4 -4
  72. package/dist/runner/src/serve.d.ts +67 -4
  73. package/dist/runner/src/serve.d.ts.map +1 -1
  74. package/dist/runner/src/session-capability-wiring.d.ts +49 -0
  75. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -0
  76. package/dist/runner/src/session-resource-handlers.d.ts +1 -2
  77. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
  78. package/dist/sdk/asset-manager.js +1 -1
  79. package/dist/sdk/index.js +4 -4
  80. package/dist/sdk/runner.js +4 -4
  81. package/dist/sdk/session.js +2 -2
  82. package/dist/sdk/types.js +1 -1
  83. package/dist/session/index.js +2 -2
  84. package/dist/{source-KUWAEJOO.js → source-Z5HNLF6J.js} +6 -6
  85. package/dist/{source-KUWAEJOO.js.map → source-Z5HNLF6J.js.map} +1 -1
  86. package/dist/{source-manifest-publish-FTSKRYPI.js → source-manifest-publish-FA2KLZJ6.js} +7 -7
  87. package/dist/{source-manifest-publish-FTSKRYPI.js.map → source-manifest-publish-FA2KLZJ6.js.map} +1 -1
  88. package/dist/tui/index.js +4 -4
  89. package/dist/types/index.js +1 -1
  90. package/dist/types/src/flow.d.ts +26 -28
  91. package/dist/types/src/flow.d.ts.map +1 -1
  92. package/dist/types/src/index.d.ts +1 -1
  93. package/dist/types/src/index.d.ts.map +1 -1
  94. package/dist/types/src/lifecycle.d.ts +0 -8
  95. package/dist/types/src/lifecycle.d.ts.map +1 -1
  96. package/dist/types/src/version.d.ts +17 -1
  97. package/dist/types/src/version.d.ts.map +1 -1
  98. package/dist/workspace-plugin/index.js +1 -1
  99. package/package.json +1 -1
  100. package/dist/chunk-FK2L3MTF.js.map +0 -1
  101. package/dist/chunk-VBRXFLIP.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../connectors/src/connector-base.ts","../factory-assets/connectors/deploy/adapter.ts","../factory-assets/connectors/devserver/adapter.ts","../factory-assets/connectors/box/driver.ts","../factory-assets/connectors/git/driver.ts","../factory-assets/connectors/gmail/adapter.ts","../factory-assets/connectors/googledrive/driver.ts","../factory-assets/connectors/local/driver.ts","../factory-assets/connectors/mattermost/adapter.ts","../factory-assets/connectors/memory/adapter.ts","../factory-assets/connectors/minio/adapter.ts","../factory-assets/connectors/postgres/adapter.ts","../factory-assets/connectors/s3/driver.ts","../factory-assets/connectors/sharepoint/driver.ts","../factory-assets/connectors/sqlite/adapter.ts","../factory-assets/connectors/static-server/adapter.ts","../factory-assets/connectors/tunnel/adapter.ts","../factory-assets/connectors/webdav/driver.ts","../factory-assets/connectors/xstate/adapter.ts","../factory-assets/connectors/xstate-store/adapter.ts","../connectors/src/connector-registry.ts","../connectors/src/connector-types.ts","../connectors/src/connector-manager.ts","../connectors/src/connector-prompt.ts","../connectors/src/credential-helper-script.ts","../connectors/src/fleet-utils.ts","../connectors/src/fs-utils.ts","../connectors/src/log-buffer.ts","../connectors/src/managed-gitconfig.ts","../connectors/src/npm-installer.ts","../connectors/src/port-pool.ts","../connectors/src/watcher.ts","../connectors/src/worktree.ts","../factory-assets/connectors/flow/adapter.ts"],"names":["createConnector","execSync","credentialTag","stat","CLOUD_FLEET_REQUIRED","syncFleetManaged","existsSync","mkdirSync","resolve","table","result","join","dirname","writeFileSync","quoteIdent","readFileSync","instanceToStatus","t","_ctx","z","z2","renameSync","require","git"],"mappings":"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","file":"chunk-JCKGYBWY.js","sourcesContent":["import { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport type {\n ConnectContext,\n Connector,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n} from \"./connector-types.js\";\nimport type { WatchHandle, WatchOptions } from \"./shared-types.js\";\n\n/**\n * Base class for unified connectors. Subclasses set `filesystem` and/or `tools`\n * face objects and implement `connect`/`disconnect`. The manager replaces\n * `this.log` via `setLogger()` after construction — do not initialise your own.\n */\nexport abstract class AbstractConnector implements Connector {\n abstract readonly name: string;\n protected log: Logger = createLogger({ kind: \"connector\", subkind: \"unknown\" });\n setLogger(logger: Logger): void {\n this.log = logger;\n }\n\n /** Set by the default `watch()`; call after mutations to emit change events. */\n protected emitChange?: (event: ConnectorChangeEvent) => void;\n\n abstract connect(\n declaration: ConnectorDeclaration,\n ctx: ConnectContext,\n ): Promise<ConnectorHandle>;\n abstract disconnect(handle: ConnectorHandle): Promise<void>;\n\n watch(\n _handle: ConnectorHandle,\n callback: (e: 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 /** Build a handle. Pass `mountPath` only for mountable connectors. */\n protected makeHandle(\n declaration: ConnectorDeclaration,\n state: unknown,\n mountPath?: string,\n ): ConnectorHandle {\n return {\n id: declaration.id,\n driver: this.name,\n access: declaration.access,\n status: \"connected\",\n mountPath,\n state,\n };\n }\n}\n","/**\n * DeployConnector — 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 type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } 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 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/factory-assets/concepts#deploy-connector\n */\nexport class DeployConnector extends AbstractConnector {\n readonly name = \"deploy\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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.status = \"disconnected\";\n }\n\n override async onSessionClose(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n override async onHibernate(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private _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 private _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 private 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(`DeployConnector 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 DeployConnector instance.\n * @returns Configured DeployConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#deploy-connector-factory\n */\nexport function createConnector(): DeployConnector {\n return new DeployConnector();\n}\n","/**\n * DevServerConnector — 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 type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n createWorktree,\n findGitRoot,\n LogBuffer,\n PortPool,\n} from \"@skaile/workspaces/connectors\";\nimport { portableSpawn } from \"@skaile/workspaces/core\";\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// ── Connector ────────────────────────────────────────────────────────────────\n\n/**\n * Connector 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/factory-assets/concepts#devserver-connector\n */\nexport class DevServerConnector extends AbstractConnector {\n readonly name = \"devserver\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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 try {\n await this._stopAll(handle);\n } finally {\n handle.status = \"disconnected\";\n }\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 // ── Tool face methods (private, wired in constructor) ─────────────────────\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 private _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 private 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(`DevServerConnector: \"${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(`DevServerConnector: 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 = portableSpawn([\"sh\", \"-c\", command], {\n cwd,\n env: { ...process.env, ...userEnv, PORT: String(port) },\n detached: true,\n });\n const logBuffer = new LogBuffer(state.logBufferSize);\n pipeToBuffer(proc.stdout, logBuffer);\n pipeToBuffer(proc.stderr, 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 private _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 DevServerConnector instance.\n * @returns Configured DevServerConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#devserver-connector-factory\n */\nexport function createConnector(): DevServerConnector {\n return new DevServerConnector();\n}\n","/**\n * BoxConnector — host fleet-managed Box filesystem connector.\n *\n * Cloud mounts are prepared outside the agent container and exposed through a\n * bind mount. The package-side driver only verifies the bind and returns a\n * no-op lifecycle handle.\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureFleetMounted,\n isFleetManaged,\n} from \"@skaile/workspaces/connectors\";\n\ninterface BoxState {\n fleetManaged: true;\n}\n\nconst CLOUD_FLEET_REQUIRED =\n \"Box cloud connectors require host fleet-managed mounts. Add this connector id to SKAILE_FLEET_MANAGED_MOUNTS and bind the host-managed mount into the workspace container.\";\n\n/**\n * Filesystem-face connector for host fleet-managed Box mounts.\n * @docLink packages/factory-assets/concepts#box-connector\n */\nexport class BoxConnector extends AbstractConnector {\n readonly name = \"box\";\n\n readonly filesystem: FilesystemFace = {\n sync: (_handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> =>\n syncFleetManaged(options),\n };\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"BoxConnector requires ctx.mountTarget to be set by the manager\");\n }\n if (!isFleetManaged(declaration.id)) {\n throw new Error(CLOUD_FLEET_REQUIRED);\n }\n\n this.log.info(\"mount handled by host fleet\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n return this.makeHandle(declaration, { fleetManaged: true } satisfies BoxState, targetDir);\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {}\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new BoxConnector instance.\n * @docLink packages/factory-assets/api-reference#box-connector-factory\n */\nexport function createConnector(): BoxConnector {\n return new BoxConnector();\n}\n\nfunction syncFleetManaged(options?: SyncOptions): Promise<SyncResult> {\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 Promise.resolve({ filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 });\n}\n","/**\n * GitConnector — git repository filesystem-face connector.\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 type {\n ConnectContext,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n MountAuthRef,\n OperationDescriptor,\n SecretProvider,\n SyncOptions,\n SyncResult,\n ToolFace,\n TokenMediatorResult,\n WatchHandle,\n WatchOptions,\n} from \"@skaile/workspaces/connectors\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport {\n AbstractConnector,\n atomicReplaceCredential,\n createFsWatcher,\n ensureFleetMounted,\n isFleetManaged,\n removeMountBlock,\n renderCredentialHelperScript,\n resolveAuthRef,\n writeHelperScript,\n writeMountBlock,\n} from \"@skaile/workspaces/connectors\";\n\n/** New unified TokenMediator shape — uses `connectorId` (renamed from `mountId` in Task 1). */\ntype ConnectorTokenMediator = NonNullable<ConnectContext[\"tokenMediator\"]>;\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 * Starting point for a freshly-created session branch. When set and the\n * session branch does not already exist on origin, the driver fetches this\n * ref and branches from it instead of from the base branch tip. Used by\n * the platform's fork flow so a forked session branches off the source\n * session's tip rather than off `main`. May be a branch name (e.g.\n * `skaile/session-source-slug`) or a commit SHA. Ignored when the session\n * branch already exists on origin (existing branch wins). No-op when\n * `enabled = false` or `isMain = true` (only branch sessions cut new\n * branches). The value is validated against `isValidGitRefOrSha` before\n * use; refs with shell metacharacters are rejected and the driver falls\n * back to branching off base.\n */\n fromRef?: 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 /** Push freshly-created session branch to origin on connect. Best-effort — push\n * failures are swallowed; lifecycle push hooks remain the backstop. */\n publishOnCreate: 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: ConnectorChangeEvent) => void;\n /**\n * Tier-2 managed-gitconfig paths populated when `exposeAccessToken` is on.\n * Cleared on `disconnect`/`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 connect time for use by refresh ticks. Only\n * populated for `auth: backend` connectors; absent for `pat:` and anonymous.\n */\n tokenMediator?: ConnectorTokenMediator;\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 /** Checkout path, retained so the Tier-1 refresh tick can re-bake origin. */\n targetDir?: string;\n /** True when the host fleet owns clone/pull/commit/push for this mount. */\n fleetManaged?: boolean;\n /** Auto-started watcher in fleet mode (no auto-commit timer); disposed in `disconnect`. */\n fleetWatcher?: WatchHandle;\n}\n\n/** Per-block defaults the `parse*Config` helpers fall back to when an option is absent. */\ninterface GitConfigDefaults {\n session: { enabled: boolean };\n sync: { fetchIntervalSec: number; autoRebase: boolean; autoPull: boolean };\n lifecycle: {\n commitOnHibernate: boolean;\n pushOnHibernate: boolean;\n mergeOnClose: boolean;\n pushOnClose: boolean;\n autoCommitIdleMs: number;\n pushAfterCommit: boolean;\n publishOnCreate: boolean;\n };\n}\n\n/**\n * Legacy / no-mode defaults — the exact literals this driver used before `mode`\n * existed, so behavior is unchanged when a declaration carries no `mode`.\n */\nconst LEGACY_DEFAULTS: GitConfigDefaults = {\n session: { enabled: false },\n sync: { fetchIntervalSec: 0, autoRebase: false, autoPull: false },\n lifecycle: {\n commitOnHibernate: true,\n pushOnHibernate: true,\n mergeOnClose: true,\n pushOnClose: true,\n autoCommitIdleMs: 30_000,\n pushAfterCommit: false,\n publishOnCreate: true,\n },\n};\n\n/** Per-mode default tables. `agent` lets the agent drive git; `sync` makes the connector own the working copy. */\nconst MODE_DEFAULTS: Record<\"agent\" | \"sync\", GitConfigDefaults> = {\n agent: {\n session: { enabled: true },\n sync: { fetchIntervalSec: 0, autoRebase: false, autoPull: false },\n lifecycle: {\n ...LEGACY_DEFAULTS.lifecycle,\n // Agent owns its own merge — connector must not auto-merge the session branch.\n mergeOnClose: false,\n autoCommitIdleMs: 0,\n pushAfterCommit: false,\n },\n },\n sync: {\n session: { enabled: false },\n sync: { fetchIntervalSec: 30, autoRebase: true, autoPull: true },\n lifecycle: {\n ...LEGACY_DEFAULTS.lifecycle,\n autoCommitIdleMs: 30_000,\n pushAfterCommit: true,\n },\n },\n};\n\nfunction parseSessionConfig(\n opts: Record<string, unknown> | undefined,\n defaults: GitConfigDefaults[\"session\"],\n): GitSessionConfig {\n const raw = (opts?.session as Record<string, unknown>) ?? {};\n return {\n enabled: Boolean(raw.enabled ?? defaults.enabled),\n slug: raw.slug != null ? String(raw.slug) : undefined,\n isMain: Boolean(raw.isMain ?? true),\n branchPrefix: String(raw.branchPrefix ?? \"session/\"),\n fromRef: raw.fromRef != null ? String(raw.fromRef) : undefined,\n };\n}\n\nfunction parseSyncConfig(\n opts: Record<string, unknown> | undefined,\n defaults: GitConfigDefaults[\"sync\"],\n): GitSyncConfig {\n const raw = (opts?.sync as Record<string, unknown>) ?? {};\n return {\n fetchIntervalSec: Number(raw.fetchIntervalSec ?? defaults.fetchIntervalSec),\n autoRebase: Boolean(raw.autoRebase ?? defaults.autoRebase),\n autoPull: Boolean(raw.autoPull ?? defaults.autoPull),\n };\n}\n\nfunction parseLifecycleConfig(\n opts: Record<string, unknown> | undefined,\n defaults: GitConfigDefaults[\"lifecycle\"],\n): GitLifecycleConfig {\n const raw = (opts?.lifecycle as Record<string, unknown>) ?? {};\n return {\n commitOnHibernate: Boolean(raw.commitOnHibernate ?? defaults.commitOnHibernate),\n pushOnHibernate: Boolean(raw.pushOnHibernate ?? defaults.pushOnHibernate),\n mergeOnClose: Boolean(raw.mergeOnClose ?? defaults.mergeOnClose),\n pushOnClose: Boolean(raw.pushOnClose ?? defaults.pushOnClose),\n autoCommitIdleMs: Number(raw.autoCommitIdleMs ?? defaults.autoCommitIdleMs),\n pushAfterCommit: Boolean(raw.pushAfterCommit ?? defaults.pushAfterCommit),\n publishOnCreate: Boolean(raw.publishOnCreate ?? defaults.publishOnCreate),\n };\n}\n\n/**\n * Resolve the session/sync/lifecycle config blocks for a git connector. `mode`\n * seeds per-block defaults (`agent` / `sync`); explicit `options.{session,sync,\n * lifecycle}` keys still override those defaults. Absent `mode` reproduces the\n * legacy literals exactly, so behavior is unchanged for declarations that set none.\n */\nfunction resolveGitConfig(args: { mode?: \"agent\" | \"sync\"; options?: Record<string, unknown> }): {\n session: GitSessionConfig;\n sync: GitSyncConfig;\n lifecycle: GitLifecycleConfig;\n} {\n // `mode` arrives unvalidated from YAML (connectors are cast, not Zod-parsed);\n // an unknown value would index MODE_DEFAULTS as undefined and crash below.\n let mode = args.mode;\n if (mode && !(mode in MODE_DEFAULTS)) {\n modeLog.warn(\"unknown git mode — falling back to legacy defaults\", { mode });\n mode = undefined;\n }\n const defaults = mode ? MODE_DEFAULTS[mode] : LEGACY_DEFAULTS;\n return {\n session: parseSessionConfig(args.options, defaults.session),\n sync: parseSyncConfig(args.options, defaults.sync),\n lifecycle: parseLifecycleConfig(args.options, defaults.lifecycle),\n };\n}\n\n/** Free-function diagnostics for `resolveGitConfig` (no `this.log` in scope). */\nconst modeLog = createLogger({ kind: \"connector\", subkind: \"git\" });\n\n// ── Git helpers ──────────────────────────────────────────────────────────────\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction gitCommand(cwd: string): string {\n return `git -c safe.directory=${shellQuote(cwd)}`;\n}\n\nfunction git(cmd: string, cwd: string, timeout = 30_000): string {\n return execSync(`${gitCommand(cwd)} ${cmd}`, {\n cwd,\n encoding: \"utf-8\",\n timeout,\n stdio: \"pipe\",\n }).trim();\n}\n\n// Best-effort: align nested submodule checkouts with the parent's pinned SHAs\n// after any ref-changing operation (clone bootstrap, pull, branch switch).\n// `--recurse-submodules` on the initial clone handles the first checkout; this\n// covers every subsequent state change. No-op when `.gitmodules` is absent.\nfunction syncSubmodules(cwd: string): void {\n if (!existsSync(join(cwd, \".gitmodules\"))) return;\n try {\n git(\"submodule update --init --recursive\", cwd, 120_000);\n } catch {\n /* best-effort: a missing submodule shouldn't abort the parent operation */\n }\n}\n\n/**\n * Conservative refname / SHA validator. Used to gate any externally-supplied\n * ref before it interpolates into a shell-form `git` invocation. Accepts a\n * subset of git-check-ref-format(1): forbids whitespace, shell metacharacters,\n * control chars, leading `-` (so the value cannot be misread as a flag), `..`,\n * `@{`, and a trailing `.lock`. Hex SHAs (40 chars) pass through.\n */\nfunction isValidGitRefOrSha(ref: string): boolean {\n if (ref.length === 0 || ref.length > 255) return false;\n // Rejecting control chars is the whole point of this validator — Biome's\n // noControlCharactersInRegex rule does not apply here.\n // biome-ignore lint/suspicious/noControlCharactersInRegex: intentional control-char rejection\n if (/[\\s\\\\~^:?*[\\x00-\\x1f\\x7f`$;&|'\"<>()]/.test(ref)) return false;\n if (ref.startsWith(\"-\") || ref.endsWith(\".lock\") || ref.endsWith(\"/\") || ref.endsWith(\".\"))\n return false;\n if (ref.includes(\"..\") || ref.includes(\"@{\")) return false;\n return true;\n}\n\nfunction hasChanges(cwd: string): boolean {\n const status = git(\"status --porcelain\", cwd);\n return status.length > 0;\n}\n\n/** Run a git subcommand, returning trimmed stdout or `null` on any failure. */\nfunction gitOrNull(cmd: string, cwd: string): string | null {\n try {\n return git(cmd, cwd);\n } catch {\n return null;\n }\n}\n\n/**\n * Parse `git rev-list --left-right --count <ref>...HEAD` into ahead/behind.\n * Left count = commits only on `<ref>` (behind), right count = commits only on\n * HEAD (ahead). Returns `{0,0}` when the ref is missing (e.g. no upstream).\n */\nfunction countAheadBehind(cwd: string, remoteRef: string): { ahead: number; behind: number } {\n const out = gitOrNull(`rev-list --left-right --count ${remoteRef}...HEAD`, cwd);\n if (!out) {\n return { ahead: 0, behind: 0 };\n }\n const parts = out.split(/\\s+/);\n const behind = Number.parseInt(parts[0] ?? \"0\", 10);\n const ahead = Number.parseInt(parts[1] ?? \"0\", 10);\n return {\n ahead: Number.isFinite(ahead) ? ahead : 0,\n behind: Number.isFinite(behind) ? behind : 0,\n };\n}\n\n/**\n * Snapshot returned by the `sync_status` tool op. JSON-serialised over the\n * transport; the platform overlays `available`/`containerAwake`/`reason`\n * before handing it to the UI badge.\n */\nexport interface GitSyncStatusResult {\n /** Current branch name, or `null` (detached HEAD / unavailable). */\n branch: string | null;\n /** Working tree has uncommitted changes (`git status --porcelain` non-empty). */\n dirty: boolean;\n /** Commits on HEAD not on its upstream — i.e. unpushed. */\n ahead: number;\n /** Commits on the upstream not on HEAD — i.e. unpulled (since last fetch). */\n behind: number;\n /**\n * Whether the current branch has a configured upstream. `false` ⇒ the branch\n * has never been pushed; `ahead`/`behind` read as 0 (no remote-tracking ref\n * to diff against), so this distinguishes \"never pushed\" from \"synced\".\n */\n hasUpstream: boolean;\n /** Commits on HEAD not on `origin/<baseBranch>` — diverged ahead of base. */\n mainAhead: number;\n /** Commits on `origin/<baseBranch>` not on HEAD — diverged behind base. */\n mainBehind: number;\n /** Current HEAD commit SHA, or `null` when unavailable. */\n commitSha: string | null;\n}\n\n/**\n * Read git sync status for an in-container checkout. Pure and never throws —\n * every git call degrades to a safe default. No network fetch:\n * ahead/behind reflect locally-known remote-tracking refs (\"since last sync\").\n * `baseBranch` is the mount's tracked base (e.g. \"main\"); base divergence is\n * measured against `origin/<baseBranch>`.\n */\nexport function readGitSyncStatus(cwd: string, baseBranch: string): GitSyncStatusResult {\n const branchRaw = gitOrNull(\"rev-parse --abbrev-ref HEAD\", cwd);\n const branch = branchRaw && branchRaw !== \"HEAD\" ? branchRaw : null;\n\n const dirty = (gitOrNull(\"status --porcelain\", cwd) ?? \"\") !== \"\";\n\n // A branch with no configured upstream has never been pushed. Detected\n // separately because countAheadBehind can't tell \"no upstream\" (rev-list\n // fails → 0/0) from \"in sync with upstream\" (also 0/0). rev-parse exits\n // non-zero when @{upstream} is unset; only success/failure matters here.\n const hasUpstream =\n branch !== null && gitOrNull(\"rev-parse --abbrev-ref @{upstream}\", cwd) !== null;\n\n const upstream = countAheadBehind(cwd, \"@{upstream}\");\n\n const baseRef = isValidGitRefOrSha(baseBranch) ? `origin/${baseBranch}` : \"origin/main\";\n const base = countAheadBehind(cwd, baseRef);\n\n const commitSha = gitOrNull(\"rev-parse HEAD\", cwd);\n\n return {\n branch,\n dirty,\n ahead: upstream.ahead,\n behind: upstream.behind,\n hasUpstream,\n mainAhead: base.ahead,\n mainBehind: base.behind,\n commitSha,\n };\n}\n\n/**\n * True when `branch` exists as a local head in the checkout. Used to reuse a\n * session branch a prior connect created but never pushed — `checkout -b` would\n * otherwise abort with \"already exists\" and fail the connector. `branch` must\n * already be refname-validated before it reaches this shell-form `git` call.\n */\nfunction localBranchExists(branch: string, cwd: string): boolean {\n try {\n git(`rev-parse --verify --quiet refs/heads/${branch}`, cwd);\n return true;\n } catch {\n return false;\n }\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 * (connector manager, retry loop, audit log) can branch on it.\n *\n * @docLink packages/factory-assets/concepts#git-connector-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 connectorId: string,\n ) {\n super(`Git connector '${connectorId}': backend mediator ${code} — ${message}`);\n this.name = \"TokenMediatorError\";\n this.code = code as never;\n }\n}\n\n// ── Connector ──────────────────────────────────────────────────────────────────\n\n/**\n * Filesystem-face connector for git repositories — clones or pulls on connect, supports\n * session branching, periodic fetch/rebase, and lifecycle hooks (hibernate commit/push,\n * session close merge). Also supports Tier-2 managed credential injection via\n * `GIT_CONFIG_GLOBAL` for agent-facing `git` CLI access.\n *\n * Token acquisition for `auth: backend` connectors is mediated by the runner: the\n * connector 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/factory-assets/concepts#git-connector\n */\nexport class GitConnector extends AbstractConnector {\n readonly name = \"git\";\n\n readonly filesystem: FilesystemFace = {\n sync: (handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> => {\n return this._sync(handle, options);\n },\n };\n\n readonly tools: ToolFace = {\n describeOperations: (handle: ConnectorHandle): OperationDescriptor[] =>\n this._describeOperations(handle),\n executeOp: (\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> => this._executeOp(handle, operation, args),\n };\n\n private _describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"sync_status\",\n description:\n \"Report git sync status for this mount: current branch, dirty flag, ahead/behind \" +\n \"vs the upstream, whether the branch has a configured upstream (never-pushed when \" +\n \"false), and divergence vs the base branch. Read-only; performs no fetch.\",\n accessLevel: \"read\",\n args: [],\n examples: [\"sync_status\"],\n },\n ];\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n _args: Record<string, unknown>,\n ): Promise<string> {\n switch (operation) {\n case \"sync_status\": {\n const cwd = handle.mountPath;\n if (!cwd) {\n throw new Error(\"git sync_status: mount path unavailable\");\n }\n const state = handle.state as GitState;\n return JSON.stringify(readGitSyncStatus(cwd, state.branch));\n }\n default:\n throw new Error(`GitConnector has no operation: ${operation}`);\n }\n }\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"GitConnector requires ctx.mountTarget to be set by the manager\");\n }\n\n // Host bind-mounts the worktree; in-container driver must not touch the git lifecycle.\n if (isFleetManaged(declaration.id)) {\n return this.connectFleetManaged(declaration, targetDir);\n }\n\n const secrets = ctx.secrets;\n const tokenMediator = ctx.tokenMediator;\n\n const started = Date.now();\n const opts = declaration.options;\n const url = String(declaration.mount?.source ?? \"\");\n const branch = String(opts?.branch ?? \"main\");\n\n if (!url) {\n this.log.error(\"connect failed: missing mount.source URL\", undefined);\n throw new Error(\"Git connector requires a mount.source URL\");\n }\n\n // `branch` interpolates into shell-form `git clone --branch ...` and later\n // pull/push commands. Reject anything carrying shell metacharacters.\n if (!isValidGitRefOrSha(branch)) {\n throw new Error(`Git connector: invalid branch name \"${branch}\"`);\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:`) connectors\n // remain supported for public repos.\n const initial = await this.acquireInitialToken(declaration, secrets, tokenMediator);\n\n const { session, sync, lifecycle } = resolveGitConfig({\n mode: declaration.mode,\n options: opts,\n });\n\n const state: GitState = {\n url,\n branch,\n activeBranch: branch,\n token: initial.token,\n session,\n sync,\n lifecycle,\n targetDir,\n tokenMediator: initial.authRef?.kind === \"backend\" ? tokenMediator : undefined,\n };\n\n // Clone or pull\n const authUrl = this.authUrl(state);\n this.prepareCheckout(targetDir, url, branch, authUrl, started);\n\n // Session branching: create and checkout a session branch for non-main sessions\n if (session.enabled && !session.isMain && session.slug) {\n this.checkoutSessionBranch(state, session, targetDir);\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 (in declaration.mount),\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.mount?.exposeAccessToken === true) {\n try {\n this.exposeManagedCredential(declaration, state, url, initial);\n } catch (err) {\n this.log.error(\"managed-gitconfig write failed\", err, { connectorId: declaration.id });\n throw err;\n }\n }\n\n // Reconcile origin auth on every connect — stale baked tokens persist across wakes.\n // Tier-2: strip inline creds so the managed credential helper is consulted instead.\n // Tier-1: re-bake the freshly minted token so a woken session doesn't push with a dead one.\n if (state.managedGitconfig) {\n this.stripRemoteInlineToken(targetDir);\n } else {\n this.rebakeRemoteAuth(targetDir, state);\n // Tier-1 has no managed helper: the baked URL token is the sole credential\n // and dies at its ~1h TTL on a session that never hibernates. Schedule the\n // same rotation tick as Tier-2, re-baking the fresh token each time.\n if (initial.authRef?.kind === \"backend\" && initial.expiresAt && state.tokenMediator) {\n this.scheduleRefresh(declaration.id, state, initial.expiresAt);\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, state, targetDir);\n }\n\n /**\n * Bring `targetDir` into a usable checkout state for `connect()`.\n *\n * Minimal-connect policy: `connect()` never auto-syncs with the remote.\n * The lifecycle hooks (`pushOnHibernate`, `pushAfterCommit`,\n * `sync.autoPull`) and the explicit `filesystem.sync()` method are the\n * only paths that touch the network with the existing checkout. Recreating\n * a 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 connect).\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 */\n private prepareCheckout(\n targetDir: string,\n url: string,\n branch: string,\n authUrl: string,\n started: number,\n ): void {\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 connects hit the as-is path 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(\n `${gitCommand(targetDir)} clone --branch ${branch} --single-branch --recurse-submodules ${authUrl} ${targetDir}`,\n {\n timeout: 120_000,\n stdio: \"pipe\",\n },\n );\n this.log.info(\"clone ok\", { branch, durationMs: Date.now() - started });\n } else {\n // Populated dir without `.git`. Typical causes: previous connect\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(\"connect preparation failed\", err, { url, branch });\n throw err;\n }\n }\n\n /**\n * Create and check out the session branch for a non-main session, updating\n * `state.activeBranch`. Reuses an existing local branch (unpushed work);\n * else prefers `origin/<branch>`; otherwise branches off `fromRef` (platform\n * fork flow) when supplied and valid, else off the currently-checked-out\n * HEAD (== base branch).\n */\n private checkoutSessionBranch(\n state: GitState,\n session: GitSessionConfig,\n targetDir: string,\n ): void {\n const sessionBranch = `${session.branchPrefix}${session.slug}`;\n // The composed branch name interpolates into shell-form `git` commands.\n // Reject slug/prefix combinations that don't survive refname validation.\n if (!isValidGitRefOrSha(sessionBranch)) {\n throw new Error(`Git connector: invalid session branch name \"${sessionBranch}\"`);\n }\n // Track whether this connect cut a brand-new branch that does not yet exist\n // on origin — only then do we publish-on-create. Reusing a local branch or\n // checking out an existing origin branch must not trigger an extra push.\n let created = false;\n if (localBranchExists(sessionBranch, targetDir)) {\n // A prior connect created the branch locally but never pushed it — no\n // origin/<branch> tracking ref for the fast path, yet `checkout -b` would\n // abort with \"already exists\". Reuse it so unpushed work survives.\n git(`checkout ${sessionBranch}`, targetDir);\n this.log.info(\"reusing existing local session branch\", { sessionBranch });\n } else {\n // Separate the existence probe from the checkout so the new-branch path\n // is reached only when origin genuinely lacks the branch — a failing\n // `checkout -B` on an existing origin branch must not flip `created`.\n let originHasBranch = false;\n try {\n git(`rev-parse --verify origin/${sessionBranch}`, targetDir);\n originHasBranch = true;\n } catch {\n /* not on origin */\n }\n\n if (originHasBranch) {\n git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);\n } else if (!this.branchFromRef(session, sessionBranch, targetDir)) {\n // No fromRef anchor (or its fetch failed) — branch off the\n // currently-checked-out HEAD (== base branch).\n git(`checkout -b ${sessionBranch}`, targetDir);\n created = true;\n } else {\n // branchFromRef cut the branch off the supplied fork anchor.\n created = true;\n }\n }\n syncSubmodules(targetDir);\n state.activeBranch = sessionBranch;\n this.log.info(\"session branch checked out\", { sessionBranch });\n\n if (created && state.lifecycle.publishOnCreate) {\n try {\n git(`push -u origin ${sessionBranch}`, targetDir, 60_000);\n this.log.info(\"published new session branch\", { sessionBranch });\n } catch (err) {\n // Best-effort: offline / no-remote-write must not fail connect. The\n // lifecycle push hooks (hibernate/close) remain the backstop.\n this.log.warn(\"publish-on-create push failed; deferring to lifecycle push\", {\n sessionBranch,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n /**\n * Attempt to create `sessionBranch` anchored on `session.fromRef`. Returns\n * true when the branch was created from the anchor; false when no valid\n * `fromRef` was supplied or the fetch failed (caller falls back to base).\n */\n private branchFromRef(\n session: GitSessionConfig,\n sessionBranch: string,\n targetDir: string,\n ): boolean {\n if (!session.fromRef) return false;\n if (!isValidGitRefOrSha(session.fromRef)) {\n // Defense in depth: fromRef interpolates into a shell-form `git`\n // command. Refuse anything that doesn't pass refname/SHA validation\n // rather than letting shell metacharacters through.\n this.log.warn(\"fromRef rejected by refname validation, falling back to base branch\", {\n sessionBranch,\n fromRef: session.fromRef,\n });\n return false;\n }\n try {\n git(`fetch origin ${session.fromRef}`, targetDir);\n git(`checkout -b ${sessionBranch} FETCH_HEAD`, targetDir);\n this.log.info(\"session branch created from fromRef\", {\n sessionBranch,\n fromRef: session.fromRef,\n });\n return true;\n } catch (err) {\n this.log.warn(\"fromRef fetch failed, falling back to base branch\", {\n sessionBranch,\n fromRef: session.fromRef,\n error: err instanceof Error ? err.message : String(err),\n });\n return false;\n }\n }\n\n /**\n * Fleet-managed connect: verify the host bind, register an explorer watcher,\n * no-op every git lifecycle hook. Spec: `_devlog/specs/2026-05-28-git-fleet-mode-design.md`.\n */\n private async connectFleetManaged(\n declaration: ConnectorDeclaration,\n targetDir: string,\n ): Promise<ConnectorHandle> {\n this.log.info(\"mount handled by host fleet — skipping in-container git\", {\n connectorId: declaration.id,\n targetDir,\n });\n if (declaration.mount?.exposeAccessToken) {\n // Host fleet owns credentials; managed-gitconfig is intentionally skipped.\n this.log.warn(\"fleet-managed: exposeAccessToken ignored — host fleet owns credentials\", {\n connectorId: declaration.id,\n });\n }\n await ensureFleetMounted(targetDir, this.log);\n\n let activeBranch = \"unknown\";\n try {\n activeBranch = git(\"rev-parse --abbrev-ref HEAD\", targetDir, 5_000);\n } catch {\n // worktree may be on a detached HEAD or pre-init; non-fatal.\n }\n\n const fleetConfig = resolveGitConfig({\n mode: declaration.mode,\n options: declaration.options,\n });\n const state: GitState = {\n url: String(declaration.mount?.source ?? \"\"),\n branch: activeBranch,\n activeBranch,\n session: fleetConfig.session,\n sync: fleetConfig.sync,\n lifecycle: fleetConfig.lifecycle,\n fleetManaged: true,\n };\n\n const dispatch = (event: ConnectorChangeEvent): void => {\n state.emitChange?.(event);\n };\n // Await the watcher so a rapid disconnect cannot race past an unresolved handle.\n state.fleetWatcher = await createFsWatcher(targetDir, dispatch, { ignored: [\"**/.git/**\"] });\n\n this.log.info(\"fleet mount ready\", { activeBranch, targetDir });\n return this.makeHandle(declaration, state, targetDir);\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 connector 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(connectorId: string, handle: ConnectorHandle): Promise<void> {\n const s = handle.state as GitState;\n if (!s.managedGitconfig || !s.tokenMediator) return;\n const result = await s.tokenMediator({ connectorId, reason: \"retry-401\" });\n if (!result.ok) {\n this.log.warn(\"refresh-flag-driven mediation failed\", {\n connectorId,\n code: result.code,\n message: result.message,\n });\n return;\n }\n // Re-read after the await: a concurrent disconnect may have removed the\n // managed credential. Since atomicReplaceCredential now upserts, writing\n // here would otherwise resurrect a credential line for a torn-down mount.\n if (!s.managedGitconfig) return;\n const { credentialsPath, urlPrefix } = s.managedGitconfig;\n atomicReplaceCredential({\n mountId: connectorId,\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(connectorId, s, new Date(result.expiresAt));\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"unmount\");\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host owns the worktree; we only own the watcher.\n await s.fleetWatcher?.close();\n s.fleetWatcher = undefined;\n s.emitChange = undefined;\n return;\n }\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 private async _sync(handle: ConnectorHandle, _options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host's GitFleetService owns periodic fetch/pull. Returning a no-op\n // SyncResult matches the sharepoint/webdav fleet pattern.\n this.log.debug(\"sync skipped — fleet-managed\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n this.log.debug(\"sync (pull) start\", { branch: s.activeBranch });\n try {\n git(`pull origin ${s.activeBranch}`, handle.mountPath!, 60_000);\n syncSubmodules(handle.mountPath!);\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 override watch(\n handle: ConnectorHandle,\n callback: (event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle {\n const s = handle.state as GitState;\n\n if (s.fleetManaged) {\n // The fleet watcher was created in connectFleetManaged and already\n // dispatches through `s.emitChange`. Hook the caller's callback in and\n // detach on close — no auto-commit timer, no second chokidar instance.\n s.emitChange = callback;\n return {\n close: async () => {\n s.emitChange = undefined;\n },\n };\n }\n\n // Wrap callback to reset auto-commit timer on every file change\n s.emitChange = (event: ConnectorChangeEvent) => {\n callback(event);\n this.resetAutoCommitTimer(s, handle.mountPath!);\n };\n\n let fsWatcher: WatchHandle | null = null;\n let closed = false;\n\n const ignored = [...(options?.ignored ?? []), \"**/.git/**\"];\n createFsWatcher(handle.mountPath!, s.emitChange, { ...options, ignored })\n .then((w) => {\n // close() may have already run before creation resolved — dispose\n // immediately so the late watcher does not leak.\n if (closed) void w.close();\n else fsWatcher = w;\n })\n .catch((err) => {\n this.log.warn(\"watcher creation failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n\n return {\n close: async () => {\n closed = true;\n s.emitChange = undefined;\n await fsWatcher?.close();\n },\n };\n }\n\n // ── Session lifecycle ──────────────────────────────────────────────────────\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n this.log.info(\"hibernate\");\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host GitFleetService schedules pushes via its idle-debounce timer.\n return \"fleet-managed\";\n }\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: ConnectorHandle): Promise<string | undefined> {\n this.log.info(\"session closed\");\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host's GitFleetService detaches the worktree when its session refcount\n // reaches zero; merge/push are its job, not ours.\n return \"fleet-managed\";\n }\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 syncSubmodules(handle.mountPath!);\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 connectors down on container\n // shutdown, 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 connectors on the same host\n * with 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 connector.\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 connectors (`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: ConnectorDeclaration,\n secrets: SecretProvider | undefined,\n tokenMediator: ConnectorTokenMediator | 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 `Connector '${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({ connectorId: declaration.id, reason: \"initial\" });\n if (!result.ok) {\n this.log.error(\"backend mediator refused initial token\", undefined, {\n connectorId: 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: ConnectorDeclaration,\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 connectorId: 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 connectorId: 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 connectorId: 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-connector 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-connector (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 connectorId: 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-connects (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(connectorId: 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(connectorId, state).catch((err) => {\n this.log.error(\"managed-gitconfig refresh failed\", err, { connectorId });\n });\n }, delay);\n }\n\n private async refreshManagedCredential(connectorId: string, state: GitState): Promise<void> {\n if (!state.tokenMediator) return;\n\n const result = await state.tokenMediator({ connectorId, reason: \"refresh\" });\n if (!result.ok) {\n this.log.error(\"backend mediator refused refresh\", undefined, {\n connectorId,\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 connector 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(connectorId, state).catch((err) => {\n this.log.error(\"managed-gitconfig refresh retry failed\", err, { connectorId });\n });\n }, 30_000);\n }\n return;\n }\n\n state.token = result.token;\n if (state.managedGitconfig) {\n atomicReplaceCredential({\n mountId: connectorId,\n urlPrefix: state.managedGitconfig.urlPrefix,\n token: result.token,\n credentialsPath: state.managedGitconfig.credentialsPath,\n });\n } else if (state.targetDir) {\n // Tier-1: the URL token is the sole credential — re-bake it.\n this.rebakeRemoteAuth(state.targetDir, state);\n }\n\n this.log.info(\"refresh\", {\n event: \"refresh\",\n tier: state.managedGitconfig ? 2 : 1,\n provider: \"backend\",\n scope: state.managedGitconfig?.urlPrefix ?? state.url,\n expiresAt: result.expiresAt,\n ...(result.scope ? { permissions: result.scope } : {}),\n });\n\n if (result.expiresAt) {\n this.scheduleRefresh(connectorId, state, new Date(result.expiresAt));\n }\n }\n\n private teardownManagedCredential(connectorId: string, state: GitState): void {\n if (state.refreshTimer) {\n clearTimeout(state.refreshTimer);\n state.refreshTimer = undefined;\n }\n // Tier-1 has no gitconfig block to remove, but the mediator ref must still\n // be dropped from the disconnected handle's state.\n state.tokenMediator = undefined;\n if (!state.managedGitconfig) return;\n try {\n removeMountBlock({\n mountId: connectorId,\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 connectorId,\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 `connect()` — exactly when a previous connect 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 connectors).\n */\n private initInPlace(targetDir: string, authUrl: string): void {\n git(\"init\", targetDir, 10_000);\n // Replace any existing origin (idempotent across re-connects).\n try {\n git(\"remote remove origin\", targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n execSync(`${gitCommand(targetDir)} 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 `connect()` 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 connector 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(`${gitCommand(targetDir)} 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 syncSubmodules(targetDir);\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 /**\n * Rewrite `origin` to drop any inline `user:password@` credentials, leaving\n * a bare https(s) URL. Tier-2 only: the managed credential helper supplies\n * (and refreshes) the token, but git ignores helpers when the URL already\n * carries creds — so the baked-in token must go. Best-effort: a missing\n * origin or a non-http(s) remote (e.g. file:// in tests) is left untouched.\n */\n private stripRemoteInlineToken(targetDir: string): void {\n try {\n const current = git(\"remote get-url origin\", targetDir, 5_000);\n if (!current.startsWith(\"https://\") && !current.startsWith(\"http://\")) return;\n const u = new URL(current);\n if (!u.username && !u.password) return;\n u.username = \"\";\n u.password = \"\";\n git(`remote set-url origin ${u.toString()}`, targetDir, 5_000);\n } catch (err) {\n this.log.warn(\"managed-gitconfig: failed to strip inline token from origin\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n /**\n * Tier-1 only: rewrite `origin` so it carries the token freshly minted on\n * this connect. The \"use as-is\" wake path leaves whatever token the first\n * connect baked in — long-dead for short-lived (GitHub App) tokens. Without\n * a Tier-2 helper this URL token is the sole credential, so it must be\n * refreshed here. No-op for anonymous (no token) or non-https remotes.\n */\n private rebakeRemoteAuth(targetDir: string, state: GitState): void {\n if (!state.token || !state.url.startsWith(\"https://\")) return;\n try {\n git(`remote set-url origin ${this.authUrl(state)}`, targetDir, 5_000);\n } catch (err) {\n this.log.warn(\"failed to refresh inline token on origin\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\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 syncSubmodules(mountPath);\n } else if (s.sync.autoPull) {\n git(`pull origin ${s.activeBranch}`, mountPath, 60_000);\n syncSubmodules(mountPath);\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 GitConnector instance.\n * @returns Configured GitConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#git-connector-factory\n */\nexport function createConnector(): GitConnector {\n return new GitConnector();\n}\n\n/** Test-only surface — exposes the mode→config resolver for unit assertions. */\nexport const __test = { resolveGitConfig };\n","/**\n * GmailConnector — 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 type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\ninterface GmailState {\n account: string;\n accessToken: string;\n gmail: any; // googleapis gmail client\n}\n\n/**\n * Connector 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/factory-assets/concepts#gmail-connector\n */\nexport class GmailConnector extends AbstractConnector {\n readonly name = \"gmail\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\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 async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const account = ctx.resolvedFields?.account ?? String(declaration.options?.account ?? \"\");\n const accessToken =\n ctx.resolvedFields?.auth ?? ctx.secrets?.resolve(declaration.auth ?? \"\") ?? \"\";\n\n if (!accessToken) {\n this.log.warn(\"OAuth access token missing or refresh failed\", { account });\n throw new Error(`GmailConnector 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 // No network teardown required for Gmail OAuth — token expiry is managed externally.\n handle.status = \"disconnected\";\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private _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 private _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 private 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(`GmailConnector 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 GmailConnector instance.\n * @returns Configured GmailConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#gmail-connector-factory\n */\nexport function createConnector(): GmailConnector {\n return new GmailConnector();\n}\n","/**\n * GoogleDriveConnector — host fleet-managed Google Drive filesystem connector.\n *\n * Cloud mounts are prepared outside the agent container and exposed through a\n * bind mount. The package-side driver only verifies the bind and returns a\n * no-op lifecycle handle.\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureFleetMounted,\n isFleetManaged,\n} from \"@skaile/workspaces/connectors\";\n\ninterface GoogleDriveState {\n fleetManaged: true;\n}\n\nconst CLOUD_FLEET_REQUIRED =\n \"Google Drive cloud connectors require host fleet-managed mounts. Add this connector id to SKAILE_FLEET_MANAGED_MOUNTS and bind the host-managed mount into the workspace container.\";\n\n/**\n * Filesystem-face connector for host fleet-managed Google Drive mounts.\n * @docLink packages/factory-assets/concepts#googledrive-connector\n */\nexport class GoogleDriveConnector extends AbstractConnector {\n readonly name = \"googledrive\";\n\n readonly filesystem: FilesystemFace = {\n sync: (_handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> =>\n syncFleetManaged(options),\n };\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"GoogleDriveConnector requires ctx.mountTarget to be set by the manager\");\n }\n if (!isFleetManaged(declaration.id)) {\n throw new Error(CLOUD_FLEET_REQUIRED);\n }\n\n this.log.info(\"mount handled by host fleet\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n return this.makeHandle(\n declaration,\n { fleetManaged: true } satisfies GoogleDriveState,\n targetDir,\n );\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {}\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new GoogleDriveConnector instance.\n * @returns Configured GoogleDriveConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#googledrive-connector-factory\n */\nexport function createConnector(): GoogleDriveConnector {\n return new GoogleDriveConnector();\n}\n\nfunction syncFleetManaged(options?: SyncOptions): Promise<SyncResult> {\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 Promise.resolve({ filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 });\n}\n","/**\n * LocalConnector — passthrough to a local directory.\n * Copies (or symlinks) a source directory into the mount point.\n */\n\nimport { cpSync, existsSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type {\n ConnectContext,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n SyncOptions,\n SyncResult,\n WatchHandle,\n WatchOptions,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector, createFsWatcher } from \"@skaile/workspaces/connectors\";\n\ninterface LocalState {\n /** Resolved absolute path to the source directory. */\n sourceDir: string;\n}\n\n/**\n * Filesystem-face connector for local filesystem directories — copies the source directory\n * into the mount target on connect and syncs on demand.\n * No external dependencies; ideal for development and local file access.\n * @docLink packages/factory-assets/concepts#local-connector\n */\nexport class LocalConnector extends AbstractConnector {\n readonly name = \"local\";\n\n readonly filesystem: FilesystemFace = {\n sync: (handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> => {\n return this._sync(handle, options);\n },\n };\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"LocalConnector requires ctx.mountTarget to be set by the manager\");\n }\n\n const started = Date.now();\n const source = declaration.mount?.source ?? \"\";\n this.log.info(\"mount start\", { source, targetDir });\n const sourceDir = resolve(String(source));\n if (!existsSync(sourceDir)) {\n this.log.error(\"connect 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, { sourceDir } satisfies LocalState, targetDir);\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {\n this.log.info(\"unmount\");\n // No-op for local filesystem — don't delete the mount directory\n }\n\n private async _sync(handle: ConnectorHandle, _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 override watch(\n handle: ConnectorHandle,\n callback: (event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle {\n let fsWatcher: WatchHandle | null = null;\n let closed = false;\n\n createFsWatcher(handle.mountPath!, callback, options)\n .then((w) => {\n // close() may have already run before creation resolved — dispose\n // immediately so the late watcher does not leak.\n if (closed) void w.close();\n else fsWatcher = w;\n })\n .catch((err) => {\n this.log.warn(\"watcher creation failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n\n return {\n close: async () => {\n closed = true;\n await fsWatcher?.close();\n },\n };\n }\n}\n\n/**\n * Creates a new LocalConnector instance.\n * @returns Configured LocalConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#local-connector-factory\n */\nexport function createConnector(): LocalConnector {\n return new LocalConnector();\n}\n","/**\n * MattermostConnector — 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 type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } 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 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/factory-assets/concepts#mattermost-connector\n */\nexport class MattermostConnector extends AbstractConnector {\n readonly name = \"mattermost\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n write: (handle, path, content) => this._write(handle, path, content),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\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 async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const url = (ctx.resolvedFields?.url ?? String(declaration.options?.url ?? \"\")).replace(\n /\\/$/,\n \"\",\n );\n const token = ctx.resolvedFields?.token ?? ctx.secrets?.resolve(declaration.auth ?? \"\") ?? \"\";\n const channelsRaw = ctx.resolvedFields?.channels ?? String(declaration.options?.channels ?? \"\");\n\n if (!url) throw new Error(\"MattermostConnector requires a server URL\");\n if (!token) throw new Error(\"MattermostConnector 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(\"MattermostConnector: 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 // No network teardown required — token is stateless.\n handle.status = \"disconnected\";\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private 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}`)) as Record<\n string,\n unknown\n >;\n this._assertChannelAccess(String(post.channel_id ?? \"\"), state.channelFilter);\n return { data: JSON.stringify(post, null, 2), contentType: \"application/json\" };\n } catch {\n return null;\n }\n }\n\n private async _write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n if (handle.access === \"read-only\")\n throw new Error(\"MattermostConnector: 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 private _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 private _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 private 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 const postId = String(args.post_id);\n // Resolve the post's channel first so the thread can't bypass the filter.\n const post = (await this._apiGet(\n state.url,\n state.token,\n `/api/v4/posts/${postId}`,\n )) as Record<string, unknown>;\n this._assertChannelAccess(String(post.channel_id ?? \"\"), state.channelFilter);\n return JSON.stringify(\n await this._apiGet(state.url, state.token, `/api/v4/posts/${postId}/thread`),\n null,\n 2,\n );\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 // Not channel-addressed — no channel to scope against, so the filter\n // does not apply here.\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(`MattermostConnector has no operation \"${operation}\"`);\n }\n }\n\n private _assertWriteAccess(handle: ConnectorHandle): void {\n if (handle.access === \"read-only\")\n throw new Error(\"MattermostConnector: 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(`MattermostConnector: 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 MattermostConnector instance.\n * @returns Configured MattermostConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#mattermost-connector-factory\n */\nexport function createConnector(): MattermostConnector {\n return new MattermostConnector();\n}\n","/**\n * MemoryConnector — in-process key-value store.\n * Not mountable. Used for scratch state, agent-to-agent coordination, config.\n */\n\nimport type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorEntry,\n ConnectorHandle,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\ninterface MemoryState {\n store: Map<string, string>;\n namespace: string;\n}\n\n/**\n * Connector 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/factory-assets/concepts#memory-connector\n */\nexport class MemoryConnector extends AbstractConnector {\n readonly name = \"memory\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n write: (handle, path, content) => this._write(handle, path, content),\n delete: (handle, path) => this._delete(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query, options) => this._search(handle, query, options),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): 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.status = \"disconnected\";\n }\n\n private store(handle: ConnectorHandle): Map<string, string> {\n return (handle.state as MemoryState).store;\n }\n\n private 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 private 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 private 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 private 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 private 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 private _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 private 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 // Escape regex metacharacters first, then translate the glob wildcards so a\n // pattern like \"a.b*\" matches literally rather than as a regex.\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(`^${escaped.replace(/\\\\\\*/g, \".*\").replace(/\\\\\\?/g, \".\")}$`);\n return regex.test(str);\n}\n\n/**\n * Creates a new MemoryConnector instance.\n * @returns Configured MemoryConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#memory-connector-factory\n */\nexport function createConnector(): MemoryConnector {\n return new MemoryConnector();\n}\n","/**\n * MinIOConnector — 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 type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorEntry,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\ninterface MinIOState {\n client: any; // minio.Client\n bucket: string;\n endpoint: string;\n}\n\n/**\n * Connector 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/factory-assets/concepts#minio-connector\n */\nexport class MinIOConnector extends AbstractConnector {\n readonly name = \"minio\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n list: (handle, path) => this._list(handle, path),\n read: (handle, path) => this._read(handle, path),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\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 private _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(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const endpoint = ctx.resolvedFields?.endpoint ?? String(declaration.options?.endpoint ?? \"\");\n const bucket = ctx.resolvedFields?.bucket ?? String(declaration.options?.bucket ?? \"\");\n const accessKey =\n ctx.resolvedFields?.[\"access-key\"] ??\n ctx.secrets?.resolve((declaration.options?.[\"access-key\"] as string | undefined) ?? \"\") ??\n \"\";\n const secretKey =\n ctx.resolvedFields?.[\"secret-key\"] ??\n ctx.secrets?.resolve((declaration.options?.[\"secret-key\"] as string | undefined) ?? \"\") ??\n \"\";\n const useSSL =\n (ctx.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 handle.status = \"disconnected\";\n }\n\n private _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 private async _list(\n handle: ConnectorHandle,\n path?: string,\n recursive = false,\n ): Promise<ConnectorEntry[]> {\n const { client, bucket } = handle.state as MinIOState;\n const entries: ConnectorEntry[] = [];\n const stream = client.listObjects(bucket, path ?? \"\", recursive);\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 private 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 private 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(\n await this._list(handle, String(args.prefix ?? \"\"), Boolean(args.recursive)),\n null,\n 2,\n );\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 MinIOConnector instance.\n * @returns Configured MinIOConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#minio-connector-factory\n */\nexport function createConnector(): MinIOConnector {\n return new MinIOConnector();\n}\n","/**\n * PostgresConnector — 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 type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorEntry,\n ConnectorFieldSpec,\n ConnectorHandle,\n ListOptions,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n SearchOptions,\n SearchResult,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\ninterface PgState {\n pool: any; // pg.Pool\n dsn: string;\n}\n\n/** Escape an identifier for safe interpolation inside double quotes. */\nfunction quoteIdent(ident: string): string {\n return ident.replace(/\"/g, '\"\"');\n}\n\n/**\n * Connector 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/factory-assets/concepts#postgres-connector\n */\nexport class PostgresConnector extends AbstractConnector {\n readonly name = \"postgres\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query, options) => this._search(handle, query, options),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\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 private _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(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const started = Date.now();\n let dsn = ctx.resolvedFields?.dsn ?? String(declaration.options?.dsn ?? \"\");\n\n // Backend-mediated: the platform minted the DSN; resolve it via the wrapped\n // mediator (pre-mint initial, real mediator for refresh). Off-disk by design.\n if (!dsn && declaration.auth === \"backend\" && ctx.tokenMediator) {\n const mint = await ctx.tokenMediator({ connectorId: declaration.id, reason: \"initial\" });\n if (mint.ok) dsn = mint.token;\n else\n throw new Error(\n `PostgresAdapter '${declaration.id}': backend credential ${mint.code} — ${mint.message}`,\n );\n }\n\n // Fall back to the secrets chain for env:/pat: refs (non-backend auth).\n if (!dsn) dsn = ctx.secrets?.resolve(declaration.auth ?? \"\") ?? \"\";\n\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 try {\n await pool.end();\n } finally {\n handle.status = \"disconnected\";\n }\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 private 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(\n `SELECT * FROM \"${quoteIdent(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 private 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 \"${quoteIdent(path)}\" LIMIT $1`, [\n limit,\n ]);\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 private 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) => `\"${quoteIdent(String(c.column_name))}\"::text ILIKE $1`)\n .join(\" OR \");\n const searchResult = await this.pool(handle).query(\n `SELECT * FROM \"${quoteIdent(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 private _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 private 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 return this._opQuery(pool, args);\n case \"schema\":\n return this._opSchema(pool, args);\n case \"execute\":\n return this._opExecute(pool, args);\n default:\n throw new Error(`PostgresAdapter has no operation: ${operation}`);\n }\n }\n\n /** Parse the params argument shared by the query/execute ops (JSON string or passthrough). */\n private parseParams(params: unknown): unknown {\n return params ? (typeof params === \"string\" ? JSON.parse(params) : params) : [];\n }\n\n private async _opQuery(pool: any, args: Record<string, unknown>): Promise<string> {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const params = this.parseParams(args.params);\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\n private async _opSchema(pool: any, args: Record<string, unknown>): Promise<string> {\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\n private async _opExecute(pool: any, args: Record<string, unknown>): Promise<string> {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const params = this.parseParams(args.params);\n const result = await pool.query(sql, params);\n return JSON.stringify({ rowCount: result.rowCount, command: result.command });\n }\n}\n\n/**\n * Creates a new PostgresConnector instance.\n * @returns Configured PostgresConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#postgres-connector-factory\n */\nexport function createConnector(): PostgresConnector {\n return new PostgresConnector();\n}\n","/**\n * S3Connector — AWS S3 / S3-compatible object storage filesystem-face connector.\n * Mounts by syncing objects to a local directory.\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\nconst s3Pkg = \"@aws-sdk/client-s3\";\n\n/**\n * Minimal shape of the AWS S3 SDK module used internally.\n * Declared here so tests can provide a lightweight fake without importing the\n * real (optional) `@aws-sdk/client-s3` package.\n */\nexport interface S3SdkModule {\n S3Client: new (\n config: object,\n ) => {\n send(cmd: object): Promise<any>;\n destroy(): void;\n };\n ListObjectsV2Command: new (input: object) => object;\n GetObjectCommand: new (input: object) => object;\n}\n\ninterface S3State {\n client: InstanceType<S3SdkModule[\"S3Client\"]>;\n bucket: string;\n prefix: string;\n region: string;\n}\n\n/**\n * Filesystem-face connector for AWS S3 and S3-compatible object storage — downloads all\n * objects from a bucket prefix into a local directory on connect and re-downloads on sync.\n * Requires the `@aws-sdk/client-s3` optional peer dependency.\n * @docLink packages/factory-assets/concepts#s3-connector\n */\nexport class S3Connector extends AbstractConnector {\n readonly name = \"s3\";\n\n /** Optional SDK module override — used in tests to avoid importing the real AWS SDK. */\n private _sdkOverride?: S3SdkModule;\n\n constructor(sdkOverride?: S3SdkModule) {\n super();\n this._sdkOverride = sdkOverride;\n }\n\n readonly filesystem: FilesystemFace = {\n sync: (handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> => {\n return this._sync(handle, options);\n },\n };\n\n private async _loadSdk(): Promise<S3SdkModule> {\n if (this._sdkOverride) return this._sdkOverride;\n return (await import(/* @vite-ignore */ s3Pkg)) as S3SdkModule;\n }\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"S3Connector requires ctx.mountTarget to be set by the manager\");\n }\n const secrets = ctx.secrets;\n\n const started = Date.now();\n const opts = declaration.options;\n const bucket = String(opts?.bucket ?? \"\");\n if (!bucket) {\n this.log.error(\"connect failed: missing bucket option\", undefined);\n throw new Error(\"S3Connector 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 this._loadSdk();\n const { S3Client } = s3Mod;\n\n const clientConfig: any = { region };\n if (endpoint) clientConfig.endpoint = endpoint;\n\n // Pass the profile via the client config rather than mutating process.env\n // (AWS_PROFILE), which leaks process-wide and is never restored.\n const profile = secrets?.resolve(declaration.auth ?? \"\");\n if (profile) {\n clientConfig.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, state, targetDir);\n } catch (err) {\n this.log.error(\"connect failed\", err, { bucket, targetDir });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"unmount\");\n const { client } = handle.state as S3State;\n client.destroy();\n }\n\n private async _sync(handle: ConnectorHandle, _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 this._loadSdk();\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 let bytesTransferred = 0;\n for (const { key, relPath } of entries) {\n try {\n const resp = await client.send(new s3Mod.GetObjectCommand({ Bucket: bucket, Key: key }));\n // transformToByteArray preserves binary content; transformToString would\n // UTF-8 decode and corrupt non-text objects.\n const bytes = await resp.Body?.transformToByteArray();\n if (bytes == null) continue;\n const body = Buffer.from(bytes);\n\n const localPath = join(targetDir, relPath);\n mkdirSync(dirname(localPath), { recursive: true });\n writeFileSync(localPath, body);\n filesWritten++;\n bytesTransferred += body.byteLength;\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 };\n }\n}\n\n/**\n * Creates a new S3Connector instance.\n * @param sdkOverride - Optional SDK module to use instead of dynamically importing\n * `@aws-sdk/client-s3`. Intended for testing only.\n * @returns Configured S3Connector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#s3-connector-factory\n */\nexport function createConnector(sdkOverride?: S3SdkModule): S3Connector {\n return new S3Connector(sdkOverride);\n}\n","/**\n * SharePointConnector — host fleet-managed SharePoint/OneDrive filesystem connector.\n *\n * Cloud mounts are prepared outside the agent container and exposed through a\n * bind mount. The package-side driver only verifies the bind and returns a\n * no-op lifecycle handle.\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureFleetMounted,\n isFleetManaged,\n} from \"@skaile/workspaces/connectors\";\n\ninterface SharePointState {\n fleetManaged: true;\n}\n\nconst CLOUD_FLEET_REQUIRED =\n \"SharePoint cloud connectors require host fleet-managed mounts. Add this connector id to SKAILE_FLEET_MANAGED_MOUNTS and bind the host-managed mount into the workspace container.\";\n\n/**\n * Filesystem-face connector for host fleet-managed SharePoint and OneDrive mounts.\n * @docLink packages/factory-assets/concepts#sharepoint-connector\n */\nexport class SharePointConnector extends AbstractConnector {\n readonly name = \"sharepoint\";\n\n readonly filesystem: FilesystemFace = {\n sync: (_handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> =>\n syncFleetManaged(options),\n };\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"SharePointConnector requires ctx.mountTarget to be set by the manager\");\n }\n if (!isFleetManaged(declaration.id)) {\n throw new Error(CLOUD_FLEET_REQUIRED);\n }\n\n this.log.info(\"mount handled by host fleet\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n return this.makeHandle(\n declaration,\n { fleetManaged: true } satisfies SharePointState,\n targetDir,\n );\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {}\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new SharePointConnector instance.\n * @returns Configured SharePointConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#sharepoint-connector-factory\n */\nexport function createConnector(): SharePointConnector {\n return new SharePointConnector();\n}\n\nfunction syncFleetManaged(options?: SyncOptions): Promise<SyncResult> {\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 Promise.resolve({ filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 });\n}\n","/**\n * SQLiteConnector — 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 type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorEntry,\n ConnectorHandle,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\ninterface SqliteState {\n db: any; // sql.js Database instance\n dbPath: string;\n readonly: boolean;\n}\n\n/** Escape an identifier for safe interpolation inside double quotes. */\nfunction quoteIdent(ident: string): string {\n return ident.replace(/\"/g, '\"\"');\n}\n\n/**\n * Connector 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/factory-assets/concepts#sqlite-connector\n */\nexport class SQLiteConnector extends AbstractConnector {\n readonly name = \"sqlite\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query, options) => this._search(handle, query, options),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const started = Date.now();\n const dbPath =\n ctx.secrets?.resolve(declaration.auth ?? \"\") ?? 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.status = \"disconnected\";\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 private 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(\"${quoteIdent(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(\n this.db(handle),\n `SELECT * FROM \"${quoteIdent(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 private 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(\n this.db(handle),\n `SELECT rowid, * FROM \"${quoteIdent(path)}\" LIMIT ?`,\n [limit],\n );\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 private 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(\n this.db(handle),\n `PRAGMA table_info(\"${quoteIdent(table.name)}\")`,\n );\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\n .map((c: any) => `\"${quoteIdent(String(c.name))}\" LIKE ?`)\n .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 \"${quoteIdent(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 private _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 private 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(\"${quoteIdent(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(\n db,\n `PRAGMA table_info(\"${quoteIdent(String(t.name))}\")`,\n );\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 SQLiteConnector instance.\n * @returns Configured SQLiteConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#sqlite-connector-factory\n */\nexport function createConnector(): SQLiteConnector {\n return new SQLiteConnector();\n}\n","/**\n * StaticServerConnector — serve a directory of static files over HTTP.\n * Category: service\n *\n * Built on `node:http` + `node:fs`, so it runs under both Node and Bun.\n */\n\nimport { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { createServer, type Server as HttpServer, type ServerResponse } from \"node:http\";\nimport { join, resolve, sep } from \"node:path\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n createWorktree,\n findGitRoot,\n PortPool,\n} from \"@skaile/workspaces/connectors\";\nimport mime from \"mime\";\n\ninterface StaticInstance {\n id: string;\n port: number;\n dir: string;\n server: HttpServer;\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 for serving static file directories over HTTP.\n * Supports multiple concurrent instances, port allocation, and optional git worktree isolation.\n * @docLink packages/factory-assets/concepts#static-server-connector\n */\nexport class StaticServerConnector extends AbstractConnector {\n readonly name = \"static-server\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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 try {\n await this._stopAll(handle);\n } finally {\n handle.status = \"disconnected\";\n }\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._stopAll(handle);\n return undefined;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private async _stopAll(handle: ConnectorHandle): Promise<void> {\n const state = handle.state as StaticServerState;\n for (const [, instance] of state.instances) {\n stopHttpServer(instance.server);\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 private _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 private 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(`StaticServerConnector: \"${operation}\" requires read-write access`);\n }\n\n switch (operation) {\n case \"serve\":\n return this._opServe(state, args);\n case \"stop\":\n return this._opStop(state, args);\n case \"status\":\n return this._opStatus(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(`StaticServerConnector: unknown operation \"${operation}\"`);\n }\n }\n\n private async _opServe(state: StaticServerState, args: Record<string, unknown>): Promise<string> {\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 = createServer((req, res) => {\n serveStaticFile(serveDir, req.url ?? \"/\", res);\n });\n server.listen(port);\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 private async _opStop(state: StaticServerState, args: Record<string, unknown>): Promise<string> {\n const id = String(args.instance ?? \"\");\n const instance = state.instances.get(id);\n if (!instance) throw new Error(`Instance \"${id}\" not found`);\n stopHttpServer(instance.server);\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 private _opStatus(state: StaticServerState, args: Record<string, unknown>): 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 return JSON.stringify(instanceToStatus(inst));\n }\n return JSON.stringify([...state.instances.values()].map(instanceToStatus));\n }\n\n private _opListInstances(state: StaticServerState): string {\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\n private async _opFreePort(state: StaticServerState): Promise<string> {\n return JSON.stringify({ port: await state.pool.allocate() });\n }\n\n private _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.\",\n category: \"service\",\n access: handle.access,\n toolNames: this._describeOperations(handle).map((o) => o.name),\n };\n }\n}\n\n/**\n * Serve a single file from `rootDir` for the given request URL. Rejects paths\n * that escape `rootDir` (path traversal), 404s missing files, and resolves\n * directory requests to `index.html`.\n */\nfunction serveStaticFile(rootDir: string, reqUrl: string, res: ServerResponse): void {\n const root = resolve(rootDir);\n const pathname = decodeURIComponent(new URL(reqUrl, \"http://localhost\").pathname);\n let filePath = resolve(root, `.${pathname}`);\n // Containment guard — never serve a file outside the configured directory.\n if (filePath !== root && !filePath.startsWith(root + sep)) {\n res.writeHead(403, { \"content-type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n if (pathname.endsWith(\"/\") || (existsSync(filePath) && statSync(filePath).isDirectory())) {\n filePath = join(filePath, \"index.html\");\n }\n if (!existsSync(filePath) || !statSync(filePath).isFile()) {\n res.writeHead(404, { \"content-type\": \"text/plain\" });\n res.end(\"Not Found\");\n return;\n }\n res.writeHead(200, { \"content-type\": mime.getType(filePath) ?? \"application/octet-stream\" });\n const stream = createReadStream(filePath);\n stream.on(\"error\", () => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n res.end();\n });\n stream.pipe(res);\n}\n\n/** Stop an HTTP server, terminating any in-flight connections immediately. */\nfunction stopHttpServer(server: HttpServer): void {\n server.closeAllConnections();\n server.close();\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 StaticServerConnector instance.\n * @returns Configured StaticServerConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#static-server-connector-factory\n */\nexport function createConnector(): StaticServerConnector {\n return new StaticServerConnector();\n}\n","/**\n * TunnelConnector — expose local ports to the internet via cloudflare/ngrok/mock.\n * Category: service\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport { portableSpawn } from \"@skaile/workspaces/core\";\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 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/factory-assets/concepts#tunnel-connector\n */\nexport class TunnelConnector extends AbstractConnector {\n readonly name = \"tunnel\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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(`TunnelConnector: \"${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 try {\n await this._closeAll(handle);\n } finally {\n handle.status = \"disconnected\";\n }\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._closeAll(handle);\n return undefined;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\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 private _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 private 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(`TunnelConnector: \"${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(`TunnelConnector: unknown operation \"${operation}\"`);\n }\n }\n\n private _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 = portableSpawn([\"which\", cli]);\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 = portableSpawn([\"cloudflared\", \"tunnel\", \"--url\", `http://localhost:${port}`]);\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 proc.kill();\n reject(new Error(\"cloudflared: failed to parse public URL\"));\n };\n readLoop().catch(reject);\n setTimeout(() => {\n proc.kill();\n reject(new Error(\"cloudflared: timed out\"));\n }, 30_000);\n });\n}\n\nasync function spawnNgrokTunnel(port: number): Promise<{ url: string; process: { kill(): void } }> {\n const proc = portableSpawn([\"ngrok\", \"http\", String(port)]);\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 TunnelConnector instance.\n * @returns Configured TunnelConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#tunnel-connector-factory\n */\nexport function createConnector(): TunnelConnector {\n return new TunnelConnector();\n}\n","/**\n * WebDAVConnector — host fleet-managed WebDAV filesystem connector.\n *\n * Cloud mounts are prepared outside the agent container and exposed through a\n * bind mount. The package-side driver only verifies the bind and returns a\n * no-op lifecycle handle.\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureFleetMounted,\n isFleetManaged,\n} from \"@skaile/workspaces/connectors\";\n\ninterface WebDAVState {\n fleetManaged: true;\n}\n\nconst CLOUD_FLEET_REQUIRED =\n \"WebDAV cloud connectors require host fleet-managed mounts. Add this connector id to SKAILE_FLEET_MANAGED_MOUNTS and bind the host-managed mount into the workspace container.\";\n\n/**\n * Filesystem-face connector for host fleet-managed WebDAV mounts.\n * @docLink packages/factory-assets/concepts#webdav-connector\n */\nexport class WebDAVConnector extends AbstractConnector {\n readonly name = \"webdav\";\n\n readonly filesystem: FilesystemFace = {\n sync: (_handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> =>\n syncFleetManaged(options),\n };\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"WebDAVConnector requires ctx.mountTarget to be set by the manager\");\n }\n if (!isFleetManaged(declaration.id)) {\n throw new Error(CLOUD_FLEET_REQUIRED);\n }\n\n this.log.info(\"mount handled by host fleet\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n return this.makeHandle(declaration, { fleetManaged: true } satisfies WebDAVState, targetDir);\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {}\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this.filesystem.sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new WebDAVConnector instance.\n * @returns Configured WebDAVConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#webdav-connector-factory\n */\nexport function createConnector(): WebDAVConnector {\n return new WebDAVConnector();\n}\n\nfunction syncFleetManaged(options?: SyncOptions): Promise<SyncResult> {\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 Promise.resolve({ filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 });\n}\n","/**\n * XStateConnector — 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 type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorEntry,\n ConnectorHandle,\n ListOptions,\n OperationDescriptor,\n SearchResult,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } 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 for XState v5 state machines — drives guarded transitions, tracks history, and exposes\n * the current state and context to agents. Machine definitions can be provided inline or loaded\n * from a JSON/YAML file. Requires the `xstate` optional peer dependency.\n * @docLink packages/factory-assets/concepts#xstate-connector\n */\nexport class XStateConnector extends AbstractConnector {\n readonly name = \"xstate\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query) => this._search(handle, query),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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 try {\n s.actor?.stop();\n } finally {\n handle.status = \"disconnected\";\n }\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 // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private 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 private 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 private 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 private _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 private 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 XStateConnector instance.\n * @returns Configured XStateConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#xstate-connector-factory\n */\nexport function createConnector(): XStateConnector {\n return new XStateConnector();\n}\n","/**\n * XStateStoreConnector — 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 type {\n ConnectContext,\n ConnectorContent,\n ConnectorDeclaration,\n ConnectorEntry,\n ConnectorHandle,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } 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 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/factory-assets/concepts#xstate-store-connector\n */\nexport class XStateStoreConnector extends AbstractConnector {\n readonly name = \"xstate-store\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n write: (handle, path, content) => this._write(handle, path, content),\n delete: (handle, path) => this._delete(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query, options) => this._search(handle, query, options),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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.status = \"disconnected\";\n }\n\n private storeState(handle: ConnectorHandle): StoreState {\n return handle.state as StoreState;\n }\n\n private context(handle: ConnectorHandle): Record<string, unknown> {\n return this.storeState(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 // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private 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 private 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.storeState(handle).store.send({ type: \"set\", key: path, value });\n this._recordHistory(handle, \"set\", { key: path, value });\n }\n\n private async _delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const ctx = this.context(handle);\n if (!(path in ctx)) return false;\n this.storeState(handle).store.send({ type: \"delete\", key: path });\n this._recordHistory(handle, \"delete\", { key: path });\n return true;\n }\n\n private 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 // Escape regex metacharacters before substituting the `*` wildcard so a\n // glob like \"a.b*\" matches literally rather than as a regex.\n const escaped = options.glob.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regex = new RegExp(`^${escaped.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 private 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 private _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: \"delete\",\n description: \"Delete a single key from the store context.\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Key name to delete\" },\n ],\n examples: [\"delete --key theme\"],\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 private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n switch (operation) {\n case \"get\":\n return this._opGet(handle);\n case \"get_key\":\n return this._opGetKey(handle, args);\n case \"history\":\n return this._opHistory(handle, args);\n case \"set\":\n return this._opSet(handle, args);\n case \"merge\":\n return this._opMerge(handle, args);\n case \"delete\":\n return this._opDelete(handle, args);\n case \"reset\":\n return this._opReset(handle);\n default:\n throw new Error(`XStateStoreConnector has no operation: ${operation}`);\n }\n }\n\n private _opGet(handle: ConnectorHandle): string {\n return JSON.stringify(this.context(handle), null, 2);\n }\n\n private _opGetKey(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const key = String(args.key ?? \"\");\n const value = this.context(handle)[key];\n return value !== undefined ? JSON.stringify(value) : \"\";\n }\n\n private _opHistory(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const s = this.storeState(handle);\n const limit = Number(args.limit ?? 50);\n return JSON.stringify(s.history.slice(-limit), null, 2);\n }\n\n private _opSet(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const s = this.storeState(handle);\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 private _opMerge(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const s = this.storeState(handle);\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 private _opDelete(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const s = this.storeState(handle);\n // Mirrors the tool-face `_delete`: skip absent keys (no phantom history\n // or broadcast), else mutate the store, record, and emit the change.\n const key = String(args.key ?? \"\");\n if (!(key in this.context(handle))) return \"OK\";\n s.store.send({ type: \"delete\", key });\n this._recordHistory(handle, \"delete\", { key });\n this.emitChange?.({ path: key, action: \"delete\", source: \"operation\" });\n return \"OK\";\n }\n\n private _opReset(handle: ConnectorHandle): string {\n const s = this.storeState(handle);\n s.store.send({ type: \"reset\" });\n s.history = [];\n this.emitChange?.({ path: \"\", action: \"edit\", source: \"operation\" });\n return \"OK\";\n }\n\n private _recordHistory(handle: ConnectorHandle, event: string, payload: unknown): void {\n const s = this.storeState(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 XStateStoreConnector instance.\n * @returns Configured XStateStoreConnector ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#xstate-store-connector-factory\n */\nexport function createConnector(): XStateStoreConnector {\n return new XStateStoreConnector();\n}\n","/**\n * Connector registry.\n *\n * Built-in connectors from `@skaile/workspaces/factory-assets` are registered here\n * via 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. Each built-in\n * factory is wrapped in a `ConnectorTarget` and registered into the unified\n * `pluginRegistry` (`@skaile/workspaces/plugin-registry`). The public read\n * helpers (`getConnector` / `tryGetConnector` / `listConnectors`) are thin\n * kind-typed wrappers over that registry.\n *\n * The catalog path in `ConnectorManager.resolveConnector`\n * (`await import(connectorPath)` of raw TS) is a dev-only fallback for\n * project-local third-party connectors — 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/factory-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 { createConnector as createDeployConnector } from \"@skaile/workspaces/factory-assets/connectors/deploy\";\n// Service connectors (migrated in Task 9)\nimport { createConnector as createDevserverConnector } from \"@skaile/workspaces/factory-assets/connectors/devserver\";\n// State connectors (migrated in Task 8)\nimport { createConnector as createFlowConnector } from \"@skaile/workspaces/factory-assets/connectors/flow\";\n\n// Static subpath imports — string literals only.\n// Filesystem-face connectors (mount drivers migrated in Task 6)\nimport { createConnector as createBoxConnector } from \"@skaile/workspaces/factory-assets/connectors/box\";\nimport { createConnector as createGitConnector } from \"@skaile/workspaces/factory-assets/connectors/git\";\nimport { createConnector as createGmailConnector } from \"@skaile/workspaces/factory-assets/connectors/gmail\";\nimport { createConnector as createGoogleDriveConnector } from \"@skaile/workspaces/factory-assets/connectors/googledrive\";\nimport { createConnector as createLocalConnector } from \"@skaile/workspaces/factory-assets/connectors/local\";\nimport { createConnector as createMattermostConnector } from \"@skaile/workspaces/factory-assets/connectors/mattermost\";\n// Data connectors (migrated in Task 7)\nimport { createConnector as createMemoryConnector } from \"@skaile/workspaces/factory-assets/connectors/memory\";\nimport { createConnector as createMinioConnector } from \"@skaile/workspaces/factory-assets/connectors/minio\";\nimport { createConnector as createPostgresConnector } from \"@skaile/workspaces/factory-assets/connectors/postgres\";\nimport { createConnector as createS3Connector } from \"@skaile/workspaces/factory-assets/connectors/s3\";\nimport { createConnector as createSharepointConnector } from \"@skaile/workspaces/factory-assets/connectors/sharepoint\";\nimport { createConnector as createSqliteConnector } from \"@skaile/workspaces/factory-assets/connectors/sqlite\";\n// Subpath and registry key (CONNECTOR.md `name:`) are both `static-server`.\nimport { createConnector as createStaticConnector } from \"@skaile/workspaces/factory-assets/connectors/static-server\";\nimport { createConnector as createTunnelConnector } from \"@skaile/workspaces/factory-assets/connectors/tunnel\";\nimport { createConnector as createWebdavConnector } from \"@skaile/workspaces/factory-assets/connectors/webdav\";\nimport { createConnector as createXstateConnector } from \"@skaile/workspaces/factory-assets/connectors/xstate\";\nimport { createConnector as createXstateStoreConnector } from \"@skaile/workspaces/factory-assets/connectors/xstate-store\";\nimport {\n type ConnectorTarget,\n type PluginRegistry,\n pluginRegistry,\n} from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport type { Connector, ConnectorFactory } from \"./connector-types.js\";\n\n// ── Unified Connector registry ───────────────────────────────────────────────\n// Built-ins are stored in the shared pluginRegistry under the \"connector\" kind.\n\n/**\n * Static metadata for every built-in connector — pure data, no imports.\n *\n * Mirrors the ids registered by {@link registerBuiltinConnectors}; selection UIs\n * use it to enumerate the built-in set without loading any connector module\n * (parity with `BUILTIN_DRIVER_CATALOG`).\n *\n * @docLink packages/connectors/api-reference#builtin-connector-catalog\n */\nexport const BUILTIN_CONNECTOR_CATALOG: readonly { id: string; displayName: string }[] = [\n { id: \"git\", displayName: \"git\" },\n { id: \"local\", displayName: \"local\" },\n { id: \"s3\", displayName: \"s3\" },\n { id: \"webdav\", displayName: \"webdav\" },\n { id: \"sharepoint\", displayName: \"sharepoint\" },\n { id: \"googledrive\", displayName: \"googledrive\" },\n { id: \"box\", displayName: \"box\" },\n { id: \"memory\", displayName: \"memory\" },\n { id: \"postgres\", displayName: \"postgres\" },\n { id: \"sqlite\", displayName: \"sqlite\" },\n { id: \"minio\", displayName: \"minio\" },\n { id: \"flow\", displayName: \"flow\" },\n { id: \"xstate\", displayName: \"xstate\" },\n { id: \"xstate-store\", displayName: \"xstate-store\" },\n { id: \"devserver\", displayName: \"devserver\" },\n { id: \"static-server\", displayName: \"static-server\" },\n { id: \"tunnel\", displayName: \"tunnel\" },\n { id: \"deploy\", displayName: \"deploy\" },\n { id: \"gmail\", displayName: \"gmail\" },\n { id: \"mattermost\", displayName: \"mattermost\" },\n];\n\n/**\n * Build a `ConnectorTarget` wrapping an existing connector factory.\n *\n * Connectors take no construct-time config, so `configSchema` is a passthrough\n * and `create()` simply calls the factory. Lifecycle config arrives later via\n * `Connector.connect(declaration, ctx)`.\n */\nfunction connectorTargetFromFactory(id: string, factory: ConnectorFactory): ConnectorTarget {\n return {\n id,\n displayName: id,\n apiVersion: 1,\n configSchema: z.unknown(),\n create: (_config, _ctx) => factory(),\n };\n}\n\nlet _connectorsRegistered = false;\n\n/**\n * Register every built-in connector into the plugin registry.\n *\n * **Static import discipline.** Every subpath specifier in this file must be a\n * string-literal `from \"@skaile/workspaces/factory-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 *\n * Idempotent: guarded by a module flag so a second call is a no-op (a duplicate\n * `register` would otherwise throw `RegistrationError`).\n *\n * @docLink packages/connectors/api-reference#register-builtin-connectors\n */\nexport function registerBuiltinConnectors(registry: PluginRegistry = pluginRegistry): void {\n if (registry === pluginRegistry && _connectorsRegistered) return;\n\n const reg = (id: string, factory: ConnectorFactory): void => {\n if (registry.get(\"connector\", id)) return;\n registry.register(\"connector\", connectorTargetFromFactory(id, factory));\n };\n\n // Filesystem-face connectors (former mount drivers, migrated in Task 6)\n reg(\"git\", () => createGitConnector());\n reg(\"local\", () => createLocalConnector());\n reg(\"s3\", () => createS3Connector());\n reg(\"webdav\", () => createWebdavConnector());\n reg(\"sharepoint\", () => createSharepointConnector());\n reg(\"googledrive\", () => createGoogleDriveConnector());\n reg(\"box\", () => createBoxConnector());\n\n // Data connectors (migrated in Task 7)\n reg(\"memory\", () => createMemoryConnector());\n reg(\"postgres\", () => createPostgresConnector());\n reg(\"sqlite\", () => createSqliteConnector());\n reg(\"minio\", () => createMinioConnector());\n\n // State connectors (migrated in Task 8)\n reg(\"flow\", () => createFlowConnector());\n reg(\"xstate\", () => createXstateConnector());\n reg(\"xstate-store\", () => createXstateStoreConnector());\n\n // Service connectors (migrated in Task 9)\n reg(\"devserver\", () => createDevserverConnector());\n // Subpath and registry key (CONNECTOR.md `name:`) are both `static-server`.\n reg(\"static-server\", () => createStaticConnector());\n reg(\"tunnel\", () => createTunnelConnector());\n reg(\"deploy\", () => createDeployConnector());\n\n // Integration connectors (migrated in Task 10)\n reg(\"gmail\", () => createGmailConnector());\n reg(\"mattermost\", () => createMattermostConnector());\n\n if (registry === pluginRegistry) _connectorsRegistered = true;\n}\n\n/**\n * Get a connector by name, calling its target's factory to produce a fresh\n * instance. Ensures the built-ins are registered first (cheap, idempotent).\n * @param name - Connector key (e.g. `\"postgres\"`).\n * @returns A fresh `Connector` instance.\n * @throws {Error} when no connector is registered under `name`.\n * @docLink packages/connectors/api-reference#get-connector\n */\nexport function getConnector(name: string): Connector {\n ensureBuiltinsRegistered();\n const target = pluginRegistry.get(\"connector\", name);\n if (!target) {\n const available = pluginRegistry\n .list(\"connector\")\n .map((m) => m.id)\n .join(\", \");\n throw new Error(`Unknown connector: \"${name}\". Available: ${available || \"none\"}`);\n }\n return target.create({}, {});\n}\n\n/**\n * Get a connector by name, or return `undefined` if not registered. Ensures the\n * built-ins are registered first (cheap, idempotent).\n * @param name - Connector key.\n * @returns A fresh `Connector` instance or `undefined`.\n * @docLink packages/connectors/api-reference#try-get-connector\n */\nexport function tryGetConnector(name: string): Connector | undefined {\n ensureBuiltinsRegistered();\n return pluginRegistry.get(\"connector\", name)?.create({}, {});\n}\n\n/**\n * Return the names of all currently registered connectors. Ensures the built-ins\n * are registered first (cheap, idempotent).\n * @returns Array of connector keys.\n * @docLink packages/connectors/api-reference#list-connectors\n */\nexport function listConnectors(): string[] {\n ensureBuiltinsRegistered();\n return pluginRegistry.list(\"connector\").map((m) => m.id);\n}\n\n/**\n * Lazily register the built-ins unless they have already been registered.\n *\n * Production registers them eagerly at startup (`serve.ts`, connector-manager);\n * this is the cheap safety net for callers / tests that look a connector up\n * before that startup hook runs. Gating on the `_connectorsRegistered` flag\n * (not registry emptiness) keeps built-ins available even when a third-party\n * connector plugin registered first — an empty-check would skip the built-ins\n * entirely and make `getConnector(\"git\")` fail. `registerBuiltinConnectors`\n * skips ids already present, so a pre-seeded fake is never clobbered.\n */\nfunction ensureBuiltinsRegistered(): void {\n if (!_connectorsRegistered) {\n registerBuiltinConnectors();\n }\n}\n","/**\n * Connector adapter infrastructure types.\n *\n * Connectors are external backends (databases, KV stores, object stores,\n * in-process state, git repos, etc.). A connector exposes up to two faces: a\n * `ToolFace` (agents access it through injected tools) and/or a\n * `FilesystemFace` (the connector projects content into a mounted directory).\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 SyncOptions,\n SyncResult,\n WatchHandle,\n WatchOptions,\n} from \"./shared-types.js\";\n\nexport type { OperationDescriptor } from \"./shared-types.js\";\n\nimport type { Logger } from \"@skaile/workspaces/types\";\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 /**\n * Human-readable connection name, projected from the materialized CONNECTOR.md\n * frontmatter `label`. The platform resource-explorer tab renders this over the\n * driver name when present; absent for connectors with no configured name.\n */\n label?: 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 * Backend provider link id for `auth: \"backend\"` connectors. The runner's\n * token-refresh mediator passes this as the `host.refresh_credential` `id` so\n * the platform resolves the credential against the right provider link.\n */\n providerLinkId?: string;\n /**\n * Operating mode for connectors that manage a working copy. Orthogonal to\n * faces. `agent` = the agent drives the source natively (e.g. native git) and\n * the connector only provisions short-lived credentials. `sync` = the\n * connector owns the working copy (clone + watch + auto-commit/pull). Absent =\n * the driver's legacy `options.{session,sync,lifecycle}` blocks decide.\n */\n mode?: \"agent\" | \"sync\";\n /** Driver-specific configuration. */\n options?: Record<string, unknown>;\n /**\n * Owner-authored instruction text projected from the materialized\n * CONNECTOR.md body (preset custom instructions). Injected eagerly into the\n * agent system prompt. Absent when the body is empty.\n */\n instructions?: string;\n /** Filesystem-face config — only meaningful for mountable connectors. */\n mount?: {\n /** Source URL or path (repo URL, bucket name, host path). */\n source: string;\n /** Override mount target directory (default: `.mounts/<id>/`). */\n target?: string;\n /** Watch flag: omitted → watch read-write, skip read-only. */\n watch?: boolean;\n /** Expert-only: expose the resolved credential to the agent CLI. */\n exposeAccessToken?: boolean;\n /** Optional access-token TTL override (seconds). */\n accessTokenTTL?: number;\n };\n}\n\n// ── Connector handle (returned by adapter.connect) ───────────────────────────\n\n/**\n * Live state of a connected backend, returned by `Connector.connect()` (or the\n * legacy `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 /** Lifecycle status. Set by every `Connector`. */\n status: \"connecting\" | \"connected\" | \"error\" | \"disconnected\";\n /** Present iff the connector has a filesystem face and is mounted. */\n mountPath?: string;\n /** Adapter-specific state (connection pool, client, etc.). Opaque to callers. */\n state: unknown;\n}\n\n/** Optional capability a filesystem-face connector attaches to its handle state\n * when reads need an authoritative remote byte size rather than trusting local\n * filesystem metadata.\n */\nexport interface AuthoritativeSizeProvider {\n authoritativeSize(relPath: string): Promise<number | null>;\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\" | \"conflict\";\n /** What caused the change. */\n source: \"filesystem\" | \"operation\" | \"remote\" | \"sync\";\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 /** Human-readable connection name; the resource-explorer tab renders this over `id`/`driver` when present. */\n label?: 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// ── 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 mountable connectors use to acquire a fresh access token\n * from 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 * Connectors 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 connectorId: string;\n reason: \"initial\" | \"refresh\" | \"retry-401\";\n /**\n * Connector driver, used by the runner mediator to pick the platform refresh\n * `kind`; absent on `initial` and for legacy callers.\n */\n driver?: string;\n /**\n * Backend provider link id — the `id` the platform `host.refresh_credential`\n * capability resolves the credential against. Absent on `initial` and for\n * legacy callers.\n */\n providerLinkId?: string;\n}) => Promise<TokenMediatorResult>;\n\n// ── Unified connector types ───────────────────────────────────────────────────\n\n/**\n * Context passed to `Connector.connect()` by `ConnectorManager`.\n * @docLink packages/connectors/concepts#connect-context\n */\nexport interface ConnectContext {\n /** Secret provider for resolving credential references. */\n secrets?: SecretProvider;\n /**\n * Backend token mediator — present for `auth: backend` connectors of either\n * face (filesystem or tool), so mount refresh and tool-face OAuth flows share\n * one path.\n */\n tokenMediator?: TokenMediator;\n /**\n * Absolute directory the manager allocated for the filesystem face.\n * Present iff `connector.filesystem != null`. The connector projects its\n * content here during `connect()` and sets `handle.mountPath`.\n */\n mountTarget?: string;\n /** Resolved credential/config fields (from `describeFields()`). */\n resolvedFields?: Record<string, string>;\n /**\n * Aborted when the owning `ConnectorManager` is disposed. Long-running\n * `connect()` implementations — notably background (deferred) filesystem\n * mounts — should observe this and bail out promptly so session cleanup\n * does not wait on a wedged remote.\n */\n abortSignal?: AbortSignal;\n}\n\n/**\n * Filesystem face — present ⇒ the connector is \"mountable\".\n * @docLink packages/connectors/concepts#filesystem-face\n */\nexport interface FilesystemFace {\n /** Pull latest remote state into the mounted directory. */\n sync(handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult>;\n}\n\n/**\n * Tool face — present ⇒ the connector exposes agent tools.\n * @docLink packages/connectors/concepts#tool-face\n */\nexport interface ToolFace {\n read?(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null>;\n write?(handle: ConnectorHandle, path: string, content: ConnectorContent): Promise<void>;\n delete?(handle: ConnectorHandle, path: string): Promise<boolean>;\n list?(handle: ConnectorHandle, path?: string, options?: ListOptions): Promise<ConnectorEntry[]>;\n search?(handle: ConnectorHandle, query: string, options?: SearchOptions): Promise<SearchResult[]>;\n describeOperations(handle: ConnectorHandle): OperationDescriptor[];\n executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string>;\n describeSkill?(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor;\n}\n\n/**\n * The unified connector contract. A connector should expose at least one face\n * (`filesystem` and/or `tools`); `ConnectorManager` rejects a faceless\n * connector at connect time.\n * @docLink packages/connectors/concepts#connector\n */\nexport interface Connector {\n readonly name: string;\n connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle>;\n disconnect(handle: ConnectorHandle): Promise<void>;\n readonly filesystem?: FilesystemFace;\n readonly tools?: ToolFace;\n describeFields?(): ConnectorFieldSpec[];\n setLogger?(logger: Logger): void;\n watch?(\n handle: ConnectorHandle,\n callback: (e: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle;\n onHibernate?(handle: ConnectorHandle): Promise<string | undefined>;\n onSessionClose?(handle: ConnectorHandle): Promise<string | undefined>;\n}\n\n/**\n * Factory used by the connector registry.\n * @docLink packages/connectors/api-reference#connector-factory\n */\nexport type ConnectorFactory = () => Connector;\n\n/**\n * Per-connector bulk-connect result returned by `ConnectorManager.connectAll()`.\n * @docLink packages/connectors/concepts#connector-startup-report\n */\nexport interface ConnectorStartupReport {\n results: Array<{\n id: string;\n connected: boolean;\n mountPath?: string;\n error?: string;\n access?: \"read-only\" | \"read-write\";\n }>;\n}\n\n/**\n * Thrown by `connectAll` when a read-write mountable connector fails and\n * `failOnReadWriteError` was set.\n * @docLink packages/connectors/concepts#connector-startup-error\n */\nexport class ConnectorStartupError extends Error {\n readonly report: ConnectorStartupReport;\n readonly failedReadWrite: ReadonlyArray<{ id: string; error: string }>;\n constructor(\n message: string,\n report: ConnectorStartupReport,\n failedReadWrite: ReadonlyArray<{ id: string; error: string }>,\n ) {\n super(message);\n this.name = \"ConnectorStartupError\";\n this.report = report;\n this.failedReadWrite = failedReadWrite;\n }\n}\n","/**\n * ConnectorManager — unified lifecycle & mount-target allocation.\n *\n * Manages the full lifecycle of every connector declared in `skaile.yaml`,\n * whether it exposes a `filesystem` face, a `tools` face, or both.\n *\n * @docLink packages/connectors/concepts#connector-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 { pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { TelemetryProvider, Trace } from \"@skaile/workspaces/telemetry\";\nimport type { ConnectorStatusEvent, Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { tryGetConnector } from \"./connector-registry.js\";\nimport type {\n ConnectContext,\n Connector,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n ConnectorStartupReport,\n RuntimeSkillDescriptor,\n TokenMediator,\n ToolFace,\n} from \"./connector-types.js\";\nimport { ConnectorFieldMissingError, ConnectorStartupError } from \"./connector-types.js\";\nimport type { FleetHealthVerdict } from \"./fleet-utils.js\";\nimport type { PreMintedSecretProvider, SecretProvider, SecretProviderChain } from \"./secrets.js\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n SyncOptions,\n SyncResult,\n WatchHandle,\n WatchOptions,\n} from \"./shared-types.js\";\n\n// ── Internal state ────────────────────────────────────────────────────────────\n\n/**\n * Internal per-connector tracking record.\n */\ninterface ActiveConnector {\n connector: Connector;\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\nexport interface SyncConnectorResult {\n id: string;\n ok: boolean;\n error?: 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\n/**\n * True when `child` is strictly nested under `parent` (not equal). Both paths\n * must already be absolute and normalized (as `resolveMountTarget` returns).\n */\nfunction isStrictlyNested(child: string, parent: string): boolean {\n return child.startsWith(`${parent}/`);\n}\n\n/**\n * Resolve all declared fields for a connector through the secret chain.\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\n/**\n * Build a default `RuntimeSkillDescriptor` for a connector that does not implement `describeSkill()`.\n */\nfunction buildDefaultSkillDescriptor(\n connector: Connector,\n declaration: ConnectorDeclaration,\n handle: ConnectorHandle,\n): RuntimeSkillDescriptor {\n const ops = connector.tools?.describeOperations(handle) ?? [];\n return {\n id: declaration.id,\n name: `${connector.name} — ${declaration.id}`,\n description: `${connector.name} connector (${declaration.id})`,\n category: connector.name,\n access: declaration.access,\n toolNames: ops.map((o) => o.name),\n };\n}\n\n/**\n * Render a skill body string from a descriptor and operation list.\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 the unified `ConnectorManager`. Pass as the second argument to the constructor.\n *\n * Note: constructor signature is `new ConnectorManager(workspaceDir, opts?)` —\n * `workspaceDir` comes first because mountable connectors need it.\n * `secrets` moves into opts (was the first arg in the old `ConnectorManager`).\n */\nexport interface ConnectorManagerOptions {\n /**\n * Secret provider (chain or bare) for resolving credential references in\n * `describeFields()` and for passing to `Connector.connect()`.\n */\n secrets?: SecretProviderChain | SecretProvider;\n\n /**\n * Catalog entries for dynamic connector resolution (registry-first, catalog-fallback).\n */\n catalogEntries?: CatalogEntry[];\n\n /**\n * Backend token mediator — present for `auth: backend` filesystem-face connectors.\n * Wrapped with pre-minted secrets when `preMintedSecrets` is also set.\n */\n tokenMediator?: TokenMediator;\n\n /**\n * Pre-minted credential store from `session_init`. When set, `auth: backend`\n * connectors use this for the initial mint without a platform round-trip.\n */\n preMintedSecrets?: PreMintedSecretProvider;\n\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\n /** Optional active trace to attach connector spans to. */\n trace?: Trace;\n\n /** Deprecated no-op option kept so older callers can pass it during migration. */\n placeholderBarrier?: unknown;\n\n /** Deprecated no-op option kept so older callers can pass it during migration. */\n fleetHealthPollMs?: number;\n\n /** Deprecated no-op option kept so older callers can pass it during migration. */\n fleetMountRecoveryProbe?: (target: string) => Promise<boolean>;\n}\n\n// ── Manager ───────────────────────────────────────────────────────────────────\n\n/**\n * `ConnectorManager` — manages the full lifecycle of all connectors declared\n * in `skaile.yaml`, whether they expose a filesystem face, a tool face, or both.\n *\n * For filesystem-face connectors, the manager allocates a mount-target\n * directory and passes it as `ctx.mountTarget`; the connector mounts its\n * content there during `connect()`.\n *\n * @docLink packages/connectors/concepts#connector-manager\n */\nexport class ConnectorManager {\n private active = new Map<string, ActiveConnector>();\n // Allocated absolute mount target → owning connector id; collisions rejected at setup, released on disconnect.\n private readonly mountTargets = new Map<string, string>();\n readonly workspaceDir: string;\n private readonly chain?: SecretProviderChain;\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 /** Aborted on dispose; threaded into every `connect()` via `ctx.abortSignal`. */\n private readonly disposeController = new AbortController();\n\n /**\n * @param workspaceDir - Absolute (or relative) working directory. Filesystem-face\n * connectors mount into `<workspaceDir>/.mounts/<id>/` by default.\n * @param opts - Optional configuration: secrets, catalogEntries, tokenMediator,\n * preMintedSecrets, onStatusChange, telemetry, trace.\n */\n constructor(\n workspaceDir: string,\n private readonly opts: ConnectorManagerOptions = {},\n ) {\n this.workspaceDir = resolve(workspaceDir);\n this.catalogEntries = opts.catalogEntries ?? [];\n this.tokenMediator = opts.tokenMediator;\n this.preMintedSecrets = opts.preMintedSecrets;\n\n // Accept SecretProviderChain (has `prepareRef`) or bare SecretProvider\n const secrets = opts.secrets;\n if (secrets && typeof secrets === \"object\" && \"prepareRef\" in secrets) {\n this.chain = secrets as SecretProviderChain;\n } else {\n this.secrets = secrets as SecretProvider | undefined;\n }\n\n this.mgrLog = createLogger({\n kind: \"connector\",\n subkind: \"manager\",\n instance: this.workspaceDir,\n });\n }\n\n // ── Private helpers ──────────────────────────────────────────────────────────\n\n /**\n * Wrap the user-supplied `TokenMediator` so `reason: 'initial'` calls for an\n * `auth: backend` connector first consult the pre-minted credentials. Falls\n * back to the original mediator for refresh / retry-401 paths. On that\n * fall-through it attaches the connector's `driver` + `providerLinkId` taken\n * from the `declaration` (authoritative routing — a connector cannot override\n * them per call) so the runner mediator can pick the platform refresh `kind`\n * and `id`.\n *\n * Namespace fallback: when no `connector:<id>` pre-mint entry exists, the\n * lookup retries under the legacy `mount:<id>` key. This is a defence-in-depth\n * companion to the platform-side pre-mint namespace alignment — see the\n * 2026-05-19 incident notes and `_devlog/specs/2026-05-07-unified-credential-mediation.md`.\n * When the fallback fires, a `warn` log signals that the platform writer is\n * filing credentials under the pre-unified namespace key.\n */\n private buildWrappedMediator(declaration: ConnectorDeclaration): TokenMediator | undefined {\n const original = this.tokenMediator;\n const preMinted = this.preMintedSecrets;\n const driver = declaration.driver;\n // The runner mediator refreshes against the backend provider link, not the\n // connector id. Prefer the top-level field; fall back to options for wire\n // shapes that nest it there.\n const optionsLink = declaration.options?.providerLinkId;\n const providerLinkId =\n declaration.providerLinkId ?? (typeof optionsLink === \"string\" ? optionsLink : undefined);\n if (!preMinted) return original;\n\n return async ({ connectorId, reason }) => {\n if (reason === \"initial\") {\n let mint = preMinted.mintFor(\"connector\", connectorId);\n if (!mint) {\n const fallback = preMinted.mintFor(\"mount\", connectorId);\n if (fallback) {\n mint = fallback;\n this.mgrLog.warn(\"connector credential resolved via mount-namespace fallback\", {\n connectorId,\n });\n }\n }\n if (mint?.ok) {\n this.mgrLog.debug(\"initial token served from pre-mint\", { connectorId });\n return { ok: true, token: mint.token, expiresAt: mint.expiresAt };\n }\n // Pre-mint exists but failed at the platform mediator — surface the real reason.\n if (mint && !mint.ok) {\n return {\n ok: false,\n code: mint.code ?? \"not-configured\",\n message:\n mint.message ??\n `Connector '${connectorId}' pre-mint failed at the backend mediator (no detail provided).`,\n };\n }\n // No pre-mint entry: fall through to the original mediator.\n }\n if (!original) {\n return {\n ok: false,\n code: \"not-configured\",\n message:\n `Connector '${connectorId}' requested ${reason} token but no pre-mint ` +\n `is available and no runner-side mediator is wired.`,\n };\n }\n return original({ connectorId, reason, driver, providerLinkId });\n };\n }\n\n /**\n * Resolve a connector by driver name: registry first, then catalog.\n */\n private async resolveConnector(driver: string): Promise<Connector> {\n // 1. Check the connector registry.\n const registered = tryGetConnector(driver);\n if (registered) return registered;\n\n // 2. Catalog lookup — for third-party / project-local connectors that have\n // not been published to the registry.\n const entry = this.catalogEntries.find((e) => e.kind === \"connector\" && e.name === driver);\n if (!entry) {\n throw new Error(\n `Unknown connector: \"${driver}\". ` +\n `Run 'skaile search connector' to see available connectors.`,\n );\n }\n\n // 3. Dynamic import from source path (dev-only; does not work in compiled binary)\n const entryPoint = (entry.metadata?.entry as string) ?? \"./connector.ts\";\n const connectorPath = resolve(dirname(entry.source), entryPoint);\n const mod = await import(connectorPath);\n if (typeof mod.createConnector !== \"function\") {\n throw new Error(\n `Connector \"${driver}\" at ${connectorPath} does not export createConnector()`,\n );\n }\n const connector: Connector = mod.createConnector();\n\n // Intentional singleton cache: register a ConnectorTarget whose factory\n // always returns the same resolved instance for catalog-resolved connectors\n // (ported from old ConnectorManager.resolveAdapter). The earlier\n // `tryGetConnector(driver)` returned undefined, so this id is unregistered\n // and the register cannot collide.\n if (!pluginRegistry.get(\"connector\", driver)) {\n pluginRegistry.register(\"connector\", {\n id: driver,\n displayName: driver,\n apiVersion: 1,\n configSchema: z.unknown(),\n create: () => connector,\n });\n }\n return connector;\n }\n\n /**\n * Compute the absolute mount-target directory for a filesystem-face connector.\n *\n * - `local` driver + absolute source + no explicit target → bind directly to source\n * - otherwise → `decl.mount.target ?? .mounts/<id>`, resolved relative to workspaceDir\n */\n private resolveMountTarget(declaration: ConnectorDeclaration): string {\n const mountConf = declaration.mount;\n if (\n declaration.driver === \"local\" &&\n !mountConf?.target &&\n mountConf?.source?.startsWith(\"/\")\n ) {\n return mountConf.source;\n }\n const mountPath = mountConf?.target ?? `.mounts/${declaration.id}`;\n return resolve(this.workspaceDir, mountPath);\n }\n\n // Record absPath → id: same-id is idempotent, an exact-equal collision throws\n // (naming both ids + the path) so a silent shadow fails at setup, nesting warns.\n private reserveMountTarget(id: string, absPath: string): void {\n const owner = this.mountTargets.get(absPath);\n if (owner === id) return;\n if (owner !== undefined) {\n throw new Error(\n `Mount target collision: connectors \"${owner}\" and \"${id}\" both resolve to ` +\n `\"${absPath}\". Each filesystem connector needs a distinct mount.target.`,\n );\n }\n for (const [otherPath, otherId] of this.mountTargets) {\n if (otherId === id) continue;\n if (isStrictlyNested(absPath, otherPath) || isStrictlyNested(otherPath, absPath)) {\n this.mgrLog.warn(\"nested mount target overlap between connectors\", {\n connectorId: id,\n otherConnectorId: otherId,\n target: absPath,\n otherTarget: otherPath,\n });\n }\n }\n this.mountTargets.set(absPath, id);\n }\n\n /** Release every mount target owned by `id` (on disconnect). */\n private releaseMountTarget(id: string): void {\n for (const [path, owner] of [...this.mountTargets]) {\n if (owner === id) this.mountTargets.delete(path);\n }\n }\n\n /**\n * Build a `ConnectContext` for a connector, resolving fields and — for\n * filesystem-face connectors — allocating the mount-target directory.\n */\n private async buildConnectContext(\n declaration: ConnectorDeclaration,\n connector: Connector,\n ): Promise<ConnectContext> {\n const ctx: ConnectContext = {\n secrets: this.chain ?? this.secrets,\n // Both filesystem and tool faces use this for the auth: backend initial-mint path.\n tokenMediator: this.buildWrappedMediator(declaration),\n abortSignal: this.disposeController.signal,\n };\n\n // Backend-auth connectors get their credential from the tokenMediator, not the\n // field chain — skip resolveFields so a required field (e.g. postgres dsn)\n // doesn't throw before connect() can consult the mediator.\n if (this.chain && connector.describeFields && declaration.auth !== \"backend\") {\n const fields = connector.describeFields();\n ctx.resolvedFields = await resolveFields(declaration, fields, this.chain);\n }\n\n // Filesystem face: allocate the mount target. Reserve it first so two\n // connectors resolving to the same path collide loudly here instead of\n // silently shadowing each other once both are mounted.\n if (connector.filesystem != null) {\n const absPath = this.resolveMountTarget(declaration);\n this.reserveMountTarget(declaration.id, absPath);\n if (!existsSync(absPath)) mkdirSync(absPath, { recursive: true });\n ctx.mountTarget = absPath;\n }\n\n return ctx;\n }\n\n /**\n * Span-wrapping helper for connector lifecycle calls.\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. For each connector:\n * 1. Resolves the `Connector` from the registry (or catalog).\n * 2. Calls `setLogger` when available.\n * 3. Resolves fields via `describeFields()` + secret chain.\n * 4. For filesystem-face connectors: allocates mount-target dir.\n * 5. Calls `connector.connect(decl, ctx)`.\n * 6. Tracks in the active map; emits `onStatusChange`.\n *\n * After the loop, if `options.failOnReadWriteError` is set and any read-write\n * connector with a `mount` config failed → throws `ConnectorStartupError`\n * (fail-fast lifecycle semantics for mountable connectors).\n *\n * @param declarations - Connector declarations from `skaile.yaml`.\n * @param options.failOnReadWriteError - Throw `ConnectorStartupError` if any\n * read-write connector fails. Read-only failures are always tolerated.\n * Only the eager set is considered — deferred mounts never throw.\n * @param options.deferMounts - Deprecated compatibility option. Cloud\n * connectors now require already-live host fleet bind mounts and connect\n * synchronously.\n */\n async connectAll(\n declarations: ConnectorDeclaration[],\n options?: { failOnReadWriteError?: boolean; deferMounts?: boolean },\n ): Promise<ConnectorStartupReport> {\n this.mgrLog.info(\"connectAll start\", { count: declarations.length });\n\n // Pre-flight: reserve each mount-bearing declaration's resolved target up\n // front so a duplicate-target misconfig throws here, before any connect\n // attempt swallows it into a per-connector result. Only `mount`-bearing\n // declarations can collide — the no-mount default (`.mounts/<id>`) is unique\n // per id — so the cheap guard avoids resolving every connector just to find\n // its target.\n for (const decl of declarations) {\n if (decl.mount != null) this.reserveMountTarget(decl.id, this.resolveMountTarget(decl));\n }\n\n const results: ConnectorStartupReport[\"results\"] = [];\n\n for (const decl of declarations) {\n results.push(await this.attemptConnect(decl));\n }\n\n const report: ConnectorStartupReport = { results };\n this.mgrLog.info(\"connectAll complete\", {\n connected: results.filter((r) => r.connected).length,\n failed: results.filter((r) => !r.connected).length,\n });\n\n // Throw if any read-write mountable connector (with a mount block) failed.\n // Tool-only connectors (no mount block) are never fail-fast — they are\n // reported in the results like any other failure (fail-fast behaviour for\n // read-write connectors only).\n if (options?.failOnReadWriteError) {\n const declById = new Map(declarations.map((d) => [d.id, d]));\n const failedRw = results\n .filter(\n (r) => !r.connected && r.access === \"read-write\" && declById.get(r.id)?.mount != null,\n )\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(\"connectAll failed: required read-write connector(s) failed\", undefined, {\n summary,\n });\n throw new ConnectorStartupError(\n `Required read-write connector(s) failed to connect: ${summary}`,\n report,\n failedRw,\n );\n }\n }\n\n return report;\n }\n\n /**\n * Connect a single declaration, emitting `connecting` → `connected | error`.\n * Never throws — failures are recorded in the returned result so `connectAll`\n * can keep going.\n */\n private async attemptConnect(\n decl: ConnectorDeclaration,\n preResolved?: Connector,\n ): Promise<ConnectorStartupReport[\"results\"][number]> {\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"connecting\",\n });\n\n try {\n const connector = preResolved ?? (await this.resolveConnector(decl.driver));\n const connectorLog = createLogger({\n kind: \"connector\",\n subkind: connector.name ?? decl.driver,\n instance: decl.id,\n });\n connector.setLogger?.(connectorLog);\n\n const ctx = await this.buildConnectContext(decl, connector);\n\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 () => connector.connect(decl, ctx),\n );\n\n this.active.set(decl.id, {\n connector,\n handle,\n declaration: decl,\n });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"connected\",\n });\n return {\n id: decl.id,\n connected: 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(\"connect failed\", err, { id: decl.id, driver: decl.driver });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"error\",\n error: msg,\n });\n return {\n id: decl.id,\n connected: false,\n error: msg,\n access: decl.access,\n };\n }\n }\n\n /**\n * Compatibility no-op for the removed in-container fleet health gate. Host\n * fleet-managed cloud mounts are verified at connect time by their drivers.\n */\n async reportFleetHealth(_connectorId: string, _verdict: FleetHealthVerdict): Promise<void> {}\n\n /**\n * Compatibility no-op for the removed deferred rclone mount path.\n */\n async whenDeferredMountsSettled(): Promise<void> {}\n\n /** Disconnect all connectors and stop all watchers. Best-effort — ignores disconnect errors. */\n async disconnectAll(): Promise<void> {\n this.mgrLog.info(\"disconnectAll start\", { count: this.active.size });\n this.disposeController.abort();\n await this.unwatchAll();\n for (const [id, entry] of this.active) {\n try {\n await entry.connector.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.active.clear();\n this.mountTargets.clear();\n this.mgrLog.info(\"disconnectAll complete\");\n }\n\n // ── Hot-plug ──────────────────────────────────────────────────────────────────\n\n /**\n * Connect a single connector (hot-plug). Resolves fields and allocates\n * mount target if the connector has a filesystem face.\n *\n * @returns The `ConnectorHandle` for subsequent operations.\n */\n async connect(declaration: ConnectorDeclaration): Promise<ConnectorHandle> {\n // Emit \"connecting\" before attempting\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: declaration.id,\n status: \"connecting\",\n });\n\n const connector = await this.resolveConnector(declaration.driver);\n const connectorLog = createLogger({\n kind: \"connector\",\n subkind: connector.name ?? declaration.driver,\n instance: declaration.id,\n });\n connector.setLogger?.(connectorLog);\n\n const ctx = await this.buildConnectContext(declaration, connector);\n\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 () => connector.connect(declaration, ctx),\n );\n this.active.set(declaration.id, { connector, 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 // connect() failed after buildConnectContext reserved the target but before\n // the connector entered `active`, so disconnect() can't reach it — release\n // here or the path stays blocked for other ids until disconnectAll().\n this.releaseMountTarget(declaration.id);\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 and stop its watcher.\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\n }\n }\n await this.withSpan(\n \"connector.disconnect\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"disconnect\",\n },\n async () => {\n try {\n await entry.connector.disconnect(entry.handle);\n } finally {\n this.active.delete(id);\n this.releaseMountTarget(id);\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: id,\n status: \"disconnected\",\n });\n }\n },\n );\n }\n\n // ── Watch ─────────────────────────────────────────────────────────────────────\n\n /**\n * Start watchers for all connected connectors that expose a `watch()` method.\n * For filesystem-face connectors, nested-mount-path exclusion logic is applied.\n */\n watchAll(\n callback: (connectorId: string, event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): void {\n // Collect all mount paths for nested-path exclusion\n const allMountPaths = [...this.active.values()]\n .map((e) => e.handle.mountPath)\n .filter((p): p is string => p != null);\n\n for (const [id, entry] of this.active) {\n if (!entry.connector.watch) continue;\n\n // Respect explicit watch flag; default: watch read-write, skip read-only.\n // For tool-only connectors (no mount block) this evaluates to\n // `access !== \"read-only\"`.\n const shouldWatch =\n entry.declaration.mount?.watch ?? entry.declaration.access !== \"read-only\";\n if (!shouldWatch) continue;\n\n // For filesystem connectors: build per-connector ignore list excluding\n // mount paths of other connectors nested inside this one.\n let mergedOptions = options;\n const myPath = entry.handle.mountPath;\n if (myPath) {\n const nestedPaths = allMountPaths\n .filter((p) => p !== myPath && p.startsWith(`${myPath}/`))\n .map((p) => `${p}/**`);\n if (nestedPaths.length > 0) {\n mergedOptions = {\n ...options,\n ignored: [...(options?.ignored ?? []), ...nestedPaths],\n };\n }\n }\n\n try {\n entry.watchHandle = entry.connector.watch(\n entry.handle,\n (event) => callback(id, event),\n mergedOptions,\n );\n } catch {\n // Best-effort — connector 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.active) {\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.active) {\n // A deferred mount that never finished connecting (still \"connecting\", or\n // \"error\") has a provisional handle (empty state); there's nothing to\n // hibernate/close, and running the hook would claim a flush that never\n // happened. Mirror the syncAll guard (skip anything not \"connected\").\n if (entry.handle.status !== \"connected\") {\n results.push({ id, ok: true });\n continue;\n }\n const fn = entry.connector[hook];\n if (!fn) {\n results.push({ id, ok: true });\n continue;\n }\n try {\n const detail = await fn.call(entry.connector, 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 return results;\n }\n\n // ── Discovery ─────────────────────────────────────────────────────────────────\n\n /**\n * Return the internal `ActiveConnector` entry.\n *\n * @throws {Error} if the connector is not found\n */\n get(id: string): ActiveConnector {\n const entry = this.active.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.active.has(id);\n }\n\n /**\n * Return summary info for all currently connected connectors.\n */\n listConnectors(): Array<{\n id: string;\n driver: string;\n label?: string;\n access: \"read-only\" | \"read-write\";\n mountPath?: string;\n status: ConnectorHandle[\"status\"];\n }> {\n return [...this.active.entries()].map(([id, entry]) => ({\n id,\n driver: entry.connector.name,\n label: entry.declaration.label,\n access: entry.declaration.access,\n mountPath: entry.handle.mountPath,\n // Surfaced so wire projections (splitConnectorsForWire) can distinguish a\n // still-connecting deferred mount from a fully-mounted one.\n status: entry.handle.status,\n }));\n }\n\n /**\n * Lists git-backed connectors, surfacing the fields prompt-builders and the\n * runner's wake-mid-401 refresh handler need.\n */\n listGitConnectors(): Array<{\n id: string;\n source: string;\n exposeAccessToken: boolean;\n auth?: string;\n }> {\n const out: Array<{ id: string; source: string; exposeAccessToken: boolean; auth?: string }> =\n [];\n for (const [, entry] of this.active) {\n if (entry.connector.name !== \"git\") continue;\n const mountConf = entry.declaration.mount;\n out.push({\n id: entry.declaration.id,\n source: mountConf?.source ?? \"\",\n exposeAccessToken: mountConf?.exposeAccessToken === true,\n auth: entry.declaration.auth,\n });\n }\n return out;\n }\n\n // ── Sync ──────────────────────────────────────────────────────────────────────\n\n /**\n * Pull the latest remote state for a single filesystem-face connector.\n *\n * @throws {Error} if connector is not found or has no filesystem face.\n */\n async sync(id: string, options?: SyncOptions): Promise<SyncResult> {\n const entry = this.get(id);\n if (!entry.connector.filesystem) {\n throw new Error(`Connector \"${id}\" has no filesystem face`);\n }\n return entry.connector.filesystem.sync(entry.handle, options);\n }\n\n /**\n * Pull the latest remote state for all connected filesystem-face connectors.\n * Errors from individual connectors are captured and returned rather than thrown.\n */\n async syncAll(options?: SyncOptions): Promise<SyncConnectorResult[]> {\n const results: SyncConnectorResult[] = [];\n for (const [id, entry] of this.active) {\n if (!entry.connector.filesystem) continue;\n if (entry.handle.status !== \"connected\") continue;\n try {\n await entry.connector.filesystem.sync(entry.handle, options);\n results.push({ id, ok: true });\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 // ── Base CRUD dispatch ────────────────────────────────────────────────────────\n\n /**\n * Throw a consistent error when the tools face is absent.\n */\n private requireToolFace(id: string, entry: ActiveConnector): ToolFace {\n if (!entry.connector.tools) {\n throw new Error(`Connector \"${id}\" has no tool face`);\n }\n return entry.connector.tools;\n }\n\n async read(id: string, path: string): Promise<ConnectorContent | null> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n if (!tools.read) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"read\"`);\n }\n return this.withSpan(\n \"connector.read\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"read\",\n },\n () => tools.read!(entry.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 const tools = this.requireToolFace(id, entry);\n if (!tools.write) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"write\"`);\n }\n return this.withSpan(\n \"connector.write\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"write\",\n },\n () => tools.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 const tools = this.requireToolFace(id, entry);\n if (!tools.delete) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"delete\"`);\n }\n return this.withSpan(\n \"connector.delete\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"delete\",\n },\n () => tools.delete!(entry.handle, path),\n );\n }\n\n async list(id: string, path?: string, options?: ListOptions): Promise<ConnectorEntry[]> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n if (!tools.list) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"list\"`);\n }\n return this.withSpan(\n \"connector.list\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"list\",\n },\n () => tools.list!(entry.handle, path, options),\n );\n }\n\n async search(id: string, query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n if (!tools.search) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"search\"`);\n }\n return this.withSpan(\n \"connector.search\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"search\",\n },\n () => tools.search!(entry.handle, query, options),\n );\n }\n\n // ── Custom operations ─────────────────────────────────────────────────────────\n\n /**\n * Execute a custom operation on a connector's tool face.\n *\n * @throws {Error} if connector has no tool face, operation is unknown, or\n * a write operation is called on a read-only connector.\n */\n async executeOp(id: string, operation: string, args: Record<string, unknown>): Promise<string> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n\n const ops = tools.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.connector.name,\n \"skaile.connector.operation\": operation,\n },\n () => tools.executeOp(entry.handle, operation, args),\n );\n }\n\n /**\n * Return the list of operations that a connector's tool face exposes.\n * Returns an empty array when the connector has no tool face.\n */\n getOperations(id: string): OperationDescriptor[] {\n const entry = this.get(id);\n return entry.connector.tools?.describeOperations(entry.handle) ?? [];\n }\n\n // ── Skill catalog ─────────────────────────────────────────────────────────────\n\n /**\n * Return `RuntimeSkillDescriptor` for every connected connector.\n * Uses `tools.describeSkill()` when available; falls back to `buildDefaultSkillDescriptor`.\n */\n listSkills(): RuntimeSkillDescriptor[] {\n return [...this.active.values()].map(({ connector, handle, declaration }) => {\n const describeSkill = connector.tools?.describeSkill;\n return describeSkill\n ? describeSkill.call(connector.tools, handle, declaration)\n : buildDefaultSkillDescriptor(connector, 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 (default), CLI-style commands are used;\n * false renders SDK tool-call style.\n * @throws {Error} if the connector is not found.\n */\n loadSkill(id: string, shellAccess = true): string {\n const entry = this.get(id);\n const { connector, handle, declaration } = entry;\n const describeSkill = connector.tools?.describeSkill;\n const descriptor = describeSkill\n ? describeSkill.call(connector.tools, handle, declaration)\n : buildDefaultSkillDescriptor(connector, declaration, handle);\n const ops = connector.tools?.describeOperations(handle) ?? [];\n return buildSkillBody(descriptor, ops, shellAccess);\n }\n}\n","/**\n * Merged prompt/tool-delivery module for the unified ConnectorManager.\n *\n * Combines the responsibilities of:\n * - `mount-prompt.ts` — build a system-prompt section for filesystem-face connectors\n * - `connector-tools.ts` — build an SDK MCP server + system-prompt section for tool-face connectors\n *\n * Two exports:\n * 1. `buildConnectorPromptSection(manager, options?)` — markdown string for the\n * agent's system prompt. Iterates the unified manager's connectors and:\n * - if `connector.filesystem` is present → emits a Mounts table row (ported from mount-prompt.ts)\n * - if `connector.tools` is present → emits a Connectors list entry (ported from connector-tools.ts)\n * - dual-face connectors emit BOTH\n *\n * 2. `buildSdkConnectorTools(manager, options?)` — in-process MCP server config for\n * the Claude Agent SDK. Only tool-face connectors are wired to tools; filesystem-only\n * connectors are silently excluded.\n *\n * @docLink packages/connectors/concepts#connector-prompt\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`.\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 /** 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 * Only connectors with a `tools` face are wired; filesystem-only connectors are excluded.\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 *\n * @param manager - Connected unified `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<object | 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 (tool-face connectors only) ──\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 all connectors for the agent's system prompt.\n *\n * Iterates the unified `ConnectorManager` and, per connector:\n * - **Filesystem face** (`connector.filesystem != null`) → emits a row in the\n * `## Mounts` table (id, driver, mount path, access level), plus Tier-1/Tier-2\n * git auth guidance for `git` connectors (ported from `mount-prompt.ts`).\n * - **Tool face** (`connector.tools != null`) → emits an entry in the\n * `## Connectors` section (ported from `connector-tools.ts`).\n * - Dual-face connectors appear in BOTH sections.\n *\n * @param manager - Connected unified `ConnectorManager`.\n * @param options - Optional shell access flag.\n * @returns Markdown string to append to the system prompt, or empty string when\n * no connectors are connected.\n * @docLink packages/connectors/api-reference#build-connector-prompt-section\n */\nexport function buildConnectorPromptSection(\n manager: ConnectorManager,\n options?: ConnectorPromptOptions,\n): string {\n const shellAccess = options?.shellAccess ?? true;\n const allConnectors = manager.listConnectors();\n if (allConnectors.length === 0) return \"\";\n\n const sections: string[] = [];\n\n // ── Resolve each connector's faces in a single pass (I-2) ───────────────────\n // Each connector is looked up once; the result is shared by both the filesystem\n // section and the tool section below. A connector with neither face is silently\n // omitted — in the unified Connector model every connector is expected to have\n // at least one face (filesystem or tools). A face-less connector is a\n // misconfiguration, not a normal state, so excluding it from the prompt is\n // correct-by-design (unified-model invariant: every connector has ≥1 face).\n const faces = allConnectors.map((c) => {\n try {\n const e = manager.get(c.id);\n return { c, fs: e.connector.filesystem != null, tools: e.connector.tools != null };\n } catch {\n return { c, fs: false, tools: false };\n }\n });\n\n const fsConnectors = faces.filter((f) => f.fs).map((f) => f.c);\n const toolConnectors = faces.filter((f) => f.tools).map((f) => f.c);\n\n // ── Filesystem-face section (ported from mount-prompt.ts) ────────────────────\n\n if (fsConnectors.length > 0) {\n sections.push(buildFilesystemSection(manager, fsConnectors));\n }\n\n // ── Tool-face section (ported from connector-tools.ts) ───────────────────────\n\n if (toolConnectors.length > 0) {\n sections.push(buildToolSection(manager, toolConnectors, shellAccess));\n }\n\n return sections.join(\"\\n\\n\");\n}\n\n// ── System prompt section helpers ─────────────────────────────────────────────\n\n/** Connector descriptors as returned by `ConnectorManager.listConnectors()`. */\ntype ConnectorEntry = ReturnType<ConnectorManager[\"listConnectors\"]>[number];\n\n/**\n * Build the `## Mounts` filesystem-face section: the mount table, the\n * unavailable-mounts note, and the Tier-1/Tier-2 git auth notes.\n */\nfunction buildFilesystemSection(manager: ConnectorManager, fsConnectors: ConnectorEntry[]): string {\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\n // A mount whose status is not \"connected\" is a deferred remote mount that is\n // still syncing (or failed) — its target is held read-only so the agent\n // cannot write a phantom workspace into it. Surface that instead of a normal\n // writable row; the platform flips it on the connected status event.\n let anyUnavailable = false;\n for (const c of fsConnectors) {\n const mountPath = c.mountPath ?? \"(unmounted)\";\n if (c.status === \"connected\") {\n lines.push(`| ${c.id} | ${c.driver} | \\`${mountPath}/\\` | ${c.access} |`);\n } else {\n anyUnavailable = true;\n const state = c.status === \"error\" ? \"failed\" : \"syncing\";\n lines.push(\n `| ${c.id} | ${c.driver} | \\`${mountPath}/\\` | unavailable (${state}) — read-only, do not write |`,\n );\n }\n }\n\n if (anyUnavailable) {\n lines.push(\"\");\n lines.push(\n \"> **Unavailable mounts are read-only at the filesystem layer.** A mount marked \" +\n \"`unavailable (syncing / failed)` is not live yet — its directory is mounted read-only, \" +\n \"so writes fail. Do not create files there: the contents are not the real workspace, and \" +\n \"anything you write would be a phantom that diverges from the remote once it mounts. Wait \" +\n \"for it to become writable (watch the connector status).\",\n );\n }\n\n appendGitAuthNotes(lines, manager, fsConnectors);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Append the Tier-2 / Tier-1 git auth notes (spec: 2026-05-05-git-credential-tiers).\n * Intersect listGitConnectors() with the filesystem-face set so the note\n * and the mount table stay coherent: a git connector with only a tools face\n * (no filesystem face) is absent from the table and must not drive a note\n * inside ## Mounts. listGitConnectors() does NOT filter by face — it returns\n * all connected git-driver connectors regardless of which faces they expose.\n */\nfunction appendGitAuthNotes(\n lines: string[],\n manager: ConnectorManager,\n fsConnectors: ConnectorEntry[],\n): void {\n const fsConnectorIds = new Set(fsConnectors.map((c) => c.id));\n const gitConnectors = manager.listGitConnectors().filter((g) => fsConnectorIds.has(g.id));\n if (gitConnectors.length === 0) return;\n\n const tier2 = gitConnectors.filter((m) => m.exposeAccessToken === true);\n const tier1 = gitConnectors.filter((m) => m.exposeAccessToken !== true);\n\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/** Build the `## Connectors` tool-face section. */\nfunction buildToolSection(\n manager: ConnectorManager,\n toolConnectors: ConnectorEntry[],\n shellAccess: boolean,\n): string {\n const lines: string[] = [\"## Connectors\", \"\"];\n\n lines.push(\"Currently registered connectors (id — driver, access):\");\n for (const r of toolConnectors) {\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 // Eager preset instructions — one block per connector that has a body.\n for (const r of toolConnectors) {\n let instructions: string | undefined;\n try {\n instructions = manager.get(r.id).declaration.instructions;\n } catch {\n // connector no longer active — skip\n }\n if (instructions && instructions.trim().length > 0) {\n lines.push(`Guidance for \\`${r.id}\\`:`);\n lines.push(instructions.trim());\n lines.push(\"\");\n }\n }\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// ── Private helpers ───────────────────────────────────────────────────────────\n\nfunction safeHost(source: string): string {\n try {\n return new URL(source).host;\n } catch {\n return source;\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 the file is empty/missing OR age > triggerAgeSec, touch the\n * refresh-flag file. The runner watches this path via `fs.watch` and mints\n * a fresh access token + rewrites the credentials file when it sees the\n * change. Emptiness is its own trigger because a freshly truncated file\n * has a *recent* mtime, so the age check alone can never heal it.\n * 3. Poll the credentials file in 200ms increments until its mtime advances,\n * or it becomes non-empty (when it started empty), or waitTimeoutMs\n * 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 empty or 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# 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\n# Emptiness is its own trigger: a truncated file has a recent mtime, so the age\n# check alone would leave it empty forever.\nstarted_empty=0\n[ -s \"$CRED_FILE\" ] || started_empty=1\n\nif [ \"$started_empty\" -eq 1 ] || [ \"$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. Resolve which\n # once, up front, rather than probing PATH on every iteration.\n if command -v usleep >/dev/null 2>&1; then\n have_usleep=1\n else\n have_usleep=0\n fi\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 # A same-second rewrite doesn't advance the second-resolution mtime, so an\n # empty file that gained content must break on content, not on mtime.\n if [ \"$started_empty\" -eq 1 ] && [ -s \"$CRED_FILE\" ]; then\n break\n fi\n if [ \"$have_usleep\" -eq 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. The token (pass) was\n# percent-encoded at write time (buildCredentialLine), so any literal '@' in it\n# stays encoded here -- the rightmost '@' is unambiguously the host delimiter.\n# scheme://user:pass@host -> user:pass\nuserinfo=\\${url#*://}\nuserinfo=\\${userinfo%@*}\nuser=\\${userinfo%%:*}\npass=\\${userinfo#*:}\n\n# Percent-decode the token (encodeURIComponent inverse). '%XX' -> byte; no '+'\n# handling needed since encodeURIComponent emits '%20' for spaces.\npass=$(printf '%b' \"$(printf '%s' \"$pass\" | sed 's/%/\\\\\\\\x/g')\")\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 * Shared helpers for filesystem-face connectors that delegate to a host-side\n * fleet supervisor (rclone for sharepoint/webdav/googledrive, git for git).\n *\n * When `SKAILE_FLEET_MANAGED_MOUNTS` lists a connector's id, the host has\n * already prepared the underlying mount (rclone FUSE mountpoint, or a git\n * worktree bind) and exposed it at the driver's target dir. The driver\n * short-circuits its own connect path after verifying the bind is live.\n */\n\nimport { readdir, stat } from \"node:fs/promises\";\n\n/**\n * Return `true` when `connectorId` appears in the comma-separated\n * `SKAILE_FLEET_MANAGED_MOUNTS` env var, indicating the host fleet owns this\n * mount.\n */\nexport function isFleetManaged(connectorId: 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((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .includes(connectorId);\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 *\n * `readdir` surfaces FUSE-side errors that `stat` cannot (e.g. transport\n * endpoint not connected if the host process died after bind).\n */\nexport async function ensureFleetMounted(\n dir: string,\n log: { info: (msg: string, data?: object) => void },\n options?: { timeoutMs?: number; pollIntervalMs?: number },\n): Promise<void> {\n const timeoutMs = options?.timeoutMs ?? 3_000;\n const pollIntervalMs = options?.pollIntervalMs ?? 100;\n const deadline = Date.now() + timeoutMs;\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, pollIntervalMs));\n }\n }\n throw new Error(\n `fleet mount ${dir} not ready after ${timeoutMs}ms — check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${\n lastErr instanceof Error ? lastErr.message : String(lastErr)\n }`,\n );\n}\n\n/**\n * Health verdict for a fleet mount target.\n *\n * Kept so existing callers can keep typing `ConnectorManager.reportFleetHealth`\n * while the method is a no-op in the package-side bind-consumer.\n */\nexport type FleetHealthVerdict = \"healthy\" | \"degraded\" | \"error\";\n","/**\n * Shared filesystem helpers for connector infrastructure.\n *\n * @docLink packages/connectors/api-reference#fs-utils\n */\n\nimport { chmod, mkdir } from \"node:fs/promises\";\nimport type { Logger } from \"@skaile/workspaces/types\";\n\n/**\n * mkdir(recursive) + chmod 0o770 in one call. The post-mkdir `chmod` is the\n * load-bearing piece: `mkdir(mode:)` is ANDed with the process umask\n * (typically 022 → effective mode 0o750), which strips the group-write bit\n * expected by shared workspace mounts. Explicit `chmod` is umask-immune.\n *\n * EPERM on `chmod` is swallowed: when a foreign uid pre-created the\n * directory (a stray uid-1000 process inside the container or a host-side\n * platform process writing through the project bind-mount), the runner\n * cannot chmod it. The platform's agent container entrypoint runs as root\n * and heals the subtree on the next restart — see\n * `platform/docker/agent/entrypoint.sh` `_skaile_heal_ownership`. A debug\n * line is emitted when a logger is supplied so the rare-but-real heal\n * trigger is observable in session logs without adding noise on the happy\n * path.\n *\n * The chmod is *idempotent* (the syscall always fires, but a no-op when\n * the mode is already 0o770), not a no-op — kernel behaviour for chmod is\n * \"set\", not \"set-if-different\".\n *\n * @param dir Absolute or relative path to ensure exists at mode 0o770.\n * @param log Optional logger. When provided, EPERM-on-chmod emits a\n * `debug`-level entry under whatever taxonomy the caller's logger uses.\n */\nexport async function ensureDirMode(dir: string, log?: Logger): Promise<void> {\n await mkdir(dir, { recursive: true });\n try {\n await chmod(dir, 0o770);\n } catch (err) {\n log?.debug(\"chmod 0770 skipped (EPERM — entrypoint heal expected)\", {\n path: dir,\n error: err instanceof Error ? err.message : String(err),\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 * 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 */\ntype GitconfigBlock = { mountId: string; lines: string[] };\n\n/**\n * Append a foreign (non-block) line: extend the trailing foreign block if the\n * last block is one, otherwise open a new foreign block under the special \"\"\n * id. Keeps foreign content out of any recognized block on rewrite.\n */\nfunction appendForeignLine(blocks: GitconfigBlock[], line: string): void {\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/** Drop trailing foreign blocks that contain only blank lines. */\nfunction trimTrailingEmptyForeignBlock(blocks: GitconfigBlock[]): void {\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}\n\nfunction parseBlocks(text: string): Array<{ mountId: string; lines: string[] }> {\n const blocks: GitconfigBlock[] = [];\n let current: GitconfigBlock | 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 appendForeignLine(blocks, line);\n }\n }\n if (current) blocks.push(current);\n\n trimTrailingEmptyForeignBlock(blocks);\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 // Percent-encode the token so an `@`/`:`/`%` in it can't break the helper's\n // `scheme://user:pass@host` parsing; the helper script url-decodes it back.\n const encodedToken = encodeURIComponent(token);\n return `${scheme}://x-access-token:${encodedToken}@${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 * Upserts: inserts the line when `mountId` has none yet. An emptied or missing\n * credentials file must be able to self-heal from the refresh path — refusing\n * to insert would strand interactive git until an external reconnect.\n * Other mounts' lines are left untouched.\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 without.push(buildCredentialLine(urlPrefix, token, mountId));\n writeCredentialLines(credentialsPath, without);\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\";\nimport { portableSpawn } from \"@skaile/workspaces/core\";\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 the runtime-portable 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 the runtime-portable subprocess helper. */\nexport async function defaultSpawn(cmd: string[], opts: { cwd: string }): Promise<SpawnResult> {\n const proc = portableSpawn(cmd, { cwd: opts.cwd });\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 * PortPool — allocates ports from a [min, max] range, checks OS for collisions.\n */\n\nimport { createConnection } from \"node:net\";\n\n/**\n * Allocates TCP ports from a `[min, max]` range with OS-level collision detection.\n * Used by service connector adapters (devserver, static-server) to assign local ports.\n * @docLink packages/connectors/api-reference#port-pool\n */\nexport class PortPool {\n private readonly min: number;\n private readonly max: number;\n private readonly inUse = new Set<number>();\n\n constructor(range: [number, number]) {\n this.min = range[0];\n this.max = range[1];\n }\n\n /** Allocate the next free port from the range. Checks OS for collisions. */\n async allocate(): Promise<number> {\n for (let port = this.min; port <= this.max; port++) {\n if (this.inUse.has(port)) continue;\n if (!(await PortPool.isPortFree(port))) {\n this.inUse.add(port);\n continue;\n }\n this.inUse.add(port);\n return port;\n }\n throw new Error(`No free port in range ${this.min}-${this.max}`);\n }\n\n /** Mark a port as in-use (for explicit port args or registered instances). */\n reserve(port: number): void {\n this.inUse.add(port);\n }\n\n /** Return a port to the pool. */\n release(port: number): void {\n this.inUse.delete(port);\n }\n\n /** Check if a port is currently tracked as in-use. */\n isInUse(port: number): boolean {\n return this.inUse.has(port);\n }\n\n /** Quick TCP connect test — returns true if nothing is listening. */\n static isPortFree(port: number, host = \"127.0.0.1\"): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = createConnection({ port, host });\n socket.once(\"connect\", () => {\n socket.destroy();\n resolve(false);\n });\n socket.once(\"error\", () => {\n socket.destroy();\n resolve(true);\n });\n socket.setTimeout(500, () => {\n socket.destroy();\n resolve(true);\n });\n });\n }\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 { ConnectorChangeEvent } from \"./connector-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];\n/** Default chokidar `awaitWriteFinish` stability threshold (ms). */\nexport const 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 `ConnectorChangeEvent` (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: ConnectorChangeEvent) => 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 AbstractConnector,\n type ConnectContext,\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 type ToolFace,\n} from \"@skaile/workspaces/connectors\";\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 computeFlowStateFromSnapshots,\n type FlowDefinition,\n type FlowNode,\n isBlocking,\n} from \"./engine/index.js\";\nimport { renderStimulusPrompt } from \"./prompt-fragments.js\";\nimport { computeStimulus } from \"./stimulus-driver.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/factory-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 cold-container rehydration when the runner bootstraps\n * the flow connector from a host `connector_mutate { id: \"flow\",\n * op: \"hydrate\", payload: { state, flow } }` (Protocol >= 3.5).\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 AbstractConnector {\n readonly name = \"flow\";\n readonly mountable = false;\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this.read(handle, path),\n list: (handle, path, options) => this.list(handle, path, options),\n search: (handle, query, options) => this.search(handle, query, options),\n describeOperations: (handle) => this.describeOperations(handle),\n executeOp: (handle, operation, args) => this.executeOp(handle, operation, args),\n };\n }\n\n // ── Lifecycle ──\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): 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.status = \"disconnected\";\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 (private — wired into tools face in constructor) ──\n\n private 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 private 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 private 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 private 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 return this.opGetAvailable(s);\n case \"get_state\":\n return JSON.stringify(s.execution);\n case \"build_handoff\":\n return this.buildHandoff(s, String(args.nodeId ?? \"\"));\n case \"validate_node\":\n return this.opValidateNode(s, args);\n case \"start_node\":\n return this.opStartNode(handle, args);\n case \"request_approval\":\n return this.opRequestApproval(handle, args);\n case \"request_input\":\n return this.opRequestInput(handle, args);\n case \"complete_node\":\n return this.opCompleteNode(handle, args);\n case \"skip_node\":\n return this.opSkipNode(handle, args);\n case \"fail_node\":\n return this.opFailNode(handle, args);\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 return this.opApplyApproval(handle, s, args);\n case \"applyInput\":\n return this.opApplyInput(handle, s, args);\n case \"cancel\":\n this.cancel(handle);\n return JSON.stringify(s.execution);\n case \"setAutonomousMode\":\n return this.opSetAutonomousMode(handle, s, args);\n case \"retryNode\":\n return this.opRetryNode(handle, s, args);\n case \"hydrate\":\n return this.opHydrate(handle, s, args);\n case \"start\":\n return this.opStart(handle, s, args);\n\n default:\n throw new Error(`FlowAdapter: Unknown operation: ${operation}`);\n }\n }\n\n // ── executeOp branch handlers (private dispatch helpers) ─────────────────\n\n private opGetAvailable(s: FlowAdapterState): string {\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 private opValidateNode(s: FlowAdapterState, args: Record<string, unknown>): string {\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 private opStartNode(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const nodeId = String(args.nodeId ?? \"\");\n return this.doStartNode(handle, nodeId);\n }\n\n private opRequestApproval(handle: ConnectorHandle, args: Record<string, unknown>): string {\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 private opRequestInput(handle: ConnectorHandle, args: Record<string, unknown>): string {\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 private opCompleteNode(handle: ConnectorHandle, args: Record<string, unknown>): string {\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 private opSkipNode(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const nodeId = String(args.nodeId ?? \"\");\n return this.doSkipNode(handle, nodeId);\n }\n\n private opFailNode(handle: ConnectorHandle, args: Record<string, unknown>): string {\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 private opApplyApproval(\n handle: ConnectorHandle,\n s: FlowAdapterState,\n args: Record<string, unknown>,\n ): string {\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 private opApplyInput(\n handle: ConnectorHandle,\n s: FlowAdapterState,\n args: Record<string, unknown>,\n ): string {\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 private opSetAutonomousMode(\n handle: ConnectorHandle,\n s: FlowAdapterState,\n args: Record<string, unknown>,\n ): string {\n const enabled = args.enabled === true || args.enabled === \"true\";\n this.setAutonomousMode(handle, enabled);\n return JSON.stringify(s.execution);\n }\n\n private opRetryNode(\n handle: ConnectorHandle,\n s: FlowAdapterState,\n args: Record<string, unknown>,\n ): string {\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 private opHydrate(\n handle: ConnectorHandle,\n s: FlowAdapterState,\n args: Record<string, unknown>,\n ): string {\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 private opStart(\n handle: ConnectorHandle,\n s: FlowAdapterState,\n args: Record<string, unknown>,\n ): string {\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 // ── 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 }\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 * Creates a new FlowAdapter instance.\n * @returns Configured FlowAdapter ready to be registered in the connector registry.\n * @docLink packages/factory-assets/api-reference#flow-connector-factory\n */\nexport function createConnector(): FlowAdapter {\n return new FlowAdapter();\n}\n"]}