@skaile/workspaces 0.23.0 → 0.25.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 +83 -0
- package/dist/{asset-feeds-WKIKSZ6Z.js → asset-feeds-77KLWCBP.js} +9 -9
- package/dist/{asset-feeds-WKIKSZ6Z.js.map → asset-feeds-77KLWCBP.js.map} +1 -1
- package/dist/asset-manager/index.js +7 -7
- package/dist/asset-manager/installer.js +6 -6
- package/dist/base-assets/connectors/deploy.js +7 -7
- package/dist/base-assets/connectors/devserver.js +7 -7
- package/dist/base-assets/connectors/flow/adapter.js +7 -7
- package/dist/base-assets/connectors/flow/run-flow.js +8 -8
- package/dist/base-assets/connectors/flow.js +7 -7
- package/dist/base-assets/connectors/git.js +7 -7
- package/dist/base-assets/connectors/gmail.js +7 -7
- package/dist/base-assets/connectors/googledrive/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/googledrive.js +7 -7
- package/dist/base-assets/connectors/local.js +7 -7
- package/dist/base-assets/connectors/mattermost.js +7 -7
- package/dist/base-assets/connectors/memory.js +7 -7
- package/dist/base-assets/connectors/minio.js +7 -7
- package/dist/base-assets/connectors/postgres.js +7 -7
- package/dist/base-assets/connectors/s3.js +7 -7
- package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/sharepoint.js +7 -7
- package/dist/base-assets/connectors/sqlite.js +7 -7
- package/dist/base-assets/connectors/static-server.js +7 -7
- package/dist/base-assets/connectors/tunnel.js +7 -7
- package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -1
- package/dist/base-assets/connectors/webdav.js +7 -7
- package/dist/base-assets/connectors/xstate-store/adapter.d.ts +1 -1
- package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
- package/dist/base-assets/connectors/xstate-store.js +7 -7
- package/dist/base-assets/connectors/xstate.js +7 -7
- package/dist/{chunk-542K7SR6.js → chunk-3QTZWPGH.js} +36 -7
- package/dist/chunk-3QTZWPGH.js.map +1 -0
- package/dist/{chunk-46COM7M5.js → chunk-4FADEVBN.js} +4 -4
- package/dist/{chunk-46COM7M5.js.map → chunk-4FADEVBN.js.map} +1 -1
- package/dist/{chunk-AFLH7B64.js → chunk-4FJE6BI6.js} +3 -3
- package/dist/{chunk-AFLH7B64.js.map → chunk-4FJE6BI6.js.map} +1 -1
- package/dist/{chunk-OVQZ5OKL.js → chunk-4QVFQEY2.js} +2 -2
- package/dist/{chunk-OVQZ5OKL.js.map → chunk-4QVFQEY2.js.map} +1 -1
- package/dist/{chunk-BTAC2VYT.js → chunk-B4ZXBH57.js} +7 -7
- package/dist/{chunk-BTAC2VYT.js.map → chunk-B4ZXBH57.js.map} +1 -1
- package/dist/{chunk-DZCFFTAX.js → chunk-BJWUSHC4.js} +336 -113
- package/dist/chunk-BJWUSHC4.js.map +1 -0
- package/dist/{chunk-2F3RUZXC.js → chunk-DCAWIRD6.js} +15 -6
- package/dist/chunk-DCAWIRD6.js.map +1 -0
- package/dist/{chunk-QTWA6BZK.js → chunk-FJFHJBGS.js} +5 -5
- package/dist/{chunk-QTWA6BZK.js.map → chunk-FJFHJBGS.js.map} +1 -1
- package/dist/{chunk-DH4N5AW4.js → chunk-GL45UNVS.js} +3 -3
- package/dist/{chunk-DH4N5AW4.js.map → chunk-GL45UNVS.js.map} +1 -1
- package/dist/{chunk-LJ52ZKIU.js → chunk-KT3CK26V.js} +3 -3
- package/dist/{chunk-LJ52ZKIU.js.map → chunk-KT3CK26V.js.map} +1 -1
- package/dist/{chunk-2RFOFHSM.js → chunk-QXC62DOF.js} +4 -4
- package/dist/{chunk-2RFOFHSM.js.map → chunk-QXC62DOF.js.map} +1 -1
- package/dist/{chunk-ODPII24X.js → chunk-SETTLPBD.js} +3 -3
- package/dist/{chunk-ODPII24X.js.map → chunk-SETTLPBD.js.map} +1 -1
- package/dist/{chunk-5ESCS2OS.js → chunk-UD4ZLXGS.js} +4 -4
- package/dist/{chunk-5ESCS2OS.js.map → chunk-UD4ZLXGS.js.map} +1 -1
- package/dist/{chunk-YX3UWPJ5.js → chunk-WIAHJOMG.js} +19 -49
- package/dist/chunk-WIAHJOMG.js.map +1 -0
- package/dist/{chunk-E4UJ7CVK.js → chunk-XMP6XTMF.js} +213 -57
- package/dist/chunk-XMP6XTMF.js.map +1 -0
- package/dist/{chunk-Z3M5K67G.js → chunk-XVL22AWE.js} +3 -3
- package/dist/{chunk-Z3M5K67G.js.map → chunk-XVL22AWE.js.map} +1 -1
- package/dist/cli/index.js +160 -46
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/connectors/config.js +6 -6
- package/dist/connectors/index.js +7 -7
- package/dist/connectors/src/connector-manager.d.ts +49 -0
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors/src/connector-types.d.ts +16 -0
- package/dist/connectors/src/connector-types.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/models.d.ts +10 -3
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +21 -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-OJUBGX6Z.js → ensure-sources-7MOOKY3K.js} +9 -9
- package/dist/{ensure-sources-OJUBGX6Z.js.map → ensure-sources-7MOOKY3K.js.map} +1 -1
- package/dist/library/index.js +12 -4
- package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
- package/dist/open-library-GW7DWWNZ.js +21 -0
- package/dist/{open-library-67FSSQWE.js.map → open-library-GW7DWWNZ.js.map} +1 -1
- package/dist/{plugin-store-IZ5SCRAV.js → plugin-store-R32NH7JE.js} +7 -7
- package/dist/{plugin-store-IZ5SCRAV.js.map → plugin-store-R32NH7JE.js.map} +1 -1
- package/dist/runner/index.js +9 -9
- package/dist/runner/src/external-mcp.d.ts +112 -0
- package/dist/runner/src/external-mcp.d.ts.map +1 -0
- package/dist/runner/src/resources.d.ts +22 -1
- package/dist/runner/src/resources.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +19 -0
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +7 -7
- package/dist/sdk/core.js +5 -5
- package/dist/sdk/index.js +9 -9
- package/dist/sdk/runner.js +9 -9
- package/dist/{setup-J7CYEQOF.js → setup-SRPBQOHY.js} +7 -7
- package/dist/{setup-J7CYEQOF.js.map → setup-SRPBQOHY.js.map} +1 -1
- package/dist/store-client-INZD2RYD.js +14 -0
- package/dist/{store-client-AEI6Y3KD.js.map → store-client-INZD2RYD.js.map} +1 -1
- package/dist/tui/index.js +9 -9
- package/dist/types/src/install-manifest.d.ts +1 -1
- package/dist/types/src/install-manifest.d.ts.map +1 -1
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2F3RUZXC.js.map +0 -1
- package/dist/chunk-542K7SR6.js.map +0 -1
- package/dist/chunk-DZCFFTAX.js.map +0 -1
- package/dist/chunk-E4UJ7CVK.js.map +0 -1
- package/dist/chunk-YX3UWPJ5.js.map +0 -1
- package/dist/open-library-67FSSQWE.js +0 -13
- package/dist/store-client-AEI6Y3KD.js +0 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../core/src/models.ts"],"names":[],"mappings":"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","file":"chunk-WIAHJOMG.js","sourcesContent":["/**\n * Pure data models — no I/O, no side effects.\n */\n\nimport semver from \"semver\";\n\n/**\n * Discriminator for catalog entries and asset references.\n * Used in asset ref strings (e.g. `'skill:my-skill'`, `'agent:my-agent'`).\n * @docLink packages/core/concepts#asset-kind\n */\nexport type AssetKind =\n | \"skill\"\n | \"agent\"\n | \"prompt\"\n | \"bundle\"\n | \"flow\"\n | \"contract\"\n | \"mcp-server\"\n | \"persona\" // identity fragment — replaces SOUL.md in composition\n | \"ruleset\" // behavioral constraints — replaces RULES.md in composition\n | \"knowledge\" // knowledge bundle directory\n | \"connector\"; // connector descriptor (CONNECTOR.md)\n\n/**\n * All valid AssetKind values as a readonly array.\n * @docLink packages/core/concepts#asset-kinds\n */\nexport const ASSET_KINDS: readonly AssetKind[] = [\n \"skill\",\n \"agent\",\n \"prompt\",\n \"bundle\",\n \"flow\",\n \"contract\",\n \"mcp-server\",\n \"persona\",\n \"ruleset\",\n \"knowledge\",\n \"connector\",\n];\n/**\n * Asset kinds that represent individually installable assets (excludes \"bundle\").\n * Note: persona, ruleset, and knowledge are valid AssetKind values but are not\n * individually installable — they are resolved at session creation time via the\n * mixin-resolver, not through the install/deploy pipeline.\n * @docLink packages/core/concepts#individual-kinds\n */\nexport const INDIVIDUAL_KINDS = [\n \"skill\",\n \"agent\",\n \"prompt\",\n \"flow\",\n \"contract\",\n \"mcp-server\",\n] as const satisfies AssetKind[];\n\n// ── Dependency ────────────────────────────────────────────────────────────────\n\n/**\n * Declared dependency on another catalog asset.\n * @docLink packages/core/concepts#dependency\n */\nexport interface Dependency {\n /** Asset kind (e.g. \"skill\", \"agent\", \"contract\"). */\n kind: string;\n /** Asset name within that kind. */\n name: string;\n /** Canonical publisher namespace (when known). */\n publisher?: string;\n}\n\n/**\n * Parse a `\"kind:name\"` dependency string, or a bare `\"name\"` (defaults kind to `\"skill\"`).\n *\n * @param s - Dependency string, e.g. `\"skill:use-exa\"` or `\"use-exa\"`\n * @returns Parsed `{ kind, name }` dependency object\n * @docLink packages/core/concepts#parse-dep\n */\nexport function parseDep(s: string): Dependency {\n const i = s.indexOf(\":\");\n if (i !== -1) {\n const kind = s.slice(0, i).trim();\n const name = s.slice(i + 1).trim();\n return { kind, name };\n }\n return { kind: \"skill\", name: s.trim() };\n}\n\n/**\n * Serialize a Dependency back to its `\"kind:name\"` string form.\n *\n * @param d - Dependency to serialize\n * @returns String in `\"kind:name\"` format\n * @docLink packages/core/concepts#dep-to-str\n */\nexport function depToStr(d: Dependency): string {\n return `${d.kind}:${d.name}`;\n}\n\n// ── CatalogEntry ──────────────────────────────────────────────────────────────\n\n/**\n * A resolved catalog entry describing an installable asset.\n * Produced by manifest parsers and stored in the catalog YAML.\n * @docLink packages/core/concepts#catalog-entry\n */\nexport interface CatalogEntry {\n /** Unique asset name within its kind. */\n name: string;\n /** Asset kind discriminator. */\n kind: AssetKind;\n /** Short description of what this asset does. */\n description: string;\n /** Absolute path to manifest file */\n source: string;\n /** Canonical publisher namespace this asset belongs to (formerly `repository`). */\n publisher?: string;\n /**\n * `\"<org>/<repo>\"` coordinate the asset came from. Absent → the asset groups\n * directly under its publisher (local library with no git remote, or a\n * non-GitHub source). Replaces the former derived `domain` axis.\n */\n repo?: string;\n /** Semantic version string (may be empty if not declared in the manifest). */\n version: string;\n /** Skills, agents, or other assets this entry depends on. */\n requires: Dependency[];\n /** Bundle dependencies — asset refs to install (bundles only). */\n dependencies: string[];\n /**\n * Kind-specific metadata extracted from the manifest frontmatter.\n * Used by MCP servers to carry default config (transport, command, args, env, url, headers)\n * so that `mcp:name` dependency refs resolve to a runnable declaration without\n * requiring verbose inline config in `skaile.yaml`.\n */\n metadata?: Record<string, unknown>;\n /** Curated facet, surfaced as a badge in the manage TUI (not a tree axis). */\n category?: string;\n}\n\n/**\n * Construct a CatalogEntry from a raw deserialized record (e.g. from catalog.yaml).\n *\n * @param d - Raw object with loosely typed fields\n * @returns Normalized CatalogEntry\n * @docLink packages/core/concepts#entry-from-raw\n */\nexport function entryFromRaw(d: Record<string, unknown>): CatalogEntry {\n const rawDeps = d.dependencies;\n const deps = Array.isArray(rawDeps) ? (rawDeps as string[]).filter(Boolean) : [];\n const entry: CatalogEntry = {\n name: String(d.name ?? \"\"),\n kind: String(d.kind ?? \"skill\") as AssetKind,\n description: String(d.description ?? \"\"),\n source: String(d.source ?? \"\"),\n publisher: d.publisher != null ? String(d.publisher) : undefined,\n // Read `repo`, falling back to the legacy `domain` key so a stale\n // catalog.yaml cache written before this release still groups sanely.\n // The cache self-heals on next write (entryToRaw stops writing `domain`).\n repo: d.repo != null ? String(d.repo) : d.domain != null ? String(d.domain) : undefined,\n version: String(d.version ?? \"\"),\n requires: Array.isArray(d.requires)\n ? (d.requires as string[]).filter(Boolean).map(parseDep)\n : [],\n dependencies: deps,\n };\n if (d.metadata != null && typeof d.metadata === \"object\" && !Array.isArray(d.metadata)) {\n entry.metadata = d.metadata as Record<string, unknown>;\n }\n if (d.category != null) entry.category = String(d.category);\n return entry;\n}\n\n/**\n * Serialize a CatalogEntry to a plain record suitable for YAML/JSON persistence.\n *\n * @param e - CatalogEntry to serialize\n * @returns Plain object with string-serialized requires and dependencies\n * @docLink packages/core/concepts#entry-to-raw\n */\nexport function entryToRaw(e: CatalogEntry): Record<string, unknown> {\n const raw: Record<string, unknown> = {\n name: e.name,\n kind: e.kind,\n description: e.description,\n source: e.source,\n publisher: e.publisher,\n repo: e.repo,\n version: e.version,\n requires: e.requires.map(depToStr),\n dependencies: e.dependencies,\n };\n if (e.metadata) raw.metadata = e.metadata;\n if (e.category != null) raw.category = e.category;\n return raw;\n}\n\n// ── AssetRef ─────────────────────────────────────────────────────────────────\n\n/**\n * A parsed asset reference: `kind:@<publisher>/name[#pin]`.\n *\n * `publisher` is the canonical, GitHub-shaped publisher namespace (≤39 chars,\n * alphanumeric+hyphen). `pin` is a SemVer constraint, exact SHA, or absent.\n * Floating refs (`main`, `latest`, `HEAD`) are rejected at parse time.\n *\n * Produced by `parseAssetRef`; consumed by `resolveAsset` and `resolveAll`.\n * @docLink packages/core/concepts#asset-ref\n */\nexport interface AssetRef {\n kind: string;\n name: string;\n /** Canonical publisher namespace. Optional only for ambiguity-resolution\n * during migration; new manifests require it. */\n publisher?: string;\n /** SemVer constraint (^1.4.0, ~1.4, 1.x, exact 1.4.0), 40-char SHA, or undefined. */\n pin?: string;\n}\n\nconst SHA_RE = /^[0-9a-f]{40}$/i;\n\n// Scoped grammar: `kind:@publisher/name[#version]`. The publisher sub-pattern is\n// GitHub-shaped (1-39 chars, alphanumeric + single hyphens, no leading/trailing or\n// double hyphen); `@` is the scope sigil and `#` the version sigil. `name` is\n// intentionally permissive (`[^/#\\s]+` — only the structural separators are\n// forbidden); floating-ref rejection stays in `isValidPin`, so `#main`/`#latest`\n// match here and fail there with a clear message.\nconst SCOPED_REF_RE =\n /^(?:([a-z][a-z0-9-]*):)?@([A-Za-z0-9](?:[A-Za-z0-9]|-(?!-)){0,37}[A-Za-z0-9]|[A-Za-z0-9])\\/([^/#\\s]+)(?:#(.+))?$/;\n\n// Canonical asset-name grammar: lowercase kebab-case (npm-style, scope-free) —\n// `a-z` / `0-9` segments joined by single hyphens, no leading/trailing hyphen,\n// no uppercase, spaces, dots, or underscores. Names become directory names,\n// lock keys, and CLI args, so the constraint is intentionally narrow.\nconst ASSET_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n// Diagnostic-only matcher: a ref carrying a `kind:@publisher/` scope prefix,\n// capturing whatever follows (sans `#pin`) as the candidate name. Used solely\n// to tell \"missing publisher\" apart from \"malformed name\" when the strict\n// grammar above fails (e.g. a space in the name).\nconst SCOPE_PREFIX_RE = /^(?:[a-z][a-z0-9-]*:)?@[^/\\s]+\\/([^#]+?)(?:#.*)?$/;\n\n/** Human-readable statement of the canonical asset-name rule. */\nexport const ASSET_NAME_HINT =\n 'names must be lowercase kebab-case (a-z, 0-9, single hyphens; e.g. \"cli-concept\")';\n\n/**\n * True when `name` is a canonical asset name: lowercase kebab-case, scope-free.\n *\n * This is the single source of truth for asset-name validity — `parseAssetRef`\n * enforces it, and `skaile validate` reports violations across a repo tree.\n * @docLink packages/core/concepts#is-valid-asset-name\n */\nexport function isValidAssetName(name: string): boolean {\n return ASSET_NAME_RE.test(name);\n}\n\n/** True when `pin` is a SemVer constraint, exact SemVer, or 40-char SHA. */\nfunction isValidPin(pin: string): boolean {\n if (SHA_RE.test(pin)) return true;\n if (semver.valid(pin)) return true;\n if (semver.validRange(pin)) return true;\n return false;\n}\n\n/** Throw the canonical non-canonical-pin error for a ref `s` carrying `pin`. */\nfunction rejectFloatingPin(s: string, pin: string): never {\n throw new Error(\n `non-canonical pin \"${pin}\" in \"${s}\" — pin must be a SemVer ` +\n \"constraint (1.4.0, ^1.4, ~1.4, 1.x), a 40-char SHA, or absent. \" +\n \"Floating refs (main/latest/HEAD) are not allowed.\",\n );\n}\n\n/** Throw the canonical malformed-name error for a ref `s` carrying `name`. */\nfunction rejectInvalidName(s: string, name: string): never {\n throw new Error(\n `invalid asset name \"${name}\" in ref \"${s}\" — ${ASSET_NAME_HINT}. ` +\n \"Run the `migrate-skaile-manifest` skill on legacy manifests.\",\n );\n}\n\n/**\n * Parse a canonical asset reference string into an `AssetRef` object.\n *\n * Grammar: `kind:@<publisher>/name[#version]`\n * \"skill:@skaile-ai/audit\" → { kind: \"skill\", name: \"audit\", publisher: \"skaile-ai\" }\n * \"skill:@skaile-ai/audit#^1.4.0\" → { …, pin: \"^1.4.0\" }\n * \"skill:@skaile-ai/audit#<40-sha>\" → { …, pin: \"<40-sha>\" }\n *\n * `@` is the scope sigil and `#` the version sigil. `<publisher>` is GitHub-shaped\n * (≤39 chars, alphanumeric+hyphen, no leading/trailing or double hyphen). `pin`\n * accepts a SemVer constraint (`^`, `~`, `x`, exact), a 40-char SHA, or is absent.\n * Floating refs (`main`/`latest`/`HEAD`/anything non-canonical) are parse-time errors.\n *\n * The shorthand `mcp:` is normalized to `mcp-server:`. `kind` defaults to `\"skill\"`.\n *\n * @param s - Asset reference string\n * @returns Parsed `AssetRef`\n * @throws When the ref matches no grammar, the publisher is malformed, or the pin\n * is a floating ref.\n * @docLink packages/core/concepts#parse-asset-ref\n */\nexport function parseAssetRef(s: string): AssetRef {\n const trimmed = s.trim();\n const m = SCOPED_REF_RE.exec(trimmed);\n if (m) {\n const kindRaw = m[1] ?? \"skill\";\n const kind = kindRaw === \"mcp\" ? \"mcp-server\" : kindRaw;\n const publisher = m[2];\n const name = m[3];\n const pin = m[4]?.trim() || undefined;\n if (!isValidAssetName(name)) rejectInvalidName(s, name);\n if (pin !== undefined && !isValidPin(pin)) rejectFloatingPin(s, pin);\n return { kind, name, publisher, pin };\n }\n\n // The strict grammar failed. If the ref nonetheless carries a `@publisher/`\n // scope and the fault is the name (e.g. an embedded space), surface a\n // name-specific error rather than the misleading \"publisher required\" — the\n // publisher is plainly present. A *valid* captured name means the publisher\n // itself is malformed, so fall through to the publisher error below.\n const scoped = SCOPE_PREFIX_RE.exec(trimmed);\n if (scoped) {\n const candidate = scoped[1].trim();\n if (!isValidAssetName(candidate)) rejectInvalidName(s, candidate);\n }\n\n throw new Error(\n `publisher required in asset ref \"${s}\" — use \\`kind:@<publisher>/name\\`. ` +\n \"Run the `migrate-skaile-manifest` skill on legacy manifests.\",\n );\n}\n\n/**\n * Serialize an AssetRef back to its canonical string form.\n *\n * Emits the scope form `kind:@publisher/name[#pin]` when `publisher` is present,\n * and the bare `kind:name[#pin]` form for transitive refs that inherit it.\n *\n * @param ref - AssetRef to serialize\n * @returns String in `\"kind:@publisher/name[#pin]\"` (or bare `\"kind:name[#pin]\"`) format\n * @docLink packages/core/concepts#asset-ref-to-str\n */\nexport function assetRefToStr(ref: AssetRef): string {\n const scope = ref.publisher ? `@${ref.publisher}/${ref.name}` : ref.name;\n return `${ref.kind}:${scope}${ref.pin ? `#${ref.pin}` : \"\"}`;\n}\n\n/**\n * Convert an AssetRef to a simple Dependency, dropping the repository and pin qualifiers.\n *\n * @param ref - Full asset reference (may include repository and pin)\n * @returns Dependency with only kind and name\n * @docLink packages/core/concepts#asset-ref-to-dep\n */\nexport function assetRefToDep(ref: AssetRef): Dependency {\n // Grammar-agnostic — drops publisher/pin, so the scope-sigil change doesn't touch it.\n return { kind: ref.kind, name: ref.name };\n}\n\n// ── Lock File ────────────────────────────────────────────────────────────────\n\n/** A path/sha256 pair recorded for one file inside a locked asset. */\nexport interface LockFileEntry {\n path: string;\n sha256: string;\n}\n\n/**\n * Per-asset entry in the lock file (v3 schema).\n * Keyed in `LockFile.assets` by canonical ref (`<kind>:@<publisher>/<name>#<version>`).\n * @docLink packages/core/api-reference#lock-entry\n */\nexport interface LockEntry {\n /** Composite sha256 over sorted `<path>:<sha256>\\n` rows. */\n sha256: string;\n /** Resolved upstream source + commit. */\n source: { url: string; commit: string };\n /** Files that constitute the asset. */\n files: LockFileEntry[];\n /** True when an `overrides[]` entry pinned this resolution. */\n override_applied: boolean;\n}\n\n/** Per-source-URL entry in `LockFile.sources`. */\nexport interface LockSourceEntry {\n url: string;\n commit: string;\n}\n\n/**\n * Full skaile.lock.yaml structure (v3 schema).\n * @docLink packages/core/api-reference#lock-file\n */\nexport interface LockFile {\n /** Lock file schema version. v3 is canonical. */\n schema_version: 3;\n /** ISO timestamp of when the lock was generated. */\n locked_at: string;\n /** Resolved assets keyed by canonical ref `<kind>:@<publisher>/<name>#<version>`. */\n assets: Record<string, LockEntry>;\n /** Every source URL that contributed at least one resolved asset. */\n sources: LockSourceEntry[];\n /**\n * Resolved plugin packages (from `skaile.yaml` `plugins:`), keyed by package\n * name. The plugin-store reconciler reads this slice into its reconcile-hash\n * so a lock change reinstalls even when the manifest list is unchanged.\n */\n plugins?: Record<string, LockPluginEntry>;\n}\n\n/** One pinned plugin package in the lock file's `plugins` slice. */\nexport interface LockPluginEntry {\n /** Resolved exact version (e.g. \"0.1.3\"). */\n version: string;\n /** Package integrity hash (e.g. \"sha512-...\"); may be empty until populated from bun's output. */\n integrity: string;\n}\n\n// ── AgentManifest ────────────────────────────────────────────────────────────\n\n/**\n * Agent package manifest — parsed from `agent.yaml` in an agent directory.\n * Defines the agent's identity, model preferences, capability requirements, and composition mixins.\n * @docLink packages/core/concepts#agent-manifest\n */\nexport interface AgentManifest {\n spec_version?: string;\n name?: string;\n version?: string;\n description?: string;\n model?: {\n preferred?: string;\n fallback?: string[];\n constraints?: { temperature?: number; max_tokens?: number };\n };\n tools?: {\n allowed?: string[];\n denied?: string[];\n };\n delegation?: { mode?: string };\n requires?: Array<{ name: string; source: string; version?: string; mount: string }>;\n tags?: string[];\n author?: string;\n metadata?: Record<string, unknown>;\n /**\n * @deprecated Use `persona`, `rules`, and `knowledge` mixin arrays instead.\n * This field is declared but was never resolved at runtime.\n */\n extends?: string;\n abilities?: string[];\n /**\n * Identity fragments to compose into the agent persona.\n * Each entry is a catalog ref (`persona:name@repo#pin`), a bare name\n * (defaults to kind \"persona\"), or a local path (`./my.persona.md`).\n * Resolved in order — concatenated with \\n\\n---\\n\\n separator.\n */\n persona?: string[];\n /**\n * Behavioral rule sets to compose into the agent's constraints.\n * Each entry is a catalog ref (`ruleset:name@repo#pin`), bare name,\n * or local path. All rules apply (union).\n */\n rules?: string[];\n /**\n * Knowledge bundles to compose into the agent's domain knowledge.\n * Each entry is a catalog ref (`knowledge:name@repo#pin`), bare name,\n * or local path to a knowledge directory. Loaded in declaration order.\n */\n knowledge?: string[];\n contracts?: string[];\n /**\n * v2 composition items. Each entry references an asset (skill, connector,\n * soul, ruleset, etc.) with binding semantics (discoverable, inline-live,\n * inline-snapshot). Resolved at session start via the composition module.\n */\n composes?: Array<{\n kind: string;\n ref: string;\n instance?: string;\n binding?: \"discoverable\" | \"inline-live\" | \"inline-snapshot\";\n }>;\n runtime?: {\n max_turns?: number;\n timeout?: number;\n [key: string]: unknown;\n };\n}\n\n// ── Repository ───────────────────────────────────────────────────────────────\n\ntype RepositoryKind = \"local\" | \"github\";\n\n/**\n * A registered asset repository (local path or cloned GitHub repo).\n * Stored in the catalog; consumed by `repo-manager` for cloning and scanning.\n * @docLink packages/core/concepts#repository\n */\nexport interface Repository {\n /** Logical repository name. */\n name: string;\n /** Storage kind: \"local\" for paths, \"github\" for remote URLs. */\n kind: RepositoryKind;\n /** Absolute path (local) or remote URL (github). */\n path: string;\n /** Active branch. */\n branch: string;\n /** Upstream fork URL (for fork-based workflows). */\n upstream?: string;\n}\n\n/**\n * Construct a `Repository` from a raw deserialized record.\n *\n * @param d - Raw object from YAML/JSON\n * @returns Normalized `Repository`\n * @docLink packages/core/concepts#repository-from-raw\n */\nexport function repositoryFromRaw(d: Record<string, unknown>): Repository {\n return {\n name: String(d.name ?? \"\"),\n kind: String(d.kind ?? \"local\") as RepositoryKind,\n path: String(d.path ?? \"\"),\n branch: String(d.branch ?? \"main\"),\n upstream: d.upstream != null ? String(d.upstream) : undefined,\n };\n}\n\n/**\n * Serialize a `Repository` to a plain record for YAML/JSON persistence.\n * Omits the `branch` field when it equals `\"main\"` to keep serialized output clean.\n *\n * @param r - Repository to serialize\n * @returns Plain object suitable for YAML/JSON\n * @docLink packages/core/concepts#repository-to-raw\n */\nexport function repositoryToRaw(r: Repository): Record<string, unknown> {\n const d: Record<string, unknown> = {\n name: r.name,\n kind: r.kind,\n path: r.path,\n };\n if (r.branch !== \"main\") d.branch = r.branch;\n if (r.upstream != null) d.upstream = r.upstream;\n return d;\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { resolveAuthRef, resolveAuth } from './chunk-
|
|
1
|
+
import { resolveAuthRef, resolveAuth } from './chunk-SETTLPBD.js';
|
|
2
2
|
import { createFsWatcher, RcloneProcessManager, ensureDirMode, PortPool } from './chunk-QMONOHXT.js';
|
|
3
3
|
import { renderWebDAVConfig, renderOneDriveConfig, renderGoogleDriveConfig } from './chunk-QAVZOJCV.js';
|
|
4
4
|
import { pluginRegistry } from './chunk-6E6PKKAD.js';
|
|
5
5
|
import { computeFlowStateFromSnapshots } from './chunk-ICS76R4T.js';
|
|
6
6
|
import { renderStimulusPrompt } from './chunk-GZWJGNNN.js';
|
|
7
7
|
import { computeStimulus } from './chunk-FVTV7M76.js';
|
|
8
|
-
import { portableSpawn } from './chunk-
|
|
8
|
+
import { portableSpawn } from './chunk-XVL22AWE.js';
|
|
9
9
|
import { createLogger } from './chunk-24UIWON4.js';
|
|
10
10
|
import { existsSync, mkdirSync, renameSync, writeFileSync, readFileSync, cpSync, statSync, createReadStream, readdirSync, openSync, writeSync, closeSync, chmodSync } from 'fs';
|
|
11
11
|
import { join, dirname, resolve, sep } from 'path';
|
|
@@ -1182,6 +1182,7 @@ var WebDAVConnector = class extends AbstractConnector {
|
|
|
1182
1182
|
name = "webdav";
|
|
1183
1183
|
rclone = new RcloneProcessManager();
|
|
1184
1184
|
filesystem = {
|
|
1185
|
+
deferMount: true,
|
|
1185
1186
|
sync: (handle, options) => {
|
|
1186
1187
|
return this._sync(handle, options);
|
|
1187
1188
|
}
|
|
@@ -1351,6 +1352,7 @@ var SharePointConnector = class extends AbstractConnector {
|
|
|
1351
1352
|
name = "sharepoint";
|
|
1352
1353
|
rclone = new RcloneProcessManager();
|
|
1353
1354
|
filesystem = {
|
|
1355
|
+
deferMount: true,
|
|
1354
1356
|
sync: (handle, options) => {
|
|
1355
1357
|
return this._sync(handle, options);
|
|
1356
1358
|
}
|
|
@@ -1539,6 +1541,7 @@ var GoogleDriveConnector = class extends AbstractConnector {
|
|
|
1539
1541
|
name = "googledrive";
|
|
1540
1542
|
rclone = new RcloneProcessManager();
|
|
1541
1543
|
filesystem = {
|
|
1544
|
+
deferMount: true,
|
|
1542
1545
|
sync: (handle, options) => {
|
|
1543
1546
|
return this._sync(handle, options);
|
|
1544
1547
|
}
|
|
@@ -3087,6 +3090,15 @@ var XStateStoreConnector = class extends AbstractConnector {
|
|
|
3087
3090
|
],
|
|
3088
3091
|
examples: [`merge --data '{"theme":"dark","locale":"de"}'`]
|
|
3089
3092
|
},
|
|
3093
|
+
{
|
|
3094
|
+
name: "delete",
|
|
3095
|
+
description: "Delete a single key from the store context.",
|
|
3096
|
+
accessLevel: "write",
|
|
3097
|
+
args: [
|
|
3098
|
+
{ name: "key", type: "string", required: true, description: "Key name to delete" }
|
|
3099
|
+
],
|
|
3100
|
+
examples: ["delete --key theme"]
|
|
3101
|
+
},
|
|
3090
3102
|
{
|
|
3091
3103
|
name: "reset",
|
|
3092
3104
|
description: "Reset the store to its initial context.",
|
|
@@ -3143,6 +3155,14 @@ var XStateStoreConnector = class extends AbstractConnector {
|
|
|
3143
3155
|
}
|
|
3144
3156
|
return "OK";
|
|
3145
3157
|
}
|
|
3158
|
+
case "delete": {
|
|
3159
|
+
const key = String(args.key ?? "");
|
|
3160
|
+
if (!(key in this.context(handle))) return "OK";
|
|
3161
|
+
s.store.send({ type: "delete", key });
|
|
3162
|
+
this._recordHistory(handle, "delete", { key });
|
|
3163
|
+
this.emitChange?.({ path: key, action: "delete", source: "operation" });
|
|
3164
|
+
return "OK";
|
|
3165
|
+
}
|
|
3146
3166
|
case "reset": {
|
|
3147
3167
|
s.store.send({ type: "reset" });
|
|
3148
3168
|
s.history = [];
|
|
@@ -5112,6 +5132,12 @@ var ConnectorManager = class {
|
|
|
5112
5132
|
tokenMediator;
|
|
5113
5133
|
preMintedSecrets;
|
|
5114
5134
|
mgrLog;
|
|
5135
|
+
/** Set once `disconnectAll()` starts, so in-flight deferred mounts bail. */
|
|
5136
|
+
disposed = false;
|
|
5137
|
+
/** Aborted on dispose; threaded into every `connect()` via `ctx.abortSignal`. */
|
|
5138
|
+
disposeController = new AbortController();
|
|
5139
|
+
/** Tracks the background task driving deferred (rclone-backed) mounts. */
|
|
5140
|
+
deferredConnect;
|
|
5115
5141
|
// ── Private helpers ──────────────────────────────────────────────────────────
|
|
5116
5142
|
/**
|
|
5117
5143
|
* Wrap the user-supplied `TokenMediator` so `reason: 'initial'` calls for an
|
|
@@ -5216,7 +5242,8 @@ var ConnectorManager = class {
|
|
|
5216
5242
|
async buildConnectContext(declaration, connector) {
|
|
5217
5243
|
const ctx = {
|
|
5218
5244
|
secrets: this.chain ?? this.secrets,
|
|
5219
|
-
tokenMediator: void 0
|
|
5245
|
+
tokenMediator: void 0,
|
|
5246
|
+
abortSignal: this.disposeController.signal
|
|
5220
5247
|
};
|
|
5221
5248
|
if (this.chain && connector.describeFields) {
|
|
5222
5249
|
const fields = connector.describeFields();
|
|
@@ -5268,65 +5295,55 @@ var ConnectorManager = class {
|
|
|
5268
5295
|
* connector with a `mount` config failed → throws `ConnectorStartupError`
|
|
5269
5296
|
* (fail-fast lifecycle semantics for mountable connectors).
|
|
5270
5297
|
*
|
|
5298
|
+
* When `options.deferMounts` is set, connectors whose filesystem face is
|
|
5299
|
+
* marked `deferMount` (rclone-backed FUSE mounts) are NOT awaited here:
|
|
5300
|
+
* their target is pre-registered (so the mount path renders in the system
|
|
5301
|
+
* prompt immediately) and the actual mount is driven on a background task.
|
|
5302
|
+
* The returned report therefore covers only the eagerly-connected set, so a
|
|
5303
|
+
* slow remote can never gate whatever the caller does next (e.g. emitting
|
|
5304
|
+
* `session_init_ack`). Deferred connectors surface their progress through
|
|
5305
|
+
* `onStatusChange` (connecting → connected | error).
|
|
5306
|
+
*
|
|
5271
5307
|
* @param declarations - Connector declarations from `skaile.yaml`.
|
|
5272
5308
|
* @param options.failOnReadWriteError - Throw `ConnectorStartupError` if any
|
|
5273
5309
|
* read-write connector fails. Read-only failures are always tolerated.
|
|
5310
|
+
* Only the eager set is considered — deferred mounts never throw.
|
|
5311
|
+
* @param options.deferMounts - Bring `deferMount` filesystem-face connectors
|
|
5312
|
+
* up in the background instead of awaiting them.
|
|
5274
5313
|
*/
|
|
5275
5314
|
async connectAll(declarations, options) {
|
|
5276
5315
|
this.mgrLog.info("connectAll start", { count: declarations.length });
|
|
5277
5316
|
const results = [];
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
|
|
5282
|
-
|
|
5283
|
-
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
|
|
5295
|
-
|
|
5296
|
-
|
|
5297
|
-
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5301
|
-
);
|
|
5302
|
-
this.active.set(decl.id, { connector, handle, declaration: decl });
|
|
5303
|
-
results.push({
|
|
5304
|
-
id: decl.id,
|
|
5305
|
-
connected: true,
|
|
5306
|
-
mountPath: handle.mountPath,
|
|
5307
|
-
access: decl.access
|
|
5308
|
-
});
|
|
5309
|
-
this.opts.onStatusChange?.({
|
|
5310
|
-
type: "connector_status",
|
|
5311
|
-
connectorId: decl.id,
|
|
5312
|
-
status: "connected"
|
|
5313
|
-
});
|
|
5314
|
-
} catch (err) {
|
|
5315
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
5316
|
-
this.mgrLog.error("connect failed", err, { id: decl.id, driver: decl.driver });
|
|
5317
|
-
results.push({
|
|
5318
|
-
id: decl.id,
|
|
5319
|
-
connected: false,
|
|
5320
|
-
error: msg,
|
|
5321
|
-
access: decl.access
|
|
5322
|
-
});
|
|
5323
|
-
this.opts.onStatusChange?.({
|
|
5324
|
-
type: "connector_status",
|
|
5325
|
-
connectorId: decl.id,
|
|
5326
|
-
status: "error",
|
|
5327
|
-
error: msg
|
|
5328
|
-
});
|
|
5317
|
+
const eager = [];
|
|
5318
|
+
const deferred = [];
|
|
5319
|
+
if (options?.deferMounts) {
|
|
5320
|
+
for (const decl of declarations) {
|
|
5321
|
+
let connector;
|
|
5322
|
+
try {
|
|
5323
|
+
connector = await this.resolveConnector(decl.driver);
|
|
5324
|
+
} catch {
|
|
5325
|
+
}
|
|
5326
|
+
if (connector?.filesystem?.deferMount === true) {
|
|
5327
|
+
deferred.push({ decl, connector });
|
|
5328
|
+
} else {
|
|
5329
|
+
eager.push({ decl, connector });
|
|
5330
|
+
}
|
|
5331
|
+
}
|
|
5332
|
+
} else {
|
|
5333
|
+
for (const decl of declarations) eager.push({ decl });
|
|
5334
|
+
}
|
|
5335
|
+
for (const { decl, connector } of eager) {
|
|
5336
|
+
results.push(await this.attemptConnect(decl, connector));
|
|
5337
|
+
}
|
|
5338
|
+
if (deferred.length > 0) {
|
|
5339
|
+
for (const { decl, connector } of deferred) {
|
|
5340
|
+
this.preRegisterDeferred(decl, connector);
|
|
5329
5341
|
}
|
|
5342
|
+
const prior = this.deferredConnect;
|
|
5343
|
+
this.deferredConnect = (async () => {
|
|
5344
|
+
if (prior) await prior;
|
|
5345
|
+
await this.connectDeferred(deferred);
|
|
5346
|
+
})();
|
|
5330
5347
|
}
|
|
5331
5348
|
const report = { results };
|
|
5332
5349
|
this.mgrLog.info("connectAll complete", {
|
|
@@ -5352,9 +5369,140 @@ var ConnectorManager = class {
|
|
|
5352
5369
|
}
|
|
5353
5370
|
return report;
|
|
5354
5371
|
}
|
|
5372
|
+
/**
|
|
5373
|
+
* Connect a single declaration, emitting `connecting` → `connected | error`.
|
|
5374
|
+
* Never throws — failures are recorded in the returned result so `connectAll`
|
|
5375
|
+
* can keep going. Shared by the eager loop and the deferred background task.
|
|
5376
|
+
*/
|
|
5377
|
+
async attemptConnect(decl, preResolved) {
|
|
5378
|
+
this.opts.onStatusChange?.({
|
|
5379
|
+
type: "connector_status",
|
|
5380
|
+
connectorId: decl.id,
|
|
5381
|
+
status: "connecting"
|
|
5382
|
+
});
|
|
5383
|
+
try {
|
|
5384
|
+
const connector = preResolved ?? await this.resolveConnector(decl.driver);
|
|
5385
|
+
const connectorLog = createLogger({
|
|
5386
|
+
kind: "connector",
|
|
5387
|
+
subkind: connector.name ?? decl.driver,
|
|
5388
|
+
instance: decl.id
|
|
5389
|
+
});
|
|
5390
|
+
connector.setLogger?.(connectorLog);
|
|
5391
|
+
const ctx = await this.buildConnectContext(decl, connector);
|
|
5392
|
+
const handle = await this.withSpan(
|
|
5393
|
+
"connector.connect",
|
|
5394
|
+
{
|
|
5395
|
+
"skaile.connector.id": decl.id,
|
|
5396
|
+
"skaile.connector.driver": decl.driver,
|
|
5397
|
+
"skaile.connector.operation": "connect"
|
|
5398
|
+
},
|
|
5399
|
+
() => connector.connect(decl, ctx)
|
|
5400
|
+
);
|
|
5401
|
+
const previous = this.active.get(decl.id);
|
|
5402
|
+
if (previous?.watchHandle) {
|
|
5403
|
+
try {
|
|
5404
|
+
await previous.watchHandle.close();
|
|
5405
|
+
} catch {
|
|
5406
|
+
}
|
|
5407
|
+
}
|
|
5408
|
+
this.active.set(decl.id, { connector, handle, declaration: decl });
|
|
5409
|
+
this.opts.onStatusChange?.({
|
|
5410
|
+
type: "connector_status",
|
|
5411
|
+
connectorId: decl.id,
|
|
5412
|
+
status: "connected"
|
|
5413
|
+
});
|
|
5414
|
+
return {
|
|
5415
|
+
id: decl.id,
|
|
5416
|
+
connected: true,
|
|
5417
|
+
mountPath: handle.mountPath,
|
|
5418
|
+
access: decl.access
|
|
5419
|
+
};
|
|
5420
|
+
} catch (err) {
|
|
5421
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
5422
|
+
this.mgrLog.error("connect failed", err, { id: decl.id, driver: decl.driver });
|
|
5423
|
+
this.opts.onStatusChange?.({
|
|
5424
|
+
type: "connector_status",
|
|
5425
|
+
connectorId: decl.id,
|
|
5426
|
+
status: "error",
|
|
5427
|
+
error: msg
|
|
5428
|
+
});
|
|
5429
|
+
return {
|
|
5430
|
+
id: decl.id,
|
|
5431
|
+
connected: false,
|
|
5432
|
+
error: msg,
|
|
5433
|
+
access: decl.access
|
|
5434
|
+
};
|
|
5435
|
+
}
|
|
5436
|
+
}
|
|
5437
|
+
/**
|
|
5438
|
+
* Register a provisional entry for a deferred filesystem-face connector so
|
|
5439
|
+
* its (deterministic) mount path shows up in `listConnectors()` / the system
|
|
5440
|
+
* prompt before the background mount completes. The empty target dir is
|
|
5441
|
+
* created up front so the agent can `ls` it while it is still syncing.
|
|
5442
|
+
*/
|
|
5443
|
+
preRegisterDeferred(decl, connector) {
|
|
5444
|
+
const mountTarget = this.resolveMountTarget(decl);
|
|
5445
|
+
if (!existsSync(mountTarget)) mkdirSync(mountTarget, { recursive: true });
|
|
5446
|
+
const handle = {
|
|
5447
|
+
id: decl.id,
|
|
5448
|
+
driver: connector.name ?? decl.driver,
|
|
5449
|
+
access: decl.access,
|
|
5450
|
+
status: "connecting",
|
|
5451
|
+
mountPath: mountTarget,
|
|
5452
|
+
// Empty (not null) so a best-effort disconnect of a still-provisional
|
|
5453
|
+
// entry — e.g. a deferred mount that errored — finds no live handle and
|
|
5454
|
+
// returns cleanly instead of dereferencing null state.
|
|
5455
|
+
state: {}
|
|
5456
|
+
};
|
|
5457
|
+
this.active.set(decl.id, { connector, handle, declaration: decl });
|
|
5458
|
+
}
|
|
5459
|
+
/** Drive all deferred mounts concurrently; resolves when every one settles. */
|
|
5460
|
+
async connectDeferred(deferred) {
|
|
5461
|
+
await Promise.allSettled(
|
|
5462
|
+
deferred.map(({ decl, connector }) => this.connectDeferredOne(decl, connector))
|
|
5463
|
+
);
|
|
5464
|
+
}
|
|
5465
|
+
/**
|
|
5466
|
+
* Background-connect one deferred mount. On success `attemptConnect` swaps the
|
|
5467
|
+
* provisional entry for the real handle; on failure the provisional entry is
|
|
5468
|
+
* marked `error` so the mount path keeps rendering as "still syncing". If the
|
|
5469
|
+
* manager was disposed mid-flight, the connector that came up is torn down
|
|
5470
|
+
* immediately so no rclone process leaks.
|
|
5471
|
+
*/
|
|
5472
|
+
async connectDeferredOne(decl, connector) {
|
|
5473
|
+
if (this.disposed) return;
|
|
5474
|
+
const result = await this.attemptConnect(decl, connector);
|
|
5475
|
+
if (!result.connected) {
|
|
5476
|
+
const entry = this.active.get(decl.id);
|
|
5477
|
+
if (entry && entry.handle.status === "connecting") entry.handle.status = "error";
|
|
5478
|
+
return;
|
|
5479
|
+
}
|
|
5480
|
+
if (this.disposed && this.active.has(decl.id)) {
|
|
5481
|
+
await this.disconnect(decl.id).catch(() => {
|
|
5482
|
+
});
|
|
5483
|
+
}
|
|
5484
|
+
}
|
|
5485
|
+
/**
|
|
5486
|
+
* Resolve once every background (deferred) mount started by `connectAll` has
|
|
5487
|
+
* settled. Resolves immediately when none are in flight. Useful for tests and
|
|
5488
|
+
* for callers that want to await full readiness.
|
|
5489
|
+
*/
|
|
5490
|
+
async whenDeferredMountsSettled() {
|
|
5491
|
+
if (this.deferredConnect) await this.deferredConnect.catch(() => {
|
|
5492
|
+
});
|
|
5493
|
+
}
|
|
5355
5494
|
/** Disconnect all connectors and stop all watchers. Best-effort — ignores disconnect errors. */
|
|
5356
5495
|
async disconnectAll() {
|
|
5357
5496
|
this.mgrLog.info("disconnectAll start", { count: this.active.size });
|
|
5497
|
+
this.disposed = true;
|
|
5498
|
+
this.disposeController.abort();
|
|
5499
|
+
if (this.deferredConnect) {
|
|
5500
|
+
try {
|
|
5501
|
+
await this.deferredConnect;
|
|
5502
|
+
} catch {
|
|
5503
|
+
}
|
|
5504
|
+
this.deferredConnect = void 0;
|
|
5505
|
+
}
|
|
5358
5506
|
await this.unwatchAll();
|
|
5359
5507
|
for (const [id, entry] of this.active) {
|
|
5360
5508
|
try {
|
|
@@ -5507,6 +5655,10 @@ var ConnectorManager = class {
|
|
|
5507
5655
|
async runLifecycleHook(hook) {
|
|
5508
5656
|
const results = [];
|
|
5509
5657
|
for (const [id, entry] of this.active) {
|
|
5658
|
+
if (entry.handle.status !== "connected") {
|
|
5659
|
+
results.push({ id, ok: true });
|
|
5660
|
+
continue;
|
|
5661
|
+
}
|
|
5510
5662
|
const fn = entry.connector[hook];
|
|
5511
5663
|
if (!fn) {
|
|
5512
5664
|
results.push({ id, ok: true });
|
|
@@ -5547,7 +5699,10 @@ var ConnectorManager = class {
|
|
|
5547
5699
|
id,
|
|
5548
5700
|
driver: entry.connector.name,
|
|
5549
5701
|
access: entry.declaration.access,
|
|
5550
|
-
mountPath: entry.handle.mountPath
|
|
5702
|
+
mountPath: entry.handle.mountPath,
|
|
5703
|
+
// Surfaced so wire projections (splitConnectorsForWire) can distinguish a
|
|
5704
|
+
// still-connecting deferred mount from a fully-mounted one.
|
|
5705
|
+
status: entry.handle.status
|
|
5551
5706
|
}));
|
|
5552
5707
|
}
|
|
5553
5708
|
/**
|
|
@@ -5589,6 +5744,7 @@ var ConnectorManager = class {
|
|
|
5589
5744
|
const results = [];
|
|
5590
5745
|
for (const [id, entry] of this.active) {
|
|
5591
5746
|
if (!entry.connector.filesystem) continue;
|
|
5747
|
+
if (entry.handle.status !== "connected") continue;
|
|
5592
5748
|
try {
|
|
5593
5749
|
await entry.connector.filesystem.sync(entry.handle, options);
|
|
5594
5750
|
results.push({ id, ok: true });
|
|
@@ -7397,5 +7553,5 @@ function createConnector() {
|
|
|
7397
7553
|
}
|
|
7398
7554
|
|
|
7399
7555
|
export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, PostgresConnector, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createWorktree, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, parseAuthBlob2 as parseAuthBlob, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
|
|
7400
|
-
//# sourceMappingURL=chunk-
|
|
7401
|
-
//# sourceMappingURL=chunk-
|
|
7556
|
+
//# sourceMappingURL=chunk-XMP6XTMF.js.map
|
|
7557
|
+
//# sourceMappingURL=chunk-XMP6XTMF.js.map
|