@skaile/workspaces 3.6.1 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{asset-feeds-YK6VBW4Y.js → asset-feeds-DQ3BUCKA.js} +4 -4
  3. package/dist/{asset-feeds-YK6VBW4Y.js.map → asset-feeds-DQ3BUCKA.js.map} +1 -1
  4. package/dist/asset-manager/index.js +1 -1
  5. package/dist/chunk-AXEOG4B5.js +193 -0
  6. package/dist/chunk-AXEOG4B5.js.map +1 -0
  7. package/dist/{chunk-7T3O4KFG.js → chunk-DH4BW6JA.js} +4 -4
  8. package/dist/{chunk-7T3O4KFG.js.map → chunk-DH4BW6JA.js.map} +1 -1
  9. package/dist/{chunk-GVXR32DT.js → chunk-EWYVONO7.js} +3 -3
  10. package/dist/{chunk-GVXR32DT.js.map → chunk-EWYVONO7.js.map} +1 -1
  11. package/dist/{chunk-M3CKNK33.js → chunk-FMGYEYCW.js} +6 -6
  12. package/dist/{chunk-M3CKNK33.js.map → chunk-FMGYEYCW.js.map} +1 -1
  13. package/dist/{chunk-4Q76UBTV.js → chunk-GRMQBBN4.js} +2 -2
  14. package/dist/{chunk-4Q76UBTV.js.map → chunk-GRMQBBN4.js.map} +1 -1
  15. package/dist/{chunk-ZNDPABMQ.js → chunk-GVW2REJE.js} +7 -7
  16. package/dist/{chunk-ZNDPABMQ.js.map → chunk-GVW2REJE.js.map} +1 -1
  17. package/dist/{chunk-VC2I2U6Q.js → chunk-HY6CIKFH.js} +3 -3
  18. package/dist/chunk-HY6CIKFH.js.map +1 -0
  19. package/dist/{chunk-GOCFHDGC.js → chunk-JDX4OWRI.js} +2 -2
  20. package/dist/{chunk-GOCFHDGC.js.map → chunk-JDX4OWRI.js.map} +1 -1
  21. package/dist/{chunk-L3KQJ2Y7.js → chunk-MKLIIH6W.js} +13 -18
  22. package/dist/chunk-MKLIIH6W.js.map +1 -0
  23. package/dist/{chunk-ZZ6LN5NO.js → chunk-NC5YXVZF.js} +3 -3
  24. package/dist/{chunk-ZZ6LN5NO.js.map → chunk-NC5YXVZF.js.map} +1 -1
  25. package/dist/{chunk-FYJY4UIR.js → chunk-OYZIURPH.js} +3 -3
  26. package/dist/{chunk-FYJY4UIR.js.map → chunk-OYZIURPH.js.map} +1 -1
  27. package/dist/{chunk-E554W7ZH.js → chunk-TMWPIQST.js} +2 -2
  28. package/dist/{chunk-E554W7ZH.js.map → chunk-TMWPIQST.js.map} +1 -1
  29. package/dist/{chunk-YYITPROS.js → chunk-UTPQBYYY.js} +3 -3
  30. package/dist/{chunk-YYITPROS.js.map → chunk-UTPQBYYY.js.map} +1 -1
  31. package/dist/{chunk-BGVTNQ23.js → chunk-X73J3FFD.js} +6 -6
  32. package/dist/{chunk-BGVTNQ23.js.map → chunk-X73J3FFD.js.map} +1 -1
  33. package/dist/{chunk-CL75GNIW.js → chunk-ZHHZBMZF.js} +4 -4
  34. package/dist/{chunk-CL75GNIW.js.map → chunk-ZHHZBMZF.js.map} +1 -1
  35. package/dist/cli/index.js +30 -29
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/connectors/index.js +4 -3
  38. package/dist/{ensure-sources-2RW742IO.js → ensure-sources-2LZWBCWO.js} +4 -4
  39. package/dist/{ensure-sources-2RW742IO.js.map → ensure-sources-2LZWBCWO.js.map} +1 -1
  40. package/dist/factory-assets/connectors/box.js +4 -3
  41. package/dist/factory-assets/connectors/deploy.js +4 -3
  42. package/dist/factory-assets/connectors/devserver.js +4 -3
  43. package/dist/factory-assets/connectors/flow/CONNECTOR.md +1 -1
  44. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  45. package/dist/factory-assets/connectors/flow/adapter.js +4 -3
  46. package/dist/factory-assets/connectors/flow/contract/index.d.ts +1 -0
  47. package/dist/factory-assets/connectors/flow/contract/index.d.ts.map +1 -1
  48. package/dist/factory-assets/connectors/flow/contract/input-schema.d.ts +49 -0
  49. package/dist/factory-assets/connectors/flow/contract/input-schema.d.ts.map +1 -0
  50. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +39 -0
  51. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  52. package/dist/factory-assets/connectors/flow/contract.js +3 -2
  53. package/dist/factory-assets/connectors/flow/engine.js +2 -2
  54. package/dist/factory-assets/connectors/flow/run-flow.js +5 -4
  55. package/dist/factory-assets/connectors/flow.js +4 -3
  56. package/dist/factory-assets/connectors/git.js +4 -3
  57. package/dist/factory-assets/connectors/gmail.js +4 -3
  58. package/dist/factory-assets/connectors/googledrive.js +4 -3
  59. package/dist/factory-assets/connectors/local.js +4 -3
  60. package/dist/factory-assets/connectors/mattermost.js +4 -3
  61. package/dist/factory-assets/connectors/memory.js +4 -3
  62. package/dist/factory-assets/connectors/minio.js +4 -3
  63. package/dist/factory-assets/connectors/postgres.js +4 -3
  64. package/dist/factory-assets/connectors/s3.js +4 -3
  65. package/dist/factory-assets/connectors/sharepoint.js +4 -3
  66. package/dist/factory-assets/connectors/sqlite.js +4 -3
  67. package/dist/factory-assets/connectors/static-server.js +4 -3
  68. package/dist/factory-assets/connectors/tunnel.js +4 -3
  69. package/dist/factory-assets/connectors/webdav.js +4 -3
  70. package/dist/factory-assets/connectors/xstate-store.js +4 -3
  71. package/dist/factory-assets/connectors/xstate.js +4 -3
  72. package/dist/{flows-W7EYXP6R.js → flows-4R4VJ5VM.js} +3 -3
  73. package/dist/{flows-W7EYXP6R.js.map → flows-4R4VJ5VM.js.map} +1 -1
  74. package/dist/{helpers-D7W7C5NL.js → helpers-SW2GWYGU.js} +4 -4
  75. package/dist/{helpers-D7W7C5NL.js.map → helpers-SW2GWYGU.js.map} +1 -1
  76. package/dist/{library-publish-X4ZR2PG6.js → library-publish-VCTQFIIW.js} +8 -8
  77. package/dist/{library-publish-X4ZR2PG6.js.map → library-publish-VCTQFIIW.js.map} +1 -1
  78. package/dist/{open-library-6VUMR6I6.js → open-library-SDYW5T7S.js} +7 -7
  79. package/dist/{open-library-6VUMR6I6.js.map → open-library-SDYW5T7S.js.map} +1 -1
  80. package/dist/{project-RS6ANRJT.js → project-C2DGB2V3.js} +5 -5
  81. package/dist/{project-RS6ANRJT.js.map → project-C2DGB2V3.js.map} +1 -1
  82. package/dist/runner/index.js +8 -7
  83. package/dist/sdk/asset-manager.js +1 -1
  84. package/dist/sdk/flow.js +2 -2
  85. package/dist/sdk/index.js +8 -7
  86. package/dist/sdk/index.js.map +1 -1
  87. package/dist/sdk/runner.js +8 -7
  88. package/dist/{source-DF3YRE6B.js → source-HAA7QVAP.js} +8 -8
  89. package/dist/{source-DF3YRE6B.js.map → source-HAA7QVAP.js.map} +1 -1
  90. package/dist/{source-manifest-publish-L5JH2WD3.js → source-manifest-publish-NLIJK22S.js} +9 -9
  91. package/dist/{source-manifest-publish-L5JH2WD3.js.map → source-manifest-publish-NLIJK22S.js.map} +1 -1
  92. package/dist/tui/index.js +8 -7
  93. package/dist/tui/index.js.map +1 -1
  94. package/dist/workspace-plugin/adapters/mcp.js +1 -1
  95. package/dist/workspace-plugin/adapters/omp.js +3 -3
  96. package/dist/workspace-plugin/index.js +1 -1
  97. package/package.json +1 -1
  98. package/dist/chunk-L3KQJ2Y7.js.map +0 -1
  99. package/dist/chunk-VC2I2U6Q.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../connectors/src/connector-base.ts","../factory-assets/connectors/flow/inline-sub-flow-host.ts","../factory-assets/connectors/flow/node-executor.ts","../factory-assets/connectors/flow/orchestrator-turn.ts","../factory-assets/connectors/flow/subprompt-runner.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":["nodeLabel","process","resolve","record","createConnector","execFileAsync","promisify","execFile","credentialTag","stat","CLOUD_FLEET_REQUIRED","syncFleetManaged","mkdir","table","result","join","dirname","writeFile","quoteIdent","readFile","instanceToStatus","sep","t","_ctx","z","z2","zNS","readdir","require","relative","git","json","projection","runPromise","execution"],"mappings":"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","file":"chunk-MKLIIH6W.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","import type { ConnectorHandle } from \"@skaile/workspaces/connectors\";\nimport type { FlowExecution, NodeError } from \"@skaile/workspaces/types\";\nimport { FlowAdapter } from \"./adapter.js\";\nimport type { FlowDefinition } from \"./engine/types.js\";\nimport type { NodeExecutor } from \"./node-executor.js\";\nimport type { TurnStimulus } from \"./prompt-fragments.js\";\nimport type { SubpromptRunner } from \"./subprompt-runner.js\";\nimport type {\n InlineSubFlowOperationTarget,\n InlineSubFlowProjection,\n InlineSubFlowRequest,\n InlineSubFlowResult,\n InlineSubFlowRunner,\n} from \"./sub-flow-runner.js\";\n\n/** Maximum number of flow identities allowed in one transient inline ancestry. */\nexport const INLINE_SUB_FLOW_MAX_DEPTH = 16;\n\n/** One agent turn driven by the already-materialized parent session. */\nexport interface InlineSubFlowAgentTurn {\n /** Child adapter whose agent nodes use the parent session's connector tools. */\n adapter: FlowAdapter;\n /** Connected child handle. */\n handle: ConnectorHandle;\n /** Child definition with its resolved parent-bound input applied. */\n flow: FlowDefinition;\n /** Live child snapshot used to build the normal orchestrator prompt. */\n execution: FlowExecution;\n /** Child-local stimulus that initiated this turn. */\n stimulus: TurnStimulus;\n}\n\n/** Host dependencies for driving an inline child through the existing FlowAdapter lifecycle. */\nexport interface SessionInlineSubFlowRunnerOptions {\n /** Resolves a flow identity through the host's normal installed/manual/asset lookup. */\n resolveFlow(flowId: string): FlowDefinition | Promise<FlowDefinition>;\n /** Runs one child agent turn with the parent session's existing driver. */\n driveAgentTurn(turn: InlineSubFlowAgentTurn): Promise<void>;\n /** Reuses the materialized session workspace for deterministic child nodes. */\n nodeExecutor?: NodeExecutor;\n /** Reuses the parent's isolated-driver seam for child subprompt nodes. */\n subpromptRunner?: SubpromptRunner;\n}\n\ninterface InlineChildSession {\n key: string;\n request: InlineSubFlowRequest;\n adapter: FlowAdapter;\n handle: ConnectorHandle;\n flow: FlowDefinition;\n target: InlineSubFlowOperationTarget;\n stimulus: TurnStimulus;\n changeVersion: number;\n agentTurnActive: boolean;\n closed: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction childDefinition(request: InlineSubFlowRequest, authored: FlowDefinition): FlowDefinition {\n const childRunInput = authored.defaults?.run_input;\n const parentRunInput = request.parentFlow.defaults?.run_input;\n const hasBoundInputs = Object.keys(request.inputs).length > 0;\n const hasParentContext = request.passContext && parentRunInput !== undefined;\n if (!hasBoundInputs && !hasParentContext) return authored;\n\n let runInput: unknown;\n if (\n (childRunInput === undefined || isRecord(childRunInput)) &&\n (!hasParentContext || isRecord(parentRunInput))\n ) {\n runInput = {\n ...(isRecord(childRunInput) ? childRunInput : {}),\n ...(hasParentContext && isRecord(parentRunInput) ? parentRunInput : {}),\n ...request.inputs,\n };\n } else if (hasBoundInputs) {\n runInput = request.inputs;\n } else {\n runInput = parentRunInput;\n }\n\n return {\n ...authored,\n defaults: {\n ...authored.defaults,\n run_input: runInput as NonNullable<FlowDefinition[\"defaults\"]>[\"run_input\"],\n },\n };\n}\n\nfunction terminalError(execution: FlowExecution): NodeError {\n const failed = Object.values(execution.nodes).find((node) => node.status === \"failed\");\n if (failed?.error) return failed.error;\n return {\n message: `Inline child flow ${execution.flowId} ended with status ${execution.status}`,\n recoverable: false,\n at: new Date().toISOString(),\n };\n}\n\nfunction projection(session: InlineChildSession): InlineSubFlowProjection {\n const execution = session.adapter.getExecution(session.handle);\n for (const definition of session.flow.nodes) {\n const node = execution.nodes[definition.id];\n if (node?.status === \"awaiting_approval\" && node.approval?.decision == null) {\n return { status: \"awaiting_approval\", approval: structuredClone(node.approval) };\n }\n if (node?.status === \"awaiting_input\" && node.input?.providedAt == null) {\n return { status: \"awaiting_input\", input: structuredClone(node.input) };\n }\n }\n const approvals = Object.values(execution.nodes)\n .flatMap((node) => node.approvalHistory)\n .sort((left, right) => left.requestedAt.localeCompare(right.requestedAt));\n const inputs = Object.values(execution.nodes)\n .flatMap((node) => node.inputHistory)\n .sort((left, right) => left.requestedAt.localeCompare(right.requestedAt));\n return {\n status: \"running\",\n approval: approvals.at(-1) ? structuredClone(approvals.at(-1)) : undefined,\n input: inputs.at(-1) ? structuredClone(inputs.at(-1)) : undefined,\n };\n}\n\nfunction currentInteractionNode(\n session: InlineChildSession,\n status: \"awaiting_approval\" | \"awaiting_input\",\n): string {\n const execution = session.adapter.getExecution(session.handle);\n const node = session.flow.nodes.find(\n (definition) => execution.nodes[definition.id]?.status === status,\n );\n if (!node) {\n throw new Error(`Inline child ${session.flow.id} is not ${status.replaceAll(\"_\", \" \")}`);\n }\n return node.id;\n}\n\n/**\n * Drives delegated flows once, inline, through child FlowAdapters in the current session.\n *\n * Child sessions are transient and keyed by their owning parent node. A parked/no-op child stays\n * connected in memory for the next parent stimulus, but no child snapshot is published or stored.\n */\nexport class SessionInlineSubFlowRunner implements InlineSubFlowRunner {\n private readonly sessions = new Map<string, InlineChildSession>();\n\n constructor(private readonly options: SessionInlineSubFlowRunnerOptions) {}\n\n private sessionKey(request: InlineSubFlowRequest): string {\n return `${request.parentExecution.runId}\\u0000${request.node.id}`;\n }\n\n private async dispose(session: InlineChildSession): Promise<void> {\n if (session.closed) return;\n session.closed = true;\n this.sessions.delete(session.key);\n session.request.routeOperationsTo(undefined);\n await session.adapter.disconnect(session.handle);\n }\n\n private async cancel(session: InlineChildSession): Promise<void> {\n if (session.closed) return;\n try {\n await session.adapter.executeOp(session.handle, \"cancel\", {});\n } finally {\n await this.dispose(session);\n }\n }\n\n private async createSession(request: InlineSubFlowRequest): Promise<InlineChildSession> {\n if (request.ancestry.includes(request.flowId)) {\n throw new Error(\n `Inline sub-flow cycle detected: ${[...request.ancestry, request.flowId].join(\" -> \")}`,\n );\n }\n if (request.ancestry.length >= INLINE_SUB_FLOW_MAX_DEPTH) {\n throw new Error(\n `Inline sub-flow depth exceeds ${INLINE_SUB_FLOW_MAX_DEPTH}: ${[\n ...request.ancestry,\n request.flowId,\n ].join(\" -> \")}`,\n );\n }\n\n const authored = await this.options.resolveFlow(request.flowId);\n if (request.ancestry.includes(authored.id)) {\n throw new Error(\n `Inline sub-flow cycle detected after resolving ${request.flowId}: ${[\n ...request.ancestry,\n authored.id,\n ].join(\" -> \")}`,\n );\n }\n const flow = childDefinition(request, authored);\n const adapter = new FlowAdapter();\n const handle = await adapter.connect(\n {\n id: `flow:${request.parentExecution.runId}:${request.node.id}`,\n driver: \"flow\",\n access: \"read-write\",\n options: {\n flow,\n flowInputOrigins: request.inputOrigins,\n inlineSubFlowAncestry: [...request.ancestry, flow.id],\n inlineSubFlowRunner: this,\n nodeExecutor: this.options.nodeExecutor,\n subpromptRunner: this.options.subpromptRunner,\n seed: {\n runId: `${request.parentExecution.runId}:${request.node.id}`,\n startedBy: request.parentExecution.startedBy,\n autonomousMode: request.parentExecution.autonomousMode,\n },\n },\n },\n {},\n );\n\n const key = this.sessionKey(request);\n let session: InlineChildSession;\n const target: InlineSubFlowOperationTarget = {\n parentNodeId: request.node.id,\n isAgentTurnActive: () => session.agentTurnActive || adapter.hasActiveInlineAgentTurn(handle),\n executeAgentOp: (operation, args) => adapter.executeOp(handle, operation, args),\n applyParentApproval: async (args) => {\n const nodeId = currentInteractionNode(session, \"awaiting_approval\");\n await adapter.executeOp(handle, \"applyApproval\", { ...args, nodeId });\n session.stimulus = {\n kind: \"approval_received\",\n nodeId,\n decision: args.decision === \"rejected\" ? \"rejected\" : \"approved\",\n feedback: typeof args.feedback === \"string\" ? args.feedback : undefined,\n decidedBy: String(args.decidedBy ?? \"\"),\n };\n return projection(session);\n },\n applyParentInput: async (args) => {\n const nodeId = currentInteractionNode(session, \"awaiting_input\");\n await adapter.executeOp(handle, \"applyInput\", { ...args, nodeId });\n session.stimulus = {\n kind: \"input_received\",\n nodeId,\n response: args.response,\n providedBy: String(args.providedBy ?? \"\"),\n };\n return projection(session);\n },\n cancel: () => this.cancel(session),\n getExecution: () => adapter.getAgentExecution(handle),\n getMandatoryAgentApprovalNodeIds: () => adapter.getMandatoryAgentApprovalNodeIds(handle),\n };\n session = {\n key,\n request,\n adapter,\n handle,\n flow,\n target,\n stimulus: { kind: \"flow_started\" },\n changeVersion: 0,\n agentTurnActive: false,\n closed: false,\n };\n adapter.onStateChange(handle, () => {\n session.changeVersion += 1;\n });\n this.sessions.set(key, session);\n request.routeOperationsTo(target);\n return session;\n }\n\n async run(request: InlineSubFlowRequest): Promise<InlineSubFlowResult> {\n const key = this.sessionKey(request);\n const session = this.sessions.get(key) ?? (await this.createSession(request));\n session.request = request;\n request.routeOperationsTo(session.target);\n\n try {\n while (!session.closed) {\n await session.adapter.drainRuntimeNodes(session.handle);\n const execution = session.adapter.getExecution(session.handle);\n if (execution.done || execution.status === \"complete\") {\n await this.dispose(session);\n return {\n status: \"complete\",\n output: {\n summary: `Inline child flow ${session.flow.id} completed`,\n artifacts: [],\n },\n };\n }\n if (execution.status === \"failed\" || execution.status === \"cancelled\") {\n const error = terminalError(execution);\n await this.dispose(session);\n return { status: \"failed\", error };\n }\n\n if (session.adapter.shouldDriveAgentTurn(session.handle, session.stimulus)) {\n const versionBeforeTurn = session.changeVersion;\n session.agentTurnActive = true;\n try {\n await this.options.driveAgentTurn({\n adapter: session.adapter,\n handle: session.handle,\n flow: session.flow,\n execution,\n stimulus: session.stimulus,\n });\n } finally {\n session.agentTurnActive = false;\n }\n if (session.closed) {\n return { status: \"failed\", error: terminalError(execution) };\n }\n session.stimulus = { kind: \"state_changed\" };\n if (session.changeVersion === versionBeforeTurn) {\n return { status: \"paused\", projection: projection(session) };\n }\n continue;\n }\n\n return { status: \"paused\", projection: projection(session) };\n }\n\n return {\n status: \"failed\",\n error: {\n message: `Inline child flow ${request.flowId} was cancelled`,\n recoverable: false,\n at: new Date().toISOString(),\n },\n };\n } catch (error) {\n try {\n await this.dispose(session);\n } catch {\n // Session ownership and routing were cleared before adapter disconnect attempted cleanup.\n }\n throw error;\n }\n }\n}\n","import { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { portableSpawn, type PortableSubprocess } from \"@skaile/workspaces/core\";\nimport type { BindingOrigin } from \"./contract/expression.js\";\nimport { deterministicNodeKindLabel } from \"./engine/node-shape.js\";\nimport type { FlowNode } from \"./engine/types.js\";\n\n/** @deprecated Use {@link DeterministicFlowNode}; `NodeExecutorRequest.node` widened to include `check`. */\nexport type FunctionFlowNode = FlowNode & {\n run: Extract<NonNullable<FlowNode[\"run\"]>, { kind: \"function\" }>;\n};\n\n/** Strict v2 function or check node — the two kinds NodeExecutor runs outside an agent turn. */\nexport type DeterministicFlowNode = FlowNode & {\n run: Extract<NonNullable<FlowNode[\"run\"]>, { kind: \"function\" | \"check\" }>;\n};\n\n/** Resolved execution request handed across the flow engine's only I/O seam. */\nexport interface NodeExecutorRequest {\n /** Available strict v2 function or check node selected by the pure engine. */\n node: DeterministicFlowNode;\n /** Binding values already resolved at the node boundary. */\n inputs: Record<string, unknown>;\n /** Provenance retained separately from the values serialized for execution. */\n inputOrigins: Record<string, BindingOrigin[]>;\n}\n\n/** Captured result of one deterministic node process. */\nexport interface NodeExecutorResult {\n /** Process exit status, matched against the node's declared successful statuses. */\n exitStatus: number;\n /** Complete UTF-8 standard output from the process. */\n stdout: string;\n /** Complete UTF-8 standard error from the process. */\n stderr: string;\n}\n\n/** Ambient per-call controls, kept off {@link NodeExecutorRequest} because they are not execution data. */\nexport interface NodeExecutorOptions {\n /** Fires once the caller has abandoned this result — the work should stop. */\n signal?: AbortSignal;\n}\n\n/** Runtime seam for node kinds that execute outside an agent turn. */\nexport interface NodeExecutor {\n /**\n * Executes one available deterministic node with already-resolved inputs.\n *\n * `options.signal` fires once the caller has abandoned the result; an\n * implementation that honors it should stop the work and reject only after it\n * has stopped. Ignoring it is supported — an executor declaring only\n * `(request)` still satisfies this interface and behaves exactly as before,\n * forgoing only the reaping of work whose result is already discarded.\n */\n execute(request: NodeExecutorRequest, options?: NodeExecutorOptions): Promise<NodeExecutorResult>;\n}\n\n/** Session workspace required to keep deterministic execution inside the active run. */\nexport interface SessionNodeExecutorOptions {\n /** Root of the already-materialized session workspace. */\n workspaceDir: string;\n}\n\nfunction stableJsonStringify(value: unknown): string | undefined {\n return JSON.stringify(value, (_key, nested) => {\n if (nested === null || Array.isArray(nested) || typeof nested !== \"object\") return nested;\n return Object.fromEntries(\n Object.entries(nested as Record<string, unknown>).sort(([left], [right]) => {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }),\n );\n });\n}\n\nfunction serializeEnvironmentInput(name: string, value: unknown, nodeLabel: string): string {\n if (typeof value === \"string\") return value;\n const serialized = stableJsonStringify(value);\n if (serialized === undefined) {\n throw new Error(`${nodeLabel} input ${name} is not JSON-serializable`);\n }\n return serialized;\n}\n\nfunction commandFor(node: DeterministicFlowNode): string[] {\n switch (node.run.runtime ?? \"shell\") {\n case \"shell\":\n return [\"sh\", \"-c\", node.run.command];\n case \"node\":\n return [\"node\", \"-e\", node.run.command];\n case \"python\":\n return [\"python3\", \"-c\", node.run.command];\n }\n}\n\n/**\n * Grace between the abort's `SIGTERM` and the `SIGKILL` that makes it true. A\n * command that traps or ignores `SIGTERM` would otherwise keep running while\n * the node reads as aborted. Exported so a caller sequencing work behind an\n * abort can outlast the escalation instead of guessing at it.\n */\nexport const ABORT_SIGKILL_GRACE_MS = 2_000;\n\nfunction abortError(nodeLabel: string): Error {\n const error = new Error(`${nodeLabel} was aborted`);\n error.name = \"AbortError\";\n return error;\n}\n\n/**\n * Detached children still running. Detaching is what makes the abort a\n * process-*group* kill, but it also takes the child out of the runtime's group,\n * so a group-directed shutdown no longer reaches it — hence this sweep.\n */\nconst liveDetachedChildren = new Set<PortableSubprocess>();\nlet shutdownSweepInstalled = false;\n\nfunction sweepOnShutdown(child: PortableSubprocess): void {\n liveDetachedChildren.add(child);\n void child.exited.then(() => liveDetachedChildren.delete(child));\n if (shutdownSweepInstalled) return;\n shutdownSweepInstalled = true;\n globalThis.process.once(\"exit\", () => {\n for (const live of liveDetachedChildren) {\n try {\n live.kill(\"SIGKILL\");\n } catch {\n /* already gone, or the group outlived our permission to signal it */\n }\n }\n });\n}\n\n/** Runs deterministic nodes inside the existing session workspace and environment. */\nexport class SessionNodeExecutor implements NodeExecutor {\n private readonly workspaceDir: string;\n\n /** Creates an executor scoped to one already-materialized session workspace. */\n constructor(options: SessionNodeExecutorOptions) {\n this.workspaceDir = resolve(options.workspaceDir);\n }\n\n /** Runs one function or check node process with session environment and binding overrides. */\n async execute(\n request: NodeExecutorRequest,\n options?: NodeExecutorOptions,\n ): Promise<NodeExecutorResult> {\n const nodeLabel = `${deterministicNodeKindLabel(request.node.run.kind)} node ${request.node.id}`;\n const cwd = resolve(this.workspaceDir, request.node.run.cwd ?? \".\");\n const workspaceRelative = relative(this.workspaceDir, cwd);\n if (\n workspaceRelative === \"..\" ||\n workspaceRelative.startsWith(`..${sep}`) ||\n isAbsolute(workspaceRelative)\n ) {\n throw new Error(`${nodeLabel} cwd escapes the session workspace: ${request.node.run.cwd}`);\n }\n\n const boundEnvironment = Object.fromEntries(\n Object.entries(request.inputs).map(([name, value]) => [\n name,\n serializeEnvironmentInput(name, value, nodeLabel),\n ]),\n );\n const signal = options?.signal;\n if (signal?.aborted) throw abortError(nodeLabel);\n\n // Detached so `portableSpawn`'s kill is a process-*group* kill: a command\n // that forks children of its own — a shell script, a build tool — would\n // otherwise leave them behind. `sweepOnShutdown` pays for the detachment.\n const process = portableSpawn(commandFor(request.node), {\n cwd,\n env: { ...globalThis.process.env, ...boundEnvironment },\n detached: true,\n });\n sweepOnShutdown(process);\n\n let aborted = false;\n let escalation: ReturnType<typeof setTimeout> | undefined;\n const onAbort = () => {\n aborted = true;\n process.kill(\"SIGTERM\");\n escalation = setTimeout(() => process.kill(\"SIGKILL\"), ABORT_SIGKILL_GRACE_MS);\n escalation.unref?.();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n // Awaited even when aborted — settling is then observable proof the\n // process is gone, not proof `kill` was called. Reading both pipes to the\n // end also lets them close instead of stalling a child on a full buffer.\n const [stdout, stderr, exitStatus] = await Promise.all([\n new Response(process.stdout).text(),\n new Response(process.stderr).text(),\n process.exited,\n ]);\n if (aborted) throw abortError(nodeLabel);\n return { exitStatus, stdout, stderr };\n } finally {\n if (escalation) clearTimeout(escalation);\n signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n}\n","/**\n * The one path an orchestrator turn takes: build the prompt, announce it, send it.\n *\n * Every flow turn rebuilds the full `# Flow Execution Context` prompt and hands\n * it to an agent driver. There are four such call sites — the stimulus bus and\n * the inline sub-flow runner, once each in the runner's `serve.ts` (hosted\n * sessions) and in `run-flow.ts` (CLI runs) — and nothing about the prompt used\n * to reach the event stream, so a consumer saw the agent replying to input it\n * could not read. Routing all four through {@link driveOrchestratorTurn} is what\n * keeps the announcement from drifting away from what is actually sent.\n *\n * Lives with the flow connector rather than the runner because the CLI entry in\n * this same directory is one of the four callers, and `factory-assets` must not\n * take a static import on `runner`.\n *\n * @docLink packages/factory-assets/flow#orchestrator-turn\n */\n\nimport type { FlowExecution, FlowPromptEvent } from \"@skaile/workspaces/types\";\nimport type { FlowDefinition } from \"./engine/types.js\";\nimport {\n buildOrchestratorPrompt,\n describeStimulus,\n type TurnStimulus,\n} from \"./prompt-fragments.js\";\n\n/** What one orchestrator turn is about — the inputs both the prompt and the event derive from. */\nexport interface FlowTurnContext {\n /** Definition of the flow being driven — the child definition for an inline sub-flow turn. */\n flow: FlowDefinition;\n /** Live snapshot the prompt is built from. */\n execution: FlowExecution;\n /** Why the runner is driving this turn. */\n stimulus: TurnStimulus;\n}\n\n/** Host seams {@link driveOrchestratorTurn} needs to announce and deliver a turn. */\nexport interface FlowTurnSinks {\n /** Puts the announcement on the session's event stream. */\n emit: (event: FlowPromptEvent) => void;\n /** Hands the prompt to the driver and resolves when the turn ends. */\n deliver: (prompt: string) => Promise<void>;\n}\n\n/**\n * The `nodeId` a stimulus concerns, or `undefined` for flow-scoped stimuli.\n *\n * Only the three node-scoped kinds carry one; `user_message` names a sender\n * rather than a node, and the rest are whole-run signals.\n */\nfunction stimulusNodeId(stimulus: TurnStimulus): string | undefined {\n switch (stimulus.kind) {\n case \"approval_received\":\n case \"input_received\":\n case \"retry_requested\":\n return stimulus.nodeId;\n default:\n return undefined;\n }\n}\n\n/**\n * Build the `flow_prompt` event describing one orchestrator turn.\n *\n * `prompt` is stored verbatim — callers must pass the same string they hand to\n * the driver, never a re-rendered one, or the host renders something the agent\n * never saw. The stimulus is reduced to its kind plus the node it concerns\n * because its payload (user text, node input) is already inside `prompt`.\n *\n * Pure so the field mapping is unit-testable without booting a session.\n *\n * @docLink packages/factory-assets/flow#orchestrator-turn\n */\nexport function buildFlowPromptEvent(input: FlowTurnContext & { prompt: string }): FlowPromptEvent {\n const nodeId = stimulusNodeId(input.stimulus);\n return {\n type: \"flow_prompt\",\n runId: input.execution.runId,\n flowId: input.flow.id,\n flowName: input.flow.name,\n stimulus: input.stimulus.kind,\n stimulusLabel: describeStimulus(input.stimulus),\n ...(nodeId === undefined ? {} : { nodeId }),\n prompt: input.prompt,\n };\n}\n\n/**\n * Build one orchestrator prompt, announce it, then deliver it to the agent.\n *\n * The prompt is built once and the same binding is both put on the event and\n * passed to `deliver`, which is what makes the emitted `prompt` byte-identical\n * to what the driver receives.\n *\n * `emit` runs before `deliver` is even called, so the announcement always\n * precedes that turn's reply events. A caller that must not prompt at all\n * (turn gated off, run already terminal) has to return before calling this —\n * reaching here means the prompt is going out.\n *\n * @docLink packages/factory-assets/flow#orchestrator-turn\n */\nexport async function driveOrchestratorTurn(input: FlowTurnContext & FlowTurnSinks): Promise<void> {\n const prompt = buildOrchestratorPrompt(input.flow, input.execution, input.stimulus);\n input.emit(\n buildFlowPromptEvent({\n flow: input.flow,\n execution: input.execution,\n stimulus: input.stimulus,\n prompt,\n }),\n );\n await input.deliver(prompt);\n}\n","import {\n createDriver,\n EventNormalizer,\n resolveModelTier,\n type AgentConfig,\n type AgentDriver,\n type AgentEvent,\n type ModelTierOverrides,\n} from \"@skaile/workspaces/bridge\";\nimport type { BindingOrigin } from \"./contract/expression.js\";\nimport type { FlowNode } from \"./engine/types.js\";\n\n/** Strict v2 subprompt node admitted by the pure engine. */\nexport type SubpromptFlowNode = FlowNode & {\n run: Extract<NonNullable<FlowNode[\"run\"]>, { kind: \"subprompt\" }>;\n};\n\n/** Resolved execution request for one isolated subprompt call. */\nexport interface SubpromptExecutorRequest {\n /** Available strict v2 subprompt node selected by the pure engine. */\n node: SubpromptFlowNode;\n /**\n * Fully-assembled prompt text — the node's instruction, already interpolated\n * with resolved bindings, plus a JSON-response directive when the node\n * declares an output contract. This is the ONLY input the isolated driver\n * sees: no session conversation, no driver context.\n */\n prompt: string;\n /** Binding values already resolved at the node boundary — carried for parity with the other executor requests. */\n inputs: Record<string, unknown>;\n /** Provenance retained separately from the values sent to the model. */\n inputOrigins: Record<string, BindingOrigin[]>;\n}\n\n/** Captured result of one isolated subprompt driver call. */\nexport interface SubpromptExecutorResult {\n /** Text scraped from the isolated driver's response, accumulated across its stream. */\n text: string;\n}\n\n/** Runtime seam for the subprompt node kind — a runtime-owned, isolated model call. */\nexport interface SubpromptRunner {\n /** Executes one available subprompt node on a fresh, isolated driver instance. */\n execute(request: SubpromptExecutorRequest): Promise<SubpromptExecutorResult>;\n}\n\n/**\n * Non-secret cloud transport settings, field-identical to bridge's\n * `AgentConfig.cloudConfig` — kept inline rather than imported so this file's\n * public option surface doesn't widen with every unrelated `AgentConfig` field.\n */\nexport interface SubpromptCloudConfig {\n region?: string;\n projectId?: string;\n resource?: string;\n baseUrl?: string;\n}\n\n/** Host dependencies for constructing one isolated driver per subprompt call. */\nexport interface SessionSubpromptRunnerOptions {\n /** Driver backend id — the same one the session driver was constructed with (e.g. `\"claude-sdk\"`, `\"omp\"`). */\n driverType: string;\n /** LLM provider — the same value the session driver was constructed with. */\n provider?: string;\n /** Concrete model id the session driver is using; the fallback for every tier absent a configured override. */\n sessionModel?: string;\n /** Working directory for the isolated driver — the already-materialized session workspace. */\n workspaceDir: string;\n /** Pre-resolved API key forwarded to every isolated instance — the same value the session driver received, never re-resolved here. */\n apiKey?: string;\n /** Cloud transport — the same value the session driver was constructed with. Omit (or `\"default\"`) for the provider's native API. */\n cloud?: string;\n cloudConfig?: SubpromptCloudConfig;\n cloudSecrets?: Record<string, string>;\n /** Per-tier model overrides for this deployment. Absent means the provider's built-in tiers apply. */\n modelTierOverrides?: ModelTierOverrides;\n /**\n * Hard ceiling on one isolated call, defaulting to\n * {@link DEFAULT_SUBPROMPT_TIMEOUT_MS}. Independent of `control.timeoutSec`,\n * which is optional and bounds the adapter's *wait* without reaching the\n * driver this class owns.\n */\n timeoutMs?: number;\n}\n\n/**\n * Runs subprompt nodes on isolated `AgentDriver` instances constructed the\n * same way the session driver was — same backend, credentials, and cloud\n * transport — but with no system prompt, no tools, and no conversation\n * history. Each call spins a fresh instance and kills it afterward;\n * isolation comes from the separate instance, not from clearing shared state\n * (`resetSession()` mutates the shared session and is never used here).\n *\n * Credentials reach this class exactly the way they reach the session\n * driver: the two production wiring sites (`run-flow.ts`, `runner/src/serve.ts`)\n * pass through the same resolved `provider`/`apiKey`/`cloud*` values they\n * already computed for `createSessionDriver` — no new resolution path.\n */\nexport class SessionSubpromptRunner implements SubpromptRunner {\n constructor(private readonly options: SessionSubpromptRunnerOptions) {}\n\n async execute(request: SubpromptExecutorRequest): Promise<SubpromptExecutorResult> {\n // Throws on a `small`/`deep` this provider cannot serve, which surfaces as an\n // ordinary node failure — deliberately louder than running an arbitrary model\n // behind an author's explicit cost or quality request.\n const model = resolveModelTier(request.node.run.model, this.options.sessionModel, {\n provider: this.options.provider,\n cloud: this.options.cloud,\n overrides: this.options.modelTierOverrides,\n });\n const config: AgentConfig = {\n cwd: this.options.workspaceDir,\n provider: this.options.provider,\n model,\n // A subprompt is one model call by definition. Backends default to a\n // multi-turn agentic loop (claude-sdk: 15), which would let a node that\n // was asked to classify a string go off and work instead.\n maxTurns: 1,\n ...(this.options.apiKey\n ? { apiKeys: { [this.options.provider ?? \"anthropic\"]: this.options.apiKey } }\n : {}),\n ...(this.options.cloud && this.options.cloud !== \"default\"\n ? { cloud: this.options.cloud }\n : {}),\n ...(this.options.cloudConfig ? { cloudConfig: this.options.cloudConfig } : {}),\n ...(this.options.cloudSecrets ? { cloudSecrets: this.options.cloudSecrets } : {}),\n };\n const driver = await createDriver(this.options.driverType, config);\n try {\n await driver.start();\n const text = await runIsolatedPrompt(\n driver,\n request.prompt,\n this.options.timeoutMs ?? DEFAULT_SUBPROMPT_TIMEOUT_MS,\n );\n return { text };\n } finally {\n // Reached on timeout too, which is the point: the adapter's own\n // `raceWithTimeout` abandons its wait without touching this driver, so\n // without an internal deadline a call that never returns would leave a\n // live backend — holding the workspace, and billing — for the session.\n driver.kill();\n }\n }\n}\n\n/**\n * Ceiling on one isolated subprompt call. Every other model call in the runtime\n * is bounded (`turnTimeoutMs`, `FLOW_TURN_TIMEOUT_MS`); `control.timeoutSec` is\n * optional and has no default, so without this a backend that never emits\n * `agent_end` — one parked on a tool that awaits a human, say — would hang the\n * flow's drain permanently rather than failing the node.\n */\nexport const DEFAULT_SUBPROMPT_TIMEOUT_MS = 5 * 60_000;\n\n/**\n * Send one prompt to a freshly constructed driver and resolve with the text\n * accumulated from its response.\n *\n * `AgentDriver.prompt()` resolves to `void` and emits output only as stream\n * events, so the completion signal and the text both come from the listener,\n * not from `prompt()`'s own promise — mirroring `awaitAgentEnd` in\n * `run-flow.ts` (wait for `agent_end`/`error`, treat `prompt()`'s rejection\n * only as a safety net). Text is accumulated via `EventNormalizer`, the same\n * mechanism the runner uses to turn raw per-driver event shapes (block arrays\n * for claude-sdk, plain-string `message.content` for the echo driver, streamed\n * `message_update` deltas) into normalized `{ type: \"text\" }` events — hand-rolling\n * a narrower parser here would silently drop text on any driver whose raw shape\n * that parser didn't anticipate.\n */\nfunction runIsolatedPrompt(\n driver: AgentDriver,\n prompt: string,\n timeoutMs: number,\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const normalizer = new EventNormalizer();\n let text = \"\";\n let settled = false;\n\n const done = (err?: Error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n driver.off(\"agent-event\", onEvent);\n if (err) reject(err);\n else resolve(text);\n };\n\n const timer = setTimeout(\n () => done(new Error(`isolated subprompt call exceeded ${timeoutMs}ms`)),\n timeoutMs,\n );\n\n const onEvent = (event: AgentEvent) => {\n for (const normalized of normalizer.normalize(event)) {\n if (normalized.type === \"text\") text += normalized.content;\n }\n if (event.type === \"agent_end\") {\n done();\n } else if (event.type === \"error\") {\n done(new Error(event.error));\n }\n };\n\n driver.on(\"agent-event\", onEvent);\n driver.prompt(prompt).catch(done);\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 { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\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\nconst execFileAsync = promisify(execFile);\n\n/**\n * Deadline for the repo-root probe in `connect()`. `rev-parse` is a metadata\n * read on a healthy repo; anything slower means the filesystem under `cwd`\n * is not answering, and `connect()` runs on the session-build handler.\n */\nconst GIT_REV_PARSE_TIMEOUT_MS = 15_000;\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 // Explicit cwd: the previous call inherited the process working directory\n // implicitly, so wherever `skaile serve` happened to be started — possibly\n // inside a FUSE mount — silently became git's search root. `repo_root`\n // makes it configurable; the default is the same directory as before, but\n // now stated rather than inherited.\n const repoDir = String(declaration.options?.repo_root ?? process.cwd());\n let repoRoot: string | null = null;\n try {\n // execFile (not execSync) + explicit timeout + SIGKILL: `connect()` runs\n // on the session-build handler with the WebSocket live, so a git call\n // that never returns used to take the whole runner with it. SIGTERM is\n // not delivered to a `D`-state process on a dead FUSE connection.\n const { stdout } = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: repoDir,\n encoding: \"utf-8\",\n timeout: GIT_REV_PARSE_TIMEOUT_MS,\n killSignal: \"SIGKILL\",\n });\n repoRoot = stdout.trim();\n } catch {}\n return this.makeHandle(declaration, {\n provider,\n defaults,\n deployments: new Map(),\n repoRoot,\n worktreeDir: repoDir,\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 = await 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 // `void`: these pumps run for the process's lifetime and must not be\n // awaited here. `pipeToBuffer` swallows its own stream errors, so neither\n // can reject.\n void pipeToBuffer(proc.stdout, logBuffer);\n void 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 * Everything in this file that touches `mountPath` is asynchronous and\n * deadline-bounded. Inside the agent container that path is the rclone FUSE\n * mount, and a synchronous `execSync` / `fs` call there parks the entire\n * single-threaded event loop in an uninterruptible kernel wait — a hang, not an\n * error, so `try/catch` never fires and the whole session dies (issue #454).\n */\n\nimport { execFile } from \"node:child_process\";\nimport { mkdir, readdir, readFile, rename, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { promisify } from \"node:util\";\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 { tryWithFsDeadline, withFsDeadline } from \"@skaile/workspaces/core\";\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 /**\n * True while a periodic-fetch tick is still running. Now that every tick\n * awaits real git work, a mount slow enough to outlast the interval would\n * otherwise stack overlapping fetch/rebase/pull runs against the same\n * checkout — each one contending for `.git/index.lock`, and each one holding\n * another git child on the wedged mount.\n */\n fetchInFlight?: boolean;\n /** True while an auto-commit tick is still running. Same rationale as {@link fetchInFlight}. */\n autoCommitInFlight?: boolean;\n /**\n * Set by `disconnect()`. Timers are cleared there too, but a tick already\n * awaiting a git child cannot be cancelled — it checks this flag at every\n * resumption point and abandons its remaining work instead of writing to a\n * checkout the manager has already torn down.\n */\n disposed?: boolean;\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\nconst execFileAsync = promisify(execFile);\n\n/**\n * Leading argv carried by every driver-spawned `git` invocation.\n *\n * `safe.directory` is required because the checkout is routinely owned by a\n * different uid than the agent process (bind-mounted host dir, fleet worktree).\n * Passed as argv rather than interpolated into a shell string, so the value\n * needs no quoting and can never be re-split on spaces or quotes.\n */\nfunction gitPrefix(cwd: string): string[] {\n return [\"-c\", `safe.directory=${cwd}`];\n}\n\n/**\n * Spawn `git` with an explicit argv and await its trimmed stdout.\n *\n * Async by construction: these commands run against `mountPath`, which inside\n * the agent container is the rclone FUSE mount. `execSync` there stops the\n * event loop for the whole process, so a wedged mount took down every session\n * rather than one operation (issue #454).\n *\n * `killSignal: 'SIGKILL'` matters as much as the timeout it accompanies. A git\n * child blocked on a dead FUSE connection sits in uninterruptible `D` state,\n * where SIGTERM is never delivered — the default kill would let the timeout\n * expire without ever reaping the child. The timeout bounds the healthy-but-slow\n * case; SIGKILL is what makes it bite on the pathological one.\n */\nasync function runGit(args: string[], options: { cwd?: string; timeout: number }): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", args, {\n encoding: \"utf-8\",\n timeout: options.timeout,\n killSignal: \"SIGKILL\",\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n });\n return stdout.trim();\n}\n\n/**\n * Run a git subcommand inside `cwd`.\n *\n * `args` is an argv array, never a shell string — there is no shell in the\n * chain, so nothing is word-split, glob-expanded, or quote-stripped.\n */\nfunction git(args: string[], cwd: string, timeout = 30_000): Promise<string> {\n return runGit([...gitPrefix(cwd), ...args], { cwd, timeout });\n}\n\n/**\n * Best-effort existence probe, replacing `existsSync`.\n *\n * A deadline expiry and a genuine absence are deliberately collapsed into\n * `false`: every caller here follows up with an idempotent operation (mkdir\n * -p, a rename that is skipped, a fallback read), so \"cannot tell\" and \"not\n * there\" lead to the same safe branch.\n */\nfunction pathExists(path: string): Promise<boolean> {\n return tryWithFsDeadline(`stat ${path}`, () => stat(path).then(() => true), false);\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.\nasync function syncSubmodules(cwd: string): Promise<void> {\n if (!(await pathExists(join(cwd, \".gitmodules\")))) return;\n try {\n await 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. Gates any externally-supplied ref\n * before it reaches a `git` invocation. Accepts a subset of\n * git-check-ref-format(1): forbids whitespace, shell metacharacters, control\n * chars, leading `-` (so the value cannot be misread as a flag), `..`, `@{`,\n * and a trailing `.lock`. Hex SHAs (40 chars) pass through.\n *\n * The shell is gone now that every invocation passes argv, so the\n * metacharacter rejection is defence in depth rather than the only barrier.\n * It stays: the leading-`-` rule still prevents argument-injection, and\n * callers depend on the documented fall-back-to-base behaviour for a\n * rejected ref.\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\nasync function hasChanges(cwd: string): Promise<boolean> {\n const status = await git([\"status\", \"--porcelain\"], cwd);\n return status.length > 0;\n}\n\n/** Run a git subcommand, returning trimmed stdout or `null` on any failure. */\nasync function gitOrNull(args: string[], cwd: string): Promise<string | null> {\n try {\n return await git(args, 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 */\nasync function countAheadBehind(\n cwd: string,\n remoteRef: string,\n): Promise<{ ahead: number; behind: number }> {\n const out = await 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 *\n * Asynchronous since v3: every `git` call it makes runs against a path that may\n * be a network mount, and the synchronous version blocked the event loop there.\n */\nexport async function readGitSyncStatus(\n cwd: string,\n baseBranch: string,\n): Promise<GitSyncStatusResult> {\n const branchRaw = await gitOrNull([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd);\n const branch = branchRaw && branchRaw !== \"HEAD\" ? branchRaw : null;\n\n const dirty = ((await 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 &&\n (await gitOrNull([\"rev-parse\", \"--abbrev-ref\", \"@{upstream}\"], cwd)) !== null;\n\n const upstream = await countAheadBehind(cwd, \"@{upstream}\");\n\n const baseRef = isValidGitRefOrSha(baseBranch) ? `origin/${baseBranch}` : \"origin/main\";\n const base = await countAheadBehind(cwd, baseRef);\n\n const commitSha = await 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 `git` call.\n */\nasync function localBranchExists(branch: string, cwd: string): Promise<boolean> {\n try {\n await 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 the\n * listing fails or misses its deadline (e.g. dir does not exist, wedged\n * mount). The \"fails → empty\" mapping is intentional: the caller is about to\n * `mkdir` and proceed, so a missing dir is functionally equivalent to an\n * empty one.\n */\nasync function isDirEmpty(dir: string): Promise<boolean> {\n const entries = await tryWithFsDeadline<string[]>(`readdir ${dir}`, () => readdir(dir), []);\n return entries.length === 0;\n}\n\nasync function commitAll(cwd: string, message: string): Promise<string | null> {\n if (!(await hasChanges(cwd))) return null;\n await git([\"add\", \"-A\"], cwd);\n return git([\"commit\", \"-m\", 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(await 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 await 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 await 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 await this.stripRemoteInlineToken(targetDir);\n } else {\n await 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 async prepareCheckout(\n targetDir: string,\n url: string,\n branch: string,\n authUrl: string,\n started: number,\n ): Promise<void> {\n try {\n if (await pathExists(join(targetDir, \".git\"))) {\n if (await 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 await this.bootstrapFromOrigin(targetDir, branch, authUrl);\n this.log.info(\"bootstrap ok\", { branch, durationMs: Date.now() - started });\n }\n } else {\n await withFsDeadline(`mkdir ${targetDir}`, () => mkdir(targetDir, { recursive: true }));\n if (await isDirEmpty(targetDir)) {\n this.log.info(\"clone start\", { url, branch });\n // No `cwd`: the clone creates `targetDir`'s content, so it must not\n // run from inside it. Matches the previous execSync invocation.\n await runGit(\n [\n ...gitPrefix(targetDir),\n \"clone\",\n \"--branch\",\n branch,\n \"--single-branch\",\n \"--recurse-submodules\",\n authUrl,\n targetDir,\n ],\n { timeout: 120_000 },\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 await 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 async checkoutSessionBranch(\n state: GitState,\n session: GitSessionConfig,\n targetDir: string,\n ): Promise<void> {\n const sessionBranch = `${session.branchPrefix}${session.slug}`;\n // Reject slug/prefix combinations that don't survive refname validation —\n // notably a leading `-`, which git would read as a flag.\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 (await 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 await 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 await git([\"rev-parse\", \"--verify\", `origin/${sessionBranch}`], targetDir);\n originHasBranch = true;\n } catch {\n /* not on origin */\n }\n\n if (originHasBranch) {\n await git([\"checkout\", \"-B\", sessionBranch, `origin/${sessionBranch}`], targetDir);\n } else if (!(await this.branchFromRef(session, sessionBranch, targetDir))) {\n // No fromRef anchor (or its fetch failed) — branch off the\n // currently-checked-out HEAD (== base branch).\n await 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 await 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 await 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 async branchFromRef(\n session: GitSessionConfig,\n sessionBranch: string,\n targetDir: string,\n ): Promise<boolean> {\n if (!session.fromRef) return false;\n if (!isValidGitRefOrSha(session.fromRef)) {\n // Defense in depth: refuse anything that doesn't pass refname/SHA\n // validation rather than handing an attacker-shaped ref to git.\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 await git([\"fetch\", \"origin\", session.fromRef], targetDir);\n await 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 = await 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 // Set before anything else: a fetch/auto-commit tick already awaiting a git\n // child cannot be cancelled, so it re-reads this at each resumption point\n // and drops its remaining work rather than acting on a dead handle.\n s.disposed = true;\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 await git([\"pull\", \"origin\", s.activeBranch], handle.mountPath!, 60_000);\n await 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 = await commitAll(handle.mountPath!, `skaile: hibernate snapshot`);\n if (!result) return \"Nothing to commit.\";\n\n const sha = await git([\"rev-parse\", \"--short\", \"HEAD\"], handle.mountPath!);\n\n if (lc.pushOnHibernate) {\n try {\n await 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 = await commitAll(handle.mountPath!, `skaile: session close`);\n if (commitResult) {\n const sha = await 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 await 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 await git([\"checkout\", s.branch], handle.mountPath!);\n await git([\"pull\", \"origin\", s.branch], handle.mountPath!, 60_000);\n await syncSubmodules(handle.mountPath!);\n try {\n await git([\"merge\", s.activeBranch], handle.mountPath!);\n } catch {\n const resolved = await 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 await 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 await 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 async initInPlace(targetDir: string, authUrl: string): Promise<void> {\n await git([\"init\"], targetDir, 10_000);\n // Replace any existing origin (idempotent across re-connects).\n try {\n await git([\"remote\", \"remove\", \"origin\"], targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n await git([\"remote\", \"add\", \"origin\", authUrl], targetDir, 5_000);\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 async isInitialisedCheckout(targetDir: string): Promise<boolean> {\n try {\n await 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 async bootstrapFromOrigin(\n targetDir: string,\n branch: string,\n authUrl: string,\n ): Promise<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 await git([\"remote\", \"remove\", \"origin\"], targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n await git([\"remote\", \"add\", \"origin\", authUrl], targetDir, 5_000);\n await git([\"fetch\", \"--depth=1\", \"origin\", branch], targetDir, 120_000);\n await this.preserveConflictingUntracked(targetDir, branch);\n await git([\"checkout\", \"-B\", branch, `origin/${branch}`], targetDir, 30_000);\n await syncSubmodules(targetDir);\n try {\n await 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 async preserveConflictingUntracked(targetDir: string, branch: string): Promise<void> {\n let remoteFiles: string[] = [];\n try {\n remoteFiles = (\n await git([\"ls-tree\", \"-r\", `origin/${branch}`, \"--name-only\"], targetDir, 30_000)\n )\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 (!(await pathExists(fullPath))) continue;\n let dest = `${fullPath}.local`;\n if (await pathExists(dest)) {\n dest = `${fullPath}.local.${Date.now()}`;\n }\n try {\n await withFsDeadline(`rename ${fullPath}`, () => rename(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 async stripRemoteInlineToken(targetDir: string): Promise<void> {\n try {\n const current = await 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 await 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 async rebakeRemoteAuth(targetDir: string, state: GitState): Promise<void> {\n if (!state.token || !state.url.startsWith(\"https://\")) return;\n try {\n await 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 // The tick body is async now, so a mount slow enough to outrun the\n // interval would stack overlapping fetch/rebase/pull runs on one\n // checkout. Skip instead: the next interval retries anyway, and a\n // queue of git children on a wedged mount helps nobody.\n if (s.fetchInFlight) {\n this.log.warn(\"periodic fetch skipped — previous tick still running\", {\n branch: s.activeBranch,\n intervalMs,\n });\n return;\n }\n if (s.disposed) return;\n s.fetchInFlight = true;\n // Nothing awaits this promise, so it must never reject: an unhandled\n // rejection in a timer callback takes the process down, where the old\n // synchronous body merely threw into its own try/catch.\n void this.runPeriodicFetch(s, mountPath)\n .catch((err) => {\n // Periodic fetch is best-effort.\n this.log.debug(\"periodic fetch failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n })\n .finally(() => {\n s.fetchInFlight = false;\n });\n }, intervalMs);\n }\n\n /** One periodic-fetch tick. Bails out at each resumption point once disconnected. */\n private async runPeriodicFetch(s: GitState, mountPath: string): Promise<void> {\n await git([\"fetch\", \"origin\"], mountPath, 60_000);\n if (s.disposed) return;\n if (s.sync.autoRebase && s.activeBranch !== s.branch) {\n try {\n await git([\"rebase\", `origin/${s.branch}`], mountPath, 60_000);\n } catch {\n await this.resolveConflictsOrAbort(s, mountPath, \"rebase\");\n }\n if (s.disposed) return;\n await syncSubmodules(mountPath);\n } else if (s.sync.autoPull) {\n await git([\"pull\", \"origin\", s.activeBranch], mountPath, 60_000);\n if (s.disposed) return;\n await syncSubmodules(mountPath);\n }\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 async resolveConflictsOrAbort(\n s: GitState,\n mountPath: string,\n mode: \"rebase\" | \"merge\",\n ): Promise<boolean> {\n try {\n const conflicted = (await 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 await this.resolveFileConflict(mountPath, file);\n }\n\n // Continue the rebase/merge\n if (mode === \"rebase\") {\n await git([\"-c\", \"core.editor=true\", \"rebase\", \"--continue\"], mountPath, 30_000);\n } else {\n await 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 await git([\"rebase\", \"--abort\"], mountPath);\n } else {\n await 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 async resolveFileConflict(root: string, file: string): Promise<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 = await git([\"show\", `:3:${file}`], root);\n await withFsDeadline(`write ${conflictPath}`, () =>\n writeFile(join(root, conflictPath), theirs),\n );\n } catch {\n // If we can't get theirs, copy the conflicted file as-is\n const fullPath = join(root, file);\n const content = await tryWithFsDeadline<string | null>(\n `read ${file}`,\n () => readFile(fullPath, \"utf-8\"),\n null,\n );\n if (content !== null) {\n await withFsDeadline(`write ${conflictPath}`, () =>\n writeFile(join(root, conflictPath), content),\n );\n }\n }\n\n try {\n // Keep \"ours\" version (stage 2)\n const ours = await git([\"show\", `:2:${file}`], root);\n await withFsDeadline(`write ${file}`, () => writeFile(join(root, file), ours));\n } catch {\n // Strip conflict markers, keeping our sections\n const fullPath = join(root, file);\n const content = await tryWithFsDeadline<string | null>(\n `read ${file}`,\n () => readFile(fullPath, \"utf-8\"),\n null,\n );\n if (content !== null) {\n await withFsDeadline(`write ${file}`, () =>\n writeFile(fullPath, this.stripConflictKeepOurs(content)),\n );\n }\n }\n\n await 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.disposed) return;\n if (s.autoCommitTimer) clearTimeout(s.autoCommitTimer);\n s.autoCommitTimer = setTimeout(() => {\n s.autoCommitTimer = undefined;\n if (s.disposed) return;\n if (s.autoCommitInFlight) {\n // `git add -A` + `git status` walk the whole working tree; on a large\n // cloud-backed one a run can outlast the idle window. Re-arm for\n // another window instead of starting a second competing commit —\n // the pending changes are still there when it fires.\n this.log.warn(\"auto-commit skipped — previous run still in flight\", {\n branch: s.activeBranch,\n });\n this.resetAutoCommitTimer(s, mountPath);\n return;\n }\n s.autoCommitInFlight = true;\n // Nothing awaits this promise — it must never reject (see startPeriodicFetch).\n void this.performAutoCommit(s, mountPath)\n .catch((err) => {\n // Auto-commit is best-effort.\n this.log.debug(\"auto-commit failed\", {\n error: err instanceof Error ? err.message : String(err),\n });\n })\n .finally(() => {\n s.autoCommitInFlight = false;\n });\n }, s.lifecycle.autoCommitIdleMs);\n }\n\n private async performAutoCommit(s: GitState, mountPath: string): Promise<void> {\n try {\n const message = await this.generateCommitMessage(mountPath);\n if (s.disposed) return;\n const result = await commitAll(mountPath, message);\n if (!result || s.disposed) return;\n if (s.lifecycle.pushAfterCommit) {\n try {\n await 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 async generateCommitMessage(mountPath: string): Promise<string> {\n try {\n await git([\"add\", \"-A\"], mountPath);\n const stat = await 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 *\n * Copies a source directory into the mount point, **unless** the host fleet\n * already owns the bind at that target. Every filesystem call here is async and\n * deadline-bounded: `ctx.mountTarget` for the workspace connector is the rclone\n * FUSE mount inside the agent container, and a synchronous call against a\n * wedged FUSE mount parks the whole event loop in an uninterruptible kernel\n * wait — a hang, not an error, so `try/catch` never fires (issue #454).\n */\n\nimport { cp, mkdir, stat } from \"node:fs/promises\";\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 {\n AbstractConnector,\n createFsWatcher,\n ensureFleetMounted,\n isFleetManaged,\n} from \"@skaile/workspaces/connectors\";\nimport { FsDeadlineError, fsDeadlineMs, withFsDeadline } from \"@skaile/workspaces/core\";\n\ninterface LocalState {\n /** Resolved absolute path to the source directory. */\n sourceDir: string;\n /** True when the host fleet owns the bind at the mount target — no copy is ever performed. */\n fleetManaged?: boolean;\n}\n\n/**\n * Deadline multiplier applied to the recursive copy.\n *\n * A single metadata call (`stat`, `mkdir`) that has not returned within the\n * standard deadline is a wedged mount. A recursive copy is different: its\n * honest duration scales with the tree, so the single-op deadline would\n * false-positive on a large — but healthy — source. The multiplier keeps the\n * copy bounded (≈5 min at the 15 s default) without capping legitimate work,\n * and still scales with `SKAILE_FS_DEADLINE_MS`.\n *\n * Note the deadline only bounds the *wait*: `fs.promises.cp` cannot be\n * cancelled, so a losing copy stays pending. That costs one handle, not the\n * event loop — which is why the copy must never run against a fleet-managed\n * mount in the first place (see `connect`).\n */\nconst COPY_DEADLINE_FACTOR = 20;\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 const sourceDir = resolve(String(source));\n\n // Host fleet owns the bind at `targetDir` — mirror the sharepoint/webdav\n // drivers: verify the bind and do nothing else. Refusing the copy is the\n // point. `fs.promises.cp` has no per-file timeout, so an async recursive\n // copy across a wedged FUSE mount still leaves an uncancellable operation\n // pending; on a fleet-managed target the content is already there and the\n // copy would be pure downside (and, source/target overlapping physically,\n // potentially destructive).\n if (isFleetManaged(declaration.id)) {\n this.log.info(\"mount handled by host fleet — skipping local copy\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n this.log.info(\"mount ok\", { targetDir, durationMs: Date.now() - started });\n return this.makeHandle(\n declaration,\n { sourceDir, fleetManaged: true } satisfies LocalState,\n targetDir,\n );\n }\n\n this.log.info(\"mount start\", { source, targetDir });\n await this.assertSourceExists(sourceDir);\n\n await withFsDeadline(`mkdir ${targetDir}`, () => mkdir(targetDir, { recursive: true }));\n await this.copyTree(sourceDir, targetDir);\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 state = handle.state as LocalState;\n\n // `sync` is reachable on demand (and from lifecycle hooks), not only via\n // connect — so it repeats the fleet refusal rather than trusting connect\n // to have been the only entry point.\n if (state.fleetManaged) {\n this.log.debug(\"sync skipped — fleet-managed\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n const src = resolve(state.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 await withFsDeadline(`mkdir ${tgt}`, () => mkdir(tgt, { recursive: true }));\n await this.copyTree(src, tgt);\n\n this.log.debug(\"sync ok\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n /**\n * Fail with the historical message when the source directory is missing,\n * while letting a wedged-mount deadline surface as itself.\n *\n * The old `existsSync` probe could not tell those apart — and on a hung\n * mount it never returned at all.\n */\n private async assertSourceExists(sourceDir: string): Promise<void> {\n try {\n await withFsDeadline(`stat ${sourceDir}`, () => stat(sourceDir));\n } catch (err) {\n if (err instanceof FsDeadlineError) {\n this.log.error(\"connect failed: source path unreadable (deadline)\", err, { sourceDir });\n throw err;\n }\n this.log.error(\"connect failed: source path does not exist\", undefined, { sourceDir });\n throw new Error(`Local source path does not exist: ${sourceDir}`);\n }\n }\n\n /**\n * Recursively copy `src` into `tgt`, skipping the copy when the two overlap.\n *\n * The string-overlap guard is a second line of defence behind the\n * fleet-managed refusal in `connect`: it is a *textual* comparison, so a\n * source that differs textually while overlapping physically (symlink, bind\n * mount, `..` segments already normalised away) still slips past it. It stays\n * because it is free and catches the common container layout.\n */\n private async copyTree(src: string, tgt: string): Promise<void> {\n if (src === tgt || tgt.startsWith(`${src}/`)) return;\n await withFsDeadline(\n `cp -r ${src} -> ${tgt}`,\n () => cp(src, tgt, { recursive: true }),\n fsDeadlineMs() * COPY_DEADLINE_FACTOR,\n );\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 * Every filesystem call here is async and deadline-bounded. `ctx.mountTarget`\n * resolves against the workspace directory, so an s3 connector declared with\n * `mount.target: workspace` writes straight onto the rclone FUSE mount — and\n * `downloadAll` is re-entered from the live `filesystem.sync` face, not only at\n * connect time. A synchronous write there parks the whole event loop in an\n * uninterruptible kernel wait: a hang, not an error, so `try/catch` never fires.\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\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\";\nimport { FsDeadlineError, fsDeadlineMs, withFsDeadline } from \"@skaile/workspaces/core\";\n\nconst s3Pkg = \"@aws-sdk/client-s3\";\n\n/**\n * Deadline multiplier for the whole object-download loop.\n *\n * The single-op deadline catches a wedged mount; a bucket-sized download is\n * different, because its honest duration scales with the object count. The\n * multiplier is spent as **one shared budget** across the loop rather than\n * per object, so a wedged mount cannot turn N objects into N × the deadline.\n * Mirrors `COPY_DEADLINE_FACTOR` in the local driver.\n */\nconst DOWNLOAD_DEADLINE_FACTOR = 20;\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 await withFsDeadline(`mkdir ${targetDir}`, () => mkdir(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 /**\n * Fetch one object's bytes, or `null` when it yields none.\n *\n * S3-side failures are contained here — a single `GetObject` miss is\n * survivable and must not abort the whole sync. Local filesystem failures are\n * deliberately *not* in scope: see the write path in {@link downloadAll}.\n */\n private async fetchObject(\n s3Mod: S3SdkModule,\n state: S3State,\n key: string,\n ): Promise<Buffer | null> {\n try {\n const resp = await state.client.send(\n new s3Mod.GetObjectCommand({ Bucket: state.bucket, Key: key }),\n );\n // transformToByteArray preserves binary content; transformToString would\n // UTF-8 decode and corrupt non-text objects.\n const bytes = await resp.Body?.transformToByteArray();\n return bytes == null ? null : Buffer.from(bytes);\n } catch (err) {\n this.log.warn(\"object download failed\", {\n key,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\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. One shared filesystem budget for the whole loop, and\n // a per-directory memo so a thousand objects under one prefix cost one\n // `mkdir` round-trip on the mount instead of a thousand.\n let filesWritten = 0;\n let bytesTransferred = 0;\n const budgetMs = fsDeadlineMs() * DOWNLOAD_DEADLINE_FACTOR;\n const deadlineAt = Date.now() + budgetMs;\n const created = new Set<string>();\n\n for (const { key, relPath } of entries) {\n // Out of budget: fail loudly. Returning a short `filesWritten` would\n // present a half-populated mount as a completed sync.\n if (deadlineAt - Date.now() <= 0) {\n throw new FsDeadlineError(`downloadAll ${targetDir}`, budgetMs);\n }\n\n const body = await this.fetchObject(s3Mod, state, key);\n if (body == null) continue;\n\n // No catch around the local writes: unlike an S3 miss, ENOSPC / EACCES /\n // EROFS / a missed deadline says the mount cannot take the rest of the\n // bucket either — swallowing it is how a half-populated mount reads as done.\n const localPath = join(targetDir, relPath);\n const parent = dirname(localPath);\n if (!created.has(parent)) {\n await withFsDeadline(\n `mkdir ${parent}`,\n () => mkdir(parent, { recursive: true }),\n deadlineAt - Date.now(),\n );\n created.add(parent);\n }\n await withFsDeadline(\n `writeFile ${localPath}`,\n () => writeFile(localPath, body),\n deadlineAt - Date.now(),\n );\n filesWritten++;\n bytesTransferred += body.byteLength;\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 * `options.path` is declaration-supplied, so a `.db` file under the workspace is\n * plausible configuration — which puts it on the rclone FUSE mount inside the\n * agent container. Both the load and the flush are therefore async and\n * deadline-bounded: a synchronous read/write against a wedged mount parks the\n * whole event loop in an uninterruptible kernel wait (issue #454).\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\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\";\nimport { withFsDeadline } from \"@skaile/workspaces/core\";\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 {\n // One read instead of exists-then-read: a second trip to a possibly\n // unresponsive mount buys nothing, and ENOENT is itself the \"create it\"\n // signal. Anything else — a deadline miss, EACCES — must fail, because\n // opening a blank database would make the disconnect flush overwrite a\n // real file that was merely unreachable.\n let buffer: Buffer | undefined;\n try {\n buffer = await withFsDeadline(`readFile ${dbPath}`, () => readFile(dbPath));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n this.log.error(\"connect failed: db path unreadable\", err, { dbPath });\n throw err;\n }\n if (isReadonly) {\n this.log.error(\"connect failed: db file not found\", undefined, { dbPath });\n throw new Error(`SQLite database not found: ${dbPath}`);\n }\n }\n db = buffer ? new SQL.Database(buffer) : new SQL.Database();\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 await 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. Best-effort, but no\n * longer silent: a dropped flush on a wedged mount is lost data, so it warns. */\n private async saveToDisk(db: any, dbPath: string): Promise<void> {\n try {\n const data = db.export();\n const buffer = Buffer.from(data);\n await withFsDeadline(`writeFile ${dbPath}`, () => writeFile(dbPath, buffer));\n } catch (err) {\n this.log.warn(\"db flush failed — changes not persisted\", {\n dbPath,\n error: err instanceof Error ? err.message : String(err),\n });\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 await 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, type Stats } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\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 { withFsDeadline } from \"@skaile/workspaces/core\";\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 = await 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 is async now; a rejection would otherwise be an\n // unhandled rejection that leaves the socket open forever.\n void serveStaticFile(serveDir, req.url ?? \"/\", res).catch(() => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n res.end();\n });\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 * `stat` under a deadline, collapsing every failure — missing, unreadable, or\n * an unresponsive mount — to `undefined`. All three mean the same thing here:\n * there is nothing servable at this path.\n */\nasync function statOrNull(filePath: string): Promise<Stats | undefined> {\n try {\n return await withFsDeadline(`stat ${filePath}`, () => stat(filePath));\n } catch {\n return undefined;\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 *\n * The path is derived from the request URL, so this is the hottest untrusted\n * filesystem entry point in the connector. It used to issue four synchronous\n * `existsSync`/`statSync` calls per request; if `rootDir` sat on a network\n * mount — which the containment guard says nothing about, it only proves the\n * path stays *inside* `rootDir` — a single request could park the event loop.\n * Now: one deadline-bounded async `stat` per candidate path.\n */\nasync function serveStaticFile(\n rootDir: string,\n reqUrl: string,\n res: ServerResponse,\n): Promise<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 // A trailing slash is a directory request by definition — no stat needed to\n // learn that, so the index.html rewrite happens before touching the disk.\n let stats: Stats | undefined;\n if (pathname.endsWith(\"/\")) {\n filePath = join(filePath, \"index.html\");\n stats = await statOrNull(filePath);\n } else {\n stats = await statOrNull(filePath);\n if (stats?.isDirectory()) {\n filePath = join(filePath, \"index.html\");\n stats = await statOrNull(filePath);\n }\n }\n if (!stats?.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 * `options.definitionPath` is declaration-supplied, so a machine file under the\n * workspace is plausible configuration — which puts it on the rclone FUSE mount\n * inside the agent container. The load is therefore async and deadline-bounded:\n * a synchronous read against a wedged mount parks the whole event loop in an\n * uninterruptible kernel wait (issue #454).\n */\n\nimport { readFile } from \"node:fs/promises\";\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\";\nimport { FsDeadlineError, withFsDeadline } from \"@skaile/workspaces/core\";\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 // Read directly instead of probing first: the exists check could not tell\n // \"absent\" from \"mount not answering\", and on a hung mount it never\n // returned at all. A deadline miss keeps its own message.\n let raw: string;\n try {\n raw = await withFsDeadline(`readFile ${defPath}`, () => readFile(defPath, \"utf-8\"));\n } catch (err) {\n if (err instanceof FsDeadlineError) throw err;\n throw new Error(`Machine definition not found: ${defPath}`);\n }\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 { mkdir } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type { CatalogEntry } from \"@skaile/workspaces/core\";\nimport { withFsDeadline } 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 // The target can be a live FUSE mount (`/skaile/workspace`), so this must\n // stay async + bounded. `recursive: true` is idempotent — an exists probe\n // would only add a second syscall on the same risky path.\n await withFsDeadline(`mkdir ${absPath}`, () => mkdir(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 // Roll back what this pass newly claimed when the loop aborts: nothing\n // connected, and a stale claim would fail the corrected retry. Paths an\n // active connector already owns were never claimed here, so they survive.\n const claimed: string[] = [];\n try {\n for (const decl of declarations) {\n if (decl.mount == null) continue;\n const absPath = this.resolveMountTarget(decl);\n const isNew = !this.mountTargets.has(absPath);\n this.reserveMountTarget(decl.id, absPath);\n if (isNew) claimed.push(absPath);\n }\n } catch (err) {\n for (const path of claimed) this.mountTargets.delete(path);\n throw err;\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 // Reserved by buildConnectContext (or connectAll's preflight) but never\n // entered `active`, so disconnect() can't reach it — release or the path\n // stays blocked. A live `active` entry means another attempt owns it.\n if (!this.active.has(decl.id)) this.releaseMountTarget(decl.id);\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 try {\n // Inside the try on purpose: buildConnectContext reserves the mount target\n // and then creates it with a deadline-bounded mkdir. That mkdir can now\n // throw (it used to hang forever on a wedged mount), and a throw from out\n // here would sail past the catch below and leak the reservation.\n const ctx = await this.buildConnectContext(declaration, connector);\n\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 // buildConnectContext or connect() failed after the target was reserved but\n // before the connector entered `active`, so disconnect() can't reach it —\n // release 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// ── Flow agent-tool SDK server ──────────────────────────────────────────────────\n\n/**\n * Agent-facing flow operations exposed as first-class SDK tools. Host-only ops\n * (`applyApproval`, `applyInput`, `cancel`, `setAutonomousMode`, `retryNode`,\n * `hydrate`, `start`) are intentionally NOT exposed to the agent — the agent\n * must not approve its own gates, restart, or cancel its own run. Keep in sync\n * with `FlowAdapter.describeOperations` (the read/agent-write ops only).\n */\nconst FLOW_AGENT_OPS: ReadonlySet<string> = new Set([\n \"get_available\",\n \"get_state\",\n \"get_globals\",\n \"build_handoff\",\n \"validate_node\",\n \"start_node\",\n \"request_approval\",\n \"request_input\",\n \"complete_node\",\n \"skip_node\",\n \"fail_node\",\n]);\n\n/**\n * Build an in-process MCP server exposing the flow connector's agent operations\n * as **one callable tool per operation** (`start_node`, `complete_node`,\n * `request_approval`, …), surfaced to the model as\n * `mcp__skaile-flow__<op>`.\n *\n * The generic `buildSdkConnectorTools` never emits per-operation tools — a\n * claude-sdk session with shell access gets no `connector_exec` tool either —\n * so a real agent could not discover or invoke the flow node-advancement tools\n * the orchestrator prompt tells it to call (workspaces#399). This dedicated\n * server closes that gap for the one connector whose operations ARE the agent's\n * turn surface. Each tool handler dispatches to `manager.executeOp(connectorId,\n * op, args)`.\n *\n * @param manager - Connected unified `ConnectorManager`.\n * @param connectorId - The active flow connector id (`flow:<runId>`).\n * @param options - Optional SDK/Zod overrides.\n * @returns MCP server config object, or `null` if the SDK is unavailable or the\n * connector exposes no agent operations.\n * @docLink packages/connectors/api-reference#build-sdk-flow-tools\n * @since 3.6.0\n */\nexport async function buildSdkFlowTools(\n manager: ConnectorManager,\n connectorId: string,\n options?: ConnectorToolOptions,\n): Promise<object | null> {\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 const z: any = options?.z ?? zStatic;\n\n let ops: ReturnType<ConnectorManager[\"getOperations\"]>;\n try {\n ops = manager.getOperations(connectorId);\n } catch {\n return null;\n }\n const agentOps = ops.filter((op) => FLOW_AGENT_OPS.has(op.name));\n if (agentOps.length === 0) return null;\n\n const tools = agentOps.map((op) => ({\n name: op.name,\n description: op.description,\n inputSchema: buildOperationInputSchema(op.args, z),\n handler: async (input: Record<string, unknown>) => {\n try {\n const result = await manager.executeOp(connectorId, op.name, input ?? {});\n return { content: [{ type: \"text\" as const, text: result || \"(ok)\" }] };\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 return sdk.createSdkMcpServer({ name: \"skaile-flow\", tools });\n}\n\n/** Build a Zod input-schema record from an operation's argument descriptors. */\nfunction buildOperationInputSchema(\n args: Array<{ name: string; description: string; type: string; required: boolean }>,\n z: any,\n): Record<string, unknown> {\n const shape: Record<string, unknown> = {};\n for (const arg of args) {\n let schema: any;\n switch (arg.type) {\n case \"boolean\":\n schema = z.boolean();\n break;\n case \"number\":\n schema = z.number();\n break;\n case \"json\":\n schema = z.json();\n break;\n default:\n schema = z.string();\n }\n if (arg.description) schema = schema.describe(arg.description);\n if (!arg.required) schema = schema.optional();\n shape[arg.name] = schema;\n }\n return shape;\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, readFile, realpath, stat } from \"node:fs/promises\";\n\n/** Kernel mount table consulted by {@link isMountpoint}. */\nconst MOUNTINFO_PATH = \"/proc/self/mountinfo\";\n\n/**\n * Test-only redirect of the mount table at a fixture, so driver tests can\n * simulate a live bind without root.\n *\n * Gated on vitest deliberately: read unconditionally, a stray\n * `SKAILE_FLEET_MOUNTINFO_PATH` in a real deployment would point the check at\n * a missing file, drop it back to the existence-only fallback, and silently\n * reintroduce the exact failure this module exists to catch.\n */\nfunction testMountinfoOverride(): string | undefined {\n return process.env.VITEST ? process.env.SKAILE_FLEET_MOUNTINFO_PATH : undefined;\n}\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 * Decode the octal escapes (`\\040` space, `\\011` tab, `\\012` newline, `\\134`\n * backslash) the kernel applies to path fields in mountinfo.\n */\nfunction decodeMountinfoPath(field: string): string {\n return field.replace(/\\\\(\\d{3})/g, (_, octal: string) =>\n String.fromCharCode(Number.parseInt(octal, 8)),\n );\n}\n\n/**\n * Is `dir` an actual mount point, per the kernel mount table?\n *\n * Returns `null` when the table cannot be read (non-Linux dev hosts) so the\n * caller degrades to the weaker existence check instead of failing a mount it\n * has no way to inspect.\n *\n * Deliberately not an `st_dev` comparison against the parent: git-fleet\n * worktrees are bind mounts from the same filesystem, so their device id\n * matches the parent's and the check would report a live bind as missing.\n */\nasync function isMountpoint(dir: string, mountinfoPath: string): Promise<boolean | null> {\n let table: string;\n try {\n table = await readFile(mountinfoPath, \"utf8\");\n } catch {\n return null;\n }\n const target = await realpath(dir);\n for (const line of table.split(\"\\n\")) {\n // Field 5 (1-indexed) is the mount point, relative to the process root.\n const mountPoint = line.split(\" \")[4];\n if (mountPoint !== undefined && decodeMountinfoPath(mountPoint) === target) return true;\n }\n return false;\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 verify the directory exists, is readable, and is genuinely a mount\n * point. Polls briefly to absorb any startup race between container start\n * and the kernel 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 *\n * The mountpoint assertion is what catches a target mismatch: when the driver\n * and the host fleet disagree about where the bind lands, the driver's own\n * target dir exists and reads fine as an empty local directory, and without\n * this check the session silently runs against container disk instead of the\n * remote.\n */\nexport async function ensureFleetMounted(\n dir: string,\n log: { info: (msg: string, data?: object) => void },\n options?: { timeoutMs?: number; pollIntervalMs?: number; mountinfoPath?: string },\n): Promise<void> {\n const timeoutMs = options?.timeoutMs ?? 3_000;\n const pollIntervalMs = options?.pollIntervalMs ?? 100;\n const mountinfoPath = options?.mountinfoPath ?? testMountinfoOverride() ?? MOUNTINFO_PATH;\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 if ((await isMountpoint(dir, mountinfoPath)) === false) {\n throw new Error(\n `fleet mountpoint ${dir} is a plain directory, not a mount — the host bind is absent or landed on a different path`,\n );\n }\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 { readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { tryWithFsDeadline } from \"@skaile/workspaces/core\";\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 *\n * `rootDir` is a connector mount path, which in the agent container can be an\n * rclone FUSE mount — hence async + deadline-bounded, with a missing or\n * unreadable file degrading to \"no extra ignores\".\n */\nasync function parseGitignore(rootDir: string): Promise<Array<(path: string) => boolean>> {\n const gitignorePath = join(rootDir, \".gitignore\");\n const content = await tryWithFsDeadline<string | null>(\n `read ${gitignorePath}`,\n () => readFile(gitignorePath, \"utf-8\"),\n null,\n );\n if (content === null) return [];\n\n try {\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 = await 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 * Every git invocation here is async and carries an explicit timeout. These\n * helpers are reachable from agent-invokable connector operations (the\n * static-server `serve`/`stop` ops), so a git call whose `cwd` sits on a wedged\n * mount used to park the runner's single event loop indefinitely.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { withFsDeadline } from \"@skaile/workspaces/core\";\n\nconst execFileAsync = promisify(execFile);\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\n/**\n * Deadline for metadata-only git queries (`rev-parse`, `worktree list`). These\n * read `.git` and return immediately on a healthy repository; anything slower\n * means the filesystem under `cwd` is not answering.\n */\nexport const GIT_QUERY_TIMEOUT_MS = 15_000;\n\n/**\n * Deadline for git operations that touch the working tree (`worktree add`,\n * `worktree remove`, `worktree prune`). Checking out a large tree is legitimate\n * work, so the budget is wider than a query's.\n */\nexport const GIT_WORKTREE_TIMEOUT_MS = 120_000;\n\n/**\n * Run `git` and return trimmed stdout.\n *\n * `timeoutMs` has no default **by design**: the previous `execSync` form\n * carried no timeout at all, and every call site inherited that. Requiring the\n * bound makes an unbounded git call unrepresentable.\n *\n * Killed with `SIGKILL`, not `SIGTERM` — a process blocked in an\n * uninterruptible kernel wait (`D` state, e.g. a git call whose `cwd` sits on a\n * dead FUSE connection) never runs a `SIGTERM` handler, so a graceful signal\n * would leave the deadline unenforced. Note the residual case this cannot fix:\n * a truly `D`-state child ignores `SIGKILL` too, which is exactly why the call\n * is also async — the event loop stays free either way.\n *\n * @param args - Argv after `git`. Array form, so no shell quoting is involved.\n * @param cwd - Working directory for the git invocation.\n * @param timeoutMs - Wall-clock limit for the child.\n */\nasync function git(args: string[], cwd: string, timeoutMs: number): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", args, {\n cwd,\n encoding: \"utf-8\",\n timeout: timeoutMs,\n killSignal: \"SIGKILL\",\n });\n return stdout.trim();\n}\n\nasync function resolveRef(repoRoot: string, ref: string): Promise<string> {\n return git([\"rev-parse\", \"--verify\", ref], repoRoot, GIT_QUERY_TIMEOUT_MS);\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, or when git does not answer\n * within {@link GIT_QUERY_TIMEOUT_MS}.\n * @docLink packages/connectors/api-reference#find-git-root\n */\nexport async function findGitRoot(fromDir: string): Promise<string> {\n return git([\"rev-parse\", \"--show-toplevel\"], fromDir, GIT_QUERY_TIMEOUT_MS);\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 = await resolveRef(opts.repoRoot, opts.ref);\n const label = opts.label ?? sha.slice(0, 8);\n const wtPath = resolve(opts.baseDir, label);\n\n // `recursive: true` is already a no-op on an existing dir, so the former\n // existsSync probe only bought a second filesystem round-trip.\n await withFsDeadline(`mkdir ${opts.baseDir}`, () => mkdir(opts.baseDir, { recursive: true }));\n\n await git([\"worktree\", \"add\", wtPath, sha, \"--detach\"], opts.repoRoot, GIT_WORKTREE_TIMEOUT_MS);\n worktreeRegistry.register(wtPath, opts.owner);\n\n let branch: string | undefined;\n try {\n const refName = await git(\n [\"rev-parse\", \"--abbrev-ref\", opts.ref],\n opts.repoRoot,\n GIT_QUERY_TIMEOUT_MS,\n );\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 await git(\n [\"worktree\", \"remove\", wtPath, \"--force\"],\n opts.repoRoot,\n GIT_WORKTREE_TIMEOUT_MS,\n );\n } catch {\n // May already be gone\n }\n await git([\"worktree\", \"prune\"], opts.repoRoot, GIT_WORKTREE_TIMEOUT_MS);\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 = await git([\"worktree\", \"list\", \"--porcelain\"], repoRoot, GIT_QUERY_TIMEOUT_MS);\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 ownership roles:\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` / `get_globals` /\n * `build_handoff`).\n * - The **runtime** drains functions through `NodeExecutor` and parks first-class\n * gates without executing a node or starting a model.\n * - The **host** runner applies out-of-turn\n * mutations (`applyApproval`, `applyInput`, `retryNode`,\n * `setAutonomousMode`, `cancel`, `hydrate`) in response to platform actions,\n * subscribes to `onChange` for persistence, and uses the session stimulus bus\n * to serialize permitted model turns.\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.\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 CheckEvidence,\n FlowExecution,\n FlowExecutionStatus,\n InputRequest,\n InputSchema,\n NodeError,\n NodeExecution,\n NodeExecutionSnapshot,\n NodeOutput,\n NodeOutputCorrection,\n NodeStatus,\n} from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport type { BindingOrigin } from \"./contract/expression.js\";\nimport { coerceInputSchema, INPUT_SCHEMA_SHAPES_HINT } from \"./contract/input-schema.js\";\nimport { parseFlowDefinition } from \"./contract/normalize.js\";\nimport {\n appendAttempt,\n computeFlowStateFromSnapshots,\n countFailedAttempts,\n deriveCheckEvidence,\n type FlowDefinition,\n type FlowNode,\n getConsumedOutputSchema,\n hasAutomaticRetryBudget,\n interpolateNodeInstruction,\n isBlocking,\n remainingActiveExecutionMs,\n resolveNodeBindings,\n resolveTerminalFailureStatus,\n validateConsumedNodeOutput,\n} from \"./engine/index.js\";\nimport {\n deterministicNodeKindLabel,\n flowDefaults,\n isAgentNode,\n isActiveRuntimeNode,\n isCheckNode,\n isFunctionNode,\n isGateNode,\n isRouterNode,\n isSubFlowNode,\n isSubpromptNode,\n nodeAssets,\n nodeInstruction,\n nodeIsOptional,\n nodeLabel,\n nodeRequiresApproval,\n} from \"./engine/node-shape.js\";\nimport {\n availableRouterFrontier,\n evaluateRouterSelection,\n persistedRouterSelection,\n planRouterSkips,\n routerSelectionOutput,\n unsettledRouterBranchIds,\n type RouterSettlement,\n} from \"./engine/router-settlement.js\";\nimport {\n ABORT_SIGKILL_GRACE_MS,\n type DeterministicFlowNode,\n type NodeExecutor,\n type NodeExecutorResult,\n} from \"./node-executor.js\";\nimport type {\n InlineSubFlowOperationTarget,\n InlineSubFlowProjection,\n InlineSubFlowRunner,\n} from \"./sub-flow-runner.js\";\nimport type { SubpromptFlowNode, SubpromptRunner } from \"./subprompt-runner.js\";\nimport {\n renderStimulusPrompt,\n renderSubpromptPrompt,\n type TurnStimulus,\n} 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 for host persistence and event forwarding. */\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 * The runner enables this for the serialized session-stimulus turn driver.\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 /** 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 /** Deterministic runtime backed by the already-materialized session workspace. */\n nodeExecutor?: NodeExecutor;\n /** Isolated model-call runtime for subprompt nodes — a second driver instance, never the session driver. */\n subpromptRunner?: SubpromptRunner;\n /** Host-owned inline child lifecycle, backed by the existing materialized session. */\n inlineSubFlowRunner?: InlineSubFlowRunner;\n /** Transient child operation routes keyed by their owning parent sub-flow node. */\n inlineOperationTargets: Map<string, InlineSubFlowOperationTarget>;\n /** Non-durable provenance overrides for values received from a parent sub-flow binding. */\n flowInputOrigins?: Record<string, BindingOrigin[]>;\n /** Non-durable ancestry used to reject recursive inline delegation. */\n inlineSubFlowAncestry: string[];\n /** Non-durable ownership epoch for results returned by in-flight inline children. */\n executionGeneration: number;\n /**\n * Non-durable opportunistic wake timer for agent-node deadline re-evaluation.\n * The derived deadline (see `engine/node-deadline.ts`) is the source of truth;\n * this timer's only job is to trigger a re-evaluation call while nothing else\n * would (a genuinely hung agent turn has no other event to react to). Rearmed\n * after every mutation, `connect()`, and `hydrate()`; cleared on `disconnect()`.\n */\n wakeTimer: ReturnType<typeof setTimeout> | null;\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`).\n */\n stimulusBus?: FlowAdapterStimulusBus;\n /**\n * 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 `onChange` callback fires. Default: `false`.\n */\n useBusForStimulus?: boolean;\n /** Runtime for function nodes. Required before deterministic nodes are drained. */\n nodeExecutor?: NodeExecutor;\n /** Runtime for subprompt nodes. Required before subprompt nodes are drained. */\n subpromptRunner?: SubpromptRunner;\n /** Host lifecycle used to resolve and drive inline child flows in the current session. */\n inlineSubFlowRunner?: InlineSubFlowRunner;\n /** @internal Provenance for child flow inputs, retained only in the live adapter. */\n flowInputOrigins?: Record<string, BindingOrigin[]>;\n /** @internal Flow identities from the root through this transient child. */\n inlineSubFlowAncestry?: string[];\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nconst now = () => new Date().toISOString();\nconst AGENT_INLINE_OPERATIONS = new Set([\n \"get_available\",\n \"get_state\",\n \"get_globals\",\n \"build_handoff\",\n \"validate_node\",\n \"start_node\",\n \"request_approval\",\n \"request_input\",\n \"complete_node\",\n \"skip_node\",\n \"fail_node\",\n]);\n\n/** Raised by {@link raceWithTimeout} when the timeout side of the race wins. */\nclass NodeTimeoutError extends Error {}\n\n/**\n * Races `promise` against a `ms`-millisecond timer. Portable — plain\n * `setTimeout`/`clearTimeout`, no `Bun.spawn`/`Bun.serve`, safe under fake\n * timers.\n *\n * Does not cancel `promise` — it stops *waiting* on it. Cancelling is the\n * caller's job, on the seams that support it: the deterministic branch aborts\n * its per-attempt `AbortController` (which `SessionNodeExecutor` honors by\n * killing the process group) and the sub-flow branch cancels its inline target.\n * The subprompt seam still has none, so a timed-out subprompt keeps running.\n * A late settlement is swallowed here\n * (attached `.catch(() => {})`) so it can never surface as an unhandled\n * rejection or write state; the caller additionally re-checks\n * `executionGeneration` after this resolves so a late settlement that\n * raced past the timeout can never be mistaken for the timeout's own\n * result.\n *\n * @docLink packages/factory-assets/flow#race-with-timeout\n */\nfunction raceWithTimeout<T>(promise: Promise<T>, ms: number, timeoutMessage: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new NodeTimeoutError(timeoutMessage));\n promise.catch(() => {});\n }, ms);\n timer.unref?.();\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n}\n\n/**\n * How long an aborted deterministic attempt may take to die before the next one\n * is allowed to start. Outlasts the executor's own SIGTERM→SIGKILL escalation,\n * since a shorter budget would let the retry race the process it just killed.\n */\nconst ABORTED_ATTEMPT_SETTLE_MS = ABORT_SIGKILL_GRACE_MS + 1_000;\n\n/**\n * Resolves when `promise` settles or `ms` elapses, whichever is first, and\n * never rejects. Bounded on purpose: an executor that ignores its abort signal\n * must not be able to wedge the drain loop waiting for work it never stops.\n */\nfunction settleWithin(promise: Promise<unknown>, ms: number): Promise<void> {\n return new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n const settled = () => {\n clearTimeout(timer);\n resolve();\n };\n promise.then(settled, settled);\n });\n}\n\nfunction mergeInteractionHistory<T extends { requestedAt: string }>(\n history: T[],\n interaction: T | undefined,\n): T[] {\n if (!interaction) return history;\n const next = [...history];\n const index = next.findIndex((entry) => entry.requestedAt === interaction.requestedAt);\n if (index >= 0) next[index] = interaction;\n else next.push(interaction);\n return next;\n}\n\nfunction normalizeRuntimeFlow(authored: unknown): FlowDefinition {\n const parsed = parseFlowDefinition(authored);\n if (parsed.ok) return parsed.data;\n const details = parsed.errors\n .map((issue) => `${issue.path || \"<root>\"}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`FlowAdapter: invalid flow definition: ${details}`);\n}\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 outputHistory: [],\n };\n}\n\n/** Build a prototype-safe node map so every valid authored node ID remains an own key. */\nfunction nodeExecutionRecord(\n entries: Iterable<readonly [string, NodeExecution]> = [],\n): Record<string, NodeExecution> {\n const record = Object.create(null) as Record<string, NodeExecution>;\n for (const [nodeId, execution] of entries) record[nodeId] = execution;\n return record;\n}\n\n/**\n * Build the starting FlowExecution snapshot for a flow definition — every\n * active runtime node begins as `not_started`; engine recompute promotes it.\n */\nfunction buildInitialExecution(\n flowDef: FlowDefinition,\n seed: { runId: string; startedBy: string; autonomousMode?: boolean },\n): FlowExecution {\n const nodes = nodeExecutionRecord();\n for (const n of flowDef.nodes) {\n if (isActiveRuntimeNode(n)) {\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 failedPreconditions: exec.failedPreconditions,\n inputOrigins: exec.inputOrigins,\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\nfunction prepareExecutionSnapshot(\n flowDef: FlowDefinition,\n execution: FlowExecution,\n): FlowExecution {\n let json: string;\n try {\n json = JSON.stringify(execution);\n } catch {\n throw new Error(\"FlowAdapter: execution snapshot must be a JSON object\");\n }\n const cloned = z.json().safeParse(JSON.parse(json));\n if (!cloned.success || typeof cloned.data !== \"object\" || Array.isArray(cloned.data)) {\n throw new Error(\"FlowAdapter: execution snapshot must be a JSON object\");\n }\n const snapshot = cloned.data as unknown as FlowExecution;\n for (const [nodeId, node] of Object.entries(snapshot.nodes ?? {})) {\n if (node.status !== \"complete\") continue;\n const definitionNode = flowDef.nodes.find(({ id }) => id === nodeId);\n if (\n definitionNode &&\n isRouterNode(definitionNode) &&\n !persistedRouterSelection(definitionNode, node)\n ) {\n throw new Error(`FlowAdapter: invalid execution output for router node ${nodeId}`);\n }\n const validation = validateConsumedNodeOutput(flowDef, nodeId, node.output?.fields);\n if (!validation.valid) {\n throw new Error(\n `FlowAdapter: invalid execution output for node ${nodeId}: ${validation.issues.join(\"; \")}`,\n );\n }\n }\n const nodes = nodeExecutionRecord(Object.entries(snapshot.nodes ?? {}));\n for (const node of flowDef.nodes) {\n const existing = nodes[node.id];\n // A subprompt's in-flight isolated driver call is exactly as unresumable\n // across a cold hydrate as an inline sub-flow's live child — reset it back\n // to `not_started` so admission restarts it rather than leaving it wedged\n // `running` forever. It only ever reaches `running` here (never the two\n // interaction states), but sharing the condition costs nothing.\n if (\n (isSubFlowNode(node) || isSubpromptNode(node)) &&\n existing &&\n [\"running\", \"awaiting_approval\", \"awaiting_input\"].includes(existing.status)\n ) {\n nodes[node.id] = {\n ...existing,\n status: \"not_started\",\n startedAt: undefined,\n completedAt: undefined,\n output: undefined,\n approval: undefined,\n input: undefined,\n error: undefined,\n // Moves with `output`: the node restarts from scratch, so origins that\n // described the discarded attempt would be stale.\n inputOrigins: undefined,\n };\n continue;\n }\n if (isActiveRuntimeNode(node) && !Object.hasOwn(nodes, node.id)) {\n nodes[node.id] = emptyNode(node.id);\n }\n }\n snapshot.nodes = nodes;\n return snapshot;\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 nodeIsOptional(findNode(flowDef, nodeId));\n}\n\n/**\n * A mandatory agent-node approval policy always requires a human decision —\n * autonomous mode cannot auto-complete the agent node from `running`.\n */\nfunction requiresAgentApproval(flowDef: FlowDefinition, nodeId: string): boolean {\n return nodeRequiresApproval(findNode(flowDef, nodeId));\n}\n\n// ── Adapter ─────────────────────────────────────────────────────────────────\n\n/**\n * Connector adapter that holds and drives a live `FlowExecution`.\n *\n * The agent owns agent-node tools, the runtime drains function nodes and parks first-class\n * gates, the host applies durable human decisions, and the runner subscribes to state changes\n * to decide whether a model turn is needed. Every mutation runs through one recomputation\n * pipeline and publishes the resulting snapshot.\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 if (!options.flow) throw new Error(\"FlowAdapter requires options.flow (FlowDefinition)\");\n const flowDef = normalizeRuntimeFlow(options.flow);\n\n const execution = options.execution\n ? prepareExecutionSnapshot(flowDef, 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 nodeExecutor: options.nodeExecutor,\n subpromptRunner: options.subpromptRunner,\n inlineSubFlowRunner: options.inlineSubFlowRunner,\n inlineOperationTargets: new Map(),\n flowInputOrigins: options.flowInputOrigins,\n inlineSubFlowAncestry: options.inlineSubFlowAncestry ?? [flowDef.id],\n executionGeneration: 0,\n wakeTimer: null,\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 const handle = this.makeHandle(declaration, state);\n this.rearmWakeTimer(handle);\n return handle;\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n const state = this.s(handle);\n state.executionGeneration += 1;\n this.clearWakeTimer(state);\n await this.cancelInlineTargets(state);\n handle.status = \"disconnected\";\n }\n\n private async cancelInlineTargets(s: FlowAdapterState): Promise<void> {\n const targets = [...s.inlineOperationTargets.values()];\n s.inlineOperationTargets.clear();\n for (const target of targets) await target.cancel();\n }\n\n private projectInlineInteraction(\n handle: ConnectorHandle,\n parentNodeId: string,\n projection: InlineSubFlowProjection,\n ): void {\n this.mutate(\n handle,\n (s) => {\n const node = s.execution.nodes[parentNodeId];\n assertLegal(node, `inline projection: unknown parent node ${parentNodeId}`);\n s.execution.nodes[parentNodeId] = {\n ...node,\n status: projection.status,\n approval: projection.approval ?? node.approval,\n approvalHistory: mergeInteractionHistory(node.approvalHistory, projection.approval),\n input: projection.input ?? node.input,\n inputHistory: mergeInteractionHistory(node.inputHistory, projection.input),\n };\n },\n false,\n );\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 * Publishes only when compatibility preparation changes the supplied snapshot,\n * such as seeding a node kind activated after the snapshot was persisted.\n */\n hydrate(handle: ConnectorHandle, execution: FlowExecution): void {\n const s = this.s(handle);\n assertLegal(\n s.inlineOperationTargets.size === 0,\n \"hydrate requires live inline children to be cancelled first\",\n );\n const candidate = prepareExecutionSnapshot(s.flowDef, execution);\n const prepared = this.recompute({ ...s, execution: candidate });\n const changed = JSON.stringify(prepared) !== JSON.stringify(execution);\n s.executionGeneration += 1;\n s.execution = prepared;\n // Reconnect re-evaluates anything missed: the derived deadline is a pure\n // function of the snapshot, so a node whose timeout already elapsed while\n // this container was cold gets caught on the next rearm below rather than\n // waiting for its own wake timer (which does not survive a cold container).\n this.rearmWakeTimer(handle);\n if (changed && s.onChange) s.onChange(s.execution);\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: \"get_globals\",\n description:\n \"Get the flow's run-scoped globals (e.g. run_input payload for scheduled/params-bound runs).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"build_handoff\",\n description:\n \"Build the selected agent node briefing: instruction, supplied bindings, required assets, and completed predecessor context.\",\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 agent 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 agent node, or replace a rejected first-class gate decision with a fresh pending request. 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 for an agent node. Ends your turn. Legal from `available`, `running`, or `awaiting_approval`; never legal for a first-class gate.\",\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: `JSON InputSchema: one of ${INPUT_SCHEMA_SHAPES_HINT}. A choice option may be a bare string or omit its id; anything a host could not render is refused rather than stored.`,\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"complete_node\",\n description:\n \"Mark an agent node as complete with structured output. Consumed fields must match the declared output schema; an agent gets one corrective call before failure. Requires `awaiting_approval` with an `approved` decision, OR `running` when autonomous mode is on. Agent nodes with mandatory approval always require the approved decision. First-class gates complete directly through host approval and never use this operation.\",\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: \"fields\",\n description: \"Named JSON object consumed by downstream nodes.\",\n type: \"json\",\n required: false,\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` is terminal — an optional node becomes `skipped` so its dependents still proceed, any other node becomes `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 const agentTarget = [...s.inlineOperationTargets.values()].find((target) =>\n target.isAgentTurnActive(),\n );\n if (agentTarget && AGENT_INLINE_OPERATIONS.has(operation)) {\n return agentTarget.executeAgentOp(operation, args);\n }\n if (operation === \"applyApproval\" || operation === \"applyInput\") {\n const parentNodeId = String(args.nodeId ?? \"\");\n const target = s.inlineOperationTargets.get(parentNodeId);\n if (target) {\n const projection =\n operation === \"applyApproval\"\n ? await target.applyParentApproval(args)\n : await target.applyParentInput(args);\n this.projectInlineInteraction(handle, parentNodeId, projection);\n return JSON.stringify(s.execution);\n }\n }\n if (operation === \"cancel\") {\n await this.cancelInlineTargets(s);\n this.cancel(handle);\n return JSON.stringify(s.execution);\n }\n if (operation === \"hydrate\" || operation === \"start\") {\n await this.cancelInlineTargets(s);\n }\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 \"get_globals\":\n return JSON.stringify(flowDefaults(s.flowDef));\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 throw new Error(\"FlowAdapter: cancel routing invariant violated\");\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 agentNodeIds = new Set(s.flowDef.nodes.filter(isAgentNode).map((node) => node.id));\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n const available = nodes\n .filter((n) => agentNodeIds.has(n.id) && n.status === \"available\")\n .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 if (!isAgentNode(findNode(s.flowDef, nodeId))) {\n return JSON.stringify({ valid: false, reason: \"Node is not an active agent node\" });\n }\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 failedPreconditions: node.failedPreconditions ?? [],\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 coerced = coerceInputSchema(args.schema);\n // Storing a gate no host can render parks the run on a question no human can\n // answer; refusing leaves the agent able to correct it and call again.\n if (!coerced.ok) {\n throw new Error(\n `FlowAdapter: request_input schema for node ${nodeId} cannot be rendered as an answerable control, so nothing was stored. ${coerced.issues.join(\"; \")}. Fix the schema and call request_input again.`,\n );\n }\n return this.doRequestInput(handle, nodeId, prompt, coerced.schema);\n }\n\n private opCompleteNode(handle: ConnectorHandle, args: Record<string, unknown>): string {\n const nodeId = String(args.nodeId ?? \"\");\n const parsedFields = args.fields === undefined ? { issues: [] } : safeParseFields(args.fields);\n const output: NodeOutput = {\n summary: String(args.summary ?? \"Completed\"),\n artifacts: safeParseArtifacts(args.artifacts),\n concerns: safeParseStringArray(args.concerns),\n ...(parsedFields.fields ? { fields: parsedFields.fields } : {}),\n };\n return this.doCompleteNode(handle, nodeId, output, parsedFields.issues);\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 authoredFlow = args.flow;\n if (!authoredFlow || typeof authoredFlow !== \"object\") {\n throw new Error(\"FlowAdapter: start requires args.flow (FlowDefinition)\");\n }\n const flow = normalizeRuntimeFlow(authoredFlow);\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.executionGeneration += 1;\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 definition = findNode(s.flowDef, nodeId);\n assertLegal(isAgentNode(definition), `node is not an active agent node: ${nodeId}`);\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 // Auditability only: an agent node's output is agent-obtained by kind, so\n // nothing reads this back. Never let a resolution failure block the start —\n // the binding values reach the agent through `build_handoff`, not here.\n let inputOrigins: Record<string, BindingOrigin[]> | undefined;\n try {\n inputOrigins = resolveNodeBindings(\n s.flowDef,\n definition,\n snapshotMap(s.execution),\n s.flowInputOrigins,\n ).origins;\n } catch {\n inputOrigins = undefined;\n }\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"running\",\n startedAt: now(),\n inputOrigins,\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 definition = findNode(s.flowDef, nodeId);\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n const rejectedGateRerequest =\n isGateNode(definition) &&\n node.status === \"awaiting_approval\" &&\n node.approval?.decision === \"rejected\";\n assertLegal(\n isAgentNode(definition) || rejectedGateRerequest,\n `node is not an active agent node or rejected gate: ${nodeId}`,\n );\n assertLegal(\n (isAgentNode(definition) && node.status === \"running\") || rejectedGateRerequest,\n `request_approval requires a running agent node or rejected gate, 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 assertLegal(\n isAgentNode(findNode(s.flowDef, nodeId)),\n `node is not an active agent node: ${nodeId}`,\n );\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(\n handle: ConnectorHandle,\n nodeId: string,\n output: NodeOutput,\n fieldIssues: string[] = [],\n ): string {\n const state = this.s(handle);\n assertLegal(\n isAgentNode(findNode(state.flowDef, nodeId)),\n `node is not an active agent node: ${nodeId}`,\n );\n const node = state.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n\n const autonomous = state.execution.autonomousMode;\n const mandatory = requiresAgentApproval(state.flowDef, nodeId);\n const approvedPrior =\n node.status === \"awaiting_approval\" && node.approval?.decision === \"approved\";\n const runningAutonomous = node.status === \"running\" && autonomous && !mandatory;\n assertLegal(\n approvedPrior || runningAutonomous,\n mandatory && node.status === \"running\"\n ? `complete_node blocked: node ${nodeId} is a mandatory approval gate — call request_approval and wait for an approved decision (autonomous mode cannot skip it)`\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 const validation =\n fieldIssues.length > 0 && getConsumedOutputSchema(state.flowDef, nodeId)\n ? { valid: false, issues: fieldIssues }\n : validateConsumedNodeOutput(state.flowDef, nodeId, output.fields);\n if (!validation.valid) {\n const issueText = validation.issues.join(\"; \");\n if (!node.outputCorrection) {\n const correction: NodeOutputCorrection = {\n requestedAt: now(),\n issues: validation.issues,\n };\n // Finish recompute/onChange/stimulus publication before surfacing the tool error.\n this.mutate(handle, (current) => {\n const execution = current.execution.nodes[nodeId];\n assertLegal(execution, `node not in execution: ${nodeId}`);\n current.execution.nodes[nodeId] = { ...execution, outputCorrection: correction };\n });\n throw new Error(\n `FlowAdapter: output for node ${nodeId} does not match its consumed schema. Submit one corrected complete_node call. ${issueText}`,\n );\n }\n\n this.mutate(handle, (current) => {\n const execution = current.execution.nodes[nodeId];\n assertLegal(execution, `node not in execution: ${nodeId}`);\n const completedAt = now();\n const error: NodeError = {\n message: `Node ${nodeId} output failed schema validation after one correction: ${issueText}`,\n recoverable: false,\n at: completedAt,\n };\n // The correction stayed inside this attempt (no new entry on the\n // first mismatch) — this is the attempt's one terminal entry.\n const outputHistory = execution.startedAt\n ? appendAttempt(\n execution.outputHistory,\n \"failed\",\n execution.startedAt,\n completedAt,\n execution.output,\n error,\n )\n : execution.outputHistory;\n current.execution.nodes[nodeId] = {\n ...execution,\n status: resolveTerminalFailureStatus(findNode(current.flowDef, nodeId)),\n completedAt,\n error,\n errorHistory: [...execution.errorHistory, error],\n outputHistory,\n };\n });\n throw new Error(\n `FlowAdapter: node ${nodeId} failed after one output correction. ${issueText}`,\n );\n }\n\n return this.mutate(handle, (current) => {\n const execution = current.execution.nodes[nodeId];\n assertLegal(execution, `node not in execution: ${nodeId}`);\n const completedAt = now();\n const outputHistory = execution.startedAt\n ? appendAttempt(\n execution.outputHistory,\n \"complete\",\n execution.startedAt,\n completedAt,\n output,\n undefined,\n )\n : execution.outputHistory;\n current.execution.nodes[nodeId] = {\n ...execution,\n status: \"complete\",\n completedAt,\n output,\n outputHistory,\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 assertLegal(\n isAgentNode(findNode(s.flowDef, nodeId)),\n `node is not an active agent node: ${nodeId}`,\n );\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n // Mandatory wins over optional: a hard gate must go through\n // request_approval → applyApproval — it can never be skipped.\n assertLegal(\n !requiresAgentApproval(s.flowDef, nodeId),\n `cannot skip node ${nodeId}: it is a mandatory approval gate — call request_approval and wait for an approved decision`,\n );\n assertLegal(isOptional(s.flowDef, nodeId), `cannot skip required node ${nodeId}`);\n const completedAt = now();\n // Only an actually-started node opens an attempt — skipping a node\n // that never ran (still `available`) has nothing to record.\n const outputHistory = node.startedAt\n ? appendAttempt(\n node.outputHistory,\n \"skipped\",\n node.startedAt,\n completedAt,\n node.output,\n undefined,\n )\n : node.outputHistory;\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"skipped\",\n completedAt,\n outputHistory,\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 assertLegal(\n isAgentNode(findNode(s.flowDef, nodeId)),\n `node is not an active agent node: ${nodeId}`,\n );\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. This is the agent's own recovery\n // path (full agency, unbounded) — distinct from, and outside, the\n // automatic retry budget. It still closes out an attempt — the node\n // genuinely started and genuinely failed, and the next `start_node`\n // unconditionally overwrites `startedAt`, so this is the only chance\n // to capture this attempt's own timing — but the entry is marked\n // `selfRetry` so `countFailedAttempts` (the automatic-retry budget)\n // never counts it. `attempt` numbering still includes it: the\n // numbering tracks every actual start, not just automatic ones.\n const completedAt = error.at;\n const outputHistory = node.startedAt\n ? appendAttempt(\n node.outputHistory,\n \"failed\",\n node.startedAt,\n completedAt,\n node.output,\n error,\n { selfRetry: true },\n )\n : node.outputHistory;\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n error,\n errorHistory: [...node.errorHistory, error],\n outputHistory,\n };\n } else {\n const completedAt = now();\n const outputHistory = node.startedAt\n ? appendAttempt(\n node.outputHistory,\n \"failed\",\n node.startedAt,\n completedAt,\n node.output,\n error,\n )\n : node.outputHistory;\n s.execution.nodes[nodeId] = {\n ...node,\n status: resolveTerminalFailureStatus(findNode(s.flowDef, nodeId)),\n completedAt,\n error,\n errorHistory: [...node.errorHistory, error],\n outputHistory,\n };\n }\n // Reads back the status actually written — an optional node reports the\n // `skipped` it became, never the `failed` the agent asked for.\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 * A first-class gate completes directly when approved and remains parked when rejected.\n * Agent-node approvals keep their existing resume behavior. A check's escalation is a\n * one-way door: only `rejected` is legal, and it ends the node terminally `failed` —\n * there is no decision that resumes or passes a check.\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 definition = findNode(s.flowDef, nodeId);\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 if (isGateNode(definition)) {\n assertLegal(\n node.approval?.decidedAt == null && node.approval?.decision == null,\n `applyApproval: gate ${nodeId} approval attempt is already decided; request approval again before applying another decision`,\n );\n }\n if (isCheckNode(definition)) {\n assertLegal(\n decision === \"rejected\",\n `applyApproval: check ${nodeId} cannot be approved — a failed check has no passing state to approve into; only \"rejected\" is a legal decision`,\n );\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 (isGateNode(definition) && decision === \"approved\") {\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"complete\",\n completedAt: now(),\n approval,\n approvalHistory: history,\n };\n } else if (isGateNode(definition)) {\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"awaiting_approval\",\n approval,\n approvalHistory: history,\n };\n } else if (isCheckNode(definition)) {\n // Reject is the only decision that reaches here (asserted above), and it is\n // terminal: a check has no conversation to resume and no passing state to\n // fall back into, so \"the run gives up\" means `failed`, never `available`.\n s.execution.nodes[nodeId] = {\n ...node,\n status: resolveTerminalFailureStatus(definition),\n completedAt: now(),\n approval,\n approvalHistory: history,\n };\n } else if (decision === \"approved\") {\n // Non-gate (agent-node HITL) approval deliberately stays at\n // `awaiting_approval` rather than resuming `running`: `doCompleteNode`'s\n // `approvedPrior` check requires exactly that status (a mandatory-approval\n // node cannot fall back to the `runningAutonomous` branch), so the\n // agent's next legal call is `complete_node`, not more work. See\n // `isDeadlineEligible` for how `control.timeoutSec` still re-evaluates\n // this window without needing `status === \"running\"`.\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 * `failed` is the only status accepted; a `skipped` node is refused\n * deliberately, because a skip has already released its dependents and this\n * operation owns no cascade machinery to unwind the ones that ran without\n * the producer's output. Reasoning in\n * `_devlog/entries/2026-08-15-optional-node-skip-semantics.md`.\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 !== \"skipped\",\n `retryNode: node ${nodeId} was skipped, and a skip is not recoverable — it already released its dependents, which may have run without this node's output`,\n );\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 /**\n * Cancel the flow run. Status transitions to `cancelled`; dependents stay\n * put. Bumps `executionGeneration` — the sole late-settlement rejection\n * mechanism every in-flight await (function executor, sub-flow child)\n * checks after resolving, so a result that arrives after cancellation can\n * never write state.\n */\n cancel(handle: ConnectorHandle): void {\n this.mutate(handle, (s) => {\n s.execution = { ...s.execution, status: \"cancelled\" };\n s.executionGeneration += 1;\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 /** @internal Whether a nested inline descendant owns the current agent turn. */\n hasActiveInlineAgentTurn(handle: ConnectorHandle): boolean {\n return [...this.s(handle).inlineOperationTargets.values()].some((target) =>\n target.isAgentTurnActive(),\n );\n }\n\n /** Snapshot currently visible through agent-facing tools, including a live inline child. */\n getAgentExecution(handle: ConnectorHandle): FlowExecution {\n const state = this.s(handle);\n return (\n [...state.inlineOperationTargets.values()]\n .find((target) => target.isAgentTurnActive())\n ?.getExecution() ?? state.execution\n );\n }\n\n /** Agent node IDs whose approval policy remains mandatory in autonomous mode. */\n getMandatoryAgentApprovalNodeIds(handle: ConnectorHandle): string[] {\n const state = this.s(handle);\n const target = [...state.inlineOperationTargets.values()].find((candidate) =>\n candidate.isAgentTurnActive(),\n );\n if (target) return target.getMandatoryAgentApprovalNodeIds();\n return state.flowDef.nodes.filter(nodeRequiresApproval).map((n) => n.id);\n }\n\n /** @deprecated Use {@link getMandatoryAgentApprovalNodeIds}. */\n getMandatoryGates(handle: ConnectorHandle): string[] {\n return this.getMandatoryAgentApprovalNodeIds(handle);\n }\n\n /**\n * Decide whether the current state and stimulus require the session agent's conversation.\n * Runtime-owned gates stay dark while pending; a rejected gate is the exception because the\n * rejection starts the revision conversation promised by the gate lifecycle.\n */\n shouldDriveAgentTurn(handle: ConnectorHandle, stimulus: TurnStimulus): boolean {\n const state = this.s(handle);\n const execution = state.execution;\n if (execution.done || execution.status === \"failed\" || execution.status === \"cancelled\") {\n return false;\n }\n if (stimulus.kind === \"user_message\") return true;\n for (const node of state.flowDef.nodes) {\n const current = execution.nodes[node.id];\n if (\n isGateNode(node) &&\n current?.status === \"awaiting_approval\" &&\n current.approval?.decision === \"rejected\"\n ) {\n return true;\n }\n }\n\n for (const node of state.flowDef.nodes) {\n if (!isAgentNode(node)) continue;\n const current = execution.nodes[node.id];\n if (!current) continue;\n if (current.status === \"available\" || current.status === \"running\") return true;\n if (current.status === \"awaiting_approval\" && current.approval?.decision === \"approved\") {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Drain runtime-owned nodes in definition order until only agent work or a human decision\n * remains. Routers select branches, function nodes use NodeExecutor, gates park, and sub-flows\n * delegate to the host.\n */\n async drainRuntimeNodes(handle: ConnectorHandle): Promise<FlowExecution> {\n return this.drainAvailableRuntimeNodes(handle, true);\n }\n\n /**\n * Run every currently available function and check node through the\n * configured NodeExecutor. Newly-unblocked function/check nodes are\n * drained in definition order before returning control to the runner's\n * agent-turn decision. Routers and gates are excluded — see\n * {@link drainRuntimeNodes} for the full drain.\n */\n async executeAvailableFunctionNodes(handle: ConnectorHandle): Promise<FlowExecution> {\n return this.drainAvailableRuntimeNodes(handle, false);\n }\n\n private async drainAvailableRuntimeNodes(\n handle: ConnectorHandle,\n includeRoutersAndGates: boolean,\n ): Promise<FlowExecution> {\n const advancedSubFlows = new Set<string>();\n let abortedAttempt: Promise<NodeExecutorResult> | undefined;\n while (true) {\n const state = this.s(handle);\n if (state.execution.status === \"cancelled\" || state.execution.status === \"failed\") break;\n if (includeRoutersAndGates && this.settleAvailableRouters(handle)) continue;\n const node = state.flowDef.nodes.find((candidate) => {\n const status = state.execution.nodes[candidate.id]?.status;\n if (\n isSubFlowNode(candidate) &&\n !advancedSubFlows.has(candidate.id) &&\n (status === \"available\" || status === \"running\")\n ) {\n return true;\n }\n return (\n (isFunctionNode(candidate) ||\n isCheckNode(candidate) ||\n isSubpromptNode(candidate) ||\n (includeRoutersAndGates && isGateNode(candidate))) &&\n status === \"available\"\n );\n });\n if (!node) break;\n\n if (isGateNode(node)) {\n // Records no `inputOrigins` on purpose: a gate resolves no bindings and\n // writes no output, so nothing downstream can bind to it.\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n assertLegal(\n execution.status === \"available\",\n `cannot park gate node ${node.id}: status is ${execution.status}`,\n );\n const approval: Approval = { requestedAt: now(), summary: node.run.prompt };\n current.execution.nodes[node.id] = {\n ...execution,\n status: \"awaiting_approval\",\n approval,\n approvalHistory: [...execution.approvalHistory, approval],\n };\n },\n false,\n );\n continue;\n }\n\n if (isSubFlowNode(node)) {\n advancedSubFlows.add(node.id);\n const execution = state.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n if (execution.status === \"available\") {\n this.mutate(\n handle,\n (current) => {\n const currentExecution = current.execution.nodes[node.id];\n assertLegal(currentExecution, `node not in execution: ${node.id}`);\n assertLegal(\n currentExecution.status === \"available\",\n `cannot execute sub-flow node ${node.id}: status is ${currentExecution.status}`,\n );\n current.execution.nodes[node.id] = {\n ...currentExecution,\n status: \"running\",\n startedAt: now(),\n };\n },\n false,\n );\n }\n\n const executionGeneration = state.executionGeneration;\n const timeoutSec = node.control?.timeoutSec;\n const runningExecution = state.execution.nodes[node.id];\n const remainingMs = runningExecution\n ? remainingActiveExecutionMs(runningExecution, timeoutSec, Date.now())\n : undefined;\n let result: Awaited<ReturnType<InlineSubFlowRunner[\"run\"]>>;\n let subFlowInputOrigins: Record<string, BindingOrigin[]> | undefined;\n try {\n const runner = state.inlineSubFlowRunner;\n if (!runner) {\n throw new Error(`no inline sub-flow runner configured for node ${node.id}`);\n }\n const resolved = resolveNodeBindings(\n state.flowDef,\n node,\n snapshotMap(state.execution),\n state.flowInputOrigins,\n );\n subFlowInputOrigins = resolved.origins;\n const runPromise = runner.run({\n node,\n flowId: node.run.flow,\n inputs: resolved.values,\n inputOrigins: {\n ...(node.run.passContext ? state.flowInputOrigins : {}),\n ...resolved.origins,\n },\n passContext: node.run.passContext ?? false,\n parentFlow: state.flowDef,\n parentExecution: state.execution,\n ancestry: state.inlineSubFlowAncestry,\n routeOperationsTo: (target) => {\n if (target) state.inlineOperationTargets.set(node.id, target);\n else state.inlineOperationTargets.delete(node.id);\n },\n });\n result =\n remainingMs !== undefined\n ? await raceWithTimeout(\n runPromise,\n Math.max(0, remainingMs),\n `Sub-flow node ${node.id} timed out after ${timeoutSec}s`,\n )\n : await runPromise;\n } catch (error) {\n if (error instanceof NodeTimeoutError) {\n // Abort active work: drop (and cancel) any live inline operation\n // target so a parked child doesn't linger past the timeout. The\n // real `runPromise` is not cancelled (no abort signal on this\n // seam) — its late settlement is swallowed by raceWithTimeout,\n // and the executionGeneration check below rejects it a second\n // time if it races back in before this loop notices.\n const target = state.inlineOperationTargets.get(node.id);\n if (target) {\n state.inlineOperationTargets.delete(node.id);\n void target.cancel().catch(() => {});\n }\n result = {\n status: \"failed\",\n error: { message: error.message, recoverable: false, at: now() },\n };\n } else {\n result = {\n status: \"failed\",\n error: {\n message: `Sub-flow node ${node.id} failed: ${error instanceof Error ? error.message : String(error)}`,\n recoverable: false,\n at: now(),\n },\n };\n }\n }\n\n if (this.s(handle).executionGeneration !== executionGeneration) break;\n\n if (result.status === \"paused\") {\n this.projectInlineInteraction(handle, node.id, result.projection);\n continue;\n }\n let subFlowRetrying = false;\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n const completedAt = now();\n if (result.status === \"complete\") {\n const outputHistory = appendAttempt(\n execution.outputHistory,\n \"complete\",\n execution.startedAt ?? completedAt,\n completedAt,\n result.output,\n undefined,\n );\n current.execution.nodes[node.id] = {\n ...execution,\n status: \"complete\",\n completedAt,\n output: result.output,\n outputHistory,\n inputOrigins: subFlowInputOrigins,\n };\n return;\n }\n const { retry, patch } = this.planAutomaticRetry(\n node,\n execution,\n result.error.message,\n completedAt,\n result.output,\n result.error.at,\n );\n subFlowRetrying = retry;\n current.execution.nodes[node.id] = retry\n ? { ...execution, ...patch, status: \"available\", error: undefined }\n : {\n ...execution,\n ...patch,\n status: resolveTerminalFailureStatus(node),\n completedAt,\n };\n },\n false,\n );\n // A retry sets status back to \"available\", but `advancedSubFlows`\n // (above) would otherwise stop THIS drain from re-entering the same\n // node — unlike function nodes, which never join that set and so\n // retry within one drain for free. Nothing else re-drains: both\n // production drivers call `drainRuntimeNodes` exactly once per\n // stimulus-triggered turn, so without this the node would sit\n // `available` with no event left to pick it back up (#2196 retry\n // wedge). Dropping it out here makes sub-flow retry match the\n // function-node precedent — bounded and synchronous within this call.\n if (subFlowRetrying) advancedSubFlows.delete(node.id);\n continue;\n }\n\n if (isSubpromptNode(node)) {\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n assertLegal(\n execution.status === \"available\",\n `cannot execute subprompt node ${node.id}: status is ${execution.status}`,\n );\n current.execution.nodes[node.id] = {\n ...execution,\n status: \"running\",\n startedAt: now(),\n };\n },\n false,\n );\n\n const subpromptExecutionGeneration = state.executionGeneration;\n const subpromptTimeoutSec = node.control?.timeoutSec;\n const subpromptRunningExecution = state.execution.nodes[node.id];\n const subpromptRemainingMs = subpromptRunningExecution\n ? remainingActiveExecutionMs(subpromptRunningExecution, subpromptTimeoutSec, Date.now())\n : undefined;\n\n let subpromptOutput: NodeOutput | undefined;\n let subpromptInputOrigins: Record<string, BindingOrigin[]> | undefined;\n let subpromptOutcome: { kind: \"success\" } | { kind: \"failure\"; message: string };\n try {\n const runner = state.subpromptRunner;\n if (!runner) {\n throw new Error(`no SubpromptRunner configured for subprompt node ${node.id}`);\n }\n const resolved = resolveNodeBindings(\n state.flowDef,\n node,\n snapshotMap(state.execution),\n state.flowInputOrigins,\n );\n subpromptInputOrigins = resolved.origins;\n const instruction = nodeInstruction(node);\n assertLegal(instruction, `subprompt node ${node.id} has no instruction`);\n const outputSchema = node.contract?.output?.fields;\n const prompt = renderSubpromptPrompt(\n interpolateNodeInstruction(instruction, resolved.values),\n outputSchema,\n );\n const runPromise = runner.execute({\n node,\n prompt,\n inputs: resolved.values,\n inputOrigins: resolved.origins,\n });\n const result =\n subpromptRemainingMs !== undefined\n ? await raceWithTimeout(\n runPromise,\n Math.max(0, subpromptRemainingMs),\n `Subprompt node ${node.id} timed out after ${subpromptTimeoutSec}s`,\n )\n : await runPromise;\n\n subpromptOutput = subpromptNodeOutput(node, result.text);\n\n // Same seam every other kind's output rides — enforced only when a\n // downstream node actually consumes the declared fields. No corrective\n // reprompt exists here (a subprompt has no conversation to reprompt in),\n // so a mismatch is an ordinary node failure, not a correction request.\n const validation = validateConsumedNodeOutput(\n state.flowDef,\n node.id,\n subpromptOutput.fields,\n );\n if (!validation.valid) {\n throw new Error(\n `output does not match its consumed schema: ${validation.issues.join(\"; \")}`,\n );\n }\n subpromptOutcome = { kind: \"success\" };\n } catch (error) {\n subpromptOutcome =\n error instanceof NodeTimeoutError\n ? { kind: \"failure\", message: error.message }\n : {\n kind: \"failure\",\n message: `Subprompt node ${node.id} failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n\n // Late-settlement rejection, matching the function/check and sub-flow\n // seams — a hydrate/cancel/disconnect/start that landed while this await\n // was in flight invalidates whatever was just computed.\n if (this.s(handle).executionGeneration !== subpromptExecutionGeneration) break;\n\n if (subpromptOutcome.kind === \"success\") {\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n const completedAt = now();\n const outputHistory = appendAttempt(\n execution.outputHistory,\n \"complete\",\n execution.startedAt ?? completedAt,\n completedAt,\n subpromptOutput,\n undefined,\n );\n current.execution.nodes[node.id] = {\n ...execution,\n status: \"complete\",\n completedAt,\n output: subpromptOutput,\n outputHistory,\n inputOrigins: subpromptInputOrigins,\n };\n },\n false,\n );\n } else {\n const failureMessage = subpromptOutcome.message;\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n const completedAt = now();\n const { retry, patch } = this.planAutomaticRetry(\n node,\n execution,\n failureMessage,\n completedAt,\n subpromptOutput,\n );\n current.execution.nodes[node.id] = retry\n ? { ...execution, ...patch, status: \"available\", error: undefined }\n : {\n ...execution,\n ...patch,\n status: resolveTerminalFailureStatus(node),\n completedAt,\n };\n },\n false,\n );\n }\n continue;\n }\n\n if (!isFunctionNode(node) && !isCheckNode(node)) continue;\n\n // Gate the next deterministic spawn on the aborted one finishing: `abort()`\n // only *starts* the kill, so without this a retry runs alongside the\n // process it replaced. Re-select afterwards — the wait is an await.\n if (abortedAttempt) {\n const settling = abortedAttempt;\n abortedAttempt = undefined;\n await settleWithin(settling, ABORTED_ATTEMPT_SETTLE_MS);\n continue;\n }\n\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n assertLegal(\n execution.status === \"available\",\n `cannot execute ${node.run.kind} node ${node.id}: status is ${execution.status}`,\n );\n current.execution.nodes[node.id] = {\n ...execution,\n status: \"running\",\n startedAt: now(),\n };\n },\n false,\n );\n\n const deterministicExecutionGeneration = state.executionGeneration;\n const deterministicTimeoutSec = node.control?.timeoutSec;\n const deterministicRunningExecution = state.execution.nodes[node.id];\n const deterministicRemainingMs = deterministicRunningExecution\n ? remainingActiveExecutionMs(\n deterministicRunningExecution,\n deterministicTimeoutSec,\n Date.now(),\n )\n : undefined;\n const deterministicKindLabel = deterministicNodeKindLabel(node.run.kind);\n\n let capturedOutput: NodeOutput | undefined;\n let capturedInputOrigins: Record<string, BindingOrigin[]> | undefined;\n let checkEvidence: CheckEvidence | undefined;\n let deterministicOutcome:\n | { kind: \"success\" }\n | { kind: \"check-fail\"; message: string; onFail: \"escalate\" | \"fail\" }\n | { kind: \"failure\"; message: string };\n // One controller per attempt: aborting is a one-way door, and the retry\n // that may follow is a fresh execution that must not start pre-aborted.\n const deterministicAbort = new AbortController();\n let runPromise: Promise<NodeExecutorResult> | undefined;\n try {\n const executor = state.nodeExecutor;\n if (!executor)\n throw new Error(`no NodeExecutor configured for ${node.run.kind} node ${node.id}`);\n const resolved = resolveNodeBindings(\n state.flowDef,\n node,\n snapshotMap(state.execution),\n state.flowInputOrigins,\n );\n capturedInputOrigins = resolved.origins;\n runPromise = executor.execute(\n { node, inputs: resolved.values, inputOrigins: resolved.origins },\n { signal: deterministicAbort.signal },\n );\n const result =\n deterministicRemainingMs !== undefined\n ? await raceWithTimeout(\n runPromise,\n Math.max(0, deterministicRemainingMs),\n `${deterministicKindLabel} node ${node.id} timed out after ${deterministicTimeoutSec}s`,\n )\n : await runPromise;\n const successfulStatuses = node.run.successExit ?? [0];\n const passed = successfulStatuses.includes(result.exitStatus);\n capturedOutput = deterministicNodeOutput(node, result, passed);\n const detail = passed ? \"\" : result.stderr.trim() || result.stdout.trim();\n const detailSuffix = detail ? `: ${detail}` : \"\";\n\n // A schema mismatch on a passing process is diagnostic state, not a check\n // verdict — shared by both kinds so a check whose *output* is malformed\n // (as opposed to whose exit status failed) throws into the generic\n // infrastructure-failure path below rather than fabricating a fail verdict.\n if (passed) {\n const validation = validateConsumedNodeOutput(\n state.flowDef,\n node.id,\n capturedOutput.fields,\n );\n if (!validation.valid) {\n throw new Error(\n `output does not match its consumed schema: ${validation.issues.join(\"; \")}`,\n );\n }\n }\n\n if (isCheckNode(node)) {\n // A clean process exit outside `successExit` is a fail *verdict*, not an\n // infrastructure failure — it carries evidence and consults `onFail`,\n // never the generic throw-based failure path below.\n checkEvidence = deriveCheckEvidence(\n resolved,\n {\n runtime: node.run.runtime ?? \"shell\",\n command: node.run.command,\n cwd: node.run.cwd,\n successExit: successfulStatuses,\n exitStatus: result.exitStatus,\n passed,\n },\n now(),\n );\n deterministicOutcome = passed\n ? { kind: \"success\" }\n : {\n kind: \"check-fail\",\n message: `Check node ${node.id} failed with exit status ${result.exitStatus}${detailSuffix}`,\n onFail: node.run.onFail,\n };\n } else if (!passed) {\n throw new Error(\n `Function node ${node.id} exited with unsuccessful exit status ${result.exitStatus}${detailSuffix}`,\n );\n } else {\n deterministicOutcome = { kind: \"success\" };\n }\n } catch (error) {\n // Anything that lands here — spawn failure, timeout, thrown output-schema\n // mismatch — produced no verdict at all, so it is always a plain node\n // failure and never reaches a check's `onFail` escalation.\n if (error instanceof NodeTimeoutError) {\n // Counterpart to the sub-flow branch's `target.cancel()`: we stopped\n // waiting, so stop the work too. The promise is carried out of here so\n // the next spawn can wait for the kill to land — see the gate above.\n deterministicAbort.abort();\n abortedAttempt = runPromise;\n deterministicOutcome = { kind: \"failure\", message: error.message };\n } else {\n deterministicOutcome = {\n kind: \"failure\",\n message: `${deterministicKindLabel} node ${node.id} failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n // Late-settlement rejection: a hydrate/cancel/disconnect/start that\n // landed while this await was in flight invalidates whatever we just\n // computed — bail before writing either outcome.\n if (this.s(handle).executionGeneration !== deterministicExecutionGeneration) {\n // Reached only after the attempt settled, so for a process-spawning\n // executor there is nothing left to kill; it releases an executor that\n // resolves before its work is done. Cancelling a *live* attempt is not\n // possible here — this await is what a cancel cannot interrupt. Leaving\n // by this door also skips the settle gate, so a timeout racing a cancel\n // can still hand a re-drain a process that is mid-escalation.\n deterministicAbort.abort();\n break;\n }\n\n if (deterministicOutcome.kind === \"success\") {\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n const completedAt = now();\n const outputHistory = appendAttempt(\n execution.outputHistory,\n \"complete\",\n execution.startedAt ?? completedAt,\n completedAt,\n capturedOutput,\n undefined,\n { check: checkEvidence },\n );\n current.execution.nodes[node.id] = {\n ...execution,\n status: \"complete\",\n completedAt,\n output: capturedOutput,\n outputHistory,\n inputOrigins: capturedInputOrigins,\n };\n },\n false,\n );\n } else if (deterministicOutcome.kind === \"check-fail\") {\n const { message: failureMessage, onFail } = deterministicOutcome;\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n assertLegal(checkEvidence, `check node ${node.id} completed without evidence`);\n const completedAt = now();\n const { retry, patch } = this.planAutomaticRetry(\n node,\n execution,\n failureMessage,\n completedAt,\n capturedOutput,\n undefined,\n checkEvidence,\n );\n if (retry) {\n current.execution.nodes[node.id] = {\n ...execution,\n ...patch,\n status: \"available\",\n error: undefined,\n };\n } else if (onFail === \"fail\") {\n current.execution.nodes[node.id] = {\n ...execution,\n ...patch,\n status: resolveTerminalFailureStatus(node),\n completedAt,\n };\n } else {\n // Escalation is a notification + evidence carrier, not a route to\n // proceed-as-passed — `applyApproval` rejects an \"approved\" decision\n // outright and terminalizes \"rejected\", so nothing here can resume\n // this node or mark it passed.\n const provenanceNote = checkEvidence.provenance\n ? ` (${checkEvidence.provenance})`\n : \"\";\n const approval: Approval = {\n requestedAt: now(),\n summary: `Check node ${node.id} failed with exit status ${checkEvidence.exitStatus}${provenanceNote}.`,\n };\n current.execution.nodes[node.id] = {\n ...execution,\n ...patch,\n status: \"awaiting_approval\",\n approval,\n approvalHistory: [...execution.approvalHistory, approval],\n };\n }\n },\n false,\n );\n } else {\n const failureMessage = deterministicOutcome.message;\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n assertLegal(execution, `node not in execution: ${node.id}`);\n const completedAt = now();\n const { retry, patch } = this.planAutomaticRetry(\n node,\n execution,\n failureMessage,\n completedAt,\n capturedOutput,\n );\n current.execution.nodes[node.id] = retry\n ? { ...execution, ...patch, status: \"available\", error: undefined }\n : { ...execution, ...patch, status: resolveTerminalFailureStatus(node), completedAt };\n },\n false,\n );\n }\n }\n\n return this.getExecution(handle);\n }\n\n // ── Private helpers ──\n\n /** Settle one decidable router per source ownership component before runtime side effects. */\n private settleAvailableRouters(handle: ConnectorHandle): boolean {\n const state = this.s(handle);\n const snapshots = snapshotMap(state.execution);\n const settlements: RouterSettlement[] = [];\n const availableRouterSnapshots = new Map(snapshots);\n const computed = computeFlowStateFromSnapshots(state.flowDef, snapshots);\n for (const nodeId of computed.available) {\n const execution = availableRouterSnapshots.get(nodeId);\n if (execution && execution.status !== \"available\") {\n availableRouterSnapshots.set(nodeId, { ...execution, status: \"available\" });\n }\n }\n const frontier = availableRouterFrontier(state.flowDef, availableRouterSnapshots);\n for (const node of frontier) {\n const resolution = evaluateRouterSelection(state.flowDef, node, snapshots);\n if (\"unresolved\" in resolution) continue;\n settlements.push({ routerNodeId: node.id, selectedTarget: resolution.selectedTarget });\n }\n if (settlements.length === 0) return false;\n\n const preparedSettlements = settlements.map((settlement) => {\n const output = routerSelectionOutput(settlement.selectedTarget);\n return {\n settlement,\n output,\n validation: validateConsumedNodeOutput(\n state.flowDef,\n settlement.routerNodeId,\n output.fields,\n ),\n };\n });\n const validSettlements = preparedSettlements.flatMap(({ settlement, validation }) =>\n validation.valid ? [settlement] : [],\n );\n const settlementPlan = [...validSettlements];\n let skippedNodeIds: string[] = [];\n if (settlementPlan.length > 0) {\n while (true) {\n skippedNodeIds = planRouterSkips(state.flowDef, snapshots, settlementPlan);\n const settledIds = new Set(settlementPlan.map(({ routerNodeId }) => routerNodeId));\n const losingRouters = skippedNodeIds.flatMap((nodeId) => {\n const node = state.flowDef.nodes.find(({ id }) => id === nodeId);\n return node && isRouterNode(node) && !settledIds.has(node.id) ? [node] : [];\n });\n if (losingRouters.length === 0) break;\n settlementPlan.push(\n ...losingRouters.map(({ id }) => ({ routerNodeId: id, selectedTarget: null })),\n );\n }\n }\n const settledAt = now();\n // Records no `inputOrigins` on purpose: a router resolves no bindings, and its\n // selection rides in `output.summary` — it emits no `output.fields` to bind to.\n this.mutate(\n handle,\n (current) => {\n for (const prepared of preparedSettlements) {\n const { settlement, output, validation } = prepared;\n const execution = current.execution.nodes[settlement.routerNodeId];\n assertLegal(execution, `node not in execution: ${settlement.routerNodeId}`);\n assertLegal(\n execution.status === \"available\",\n `cannot resolve router node ${settlement.routerNodeId}: status is ${execution.status}`,\n );\n if (!validation.valid) {\n const error: NodeError = {\n message: `Router node ${settlement.routerNodeId} failed: output does not match its consumed schema: ${validation.issues.join(\"; \")}`,\n recoverable: false,\n at: settledAt,\n };\n current.execution.nodes[settlement.routerNodeId] = {\n ...execution,\n status: resolveTerminalFailureStatus(\n findNode(current.flowDef, settlement.routerNodeId),\n ),\n startedAt: execution.startedAt ?? settledAt,\n completedAt: settledAt,\n output,\n error,\n errorHistory: [...execution.errorHistory, error],\n };\n continue;\n }\n current.execution.nodes[settlement.routerNodeId] = {\n ...execution,\n status: \"complete\",\n startedAt: execution.startedAt ?? settledAt,\n completedAt: settledAt,\n output,\n };\n }\n for (const skippedNodeId of skippedNodeIds) {\n const execution = current.execution.nodes[skippedNodeId];\n if (\n !execution ||\n (execution.status !== \"not_started\" && execution.status !== \"available\")\n ) {\n continue;\n }\n current.execution.nodes[skippedNodeId] = {\n ...execution,\n status: \"skipped\",\n completedAt: settledAt,\n };\n }\n },\n false,\n );\n return true;\n }\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 optionally signals the\n * {@link FlowAdapterStimulusBus}. The signal path is gated by the\n * `useBusForStimulus` flag set at connect time.\n */\n private mutate(\n handle: ConnectorHandle,\n fn: (s: FlowAdapterState) => unknown,\n signalStimulus = true,\n ): string {\n const s = this.s(handle);\n const previousExecution = s.lastSignaledExecution;\n // Detach from the last-signaled snapshot before fn runs: it may alias this\n // object, and fn's in-place `nodes[x] = {...}` would corrupt the \"previous\"\n // snapshot, hiding non-fast-path diffs from computeStimulus.\n s.execution = {\n ...s.execution,\n nodes: nodeExecutionRecord(Object.entries(s.execution.nodes)),\n };\n const result = fn(s);\n s.execution = this.recompute(s);\n if (s.onChange) s.onChange(s.execution);\n\n if (signalStimulus && 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 // Recompute the opportunistic agent-node wake timer against the\n // just-mutated state — every mutation can change which node is running,\n // start a fresh `startedAt`, or move the flow to a terminal status.\n this.rearmWakeTimer(handle);\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 const routerGatedNodes = unsettledRouterBranchIds(s.flowDef, snapshots);\n\n // Recompute precondition admission and reports in both directions. Host retries stay\n // available through unfinished predecessors; retry lifecycle is separate.\n const nodes = nodeExecutionRecord(Object.entries(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\" || existing.status === \"available\") {\n const definitionNode = s.flowDef.nodes.find(({ id }) => id === ns.nodeId);\n const hasFailedPreconditions = (ns.failedPreconditions?.length ?? 0) > 0;\n const status =\n existing.status === \"available\" &&\n ns.status === \"not_started\" &&\n !hasFailedPreconditions &&\n !routerGatedNodes.has(ns.nodeId) &&\n !(definitionNode && isRouterNode(definitionNode))\n ? \"available\"\n : ns.status;\n nodes[ns.nodeId] = {\n ...existing,\n status,\n failedPreconditions: hasFailedPreconditions ? ns.failedPreconditions : undefined,\n };\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) => isActiveRuntimeNode(n) && !nodeIsOptional(n))\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 // ── Agent-node deadline wake timer ────────────────────────────────────────\n //\n // Agent nodes have no `await` the adapter can wrap — it marks the node\n // started and waits for the model to call `complete_node`, which may never\n // come. The derived deadline (see `engine/node-deadline.ts`) is the source\n // of truth: it is a pure function of `startedAt` + `approvalHistory` +\n // `inputHistory`, so it is correct on its own after `hydrate()` or a\n // reconnect with no timer required. This wake timer exists only so a\n // genuinely hung run — by definition nothing else happening — still gets\n // *some* event that triggers a re-evaluation of that deadline.\n\n private clearWakeTimer(s: FlowAdapterState): void {\n if (s.wakeTimer !== null) {\n clearTimeout(s.wakeTimer);\n s.wakeTimer = null;\n }\n }\n\n /**\n * Whether `execution` counts as \"actively running\" for `control.timeoutSec`\n * evaluation. Ordinarily this is just `status === \"running\"`. The one\n * exception: a non-gate agent node whose approval was just decided\n * `approved` stays at `awaiting_approval` — `applyApproval` deliberately\n * does not restore `running` there, because `doCompleteNode`'s\n * `approvedPrior` check requires exactly that status (a mandatory-approval\n * node has no `runningAutonomous` fallback). Without this second clause the\n * timeout would pause for the approval wait (correctly, via\n * `remainingActiveExecutionMs` reading the now-resolved `approvalHistory`\n * entry) and then never resume, since nothing re-evaluates a node that\n * never looks \"running\" again.\n */\n private isDeadlineEligible(execution: NodeExecution): boolean {\n if (execution.status === \"running\") return true;\n return execution.status === \"awaiting_approval\" && execution.approval?.decision === \"approved\";\n }\n\n /**\n * Recomputes the pending wake timer against the current state: cancels any\n * previously-armed timer, then arms a fresh one for the earliest deadline\n * among currently `running` agent nodes with a `control.timeoutSec`. A\n * no-op when nothing is running against a timeout, or the flow is already\n * terminal. Called after every {@link mutate}, plus `connect()` and\n * `hydrate()` (which bypass `mutate()`).\n *\n * `disconnect()` clears the timer and bumps `executionGeneration`, but a\n * `mutate()` already in flight (or one that lands after teardown for any\n * other reason) still calls this on its way out — bail here on\n * `handle.status` so a post-disconnect mutation can never re-arm a timer\n * that would fire against a handle nothing is watching anymore.\n */\n private rearmWakeTimer(handle: ConnectorHandle): void {\n const s = this.s(handle);\n this.clearWakeTimer(s);\n if (handle.status === \"disconnected\") return;\n if (s.execution.done || s.execution.status === \"failed\" || s.execution.status === \"cancelled\") {\n return;\n }\n const nowMs = Date.now();\n let earliestRemainingMs: number | undefined;\n for (const node of s.flowDef.nodes) {\n if (!isAgentNode(node)) continue;\n const timeoutSec = node.control?.timeoutSec;\n if (timeoutSec === undefined) continue;\n const execution = s.execution.nodes[node.id];\n if (!execution || !this.isDeadlineEligible(execution)) continue;\n const remaining = remainingActiveExecutionMs(execution, timeoutSec, nowMs);\n if (remaining === undefined) continue;\n if (earliestRemainingMs === undefined || remaining < earliestRemainingMs) {\n earliestRemainingMs = remaining;\n }\n }\n if (earliestRemainingMs === undefined) return;\n const delayMs = Math.max(0, earliestRemainingMs);\n const timer = setTimeout(() => {\n s.wakeTimer = null;\n void this.evaluateAgentNodeDeadlines(handle);\n }, delayMs);\n timer.unref?.();\n s.wakeTimer = timer;\n }\n\n /**\n * Re-checks every `running` agent node's derived deadline and, for any that\n * have expired, either auto-retries (bounded by `control.retries`, composing\n * with the existing `doFailNode(recoverable: true)` and `retryNode`\n * pathways) or terminally fails the node. Safe to call at any time — the\n * derived deadline means this is a no-op unless something has actually\n * expired. Goes through {@link mutate}, so a state change here republishes\n * `onChange`/stimulus exactly like any other mutation, waking a fresh turn\n * when the node retries or the flow rolls up to `failed`.\n */\n private async evaluateAgentNodeDeadlines(handle: ConnectorHandle): Promise<void> {\n const s = this.s(handle);\n const nowMs = Date.now();\n const expired = s.flowDef.nodes.filter((node) => {\n if (!isAgentNode(node)) return false;\n const timeoutSec = node.control?.timeoutSec;\n if (timeoutSec === undefined) return false;\n const execution = s.execution.nodes[node.id];\n if (!execution || !this.isDeadlineEligible(execution)) return false;\n const remaining = remainingActiveExecutionMs(execution, timeoutSec, nowMs);\n return remaining !== undefined && remaining <= 0;\n });\n for (const node of expired) {\n this.mutate(\n handle,\n (current) => {\n const execution = current.execution.nodes[node.id];\n // Already handled (e.g. a previous iteration's mutate() resolved\n // this via a different path) — nothing to do.\n if (!execution || !this.isDeadlineEligible(execution)) return;\n const completedAt = now();\n const message = `Agent node ${node.id} timed out after ${node.control?.timeoutSec}s`;\n const { retry, patch } = this.planAutomaticRetry(\n node,\n execution,\n message,\n completedAt,\n execution.output,\n );\n current.execution.nodes[node.id] = retry\n ? { ...execution, ...patch, status: \"available\", error: undefined }\n : { ...execution, ...patch, status: resolveTerminalFailureStatus(node), completedAt };\n },\n true,\n );\n }\n }\n\n /**\n * Records one failed attempt on `nodeId`'s execution and decides whether\n * the automatic bounded retry (`control.retries`) still has budget. Shared\n * by every automatic-failure seam (agent-node timeout, function/check\n * execution/timeout failure, sub-flow execution/timeout failure, and a\n * check's fail verdict) so the budget — derived from prior `'failed'`\n * entries in `outputHistory`, not a separate durable counter — is computed\n * once, the same way, everywhere.\n *\n * Returns the `NodeExecution` patch (error/errorHistory/outputHistory/\n * output) plus whether budget remains. The terminal *failure* status is\n * uniform across kinds and computed by {@link resolveTerminalFailureStatus};\n * the caller still writes the status because its non-failure outcomes differ\n * (a check's escalation parks at `awaiting_approval`, a surviving budget\n * returns to `available`). A terminal failure whose node has any\n * `control.retries` configured carries `recoverable: true` so the manual\n * `retryNode` operator override — which sits outside this budget entirely —\n * remains usable once the automatic budget runs out; a node that will be\n * written `skipped` never claims it, because a skip is not retryable.\n *\n * @param sourceErrorAtIso - The failure's own timestamp, when the caller has\n * one more precise than `completedAtIso` (e.g. a sub-flow child reports\n * its own `error.at`, which can predate this node's parent-side\n * `completedAt` by however long the result took to propagate). Defaults\n * to `completedAtIso` for callers (agent-timeout, function-node) whose\n * failure message is synthesized at the moment of detection.\n * @param checkEvidence - Derived evidence for a check's fail verdict, so it\n * rides on the same appended attempt as the failure it explains.\n */\n private planAutomaticRetry(\n node: FlowNode,\n execution: NodeExecution,\n message: string,\n completedAtIso: string,\n capturedOutput: NodeOutput | undefined,\n sourceErrorAtIso?: string,\n checkEvidence?: CheckEvidence,\n ): { retry: boolean; patch: Partial<NodeExecution> } {\n const retries = node.control?.retries;\n const priorFailures = countFailedAttempts(execution.outputHistory);\n const retry = hasAutomaticRetryBudget(priorFailures, retries);\n // Gated on this node's OWN `control.retries`, never a delegated child's\n // reported `recoverable` (see the sub-flow caller above, which discards\n // `result.error.recoverable` on purpose) — parent recoverability follows\n // the parent's own control, so the manual `retryNode` escape hatch opens\n // once the automatic budget is exhausted only when *this* node declares\n // a retry budget of its own. Pinned by sub-flow-node.test.ts's\n // \"does not propagate a child's own recoverable flag\" case.\n const error: NodeError = {\n message,\n recoverable: !retry && !!retries && resolveTerminalFailureStatus(node) === \"failed\",\n at: sourceErrorAtIso ?? completedAtIso,\n };\n const outputHistory = appendAttempt(\n execution.outputHistory,\n \"failed\",\n execution.startedAt ?? completedAtIso,\n completedAtIso,\n capturedOutput,\n error,\n { check: checkEvidence },\n );\n return {\n retry,\n patch: {\n error,\n errorHistory: [...execution.errorHistory, error],\n outputHistory,\n output: capturedOutput ?? execution.output,\n },\n };\n }\n\n /**\n * Build the selected agent node's complete turn briefing plus upstream context.\n */\n private buildHandoff(s: FlowAdapterState, nodeId: string): string {\n const target = findNode(s.flowDef, nodeId);\n assertLegal(isAgentNode(target), `node is not an active agent node: ${nodeId}`);\n const targetExecution = s.execution.nodes[nodeId];\n assertLegal(targetExecution, `node not in execution: ${nodeId}`);\n assertLegal(\n targetExecution.status === \"available\" || targetExecution.status === \"running\",\n `cannot build handoff for ${nodeId}: status is ${targetExecution.status}`,\n );\n\n const sections = [`# Agent node: ${nodeLabel(target)}`, `Node ID: ${target.id}`];\n const resolved = resolveNodeBindings(\n s.flowDef,\n target,\n snapshotMap(s.execution),\n s.flowInputOrigins,\n );\n const instruction = nodeInstruction(target);\n if (instruction) {\n sections.push(\n `## Instruction\\n\\n${interpolateNodeInstruction(instruction, resolved.values)}`,\n );\n }\n\n if (Object.keys(resolved.values).length > 0) {\n sections.push(\n `## Supplied bindings\\n\\n\\`\\`\\`json\\n${JSON.stringify(resolved.values, null, 2)}\\n\\`\\`\\``,\n `## Binding origins\\n\\n\\`\\`\\`json\\n${JSON.stringify(resolved.origins, null, 2)}\\n\\`\\`\\``,\n );\n }\n\n if (targetExecution.outputCorrection) {\n sections.push(\n `## Output correction required\\n\\nThis node has one corrective output call available. Fix every issue before calling \\`complete_node\\` again:\\n${targetExecution.outputCorrection.issues\n .map((issue) => `- ${issue}`)\n .join(\"\\n\")}`,\n );\n }\n\n const assets = nodeAssets(target);\n if (assets.length > 0) {\n sections.push(`## Required assets\\n\\n${assets.map((asset) => `- ${asset}`).join(\"\\n\")}`);\n }\n\n const deps = flowPredecessors(s.flowDef, nodeId);\n const supplied = suppliedProducerFields(resolved);\n const handoff: 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 predecessor = s.flowDef.nodes.find((n) => n.id === depId);\n const label = predecessor ? nodeLabel(predecessor) : depId;\n const summary =\n predecessor && isRouterNode(predecessor)\n ? (routerSelectionHandoffSummary(predecessor, exec) ?? output.summary)\n : output.summary;\n // Gated on `complete` to match the binding layer: `buildFlowExpressionContext`\n // exposes `output.fields` only for a completed producer, and a skip path\n // spreads the prior execution — so a failed-then-skipped optional node still\n // carries captured output the flow's own contract says it never produced.\n const fields =\n exec?.status === \"complete\" ? upstreamFieldsBlock(predecessor, output, supplied) : \"\";\n handoff.push(`### ${label} (${exec?.status})\\n${summary}${fields}${artifacts}${concerns}`);\n }\n\n sections.push(\n `## Upstream handoff\\n\\n${handoff.length > 0 ? handoff.join(\"\\n\\n\") : \"(no prior context)\"}`,\n );\n return sections.join(\"\\n\\n\");\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\n/** Render a completed router choice without leaking its durable selection marker. */\nfunction routerSelectionHandoffSummary(\n router: FlowNode,\n execution: NodeExecution | undefined,\n): string | undefined {\n const selection = persistedRouterSelection(router, execution);\n if (!selection) return undefined;\n return selection.selectedTarget === null\n ? \"Router completed without selecting a target.\"\n : `Router selected ${selection.selectedTarget}.`;\n}\n\n/**\n * Per-field cap on one rendered upstream value, in characters. Deliberately\n * per-field rather than one budget for the whole block: a shared budget lets a\n * single huge first field swallow the allowance and erase every later field.\n */\nconst HANDOFF_FIELD_VALUE_MAX_CHARS = 500;\n\n/** Hard upper bound on how many declared fields one predecessor contributes to a handoff. */\nconst HANDOFF_FIELD_MAX_COUNT = 20;\n\n/**\n * Top-level field names a node publishes through `contract.output.fields`, in\n * the order the schema declares them.\n *\n * Declared-only is the invariant: `contract/schema.ts` already refuses\n * `nodes.X.output.fields.Y` unless `Y` sits under `properties`, so declaring a\n * field is the single existing opt-in for \"downstream may see this\". Rendering\n * captured-but-undeclared keys would turn the handoff into a second,\n * unvalidated contract surface that authors cannot version.\n *\n * Gotcha: a schema without `properties` (a bare `{ \"type\": \"object\" }`)\n * publishes nothing — consistent with no consumer being able to bind it either.\n */\nfunction declaredOutputFieldNames(node: FlowNode | undefined): string[] {\n const schema = node?.contract?.output?.fields;\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) return [];\n const properties = (schema as Record<string, unknown>).properties;\n if (!properties || typeof properties !== \"object\" || Array.isArray(properties)) return [];\n return Object.keys(properties);\n}\n\n/**\n * What a consumer's own bindings already put in front of it, as\n * `\"<nodeId> <root> <serializedValue>\"` triples — one binding's provenance and\n * its resolved value, kept together.\n *\n * The pairing is the point. Provenance alone over-suppresses:\n * `${nodes.p.output.fields.score > 5}` reads `score` but shows only `true`, and\n * `…fields.nested.a` shows only that leaf, so dropping the field would delete\n * the very value this block exists to surface while claiming it was already\n * shown. Value identity alone under-discriminates: an unrelated literal that\n * happens to equal a field's value is not that field being shown twice. Two\n * independent sets would still admit the second failure across *different*\n * bindings — one reading the root, another coincidentally carrying the value —\n * so both halves must come from the same binding to count.\n */\nfunction suppliedProducerFields(resolved: {\n origins: Record<string, BindingOrigin[]>;\n values: Record<string, unknown>;\n}): Set<string> {\n const supplied = new Set<string>();\n for (const [name, originList] of Object.entries(resolved.origins)) {\n const serialized = JSON.stringify(resolved.values[name]);\n if (serialized === undefined) continue;\n for (const origin of originList) {\n if (origin.source !== \"node-output\") continue;\n // Keyed on the ROOT segment, so a deep read marks its whole top-level\n // field as read. Node ids and field names cannot contain a space (the\n // expression tokenizer forbids it), so this encoding cannot alias.\n const root = origin.path.split(\".\")[4];\n if (root) supplied.add(`${origin.nodeId} ${root} ${serialized}`);\n }\n }\n return supplied;\n}\n\n/**\n * Render one predecessor's declared output fields for `## Upstream handoff`, so\n * an agent reading a producer as context sees its typed answer and not only its\n * prose — the typed answer was previously reachable only by binding it.\n *\n * Invariants: only fields the producer declared *and* actually emitted render;\n * at most `HANDOFF_FIELD_MAX_COUNT` of them, each value capped at\n * `HANDOFF_FIELD_VALUE_MAX_CHARS`. A field is dropped only when one of the\n * consumer's own bindings both read it and resolved to that exact value — then,\n * and only then, is \"already shown under Supplied bindings\" true of it. Every\n * omission is stated in the block rather than left silent.\n *\n * Gotcha: a truncated value is deliberately not parseable JSON — it is prose\n * for a reader, and re-serializing a partial value would hide the cut.\n *\n * Returns `\"\"` when nothing would render — including when every declared field\n * is suppressed or absent — so no empty `Fields:` heading appears.\n */\nfunction upstreamFieldsBlock(\n predecessor: FlowNode | undefined,\n output: NodeOutput,\n supplied: Set<string>,\n): string {\n const fields = output.fields;\n if (!predecessor || !fields) return \"\";\n\n const renderable: Array<[string, string]> = [];\n let suppressed = 0;\n for (const name of declaredOutputFieldNames(predecessor)) {\n if (!Object.hasOwn(fields, name)) continue;\n const serialized = JSON.stringify(fields[name]) ?? \"null\";\n if (supplied.has(`${predecessor.id} ${name} ${serialized}`)) {\n suppressed += 1;\n continue;\n }\n renderable.push([name, serialized]);\n }\n if (renderable.length === 0) return \"\";\n\n const lines = renderable.slice(0, HANDOFF_FIELD_MAX_COUNT).map(([name, serialized]) => {\n const value =\n serialized.length > HANDOFF_FIELD_VALUE_MAX_CHARS\n ? `${serialized.slice(0, HANDOFF_FIELD_VALUE_MAX_CHARS)} … [truncated from ${serialized.length} chars]`\n : serialized;\n return `- ${name}: ${value}`;\n });\n const overflow = renderable.length - lines.length;\n if (overflow > 0) {\n lines.push(\n `- … ${overflow} more declared field(s) not shown (${HANDOFF_FIELD_MAX_COUNT}-field cap)`,\n );\n }\n if (suppressed > 0) {\n lines.push(\n `- (${suppressed} declared field(s) omitted — already shown under \"Supplied bindings\")`,\n );\n }\n return `\\nFields:\\n${lines.join(\"\\n\")}`;\n}\n\n/** `passed` is the caller's already-computed `successExit` membership test — never recomputed here. */\nfunction deterministicNodeOutput(\n node: DeterministicFlowNode,\n result: NodeExecutorResult,\n passed: boolean,\n): NodeOutput {\n const kindLabel = deterministicNodeKindLabel(node.run.kind);\n const capturedFields: Array<[string, unknown]> = [];\n for (const channel of [\"stdout\", \"stderr\"] as const) {\n const destination = node.run.capture?.[channel];\n if (!destination) continue;\n const match = /^fields\\.([^.]+)$/.exec(destination);\n if (!match?.[1]) {\n throw new Error(\n `${kindLabel} node ${node.id} run.capture.${channel} destination \"${destination}\" is invalid; expected fields.<name>`,\n );\n }\n capturedFields.push([match[1], result[channel]]);\n }\n const fields = Object.fromEntries(capturedFields);\n const summary =\n node.run.kind === \"check\"\n ? `Check node ${node.id} ${passed ? \"passed\" : \"failed\"} with exit status ${result.exitStatus}.`\n : `Function node ${node.id} exited with status ${result.exitStatus}.`;\n return {\n summary,\n artifacts: [],\n ...(Object.keys(fields).length > 0 ? { fields } : {}),\n };\n}\n\ninterface JsonSpanScan {\n /** The sole complete top-level span, when the reply contains exactly one and nothing else bracket-like. */\n span?: string;\n /** Why extraction refused — set for a structural refusal, absent for bracket-free prose. */\n ambiguity?: string;\n}\n\n/**\n * Locate the reply's single balanced top-level JSON structure, refusing on any\n * structural ambiguity rather than guessing. Rationale for each refusal rule:\n * `_devlog/notes/2026-08-16-subprompt-narrated-json-extraction.md`.\n * Gotcha: quotes toggle string tracking only *inside* a span, so a double quote in\n * the surrounding prose is ignored rather than swallowing the payload.\n */\nfunction findSoleJsonSpan(text: string): JsonSpanScan {\n const spans: Array<{ text: string; end: number }> = [];\n const stack: string[] = [];\n let spanStart: number | null = null;\n let inString = false;\n let escaped = false;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (stack.length > 0 && char === '\"') {\n inString = true;\n } else if (char === \"{\" || char === \"[\") {\n if (stack.length === 0) spanStart = i;\n stack.push(char === \"{\" ? \"}\" : \"]\");\n } else if (char === \"}\" || char === \"]\") {\n if (stack.length === 0) {\n return { ambiguity: \"a closing bracket appears outside any JSON structure\" };\n }\n if (stack.pop() !== char) return { ambiguity: \"mismatched bracket\" };\n if (stack.length === 0 && spanStart !== null) {\n spans.push({ text: text.slice(spanStart, i + 1), end: i + 1 });\n spanStart = null;\n }\n }\n }\n\n if (stack.length > 0 || inString) return { ambiguity: \"unterminated JSON structure\" };\n if (spans.length > 1) {\n return {\n ambiguity: `found ${spans.length} candidate JSON values; refusing to guess which is the answer`,\n };\n }\n const sole = spans[0];\n // Plain prose is the pre-existing failure, not an ambiguity — leave it undecorated.\n if (!sole) return {};\n const afterSpan = text.slice(sole.end);\n const lineBreak = afterSpan.indexOf(\"\\n\");\n const restOfLine = lineBreak === -1 ? afterSpan : afterSpan.slice(0, lineBreak);\n if (restOfLine.trim() !== \"\") {\n return { ambiguity: \"the candidate JSON value is embedded mid-sentence\" };\n }\n return { span: sole.text };\n}\n\n/**\n * Pick the JSON payload out of a subprompt's reply — a **fail-closed** tolerance\n * for a fenced or narrated reply, never a repair pass.\n *\n * Invariant: the fallback runs only when the payload used today does not parse, so\n * every currently-working reply yields a byte-identical payload. Refusal returns\n * that payload, leaving the caller's ordinary parse failure to stand, and sets\n * `ambiguity` so the error can say why. The guarantee is *structural*, not semantic\n * — a refusal shaped like a narrated answer is still accepted. Full rationale and\n * the residual limit: `_devlog/notes/2026-08-16-subprompt-narrated-json-extraction.md`.\n */\nfunction extractSubpromptJsonPayload(text: string): { payload: string; ambiguity?: string } {\n const parses = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n };\n const trimmed = text.trim();\n const fenceMatch = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/.exec(trimmed);\n const direct = fenceMatch?.[1] ?? trimmed;\n if (parses(direct)) return { payload: direct };\n\n const scan = findSoleJsonSpan(direct);\n if (scan.span !== undefined) {\n if (parses(scan.span)) return { payload: scan.span };\n return { payload: direct, ambiguity: \"the sole candidate JSON value did not parse\" };\n }\n return scan.ambiguity ? { payload: direct, ambiguity: scan.ambiguity } : { payload: direct };\n}\n\n/**\n * Build a subprompt node's output from its isolated driver's raw text. With no\n * declared output contract the response is prose, carried verbatim as the\n * summary. With one declared, the response is parsed as JSON into `fields` —\n * the runtime's only lever for typed output, since a subprompt has no\n * corrective reprompt to fall back on. A parse failure throws, landing the\n * caller in the same ordinary node-failure path as any other subprompt error.\n *\n * The reply stays in `summary` either way. `build_handoff` does render a\n * predecessor's fields, but only the *declared* ones, capped at 500 characters\n * each and at 20 per predecessor — and a contract without `properties`\n * publishes none at all. A boilerplate summary here would leave every one of\n * those cases with a completed node and no answer for a consumer that reads it\n * as context rather than binding it.\n */\nfunction subpromptNodeOutput(node: SubpromptFlowNode, text: string): NodeOutput {\n const outputSchema = node.contract?.output?.fields;\n if (!outputSchema) return { summary: text.trim(), artifacts: [] };\n const extracted = extractSubpromptJsonPayload(text);\n const parsed = safeParseFields(extracted.payload);\n if (!parsed.fields) {\n const detail = extracted.ambiguity\n ? `${parsed.issues.join(\"; \")} (${extracted.ambiguity})`\n : parsed.issues.join(\"; \");\n throw new Error(`Subprompt node ${node.id} response is not valid JSON: ${detail}`);\n }\n return {\n summary: text.trim(),\n artifacts: [],\n fields: parsed.fields,\n };\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\nconst JsonFieldsSchema = z.record(z.string(), z.json());\n\ninterface ParsedFields {\n fields?: Record<string, unknown>;\n issues: string[];\n}\n\nfunction safeParseFields(value: unknown): ParsedFields {\n let parsed = value;\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value);\n } catch {\n return { issues: [\"fields: malformed JSON; expected an object\"] };\n }\n }\n const result = JsonFieldsSchema.safeParse(parsed);\n if (!result.success) {\n return {\n issues: result.error.issues.map((issue) => {\n const suffix = issue.path.map(String).join(\".\");\n return `fields${suffix ? `.${suffix}` : \"\"}: ${issue.message}`;\n }),\n };\n }\n return { fields: result.data, issues: [] };\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\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"]}