@skaile/workspaces 0.22.0-beta.2 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +387 -0
- package/dist/{asset-feeds-2M6UKEJ7.js → asset-feeds-WKIKSZ6Z.js} +9 -9
- package/dist/{asset-feeds-2M6UKEJ7.js.map → asset-feeds-WKIKSZ6Z.js.map} +1 -1
- package/dist/asset-manager/index.js +7 -7
- package/dist/asset-manager/installer.js +6 -6
- package/dist/asset-manager/src/index.d.ts +15 -0
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/base-assets/connectors/deploy.js +8 -8
- package/dist/base-assets/connectors/devserver.js +8 -8
- package/dist/base-assets/connectors/flow/adapter.js +8 -8
- package/dist/base-assets/connectors/flow/run-flow.js +9 -9
- package/dist/base-assets/connectors/flow.js +8 -8
- package/dist/base-assets/connectors/git.js +8 -8
- package/dist/base-assets/connectors/gmail.js +8 -8
- package/dist/base-assets/connectors/googledrive/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/googledrive.js +8 -8
- package/dist/base-assets/connectors/local.js +8 -8
- package/dist/base-assets/connectors/mattermost.js +8 -8
- package/dist/base-assets/connectors/memory.js +8 -8
- package/dist/base-assets/connectors/minio.js +8 -8
- package/dist/base-assets/connectors/postgres.js +8 -8
- package/dist/base-assets/connectors/s3.js +8 -8
- package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/sharepoint.js +8 -8
- package/dist/base-assets/connectors/sqlite.js +8 -8
- package/dist/base-assets/connectors/static-server.js +8 -8
- package/dist/base-assets/connectors/tunnel.js +8 -8
- package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/webdav.js +8 -8
- package/dist/base-assets/connectors/xstate-store.js +8 -8
- package/dist/base-assets/connectors/xstate.js +8 -8
- package/dist/{chunk-I5SGBFMM.js → chunk-2F3RUZXC.js} +3 -3
- package/dist/{chunk-I5SGBFMM.js.map → chunk-2F3RUZXC.js.map} +1 -1
- package/dist/{chunk-LDLZFYLR.js → chunk-2RFOFHSM.js} +4 -4
- package/dist/{chunk-LDLZFYLR.js.map → chunk-2RFOFHSM.js.map} +1 -1
- package/dist/{chunk-UBLTUFFI.js → chunk-46COM7M5.js} +5 -5
- package/dist/{chunk-UBLTUFFI.js.map → chunk-46COM7M5.js.map} +1 -1
- package/dist/{chunk-LDYPQVRU.js → chunk-542K7SR6.js} +96 -39
- package/dist/chunk-542K7SR6.js.map +1 -0
- package/dist/{chunk-74GTZ4TJ.js → chunk-5ESCS2OS.js} +4 -4
- package/dist/{chunk-74GTZ4TJ.js.map → chunk-5ESCS2OS.js.map} +1 -1
- package/dist/{chunk-FVZLCBSX.js → chunk-AFLH7B64.js} +3 -3
- package/dist/{chunk-FVZLCBSX.js.map → chunk-AFLH7B64.js.map} +1 -1
- package/dist/{chunk-TWQPDBHB.js → chunk-BTAC2VYT.js} +19 -18
- package/dist/chunk-BTAC2VYT.js.map +1 -0
- package/dist/{chunk-NQL3T75I.js → chunk-DH4N5AW4.js} +33 -9
- package/dist/chunk-DH4N5AW4.js.map +1 -0
- package/dist/{chunk-NICAMYPV.js → chunk-DZCFFTAX.js} +9 -9
- package/dist/{chunk-NICAMYPV.js.map → chunk-DZCFFTAX.js.map} +1 -1
- package/dist/{chunk-6SA2SIOU.js → chunk-E4UJ7CVK.js} +31 -126
- package/dist/chunk-E4UJ7CVK.js.map +1 -0
- package/dist/{chunk-CEUHU3C4.js → chunk-LJ52ZKIU.js} +3 -3
- package/dist/{chunk-CEUHU3C4.js.map → chunk-LJ52ZKIU.js.map} +1 -1
- package/dist/{chunk-M5JDVO6D.js → chunk-ODPII24X.js} +3 -3
- package/dist/{chunk-M5JDVO6D.js.map → chunk-ODPII24X.js.map} +1 -1
- package/dist/{chunk-FIHVQFXB.js → chunk-OVQZ5OKL.js} +2 -2
- package/dist/{chunk-FIHVQFXB.js.map → chunk-OVQZ5OKL.js.map} +1 -1
- package/dist/{chunk-6MB7CRME.js → chunk-QMONOHXT.js} +268 -37
- package/dist/chunk-QMONOHXT.js.map +1 -0
- package/dist/{chunk-3KLWGHDE.js → chunk-QTWA6BZK.js} +5 -5
- package/dist/{chunk-3KLWGHDE.js.map → chunk-QTWA6BZK.js.map} +1 -1
- package/dist/{chunk-4NDWKA64.js → chunk-WSZAFRQL.js} +8 -3
- package/dist/chunk-WSZAFRQL.js.map +1 -0
- package/dist/{chunk-VUCPJBAG.js → chunk-YX3UWPJ5.js} +53 -28
- package/dist/chunk-YX3UWPJ5.js.map +1 -0
- package/dist/{chunk-P4FYHEHW.js → chunk-Z3M5K67G.js} +8 -8
- package/dist/chunk-Z3M5K67G.js.map +1 -0
- package/dist/cli/index.js +49 -44
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/manage.d.ts +1 -1
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/cli/src/helpers.d.ts +7 -0
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/connectors/config.js +6 -6
- package/dist/connectors/index.js +8 -8
- package/dist/connectors/rclone.js +2 -1
- package/dist/connectors/src/rclone-process-manager.d.ts +91 -3
- package/dist/connectors/src/rclone-process-manager.d.ts.map +1 -1
- package/dist/connectors/src/watcher.d.ts +6 -0
- package/dist/connectors/src/watcher.d.ts.map +1 -1
- package/dist/core/index.js +5 -5
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/runtime-assets.js +4 -4
- package/dist/core/src/index.d.ts +2 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +6 -6
- package/dist/core/src/manifest.d.ts +16 -0
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +25 -18
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts +8 -2
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts +4 -0
- package/dist/core/src/walker.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +14 -0
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +3 -3
- package/dist/deploy/index.js +5 -5
- package/dist/discovery/index.js +3 -3
- package/dist/{ensure-sources-ALTI5PXR.js → ensure-sources-OJUBGX6Z.js} +10 -10
- package/dist/{ensure-sources-ALTI5PXR.js.map → ensure-sources-OJUBGX6Z.js.map} +1 -1
- package/dist/helpers-LTN3HMD3.js +4 -0
- package/dist/{helpers-I3SREIC3.js.map → helpers-LTN3HMD3.js.map} +1 -1
- package/dist/library/index.js +4 -4
- package/dist/open-library-67FSSQWE.js +13 -0
- package/dist/{open-library-EEGG6RDN.js.map → open-library-67FSSQWE.js.map} +1 -1
- package/dist/{plugin-store-G277ZX3B.js → plugin-store-IZ5SCRAV.js} +7 -7
- package/dist/{plugin-store-G277ZX3B.js.map → plugin-store-IZ5SCRAV.js.map} +1 -1
- package/dist/runner/index.js +10 -10
- package/dist/sdk/asset-manager.js +7 -7
- package/dist/sdk/core.js +5 -5
- package/dist/sdk/index.js +10 -10
- package/dist/sdk/runner.js +10 -10
- package/dist/{setup-REX4I5NE.js → setup-J7CYEQOF.js} +7 -7
- package/dist/{setup-REX4I5NE.js.map → setup-J7CYEQOF.js.map} +1 -1
- package/dist/store-client-AEI6Y3KD.js +14 -0
- package/dist/{store-client-IX3Y67NK.js.map → store-client-AEI6Y3KD.js.map} +1 -1
- package/dist/tui/index.js +10 -10
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-4NDWKA64.js.map +0 -1
- package/dist/chunk-6MB7CRME.js.map +0 -1
- package/dist/chunk-6SA2SIOU.js.map +0 -1
- package/dist/chunk-LDYPQVRU.js.map +0 -1
- package/dist/chunk-NQL3T75I.js.map +0 -1
- package/dist/chunk-P4FYHEHW.js.map +0 -1
- package/dist/chunk-TWQPDBHB.js.map +0 -1
- package/dist/chunk-VUCPJBAG.js.map +0 -1
- package/dist/helpers-I3SREIC3.js +0 -4
- package/dist/open-library-EEGG6RDN.js +0 -13
- package/dist/store-client-IX3Y67NK.js +0 -14
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../connectors/src/connector-base.ts","../base-assets/connectors/git/driver.ts","../base-assets/connectors/local/driver.ts","../base-assets/connectors/s3/driver.ts","../base-assets/connectors/webdav/driver.ts","../base-assets/connectors/sharepoint/driver.ts","../base-assets/connectors/googledrive/driver.ts","../base-assets/connectors/memory/adapter.ts","../base-assets/connectors/postgres/adapter.ts","../base-assets/connectors/sqlite/adapter.ts","../base-assets/connectors/minio/adapter.ts","../base-assets/connectors/xstate/adapter.ts","../base-assets/connectors/xstate-store/adapter.ts","../base-assets/connectors/gmail/adapter.ts","../base-assets/connectors/mattermost/adapter.ts","../base-assets/connectors/devserver/adapter.ts","../base-assets/connectors/static-server/adapter.ts","../base-assets/connectors/tunnel/adapter.ts","../base-assets/connectors/deploy/adapter.ts","../connectors/src/connector-registry.ts","../connectors/src/connector-types.ts","../connectors/src/connector-manager.ts","../connectors/src/connector-prompt.ts","../connectors/src/log-buffer.ts","../connectors/src/credential-helper-script.ts","../connectors/src/managed-gitconfig.ts","../connectors/src/npm-installer.ts","../connectors/src/fleet-utils.ts","../connectors/src/watcher.ts","../connectors/src/worktree.ts","../base-assets/connectors/flow/adapter.ts"],"names":["credentialTag","stat","createConnector","existsSync","mkdirSync","join","dirname","writeFileSync","CACHE_BASE","parseAuthBlob","table","result","readFileSync","resolve","_ctx","instanceToStatus","t","execSync","z","z2","renameSync","require","git"],"mappings":"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","file":"chunk-6SA2SIOU.js","sourcesContent":["import { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport type {\n ConnectContext,\n Connector,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n} from \"./connector-types.js\";\nimport type { WatchHandle, WatchOptions } from \"./shared-types.js\";\n\n/**\n * Base class for unified connectors. Subclasses set `filesystem` and/or `tools`\n * face objects and implement `connect`/`disconnect`. The manager replaces\n * `this.log` via `setLogger()` after construction — do not initialise your own.\n */\nexport abstract class AbstractConnector implements Connector {\n abstract readonly name: string;\n protected log: Logger = createLogger({ kind: \"connector\", subkind: \"unknown\" });\n setLogger(logger: Logger): void {\n this.log = logger;\n }\n\n /** Set by the default `watch()`; call after mutations to emit change events. */\n protected emitChange?: (event: ConnectorChangeEvent) => void;\n\n abstract connect(\n declaration: ConnectorDeclaration,\n ctx: ConnectContext,\n ): Promise<ConnectorHandle>;\n abstract disconnect(handle: ConnectorHandle): Promise<void>;\n\n watch(\n _handle: ConnectorHandle,\n callback: (e: ConnectorChangeEvent) => void,\n _options?: WatchOptions,\n ): WatchHandle {\n this.emitChange = callback;\n return {\n close: async () => {\n this.emitChange = undefined;\n },\n };\n }\n\n async onHibernate(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n async onSessionClose(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n /** Build a handle. Pass `mountPath` only for mountable connectors. */\n protected makeHandle(\n declaration: ConnectorDeclaration,\n state: unknown,\n mountPath?: string,\n ): ConnectorHandle {\n return {\n id: declaration.id,\n driver: this.name,\n access: declaration.access,\n status: \"connected\",\n mountPath,\n state,\n };\n }\n}\n","/**\n * GitConnector — git repository filesystem-face connector.\n * Mounts a git repo by cloning/pulling to a local directory.\n * Session-aware: auto-branching, lifecycle hooks (hibernate/close), periodic fetch/rebase.\n */\n\nimport { execSync } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n ConnectContext,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n MountAuthRef,\n SecretProvider,\n SyncOptions,\n SyncResult,\n TokenMediatorResult,\n WatchHandle,\n WatchOptions,\n} from \"@skaile/workspaces/connectors\";\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}\n\ninterface GitState {\n /** URL of the remote repository. */\n url: string;\n /** Base branch to track (e.g. \"main\"). */\n branch: string;\n /** Active branch (may differ from base when session branching is active). */\n activeBranch: string;\n /** Auth token for HTTPS URLs. */\n token?: string;\n /** Session branching config. */\n session: GitSessionConfig;\n /** Periodic fetch/rebase config. */\n sync: GitSyncConfig;\n /** Lifecycle hook config. */\n lifecycle: GitLifecycleConfig;\n /** Periodic fetch timer ID. */\n fetchTimer?: ReturnType<typeof setInterval>;\n /** Auto-commit idle timer ID. */\n autoCommitTimer?: ReturnType<typeof setTimeout>;\n /** Callback for emitting change events (set by watch()). */\n emitChange?: (event: ConnectorChangeEvent) => void;\n /**\n * Tier-2 managed-gitconfig paths populated when `exposeAccessToken` is on.\n * Cleared on `disconnect`/`onSessionClose` so the credential is removed\n * promptly. Absent for Tier-1 mounts.\n */\n managedGitconfig?: {\n gitconfigPath: string;\n credentialsPath: string;\n urlPrefix: string;\n };\n /**\n * Token mediator captured at connect time for use by refresh ticks. Only\n * populated for `auth: backend` connectors; absent for `pat:` and anonymous.\n */\n tokenMediator?: ConnectorTokenMediator;\n /**\n * Active refresh timer. Set only when the resolved token came from the\n * backend mediator and carried a finite expiry. Cleared on every\n * reschedule and on teardown.\n */\n refreshTimer?: ReturnType<typeof setTimeout>;\n /** 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\nfunction parseSessionConfig(opts: Record<string, unknown> | undefined): GitSessionConfig {\n const raw = (opts?.session as Record<string, unknown>) ?? {};\n return {\n enabled: Boolean(raw.enabled ?? false),\n slug: raw.slug != null ? String(raw.slug) : undefined,\n isMain: Boolean(raw.isMain ?? true),\n branchPrefix: String(raw.branchPrefix ?? \"session/\"),\n fromRef: raw.fromRef != null ? String(raw.fromRef) : undefined,\n };\n}\n\nfunction parseSyncConfig(opts: Record<string, unknown> | undefined): GitSyncConfig {\n const raw = (opts?.sync as Record<string, unknown>) ?? {};\n return {\n fetchIntervalSec: Number(raw.fetchIntervalSec ?? 0),\n autoRebase: Boolean(raw.autoRebase ?? false),\n autoPull: Boolean(raw.autoPull ?? false),\n };\n}\n\nfunction parseLifecycleConfig(opts: Record<string, unknown> | undefined): GitLifecycleConfig {\n const raw = (opts?.lifecycle as Record<string, unknown>) ?? {};\n return {\n commitOnHibernate: Boolean(raw.commitOnHibernate ?? true),\n pushOnHibernate: Boolean(raw.pushOnHibernate ?? true),\n mergeOnClose: Boolean(raw.mergeOnClose ?? true),\n pushOnClose: Boolean(raw.pushOnClose ?? true),\n autoCommitIdleMs: Number(raw.autoCommitIdleMs ?? 30_000),\n pushAfterCommit: Boolean(raw.pushAfterCommit ?? false),\n };\n}\n\n// ── Git helpers ──────────────────────────────────────────────────────────────\n\nfunction git(cmd: string, cwd: string, timeout = 30_000): string {\n return execSync(`git ${cmd}`, { cwd, encoding: \"utf-8\", timeout, stdio: \"pipe\" }).trim();\n}\n\n// Best-effort: align nested submodule checkouts with the parent's pinned SHAs\n// after any ref-changing operation (clone bootstrap, pull, branch switch).\n// `--recurse-submodules` on the initial clone handles the first checkout; this\n// covers every subsequent state change. No-op when `.gitmodules` is absent.\nfunction syncSubmodules(cwd: string): void {\n if (!existsSync(join(cwd, \".gitmodules\"))) return;\n try {\n git(\"submodule update --init --recursive\", cwd, 120_000);\n } catch {\n /* best-effort: a missing submodule shouldn't abort the parent operation */\n }\n}\n\n/**\n * Conservative refname / SHA validator. Used to gate any externally-supplied\n * ref before it interpolates into a shell-form `git` invocation. Accepts a\n * subset of git-check-ref-format(1): forbids whitespace, shell metacharacters,\n * control chars, leading `-` (so the value cannot be misread as a flag), `..`,\n * `@{`, and a trailing `.lock`. Hex SHAs (40 chars) pass through.\n */\nfunction isValidGitRefOrSha(ref: string): boolean {\n if (ref.length === 0 || ref.length > 255) return false;\n // Rejecting control chars is the whole point of this validator — Biome's\n // noControlCharactersInRegex rule does not apply here.\n // biome-ignore lint/suspicious/noControlCharactersInRegex: intentional control-char rejection\n if (/[\\s\\\\~^:?*[\\x00-\\x1f\\x7f`$;&|'\"<>()]/.test(ref)) return false;\n if (ref.startsWith(\"-\") || ref.endsWith(\".lock\") || ref.endsWith(\"/\") || ref.endsWith(\".\"))\n return false;\n if (ref.includes(\"..\") || ref.includes(\"@{\")) return false;\n return true;\n}\n\nfunction hasChanges(cwd: string): boolean {\n const status = git(\"status --porcelain\", cwd);\n return status.length > 0;\n}\n\n/**\n * True when `dir` is empty (no entries, including no dotfiles) or when\n * `readdirSync` fails (e.g. dir does not exist). The \"fails → empty\" mapping\n * is intentional: the caller is about to `mkdir` and proceed, so a missing\n * dir is functionally equivalent to an empty one.\n */\nfunction isDirEmpty(dir: string): boolean {\n try {\n return readdirSync(dir).length === 0;\n } catch {\n return true;\n }\n}\n\nfunction commitAll(cwd: string, message: string): string | null {\n if (!hasChanges(cwd)) return null;\n git(\"add -A\", cwd);\n return git(`commit -m ${JSON.stringify(message)}`, cwd);\n}\n\n/**\n * Structured error used when the backend credential mediator refuses or\n * cannot deliver a token. Carries the wire-format error code so callers\n * (connector manager, retry loop, audit log) can branch on it.\n *\n * @docLink packages/base-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/base-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 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 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 = parseSessionConfig(opts);\n const sync = parseSyncConfig(opts);\n const lifecycle = parseLifecycleConfig(opts);\n\n const state: GitState = {\n url,\n branch,\n activeBranch: branch,\n token: initial.token,\n session,\n sync,\n lifecycle,\n tokenMediator: initial.authRef?.kind === \"backend\" ? tokenMediator : undefined,\n };\n\n // Clone or pull\n const authUrl = this.authUrl(state);\n\n // Minimal-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 try {\n if (existsSync(join(targetDir, \".git\"))) {\n if (this.isInitialisedCheckout(targetDir)) {\n // Functional working checkout — leave it alone. Sync is the\n // lifecycle's job (push on hibernate, periodic fetch, etc.).\n this.log.info(\"found existing checkout — using as-is\", { branch, targetDir });\n } else {\n // `.git` is present but has no resolved HEAD — typically the\n // residue of a prior `initInPlace` call (origin configured, no\n // objects fetched) or an aborted clone. Bootstrap content from\n // the remote *once*, then future connects hit the as-is path above.\n this.log.info(\"found empty .git — bootstrapping from origin\", { branch });\n this.bootstrapFromOrigin(targetDir, branch, authUrl);\n this.log.info(\"bootstrap ok\", { branch, durationMs: Date.now() - started });\n }\n } else {\n mkdirSync(targetDir, { recursive: true });\n if (isDirEmpty(targetDir)) {\n this.log.info(\"clone start\", { url, branch });\n execSync(\n `git clone --branch ${branch} --single-branch --recurse-submodules ${authUrl} ${targetDir}`,\n {\n timeout: 120_000,\n stdio: \"pipe\",\n },\n );\n this.log.info(\"clone ok\", { branch, durationMs: Date.now() - started });\n } else {\n // Populated dir without `.git`. Typical causes: previous connect\n // aborted mid-clone; bind-mount of a worktree whose `.git` FILE\n // points outside the container. We DO NOT overwrite the files —\n // they are likely the user's last working state. We just bring\n // git tracking back online so lifecycle hooks work.\n this.log.warn(\"target non-empty without .git — initialising in place\", { targetDir });\n this.initInPlace(targetDir, authUrl);\n this.log.info(\"init in place ok\", { durationMs: Date.now() - started });\n }\n }\n } catch (err) {\n this.log.error(\"connect preparation failed\", err, { url, branch });\n throw err;\n }\n\n // Session branching: create and checkout a session branch for non-main sessions\n if (session.enabled && !session.isMain && session.slug) {\n const sessionBranch = `${session.branchPrefix}${session.slug}`;\n try {\n git(`rev-parse --verify origin/${sessionBranch}`, targetDir);\n git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);\n } catch {\n // Branch does not exist on origin yet. If a fromRef anchor was supplied\n // (platform fork flow), fetch it and branch off it; otherwise fall back\n // to branching off the currently-checked-out HEAD (== base branch).\n let anchored = false;\n if (session.fromRef) {\n if (!isValidGitRefOrSha(session.fromRef)) {\n // Defense in depth: fromRef interpolates into a shell-form `git`\n // command. Refuse anything that doesn't pass refname/SHA validation\n // rather than letting shell metacharacters through.\n this.log.warn(\"fromRef rejected by refname validation, falling back to base branch\", {\n sessionBranch,\n fromRef: session.fromRef,\n });\n } else {\n try {\n git(`fetch origin ${session.fromRef}`, targetDir);\n git(`checkout -b ${sessionBranch} FETCH_HEAD`, targetDir);\n anchored = true;\n this.log.info(\"session branch created from fromRef\", {\n sessionBranch,\n fromRef: session.fromRef,\n });\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 }\n }\n }\n if (!anchored) {\n git(`checkout -b ${sessionBranch}`, targetDir);\n }\n }\n syncSubmodules(targetDir);\n state.activeBranch = sessionBranch;\n this.log.info(\"session branch checked out\", { sessionBranch });\n }\n\n // Start periodic fetch if configured\n if (sync.fetchIntervalSec > 0) {\n this.startPeriodicFetch(state, targetDir);\n }\n\n // Tier-2: when `exposeAccessToken` is on (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 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 * Fleet-managed connect: verify the host bind, register an explorer watcher,\n * no-op every git lifecycle hook. Spec: `_devlog/specs/2026-05-28-git-fleet-mode-design.md`.\n */\n private async connectFleetManaged(\n declaration: ConnectorDeclaration,\n targetDir: string,\n ): Promise<ConnectorHandle> {\n this.log.info(\"mount handled by host fleet — skipping in-container git\", {\n connectorId: declaration.id,\n targetDir,\n });\n if (declaration.mount?.exposeAccessToken) {\n // Host fleet owns credentials; managed-gitconfig is intentionally skipped.\n this.log.warn(\"fleet-managed: exposeAccessToken ignored — host fleet owns credentials\", {\n connectorId: declaration.id,\n });\n }\n await ensureFleetMounted(targetDir, this.log);\n\n let activeBranch = \"unknown\";\n try {\n activeBranch = git(\"rev-parse --abbrev-ref HEAD\", targetDir, 5_000);\n } catch {\n // worktree may be on a detached HEAD or pre-init; non-fatal.\n }\n\n const state: GitState = {\n url: String(declaration.mount?.source ?? \"\"),\n branch: activeBranch,\n activeBranch,\n session: parseSessionConfig(declaration.options),\n sync: parseSyncConfig(declaration.options),\n lifecycle: parseLifecycleConfig(declaration.options),\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 { credentialsPath, urlPrefix } = s.managedGitconfig;\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 atomicReplaceCredential({\n mountId: connectorId,\n urlPrefix,\n token: result.token,\n credentialsPath,\n });\n s.token = result.token;\n this.log.info(\"refresh\", {\n event: \"refresh\",\n tier: 2,\n provider: \"backend\",\n scope: urlPrefix,\n reason: \"retry-401\",\n expiresAt: result.expiresAt,\n ...(result.scope ? { permissions: result.scope } : {}),\n });\n // Reschedule the proactive timer so the next pre-expiry tick still fires.\n if (result.expiresAt) {\n this.scheduleRefresh(connectorId, s, new Date(result.expiresAt));\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"unmount\");\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host owns the worktree; we only own the watcher.\n await s.fleetWatcher?.close();\n s.fleetWatcher = undefined;\n s.emitChange = undefined;\n return;\n }\n if (s.fetchTimer) {\n clearInterval(s.fetchTimer);\n s.fetchTimer = undefined;\n }\n if (s.autoCommitTimer) {\n clearTimeout(s.autoCommitTimer);\n s.autoCommitTimer = undefined;\n }\n this.teardownManagedCredential(handle.id, s);\n }\n\n private async _sync(handle: ConnectorHandle, _options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host's GitFleetService owns periodic fetch/pull. Returning a no-op\n // SyncResult matches the sharepoint/webdav fleet pattern.\n this.log.debug(\"sync skipped — fleet-managed\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n this.log.debug(\"sync (pull) start\", { branch: s.activeBranch });\n try {\n git(`pull origin ${s.activeBranch}`, handle.mountPath!, 60_000);\n syncSubmodules(handle.mountPath!);\n this.log.debug(\"sync ok\");\n } catch (err) {\n this.log.error(\"sync failed\", err, { branch: s.activeBranch });\n throw err;\n }\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n // ── Watch ──────────────────────────────────────────────────────────────────\n\n override watch(\n handle: ConnectorHandle,\n callback: (event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle {\n const s = handle.state as GitState;\n\n if (s.fleetManaged) {\n // The fleet watcher was created in connectFleetManaged and already\n // dispatches through `s.emitChange`. Hook the caller's callback in and\n // detach on close — no auto-commit timer, no second chokidar instance.\n s.emitChange = callback;\n return {\n close: async () => {\n s.emitChange = undefined;\n },\n };\n }\n\n // Wrap callback to reset auto-commit timer on every file change\n s.emitChange = (event: ConnectorChangeEvent) => {\n callback(event);\n this.resetAutoCommitTimer(s, handle.mountPath!);\n };\n\n let fsWatcher: WatchHandle | null = null;\n\n const ignored = [...(options?.ignored ?? []), \"**/.git/**\"];\n createFsWatcher(handle.mountPath!, s.emitChange, { ...options, ignored }).then((w) => {\n fsWatcher = w;\n });\n\n return {\n close: async () => {\n s.emitChange = undefined;\n await fsWatcher?.close();\n },\n };\n }\n\n // ── Session lifecycle ──────────────────────────────────────────────────────\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n this.log.info(\"hibernate\");\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host GitFleetService schedules pushes via its idle-debounce timer.\n return \"fleet-managed\";\n }\n const lc = s.lifecycle;\n if (!lc.commitOnHibernate) return;\n\n const result = commitAll(handle.mountPath!, `skaile: hibernate snapshot`);\n if (!result) return \"Nothing to commit.\";\n\n const sha = git(\"rev-parse --short HEAD\", handle.mountPath!);\n\n if (lc.pushOnHibernate) {\n try {\n git(`push origin ${s.activeBranch}`, handle.mountPath!, 60_000);\n this.log.info(\"push ok\", { branch: s.activeBranch });\n } catch (err) {\n this.log.error(\"push failed\", err, { branch: s.activeBranch });\n throw err;\n }\n }\n\n return `Committed ${sha} on ${s.activeBranch}${lc.pushOnHibernate ? \" (pushed)\" : \"\"}`;\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n this.log.info(\"session closed\");\n const s = handle.state as GitState;\n if (s.fleetManaged) {\n // Host's GitFleetService detaches the worktree when its session refcount\n // reaches zero; merge/push are its job, not ours.\n return \"fleet-managed\";\n }\n const lc = s.lifecycle;\n const details: string[] = [];\n\n // Commit any remaining work on the session branch\n const commitResult = commitAll(handle.mountPath!, `skaile: session close`);\n if (commitResult) {\n const sha = git(\"rev-parse --short HEAD\", handle.mountPath!);\n details.push(`Committed ${sha}`);\n }\n\n // Push session branch\n if (lc.pushOnClose || lc.mergeOnClose) {\n git(`push origin ${s.activeBranch}`, handle.mountPath!, 60_000);\n details.push(`Pushed ${s.activeBranch}`);\n }\n\n // Merge session branch into base branch\n if (lc.mergeOnClose && s.activeBranch !== s.branch) {\n git(`checkout ${s.branch}`, handle.mountPath!);\n git(`pull origin ${s.branch}`, handle.mountPath!, 60_000);\n syncSubmodules(handle.mountPath!);\n try {\n git(`merge ${s.activeBranch}`, handle.mountPath!);\n } catch {\n const resolved = this.resolveConflictsOrAbort(s, handle.mountPath!, \"merge\");\n if (resolved) {\n details.push(\"Resolved merge conflicts (created .conflict files)\");\n }\n }\n\n if (lc.pushOnClose) {\n git(`push origin ${s.branch}`, handle.mountPath!, 60_000);\n }\n\n details.push(`Merged ${s.activeBranch} into ${s.branch}`);\n }\n\n // Tier-2: best-effort teardown of the agent-facing credential when the\n // session closes. The runner also tears connectors down on container\n // shutdown, but the host may invoke `onSessionClose` first.\n this.teardownManagedCredential(handle.id, s);\n\n return details.join(\"; \") || undefined;\n }\n\n // ── Private: managed gitconfig (Tier-2 credential exposure) ──────────────\n\n /**\n * Compute the URL prefix used to scope the credential helper. We key on\n * host plus the first path segment when one is present (e.g. for\n * `https://github.com/orgA/repo.git` we register\n * `https://github.com/orgA/`). This lets two connectors on the same host\n * with disjoint org prefixes coexist; same-host repos under one org just\n * share the same scope.\n */\n private deriveUrlPrefix(url: string): string {\n const u = new URL(url);\n const segments = u.pathname.split(\"/\").filter(Boolean);\n if (segments.length > 0) {\n return `${u.protocol}//${u.host}/${segments[0]}/`;\n }\n return `${u.protocol}//${u.host}`;\n }\n\n /**\n * Acquire the initial credential for a connector.\n *\n * `auth:` accepts the post-2026-05-06 grammar:\n * - `backend` → request a token from the platform mediator\n * (preferred for any platform-backed session).\n * - `pat:env:NAME` → static token from the secrets chain\n * (standalone CLI / non-platform contexts).\n *\n * Anonymous connectors (`auth` unset) succeed without a token — the\n * `git clone`/`git pull` calls still work for public repos.\n *\n * @returns The parsed auth ref, the resolved token (when any), and the\n * `expiresAt` timestamp surfaced by the mediator (used to schedule a\n * refresh tick when the credential is exposed to the agent CLI).\n */\n private async acquireInitialToken(\n declaration: ConnectorDeclaration,\n secrets: SecretProvider | undefined,\n tokenMediator: ConnectorTokenMediator | undefined,\n ): Promise<{\n authRef: MountAuthRef | undefined;\n token: string | undefined;\n expiresAt: Date | null;\n scope?: string[];\n }> {\n if (!declaration.auth) {\n return { authRef: undefined, token: undefined, expiresAt: null };\n }\n const authRef = resolveAuthRef(declaration.auth, declaration.id);\n if (!authRef) {\n return { authRef: undefined, token: undefined, expiresAt: null };\n }\n\n if (authRef.kind === \"backend\") {\n if (!tokenMediator) {\n throw new Error(\n `Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired ` +\n `(standalone CLI does not have one — use 'pat:env:NAME' instead).`,\n );\n }\n const result = await tokenMediator({ connectorId: declaration.id, reason: \"initial\" });\n if (!result.ok) {\n this.log.error(\"backend mediator refused initial token\", undefined, {\n connectorId: declaration.id,\n code: result.code,\n message: result.message,\n });\n throw new TokenMediatorError(result.message, result.code, declaration.id);\n }\n return {\n authRef,\n token: result.token,\n expiresAt: result.expiresAt ? new Date(result.expiresAt) : null,\n ...(result.scope ? { scope: result.scope } : {}),\n };\n }\n\n // PAT path — resolve via secrets chain when available, fall back to\n // process.env for standalone CLI contexts.\n const inner = authRef.value;\n let token: string | undefined;\n if (secrets) {\n token = secrets.resolve(inner);\n } else if (inner.startsWith(\"env:\")) {\n token = process.env[inner.slice(4)];\n } else {\n token = inner;\n }\n if (!token) {\n throw new Error(\n `PAT auth ref '${authRef.raw}' did not resolve to a token. ` +\n `Provision '${authRef.value}' in the SecretProviderChain.`,\n );\n }\n return { authRef, token, expiresAt: null };\n }\n\n private exposeManagedCredential(\n declaration: ConnectorDeclaration,\n state: GitState,\n url: string,\n initial: {\n authRef: MountAuthRef | undefined;\n token: string | undefined;\n expiresAt: Date | null;\n scope?: string[];\n },\n ): void {\n const token = initial.token;\n if (!token) {\n this.log.warn(\"managed-gitconfig: skipped — no token resolved\", {\n connectorId: declaration.id,\n });\n return;\n }\n if (!url.startsWith(\"https://\") && !url.startsWith(\"http://\")) {\n this.log.warn(\"managed-gitconfig: skipped — non-http remote\", {\n connectorId: declaration.id,\n url,\n });\n return;\n }\n\n const gitconfigPath = process.env.GIT_CONFIG_GLOBAL;\n if (!gitconfigPath) {\n this.log.warn(\"managed-gitconfig: GIT_CONFIG_GLOBAL not set — agent CLI auth will not work\", {\n connectorId: declaration.id,\n });\n return;\n }\n const skaileDir = dirname(gitconfigPath);\n const credentialsPath = join(skaileDir, \"git-credentials\");\n const urlPrefix = this.deriveUrlPrefix(url);\n\n // Step 9a: write a per-connector credential-helper script so the agent's\n // interactive `git` can refresh stale tokens mid-401 by signalling the\n // runner via a refresh-flag file. The runner watches that flag and\n // re-mints tokens on `change`. The script is per-connector (not per-\n // workspace) because each one carries its own credentialsPath + tag.\n const refreshFlagPath = join(skaileDir, \"refresh-request\");\n const helperScriptPath = join(skaileDir, `credential-helper-${declaration.id}.sh`);\n const credentialTag = `# skaile-mount: ${declaration.id}`;\n const scriptBody = renderCredentialHelperScript({\n credentialsPath,\n refreshFlagPath,\n credentialTag,\n });\n try {\n writeHelperScript(helperScriptPath, scriptBody);\n } catch (err) {\n this.log.warn(\n \"managed-gitconfig: failed to write credential-helper script -- falling back to static helper\",\n {\n connectorId: declaration.id,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n\n writeMountBlock({\n mountId: declaration.id,\n urlPrefix,\n token,\n gitconfigPath,\n credentialsPath,\n helperScriptPath,\n });\n\n state.managedGitconfig = { gitconfigPath, credentialsPath, urlPrefix };\n\n const providerKind = initial.authRef?.kind ?? \"pat\";\n const isRefreshable = providerKind === \"backend\" && initial.expiresAt !== null;\n\n // Spec'd schema: kind=mount, subkind=git, instance=<id>, data.event=mint,\n // data.tier=2, data.provider, data.scope. PAT path is static — flag the\n // warning so operators see \"no refresh\" in the logs.\n this.log.info(\"mint\", {\n event: \"mint\",\n origin: \"tier-2\",\n tier: 2,\n provider: providerKind,\n scope: urlPrefix,\n expiresAt: initial.expiresAt ? initial.expiresAt.toISOString() : null,\n ...(initial.scope ? { permissions: initial.scope } : {}),\n ...(isRefreshable ? {} : { warning: \"static-credential\" }),\n });\n\n // Backend-mediated tokens with finite expiry → schedule the rotation\n // tick. The 5-minute lead lets the long-push 401 retry path re-read the\n // new token via `credential.helper store` before the in-flight token\n // expires.\n if (isRefreshable && state.tokenMediator && initial.expiresAt) {\n this.scheduleRefresh(declaration.id, state, initial.expiresAt);\n }\n }\n\n /**\n * Schedule the next refresh of the credential file.\n *\n * Cancels any existing timer first so re-connects (and the test harness)\n * do not double-fire. Uses a 5-minute lead per spec; if the lead is\n * negative (very short-lived test tokens) we fall back to a tiny delay\n * so the timer still fires in deterministic order.\n */\n private scheduleRefresh(connectorId: string, state: GitState, expiresAt: Date): void {\n if (state.refreshTimer) {\n clearTimeout(state.refreshTimer);\n state.refreshTimer = undefined;\n }\n const FIVE_MINUTES_MS = 5 * 60 * 1000;\n const delay = Math.max(1_000, expiresAt.getTime() - Date.now() - FIVE_MINUTES_MS);\n state.refreshTimer = setTimeout(() => {\n this.refreshManagedCredential(connectorId, state).catch((err) => {\n this.log.error(\"managed-gitconfig refresh failed\", err, { connectorId });\n });\n }, delay);\n }\n\n private async refreshManagedCredential(connectorId: string, state: GitState): Promise<void> {\n if (!state.managedGitconfig || !state.tokenMediator) return;\n const { credentialsPath, urlPrefix } = state.managedGitconfig;\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 atomicReplaceCredential({\n mountId: connectorId,\n urlPrefix,\n token: result.token,\n credentialsPath,\n });\n state.token = result.token;\n\n this.log.info(\"refresh\", {\n event: \"refresh\",\n tier: 2,\n provider: \"backend\",\n scope: urlPrefix,\n expiresAt: result.expiresAt,\n ...(result.scope ? { permissions: result.scope } : {}),\n });\n\n if (result.expiresAt) {\n this.scheduleRefresh(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 if (!state.managedGitconfig) return;\n try {\n removeMountBlock({\n mountId: connectorId,\n gitconfigPath: state.managedGitconfig.gitconfigPath,\n credentialsPath: state.managedGitconfig.credentialsPath,\n });\n this.log.info(\"teardown\", {\n event: \"teardown\",\n tier: 2,\n scope: state.managedGitconfig.urlPrefix,\n });\n } catch (err) {\n this.log.warn(\"managed-gitconfig: teardown best-effort failed\", {\n connectorId,\n error: err instanceof Error ? err.message : String(err),\n });\n } finally {\n state.managedGitconfig = undefined;\n state.tokenMediator = undefined;\n }\n }\n\n // ── Private: in-place git init ───────────────────────────────────────────\n\n /**\n * Bring a populated, non-git directory under git tracking without\n * touching the working tree. Runs only on the \"dir populated, no `.git`\"\n * branch of `connect()` — exactly when a previous connect aborted before\n * `.git` was written, or when the bind-mounted host dir's `.git` FILE\n * pointed outside the container.\n *\n * The intent is to preserve whatever the agent last had on disk. We\n * therefore:\n * - `git init` — creates `.git/`; does not modify any existing file.\n * - `git remote add origin <authUrl>` — wires up the remote so the\n * normal lifecycle hooks (`pushOnHibernate`, `pushAfterCommit`)\n * have a target.\n *\n * Deliberately omitted:\n * - `fetch` — would touch the network on every recreate. The lifecycle\n * handles sync explicitly (periodic `fetch`/`pull` via\n * `sync.autoPull`, push on hibernate, etc.).\n * - `checkout -f` / `reset --hard` / `clean -fd` — would discard the\n * user's last on-disk state. The agent or autocommit reconciles\n * with the remote later.\n *\n * Token persistence: the auth URL gets written into `.git/config`\n * exactly like the `git clone <authUrl>` path does — token-rotation\n * handling is external to this method (managed-gitconfig credential\n * helper refresh in Tier-2 connectors).\n */\n private initInPlace(targetDir: string, authUrl: string): void {\n git(\"init\", targetDir, 10_000);\n // Replace any existing origin (idempotent across re-connects).\n try {\n git(\"remote remove origin\", targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n execSync(`git remote add origin ${authUrl}`, {\n cwd: targetDir,\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: \"pipe\",\n });\n }\n\n /**\n * True when `<targetDir>/.git` contains at least one resolvable commit\n * (i.e. `HEAD` points at a real object). False when `.git` is an empty\n * shell — e.g. just-initialised but never fetched, or all refs deleted.\n *\n * Used by `connect()` to tell the difference between a working agent\n * checkout (preserve, don't touch) and a half-initialised one\n * (bootstrap by fetching from origin).\n */\n private isInitialisedCheckout(targetDir: string): boolean {\n try {\n git(\"rev-parse HEAD\", targetDir, 5_000);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * One-shot bootstrap path for the \"`.git` exists but is empty\" state.\n *\n * Runs `fetch --depth=1 origin <branch>` followed by `checkout -B\n * <branch> origin/<branch>` so the working tree gets the remote\n * content. Before the checkout, any untracked file whose path also\n * exists in the remote tree is renamed to `<path>.local` so the user\n * (or previous agent run) does not lose data. Other untracked files\n * are left in place.\n *\n * Deliberately not destructive: we never `clean -fd` and never\n * `reset --hard`. Files that do not conflict with the remote stay\n * exactly where they are.\n *\n * Auth-URL handling matches `initInPlace`: a pre-existing `origin`\n * remote is replaced with the authed URL so the fetch works even\n * after token rotation. This persists the token in `.git/config`\n * the same way `git clone <authUrl>` does — token-rotation handling\n * is external to this connector method.\n */\n private bootstrapFromOrigin(targetDir: string, branch: string, authUrl: string): void {\n // Ensure origin points at the current authed URL — handles the case\n // where the previous `initInPlace` wrote a stale token, or the\n // remote was never configured at all.\n try {\n git(\"remote remove origin\", targetDir, 5_000);\n } catch {\n /* no existing origin — fine */\n }\n execSync(`git remote add origin ${authUrl}`, {\n cwd: targetDir,\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: \"pipe\",\n });\n git(`fetch --depth=1 origin ${branch}`, targetDir, 120_000);\n this.preserveConflictingUntracked(targetDir, branch);\n git(`checkout -B ${branch} origin/${branch}`, targetDir, 30_000);\n syncSubmodules(targetDir);\n try {\n git(`branch --set-upstream-to=origin/${branch} ${branch}`, targetDir, 5_000);\n } catch {\n /* best-effort */\n }\n }\n\n /**\n * Walk the remote tree at `origin/<branch>` and rename any untracked\n * working-tree file whose path also exists there. Renames go to\n * `<path>.local`; on `.local` collision a millisecond suffix is\n * appended so nothing is overwritten.\n *\n * This makes the subsequent `git checkout -B <branch> origin/<branch>`\n * safe: without it, `checkout` aborts with \"untracked working tree\n * files would be overwritten\" the moment any local file collides with\n * a tracked path on the remote.\n *\n * Files in the local tree whose paths are NOT in the remote tree are\n * left untouched — they are pure local additions and survive the\n * bootstrap.\n */\n private preserveConflictingUntracked(targetDir: string, branch: string): void {\n let remoteFiles: string[] = [];\n try {\n remoteFiles = git(`ls-tree -r origin/${branch} --name-only`, targetDir, 30_000)\n .split(\"\\n\")\n .filter(Boolean);\n } catch (err) {\n this.log.warn(\"ls-tree failed — skipping untracked preservation\", {\n branch,\n error: err instanceof Error ? err.message : String(err),\n });\n return;\n }\n for (const relPath of remoteFiles) {\n const fullPath = join(targetDir, relPath);\n if (!existsSync(fullPath)) continue;\n let dest = `${fullPath}.local`;\n if (existsSync(dest)) {\n dest = `${fullPath}.local.${Date.now()}`;\n }\n try {\n renameSync(fullPath, dest);\n this.log.info(\"preserved local file as .local\", { path: relPath, dest });\n } catch (err) {\n this.log.warn(\"failed to preserve local file — checkout may fail\", {\n path: relPath,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n // ── Private: auth URL ─────────────────────────────────────────────────────\n\n private authUrl(s: GitState): string {\n if (s.token && s.url.startsWith(\"https://\")) {\n const urlObj = new URL(s.url);\n urlObj.username = \"x-access-token\";\n urlObj.password = s.token;\n return urlObj.toString();\n }\n return s.url;\n }\n\n // ── Periodic fetch ─────────────────────────────────────────────────────────\n\n private startPeriodicFetch(s: GitState, mountPath: string): void {\n if (s.fetchTimer) clearInterval(s.fetchTimer);\n\n const intervalMs = s.sync.fetchIntervalSec * 1000;\n s.fetchTimer = setInterval(() => {\n try {\n git(\"fetch origin\", mountPath, 60_000);\n if (s.sync.autoRebase && s.activeBranch !== s.branch) {\n try {\n git(`rebase origin/${s.branch}`, mountPath, 60_000);\n } catch {\n this.resolveConflictsOrAbort(s, mountPath, \"rebase\");\n }\n syncSubmodules(mountPath);\n } else if (s.sync.autoPull) {\n git(`pull origin ${s.activeBranch}`, mountPath, 60_000);\n syncSubmodules(mountPath);\n }\n } catch {\n // Periodic fetch is best-effort\n }\n }, intervalMs);\n }\n\n // ── Conflict resolution ──────────────────────────────────────────────────\n\n /**\n * Attempt to resolve merge/rebase conflicts by keeping \"ours\" and copying\n * \"theirs\" to a .conflict file. If resolution fails entirely, abort.\n * Returns true if conflicts were resolved, false if aborted.\n */\n private resolveConflictsOrAbort(\n s: GitState,\n mountPath: string,\n mode: \"rebase\" | \"merge\",\n ): boolean {\n try {\n const conflicted = git(\"diff --name-only --diff-filter=U\", mountPath)\n .split(\"\\n\")\n .filter(Boolean);\n\n if (conflicted.length === 0) return false;\n\n for (const file of conflicted) {\n this.resolveFileConflict(mountPath, file);\n }\n\n // Continue the rebase/merge\n if (mode === \"rebase\") {\n git(\"-c core.editor=true rebase --continue\", mountPath, 30_000);\n } else {\n git(`commit --no-edit`, mountPath);\n }\n\n // Emit change events for conflict files\n for (const file of conflicted) {\n const ext = file.includes(\".\") ? file.slice(file.lastIndexOf(\".\")) : \"\";\n const base = file.includes(\".\") ? file.slice(0, file.lastIndexOf(\".\")) : file;\n s.emitChange?.({\n path: `${base}.conflict${ext}`,\n action: \"create\",\n source: \"sync\",\n });\n }\n\n return true;\n } catch {\n // Abort if resolution fails\n try {\n if (mode === \"rebase\") {\n git(\"rebase --abort\", mountPath);\n } else {\n git(\"merge --abort\", mountPath);\n }\n } catch {\n /* already clean */\n }\n return false;\n }\n }\n\n /**\n * For a single conflicted file: keep \"ours\", save \"theirs\" as .conflict file.\n */\n private resolveFileConflict(root: string, file: string): void {\n const ext = file.includes(\".\") ? file.slice(file.lastIndexOf(\".\")) : \"\";\n const base = file.includes(\".\") ? file.slice(0, file.lastIndexOf(\".\")) : file;\n const conflictPath = `${base}.conflict${ext}`;\n\n try {\n // Extract \"theirs\" version (stage 3)\n const theirs = git(`show :3:${file}`, root);\n writeFileSync(join(root, conflictPath), theirs);\n } catch {\n // If we can't get theirs, copy the conflicted file as-is\n const fullPath = join(root, file);\n if (existsSync(fullPath)) {\n const content = readFileSync(fullPath, \"utf-8\");\n writeFileSync(join(root, conflictPath), content);\n }\n }\n\n try {\n // Keep \"ours\" version (stage 2)\n const ours = git(`show :2:${file}`, root);\n writeFileSync(join(root, file), ours);\n } catch {\n // Strip conflict markers, keeping our sections\n const fullPath = join(root, file);\n if (existsSync(fullPath)) {\n const content = readFileSync(fullPath, \"utf-8\");\n writeFileSync(fullPath, this.stripConflictKeepOurs(content));\n }\n }\n\n git(`add ${file} ${conflictPath}`, root);\n }\n\n private stripConflictKeepOurs(content: string): string {\n return content.replace(/<<<<<<< .*\\n/g, \"\").replace(/=======\\n[\\s\\S]*?>>>>>>> .*\\n/g, \"\");\n }\n\n // ── Auto-commit on idle ────────────────────────────────────────────────────\n\n private resetAutoCommitTimer(s: GitState, mountPath: string): void {\n if (s.lifecycle.autoCommitIdleMs <= 0) return;\n if (s.autoCommitTimer) clearTimeout(s.autoCommitTimer);\n s.autoCommitTimer = setTimeout(() => {\n this.performAutoCommit(s, mountPath);\n }, s.lifecycle.autoCommitIdleMs);\n }\n\n private performAutoCommit(s: GitState, mountPath: string): void {\n try {\n const message = this.generateCommitMessage(mountPath);\n const result = commitAll(mountPath, message);\n if (!result) return;\n if (s.lifecycle.pushAfterCommit) {\n try {\n git(`push origin ${s.activeBranch}`, mountPath, 60_000);\n } catch {\n // Push is best-effort\n }\n }\n } catch {\n // Auto-commit is best-effort\n }\n }\n\n private generateCommitMessage(mountPath: string): string {\n try {\n git(\"add -A\", mountPath);\n const stat = git(\"diff --cached --stat\", mountPath);\n const lines = stat.split(\"\\n\").filter((l) => l.includes(\"|\"));\n if (lines.length === 0) return \"skaile: auto-save\";\n const files = lines.map((l) => l.split(\"|\")[0]!.trim());\n if (files.length === 1) return `Update ${files[0]}`;\n return `Update ${files.length} files`;\n } catch {\n return \"skaile: auto-save\";\n }\n }\n}\n\n/**\n * Creates a new GitConnector instance.\n * @returns Configured GitConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#git-connector-factory\n */\nexport function createConnector(): GitConnector {\n return new GitConnector();\n}\n","/**\n * LocalConnector — passthrough to a local directory.\n * Copies (or symlinks) a source directory into the mount point.\n */\n\nimport { cpSync, existsSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type {\n SyncOptions,\n SyncResult,\n WatchHandle,\n WatchOptions,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorChangeEvent,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n} from \"@skaile/workspaces/connectors\";\nimport { createFsWatcher } from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\ninterface LocalState {\n /** Resolved absolute path to the source directory. */\n sourceDir: string;\n}\n\n/**\n * Filesystem-face connector for local filesystem directories — copies the source directory\n * into the mount target on connect and syncs on demand.\n * No external dependencies; ideal for development and local file access.\n * @docLink packages/base-assets/concepts#local-connector\n */\nexport class LocalConnector extends AbstractConnector {\n readonly name = \"local\";\n\n readonly filesystem: FilesystemFace = {\n sync: (handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> => {\n return this._sync(handle, options);\n },\n };\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const targetDir = ctx.mountTarget;\n if (!targetDir) {\n throw new Error(\"LocalConnector requires ctx.mountTarget to be set by the manager\");\n }\n\n const started = Date.now();\n const source = declaration.mount?.source ?? \"\";\n this.log.info(\"mount start\", { source, targetDir });\n const sourceDir = resolve(String(source));\n if (!existsSync(sourceDir)) {\n this.log.error(\"connect failed: source path does not exist\", undefined, {\n sourceDir,\n });\n throw new Error(`Local source path does not exist: ${sourceDir}`);\n }\n\n mkdirSync(targetDir, { recursive: true });\n\n // Copy source to target (skip if same path or target inside source)\n const src = resolve(sourceDir);\n const tgt = resolve(targetDir);\n if (src !== tgt && !tgt.startsWith(`${src}/`)) {\n cpSync(src, tgt, { recursive: true });\n }\n\n this.log.info(\"mount ok\", { targetDir, durationMs: Date.now() - started });\n return this.makeHandle(declaration, { sourceDir } satisfies LocalState, targetDir);\n }\n\n async disconnect(_handle: ConnectorHandle): Promise<void> {\n this.log.info(\"unmount\");\n // No-op for local filesystem — don't delete the mount directory\n }\n\n private async _sync(handle: ConnectorHandle, _options?: SyncOptions): Promise<SyncResult> {\n this.log.debug(\"sync start\");\n const { sourceDir } = handle.state as LocalState;\n const src = resolve(sourceDir);\n const tgt = resolve(handle.mountPath!);\n\n if (src === tgt || tgt.startsWith(`${src}/`)) {\n this.log.debug(\"sync ok (no-op: source equals target)\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n mkdirSync(handle.mountPath!, { recursive: true });\n cpSync(src, handle.mountPath!, { recursive: true });\n\n this.log.debug(\"sync ok\");\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n override watch(\n handle: ConnectorHandle,\n callback: (event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle {\n let fsWatcher: WatchHandle | null = null;\n\n createFsWatcher(handle.mountPath!, callback, options).then((w) => {\n fsWatcher = w;\n });\n\n return {\n close: async () => {\n await fsWatcher?.close();\n },\n };\n }\n}\n\n/**\n * Creates a new LocalConnector instance.\n * @returns Configured LocalConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#local-connector-factory\n */\nexport function createConnector(): LocalConnector {\n return new LocalConnector();\n}\n","/**\n * S3Connector — AWS S3 / S3-compatible object storage filesystem-face connector.\n * Mounts by syncing objects to a local directory.\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { resolveAuth } from \"@skaile/workspaces/connectors\";\nimport type { SyncOptions, SyncResult } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n} from \"@skaile/workspaces/connectors\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\n\nconst s3Pkg = \"@aws-sdk/client-s3\";\n\n/**\n * Minimal shape of the AWS S3 SDK module used internally.\n * Declared here so tests can provide a lightweight fake without importing the\n * real (optional) `@aws-sdk/client-s3` package.\n */\nexport interface S3SdkModule {\n S3Client: new (\n config: object,\n ) => {\n send(cmd: object): Promise<any>;\n destroy(): void;\n };\n ListObjectsV2Command: new (input: object) => object;\n GetObjectCommand: new (input: object) => object;\n}\n\ninterface S3State {\n client: InstanceType<S3SdkModule[\"S3Client\"]>;\n bucket: string;\n prefix: string;\n region: string;\n}\n\n/**\n * Filesystem-face connector for AWS S3 and S3-compatible object storage — downloads all\n * objects from a bucket prefix into a local directory on connect and re-downloads on sync.\n * Requires the `@aws-sdk/client-s3` optional peer dependency.\n * @docLink packages/base-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 const profile = resolveAuth(declaration.auth, secrets);\n if (profile) {\n process.env.AWS_PROFILE = profile;\n }\n\n const client = new S3Client(clientConfig);\n const state: S3State = { client, bucket, prefix, region };\n\n // Initial sync: download objects to targetDir\n mkdirSync(targetDir, { recursive: true });\n try {\n const result = await this.downloadAll(state, targetDir);\n this.log.info(\"mount ok\", {\n targetDir,\n filesWritten: result.filesWritten,\n durationMs: Date.now() - started,\n });\n return this.makeHandle(declaration, state, targetDir);\n } catch (err) {\n this.log.error(\"connect failed\", err, { bucket, targetDir });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"unmount\");\n const { client } = handle.state as S3State;\n client.destroy();\n }\n\n private async _sync(handle: ConnectorHandle, _options?: SyncOptions): Promise<SyncResult> {\n this.log.debug(\"sync start\");\n const state = handle.state as S3State;\n try {\n const result = await this.downloadAll(state, handle.mountPath!);\n this.log.debug(\"sync ok\", { filesWritten: result.filesWritten });\n return result;\n } catch (err) {\n this.log.error(\"sync failed\", err);\n throw err;\n }\n }\n\n private async downloadAll(state: S3State, targetDir: string): Promise<SyncResult> {\n const s3Mod = await this._loadSdk();\n const { client, bucket, prefix } = state;\n\n // List all objects\n const entries: Array<{ key: string; relPath: string }> = [];\n let continuationToken: string | undefined;\n\n do {\n const resp = await client.send(\n new s3Mod.ListObjectsV2Command({\n Bucket: bucket,\n Prefix: prefix,\n MaxKeys: 1000,\n ContinuationToken: continuationToken,\n }),\n );\n\n for (const obj of resp.Contents ?? []) {\n const relPath =\n prefix && obj.Key?.startsWith(prefix) ? obj.Key.slice(prefix.length) : obj.Key;\n if (!relPath) continue;\n entries.push({ key: obj.Key, relPath });\n }\n\n continuationToken = resp.IsTruncated ? resp.NextContinuationToken : undefined;\n } while (continuationToken);\n\n // Download each file\n let filesWritten = 0;\n for (const { key, relPath } of entries) {\n try {\n const resp = await client.send(new s3Mod.GetObjectCommand({ Bucket: bucket, Key: key }));\n const body = await resp.Body?.transformToString();\n if (body == null) continue;\n\n const localPath = join(targetDir, relPath);\n mkdirSync(dirname(localPath), { recursive: true });\n writeFileSync(localPath, body);\n filesWritten++;\n } catch (err) {\n this.log.warn(\"object download failed\", {\n key,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { filesWritten, filesDeleted: 0, bytesTransferred: 0 };\n }\n}\n\n/**\n * Creates a new 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/base-assets/api-reference#s3-connector-factory\n */\nexport function createConnector(sdkOverride?: S3SdkModule): S3Connector {\n return new S3Connector(sdkOverride);\n}\n","/**\n * WebDAVConnector -- WebDAV server filesystem-face connector backed by rclone FUSE.\n *\n * The whole data plane (enumeration, download, upload, change detection,\n * cache eviction) is delegated to an `rclone mount` subprocess managed by\n * {@link RcloneProcessManager}. This connector only parses the declaration,\n * obscures the password, renders the rclone config, hands it off, and\n * forwards lifecycle hooks.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n RcloneHandle,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureDirMode,\n ensureFleetMounted,\n isFleetManaged,\n RcloneProcessManager,\n renderWebDAVConfig,\n resolveAuth,\n type WebDAVVendor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface WebDAVState {\n rcloneHandle: RcloneHandle | null;\n fleetManaged?: boolean;\n}\n\ninterface ParsedAuth {\n username: string | null;\n password: string | null;\n bearerToken: string | null;\n}\n\nconst CACHE_BASE = \"/var/cache/skaile\";\nconst ALLOWED_VENDORS: ReadonlySet<WebDAVVendor> = new Set([\n \"nextcloud\",\n \"owncloud\",\n \"sharepoint\",\n \"fastmail\",\n \"other\",\n]);\n\nconst execFileP = promisify(execFile);\n\n/**\n * Filesystem-face connector for WebDAV servers (Nextcloud, ownCloud, SharePoint-WebDAV,\n * Fastmail, generic) — delegates the data plane to an `rclone mount` subprocess via\n * `RcloneProcessManager`. Supports fleet-managed mode where the host has pre-mounted\n * the share via `SKAILE_FLEET_MANAGED_MOUNTS`.\n * @docLink packages/base-assets/concepts#webdav-connector\n */\nexport class WebDAVConnector extends AbstractConnector {\n readonly name = \"webdav\";\n\n private rclone = new RcloneProcessManager();\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(\"WebDAVConnector requires ctx.mountTarget to be set by the manager\");\n }\n const secrets = ctx.secrets;\n\n const opts = declaration.options;\n this.log.info(\"mount called\", {\n optionKeys: opts ? Object.keys(opts) : [],\n hasAuth: declaration.auth !== undefined,\n });\n\n // Phase 7B: when the host fleet has already mounted this share, the\n // container received a bind at `targetDir` and there is nothing for\n // the in-container connector to spawn. Verify the bind is live, then\n // produce a no-op handle that the rest of the lifecycle can carry.\n if (isFleetManaged(declaration.id)) {\n this.log.info(\"mount handled by host fleet — skipping in-container rclone spawn\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n const fleetState: WebDAVState = {\n rcloneHandle: null,\n fleetManaged: true,\n };\n return this.makeHandle(declaration, fleetState, targetDir);\n }\n\n const url = String(declaration.mount?.source ?? \"\").trim();\n if (!url) {\n throw new Error(\"WebDAV connector requires declaration.mount.source (server URL)\");\n }\n\n const vendorRaw = opts?.vendor !== undefined ? String(opts.vendor) : \"other\";\n if (!ALLOWED_VENDORS.has(vendorRaw as WebDAVVendor)) {\n throw new Error(\n `WebDAV connector: invalid vendor \"${vendorRaw}\" (allowed: ${[...ALLOWED_VENDORS].join(\", \")})`,\n );\n }\n const vendor = vendorRaw as WebDAVVendor;\n\n const basePath = String(opts?.basePath ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n const remotePath = basePath.length > 0 ? `/${basePath}` : \"/\";\n\n const auth = parseAuth(resolveAuth(declaration.auth, secrets));\n const obscuredPassword = auth.password ? await obscurePassword(auth.password) : null;\n\n const remoteName = `skaile-${declaration.id}`;\n const remote = `${remoteName}:${remotePath}`;\n const cacheDir = `${CACHE_BASE}/${declaration.id}`;\n const vfsCacheMode = declaration.access === \"read-only\" ? \"minimal\" : \"full\";\n\n this.log.info(\"mount params resolved\", {\n url,\n vendor,\n remote,\n cacheDir,\n vfsCacheMode,\n authKind: auth.bearerToken ? \"bearer\" : auth.username ? \"basic\" : \"anonymous\",\n });\n\n const rcloneConfig = renderWebDAVConfig({\n remoteName,\n url,\n vendor,\n username: auth.username,\n obscuredPassword,\n bearerToken: auth.bearerToken,\n });\n\n // Create + chmod 0770 on every dir we own. See `ensureDirMode` in\n // @skaile/workspaces/connectors for the umask / EPERM rationale.\n await ensureDirMode(CACHE_BASE, this.log);\n await ensureDirMode(cacheDir, this.log);\n await ensureDirMode(targetDir, this.log);\n\n const cacheMaxSize = opts?.cacheMaxSize !== undefined ? String(opts.cacheMaxSize) : undefined;\n const cacheMaxAge = opts?.cacheMaxAge !== undefined ? String(opts.cacheMaxAge) : undefined;\n\n const rcloneHandle = await this.rclone.spawn({\n mountId: declaration.id,\n driverName: \"webdav\",\n mountPoint: targetDir,\n cacheDir,\n rcloneConfig,\n remote,\n vfsCacheMode,\n ...(cacheMaxSize !== undefined ? { cacheMaxSize } : {}),\n ...(cacheMaxAge !== undefined ? { cacheMaxAge } : {}),\n log: this.log,\n });\n\n this.log.info(\"mount ready\", { pid: rcloneHandle.pid });\n\n const state: WebDAVState = { rcloneHandle };\n return this.makeHandle(declaration, state, targetDir);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged || !s.rcloneHandle) return;\n await this.rclone.stop(s.rcloneHandle, { graceMs: 30_000 });\n }\n\n private async _sync(handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged || !s.rcloneHandle) {\n // Host fleet owns the rclone process; flushing is a fleet concern.\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"fleet-managed mount — flush handled by host\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n await this.rclone.flush(s.rcloneHandle);\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"rclone flush complete\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged) return \"flushed\";\n await this._sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n const s = handle.state as WebDAVState;\n if (s.fleetManaged) return \"flushed\";\n await this._sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new WebDAVConnector instance.\n * @returns Configured WebDAVConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#webdav-connector-factory\n */\nexport function createConnector(): WebDAVConnector {\n return new WebDAVConnector();\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nfunction parseAuth(raw: string | undefined): ParsedAuth {\n const empty: ParsedAuth = {\n username: null,\n password: null,\n bearerToken: null,\n };\n if (!raw) return empty;\n\n const colonIdx = raw.indexOf(\":\");\n if (colonIdx === -1) {\n return { ...empty, bearerToken: raw };\n }\n\n const username = raw.slice(0, colonIdx);\n const password = raw.slice(colonIdx + 1);\n return { username, password, bearerToken: null };\n}\n\n/**\n * Run `rclone obscure <plain>` and return the trimmed stdout. rclone is\n * required at runtime for this driver and is provisioned in the agent\n * container Dockerfiles; surface a clear error if it is missing in\n * local-dev/test environments.\n */\nasync function obscurePassword(plain: string): Promise<string> {\n try {\n const { stdout } = await execFileP(\"rclone\", [\"obscure\", plain]);\n return stdout.trim();\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === \"ENOENT\") {\n throw new Error(\n \"WebDAV connector: rclone binary not found on PATH (install rclone to use the webdav connector)\",\n );\n }\n throw new Error(\n `WebDAV connector: 'rclone obscure' failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n","/**\n * SharePointConnector — SharePoint/OneDrive filesystem-face connector backed by rclone FUSE.\n *\n * The whole data plane (enumeration, download, upload, change detection,\n * cache eviction) is delegated to an `rclone mount` subprocess managed by\n * {@link RcloneProcessManager}. This connector only parses the declaration,\n * renders the rclone config, hands it off, and forwards lifecycle hooks.\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n RcloneHandle,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureDirMode,\n ensureFleetMounted,\n isFleetManaged,\n RcloneProcessManager,\n renderOneDriveConfig,\n resolveAuth,\n} from \"@skaile/workspaces/connectors\";\n\ninterface SharePointState {\n rcloneHandle: RcloneHandle | null;\n fleetManaged?: boolean;\n}\n\ninterface ParsedAuth {\n accessToken: string;\n refreshToken: string | null;\n expiresAtMs: number | null;\n tenantId: string | null;\n clientId: string | null;\n clientSecret: string | null;\n}\n\nconst CACHE_BASE = \"/var/cache/skaile\";\n\n/**\n * Filesystem-face connector for SharePoint and OneDrive — delegates the data plane to an\n * `rclone mount` subprocess via `RcloneProcessManager` using the OneDrive backend.\n * Supports OAuth2 access tokens with optional refresh, and fleet-managed mode via\n * `SKAILE_FLEET_MANAGED_MOUNTS`.\n * @docLink packages/base-assets/concepts#sharepoint-connector\n */\nexport class SharePointConnector extends AbstractConnector {\n readonly name = \"sharepoint\";\n\n private rclone = new RcloneProcessManager();\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(\"SharePointConnector requires ctx.mountTarget to be set by the manager\");\n }\n const secrets = ctx.secrets;\n\n const opts = declaration.options;\n this.log.info(\"mount called\", {\n optionKeys: opts ? Object.keys(opts) : [],\n });\n\n // Phase 7B: when the host fleet has already mounted this share, the\n // container received a bind at `targetDir` and there is nothing for\n // the in-container connector to spawn. Verify the bind is live, then\n // produce a no-op handle that the rest of the lifecycle can carry.\n if (isFleetManaged(declaration.id)) {\n this.log.info(\"mount handled by host fleet — skipping in-container rclone spawn\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n const fleetState: SharePointState = {\n rcloneHandle: null,\n fleetManaged: true,\n };\n return this.makeHandle(declaration, fleetState, targetDir);\n }\n\n const driveId = String(opts?.driveId ?? \"\");\n if (!driveId) {\n throw new Error(\"SharePoint connector requires options.driveId\");\n }\n\n const folderPath = String(opts?.folderPath ?? \"\").trim();\n if (!folderPath) {\n throw new Error(\n \"SharePoint connector requires options.folderPath (rclone backend needs a path string, not just folderId)\",\n );\n }\n\n const basePath = String(opts?.basePath ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n const auth = parseAuthBlob(resolveAuth(declaration.auth, secrets), this.log);\n if (!auth.accessToken) {\n throw new Error(\"SharePoint connector requires auth token (e.g. auth: env:SHAREPOINT_TOKEN)\");\n }\n\n const remoteName = `skaile-${declaration.id}`;\n const remotePath = buildRemotePath(folderPath, basePath);\n const remote = `${remoteName}:${remotePath}`;\n const cacheDir = `${CACHE_BASE}/${declaration.id}`;\n const vfsCacheMode = declaration.access === \"read-only\" ? \"minimal\" : \"full\";\n\n this.log.info(\"mount params resolved\", {\n driveId,\n remote,\n cacheDir,\n vfsCacheMode,\n hasRefresh: auth.refreshToken !== null,\n });\n\n const rcloneConfig = renderOneDriveConfig({\n remoteName,\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAtMs: auth.expiresAtMs,\n tenantId: auth.tenantId,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n driveId,\n });\n\n // Create + chmod 0770 on every dir we own. See `ensureDirMode` in\n // @skaile/workspaces/connectors for the umask / EPERM rationale.\n await ensureDirMode(CACHE_BASE, this.log);\n await ensureDirMode(cacheDir, this.log);\n await ensureDirMode(targetDir, this.log);\n\n const cacheMaxSize = opts?.cacheMaxSize !== undefined ? String(opts.cacheMaxSize) : undefined;\n const cacheMaxAge = opts?.cacheMaxAge !== undefined ? String(opts.cacheMaxAge) : undefined;\n\n const rcloneHandle = await this.rclone.spawn({\n mountId: declaration.id,\n driverName: \"sharepoint\",\n mountPoint: targetDir,\n cacheDir,\n rcloneConfig,\n remote,\n vfsCacheMode,\n ...(cacheMaxSize !== undefined ? { cacheMaxSize } : {}),\n ...(cacheMaxAge !== undefined ? { cacheMaxAge } : {}),\n log: this.log,\n });\n\n this.log.info(\"mount ready\", { pid: rcloneHandle.pid });\n\n const state: SharePointState = { rcloneHandle };\n return this.makeHandle(declaration, state, targetDir);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged || !s.rcloneHandle) return;\n await this.rclone.stop(s.rcloneHandle, { graceMs: 30_000 });\n }\n\n private async _sync(handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged || !s.rcloneHandle) {\n // Host fleet owns the rclone process; flushing is a fleet concern.\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"fleet-managed mount — flush handled by host\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n await this.rclone.flush(s.rcloneHandle);\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"rclone flush complete\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged) return \"flushed\";\n await this._sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n const s = handle.state as SharePointState;\n if (s.fleetManaged) return \"flushed\";\n await this._sync(handle);\n return \"flushed\";\n }\n}\n\n/**\n * Creates a new SharePointConnector instance.\n * @returns Configured SharePointConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#sharepoint-connector-factory\n */\nexport function createConnector(): SharePointConnector {\n return new SharePointConnector();\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nfunction parseAuthBlob(\n raw: string | undefined,\n log?: { warn: (msg: string, data?: object) => void },\n): ParsedAuth {\n const empty: ParsedAuth = {\n accessToken: \"\",\n refreshToken: null,\n expiresAtMs: null,\n tenantId: null,\n clientId: null,\n clientSecret: null,\n };\n if (!raw) return empty;\n\n if (!raw.startsWith(\"{\")) {\n return { ...empty, accessToken: raw };\n }\n\n try {\n const parsed = JSON.parse(raw) as {\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n tenantId?: string;\n clientId?: string;\n clientSecret?: string;\n };\n return {\n accessToken: parsed.accessToken ?? \"\",\n refreshToken: parsed.refreshToken ?? null,\n expiresAtMs: parsed.expiresAt ?? null,\n tenantId: parsed.tenantId ?? null,\n clientId: parsed.clientId ?? null,\n clientSecret: parsed.clientSecret ?? null,\n };\n } catch (err) {\n // Looked like a JSON bundle but failed to parse — most likely a truncated\n // credential. Falling back silently lets rclone fail later with an opaque\n // 401; surface a warning so misconfiguration is detectable in the logs.\n log?.warn(\"auth blob starts with '{' but is not valid JSON — treating as raw token\", {\n error: err instanceof Error ? err.message : String(err),\n });\n return { ...empty, accessToken: raw };\n }\n}\n\n/**\n * Compose the remote path portion (after `remoteName:`) from a human-readable\n * folder path and an optional sub-base. rclone's onedrive backend takes a\n * path within the drive; an empty path means the drive root.\n */\nfunction buildRemotePath(folderPath: string, basePath: string): string {\n const folder = folderPath.replace(/^\\/+|\\/+$/g, \"\");\n const base = basePath.replace(/^\\/+|\\/+$/g, \"\");\n const joined = [folder, base].filter((p) => p.length > 0).join(\"/\");\n return joined.length > 0 ? `/${joined}` : \"/\";\n}\n","/**\n * GoogleDriveConnector — Google Drive (a.k.a. Google Files) filesystem-face\n * connector backed by rclone FUSE.\n *\n * The whole data plane (enumeration, download, upload, change detection,\n * cache eviction) is delegated to an `rclone mount` subprocess managed by\n * {@link RcloneProcessManager}. This connector only parses the declaration,\n * renders the rclone config, hands it off, and forwards lifecycle hooks.\n */\n\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n FilesystemFace,\n GoogleDriveScope,\n RcloneHandle,\n SyncOptions,\n SyncResult,\n} from \"@skaile/workspaces/connectors\";\nimport {\n AbstractConnector,\n ensureDirMode,\n ensureFleetMounted,\n isFleetManaged,\n RcloneProcessManager,\n renderGoogleDriveConfig,\n resolveAuth,\n} from \"@skaile/workspaces/connectors\";\n\ninterface GoogleDriveState {\n rcloneHandle: RcloneHandle | null;\n fleetManaged?: boolean;\n}\n\ninterface ParsedAuth {\n accessToken: string;\n refreshToken: string | null;\n expiresAtMs: number | null;\n clientId: string | null;\n clientSecret: string | null;\n serviceAccountFile: string | null;\n}\n\nconst CACHE_BASE = \"/var/cache/skaile\";\nconst ALLOWED_SCOPES: ReadonlySet<GoogleDriveScope> = new Set([\n \"drive\",\n \"drive.readonly\",\n \"drive.file\",\n \"drive.appfolder\",\n \"drive.metadata.readonly\",\n]);\n\n/**\n * Filesystem-face connector for Google Drive — delegates the data plane to an\n * `rclone mount` subprocess via `RcloneProcessManager` using the `drive` backend.\n * Supports OAuth2 access tokens with optional refresh, service-account JSON files,\n * and fleet-managed mode via `SKAILE_FLEET_MANAGED_MOUNTS`.\n * @docLink packages/base-assets/concepts#googledrive-connector\n */\nexport class GoogleDriveConnector extends AbstractConnector {\n readonly name = \"googledrive\";\n\n private rclone = new RcloneProcessManager();\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(\"GoogleDriveConnector requires ctx.mountTarget to be set by the manager\");\n }\n const secrets = ctx.secrets;\n\n const opts = declaration.options;\n this.log.info(\"mount called\", {\n optionKeys: opts ? Object.keys(opts) : [],\n });\n\n if (isFleetManaged(declaration.id)) {\n this.log.info(\"mount handled by host fleet — skipping in-container rclone spawn\", {\n connectorId: declaration.id,\n targetDir,\n });\n await ensureFleetMounted(targetDir, this.log);\n const fleetState: GoogleDriveState = {\n rcloneHandle: null,\n fleetManaged: true,\n };\n return this.makeHandle(declaration, fleetState, targetDir);\n }\n\n const scopeRaw = opts?.scope !== undefined ? String(opts.scope) : \"drive\";\n if (!ALLOWED_SCOPES.has(scopeRaw as GoogleDriveScope)) {\n throw new Error(\n `Google Drive connector: invalid scope \"${scopeRaw}\" (allowed: ${[...ALLOWED_SCOPES].join(\", \")})`,\n );\n }\n const scope = scopeRaw as GoogleDriveScope;\n\n const auth = parseAuthBlob(resolveAuth(declaration.auth, secrets), this.log);\n if (!auth.accessToken && !auth.serviceAccountFile) {\n throw new Error(\n \"Google Drive connector requires auth token or serviceAccountFile (e.g. auth: env:GDRIVE_TOKEN)\",\n );\n }\n\n const rootFolderId = opts?.rootFolderId !== undefined ? String(opts.rootFolderId) : null;\n const teamDrive = opts?.teamDrive !== undefined ? String(opts.teamDrive) : null;\n const basePath = String(opts?.basePath ?? \"\").replace(/^\\/+|\\/+$/g, \"\");\n\n const remoteName = `skaile-${declaration.id}`;\n const remotePath = basePath.length > 0 ? `/${basePath}` : \"/\";\n const remote = `${remoteName}:${remotePath}`;\n const cacheDir = `${CACHE_BASE}/${declaration.id}`;\n const vfsCacheMode = declaration.access === \"read-only\" ? \"minimal\" : \"full\";\n\n this.log.info(\"mount params resolved\", {\n scope,\n remote,\n cacheDir,\n vfsCacheMode,\n hasRefresh: auth.refreshToken !== null,\n hasServiceAccount: auth.serviceAccountFile !== null,\n teamDrive,\n });\n\n const rcloneConfig = renderGoogleDriveConfig({\n remoteName,\n accessToken: auth.accessToken,\n refreshToken: auth.refreshToken,\n expiresAtMs: auth.expiresAtMs,\n clientId: auth.clientId,\n clientSecret: auth.clientSecret,\n scope,\n rootFolderId,\n teamDrive,\n serviceAccountFile: auth.serviceAccountFile,\n });\n\n await ensureDirMode(CACHE_BASE, this.log);\n await ensureDirMode(cacheDir, this.log);\n await ensureDirMode(targetDir, this.log);\n\n const cacheMaxSize = opts?.cacheMaxSize !== undefined ? String(opts.cacheMaxSize) : undefined;\n const cacheMaxAge = opts?.cacheMaxAge !== undefined ? String(opts.cacheMaxAge) : undefined;\n\n const rcloneHandle = await this.rclone.spawn({\n mountId: declaration.id,\n driverName: \"googledrive\",\n mountPoint: targetDir,\n cacheDir,\n rcloneConfig,\n remote,\n vfsCacheMode,\n ...(cacheMaxSize !== undefined ? { cacheMaxSize } : {}),\n ...(cacheMaxAge !== undefined ? { cacheMaxAge } : {}),\n log: this.log,\n });\n\n this.log.info(\"mount ready\", { pid: rcloneHandle.pid });\n\n const state: GoogleDriveState = { rcloneHandle };\n return this.makeHandle(declaration, state, targetDir);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n const s = handle.state as GoogleDriveState;\n if (s.fleetManaged || !s.rcloneHandle) return;\n await this.rclone.stop(s.rcloneHandle, { graceMs: 30_000 });\n }\n\n private async _sync(handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult> {\n const s = handle.state as GoogleDriveState;\n if (s.fleetManaged || !s.rcloneHandle) {\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"fleet-managed mount — flush handled by host\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n await this.rclone.flush(s.rcloneHandle);\n options?.onSyncStatus?.({\n phase: \"initial_sync_complete\",\n totalFiles: 0,\n downloadedFiles: 0,\n stubFiles: 0,\n message: \"rclone flush complete\",\n });\n return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };\n }\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n const s = handle.state as GoogleDriveState;\n if (s.fleetManaged) return \"flushed\";\n await this._sync(handle);\n return \"flushed\";\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n const s = handle.state as GoogleDriveState;\n if (s.fleetManaged) return \"flushed\";\n await this._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/base-assets/api-reference#googledrive-connector-factory\n */\nexport function createConnector(): GoogleDriveConnector {\n return new GoogleDriveConnector();\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nexport function parseAuthBlob(\n raw: string | undefined,\n log?: { warn: (msg: string, data?: object) => void },\n): ParsedAuth {\n const empty: ParsedAuth = {\n accessToken: \"\",\n refreshToken: null,\n expiresAtMs: null,\n clientId: null,\n clientSecret: null,\n serviceAccountFile: null,\n };\n if (!raw) return empty;\n\n if (!raw.startsWith(\"{\")) {\n return { ...empty, accessToken: raw };\n }\n\n try {\n const parsed = JSON.parse(raw) as {\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n clientId?: string;\n clientSecret?: string;\n serviceAccountFile?: string;\n };\n return {\n accessToken: parsed.accessToken ?? \"\",\n refreshToken: parsed.refreshToken ?? null,\n expiresAtMs: parsed.expiresAt ?? null,\n clientId: parsed.clientId ?? null,\n clientSecret: parsed.clientSecret ?? null,\n serviceAccountFile: parsed.serviceAccountFile ?? null,\n };\n } catch (err) {\n // Looked like a JSON bundle but failed to parse — most likely a truncated\n // credential. Falling back silently lets rclone fail later with an opaque\n // 401; surface a warning so misconfiguration is detectable in the logs.\n log?.warn(\"auth blob starts with '{' but is not valid JSON — treating as raw token\", {\n error: err instanceof Error ? err.message : String(err),\n });\n return { ...empty, accessToken: raw };\n }\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 ConnectorContent,\n ConnectorEntry,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\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/base-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 const regex = new RegExp(`^${pattern.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/base-assets/api-reference#memory-connector-factory\n */\nexport function createConnector(): MemoryConnector {\n return new MemoryConnector();\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 { resolveAuth, AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\n\ninterface PgState {\n pool: any; // pg.Pool\n dsn: string;\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/base-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 const dsn =\n ctx.resolvedFields?.dsn ??\n resolveAuth(declaration.auth, ctx.secrets) ??\n String(declaration.options?.dsn ?? \"\");\n if (!dsn) {\n this.log.error(\"connect failed: missing dsn\", undefined);\n throw new Error(\"PostgresAdapter requires auth (connection string) or options.dsn\");\n }\n\n let host = \"(unknown)\";\n try {\n host = new URL(dsn).hostname;\n } catch {}\n this.log.info(\"connect start\", { host });\n\n try {\n const pgPkg = \"pg\";\n const pg = (await import(/* @vite-ignore */ pgPkg)) as any;\n const Pool = pg.default?.Pool ?? pg.Pool;\n const pool = new Pool({ connectionString: dsn });\n\n // Verify connectivity\n const client = await pool.connect();\n client.release();\n\n this.log.info(\"connect ok\", { host, durationMs: Date.now() - started });\n return this.makeHandle(declaration, { pool, dsn } satisfies PgState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { host });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { pool } = handle.state as PgState;\n 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(`SELECT * FROM \"${table}\" WHERE id = $1 LIMIT 1`, [\n pk,\n ]);\n if (result.rows.length === 0) return null;\n return { data: JSON.stringify(result.rows[0], null, 2), contentType: \"application/json\" };\n }\n\n 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 \"${path}\" LIMIT $1`, [limit]);\n return result.rows.map((row: any, i: number) => ({\n name: String(row.id ?? i),\n path: `${path}/${row.id ?? i}`,\n type: \"row\" as const,\n }));\n }\n\n 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) => `\"${c.column_name}\"::text ILIKE $1`)\n .join(\" OR \");\n const searchResult = await this.pool(handle).query(\n `SELECT * FROM \"${table.name}\" WHERE ${conditions} LIMIT $2`,\n [`%${query}%`, maxResults - results.length],\n );\n for (const row of searchResult.rows) {\n results.push({\n path: `${table.name}/${row.id ?? \"?\"}`,\n snippet: JSON.stringify(row).slice(0, 200),\n });\n }\n } catch {\n // Skip tables that error (permissions, etc.)\n }\n }\n return results;\n }\n\n 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 const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const params = args.params\n ? typeof args.params === \"string\"\n ? JSON.parse(args.params)\n : args.params\n : [];\n const queryStart = Date.now();\n try {\n const result = await pool.query(sql, params);\n const ms = Date.now() - queryStart;\n if (ms > 1000) {\n this.log.warn(\"slow query\", { ms, sql: sql.slice(0, 200) });\n }\n return JSON.stringify(result.rows, null, 2);\n } catch (err) {\n this.log.error(\"query failed\", err, { sql: sql.slice(0, 200) });\n throw err;\n }\n }\n case \"schema\": {\n const table = args.table ? String(args.table) : undefined;\n if (table) {\n const result = await pool.query(\n `SELECT column_name, data_type, is_nullable, column_default\n FROM information_schema.columns WHERE table_name = $1 ORDER BY ordinal_position`,\n [table],\n );\n return JSON.stringify(result.rows, null, 2);\n }\n // Full schema: tables + row counts\n const tables = await pool.query(\n `SELECT t.table_name,\n (SELECT count(*) FROM information_schema.columns c WHERE c.table_name = t.table_name) as column_count\n FROM information_schema.tables t\n WHERE t.table_schema = 'public' ORDER BY t.table_name`,\n );\n return JSON.stringify(tables.rows, null, 2);\n }\n case \"execute\": {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const params = args.params\n ? typeof args.params === \"string\"\n ? JSON.parse(args.params)\n : args.params\n : [];\n const result = await pool.query(sql, params);\n return JSON.stringify({ rowCount: result.rowCount, command: result.command });\n }\n default:\n throw new Error(`PostgresAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new PostgresConnector instance.\n * @returns Configured PostgresConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#postgres-connector-factory\n */\nexport function createConnector(): PostgresConnector {\n return new PostgresConnector();\n}\n","/**\n * SQLiteConnector — SQLite database resource via sql.js (WASM).\n * Not mountable. Custom operations: query, schema, execute.\n *\n * Uses sql.js — SQLite compiled to WebAssembly. Runs on Node, Bun, and\n * browsers without native compilation or platform-specific binaries.\n *\n * Requires `sql.js` as an optional peer dependency.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolveAuth, AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\n\ninterface SqliteState {\n db: any; // sql.js Database instance\n dbPath: string;\n readonly: boolean;\n}\n\n/**\n * Connector for SQLite databases via sql.js (WASM). Supports in-memory and file-backed databases.\n * Provides query, schema inspection, and execute operations. Requires the `sql.js` optional peer dependency.\n * @docLink packages/base-assets/concepts#sqlite-connector\n */\nexport class 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 resolveAuth(declaration.auth, ctx.secrets) ?? String(declaration.options?.path ?? \"\");\n if (!dbPath) {\n this.log.error(\"connect failed: missing path\", undefined);\n throw new Error(\"SQLiteAdapter requires auth (db path) or options.path\");\n }\n this.log.info(\"connect start\", { dbPath });\n\n const sqljsPkg = \"sql.js\";\n const initSqlJs = await import(/* @vite-ignore */ sqljsPkg).then((m) => m.default ?? m);\n const SQL = await initSqlJs();\n\n const isReadonly = declaration.access === \"read-only\";\n let db: any;\n\n if (dbPath === \":memory:\") {\n db = new SQL.Database();\n } else if (existsSync(dbPath)) {\n const buffer = readFileSync(dbPath);\n db = new SQL.Database(buffer);\n } else if (!isReadonly) {\n // Create new database file\n db = new SQL.Database();\n } else {\n this.log.error(\"connect failed: db file not found\", undefined, { dbPath });\n throw new Error(`SQLite database not found: ${dbPath}`);\n }\n\n this.log.info(\"connect ok\", { dbPath, durationMs: Date.now() - started });\n\n // Enable WAL mode for file-backed databases (not supported in sql.js but\n // harmless — sql.js operates in-memory and flushes to disk on save)\n if (!isReadonly && dbPath !== \":memory:\") {\n try {\n db.run(\"PRAGMA journal_mode = WAL\");\n } catch {\n /* ignored in WASM */\n }\n }\n\n return this.makeHandle(declaration, { db, dbPath, readonly: isReadonly } satisfies SqliteState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { db, dbPath, readonly: isReadonly } = handle.state as SqliteState;\n // Persist changes to disk before closing (sql.js is in-memory)\n if (!isReadonly && dbPath !== \":memory:\") {\n this.saveToDisk(db, dbPath);\n }\n db.close();\n handle.status = \"disconnected\";\n }\n\n private db(handle: ConnectorHandle): any {\n return (handle.state as SqliteState).db;\n }\n\n /** sql.js operates in-memory — flush to disk explicitly. */\n private saveToDisk(db: any, dbPath: string): void {\n try {\n const data = db.export();\n const buffer = Buffer.from(data);\n writeFileSync(dbPath, buffer);\n } catch {\n /* best-effort */\n }\n }\n\n /** Run a query that returns rows. sql.js uses stmt.getAsObject() pattern. */\n private queryRows(db: any, sql: string, params?: unknown[]): Record<string, unknown>[] {\n const stmt = db.prepare(sql);\n if (params?.length) stmt.bind(params);\n const rows: Record<string, unknown>[] = [];\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n stmt.free();\n return rows;\n }\n\n /** Run a statement that modifies data. Returns changes count. */\n private runStmt(db: any, sql: string, params?: unknown[]): number {\n if (params?.length) {\n db.run(sql, params);\n } else {\n db.run(sql);\n }\n const changes = db.getRowsModified();\n return changes;\n }\n\n private async _read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const parts = path.split(\"/\");\n if (parts.length === 1) {\n const table = parts[0]!;\n const info = this.queryRows(this.db(handle), `PRAGMA table_info(\"${table}\")`);\n if (info.length === 0) return null;\n return { data: JSON.stringify(info, null, 2), contentType: \"application/json\" };\n }\n const [table, rowid] = parts;\n const rows = this.queryRows(this.db(handle), `SELECT * FROM \"${table}\" WHERE rowid = ?`, [\n rowid,\n ]);\n if (rows.length === 0) return null;\n return { data: JSON.stringify(rows[0], null, 2), contentType: \"application/json\" };\n }\n\n 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(this.db(handle), `SELECT rowid, * FROM \"${path}\" LIMIT ?`, [limit]);\n return rows.map((row: any) => ({\n name: String(row.rowid ?? row.id ?? \"?\"),\n path: `${path}/${row.rowid ?? row.id ?? \"?\"}`,\n type: \"row\" as const,\n }));\n }\n\n 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(this.db(handle), `PRAGMA table_info(\"${table.name}\")`);\n const textCols = info.filter((c: any) => /text|varchar|char/i.test(String(c.type ?? \"\")));\n if (textCols.length === 0) continue;\n\n const conditions = textCols.map((c: any) => `\"${c.name}\" LIKE ?`).join(\" OR \");\n const params: unknown[] = textCols.map(() => `%${query}%`);\n params.push(maxResults - results.length);\n const rows = this.queryRows(\n this.db(handle),\n `SELECT rowid, * FROM \"${table.name}\" WHERE ${conditions} LIMIT ?`,\n params,\n );\n\n for (const row of rows) {\n results.push({\n path: `${table.name}/${row.rowid ?? \"?\"}`,\n snippet: JSON.stringify(row).slice(0, 200),\n });\n }\n } catch {\n // Skip inaccessible tables\n }\n }\n return results;\n }\n\n 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(\"${table}\")`);\n return JSON.stringify(info, null, 2);\n }\n const tables = this.queryRows(\n db,\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name\",\n );\n const result: Record<string, any> = {};\n for (const t of tables) {\n result[t.name as string] = this.queryRows(db, `PRAGMA table_info(\"${t.name}\")`);\n }\n return JSON.stringify(result, null, 2);\n }\n case \"execute\": {\n const sql = String(args.sql ?? args._positional ?? \"\");\n if (!sql) return \"Error: sql argument is required\";\n const changes = this.runStmt(db, sql);\n // Persist after mutation\n if (!state.readonly && state.dbPath !== \":memory:\") {\n this.saveToDisk(db, state.dbPath);\n }\n return JSON.stringify({ changes });\n }\n default:\n throw new Error(`SQLiteAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new SQLiteConnector instance.\n * @returns Configured SQLiteConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#sqlite-connector-factory\n */\nexport function createConnector(): SQLiteConnector {\n return new SQLiteConnector();\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 { resolveAuth, AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n OperationDescriptor,\n} from \"@skaile/workspaces/connectors\";\n\ninterface MinIOState {\n client: any; // minio.Client\n bucket: string;\n endpoint: string;\n}\n\n/**\n * Connector for MinIO and S3-compatible object storage.\n * Provides list, get, put, delete, and presign operations against a single bucket. Requires the `minio` optional peer dependency.\n * @docLink packages/base-assets/concepts#minio-connector\n */\nexport class 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 resolveAuth(declaration.options?.[\"access-key\"] as string, ctx.secrets) ??\n \"\";\n const secretKey =\n ctx.resolvedFields?.[\"secret-key\"] ??\n resolveAuth(declaration.options?.[\"secret-key\"] as string, ctx.secrets) ??\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(handle: ConnectorHandle, path?: string): Promise<ConnectorEntry[]> {\n const { client, bucket } = handle.state as MinIOState;\n const entries: ConnectorEntry[] = [];\n const stream = client.listObjects(bucket, path ?? \"\", false);\n return new Promise((resolve, reject) => {\n stream.on(\"data\", (obj: any) => {\n entries.push({\n name: obj.name,\n path: obj.name,\n type: \"file\",\n size: obj.size,\n modifiedAt: obj.lastModified,\n });\n });\n stream.on(\"end\", () => resolve(entries));\n stream.on(\"error\", reject);\n });\n }\n\n 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(await this._list(handle, String(args.prefix ?? \"\")), null, 2);\n case \"get_object\": {\n const content = await this._read(handle, String(args.key));\n return content?.data?.toString() ?? \"(empty)\";\n }\n case \"put_object\": {\n const content = String(args.content ?? \"\");\n const contentType = String(args[\"content-type\"] ?? \"text/plain\");\n const buf = Buffer.from(content);\n await client.putObject(bucket, String(args.key), buf, buf.length, {\n \"Content-Type\": contentType,\n });\n return \"Object uploaded.\";\n }\n case \"delete_object\": {\n await client.removeObject(bucket, String(args.key));\n return \"Object deleted.\";\n }\n case \"presign\":\n return await client.presignedGetObject(\n bucket,\n String(args.key),\n Number(args.expiry ?? 3600),\n );\n default:\n throw new Error(`MinIOAdapter has no operation \"${operation}\"`);\n }\n }\n}\n\n/**\n * Creates a new MinIOConnector instance.\n * @returns Configured MinIOConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#minio-connector-factory\n */\nexport function createConnector(): MinIOConnector {\n return new MinIOConnector();\n}\n","/**\n * XStateConnector — full state machine resource via XState v5.\n * Not mountable. Provides guarded transitions, entry/exit actions,\n * context, and serializable snapshots.\n *\n * Requires `xstate` (v5+) as an optional peer dependency.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n OperationDescriptor,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\n\ninterface XStateState {\n actor: any; // XState Actor\n machine: any; // XState Machine (for introspection)\n definition: any; // Raw definition object\n history: Array<{ event: string; from: string; to: string; at: string }>;\n onChange?: (snapshot: { value: any; context: any }) => void;\n actions: Record<string, (...args: any[]) => void>;\n guards: Record<string, (...args: any[]) => boolean>;\n}\n\n/**\n * Connector 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/base-assets/concepts#xstate-connector\n */\nexport class XStateConnector extends AbstractConnector {\n readonly name = \"xstate\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query) => this._search(handle, query),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const xstatePkg = \"xstate\";\n const xstate = (await import(/* @vite-ignore */ xstatePkg)) as any;\n const { createMachine, createActor } = xstate;\n\n // Load machine definition\n let definition = declaration.options?.machine as Record<string, unknown> | undefined;\n if (!definition && declaration.options?.definitionPath) {\n const defPath = String(declaration.options.definitionPath);\n if (!existsSync(defPath)) throw new Error(`Machine definition not found: ${defPath}`);\n const raw = readFileSync(defPath, \"utf-8\");\n if (defPath.endsWith(\".json\")) {\n definition = JSON.parse(raw);\n } else {\n const { parse } = (await import(/* @vite-ignore */ \"yaml\")) as any;\n definition = parse(raw);\n }\n }\n\n if (!definition)\n throw new Error(\"XStateAdapter requires options.machine or options.definitionPath\");\n\n const state: XStateState = {\n actor: null,\n machine: null,\n definition,\n history: [],\n actions: {},\n guards: {},\n };\n\n // Build the machine — actions and guards are proxied so they can be\n // registered after connection (by the runner or Nuxt server)\n const actionProxy: Record<string, (...args: any[]) => void> = {};\n const guardProxy: Record<string, (...args: any[]) => boolean> = {};\n\n // Collect action/guard names from definition\n const actionNames = this.collectNames(definition, \"actions\");\n const guardNames = this.collectNames(definition, \"guard\");\n\n for (const name of actionNames) {\n actionProxy[name] = (...args: any[]) => {\n if (state.actions[name]) state.actions[name](...args);\n };\n }\n for (const name of guardNames) {\n guardProxy[name] = (...args: any[]) => {\n return state.guards[name] ? state.guards[name](...args) : true;\n };\n }\n\n const machineConfig = {\n ...definition,\n // Ensure context is an object\n context: definition.context ?? {},\n };\n\n const machine = createMachine(machineConfig, {\n actions: actionProxy,\n guards: guardProxy,\n });\n\n const actor = createActor(machine);\n\n // Track state changes\n actor.subscribe((snapshot: any) => {\n state.onChange?.({ value: snapshot.value, context: snapshot.context });\n });\n\n actor.start();\n\n state.actor = actor;\n state.machine = machine;\n\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const s = handle.state as XStateState;\n try {\n s.actor?.stop();\n } finally {\n handle.status = \"disconnected\";\n }\n }\n\n private s(handle: ConnectorHandle): XStateState {\n return handle.state as XStateState;\n }\n\n /**\n * Register action implementations. Call after connect().\n */\n registerActions(\n handle: ConnectorHandle,\n actions: Record<string, (...args: any[]) => void>,\n ): void {\n Object.assign(this.s(handle).actions, actions);\n }\n\n /**\n * Register guard implementations. Call after connect().\n */\n registerGuards(\n handle: ConnectorHandle,\n guards: Record<string, (...args: any[]) => boolean>,\n ): void {\n Object.assign(this.s(handle).guards, guards);\n }\n\n /**\n * Register a callback fired on every state change.\n */\n onStateChange(\n handle: ConnectorHandle,\n cb: (snapshot: { value: any; context: any }) => void,\n ): void {\n this.s(handle).onChange = cb;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private async _read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const snapshot = this.s(handle).actor.getSnapshot();\n if (path === \"\" || path === \"state\") {\n return { data: JSON.stringify(snapshot.value), contentType: \"application/json\" };\n }\n if (path === \"context\") {\n return { data: JSON.stringify(snapshot.context, null, 2), contentType: \"application/json\" };\n }\n // Read a specific context key\n const value = snapshot.context?.[path];\n if (value === undefined) return null;\n return { data: JSON.stringify(value), contentType: \"application/json\" };\n }\n\n private async _list(\n handle: ConnectorHandle,\n _path?: string,\n _options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const snapshot = this.s(handle).actor.getSnapshot();\n const entries: ConnectorEntry[] = [\n { name: \"state\", path: \"state\", type: \"key\" },\n { name: \"context\", path: \"context\", type: \"key\" },\n ];\n if (snapshot.context && typeof snapshot.context === \"object\") {\n for (const key of Object.keys(snapshot.context)) {\n entries.push({ name: key, path: `context/${key}`, type: \"key\" });\n }\n }\n return entries;\n }\n\n private async _search(handle: ConnectorHandle, query: string): Promise<SearchResult[]> {\n const snapshot = this.s(handle).actor.getSnapshot();\n const full = JSON.stringify({ value: snapshot.value, context: snapshot.context });\n if (full.includes(query)) {\n return [{ path: \"state\", snippet: full.slice(0, 200) }];\n }\n return [];\n }\n\n private _describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get_state\",\n description: \"Get the current state value, context, and list of available transitions.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"get_definition\",\n description: \"Get the machine definition (states, transitions, guards).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"history\",\n description: \"Get the transition history log.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"limit\",\n type: \"number\",\n required: false,\n description: \"Max entries (default: 50)\",\n },\n ],\n },\n {\n name: \"can\",\n description: \"Check if a specific event/transition is currently allowed.\",\n accessLevel: \"read\",\n args: [\n { name: \"event\", type: \"string\", required: true, description: \"Event type to check\" },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push({\n name: \"send\",\n description: \"Send an event to the state machine, triggering a transition if valid.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"event\",\n type: \"string\",\n required: true,\n description: \"Event type (e.g., SUBMIT, APPROVE)\",\n },\n { name: \"data\", type: \"json\", required: false, description: \"Event payload data (JSON)\" },\n ],\n examples: [\"send --event APPROVE\", 'send --event SUBMIT --data \\'{\"reviewer\":\"alice\"}\\''],\n });\n }\n\n return ops;\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const s = this.s(handle);\n\n switch (operation) {\n case \"get_state\": {\n const snapshot = s.actor.getSnapshot();\n const nextEvents = this.getAvailableEvents(handle);\n return JSON.stringify(\n {\n value: snapshot.value,\n context: snapshot.context,\n availableEvents: nextEvents,\n },\n null,\n 2,\n );\n }\n\n case \"get_definition\":\n return JSON.stringify(s.definition, null, 2);\n\n case \"history\": {\n const limit = Number(args.limit ?? 50);\n return JSON.stringify(s.history.slice(-limit), null, 2);\n }\n\n case \"can\": {\n const event = String(args.event ?? \"\");\n const snapshot = s.actor.getSnapshot();\n const can =\n snapshot.can?.({ type: event }) ?? this.getAvailableEvents(handle).includes(event);\n return JSON.stringify({ event, allowed: can });\n }\n\n case \"send\": {\n const eventType = String(args.event ?? args._positional ?? \"\");\n if (!eventType) return \"Error: event argument is required\";\n\n const snapshot = s.actor.getSnapshot();\n const fromState =\n typeof snapshot.value === \"string\" ? snapshot.value : JSON.stringify(snapshot.value);\n\n let eventPayload: Record<string, unknown> = { type: eventType };\n if (args.data) {\n const data = typeof args.data === \"string\" ? JSON.parse(args.data) : args.data;\n eventPayload = { type: eventType, ...data };\n }\n\n s.actor.send(eventPayload);\n\n const newSnapshot = s.actor.getSnapshot();\n const toState =\n typeof newSnapshot.value === \"string\"\n ? newSnapshot.value\n : JSON.stringify(newSnapshot.value);\n\n const transitioned = fromState !== toState;\n s.history.push({\n event: eventType,\n from: fromState,\n to: toState,\n at: new Date().toISOString(),\n });\n\n // Cap history\n if (s.history.length > 500) s.history = s.history.slice(-500);\n\n if (transitioned) {\n this.emitChange?.({ path: \"state\", action: \"edit\", source: \"operation\" });\n }\n\n return JSON.stringify(\n {\n transitioned,\n from: fromState,\n to: toState,\n context: newSnapshot.context,\n availableEvents: this.getAvailableEvents(handle),\n },\n null,\n 2,\n );\n }\n\n default:\n throw new Error(`XStateAdapter has no operation: ${operation}`);\n }\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n private getAvailableEvents(handle: ConnectorHandle): string[] {\n const snapshot = this.s(handle).actor.getSnapshot();\n const currentState = typeof snapshot.value === \"string\" ? snapshot.value : null;\n if (!currentState) return [];\n const stateDef = this.s(handle).definition?.states?.[currentState];\n if (!stateDef?.on) return [];\n return Object.keys(stateDef.on);\n }\n\n /** Collect all named actions or guards from a machine definition tree. */\n private collectNames(def: any, key: \"actions\" | \"guard\"): string[] {\n const names = new Set<string>();\n const walk = (obj: any) => {\n if (!obj || typeof obj !== \"object\") return;\n if (key === \"actions\") {\n for (const field of [\"actions\", \"entry\", \"exit\"]) {\n const val = obj[field];\n if (typeof val === \"string\") names.add(val);\n if (Array.isArray(val))\n val.forEach((v: any) => {\n if (typeof v === \"string\") names.add(v);\n });\n }\n }\n if (key === \"guard\" && typeof obj.guard === \"string\") {\n names.add(obj.guard);\n }\n for (const v of Object.values(obj)) {\n if (v && typeof v === \"object\") walk(v);\n }\n };\n walk(def);\n return [...names];\n }\n}\n\n/**\n * Creates a new XStateConnector instance.\n * @returns Configured XStateConnector ready to be registered in the connector registry.\n * @docLink packages/base-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 { AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n OperationDescriptor,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\n\ninterface StoreState {\n store: any; // @xstate/store Store instance\n history: Array<{ event: string; payload: unknown; at: string }>;\n onChange?: (snapshot: Record<string, unknown>) => void;\n}\n\n/**\n * Connector for `@xstate/store` — a lightweight event-driven key-value store shared between agents and UI clients.\n * Provides get, set, merge, and reset operations with an event history log. Requires the `@xstate/store` optional peer dependency.\n * @docLink packages/base-assets/concepts#xstate-store-connector\n */\nexport class 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 const regex = new RegExp(`^${options.glob.replace(/\\*/g, \".*\")}$`);\n keys = keys.filter((k) => regex.test(k));\n }\n if (options?.limit) keys = keys.slice(0, options.limit);\n return keys.map((k) => ({ name: k, path: k, type: \"key\" as const }));\n }\n\n 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: \"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 const s = this.storeState(handle);\n\n switch (operation) {\n case \"get\":\n return JSON.stringify(this.context(handle), null, 2);\n\n case \"get_key\": {\n const key = String(args.key ?? \"\");\n const value = this.context(handle)[key];\n return value !== undefined ? JSON.stringify(value) : \"\";\n }\n\n case \"history\": {\n const limit = Number(args.limit ?? 50);\n return JSON.stringify(s.history.slice(-limit), null, 2);\n }\n\n case \"set\": {\n const key = String(args.key ?? \"\");\n let value: unknown = args.value;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n /* keep as string */\n }\n }\n const hadKey = key in this.context(handle);\n s.store.send({ type: \"set\", key, value });\n this._recordHistory(handle, \"set\", { key, value });\n this.emitChange?.({ path: key, action: hadKey ? \"edit\" : \"create\", source: \"operation\" });\n return \"OK\";\n }\n\n case \"merge\": {\n let data = args.data;\n if (typeof data === \"string\") data = JSON.parse(data);\n s.store.send({ type: \"merge\", data });\n this._recordHistory(handle, \"merge\", { data });\n if (typeof data === \"object\" && data !== null) {\n const ctx = this.context(handle);\n for (const key of Object.keys(data as Record<string, unknown>)) {\n this.emitChange?.({\n path: key,\n action: key in ctx ? \"edit\" : \"create\",\n source: \"operation\",\n });\n }\n }\n return \"OK\";\n }\n\n case \"reset\": {\n s.store.send({ type: \"reset\" });\n s.history = [];\n this.emitChange?.({ path: \"\", action: \"edit\", source: \"operation\" });\n return \"OK\";\n }\n\n default:\n throw new Error(`XStateStoreConnector has no operation: ${operation}`);\n }\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/base-assets/api-reference#xstate-store-connector-factory\n */\nexport function createConnector(): XStateStoreConnector {\n return new XStateStoreConnector();\n}\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 { AbstractConnector, resolveAuth } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} 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/base-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 ?? resolveAuth(declaration.auth, ctx.secrets) ?? \"\";\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/base-assets/api-reference#gmail-connector-factory\n */\nexport function createConnector(): GmailConnector {\n return new GmailConnector();\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 { AbstractConnector, resolveAuth } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type { ConnectorContent } 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/base-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 ?? resolveAuth(declaration.auth, ctx.secrets) ?? \"\";\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}`);\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 return JSON.stringify(\n await this._apiGet(state.url, state.token, `/api/v4/posts/${args.post_id}/thread`),\n null,\n 2,\n );\n case \"search_posts\": {\n const body: Record<string, unknown> = { terms: String(args.terms), is_or_search: false };\n if (args.team_id) body.team_id = String(args.team_id);\n return JSON.stringify(\n await this._apiPost(state.url, state.token, \"/api/v4/posts/search\", body),\n null,\n 2,\n );\n }\n case \"get_user\":\n return JSON.stringify(\n await this._apiGet(state.url, state.token, `/api/v4/users/${args.user_id}`),\n null,\n 2,\n );\n case \"create_post\": {\n this._assertWriteAccess(handle);\n const cid = String(args.channel_id);\n this._assertChannelAccess(cid, state.channelFilter);\n const post = await this._apiPost(state.url, state.token, \"/api/v4/posts\", {\n channel_id: cid,\n message: String(args.message),\n });\n const postId = String((post as Record<string, unknown>).id ?? \"\");\n this.emitChange?.({\n path: `channels/${cid}/posts/${postId}`,\n action: \"create\",\n source: \"operation\",\n });\n return JSON.stringify(post, null, 2);\n }\n case \"reply_to_thread\": {\n this._assertWriteAccess(handle);\n const cid = String(args.channel_id);\n this._assertChannelAccess(cid, state.channelFilter);\n const post = await this._apiPost(state.url, state.token, \"/api/v4/posts\", {\n channel_id: cid,\n root_id: String(args.root_id),\n message: String(args.message),\n });\n const postId = String((post as Record<string, unknown>).id ?? \"\");\n this.emitChange?.({\n path: `channels/${cid}/posts/${postId}`,\n action: \"create\",\n source: \"operation\",\n });\n return JSON.stringify(post, null, 2);\n }\n case \"update_post\": {\n this._assertWriteAccess(handle);\n const pid = String(args.post_id);\n const updated = await this._apiPut(state.url, state.token, `/api/v4/posts/${pid}`, {\n id: pid,\n message: String(args.message),\n });\n this.emitChange?.({ path: `posts/${pid}`, action: \"edit\", source: \"operation\" });\n return JSON.stringify(updated, null, 2);\n }\n default:\n throw new Error(`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/base-assets/api-reference#mattermost-connector-factory\n */\nexport function createConnector(): MattermostConnector {\n return new MattermostConnector();\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 {\n AbstractConnector,\n LogBuffer,\n PortPool,\n createWorktree,\n findGitRoot,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\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/base-assets/concepts#devserver-connector\n */\nexport class DevServerConnector extends AbstractConnector {\n readonly name = \"devserver\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const opts = declaration.options ?? {};\n const portRange = (opts.port_range as [number, number]) ?? [3000, 3099];\n let repoRoot: string | null = null;\n try {\n repoRoot = findGitRoot(process.cwd());\n } catch {}\n\n const state: DevServerState = {\n instances: new Map(),\n pool: new PortPool(portRange),\n repoRoot,\n worktreeDir: String(opts.worktree_dir ?? \".skaile/worktrees\"),\n logBufferSize: Number(opts.log_buffer_size ?? 500),\n };\n\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n try {\n await this._stopAll(handle);\n } finally {\n handle.status = \"disconnected\";\n }\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._stopAll(handle);\n return undefined;\n }\n\n override async onHibernate(handle: ConnectorHandle): Promise<string | undefined> {\n const state = handle.state as DevServerState;\n await this._stopAll(handle);\n return `Stopped ${state.instances.size} dev server instances for hibernation`;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private async _stopAll(handle: ConnectorHandle): Promise<void> {\n const state = handle.state as DevServerState;\n for (const [id, inst] of [...state.instances.entries()]) {\n if (inst.managed && inst.process) await this._killProcess(inst, state);\n state.instances.delete(id);\n }\n }\n\n private async _killProcess(inst: ServiceInstance, state: DevServerState): Promise<void> {\n if (!inst.process) return;\n try {\n inst.process.kill(15);\n } catch {}\n const exited = await Promise.race([\n inst.process.exited.then(() => true),\n new Promise<false>((r) => setTimeout(() => r(false), 5000)),\n ]);\n if (!exited) {\n try {\n inst.process.kill(9);\n } catch {}\n }\n inst.status = \"stopped\";\n state.pool.release(inst.port);\n if (inst.worktreeCleanup) {\n try {\n await inst.worktreeCleanup();\n } catch {}\n }\n }\n\n private _describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"start\",\n description: \"Spawn a dev server process.\",\n accessLevel: \"write\",\n args: [\n { name: \"command\", type: \"string\", required: true, description: \"Shell command to run\" },\n { name: \"cwd\", type: \"string\", required: false, description: \"Working directory\" },\n {\n name: \"ref\",\n type: \"string\",\n required: false,\n description: \"Git ref for worktree isolation\",\n },\n { name: \"port\", type: \"number\", required: false, description: \"Explicit port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Instance label\" },\n {\n name: \"env\",\n type: \"json\",\n required: false,\n description: \"Additional environment variables\",\n },\n {\n name: \"health_endpoint\",\n type: \"string\",\n required: false,\n description: \"Health check URL\",\n },\n ],\n examples: ['start --command \"bun run dev\" --label \"frontend\"'],\n },\n {\n name: \"register\",\n description: \"Track an externally started process.\",\n accessLevel: \"write\",\n args: [\n { name: \"pid\", type: \"number\", required: true, description: \"Process ID\" },\n { name: \"port\", type: \"number\", required: true, description: \"Port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Instance label\" },\n { name: \"cwd\", type: \"string\", required: false, description: \"Working directory\" },\n {\n name: \"health_endpoint\",\n type: \"string\",\n required: false,\n description: \"Health check URL\",\n },\n ],\n },\n {\n name: \"stop\",\n description: \"Stop a dev server instance.\",\n accessLevel: \"write\",\n args: [{ name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" }],\n },\n {\n name: \"restart\",\n description: \"Restart a managed instance.\",\n accessLevel: \"write\",\n args: [{ name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" }],\n },\n {\n name: \"status\",\n description: \"Check instance health.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"instance\",\n type: \"string\",\n required: false,\n description: \"Instance ID (omit for all)\",\n },\n ],\n },\n {\n name: \"logs\",\n description: \"Get recent stdout/stderr.\",\n accessLevel: \"read\",\n args: [\n { name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" },\n {\n name: \"lines\",\n type: \"number\",\n required: false,\n description: \"Number of lines (default: 50)\",\n },\n ],\n },\n {\n name: \"list_instances\",\n description: \"List all tracked instances.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"free_port\",\n description: \"Allocate a port from the pool.\",\n accessLevel: \"read\",\n args: [],\n },\n ];\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as DevServerState;\n if (\n [\"start\", \"register\", \"stop\", \"restart\"].includes(operation) &&\n handle.access === \"read-only\"\n ) {\n throw new Error(`DevServerConnector: \"${operation}\" requires read-write access`);\n }\n\n switch (operation) {\n case \"start\":\n return this._opStart(handle, state, args);\n case \"register\":\n return this._opRegister(state, args);\n case \"stop\":\n return this._opStop(state, args);\n case \"restart\":\n return this._opRestart(handle, state, args);\n case \"status\":\n return this._opStatus(state, args);\n case \"logs\":\n return this._opLogs(state, args);\n case \"list_instances\":\n return this._opListInstances(state);\n case \"free_port\":\n return this._opFreePort(state);\n default:\n throw new Error(`DevServerConnector: unknown operation \"${operation}\"`);\n }\n }\n\n private async _opStart(\n handle: ConnectorHandle,\n state: DevServerState,\n args: Record<string, unknown>,\n ): Promise<string> {\n const command = args.command ? String(args.command) : undefined;\n if (!command) throw new Error(\"start requires a command argument\");\n let cwd = args.cwd ? String(args.cwd) : process.cwd();\n const ref = args.ref ? String(args.ref) : undefined;\n const label = args.label ? String(args.label) : `srv-${++idCounter}`;\n const userEnv = (args.env as Record<string, string>) ?? {};\n const healthEndpoint = args.health_endpoint ? String(args.health_endpoint) : undefined;\n\n let worktreePath: string | undefined;\n let worktreeCleanup: (() => Promise<void>) | undefined;\n if (ref) {\n if (!state.repoRoot) throw new Error(\"start with ref requires a git repository\");\n const wt = await createWorktree({\n repoRoot: state.repoRoot,\n ref,\n baseDir: state.worktreeDir,\n label,\n owner: handle.id,\n });\n cwd = wt.path;\n worktreePath = wt.path;\n worktreeCleanup = wt.cleanup;\n }\n\n let port: number;\n if (args.port !== undefined && args.port !== null) {\n port = Number(args.port);\n if (!(await PortPool.isPortFree(port))) throw new Error(`Port ${port} is already in use`);\n state.pool.reserve(port);\n } else {\n port = await state.pool.allocate();\n }\n\n const resolvedHealth = healthEndpoint\n ? healthEndpoint.replace(/\\bPORT\\b/g, String(port))\n : `http://localhost:${port}/`;\n this.log.info(\"spawn dev server\", { label, command, cwd, port });\n const proc = portableSpawn([\"sh\", \"-c\", command], {\n cwd,\n env: { ...process.env, ...userEnv, PORT: String(port) },\n detached: true,\n });\n const logBuffer = new LogBuffer(state.logBufferSize);\n pipeToBuffer(proc.stdout, logBuffer);\n pipeToBuffer(proc.stderr, logBuffer);\n\n const instance: ServiceInstance = {\n id: label,\n pid: proc.pid,\n port,\n cwd,\n status: \"starting\",\n startedAt: new Date().toISOString(),\n command,\n env: userEnv,\n ref,\n worktreePath,\n worktreeCleanup,\n healthEndpoint: resolvedHealth,\n managed: true,\n restartable: true,\n process: proc,\n logBuffer,\n };\n state.instances.set(label, instance);\n proc.exited.then((code: number | null) => {\n this.log.info(\"dev server exited\", { label, exitCode: code });\n if (instance.status !== \"stopped\") {\n instance.status = code === 0 ? \"stopped\" : \"crashed\";\n if (code !== 0 && code !== null) {\n this.log.warn(\"dev server crashed\", { label, exitCode: code });\n }\n this.emitChange?.({\n path: `instance/${instance.id}`,\n action: \"delete\",\n source: \"operation\",\n });\n }\n });\n\n return JSON.stringify({ instance_id: label, pid: proc.pid, port, cwd });\n }\n\n private async _opRegister(state: DevServerState, args: Record<string, unknown>): Promise<string> {\n const pid = Number(args.pid);\n const port = Number(args.port);\n if (!pid || Number.isNaN(pid)) throw new Error(\"register requires a valid pid\");\n if (!port || Number.isNaN(port)) throw new Error(\"register requires a valid port\");\n if (!isPidAlive(pid)) throw new Error(`PID ${pid} is not alive`);\n if (await PortPool.isPortFree(port)) throw new Error(`Port ${port} is not bound`);\n\n const label = args.label ? String(args.label) : `ext-${pid}`;\n state.pool.reserve(port);\n state.instances.set(label, {\n id: label,\n pid,\n port,\n cwd: args.cwd ? String(args.cwd) : process.cwd(),\n status: \"healthy\",\n startedAt: new Date().toISOString(),\n healthEndpoint: args.health_endpoint\n ? String(args.health_endpoint)\n : `http://localhost:${port}/`,\n managed: false,\n restartable: false,\n });\n return JSON.stringify({ instance_id: label });\n }\n\n private async _opStop(state: DevServerState, args: Record<string, unknown>): Promise<string> {\n const id = String(args.instance ?? \"\");\n const inst = state.instances.get(id);\n if (!inst) throw new Error(`Instance \"${id}\" not found`);\n if (inst.managed && inst.process) await this._killProcess(inst, state);\n else state.pool.release(inst.port);\n state.instances.delete(id);\n this.emitChange?.({ path: `instance/${id}`, action: \"delete\", source: \"operation\" });\n return JSON.stringify({ stopped: true });\n }\n\n private async _opRestart(\n handle: ConnectorHandle,\n state: DevServerState,\n args: Record<string, unknown>,\n ): Promise<string> {\n const id = String(args.instance ?? \"\");\n const inst = state.instances.get(id);\n if (!inst) throw new Error(`Instance \"${id}\" not found`);\n if (!inst.managed || !inst.restartable) throw new Error(`Instance \"${id}\" is not restartable`);\n const { command, cwd, env, port, healthEndpoint } = inst;\n if (inst.process) await this._killProcess(inst, state);\n state.instances.delete(id);\n state.pool.reserve(port);\n return this._opStart(handle, state, {\n command,\n cwd,\n env,\n port,\n label: id,\n health_endpoint: healthEndpoint,\n });\n }\n\n private async _opStatus(state: DevServerState, args: Record<string, unknown>): Promise<string> {\n if (args.instance) {\n const inst = state.instances.get(String(args.instance));\n if (!inst) throw new Error(`Instance \"${args.instance}\" not found`);\n await this._refreshStatus(inst);\n return JSON.stringify(instanceToStatus(inst));\n }\n for (const inst of state.instances.values()) await this._refreshStatus(inst);\n return JSON.stringify([...state.instances.values()].map(instanceToStatus));\n }\n\n private async _refreshStatus(inst: ServiceInstance): Promise<void> {\n if (inst.status === \"stopped\") return;\n if (!isPidAlive(inst.pid)) {\n inst.status = \"crashed\";\n return;\n }\n if (inst.healthEndpoint) {\n try {\n const res = await fetch(inst.healthEndpoint, { signal: AbortSignal.timeout(3000) });\n inst.status = res.ok ? \"healthy\" : \"unhealthy\";\n } catch {\n inst.status = \"unhealthy\";\n }\n } else {\n inst.status = \"healthy\";\n }\n }\n\n private _opLogs(state: DevServerState, args: Record<string, unknown>): string {\n const inst = state.instances.get(String(args.instance ?? \"\"));\n if (!inst) throw new Error(`Instance \"${args.instance}\" not found`);\n if (!inst.managed) throw new Error(`Cannot retrieve logs for non-managed instance`);\n return inst.logBuffer!.tail(args.lines ? Number(args.lines) : 50).join(\"\\n\");\n }\n\n private _opListInstances(state: DevServerState): string {\n return JSON.stringify(\n [...state.instances.values()].map((i) => ({\n id: i.id,\n pid: i.pid,\n port: i.port,\n status: i.status,\n ref: i.ref,\n managed: i.managed,\n started_at: i.startedAt,\n cwd: i.cwd,\n })),\n );\n }\n\n private async _opFreePort(state: DevServerState): Promise<string> {\n return JSON.stringify({ port: await state.pool.allocate() });\n }\n\n private _describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n return {\n id: declaration.id,\n name: `Dev Server — ${declaration.id}`,\n description:\n \"Manage dev server processes with port allocation, health checks, and log capture.\",\n category: \"service\",\n access: declaration.access,\n toolNames: this._describeOperations(handle).map((o) => o.name),\n };\n }\n}\n\nfunction instanceToStatus(inst: ServiceInstance) {\n return {\n id: inst.id,\n pid: inst.pid,\n port: inst.port,\n status: inst.status,\n managed: inst.managed,\n restartable: inst.restartable,\n ref: inst.ref,\n cwd: inst.cwd,\n started_at: inst.startedAt,\n health_endpoint: inst.healthEndpoint,\n uptime_ms: Date.now() - new Date(inst.startedAt).getTime(),\n };\n}\n\n/**\n * Creates a new DevServerConnector instance.\n * @returns Configured DevServerConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#devserver-connector-factory\n */\nexport function createConnector(): DevServerConnector {\n return new DevServerConnector();\n}\n","/**\n * StaticServerConnector — serve a directory of static files over HTTP.\n * Category: service\n *\n * Built on `node:http` + `node:fs`, so it runs under both Node and Bun.\n */\n\nimport { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { createServer, type Server as HttpServer, type ServerResponse } from \"node:http\";\nimport { join, resolve, sep } from \"node:path\";\nimport {\n AbstractConnector,\n PortPool,\n createWorktree,\n findGitRoot,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport mime from \"mime\";\n\ninterface StaticInstance {\n id: string;\n port: number;\n dir: string;\n server: HttpServer;\n ref?: string;\n worktreePath?: string;\n worktreeCleanup?: () => Promise<void>;\n startedAt: string;\n status: \"healthy\" | \"stopped\";\n}\n\ninterface StaticServerState {\n instances: Map<string, StaticInstance>;\n pool: PortPool;\n repoRoot: string | null;\n worktreeDir: string;\n}\n\nconst DEFAULT_PORT_RANGE: [number, number] = [14000, 14099];\nconst DEFAULT_WORKTREE_DIR = \"/tmp/skaile-static-worktrees\";\n\n/**\n * Connector for serving static file directories over HTTP.\n * Supports multiple concurrent instances, port allocation, and optional git worktree isolation.\n * @docLink packages/base-assets/concepts#static-server-connector\n */\nexport class StaticServerConnector extends AbstractConnector {\n readonly name = \"static\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): Promise<ConnectorHandle> {\n this.log.info(\"connect\", { id: declaration.id });\n const range = (declaration.options?.port_range as [number, number]) ?? DEFAULT_PORT_RANGE;\n const worktreeDir = String(declaration.options?.worktree_dir ?? DEFAULT_WORKTREE_DIR);\n let repoRoot: string | null = null;\n try {\n repoRoot = findGitRoot(process.cwd());\n } catch {}\n\n return this.makeHandle(declaration, {\n instances: new Map(),\n pool: new PortPool(range),\n repoRoot,\n worktreeDir,\n } as StaticServerState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n try {\n await this._stopAll(handle);\n } finally {\n handle.status = \"disconnected\";\n }\n }\n\n override async onSessionClose(handle: ConnectorHandle): Promise<string | undefined> {\n await this._stopAll(handle);\n return undefined;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private async _stopAll(handle: ConnectorHandle): Promise<void> {\n const state = handle.state as StaticServerState;\n for (const [, instance] of state.instances) {\n stopHttpServer(instance.server);\n instance.status = \"stopped\";\n if (instance.worktreeCleanup) {\n try {\n await instance.worktreeCleanup();\n } catch {}\n }\n state.pool.release(instance.port);\n }\n state.instances.clear();\n }\n\n private _describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"serve\",\n description: \"Serve a directory of static files over HTTP.\",\n accessLevel: \"write\",\n args: [\n { name: \"dir\", type: \"string\", required: true, description: \"Directory to serve\" },\n { name: \"port\", type: \"number\", required: false, description: \"Explicit port\" },\n { name: \"label\", type: \"string\", required: false, description: \"Instance label\" },\n { name: \"ref\", type: \"string\", required: false, description: \"Git ref for worktree\" },\n ],\n },\n {\n name: \"stop\",\n description: \"Stop a static server.\",\n accessLevel: \"write\",\n args: [{ name: \"instance\", type: \"string\", required: true, description: \"Instance ID\" }],\n },\n {\n name: \"status\",\n description: \"Get instance status.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"instance\",\n type: \"string\",\n required: false,\n description: \"Instance ID (omit for all)\",\n },\n ],\n },\n {\n name: \"list_instances\",\n description: \"List all active instances.\",\n accessLevel: \"read\",\n args: [],\n },\n { name: \"free_port\", description: \"Reserve a free port.\", accessLevel: \"read\", args: [] },\n ];\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as StaticServerState;\n if ((operation === \"serve\" || operation === \"stop\") && handle.access === \"read-only\") {\n throw new Error(`StaticServerConnector: \"${operation}\" requires read-write access`);\n }\n\n switch (operation) {\n case \"serve\": {\n let dir = args.dir ? String(args.dir) : \"\";\n if (!dir && !args.ref) throw new Error(\"serve requires a dir or ref\");\n const label = args.label ? String(args.label) : `static-${Date.now()}`;\n const port = args.port ? Number(args.port) : await state.pool.allocate();\n if (args.port) state.pool.reserve(port);\n\n let worktreePath: string | undefined;\n let worktreeCleanup: (() => Promise<void>) | undefined;\n let ref: string | undefined;\n\n if (args.ref) {\n if (!state.repoRoot) throw new Error(\"ref-based serving requires a git repository\");\n ref = String(args.ref);\n const wt = await createWorktree({\n repoRoot: state.repoRoot,\n ref,\n baseDir: state.worktreeDir,\n label,\n owner: `static:${label}`,\n });\n worktreePath = wt.path;\n worktreeCleanup = wt.cleanup;\n dir = dir ? join(wt.path, dir) : wt.path;\n }\n\n const serveDir = dir;\n const server = createServer((req, res) => {\n serveStaticFile(serveDir, req.url ?? \"/\", res);\n });\n server.listen(port);\n\n state.instances.set(label, {\n id: label,\n port,\n dir: serveDir,\n server,\n ref,\n worktreePath,\n worktreeCleanup,\n startedAt: new Date().toISOString(),\n status: \"healthy\",\n });\n this.emitChange?.({ path: label, action: \"create\", source: \"operation\" });\n return JSON.stringify({ instance_id: label, port, url: `http://localhost:${port}` });\n }\n\n case \"stop\": {\n const id = String(args.instance ?? \"\");\n const instance = state.instances.get(id);\n if (!instance) throw new Error(`Instance \"${id}\" not found`);\n 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 case \"status\": {\n if (args.instance) {\n const inst = state.instances.get(String(args.instance));\n if (!inst) throw new Error(`Instance \"${args.instance}\" not found`);\n return JSON.stringify(instanceToStatus(inst));\n }\n return JSON.stringify([...state.instances.values()].map(instanceToStatus));\n }\n\n case \"list_instances\":\n return JSON.stringify(\n [...state.instances.values()].map((i) => ({\n id: i.id,\n port: i.port,\n dir: i.dir,\n url: `http://localhost:${i.port}`,\n ref: i.ref,\n status: i.status,\n started_at: i.startedAt,\n })),\n );\n\n case \"free_port\":\n return JSON.stringify({ port: await state.pool.allocate() });\n\n default:\n throw new Error(`StaticServerConnector: unknown operation \"${operation}\"`);\n }\n }\n\n private _describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n return {\n id: declaration.id,\n name: \"Static File Server\",\n description: \"Serve directories of static files over HTTP.\",\n category: \"service\",\n access: handle.access,\n toolNames: this._describeOperations(handle).map((o) => o.name),\n };\n }\n}\n\n/**\n * Serve a single file from `rootDir` for the given request URL. Rejects paths\n * that escape `rootDir` (path traversal), 404s missing files, and resolves\n * directory requests to `index.html`.\n */\nfunction serveStaticFile(rootDir: string, reqUrl: string, res: ServerResponse): void {\n const root = resolve(rootDir);\n const pathname = decodeURIComponent(new URL(reqUrl, \"http://localhost\").pathname);\n let filePath = resolve(root, `.${pathname}`);\n // Containment guard — never serve a file outside the configured directory.\n if (filePath !== root && !filePath.startsWith(root + sep)) {\n res.writeHead(403, { \"content-type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n if (pathname.endsWith(\"/\") || (existsSync(filePath) && statSync(filePath).isDirectory())) {\n filePath = join(filePath, \"index.html\");\n }\n if (!existsSync(filePath) || !statSync(filePath).isFile()) {\n res.writeHead(404, { \"content-type\": \"text/plain\" });\n res.end(\"Not Found\");\n return;\n }\n res.writeHead(200, { \"content-type\": mime.getType(filePath) ?? \"application/octet-stream\" });\n const stream = createReadStream(filePath);\n stream.on(\"error\", () => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n res.end();\n });\n stream.pipe(res);\n}\n\n/** Stop an HTTP server, terminating any in-flight connections immediately. */\nfunction stopHttpServer(server: HttpServer): void {\n server.closeAllConnections();\n server.close();\n}\n\nfunction instanceToStatus(instance: StaticInstance) {\n return {\n id: instance.id,\n port: instance.port,\n dir: instance.dir,\n url: `http://localhost:${instance.port}`,\n ref: instance.ref,\n status: instance.status,\n started_at: instance.startedAt,\n uptime_ms: Date.now() - new Date(instance.startedAt).getTime(),\n };\n}\n\n/**\n * Creates a new StaticServerConnector instance.\n * @returns Configured StaticServerConnector ready to be registered in the connector registry.\n * @docLink packages/base-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 { AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} 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/base-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 reject(new Error(\"cloudflared: failed to parse public URL\"));\n };\n readLoop().catch(reject);\n setTimeout(() => reject(new Error(\"cloudflared: timed out\")), 30_000);\n });\n}\n\nasync function spawnNgrokTunnel(port: number): Promise<{ url: string; process: { kill(): void } }> {\n const proc = 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/base-assets/api-reference#tunnel-connector-factory\n */\nexport function createConnector(): TunnelConnector {\n return new TunnelConnector();\n}\n","/**\n * DeployConnector — build at a git ref and push to remote deployment targets.\n *\n * Supported providers: mock, fly, vercel, docker-push, rsync.\n * Only `mock` is fully implemented.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\n\ninterface DeployState {\n provider: string;\n defaults: Record<string, string>;\n deployments: Map<string, DeploymentRecord>;\n repoRoot: string | null;\n worktreeDir: string;\n}\n\ninterface DeploymentRecord {\n id: string;\n url: string;\n ref?: string;\n buildCommand: string;\n buildDir: string;\n deployedAt: string;\n status: \"deploying\" | \"live\" | \"failed\" | \"removed\";\n}\n\n/**\n * Connector for building and deploying to remote targets.\n * Supports push, status, list, teardown, and logs operations. Currently implements the `mock` provider; fly, vercel, docker-push, and rsync are planned.\n * @docLink packages/base-assets/concepts#deploy-connector\n */\nexport class DeployConnector extends AbstractConnector {\n readonly name = \"deploy\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): Promise<ConnectorHandle> {\n const provider = String(declaration.options?.provider ?? \"mock\");\n this.log.info(\"connect\", { id: declaration.id, provider });\n const defaults: Record<string, string> = {};\n for (const [k, v] of Object.entries(declaration.options ?? {})) {\n if (k !== \"provider\" && typeof v === \"string\") defaults[k] = v;\n }\n let repoRoot: string | null = null;\n try {\n repoRoot = execSync(\"git rev-parse --show-toplevel\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {}\n return this.makeHandle(declaration, {\n provider,\n defaults,\n deployments: new Map(),\n repoRoot,\n worktreeDir: process.cwd(),\n } as DeployState);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n handle.status = \"disconnected\";\n }\n\n override async onSessionClose(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n override async onHibernate(_handle: ConnectorHandle): Promise<string | undefined> {\n return undefined;\n }\n\n // ── Tool face methods (private, wired in constructor) ─────────────────────\n\n private _describeOperations(_handle: ConnectorHandle): OperationDescriptor[] {\n return [\n {\n name: \"push\",\n description: \"Build and deploy.\",\n accessLevel: \"write\",\n args: [\n { name: \"build_command\", type: \"string\", required: true, description: \"Build command\" },\n {\n name: \"build_dir\",\n type: \"string\",\n required: true,\n description: \"Build output directory\",\n },\n { name: \"ref\", type: \"string\", required: false, description: \"Git ref\" },\n { name: \"label\", type: \"string\", required: false, description: \"Deployment label\" },\n {\n name: \"target_overrides\",\n type: \"json\",\n required: false,\n description: \"Provider overrides\",\n },\n ],\n },\n {\n name: \"status\",\n description: \"Get deployment status.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"deployment\",\n type: \"string\",\n required: false,\n description: \"Deployment ID (omit for all)\",\n },\n ],\n },\n { name: \"list\", description: \"List all deployments.\", accessLevel: \"read\", args: [] },\n {\n name: \"teardown\",\n description: \"Remove a deployment.\",\n accessLevel: \"write\",\n args: [\n { name: \"deployment\", type: \"string\", required: true, description: \"Deployment ID\" },\n ],\n },\n {\n name: \"logs\",\n description: \"Fetch remote logs.\",\n accessLevel: \"read\",\n args: [\n { name: \"deployment\", type: \"string\", required: true, description: \"Deployment ID\" },\n {\n name: \"lines\",\n type: \"number\",\n required: false,\n description: \"Number of lines (default: 100)\",\n },\n ],\n },\n ];\n }\n\n private _describeSkill(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const state = handle.state as DeployState;\n return {\n id: declaration.id,\n name: `Deploy — ${state.provider}`,\n description: `Build and deploy to ${state.provider}.`,\n category: \"service\",\n access: handle.access,\n toolNames: [\"push\", \"status\", \"list\", \"teardown\", \"logs\"],\n };\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const state = handle.state as DeployState;\n switch (operation) {\n case \"push\":\n return this._opPush(handle, state, args);\n case \"status\":\n return this._opStatus(state, args);\n case \"list\":\n return this._opList(state);\n case \"teardown\":\n return this._opTeardown(handle, state, args);\n case \"logs\":\n return this._opLogs(state, args);\n default:\n throw new Error(`DeployConnector has no operation: ${operation}`);\n }\n }\n\n private async _opPush(\n handle: ConnectorHandle,\n state: DeployState,\n args: Record<string, unknown>,\n ): Promise<string> {\n if (handle.access === \"read-only\") throw new Error(\"push requires read-write access\");\n const buildCommand = String(args.build_command ?? \"\");\n const buildDir = String(args.build_dir ?? \"\");\n if (!buildCommand) throw new Error(\"push: build_command required\");\n if (!buildDir) throw new Error(\"push: build_dir required\");\n const deploymentId = args.label ? String(args.label) : `deploy-${Date.now()}`;\n this.log.info(\"build start\", {\n deploymentId,\n buildCommand,\n buildDir,\n provider: state.provider,\n });\n try {\n let result: string;\n switch (state.provider) {\n case \"mock\":\n result = this._mockPush(state, {\n deploymentId,\n buildCommand,\n buildDir,\n ref: args.ref ? String(args.ref) : undefined,\n });\n break;\n default:\n throw new Error(`Provider \"${state.provider}\" is not yet implemented`);\n }\n this.log.info(\"build success\", { deploymentId });\n return result;\n } catch (err) {\n this.log.error(\"build failed\", err, { deploymentId });\n throw err;\n }\n }\n\n private _mockPush(\n state: DeployState,\n opts: { deploymentId: string; buildCommand: string; buildDir: string; ref?: string },\n ): string {\n const record: DeploymentRecord = {\n id: opts.deploymentId,\n url: `https://mock.deploy.example.com/${opts.deploymentId}`,\n ref: opts.ref,\n buildCommand: opts.buildCommand,\n buildDir: opts.buildDir,\n deployedAt: new Date().toISOString(),\n status: \"live\",\n };\n state.deployments.set(opts.deploymentId, record);\n return JSON.stringify({ deployment_id: record.id, url: record.url, ref: record.ref ?? null });\n }\n\n private _opStatus(state: DeployState, args: Record<string, unknown>): string {\n const id = args.deployment ? String(args.deployment) : undefined;\n if (id) {\n const r = state.deployments.get(id);\n if (!r) throw new Error(`Deployment not found: ${id}`);\n return JSON.stringify(this._ser(r));\n }\n return JSON.stringify([...state.deployments.values()].map((r) => this._ser(r)));\n }\n\n private _opList(state: DeployState): string {\n return JSON.stringify([...state.deployments.values()].map((r) => this._ser(r)));\n }\n\n private _opTeardown(\n handle: ConnectorHandle,\n state: DeployState,\n args: Record<string, unknown>,\n ): string {\n if (handle.access === \"read-only\") throw new Error(\"teardown requires read-write access\");\n const id = args.deployment ? String(args.deployment) : undefined;\n if (!id) throw new Error(\"teardown: deployment required\");\n if (state.provider === \"mock\") {\n if (!state.deployments.delete(id)) throw new Error(`Not found: ${id}`);\n return JSON.stringify({ removed: true });\n }\n throw new Error(`Provider \"${state.provider}\" does not support teardown yet`);\n }\n\n private _opLogs(state: DeployState, args: Record<string, unknown>): string {\n const id = args.deployment ? String(args.deployment) : undefined;\n if (!id) throw new Error(\"logs: deployment required\");\n if (state.provider === \"mock\")\n return JSON.stringify({ deployment: id, logs: \"No logs available for mock provider.\" });\n throw new Error(`Provider \"${state.provider}\" does not support logs yet`);\n }\n\n private _ser(r: DeploymentRecord): Record<string, unknown> {\n return {\n id: r.id,\n url: r.url,\n ref: r.ref ?? null,\n status: r.status,\n deployedAt: r.deployedAt,\n buildCommand: r.buildCommand,\n buildDir: r.buildDir,\n };\n }\n}\n\n/**\n * Creates a new DeployConnector instance.\n * @returns Configured DeployConnector ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#deploy-connector-factory\n */\nexport function createConnector(): DeployConnector {\n return new DeployConnector();\n}\n","/**\n * Connector registry.\n *\n * Built-in connectors from `@skaile/workspaces/base-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/base-assets/connectors/<name>\"` —\n * never aliased through a variable. Indirection defeats `bun --compile`'s\n * static analysis and silently drops the module from the binary.\n * Regression test: `tests/connector-tools-regression.test.ts`.\n */\n\nimport {\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// Static subpath imports — string literals only.\n// Filesystem-face connectors (mount drivers migrated in Task 6)\nimport { createConnector as createGitConnector } from \"@skaile/workspaces/base-assets/connectors/git\";\nimport { createConnector as createLocalConnector } from \"@skaile/workspaces/base-assets/connectors/local\";\nimport { createConnector as createS3Connector } from \"@skaile/workspaces/base-assets/connectors/s3\";\nimport { createConnector as createWebdavConnector } from \"@skaile/workspaces/base-assets/connectors/webdav\";\nimport { createConnector as createSharepointConnector } from \"@skaile/workspaces/base-assets/connectors/sharepoint\";\nimport { createConnector as createGoogleDriveConnector } from \"@skaile/workspaces/base-assets/connectors/googledrive\";\n// Data connectors (migrated in Task 7)\nimport { createConnector as createMemoryConnector } from \"@skaile/workspaces/base-assets/connectors/memory\";\nimport { createConnector as createPostgresConnector } from \"@skaile/workspaces/base-assets/connectors/postgres\";\nimport { createConnector as createSqliteConnector } from \"@skaile/workspaces/base-assets/connectors/sqlite\";\nimport { createConnector as createMinioConnector } from \"@skaile/workspaces/base-assets/connectors/minio\";\n// State connectors (migrated in Task 8)\nimport { createConnector as createFlowConnector } from \"@skaile/workspaces/base-assets/connectors/flow\";\nimport { createConnector as createXstateConnector } from \"@skaile/workspaces/base-assets/connectors/xstate\";\nimport { createConnector as createXstateStoreConnector } from \"@skaile/workspaces/base-assets/connectors/xstate-store\";\nimport { createConnector as createGmailConnector } from \"@skaile/workspaces/base-assets/connectors/gmail\";\nimport { createConnector as createMattermostConnector } from \"@skaile/workspaces/base-assets/connectors/mattermost\";\n// Service connectors (migrated in Task 9)\nimport { createConnector as createDevserverConnector } from \"@skaile/workspaces/base-assets/connectors/devserver\";\n// Subpath is `static-server`; registry key (CONNECTOR.md `name:`) is `static`.\nimport { createConnector as createStaticConnector } from \"@skaile/workspaces/base-assets/connectors/static-server\";\nimport { createConnector as createTunnelConnector } from \"@skaile/workspaces/base-assets/connectors/tunnel\";\nimport { createConnector as createDeployConnector } from \"@skaile/workspaces/base-assets/connectors/deploy\";\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: \"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\", displayName: \"static\" },\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/base-assets/connectors/<name>\"` —\n * never aliased through a variable. Indirection defeats `bun --compile`'s\n * static analysis and silently drops the module from the binary.\n *\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\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 is `static-server`; registry key (CONNECTOR.md `name:`) is `static`.\n reg(\"static\", () => 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 { SecretProvider } from \"./secrets.js\";\nimport type { Logger } from \"@skaile/workspaces/types\";\n\n// ── Connector declaration (runtime config, resolved from skaile.yaml) ────────\n\n/**\n * Parsed connector configuration from `skaile.yaml`, passed to `ConnectorAdapter.connect()` and held by `ConnectorManager`.\n * @docLink packages/connectors/concepts#connector-declaration\n */\nexport interface ConnectorDeclaration {\n /** Unique identifier for this connector instance. */\n id: string;\n /** Driver type: \"postgres\", \"redis\", \"memory\", \"xstate\", \"yjs\", etc. */\n driver: string;\n /** Access level enforced by the manager. */\n access: \"read-only\" | \"read-write\";\n /** Credential reference: \"env:VAR_NAME\" or inline value. */\n auth?: string;\n /** Driver-specific configuration. */\n options?: Record<string, unknown>;\n /** 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// ── 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 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}) => 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 /** Backend token mediator — present for `auth: backend` mountable connectors. */\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\n/**\n * Filesystem face — present ⇒ the connector is \"mountable\".\n * @docLink packages/connectors/concepts#filesystem-face\n */\nexport interface FilesystemFace {\n /** Pull latest remote state into the mounted directory. */\n sync(handle: ConnectorHandle, options?: SyncOptions): Promise<SyncResult>;\n}\n\n/**\n * Tool face — present ⇒ the connector exposes agent tools.\n * @docLink packages/connectors/concepts#tool-face\n */\nexport interface ToolFace {\n read?(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null>;\n write?(handle: ConnectorHandle, path: string, content: ConnectorContent): Promise<void>;\n delete?(handle: ConnectorHandle, path: string): Promise<boolean>;\n list?(handle: ConnectorHandle, path?: string, options?: ListOptions): Promise<ConnectorEntry[]>;\n search?(handle: ConnectorHandle, query: string, options?: SearchOptions): Promise<SearchResult[]>;\n describeOperations(handle: ConnectorHandle): OperationDescriptor[];\n executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string>;\n describeSkill?(\n handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor;\n}\n\n/**\n * The unified connector contract. A connector should expose at least one face\n * (`filesystem` and/or `tools`); `ConnectorManager` rejects a faceless\n * connector at connect time.\n * @docLink packages/connectors/concepts#connector\n */\nexport interface Connector {\n readonly name: string;\n connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle>;\n disconnect(handle: ConnectorHandle): Promise<void>;\n readonly filesystem?: FilesystemFace;\n readonly tools?: ToolFace;\n describeFields?(): ConnectorFieldSpec[];\n setLogger?(logger: Logger): void;\n watch?(\n handle: ConnectorHandle,\n callback: (e: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n ): WatchHandle;\n onHibernate?(handle: ConnectorHandle): Promise<string | undefined>;\n onSessionClose?(handle: ConnectorHandle): Promise<string | undefined>;\n}\n\n/**\n * Factory used by the connector registry.\n * @docLink packages/connectors/api-reference#connector-factory\n */\nexport type ConnectorFactory = () => Connector;\n\n/**\n * Per-connector bulk-connect result returned by `ConnectorManager.connectAll()`.\n * @docLink packages/connectors/concepts#connector-startup-report\n */\nexport interface ConnectorStartupReport {\n results: Array<{\n id: string;\n connected: boolean;\n mountPath?: string;\n error?: string;\n access?: \"read-only\" | \"read-write\";\n }>;\n}\n\n/**\n * Thrown by `connectAll` when a read-write mountable connector fails and\n * `failOnReadWriteError` was set.\n * @docLink packages/connectors/concepts#connector-startup-error\n */\nexport class ConnectorStartupError extends Error {\n readonly report: ConnectorStartupReport;\n readonly failedReadWrite: ReadonlyArray<{ id: string; error: string }>;\n constructor(\n message: string,\n report: ConnectorStartupReport,\n failedReadWrite: ReadonlyArray<{ id: string; error: string }>,\n ) {\n super(message);\n this.name = \"ConnectorStartupError\";\n this.report = report;\n this.failedReadWrite = failedReadWrite;\n }\n}\n","/**\n * ConnectorManager — unified lifecycle & mount-target allocation.\n *\n * Manages the full lifecycle of every connector declared in `skaile.yaml`,\n * whether it exposes a `filesystem` face, a `tools` face, or both.\n *\n * @docLink packages/connectors/concepts#connector-manager\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport type { CatalogEntry } from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { TelemetryProvider, Trace } from \"@skaile/workspaces/telemetry\";\nimport type { ConnectorStatusEvent, Logger } from \"@skaile/workspaces/types\";\nimport { pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\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 { 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 * 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\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 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 /**\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.\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(): TokenMediator | undefined {\n const original = this.tokenMediator;\n const preMinted = this.preMintedSecrets;\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 });\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 /**\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 tokenMediator: undefined,\n };\n\n // Resolve declared fields via the chain\n if (this.chain && connector.describeFields) {\n const fields = connector.describeFields();\n ctx.resolvedFields = await resolveFields(declaration, fields, this.chain);\n }\n\n // Filesystem face: allocate mount target and wrap mediator\n if (connector.filesystem != null) {\n const absPath = this.resolveMountTarget(declaration);\n if (!existsSync(absPath)) mkdirSync(absPath, { recursive: true });\n ctx.mountTarget = absPath;\n ctx.tokenMediator = this.buildWrappedMediator();\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, wraps mediator.\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 */\n async connectAll(\n declarations: ConnectorDeclaration[],\n options?: { failOnReadWriteError?: boolean },\n ): Promise<ConnectorStartupReport> {\n this.mgrLog.info(\"connectAll start\", { count: declarations.length });\n const results: ConnectorStartupReport[\"results\"] = [];\n\n for (const decl of declarations) {\n // Emit \"connecting\" status before attempting\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"connecting\",\n });\n\n try {\n const connector = 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, { connector, handle, declaration: decl });\n results.push({\n id: decl.id,\n connected: true,\n mountPath: handle.mountPath,\n access: decl.access,\n });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"connected\",\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.mgrLog.error(\"connect failed\", err, { id: decl.id, driver: decl.driver });\n results.push({\n id: decl.id,\n connected: false,\n error: msg,\n access: decl.access,\n });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: decl.id,\n status: \"error\",\n error: msg,\n });\n }\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 /** 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 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.mgrLog.info(\"disconnectAll complete\");\n }\n\n // ── Hot-plug ──────────────────────────────────────────────────────────────────\n\n /**\n * Connect a single connector (hot-plug). Resolves fields and allocates\n * mount target if the connector has a filesystem face.\n *\n * @returns The `ConnectorHandle` for subsequent operations.\n */\n async connect(declaration: ConnectorDeclaration): Promise<ConnectorHandle> {\n // Emit \"connecting\" before attempting\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: declaration.id,\n status: \"connecting\",\n });\n\n const connector = await this.resolveConnector(declaration.driver);\n const connectorLog = createLogger({\n kind: \"connector\",\n subkind: connector.name ?? declaration.driver,\n instance: declaration.id,\n });\n connector.setLogger?.(connectorLog);\n\n const ctx = await this.buildConnectContext(declaration, connector);\n\n try {\n const handle = await this.withSpan(\n \"connector.connect\",\n {\n \"skaile.connector.id\": declaration.id,\n \"skaile.connector.driver\": declaration.driver,\n \"skaile.connector.operation\": \"connect\",\n },\n () => connector.connect(declaration, ctx),\n );\n this.active.set(declaration.id, { connector, handle, declaration });\n this.opts.onStatusChange?.({\n type: \"connector_status\",\n connectorId: declaration.id,\n status: \"connected\",\n });\n return handle;\n } catch (err) {\n 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.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 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 access: \"read-only\" | \"read-write\";\n mountPath?: string;\n }> {\n return [...this.active.entries()].map(([id, entry]) => ({\n id,\n driver: entry.connector.name,\n access: entry.declaration.access,\n mountPath: entry.handle.mountPath,\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 try {\n await entry.connector.filesystem.sync(entry.handle, options);\n results.push({ id, ok: true });\n } catch (err) {\n results.push({ id, ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n }\n return results;\n }\n\n // ── Base CRUD dispatch ────────────────────────────────────────────────────────\n\n /**\n * Throw a consistent error when the tools face is absent.\n */\n private requireToolFace(id: string, entry: ActiveConnector): ToolFace {\n if (!entry.connector.tools) {\n throw new Error(`Connector \"${id}\" has no tool face`);\n }\n return entry.connector.tools;\n }\n\n async read(id: string, path: string): Promise<ConnectorContent | null> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n if (!tools.read) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"read\"`);\n }\n return this.withSpan(\n \"connector.read\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"read\",\n },\n () => tools.read!(entry.handle, path),\n );\n }\n\n async write(id: string, path: string, content: ConnectorContent): Promise<void> {\n const entry = this.get(id);\n if (entry.declaration.access === \"read-only\") {\n throw new Error(`Connector \"${id}\" is read-only`);\n }\n const tools = this.requireToolFace(id, entry);\n if (!tools.write) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"write\"`);\n }\n return this.withSpan(\n \"connector.write\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"write\",\n },\n () => tools.write!(entry.handle, path, content),\n );\n }\n\n async delete(id: string, path: string): Promise<boolean> {\n const entry = this.get(id);\n if (entry.declaration.access === \"read-only\") {\n throw new Error(`Connector \"${id}\" is read-only`);\n }\n const tools = this.requireToolFace(id, entry);\n if (!tools.delete) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"delete\"`);\n }\n return this.withSpan(\n \"connector.delete\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"delete\",\n },\n () => tools.delete!(entry.handle, path),\n );\n }\n\n async list(id: string, path?: string, options?: ListOptions): Promise<ConnectorEntry[]> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n if (!tools.list) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"list\"`);\n }\n return this.withSpan(\n \"connector.list\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"list\",\n },\n () => tools.list!(entry.handle, path, options),\n );\n }\n\n async search(id: string, query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n if (!tools.search) {\n throw new Error(`Connector \"${id}\" tool face does not implement \"search\"`);\n }\n return this.withSpan(\n \"connector.search\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": \"search\",\n },\n () => tools.search!(entry.handle, query, options),\n );\n }\n\n // ── Custom operations ─────────────────────────────────────────────────────────\n\n /**\n * Execute a custom operation on a connector's tool face.\n *\n * @throws {Error} if connector has no tool face, operation is unknown, or\n * a write operation is called on a read-only connector.\n */\n async executeOp(id: string, operation: string, args: Record<string, unknown>): Promise<string> {\n const entry = this.get(id);\n const tools = this.requireToolFace(id, entry);\n\n const ops = tools.describeOperations(entry.handle);\n const opDesc = ops.find((o) => o.name === operation);\n if (!opDesc) {\n throw new Error(\n `Connector \"${id}\" has no operation \"${operation}\". Available: ${ops.map((o) => o.name).join(\", \")}`,\n );\n }\n if (opDesc.accessLevel === \"write\" && entry.declaration.access === \"read-only\") {\n throw new Error(\n `Operation \"${operation}\" requires write access but connector \"${id}\" is read-only`,\n );\n }\n\n return this.withSpan(\n \"connector.executeOp\",\n {\n \"skaile.connector.id\": id,\n \"skaile.connector.driver\": entry.connector.name,\n \"skaile.connector.operation\": operation,\n },\n () => tools.executeOp(entry.handle, operation, args),\n );\n }\n\n /**\n * Return the list of operations that a connector's tool face exposes.\n * Returns an empty array when the connector has no tool face.\n */\n getOperations(id: string): OperationDescriptor[] {\n const entry = this.get(id);\n return entry.connector.tools?.describeOperations(entry.handle) ?? [];\n }\n\n // ── Skill catalog ─────────────────────────────────────────────────────────────\n\n /**\n * Return `RuntimeSkillDescriptor` for every connected connector.\n * Uses `tools.describeSkill()` when available; falls back to `buildDefaultSkillDescriptor`.\n */\n listSkills(): RuntimeSkillDescriptor[] {\n return [...this.active.values()].map(({ connector, handle, declaration }) => {\n const describeSkill = connector.tools?.describeSkill;\n return describeSkill\n ? describeSkill.call(connector.tools, handle, declaration)\n : buildDefaultSkillDescriptor(connector, declaration, handle);\n });\n }\n\n /**\n * Return the rendered skill body for a single connector.\n *\n * @param id - Connector ID.\n * @param shellAccess - When true (default), CLI-style commands are used;\n * false renders SDK tool-call style.\n * @throws {Error} if the connector is not found.\n */\n loadSkill(id: string, shellAccess = true): string {\n const entry = this.get(id);\n const { connector, handle, declaration } = entry;\n const describeSkill = connector.tools?.describeSkill;\n const descriptor = describeSkill\n ? describeSkill.call(connector.tools, handle, declaration)\n : buildDefaultSkillDescriptor(connector, declaration, handle);\n const ops = connector.tools?.describeOperations(handle) ?? [];\n return buildSkillBody(descriptor, ops, shellAccess);\n }\n}\n","/**\n * Merged prompt/tool-delivery module for the unified ConnectorManager.\n *\n * Combines the responsibilities of:\n * - `mount-prompt.ts` — build a system-prompt section for filesystem-face connectors\n * - `connector-tools.ts` — build an SDK MCP server + system-prompt section for tool-face connectors\n *\n * Two exports:\n * 1. `buildConnectorPromptSection(manager, options?)` — markdown string for the\n * agent's system prompt. Iterates the unified manager's connectors and:\n * - if `connector.filesystem` is present → emits a Mounts table row (ported from mount-prompt.ts)\n * - if `connector.tools` is present → emits a Connectors list entry (ported from connector-tools.ts)\n * - dual-face connectors emit BOTH\n *\n * 2. `buildSdkConnectorTools(manager, options?)` — in-process MCP server config for\n * the Claude Agent SDK. Only tool-face connectors are wired to tools; filesystem-only\n * connectors are silently excluded.\n *\n * @docLink packages/connectors/concepts#connector-prompt\n */\n\n// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport type { ConnectorManager } from \"./connector-manager.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n// ── Options ───────────────────────────────────────────────────────────────────\n\n/**\n * Options for `buildSdkConnectorTools`.\n * @docLink packages/connectors/api-reference#connector-tool-options\n */\nexport interface ConnectorToolOptions {\n /** Pre-loaded `@anthropic-ai/claude-agent-sdk` instance (optional; auto-imported if absent). */\n sdk?: any;\n /** Pre-loaded `zod` namespace (optional; uses static import if absent). */\n z?: any;\n /** Whether the agent has shell access. Defaults to true. When true, `connector_exec` is omitted. */\n shellAccess?: boolean;\n}\n\n/**\n * Options for `buildConnectorPromptSection`.\n * @docLink packages/connectors/api-reference#connector-prompt-options\n */\nexport interface ConnectorPromptOptions {\n /** Whether the agent has shell access. Defaults to true. Affects CLI vs SDK tool examples. */\n shellAccess?: boolean;\n}\n\n// ── SDK tool builder ──────────────────────────────────────────────────────────\n\n/**\n * Build an in-process MCP server exposing connector tools for the Claude Agent SDK.\n * Only connectors with a `tools` face are wired; filesystem-only connectors are excluded.\n * Returns the server config to pass as `mcpServers` in the SDK query options.\n * Returns `null` if `@anthropic-ai/claude-agent-sdk` is not available.\n *\n * @param manager - Connected unified `ConnectorManager`.\n * @param options - Optional SDK/Zod overrides and shell access flag.\n * @returns MCP server config object or `null`.\n * @docLink packages/connectors/api-reference#build-sdk-connector-tools\n */\nexport async function buildSdkConnectorTools(\n manager: ConnectorManager,\n options?: ConnectorToolOptions,\n): Promise<object | null> {\n const shellAccess = options?.shellAccess ?? true;\n\n let sdk: any = options?.sdk;\n if (!sdk) {\n try {\n sdk = await import(\"@anthropic-ai/claude-agent-sdk\");\n } catch {\n return null;\n }\n }\n\n const z: any = options?.z ?? zStatic;\n\n const tools: any[] = [];\n\n // ── Discovery ──\n\n tools.push({\n name: \"connector_list\",\n description:\n \"List all currently registered connectors with their id, driver, access mode, and available operations. Use this to discover connectors that may have been added after session start (e.g. shared-state stores like 'presence' or 'session' pushed by the host).\",\n inputSchema: {},\n handler: async () => {\n try {\n const entries = manager.listConnectors();\n return { content: [{ type: \"text\" as const, text: JSON.stringify(entries, null, 2) }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_load_skill\",\n description:\n \"Load full instructions for a specific connector into context. Returns a markdown document describing the connector and its available CLI commands.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID (use connector_list to enumerate)\"),\n },\n handler: async ({ connector_id }: { connector_id: string }) => {\n try {\n const body = manager.loadSkill(connector_id, shellAccess);\n return { content: [{ type: \"text\" as const, text: body }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n // ── Base CRUD (tool-face connectors only) ──\n\n tools.push({\n name: \"connector_read\",\n description:\n 'Read content from a connector by path. For KV stores, path is the key. For databases, path is \"table/pk\".',\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) => {\n try {\n const content = await manager.read(connector_id, path);\n return {\n content: [{ type: \"text\" as const, text: content?.data?.toString() ?? \"(empty)\" }],\n };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_write\",\n description: \"Write content to a connector at a path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().describe(\"Path within the connector\"),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => {\n try {\n await manager.write(connector_id, path, { data: content });\n return { content: [{ type: \"text\" as const, text: \"Written.\" }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_list_entries\",\n description: \"List entries in a connector (files, keys, rows, etc).\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().optional().describe(\"Path prefix or directory\"),\n recursive: z.boolean().optional().describe(\"Include nested entries\"),\n },\n handler: async ({\n connector_id,\n path,\n recursive,\n }: {\n connector_id: string;\n path?: string;\n recursive?: boolean;\n }) => {\n try {\n const entries = await manager.list(connector_id, path, { recursive });\n return { content: [{ type: \"text\" as const, text: JSON.stringify(entries, null, 2) }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_search\",\n description: \"Search within a connector for matching content.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) => {\n try {\n const results = await manager.search(connector_id, query);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(results, null, 2) }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n tools.push({\n name: \"connector_delete\",\n description: \"Delete an entry from a connector.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n path: z.string().describe(\"Path to delete\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) => {\n try {\n const ok = await manager.delete(connector_id, path);\n return { content: [{ type: \"text\" as const, text: ok ? \"Deleted.\" : \"Not found.\" }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n\n // ── Fallback: connector_exec (only when no shell access) ──\n\n if (!shellAccess) {\n tools.push({\n name: \"connector_exec\",\n description:\n \"Execute a custom connector operation by name. Use only when shell access is unavailable. Load the connector skill first to see available operations and their arguments.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID\"),\n operation: z.string().describe(\"Operation name (e.g. 'send_message', 'query')\"),\n args: z\n .record(z.unknown())\n .describe(\"Named arguments for the operation (without -- prefix)\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => {\n try {\n const result = await manager.executeOp(connector_id, operation, args);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Error: ${err.message}` }],\n isError: true,\n };\n }\n },\n });\n }\n\n return sdk.createSdkMcpServer({ name: \"skaile-connectors\", tools });\n}\n\n// ── System prompt section builder ─────────────────────────────────────────────\n\n/**\n * Build a markdown section describing all connectors for the agent's system prompt.\n *\n * Iterates the unified `ConnectorManager` and, per connector:\n * - **Filesystem face** (`connector.filesystem != null`) → emits a row in the\n * `## Mounts` table (id, driver, mount path, access level), plus Tier-1/Tier-2\n * git auth guidance for `git` connectors (ported from `mount-prompt.ts`).\n * - **Tool face** (`connector.tools != null`) → emits an entry in the\n * `## Connectors` section (ported from `connector-tools.ts`).\n * - Dual-face connectors appear in BOTH sections.\n *\n * @param manager - Connected unified `ConnectorManager`.\n * @param options - Optional shell access flag.\n * @returns Markdown string to append to the system prompt, or empty string when\n * no connectors are connected.\n * @docLink packages/connectors/api-reference#build-connector-prompt-section\n */\nexport function buildConnectorPromptSection(\n manager: ConnectorManager,\n options?: ConnectorPromptOptions,\n): string {\n const shellAccess = options?.shellAccess ?? true;\n const allConnectors = manager.listConnectors();\n if (allConnectors.length === 0) return \"\";\n\n const sections: string[] = [];\n\n // ── Resolve each connector's faces in a single pass (I-2) ───────────────────\n // Each connector is looked up once; the result is shared by both the filesystem\n // section and the tool section below. A connector with neither face is silently\n // omitted — in the unified Connector model every connector is expected to have\n // at least one face (filesystem or tools). A face-less connector is a\n // misconfiguration, not a normal state, so excluding it from the prompt is\n // correct-by-design (unified-model invariant: every connector has ≥1 face).\n const faces = allConnectors.map((c) => {\n try {\n const e = manager.get(c.id);\n return { c, fs: e.connector.filesystem != null, tools: e.connector.tools != null };\n } catch {\n return { c, fs: false, tools: false };\n }\n });\n\n const fsConnectors = faces.filter((f) => f.fs).map((f) => f.c);\n const toolConnectors = faces.filter((f) => f.tools).map((f) => f.c);\n\n // ── Filesystem-face section (ported from mount-prompt.ts) ────────────────────\n\n if (fsConnectors.length > 0) {\n 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 for (const c of fsConnectors) {\n const mountPath = c.mountPath ?? \"(unmounted)\";\n lines.push(`| ${c.id} | ${c.driver} | \\`${mountPath}/\\` | ${c.access} |`);\n }\n\n // Tier-2 / Tier-1 git auth note (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 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) {\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 sections.push(lines.join(\"\\n\"));\n }\n\n // ── Tool-face section (ported from connector-tools.ts) ───────────────────────\n\n if (toolConnectors.length > 0) {\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 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 sections.push(lines.join(\"\\n\"));\n }\n\n return sections.join(\"\\n\\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 * LogBuffer — fixed-capacity ring buffer for capturing process stdout/stderr lines.\n * When the buffer is full, the oldest lines are evicted (FIFO).\n * @docLink packages/connectors/api-reference#log-buffer\n */\n\nexport class LogBuffer {\n private readonly lines: string[] = [];\n private readonly capacity: number;\n\n constructor(capacity = 500) {\n this.capacity = capacity;\n }\n\n /** Append a single line. */\n push(line: string): void {\n this.lines.push(line);\n if (this.lines.length > this.capacity) {\n this.lines.shift();\n }\n }\n\n /** Split text on newlines and push each line (preserves empty lines). */\n pushLines(text: string): void {\n const lines = text.split(\"\\n\");\n // Avoid pushing a trailing empty string from \"text\\n\".split(\"\\n\")\n for (let i = 0; i < lines.length; i++) {\n if (i === lines.length - 1 && lines[i] === \"\") break;\n this.push(lines[i]!);\n }\n }\n\n /** Return the last `n` lines. */\n tail(n: number): string[] {\n return this.lines.slice(-n);\n }\n\n /** Clear all stored lines. */\n clear(): void {\n this.lines.length = 0;\n }\n\n /** Current number of stored lines. */\n get size(): number {\n return this.lines.length;\n }\n}\n","/**\n * Credential helper script renderer — generates a POSIX `sh` script that git\n * invokes via `credential.<urlPrefix>.helper = !sh <path>` to fetch credentials\n * for a Tier-2 git mount.\n *\n * The script implements the wake-mid-401 hardening described in\n * `_devlog/specs/2026-05-07-unified-credential-mediation.md` § Step 9a:\n *\n * 1. On `op = get`, stat the credentials file and compute its age (mtime).\n * 2. If age > triggerAgeSec, touch the refresh-flag file. The runner watches\n * this path via `fs.watch` and mints a fresh access token + rewrites the\n * credentials file when it sees the change.\n * 3. Poll the credentials file's mtime in 200ms increments until the mtime\n * advances OR waitTimeoutMs elapses.\n * 4. Translate the credentials file (`scheme://user:pass@host <tag>` lines —\n * git's `store --file=` format) into the helper-output format git\n * expects (`username=<value>\\npassword=<value>\\n`). Filters lines by the\n * mount's url-prefix tag so multi-mount workspaces stay isolated.\n *\n * **Cross-platform**: targets POSIX `sh` (Linux + macOS). Avoids bashisms so\n * `dash`, `ash`, and `busybox sh` all work. The two GNU/BSD divergence points\n * are handled inline:\n *\n * - `stat -c %Y <file>` (GNU/Linux) vs `stat -f %m <file>` (BSD/macOS) —\n * try GNU first, fall back to BSD, default to 0.\n * - `sleep 0.2` is non-portable — use `usleep 200000` when present, else\n * fall back to `sleep 1`.\n *\n * The credentials file format is unchanged (Option B in the Step 9a plan):\n * `scheme://user:pass@host <tag>` per mount, written by `writeMountBlock`.\n * The helper script does the translation to `username=<>\\npassword=<>\\n`\n * inline so we don't have to change the on-disk format and break Step 1A\n * back-compat.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md`.\n */\n\n/** Required arguments for {@link renderCredentialHelperScript}. */\nexport interface RenderHelperOpts {\n /** Absolute path to the per-mount credentials file. */\n credentialsPath: string;\n /**\n * Absolute path to the workspace-level refresh-request flag file. The\n * runner watches this file via `fs.watch` and triggers a token refresh on\n * `change`.\n */\n refreshFlagPath: string;\n /**\n * Tag emitted by `writeMountBlock` on the credential line for this mount\n * (e.g. `# skaile-mount: workspace`). The helper greps for lines ending in\n * this tag so concurrent mounts in the same credentials file stay isolated.\n */\n credentialTag: string;\n /**\n * Touch the refresh-flag if the credentials file is older than this (in\n * seconds). Default: 300 (5 minutes — comfortably shorter than the typical\n * 1-hour Anthropic OAuth lifetime, well clear of the 5-minute pre-expiry\n * refresh window scheduled by the driver).\n */\n triggerAgeSec?: number;\n /**\n * Maximum time to wait for the credentials file mtime to advance after\n * touching the refresh-flag (in milliseconds). Default: 5000 (5 seconds —\n * long enough for the runner's debounced watcher + token mediator round-\n * trip; short enough that a stuck backend doesn't block git for minutes).\n */\n waitTimeoutMs?: number;\n}\n\n/**\n * Render the credential-helper script body. The returned string should be\n * written to disk with mode `0755` (owner rwx, group/other rx) so git can\n * execute it.\n *\n * `git` invokes credential helpers with one of three operations as `$1`:\n * - `get` — read credentials. We respond with the helper-output format.\n * - `store` — git wants us to remember a credential. We're a one-way\n * read-only helper; ignore.\n * - `erase` — git wants us to forget a credential. Same — ignore.\n *\n * Only `get` triggers the refresh-flag dance. Other ops exit silently with 0\n * so git falls back to the next helper in the chain (or its own prompt).\n *\n * The script also drains stdin on `get` because git always pipes the request\n * envelope (host, protocol, path, etc.) into the helper's stdin. Leaving it\n * unread can wedge git's helper FD.\n */\nexport function renderCredentialHelperScript(opts: RenderHelperOpts): string {\n const triggerAgeSec = opts.triggerAgeSec ?? 300;\n const waitTimeoutMs = opts.waitTimeoutMs ?? 5_000;\n // Round timeout up to whole seconds for the `sleep 1` fallback path.\n const waitTimeoutSec = Math.max(1, Math.ceil(waitTimeoutMs / 1_000));\n\n // Embed paths verbatim. Operators are responsible for not including funky\n // characters in their workspace path; we already control these (they live\n // under `<projectDir>/.skaile/`).\n const credPath = opts.credentialsPath;\n const flagPath = opts.refreshFlagPath;\n const tag = opts.credentialTag;\n\n return `#!/bin/sh\n# Generated by skaile-runner -- do not edit.\n# Tier-2 git credential helper: serves the latest cached token and triggers a\n# wake-mid-401 refresh when the credentials file is older than ${triggerAgeSec}s.\n# Spec: _devlog/specs/2026-05-07-unified-credential-mediation.md\n\nset -u\n\nop=\"\\${1:-}\"\n# 'store' and 'erase' are no-ops -- this is a read-only helper. Other ops\n# (none today) also bail silently so we don't break future git versions.\n[ \"$op\" = \"get\" ] || exit 0\n\nCRED_FILE='${credPath}'\nFLAG_FILE='${flagPath}'\nTAG='${tag}'\n\n# Drain stdin: git always pipes the request envelope. Leaving it unread can\n# wedge git's helper FD. We don't actually need any of it -- the credentials\n# file already keys by URL prefix via the helper's gitconfig block.\ncat > /dev/null 2>&1 || true\n\n# Bail silently if the credentials file is missing or empty: git falls\n# through to the next helper or its own prompt.\n[ -s \"$CRED_FILE\" ] || exit 0\n\n# Cross-platform mtime in epoch seconds: GNU stat -c first (Linux), then BSD\n# stat -f (macOS), then 0 if neither is present (in which case we skip the\n# refresh-flag dance entirely and just serve what we have).\nget_mtime() {\n stat -c %Y \"$1\" 2>/dev/null || stat -f %m \"$1\" 2>/dev/null || echo 0\n}\n\nnow=$(date +%s 2>/dev/null || echo 0)\nmtime=$(get_mtime \"$CRED_FILE\")\nage=$((now - mtime))\n\nif [ \"$age\" -gt ${triggerAgeSec} ]; then\n # Touch the refresh-flag (atomic open+close emits 'change' to fs.watch).\n : > \"$FLAG_FILE\" 2>/dev/null || true\n\n # Poll for the credentials file mtime to advance. usleep gives sub-second\n # resolution where available; sleep 1 is the portable fallback.\n end=$((now + ${waitTimeoutSec}))\n while :; do\n cur=$(date +%s 2>/dev/null || echo 0)\n if [ \"$cur\" -ge \"$end\" ]; then\n break\n fi\n new_mtime=$(get_mtime \"$CRED_FILE\")\n if [ \"$new_mtime\" -gt \"$mtime\" ]; then\n break\n fi\n if command -v usleep >/dev/null 2>&1; then\n usleep 200000\n else\n sleep 1\n fi\n done\nfi\n\n# Find the credential line for THIS mount (matched by the trailing tag) and\n# translate from git's 'store --file=' format ('scheme://user:pass@host <tag>')\n# into the helper-output format ('username=<>\\\\npassword=<>\\\\n'). If there's\n# more than one matching line (shouldn't happen but defence-in-depth), we\n# take the last one (most recently written).\nline=$(grep -F \" $TAG\" \"$CRED_FILE\" 2>/dev/null | tail -n 1)\n[ -n \"$line\" ] || exit 0\n\n# Strip the trailing ' <TAG>' from the URL.\nurl=\\${line% *}\n# Extract user:pass between scheme:// and @host.\n# scheme://user:pass@host -> user:pass\nuserinfo=\\${url#*://}\nuserinfo=\\${userinfo%@*}\nuser=\\${userinfo%%:*}\npass=\\${userinfo#*:}\n\n# git wants line-oriented key=value pairs followed by a blank line.\nprintf 'username=%s\\\\n' \"$user\"\nprintf 'password=%s\\\\n' \"$pass\"\nprintf '\\\\n'\n`;\n}\n","/**\n * Managed gitconfig writer — runner-managed credential helper config for\n * Tier-2 mount credentials.\n *\n * The runner exposes `<workspace>/.skaile/managed-gitconfig` to the agent\n * process via `GIT_CONFIG_GLOBAL` (with a fallback `[include]` in\n * `~/.gitconfig`). Each Tier-2 mount writes a tagged block into this file\n * pointing `credential.<urlPrefix>.helper` at the shared `git-credentials`\n * store, plus a single line into the credentials store carrying the actual\n * token. Refresh = atomically rewrite the credential line; the helper picks\n * up the new token on the next git network op.\n *\n * Keying is by **URL prefix**, not bare host: two mounts on `github.com`\n * with disjoint org prefixes (`https://github.com/orgA/`,\n * `https://github.com/orgB/`) coexist via narrower\n * `credential.<prefix>.helper` entries. Same prefix declared by two mounts\n * with different tokens is a true collision and throws\n * {@link ManagedGitconfigCollisionError}.\n *\n * Spec: `_devlog/specs/2026-05-05-git-credential-tiers.md`.\n */\n\nimport {\n chmodSync,\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n writeSync,\n} from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\n/**\n * Thrown when two mounts try to register a credential helper for the same\n * URL prefix with different tokens. The operator must either narrow the URL\n * prefixes (per-org paths) or consolidate the mounts.\n */\nexport class ManagedGitconfigCollisionError extends Error {\n readonly urlPrefix: string;\n readonly existingMountId: string;\n readonly newMountId: string;\n\n constructor(urlPrefix: string, existingMountId: string, newMountId: string) {\n super(\n `Mount '${newMountId}' tried to register URL prefix '${urlPrefix}' ` +\n `but mount '${existingMountId}' already owns it with a different credential. ` +\n `Narrow the prefixes (e.g. include the org segment) or consolidate the mounts.`,\n );\n this.name = \"ManagedGitconfigCollisionError\";\n this.urlPrefix = urlPrefix;\n this.existingMountId = existingMountId;\n this.newMountId = newMountId;\n }\n}\n\n/** Required arguments for {@link writeMountBlock}. */\nexport interface WriteMountBlockOptions {\n /** Mount declaration id; used as the block tag. */\n mountId: string;\n /**\n * URL prefix the credential should authenticate, e.g.\n * `https://github.com` or `https://github.com/orgA/`. Trailing slashes are\n * preserved verbatim (git treats them as different scopes).\n */\n urlPrefix: string;\n /**\n * The token to expose. Written to {@link credentialsPath} as\n * `https://x-access-token:<token>@<host>` for the helper to read.\n */\n token: string;\n /** Absolute path to the managed-gitconfig file. */\n gitconfigPath: string;\n /** Absolute path to the git-credentials store. */\n credentialsPath: string;\n /**\n * Optional: when set, the credential block points `helper = !sh <path>` at\n * this script instead of the static `store --file=` form. The script is\n * the wake-mid-401 helper rendered by `renderCredentialHelperScript` —\n * stats the credentials file's mtime, touches a refresh-flag if the cached\n * token is stale, and translates the `store --file=` line format into the\n * helper-output format git expects.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md` Step 9a.\n */\n helperScriptPath?: string;\n}\n\n/** Required arguments for {@link removeMountBlock}. */\nexport interface RemoveMountBlockOptions {\n /** Mount declaration id whose block should be removed. */\n mountId: string;\n /** Absolute path to the managed-gitconfig file. */\n gitconfigPath: string;\n /** Absolute path to the git-credentials store. */\n credentialsPath: string;\n}\n\n/** Required arguments for {@link atomicReplaceCredential}. */\nexport interface AtomicReplaceCredentialOptions {\n /** Mount id (used to find the matching credential line). */\n mountId: string;\n /** URL prefix the credential is keyed by. Same value passed to writeMountBlock. */\n urlPrefix: string;\n /** New token to install. */\n token: string;\n /** Absolute path to the git-credentials store. */\n credentialsPath: string;\n}\n\n// ── Block markers ────────────────────────────────────────────────────────────\n\nconst blockStart = (mountId: string) => `# skaile-mount: ${mountId}`;\nconst blockEnd = (mountId: string) => `# skaile-mount: ${mountId} (end)`;\nconst credentialTag = (mountId: string) => `# skaile-mount: ${mountId}`;\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction readFileOrEmpty(path: string): string {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Write a string atomically: tmp file in the same dir, then rename. POSIX\n * rename is atomic on the same filesystem, which is the property we need\n * for refresh-time replacement.\n */\nfunction atomicWrite(path: string, content: string, mode: number): void {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n const tmp = `${path}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;\n const fd = openSync(tmp, \"w\", mode);\n try {\n writeSync(fd, content);\n } finally {\n closeSync(fd);\n }\n // Some filesystems honor O_CREAT mode but ignore later edits; reassert.\n chmodSync(tmp, mode);\n renameSync(tmp, path);\n}\n\n/**\n * Extract the `[mountId, content]` block list from a managed-gitconfig file.\n * Anything outside a recognized block is returned as a single anonymous\n * `[\"\", content]` entry to preserve unknown lines on rewrite. This keeps the\n * function idempotent against an empty / hand-edited file.\n */\nfunction parseBlocks(text: string): Array<{ mountId: string; lines: string[] }> {\n const blocks: Array<{ mountId: string; lines: string[] }> = [];\n let current: { mountId: string; lines: string[] } | null = null;\n\n for (const line of text.split(\"\\n\")) {\n const startMatch = line.match(/^# skaile-mount: (\\S+)$/);\n const endMatch = line.match(/^# skaile-mount: (\\S+) \\(end\\)$/);\n\n if (startMatch) {\n if (current) blocks.push(current);\n current = { mountId: startMatch[1] ?? \"\", lines: [line] };\n continue;\n }\n if (endMatch) {\n if (current) {\n current.lines.push(line);\n blocks.push(current);\n current = null;\n }\n continue;\n }\n if (current) {\n current.lines.push(line);\n } else {\n // Foreign content (user edits, leading blank lines). Keep it out of any\n // block by stashing under the special \"\" id.\n const last = blocks[blocks.length - 1];\n if (last && last.mountId === \"\") {\n last.lines.push(line);\n } else {\n blocks.push({ mountId: \"\", lines: [line] });\n }\n }\n }\n if (current) blocks.push(current);\n\n // Trim trailing empty foreign block.\n while (blocks.length > 0) {\n const last = blocks[blocks.length - 1];\n if (last && last.mountId === \"\" && last.lines.every((l) => l.trim() === \"\")) {\n blocks.pop();\n } else {\n break;\n }\n }\n return blocks;\n}\n\nfunction renderBlocks(blocks: Array<{ mountId: string; lines: string[] }>): string {\n if (blocks.length === 0) return \"\";\n // Join lines, preserving the per-block lines structure. Make sure file ends\n // with a single trailing newline so git's parser is happy.\n const out = blocks.map((b) => b.lines.join(\"\\n\")).join(\"\\n\");\n return out.endsWith(\"\\n\") ? out : `${out}\\n`;\n}\n\nfunction buildBlock(\n mountId: string,\n urlPrefix: string,\n credentialsPath: string,\n helperScriptPath?: string,\n): string[] {\n // Step 9a: when a helperScriptPath is provided, point at the dynamic\n // wake-mid-401 helper instead of the static `store --file=` form. The\n // helper handles stale-token detection + refresh-flag dance and translates\n // the on-disk format into git's helper-output format. See\n // `credential-helper-script.ts`.\n const helperLine = helperScriptPath\n ? `\\thelper = !sh ${helperScriptPath}`\n : `\\thelper = store --file=${credentialsPath}`;\n return [blockStart(mountId), `[credential \"${urlPrefix}\"]`, helperLine, blockEnd(mountId)];\n}\n\nfunction buildCredentialLine(urlPrefix: string, token: string, mountId: string): string {\n // Strip a trailing slash so the credential URL matches what git emits when\n // it queries the helper. Git stores credentials as `scheme://user:pass@host`\n // with no path component.\n const u = new URL(urlPrefix);\n const host = u.host;\n const scheme = u.protocol.replace(/:$/, \"\");\n return `${scheme}://x-access-token:${token}@${host} ${credentialTag(mountId)}`;\n}\n\nfunction readCredentialLines(path: string): string[] {\n return readFileOrEmpty(path)\n .split(\"\\n\")\n .filter((l) => l.length > 0);\n}\n\nfunction writeCredentialLines(path: string, lines: string[]): void {\n const content = lines.length > 0 ? `${lines.join(\"\\n\")}\\n` : \"\";\n // Mode 0640: owner (skaile-runner) read+write, group (skaile) read-only.\n // Under UID separation (Step 4 of git-credential-tiers), the runner runs as\n // skaile-runner with primary group skaile so the agent process (uid skaile)\n // can read the credentials store via group membership while only the runner\n // can rewrite it.\n atomicWrite(path, content, 0o640);\n}\n\nfunction findExistingBlock(\n blocks: Array<{ mountId: string; lines: string[] }>,\n mountId: string,\n): { mountId: string; lines: string[] } | undefined {\n return blocks.find((b) => b.mountId === mountId);\n}\n\nfunction blockUrlPrefix(block: { lines: string[] }): string | undefined {\n for (const line of block.lines) {\n const m = line.match(/^\\[credential \"(.+)\"\\]$/);\n if (m) return m[1];\n }\n return undefined;\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Write a credential-helper block for `mountId` into the managed-gitconfig\n * file, and (re)write the matching line in the git-credentials store.\n * Idempotent: re-running with the same arguments is a no-op aside from\n * refreshing the on-disk token. Detects collisions where another mount\n * already owns the same `urlPrefix` and throws\n * {@link ManagedGitconfigCollisionError}.\n *\n * Files are created with mode `0640` — owner (skaile-runner) read+write,\n * group (skaile) read-only. See {@link writeCredentialLines} for the\n * UID-separation rationale.\n */\nexport function writeMountBlock(opts: WriteMountBlockOptions): void {\n const { mountId, urlPrefix, token, gitconfigPath, credentialsPath, helperScriptPath } = opts;\n\n // ── Gitconfig: insert/replace the tagged block ──────────────────────────\n const text = readFileOrEmpty(gitconfigPath);\n const blocks = parseBlocks(text);\n\n // Collision check: any *other* mount block declaring the same urlPrefix?\n for (const b of blocks) {\n if (b.mountId === \"\" || b.mountId === mountId) continue;\n const otherPrefix = blockUrlPrefix(b);\n if (otherPrefix === urlPrefix) {\n throw new ManagedGitconfigCollisionError(urlPrefix, b.mountId, mountId);\n }\n }\n\n const newBlock = {\n mountId,\n lines: buildBlock(mountId, urlPrefix, credentialsPath, helperScriptPath),\n };\n const existing = findExistingBlock(blocks, mountId);\n if (existing) {\n existing.lines = newBlock.lines;\n } else {\n blocks.push(newBlock);\n }\n atomicWrite(gitconfigPath, renderBlocks(blocks), 0o640);\n\n // ── Credentials store: insert/replace the tagged line ───────────────────\n const lines = readCredentialLines(credentialsPath);\n const tag = credentialTag(mountId);\n const filtered = lines.filter((l) => !l.endsWith(tag));\n filtered.push(buildCredentialLine(urlPrefix, token, mountId));\n writeCredentialLines(credentialsPath, filtered);\n}\n\n/**\n * Remove the block tagged for `mountId` from the managed-gitconfig file and\n * the matching credential line. Best-effort: missing files / missing block\n * are not errors.\n */\nexport function removeMountBlock(opts: RemoveMountBlockOptions): void {\n const { mountId, gitconfigPath, credentialsPath } = opts;\n\n // ── Gitconfig ──\n const text = readFileOrEmpty(gitconfigPath);\n if (text.length > 0) {\n const blocks = parseBlocks(text).filter((b) => b.mountId !== mountId);\n atomicWrite(gitconfigPath, renderBlocks(blocks), 0o640);\n }\n\n // ── Credentials ──\n const lines = readCredentialLines(credentialsPath);\n const tag = credentialTag(mountId);\n const filtered = lines.filter((l) => !l.endsWith(tag));\n if (filtered.length !== lines.length) {\n writeCredentialLines(credentialsPath, filtered);\n }\n}\n\n/**\n * Write (or refresh) the credential-helper script at `scriptPath` with mode\n * `0755` so git can execute it via `helper = !sh <scriptPath>`. Idempotent —\n * re-rendering with identical opts produces the same script body, so re-runs\n * are safe. Atomic rename so a concurrent git invocation never sees a\n * half-written file.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md` Step 9a.\n */\nexport function writeHelperScript(scriptPath: string, body: string): void {\n // Mode 0755: owner rwx, group/other rx — git executes the script as the\n // agent uid which is in the skaile group; rx for group is the safer choice\n // than rx for other.\n atomicWrite(scriptPath, body, 0o755);\n}\n\n/**\n * Replace just the credential line for `mountId` atomically — refresh path.\n * The gitconfig block (which only points at the helper) does not need to\n * change; the helper re-reads the credentials file on every git network op.\n *\n * Throws if no existing line is found for `mountId` — the caller is\n * expected to have written the initial block via {@link writeMountBlock}.\n */\nexport function atomicReplaceCredential(opts: AtomicReplaceCredentialOptions): void {\n const { mountId, urlPrefix, token, credentialsPath } = opts;\n const lines = readCredentialLines(credentialsPath);\n const tag = credentialTag(mountId);\n const without = lines.filter((l) => !l.endsWith(tag));\n if (without.length === lines.length) {\n throw new Error(\n `atomicReplaceCredential: no existing credential line for mount '${mountId}' in ${credentialsPath}`,\n );\n }\n without.push(buildCredentialLine(urlPrefix, token, mountId));\n writeCredentialLines(credentialsPath, without);\n}\n","/**\n * 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 * Shared helpers for filesystem-face connectors that delegate to a host-side\n * fleet supervisor (rclone for sharepoint/webdav/googledrive, git for git).\n *\n * When `SKAILE_FLEET_MANAGED_MOUNTS` lists a connector's id, the host has\n * already prepared the underlying mount (rclone FUSE mountpoint, or a git\n * worktree bind) and exposed it at the driver's target dir. The driver\n * short-circuits its own connect path after verifying the bind is live.\n */\n\nimport { readdir, stat } from \"node:fs/promises\";\n\n/**\n * Return `true` when `connectorId` appears in the comma-separated\n * `SKAILE_FLEET_MANAGED_MOUNTS` env var, indicating the host fleet owns this\n * mount.\n */\nexport function isFleetManaged(connectorId: string): boolean {\n const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? \"\";\n if (raw.length === 0) return false;\n return raw\n .split(\",\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .includes(connectorId);\n}\n\n/**\n * Sanity-check the host bind mount before declaring success. The host\n * process should have the FUSE mount live before the container starts, so\n * we just verify the directory exists and is readable. Polls briefly to\n * absorb any startup race between container start and the kernel\n * publishing the mountpoint inside the container.\n *\n * `readdir` surfaces FUSE-side errors that `stat` cannot (e.g. transport\n * endpoint not connected if the host process died after bind).\n */\nexport async function ensureFleetMounted(\n dir: string,\n log: { info: (msg: string, data?: object) => void },\n options?: { timeoutMs?: number; pollIntervalMs?: number },\n): Promise<void> {\n const timeoutMs = options?.timeoutMs ?? 3_000;\n const pollIntervalMs = options?.pollIntervalMs ?? 100;\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown = null;\n while (Date.now() < deadline) {\n try {\n const st = await stat(dir);\n if (!st.isDirectory()) {\n throw new Error(`fleet mountpoint ${dir} is not a directory`);\n }\n await readdir(dir);\n log.info(\"fleet bind mount verified\", { dir });\n return;\n } catch (err) {\n lastErr = err;\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n }\n throw new Error(\n `fleet mount ${dir} not ready after ${timeoutMs}ms — check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${\n lastErr instanceof Error ? lastErr.message : String(lastErr)\n }`,\n );\n}\n","/**\n * Shared filesystem watcher factory for mountable adapters.\n *\n * Uses chokidar for cross-platform, debounced file watching.\n *\n * Automatically reads .gitignore from the watched directory and merges\n * those patterns into chokidar's ignore list. This prevents scanning\n * large generated directories (node_modules, dist, .next, etc.) that\n * most projects already declare as ignored.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\n// Static import so bun --compile bundles chokidar into the binary. A dynamic\n// `await import(\"chokidar\")` is not seen by the compiler's static analyzer\n// and fails at runtime inside the /$bunfs/ virtual filesystem.\nimport chokidar from \"chokidar\";\nimport type { ConnectorChangeEvent } from \"./connector-types.js\";\nimport type { WatchHandle, WatchOptions } from \"./shared-types.js\";\n\n/**\n * Convert a glob pattern to a matcher function.\n *\n * Chokidar 5 changed string matchers to exact equality (`===`) instead of\n * glob matching. We convert our patterns to functions so chokidar can still\n * filter correctly.\n */\nfunction globToMatcher(pattern: string): (path: string) => boolean {\n // Simple segment-name patterns: **/NAME/** or **/NAME\n // Match any path that contains /NAME/ or ends with /NAME\n const segmentMatch = pattern.match(/^\\*\\*\\/([^*/?]+)\\/\\*\\*$/);\n if (segmentMatch) {\n const name = segmentMatch[1];\n return (p: string) => p.includes(`/${name}/`) || p.endsWith(`/${name}`) || p === name;\n }\n\n // Dot-prefixed segment: **/.NAME or **/.NAME/**\n const dotSegment = pattern.match(/^\\*\\*\\/(\\.[\\w#]+)(?:\\/\\*\\*)?$/);\n if (dotSegment) {\n const name = dotSegment[1];\n return (p: string) => p.includes(`/${name}/`) || p.endsWith(`/${name}`) || p === name;\n }\n\n // Extension wildcard: **/*.EXT.* or **/*.EXT\n const extMatch = pattern.match(/^\\*\\*\\/\\*(\\.\\w+(?:\\.\\*)?)/);\n if (extMatch) {\n const suffix = extMatch[1];\n if (suffix.endsWith(\".*\")) {\n // e.g. **/*.tmp.* -> match any file with .tmp. in it\n const base = suffix.slice(0, -2);\n return (p: string) => p.includes(base);\n }\n return (p: string) => p.endsWith(suffix);\n }\n\n // Suffix wildcard: **/*SUFFIX (e.g. **/*~)\n const suffixMatch = pattern.match(/^\\*\\*\\/\\*(.+)$/);\n if (suffixMatch) {\n const sfx = suffixMatch[1];\n return (p: string) => p.endsWith(sfx);\n }\n\n // Fallback: convert simple globs to regex\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n const re = new RegExp(`^${escaped}$`);\n return (p: string) => re.test(p);\n}\n\nconst DEFAULT_IGNORED: Array<string | ((path: string) => boolean)> = [\n (p: string) => p.includes(\"/.git/\") || p.endsWith(\"/.git\"),\n (p: string) => p.includes(\"/node_modules/\") || p.endsWith(\"/node_modules\"),\n (p: string) => p.includes(\"/.connectors/\") || p.endsWith(\"/.connectors\"),\n // Atomic-write tempfiles (Bun.write creates `<name>.tmp.<pid>.<ts>` then renames).\n // These vanish between readdir and fs.watch, causing EINVAL that crashes the process.\n (p: string) => /\\.tmp\\.\\d/.test(p),\n // Editor swap/backup files that also race with save operations.\n (p: string) => p.endsWith(\".swp\"),\n (p: string) => p.endsWith(\".swx\"),\n (p: string) => p.includes(\"/.#\"),\n (p: string) => p.endsWith(\"~\"),\n];\nconst DEFAULT_DEBOUNCE_MS = 150;\n\n/**\n * Parse a .gitignore file into glob patterns suitable for chokidar's `ignored` option.\n * Handles comments, blank lines, directory patterns, and root-relative patterns.\n * Negation patterns (!) are skipped - chokidar cannot un-ignore.\n */\nfunction parseGitignore(rootDir: string): Array<(path: string) => boolean> {\n const gitignorePath = join(rootDir, \".gitignore\");\n if (!existsSync(gitignorePath)) return [];\n\n try {\n const content = readFileSync(gitignorePath, \"utf-8\");\n const matchers: Array<(path: string) => boolean> = [];\n\n for (const raw of content.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\") || line.startsWith(\"!\")) continue;\n\n let pattern = line;\n\n // Strip leading / (root-relative -> convert to rootDir-relative)\n if (pattern.startsWith(\"/\")) {\n pattern = pattern.slice(1);\n } else if (!pattern.includes(\"/\")) {\n // Bare name like \"node_modules\" or \"*.log\" -> match anywhere\n pattern = `**/${pattern}`;\n }\n\n // Directory pattern (trailing /) -> ensure it matches contents too\n if (pattern.endsWith(\"/\")) {\n matchers.push(globToMatcher(`${pattern}**`));\n } else {\n matchers.push(globToMatcher(pattern));\n // Also match as directory (e.g. \"dist\" should match \"dist/\" and \"dist/**\")\n if (!pattern.includes(\"*\") && !pattern.includes(\".\")) {\n matchers.push(globToMatcher(`${pattern}/**`));\n }\n }\n }\n\n return matchers;\n } catch {\n return [];\n }\n}\n\ntype ChokidarAction = \"create\" | \"edit\" | \"delete\";\n\nconst CHOKIDAR_EVENT_MAP: Record<string, ChokidarAction> = {\n add: \"create\",\n change: \"edit\",\n unlink: \"delete\",\n addDir: \"create\",\n unlinkDir: \"delete\",\n};\n\n/**\n * Create a cross-platform filesystem watcher on `rootDir` using chokidar.\n * Auto-reads `.gitignore` from `rootDir` and merges those patterns into the ignore list.\n * @param rootDir - Absolute path to the directory to watch.\n * @param callback - Called with each `ConnectorChangeEvent` (create / edit / delete).\n * @param options - Debounce interval and additional ignore patterns.\n * @returns A `WatchHandle` — call `.close()` to stop watching.\n * @docLink packages/connectors/api-reference#create-fs-watcher\n */\nexport async function createFsWatcher(\n rootDir: string,\n callback: (event: ConnectorChangeEvent) => void,\n options?: WatchOptions,\n): Promise<WatchHandle> {\n const log = createLogger({ kind: \"connector\", subkind: \"watcher\", instance: rootDir });\n const gitignorePatterns = parseGitignore(rootDir);\n // Convert any remaining string patterns from options to matcher functions\n // (chokidar 5 treats strings as exact equality, not globs)\n const optionsIgnored = (options?.ignored ?? []).map((entry) =>\n typeof entry === \"string\" ? globToMatcher(entry) : entry,\n );\n const ignored = [...DEFAULT_IGNORED, ...gitignorePatterns, ...optionsIgnored];\n const debounceMs = options?.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n\n const watcher = chokidar.watch(rootDir, {\n ignoreInitial: true,\n ignored,\n awaitWriteFinish: { stabilityThreshold: debounceMs, pollInterval: 50 },\n usePolling: false,\n });\n\n // Swallow transient watch errors (EINVAL/ENOENT when a file vanishes between\n // readdir and fs.watch). Without this handler, chokidar rethrows and the\n // agent process dies.\n watcher.on(\"error\", (err) => {\n const message = err instanceof Error ? err.message : String(err);\n log.warn(\"watcher error (non-fatal)\", { message });\n });\n\n for (const [chokidarEvent, action] of Object.entries(CHOKIDAR_EVENT_MAP)) {\n (watcher as { on(event: string, fn: (fullPath: string) => void): void }).on(\n chokidarEvent,\n (fullPath: string) => {\n const rel = relative(rootDir, fullPath);\n if (!rel || rel.startsWith(\"..\")) return;\n // Normalize to forward slashes\n const normalizedPath = rel.split(\"\\\\\").join(\"/\");\n callback({ path: normalizedPath, action, source: \"filesystem\" });\n },\n );\n }\n\n return {\n close: () => watcher.close(),\n };\n}\n","/**\n * Shared git worktree helper for service connectors.\n *\n * Provides create/cleanup with a cross-adapter ownership registry\n * that prevents one adapter from removing a worktree another is using.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Result of a successful `createWorktree` call. The `cleanup` function removes the\n * worktree when no other owners are registered for the same path.\n * @docLink packages/connectors/api-reference#worktree-result\n */\nexport interface WorktreeResult {\n /** Absolute path to the worktree directory. */\n path: string;\n /** Resolved full SHA of the ref. */\n ref: string;\n /** Branch name if ref was a branch. */\n branch?: string;\n /** Remove the worktree. Fails if other owners exist in registry. */\n cleanup: () => Promise<void>;\n}\n\n/**\n * Summary entry returned by `listWorktrees`.\n * @docLink packages/connectors/api-reference#worktree-info\n */\nexport interface WorktreeInfo {\n /** Absolute path to the worktree. */\n path: string;\n /** HEAD commit SHA. */\n head: string;\n /** Branch reference, if a named branch is checked out. */\n branch?: string;\n}\n\n// ── Registry ────────────────────────────────────────────────────────────────\n\nclass WorktreeRegistryImpl {\n private readonly entries = new Map<string, Set<string>>();\n\n register(path: string, owner: string): void {\n let owners = this.entries.get(path);\n if (!owners) {\n owners = new Set();\n this.entries.set(path, owners);\n }\n owners.add(owner);\n }\n\n deregister(path: string, owner: string): void {\n const owners = this.entries.get(path);\n if (!owners) return;\n owners.delete(owner);\n if (owners.size === 0) this.entries.delete(path);\n }\n\n isInUse(path: string): boolean {\n return (this.entries.get(path)?.size ?? 0) > 0;\n }\n\n owners(path: string): string[] {\n return [...(this.entries.get(path) ?? [])];\n }\n}\n\n/**\n * Module-level singleton registry shared across all service-connector adapters in the same process.\n * Prevents one adapter from removing a worktree that another adapter is still using.\n * @docLink packages/connectors/api-reference#worktree-registry\n */\nexport const worktreeRegistry = new WorktreeRegistryImpl();\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction git(args: string, cwd: string): string {\n return execSync(`git ${args}`, { cwd, encoding: \"utf-8\" }).trim();\n}\n\nfunction resolveRef(repoRoot: string, ref: string): string {\n return git(`rev-parse --verify ${ref}`, repoRoot);\n}\n\n/**\n * Walk up from `fromDir` to find the git repository root.\n * @param fromDir - Any directory inside a git repository.\n * @returns Absolute path to the repository root.\n * @throws {Error} when no git repository is found.\n * @docLink packages/connectors/api-reference#find-git-root\n */\nexport function findGitRoot(fromDir: string): string {\n return git(\"rev-parse --show-toplevel\", fromDir);\n}\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Create a git worktree for `ref` under `baseDir` and register it with `worktreeRegistry`.\n * The returned `WorktreeResult.cleanup()` removes the worktree when no other owners remain.\n * @param opts - Repo root, git ref, base directory, optional label, and owner ID.\n * @returns Path, resolved SHA, branch name, and `cleanup()` function.\n * @throws {Error} if the ref cannot be resolved.\n * @docLink packages/connectors/api-reference#create-worktree\n */\nexport async function createWorktree(opts: {\n repoRoot: string;\n ref: string;\n baseDir: string;\n label?: string;\n owner: string;\n}): Promise<WorktreeResult> {\n const sha = resolveRef(opts.repoRoot, opts.ref);\n const label = opts.label ?? sha.slice(0, 8);\n const wtPath = resolve(opts.baseDir, label);\n\n if (!existsSync(opts.baseDir)) {\n mkdirSync(opts.baseDir, { recursive: true });\n }\n\n git(`worktree add \"${wtPath}\" ${sha} --detach`, opts.repoRoot);\n worktreeRegistry.register(wtPath, opts.owner);\n\n let branch: string | undefined;\n try {\n const refName = git(`rev-parse --abbrev-ref ${opts.ref}`, opts.repoRoot);\n if (refName !== \"HEAD\" && refName !== sha) branch = refName;\n } catch {\n // Not a branch\n }\n\n return {\n path: wtPath,\n ref: sha,\n branch,\n cleanup: async () => {\n worktreeRegistry.deregister(wtPath, opts.owner);\n\n if (worktreeRegistry.isInUse(wtPath)) {\n const remaining = worktreeRegistry.owners(wtPath);\n throw new Error(`worktree in use by: ${remaining.join(\", \")}`);\n }\n\n try {\n git(`worktree remove \"${wtPath}\" --force`, opts.repoRoot);\n } catch {\n // May already be gone\n }\n git(\"worktree prune\", opts.repoRoot);\n },\n };\n}\n\n/**\n * List all git worktrees for a repository.\n * @param repoRoot - Absolute path to the git repository root.\n * @returns Array of `WorktreeInfo` objects parsed from `git worktree list --porcelain`.\n * @docLink packages/connectors/api-reference#list-worktrees\n */\nexport async function listWorktrees(repoRoot: string): Promise<WorktreeInfo[]> {\n const raw = git(\"worktree list --porcelain\", repoRoot);\n const trees: WorktreeInfo[] = [];\n let current: Partial<WorktreeInfo> = {};\n\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) trees.push(current as WorktreeInfo);\n current = { path: line.slice(\"worktree \".length) };\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(\"HEAD \".length);\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.slice(\"branch \".length);\n }\n }\n if (current.path) trees.push(current as WorktreeInfo);\n\n return trees;\n}\n","/**\n * FlowAdapter — live flow execution state exposed as a connector resource.\n *\n * Holds the canonical `FlowExecution` snapshot for a single run and bridges\n * three driving parties:\n *\n * - The **agent** drives nodes to completion by calling tools (`start_node`,\n * `request_approval`, `request_input`, `complete_node`, `skip_node`,\n * `fail_node`, plus read-only `get_state` / `get_available` / `build_handoff`).\n * - The **host** (runner → serve.ts → platform) applies out-of-turn\n * mutations (`applyApproval`, `applyInput`, `retryNode`,\n * `setAutonomousMode`, `cancel`, `hydrate`) in response to user actions.\n * - The **runner's FlowOrchestrator** subscribes to `onChange` to forward\n * `state_changed` events and kick new turns after host-driven mutations.\n *\n * Every state mutation runs through a single `mutate()` helper that clones\n * the current snapshot, applies the change, recomputes derived fields via\n * `computeFlowStateFromSnapshots`, and fires the onChange callback with\n * the full FlowExecution shape. Consumers downstream (platform gateway,\n * frontend hook) see latest-wins snapshots — F4 in the decision log.\n *\n * See `docs/flow-execution.md` for the universal model.\n */\n\nimport {\n computeFlowStateFromSnapshots,\n type FlowDefinition,\n type FlowNode,\n isBlocking,\n} from \"./engine/index.js\";\nimport type {\n Approval,\n ArtifactRef,\n FlowExecution,\n FlowExecutionStatus,\n InputRequest,\n InputSchema,\n NodeError,\n NodeExecution,\n NodeExecutionSnapshot,\n NodeOutput,\n NodeStatus,\n} from \"@skaile/workspaces/types\";\nimport {\n 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 { computeStimulus } from \"./stimulus-driver.js\";\nimport { renderStimulusPrompt } from \"./prompt-fragments.js\";\n\n// ── Stimulus bus surface ─────────────────────────────────────────────────────\n\n/**\n * Minimal structural shape of the runner's `SessionStimulusBus`. Declared\n * locally so the adapter doesn't pull in a runtime dep on\n * `@skaile/workspaces/runner` (which would create a circular workspace import).\n *\n * The runner's `SessionStimulusBus` from `runner/src/session-stimulus.ts`\n * satisfies this structurally; mocks in tests can implement it directly.\n *\n * @docLink packages/base-assets/flow#session-stimulus-bus\n */\nexport interface FlowAdapterStimulusBus {\n signal(\n connectorId: string,\n sig: { promptFragment: string; meta?: Record<string, unknown> },\n ): Promise<void>;\n}\n\n// ── State ───────────────────────────────────────────────────────────────────\n\n/**\n * Internal state stored in the `ConnectorHandle` for the flow adapter.\n * @docLink packages/connectors/concepts#flow-adapter-state\n */\nexport interface FlowAdapterState {\n /** The flow graph definition this adapter is executing. */\n flowDef: FlowDefinition;\n /** Current execution snapshot (authoritative; mutated in place by `mutate()`). */\n execution: FlowExecution;\n /** Callback fired after every state mutation. Set by `FlowOrchestrator` via `onStateChange()`. */\n onChange?: (state: FlowExecution) => void;\n /**\n * Optional `SessionStimulusBus` reference. When provided AND\n * `useBusForStimulus` is true, the adapter computes a `TurnStimulus`\n * after every mutation and fires `bus.signal()` to wake the agent.\n * Phase 3 wiring (2026-05-08): the flag defaults to false everywhere so\n * the legacy orchestrator path remains the only turn driver until Phase 4.\n */\n stimulusBus?: FlowAdapterStimulusBus;\n /**\n * Connector ID used as the `stimulusBus.signal()` queue key. Defaults to\n * the adapter handle's declaration ID (e.g. `flow:<runId>` in serve mode,\n * `flow` in CLI mode).\n */\n connectorId?: string;\n /** Phase 3 feature flag — see {@link FlowAdapterConnectOptions.useBusForStimulus}. */\n useBusForStimulus?: boolean;\n /**\n * Last execution snapshot the adapter signaled to the bus. Used to compute\n * a structural diff in `computeStimulus`, so back-to-back mutations that\n * leave the snapshot unchanged don't fire spurious turn kicks.\n */\n lastSignaledExecution?: FlowExecution;\n}\n\n/**\n * Options the runner passes via `declaration.options` when connecting the `FlowAdapter`.\n * @docLink packages/connectors/concepts#flow-adapter-connect-options\n */\nexport interface FlowAdapterConnectOptions {\n flow: FlowDefinition;\n /**\n * Either a fresh start seed (runId + startedBy) or a full rehydration\n * state. If `execution` is provided, it replaces the default empty\n * state — used on session wake when the host sends the persisted\n * snapshot via `configure.activeFlows`.\n */\n execution?: FlowExecution;\n seed?: {\n runId: string;\n startedBy: string;\n autonomousMode?: boolean;\n };\n /**\n * Optional `SessionStimulusBus` to which this adapter should fire\n * `signal()` calls on every mutation when `useBusForStimulus` is true.\n * Threaded through by the runner's session-construction code (`runFlow`\n * / `serve.ts`). Phase 3 of the flow-connector extraction (2026-05-08)\n * builds the path; Phase 4 flips the flag globally.\n */\n stimulusBus?: FlowAdapterStimulusBus;\n /**\n * Phase 3 feature flag. When `true` AND `stimulusBus` is provided, the\n * adapter computes a turn-kicking stimulus after every mutation and\n * calls `bus.signal()` (fire-and-forget). When `false` (the default),\n * only the legacy `onChange` callback fires — the runner's existing\n * `FlowOrchestrator.onStateChange` subscription remains the only turn\n * driver. Default: `false`.\n */\n useBusForStimulus?: boolean;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nconst now = () => new Date().toISOString();\n\n/** Produce an empty NodeExecution for a node id. */\nfunction emptyNode(nodeId: string): NodeExecution {\n return {\n id: nodeId,\n status: \"not_started\",\n approvalHistory: [],\n inputHistory: [],\n errorHistory: [],\n };\n}\n\n/**\n * Build the starting FlowExecution snapshot for a flow definition — every\n * skill node begins as `not_started`; engine recompute promotes them.\n */\nfunction buildInitialExecution(\n flowDef: FlowDefinition,\n seed: { runId: string; startedBy: string; autonomousMode?: boolean },\n): FlowExecution {\n const nodes: Record<string, NodeExecution> = {};\n for (const n of flowDef.nodes) {\n if (n.type === \"skill\") {\n nodes[n.id] = emptyNode(n.id);\n }\n }\n return {\n runId: seed.runId,\n flowId: flowDef.id,\n flowVersion: flowDef.version,\n status: \"running\",\n startedAt: now(),\n startedBy: seed.startedBy,\n autonomousMode: seed.autonomousMode ?? false,\n nodes,\n focus: [],\n done: false,\n };\n}\n\nfunction toSnapshot(exec: NodeExecution): NodeExecutionSnapshot {\n return {\n status: exec.status,\n approval: exec.approval,\n input: exec.input,\n output: exec.output,\n error: exec.error,\n };\n}\n\nfunction snapshotMap(execution: FlowExecution): Map<string, NodeExecutionSnapshot> {\n const map = new Map<string, NodeExecutionSnapshot>();\n for (const [id, exec] of Object.entries(execution.nodes)) {\n map.set(id, toSnapshot(exec));\n }\n return map;\n}\n\n/**\n * Fail-fast helper. Throws a string Error so the SDK surfaces the reason\n * back to the agent tool-call log.\n */\nfunction assertLegal(cond: unknown, message: string): asserts cond {\n if (!cond) throw new Error(`FlowAdapter: ${message}`);\n}\n\nfunction findNode(flowDef: FlowDefinition, nodeId: string): FlowNode {\n const node = flowDef.nodes.find((n) => n.id === nodeId);\n if (!node) throw new Error(`FlowAdapter: unknown nodeId ${nodeId}`);\n return node;\n}\n\nfunction isOptional(flowDef: FlowDefinition, nodeId: string): boolean {\n return findNode(flowDef, nodeId).data?.optional === true;\n}\n\n// ── Adapter ─────────────────────────────────────────────────────────────────\n\n/**\n * Connector adapter that holds and drives a live `FlowExecution`. Bridges three parties:\n * the agent (via `executeOp` tools), the host runner (via direct methods like `applyApproval`),\n * and the orchestrator (via `onStateChange`). Every mutation runs through a single `mutate()`\n * pipeline that recomputes derived fields and fires `onChange`.\n * @docLink packages/connectors/concepts#flow-adapter\n */\nexport class FlowAdapter extends AbstractConnector {\n readonly name = \"flow\";\n readonly mountable = false;\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this.read(handle, path),\n list: (handle, path, options) => this.list(handle, path, options),\n search: (handle, query, options) => this.search(handle, query, options),\n describeOperations: (handle) => this.describeOperations(handle),\n executeOp: (handle, operation, args) => this.executeOp(handle, operation, args),\n };\n }\n\n // ── Lifecycle ──\n\n async connect(declaration: ConnectorDeclaration, _ctx: ConnectContext): Promise<ConnectorHandle> {\n const options = (declaration.options ?? {}) as unknown as FlowAdapterConnectOptions;\n const flowDef = options.flow;\n if (!flowDef) throw new Error(\"FlowAdapter requires options.flow (FlowDefinition)\");\n\n const execution =\n options.execution ??\n buildInitialExecution(\n flowDef,\n options.seed ?? { runId: \"local\", startedBy: \"system\", autonomousMode: false },\n );\n\n const state: FlowAdapterState = {\n flowDef,\n execution,\n stimulusBus: options.stimulusBus,\n connectorId: declaration.id,\n useBusForStimulus: options.useBusForStimulus ?? false,\n };\n // Recompute derived fields (focus, done) once so callers see a\n // consistent shape even if no mutation has happened yet.\n state.execution = this.recompute(state);\n return this.makeHandle(declaration, state);\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n handle.status = \"disconnected\";\n }\n\n // ── State change subscription ──\n\n onStateChange(handle: ConnectorHandle, cb: (state: FlowExecution) => void): void {\n this.s(handle).onChange = cb;\n }\n\n /**\n * Replace the current execution snapshot with a host-provided one.\n * Used on container rehydration via the extended `configure` command.\n * Does NOT fire `onChange` — the host already has the state; we don't\n * want to loop it back on startup.\n */\n hydrate(handle: ConnectorHandle, execution: FlowExecution): void {\n const s = this.s(handle);\n s.execution = { ...execution };\n s.execution = this.recompute(s);\n }\n\n // ── Base operations (private — wired into tools face in constructor) ──\n\n private async read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const s = this.s(handle);\n\n if (path === \"\" || path === \"state\") {\n return {\n data: JSON.stringify(s.execution, null, 2),\n contentType: \"application/json\",\n };\n }\n\n if (path.startsWith(\"node/\")) {\n const nodeId = path.slice(5);\n const node = s.flowDef.nodes.find((n) => n.id === nodeId);\n if (!node) return null;\n const exec = s.execution.nodes[nodeId];\n return {\n data: JSON.stringify({ ...node, execution: exec ?? null }, null, 2),\n contentType: \"application/json\",\n };\n }\n\n return null;\n }\n\n private async list(\n handle: ConnectorHandle,\n _path?: string,\n _options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const s = this.s(handle);\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n return nodes.map((n) => ({\n name: n.id,\n path: `node/${n.id}`,\n type: \"key\" as const,\n }));\n }\n\n private async search(\n handle: ConnectorHandle,\n query: string,\n _options?: SearchOptions,\n ): Promise<SearchResult[]> {\n const s = this.s(handle);\n const q = query.toLowerCase();\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n return nodes\n .filter((n) => n.id.toLowerCase().includes(q) || n.status.includes(q))\n .map((n) => ({ path: `node/${n.id}`, snippet: `${n.id} [${n.status}]` }));\n }\n\n // ── Custom operations (agent tool surface) ──\n\n private describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get_available\",\n description: \"Get node IDs that are ready to run (all required predecessors complete).\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"get_state\",\n description: \"Get the full flow execution snapshot — nodes, statuses, approvals, inputs.\",\n accessLevel: \"read\",\n args: [],\n },\n {\n name: \"build_handoff\",\n description:\n \"Build curated context for a node from its completed flow-type predecessors (summaries + artifact refs).\",\n accessLevel: \"read\",\n args: [\n {\n name: \"nodeId\",\n description: \"Target node to build handoff context for\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"validate_node\",\n description: \"Check whether a node is currently runnable.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"nodeId\",\n description: \"Node ID to validate\",\n type: \"string\",\n required: true,\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"start_node\",\n description: \"Mark an available node as running (records startedAt).\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID to start\", type: \"string\", required: true },\n ],\n },\n {\n name: \"request_approval\",\n description:\n \"Request human approval for a running node. Ends your turn — the runner yields until the user approves or rejects.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"summary\",\n description: \"One-paragraph summary of what the user is approving.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"artifacts\",\n description:\n \"JSON array of ArtifactRef objects. Each: { uri, connectorId, kind, lifetime, producedBy }.\",\n type: \"string\",\n required: false,\n },\n ],\n },\n {\n name: \"request_input\",\n description:\n \"Request typed input from the user for a node. Ends your turn. Legal from `available`, `running`, or `awaiting_approval`.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"prompt\",\n description: \"Prompt shown to the user alongside the input widget.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"schema\",\n description:\n \"JSON InputSchema: one of { kind: 'text' }, { kind: 'choice', options: [...] }, { kind: 'form', fields: [...] }, { kind: 'file' }.\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"complete_node\",\n description:\n \"Mark a node as complete with structured output. Requires `awaiting_approval` with an `approved` decision, OR `running` when autonomous mode is on.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID to complete\", type: \"string\", required: true },\n {\n name: \"summary\",\n description: \"2-3 sentence summary of what the node accomplished.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"artifacts\",\n description: \"JSON array of ArtifactRef objects produced by this node.\",\n type: \"string\",\n required: false,\n },\n {\n name: \"concerns\",\n description: \"JSON array of flagged concerns.\",\n type: \"string\",\n required: false,\n },\n ],\n },\n {\n name: \"skip_node\",\n description: \"Skip an optional node. Only valid when the node has `optional: true`.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID to skip\", type: \"string\", required: true },\n ],\n },\n {\n name: \"fail_node\",\n description:\n \"Mark a node as failed. `recoverable: true` transitions back to `available` so the runner can retry; `recoverable: false` marks the node and flow as failed.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"message\",\n description: \"Human-readable failure reason.\",\n type: \"string\",\n required: true,\n },\n {\n name: \"recoverable\",\n description: \"true|false — whether the failure is retryable.\",\n type: \"string\",\n required: false,\n },\n ],\n },\n );\n }\n\n // Host-facing operations — invoked by the runner via `connector_mutate`\n // (Phase 2 of flow-connector extraction). These are NOT exposed to the\n // agent's tool surface; they're the same instance methods the typed flow\n // commands call today, dispatched generically through `executeOp`.\n //\n // Visibility: include them only on read-write handles, matching the\n // existing host-vs-agent boundary.\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"applyApproval\",\n description: \"Host: record an approval decision on a node awaiting approval.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"decision\",\n description: \"approved | rejected\",\n type: \"string\",\n required: true,\n },\n {\n name: \"feedback\",\n description: \"Optional feedback shown alongside the decision.\",\n type: \"string\",\n required: false,\n },\n {\n name: \"decidedBy\",\n description: \"User id of the decider.\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"applyInput\",\n description: \"Host: provide user input for a node awaiting input.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"response\",\n description: \"Input response (shape matches the InputSchema the agent requested).\",\n type: \"json\",\n required: true,\n },\n {\n name: \"providedBy\",\n description: \"User id of the input provider.\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"cancel\",\n description: \"Host: cancel the active flow run.\",\n accessLevel: \"write\",\n args: [],\n },\n {\n name: \"setAutonomousMode\",\n description: \"Host: toggle autonomous mode on the running flow.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"enabled\",\n description: \"true|false — whether autonomous mode is on.\",\n type: \"boolean\",\n required: true,\n },\n ],\n },\n {\n name: \"retryNode\",\n description: \"Host: transition a recoverable failed node back to available.\",\n accessLevel: \"write\",\n args: [\n { name: \"nodeId\", description: \"Node ID\", type: \"string\", required: true },\n {\n name: \"requestedBy\",\n description: \"User id of the retry requester (informational).\",\n type: \"string\",\n required: true,\n },\n ],\n },\n {\n name: \"hydrate\",\n description: \"Host: replace the current execution snapshot with a host-provided one.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"state\",\n description: \"FlowExecution snapshot to hydrate into the adapter.\",\n type: \"json\",\n required: true,\n },\n ],\n },\n {\n name: \"start\",\n description:\n \"Host: seed a fresh flow execution. Replaces the adapter's current flow + execution state in-place.\",\n accessLevel: \"write\",\n args: [\n {\n name: \"flow\",\n description: \"FlowDefinition to execute.\",\n type: \"json\",\n required: true,\n },\n {\n name: \"seed\",\n description:\n \"Seed object: { runId, startedBy, autonomousMode? } used to construct the initial FlowExecution.\",\n type: \"json\",\n required: true,\n },\n ],\n },\n );\n }\n\n return ops;\n }\n\n async executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const s = this.s(handle);\n\n switch (operation) {\n case \"get_available\": {\n const nodes: NodeExecution[] = Object.values(s.execution.nodes);\n const available = nodes.filter((n) => n.status === \"available\").map((n) => n.id);\n return JSON.stringify(available);\n }\n\n case \"get_state\": {\n return JSON.stringify(s.execution);\n }\n\n case \"build_handoff\": {\n const nodeId = String(args.nodeId ?? \"\");\n return this.buildHandoff(s, nodeId);\n }\n\n case \"validate_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n const node = s.execution.nodes[nodeId];\n if (!node) return JSON.stringify({ valid: false, reason: \"Node not found\" });\n const predsMet = flowPredecessors(s.flowDef, nodeId).every((pid) => {\n const predStatus = s.execution.nodes[pid]?.status ?? \"not_started\";\n return predStatus === \"complete\" || predStatus === \"skipped\";\n });\n return JSON.stringify({\n valid: node.status === \"available\",\n status: node.status,\n predecessorsReady: predsMet,\n });\n }\n\n case \"start_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n return this.doStartNode(handle, nodeId);\n }\n\n case \"request_approval\": {\n const nodeId = String(args.nodeId ?? \"\");\n const summary = String(args.summary ?? \"\");\n const artifacts = safeParseArtifacts(args.artifacts);\n return this.doRequestApproval(handle, nodeId, summary, artifacts);\n }\n\n case \"request_input\": {\n const nodeId = String(args.nodeId ?? \"\");\n const prompt = String(args.prompt ?? \"\");\n const schema = safeParseInputSchema(args.schema);\n return this.doRequestInput(handle, nodeId, prompt, schema);\n }\n\n case \"complete_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n const output: NodeOutput = {\n summary: String(args.summary ?? \"Completed\"),\n artifacts: safeParseArtifacts(args.artifacts),\n concerns: safeParseStringArray(args.concerns),\n };\n return this.doCompleteNode(handle, nodeId, output);\n }\n\n case \"skip_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n return this.doSkipNode(handle, nodeId);\n }\n\n case \"fail_node\": {\n const nodeId = String(args.nodeId ?? \"\");\n const message = String(args.message ?? \"failed\");\n const recoverable =\n args.recoverable === true || args.recoverable === \"true\" || args.recoverable === \"yes\";\n return this.doFailNode(handle, nodeId, message, recoverable);\n }\n\n // ── Host-facing operations (Phase 2 of flow-connector extraction) ──\n // These dispatch to the same instance methods the typed flow commands\n // call today. JSON-stringify the resulting FlowExecution (or `\"\"` for\n // void returns) so the wire surface is uniform across ops.\n\n case \"applyApproval\": {\n const nodeId = String(args.nodeId ?? \"\");\n const decision = args.decision === \"rejected\" ? \"rejected\" : \"approved\";\n const feedback =\n typeof args.feedback === \"string\" && args.feedback.length > 0 ? args.feedback : undefined;\n const decidedBy = String(args.decidedBy ?? \"\");\n this.applyApproval(handle, nodeId, decision, feedback, decidedBy);\n return JSON.stringify(s.execution);\n }\n\n case \"applyInput\": {\n const nodeId = String(args.nodeId ?? \"\");\n const response = args.response;\n const providedBy = String(args.providedBy ?? \"\");\n this.applyInput(handle, nodeId, response, providedBy);\n return JSON.stringify(s.execution);\n }\n\n case \"cancel\": {\n this.cancel(handle);\n return JSON.stringify(s.execution);\n }\n\n case \"setAutonomousMode\": {\n const enabled = args.enabled === true || args.enabled === \"true\";\n this.setAutonomousMode(handle, enabled);\n return JSON.stringify(s.execution);\n }\n\n case \"retryNode\": {\n const nodeId = String(args.nodeId ?? \"\");\n // `requestedBy` is informational only — the adapter doesn't record it\n // (consistent with how the typed `retry_flow_node` handler behaves\n // today; the field is logged at the runner, not in the snapshot).\n void String(args.requestedBy ?? \"\");\n this.retryNode(handle, nodeId);\n return JSON.stringify(s.execution);\n }\n\n case \"hydrate\": {\n const state = args.state as FlowExecution | undefined;\n if (!state || typeof state !== \"object\") {\n throw new Error(\"FlowAdapter: hydrate requires an args.state FlowExecution snapshot\");\n }\n this.hydrate(handle, state);\n return JSON.stringify(s.execution);\n }\n\n case \"start\": {\n const flow = args.flow as FlowDefinition | undefined;\n if (!flow || typeof flow !== \"object\") {\n throw new Error(\"FlowAdapter: start requires args.flow (FlowDefinition)\");\n }\n const seed = (args.seed ?? {}) as {\n runId?: string;\n startedBy?: string;\n autonomousMode?: boolean;\n };\n if (!seed.runId || !seed.startedBy) {\n throw new Error(\"FlowAdapter: start requires args.seed.runId + args.seed.startedBy\");\n }\n // Seed a fresh execution in-place. Same flow used by `connect()` —\n // we reuse `buildInitialExecution` + `recompute` so the adapter\n // produces an identical initial FlowExecution to a fresh connect.\n s.flowDef = flow;\n s.execution = buildInitialExecution(flow, {\n runId: seed.runId,\n startedBy: seed.startedBy,\n autonomousMode: seed.autonomousMode ?? false,\n });\n s.execution = this.recompute(s);\n if (s.onChange) s.onChange(s.execution);\n return JSON.stringify(s.execution);\n }\n\n default:\n throw new Error(`FlowAdapter: Unknown operation: ${operation}`);\n }\n }\n\n // ── Agent-side mutations (tool calls) ─────────────────────────────────────\n\n private doStartNode(handle: ConnectorHandle, nodeId: string): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(node.status === \"available\", `cannot start ${nodeId}: status is ${node.status}`);\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"running\",\n startedAt: now(),\n };\n return JSON.stringify({ ok: true, status: \"running\" });\n });\n }\n\n private doRequestApproval(\n handle: ConnectorHandle,\n nodeId: string,\n summary: string,\n artifacts: ArtifactRef[],\n ): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(\n node.status === \"running\",\n `request_approval requires running, got ${node.status}`,\n );\n const approval: Approval = { requestedAt: now(), summary };\n const history = [...node.approvalHistory, approval];\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"awaiting_approval\",\n approval,\n approvalHistory: history,\n // Stash output so the UI can render the approval card with artifacts\n // before the node reaches `complete`.\n output: { summary, artifacts },\n };\n return JSON.stringify({ ok: true, status: \"awaiting_approval\" });\n });\n }\n\n private doRequestInput(\n handle: ConnectorHandle,\n nodeId: string,\n prompt: string,\n schema: InputSchema,\n ): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(\n node.status === \"available\" ||\n node.status === \"running\" ||\n node.status === \"awaiting_approval\",\n `request_input not legal from ${node.status}`,\n );\n const input: InputRequest = { requestedAt: now(), prompt, schema };\n s.execution.nodes[nodeId] = {\n ...node,\n // Record the prior status so `applyInput` can restore it.\n // We encode this via `inputHistory` — the latest entry's metadata\n // includes the resume status in a convention-only field.\n status: \"awaiting_input\",\n input,\n inputHistory: [\n ...node.inputHistory,\n { ...input, response: { _resumeStatus: node.status } },\n ],\n };\n return JSON.stringify({ ok: true, status: \"awaiting_input\" });\n });\n }\n\n private doCompleteNode(handle: ConnectorHandle, nodeId: string, output: NodeOutput): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n\n const autonomous = s.execution.autonomousMode;\n const approvedPrior =\n node.status === \"awaiting_approval\" && node.approval?.decision === \"approved\";\n const runningAutonomous = node.status === \"running\" && autonomous;\n\n assertLegal(\n approvedPrior || runningAutonomous,\n `complete_node requires awaiting_approval+approved OR running+autonomous; node is ${node.status}${\n node.approval?.decision ? ` with approval ${node.approval.decision}` : \"\"\n }, autonomous=${autonomous}`,\n );\n\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"complete\",\n completedAt: now(),\n output,\n };\n return JSON.stringify({ ok: true, status: \"complete\" });\n });\n }\n\n private doSkipNode(handle: ConnectorHandle, nodeId: string): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n assertLegal(isOptional(s.flowDef, nodeId), `cannot skip required node ${nodeId}`);\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"skipped\",\n completedAt: now(),\n };\n return JSON.stringify({ ok: true, status: \"skipped\" });\n });\n }\n\n private doFailNode(\n handle: ConnectorHandle,\n nodeId: string,\n message: string,\n recoverable: boolean,\n ): string {\n return this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `node not in execution: ${nodeId}`);\n const error: NodeError = { message, recoverable, at: now() };\n if (recoverable) {\n // Transition back to `available` for the agent to retry within\n // the same turn; keep the failure in history so the next turn\n // sees the prior error context.\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n error,\n errorHistory: [...node.errorHistory, error],\n };\n } else {\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"failed\",\n completedAt: now(),\n error,\n errorHistory: [...node.errorHistory, error],\n };\n }\n return JSON.stringify({ ok: true, status: s.execution.nodes[nodeId].status });\n });\n }\n\n // ── Host-side mutations (not exposed as agent tools) ─────────────────────\n\n /**\n * Record an approval decision on a node currently `awaiting_approval`.\n * `approved` leaves the node in `awaiting_approval` — the agent\n * transitions it to `complete` on the next turn. `rejected` drops the\n * node back to `available` so the agent can retry.\n */\n applyApproval(\n handle: ConnectorHandle,\n nodeId: string,\n decision: \"approved\" | \"rejected\",\n feedback: string | undefined,\n decidedBy: string,\n ): void {\n this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `applyApproval: unknown node ${nodeId}`);\n assertLegal(\n node.status === \"awaiting_approval\",\n `applyApproval: node ${nodeId} is ${node.status}, not awaiting_approval`,\n );\n const base = node.approval ?? { requestedAt: now(), summary: \"\" };\n const approval: Approval = {\n ...base,\n decidedAt: now(),\n decidedBy,\n decision,\n feedback,\n };\n // Replace the tail of history with the decided version so the\n // pointer and the history element stay in sync.\n const history = [...node.approvalHistory];\n if (history.length > 0) history[history.length - 1] = approval;\n else history.push(approval);\n\n if (decision === \"approved\") {\n s.execution.nodes[nodeId] = { ...node, approval, approvalHistory: history };\n } else {\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n approval,\n approvalHistory: history,\n };\n }\n return undefined;\n });\n }\n\n /**\n * Record a user-provided input on a node currently `awaiting_input`.\n * Transitions back to the status the node had before requesting input.\n */\n applyInput(handle: ConnectorHandle, nodeId: string, response: unknown, providedBy: string): void {\n this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `applyInput: unknown node ${nodeId}`);\n assertLegal(\n node.status === \"awaiting_input\",\n `applyInput: node ${nodeId} is ${node.status}, not awaiting_input`,\n );\n\n // Recover the pre-input status from the last history entry's\n // `_resumeStatus` marker (see doRequestInput).\n const last = node.inputHistory[node.inputHistory.length - 1];\n const resumeStatus =\n (last?.response as { _resumeStatus?: NodeStatus } | undefined)?._resumeStatus ?? \"running\";\n\n const updated: InputRequest = {\n ...(node.input ?? { requestedAt: now(), prompt: \"\", schema: { kind: \"text\" } }),\n providedAt: now(),\n providedBy,\n response,\n };\n\n const history = [...node.inputHistory];\n if (history.length > 0) history[history.length - 1] = updated;\n else history.push(updated);\n\n s.execution.nodes[nodeId] = {\n ...node,\n status: resumeStatus,\n input: updated,\n inputHistory: history,\n };\n return undefined;\n });\n }\n\n /**\n * Transition a recoverable failed node back to `available` for retry.\n * Preserves the failure in `errorHistory` so the next turn's agent can\n * see the prior failure context.\n */\n retryNode(handle: ConnectorHandle, nodeId: string): void {\n this.mutate(handle, (s) => {\n const node = s.execution.nodes[nodeId];\n assertLegal(node, `retryNode: unknown node ${nodeId}`);\n assertLegal(\n node.status === \"failed\" && node.error?.recoverable === true,\n `retryNode: node ${nodeId} is not a recoverable failure (status=${node.status}, recoverable=${node.error?.recoverable})`,\n );\n s.execution.nodes[nodeId] = {\n ...node,\n status: \"available\",\n error: undefined,\n };\n return undefined;\n });\n }\n\n /** Toggle autonomous mode at the flow-execution level. */\n setAutonomousMode(handle: ConnectorHandle, enabled: boolean): void {\n this.mutate(handle, (s) => {\n s.execution = { ...s.execution, autonomousMode: enabled };\n return undefined;\n });\n }\n\n /** Cancel the flow run. Status transitions to `cancelled`; dependents stay put. */\n cancel(handle: ConnectorHandle): void {\n this.mutate(handle, (s) => {\n s.execution = { ...s.execution, status: \"cancelled\" };\n return undefined;\n });\n }\n\n /** Read-only access to the current FlowExecution snapshot. */\n getExecution(handle: ConnectorHandle): FlowExecution {\n return this.s(handle).execution;\n }\n\n // ── Private helpers ──\n\n private s(handle: ConnectorHandle): FlowAdapterState {\n return handle.state as FlowAdapterState;\n }\n\n /**\n * Central mutation pipeline: runs the mutator, recomputes derived\n * fields, updates the flow-level `status` if the mutation completed\n * or failed the flow, fires `onChange` once, and (Phase 3, 2026-05-08)\n * optionally signals the {@link FlowAdapterStimulusBus} so the runner\n * can kick a turn outside the legacy orchestrator path.\n *\n * The bus signal path is gated by the `useBusForStimulus` flag set at\n * connect time — Phase 3 builds the path; Phase 4 flips the default to\n * true globally and removes the orchestrator's onStateChange\n * subscription.\n */\n private mutate(handle: ConnectorHandle, fn: (s: FlowAdapterState) => unknown): string {\n const s = this.s(handle);\n const previousExecution = s.lastSignaledExecution;\n const result = fn(s);\n s.execution = this.recompute(s);\n if (s.onChange) s.onChange(s.execution);\n\n if (s.useBusForStimulus && s.stimulusBus) {\n const stim = computeStimulus(previousExecution, s.execution);\n if (stim) {\n const fragment = renderStimulusPrompt(stim);\n const connectorId = s.connectorId ?? handle.id;\n // Fire-and-forget — the bus's signal() returns a promise that\n // resolves once the resulting turn drains, but the adapter must\n // not block agent tool-call completion on the next turn settling.\n // Swallow rejections so a downstream turn failure can't propagate\n // back into the synchronous mutate() pipeline.\n s.stimulusBus\n .signal(connectorId, {\n promptFragment: fragment,\n meta: { kind: stim.kind, runId: s.execution.runId },\n })\n .catch(() => {\n /* rejection surfaces via the bus's own logging path */\n });\n s.lastSignaledExecution = s.execution;\n }\n }\n\n return typeof result === \"string\" ? result : JSON.stringify({ ok: true });\n }\n\n /**\n * Recompute derived fields (`focus`, `done`, and the rolled-up flow\n * `status`) from the current node map, without touching per-node\n * state directly.\n */\n private recompute(s: FlowAdapterState): FlowExecution {\n const snapshots = snapshotMap(s.execution);\n const computed = computeFlowStateFromSnapshots(s.flowDef, snapshots);\n\n // Elevate any `not_started` nodes that are now runnable to `available`.\n const nodes = { ...s.execution.nodes };\n for (const ns of computed.nodes) {\n const existing = nodes[ns.nodeId];\n if (!existing) continue;\n if (existing.status === \"not_started\" && ns.status === \"available\") {\n nodes[ns.nodeId] = { ...existing, status: \"available\" };\n }\n if (existing.status === \"available\" && ns.status === \"blocked\") {\n // Rare: a prior-available node became blocked because an upstream\n // transitioned into a failing terminal state. Mark it blocked.\n nodes[ns.nodeId] = { ...existing, status: \"blocked\" };\n }\n }\n\n // Roll up flow-level status when the computation tells us we're done,\n // or when a required node is stuck in `failed`.\n let flowStatus: FlowExecutionStatus = s.execution.status;\n if (flowStatus !== \"cancelled\") {\n const anyRequiredFailed = s.flowDef.nodes\n .filter((n) => n.type === \"skill\" && !(n.data?.optional ?? false))\n .some((n) => nodes[n.id]?.status === \"failed\");\n if (anyRequiredFailed) {\n flowStatus = \"failed\";\n } else if (computed.done) {\n flowStatus = \"complete\";\n } else if (flowStatus !== \"paused\") {\n flowStatus = \"running\";\n }\n }\n\n return {\n ...s.execution,\n status: flowStatus,\n nodes,\n focus: computed.focus,\n done: computed.done && flowStatus === \"complete\",\n };\n }\n\n /**\n * Build curated context for a node by collecting the summaries and\n * artifact refs produced by its upstream flow-type predecessors.\n */\n private buildHandoff(s: FlowAdapterState, nodeId: string): string {\n const deps = flowPredecessors(s.flowDef, nodeId);\n if (deps.length === 0) return \"(no prior context)\";\n\n const sections: string[] = [];\n for (const depId of deps) {\n const exec = s.execution.nodes[depId];\n const output = exec?.output;\n if (!output) continue;\n const artifacts =\n output.artifacts.length > 0\n ? `\\nArtifacts: ${output.artifacts.map((a) => a.uri).join(\", \")}`\n : \"\";\n const concerns =\n output.concerns && output.concerns.length > 0\n ? `\\nConcerns: ${output.concerns.join(\"; \")}`\n : \"\";\n const label = s.flowDef.nodes.find((n) => n.id === depId)?.data?.label ?? depId;\n sections.push(`### ${label} (${exec?.status})\\n${output.summary}${artifacts}${concerns}`);\n }\n\n return sections.length > 0 ? sections.join(\"\\n\\n\") : \"(no prior context)\";\n }\n}\n\n// ── Pure helpers ────────────────────────────────────────────────────────────\n\n/** IDs of nodes connected to `nodeId` via incoming flow-type edges. */\nfunction flowPredecessors(flowDef: FlowDefinition, nodeId: string): string[] {\n return flowDef.edges.filter((e) => e.target === nodeId && e.type === \"flow\").map((e) => e.source);\n}\n\nfunction safeParseStringArray(value: unknown): string[] {\n if (!value) return [];\n if (Array.isArray(value)) return value.map(String);\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.map(String) : [];\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction safeParseArtifacts(value: unknown): ArtifactRef[] {\n if (!value) return [];\n const raw = typeof value === \"string\" ? safeJsonArray(value) : Array.isArray(value) ? value : [];\n return raw\n .filter((r): r is Record<string, unknown> => !!r && typeof r === \"object\")\n .map((r: Record<string, unknown>) => ({\n uri: String(r.uri ?? \"\"),\n connectorId: String(r.connectorId ?? \"workspace\"),\n kind: (r.kind as ArtifactRef[\"kind\"]) ?? \"other\",\n lifetime: (r.lifetime as ArtifactRef[\"lifetime\"]) ?? \"session\",\n producedBy: String(r.producedBy ?? \"\"),\n }));\n}\n\nfunction safeJsonArray(value: string): unknown[] {\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction safeParseInputSchema(value: unknown): InputSchema {\n if (value && typeof value === \"object\") return value as InputSchema;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as InputSchema;\n } catch {\n return { kind: \"text\" };\n }\n }\n return { kind: \"text\" };\n}\n\n// Re-export `isBlocking` for convenience so callers don't need two imports\n// when reasoning about node state blocking semantics.\nexport { isBlocking };\n\n/**\n * Creates a new FlowAdapter instance.\n * @returns Configured FlowAdapter ready to be registered in the connector registry.\n * @docLink packages/base-assets/api-reference#flow-connector-factory\n */\nexport function createConnector(): FlowAdapter {\n return new FlowAdapter();\n}\n"]}
|