@getbourdon/participants 0.1.0 → 0.2.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/dist/base.d.ts +7 -0
- package/dist/index.cjs +3292 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +649 -0
- package/dist/index.d.ts +13 -5
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -0
- package/dist/readers/cascade.d.ts +49 -0
- package/dist/readers/cascade.js +428 -0
- package/dist/readers/copilot-cli.d.ts +45 -0
- package/dist/readers/copilot-cli.js +416 -0
- package/dist/readers/copilot.d.ts +59 -0
- package/dist/readers/copilot.js +413 -0
- package/dist/readers/cursor.d.ts +50 -0
- package/dist/readers/cursor.js +670 -0
- package/dist/readers/openclaw.d.ts +78 -0
- package/dist/readers/openclaw.js +386 -0
- package/dist/registry.d.ts +4 -2
- package/dist/registry.js +14 -2
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/base.ts","../src/sqlite-base.ts","../src/network-base.ts","../src/readers/hermes.ts","../src/readers/claude-code.ts","../src/readers/github-copilot.ts","../src/readers/cursor.ts","../src/readers/copilot.ts","../src/readers/copilot-cli.ts","../src/readers/cascade.ts","../src/readers/openclaw.ts","../src/registry.ts"],"sourcesContent":["/**\n * @getbourdon/participants — the external-agent → L5 reader layer (BUSL-1.1).\n *\n * Each participant normalizes a foreign agent's native memory store into a\n * visibility-filtered, redacted L5 manifest. Reader categories:\n * - SQLite (read-only, better-sqlite3 mode=ro): {@link HermesParticipant},\n * {@link CursorParticipant}, {@link CopilotCliParticipant}\n * - file / convention: {@link ClaudeCodeParticipant},\n * {@link CopilotParticipant}, {@link CascadeParticipant}\n * - network (TTL cache + lazy AuthProvider): {@link GitHubCopilotParticipant}\n * - network + quarantined-class (handshake gate): {@link OpenClawParticipant}\n *\n * Four invariants enforced in code, not by trust: visibility-filter-before-\n * emission, deterministic exportL5, healthCheck never throws, redact every\n * native string. Discovery is a static registry ({@link discoverParticipants}).\n *\n * Python (`pip install bourdon`) is the oracle; this mirror asserts against the\n * @getbourdon/conformance `native_stores` fixtures (output shape only).\n * Still deferred: codex (the ~2.6k-line turn-compiler reader) lands in a\n * follow-on slice.\n */\n\n// Contract surface: Protocol interface, errors, AgentStore + HealthStatus.\nexport {\n CONTRACT_VERSION,\n SPEC_VERSION,\n ParticipantError,\n ParticipantDiscoveryError,\n ParticipantExportError,\n ParticipantVersionMismatchError,\n isParticipant,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"./base.js\";\n\n// SQLite read-only primitives.\nexport {\n sqliteAvailable,\n openReadonly,\n tryOpenReadonly,\n tableExists,\n tableColumns,\n epochToIsoDate,\n epochToIsoDatetime,\n projectKeyFromCwd,\n friendlyLabel,\n type OpenReadonlyOptions,\n type SqliteDatabase,\n} from \"./sqlite-base.js\";\n\n// Network base: TTL cache, AuthProvider, degrade-to-stale-cache, auth boundary.\nexport {\n NETWORK_CONTRACT_VERSION,\n DEFAULT_CACHE_TTL_SECONDS,\n NetworkUnavailable,\n ParticipantAuthError,\n NetworkParticipant,\n PayloadCache,\n CacheEntry,\n envAuthProvider,\n defaultCacheRoot,\n type AuthProvider,\n type NetworkParticipantOptions,\n} from \"./network-base.js\";\n\n// Readers.\nexport { HermesParticipant } from \"./readers/hermes.js\";\nexport { ClaudeCodeParticipant } from \"./readers/claude-code.js\";\nexport { GitHubCopilotParticipant, ghTokenProvider } from \"./readers/github-copilot.js\";\nexport { CursorParticipant } from \"./readers/cursor.js\";\nexport { CopilotParticipant } from \"./readers/copilot.js\";\nexport { CopilotCliParticipant } from \"./readers/copilot-cli.js\";\nexport { CascadeParticipant } from \"./readers/cascade.js\";\nexport {\n OpenClawParticipant,\n OpenClawApiClient,\n verifyInstance,\n MIN_PATCHED_VERSION,\n} from \"./readers/openclaw.js\";\n\n// Discovery (static registry).\nexport {\n FIRST_PARTY,\n discoverParticipants,\n resolvePluginParticipants,\n type ParticipantCtor,\n} from \"./registry.js\";\n\n// Re-exported from @getbourdon/l5 for convenience (the L5 model + serialization\n// the readers build on; only this output shape is the parity contract).\nexport {\n Visibility,\n applyVisibility,\n filterForFederation,\n toDict,\n validateManifest,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\n","/**\n * Bourdon participant base — the Protocol → TS interface, errors, and the\n * AgentStore / HealthStatus types. Faithful port of `participants/base.py`.\n *\n * The L5 dataclass model (AgentInfo/Entity/Session/VisibilityPolicy/L5Manifest),\n * the `toDict` omission rules, and the visibility helpers all live in\n * `@getbourdon/l5` and are reused verbatim — only THAT output shape is the parity\n * contract. This module owns the participant CONTRACT surface around them.\n *\n * Contract semantics (enforced by every reader, asserted by the conformance\n * fixtures, never by trust):\n * 1. visibility filter BEFORE emission (`filterForFederation`) — private wins.\n * 2. deterministic / idempotent `exportL5` — same store → identical `toDict`.\n * 3. `healthCheck` NEVER throws — catch-all → degraded/blocked.\n * 4. every native string through `@getbourdon/redaction` before it enters L5.\n */\n\nimport type { L5ManifestModel, SessionModel } from \"@getbourdon/l5\";\n\n/** Tied to Bourdon spec v0.1 — same literals as the Python oracle. */\nexport const CONTRACT_VERSION = \"0.1\";\nexport const SPEC_VERSION = \"0.1\";\n\n// -- Errors -------------------------------------------------------------------\n\n/** Base class for participant errors. */\nexport class ParticipantError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\n/** Raised by `discover()` when the native store cannot be found or read.\n * Non-fatal: L6 skips this agent rather than aborting the whole export. */\nexport class ParticipantDiscoveryError extends ParticipantError {}\n\n/** Raised by `exportL5()` / `exportSessions()` when an export fails mid-op\n * (the store WAS present — distinct from a discovery miss). */\nexport class ParticipantExportError extends ParticipantError {}\n\n/** Raised when the native store's version is outside the supported range.\n * Subtype of discovery error (a version mismatch is a discovery-time miss). */\nexport class ParticipantVersionMismatchError extends ParticipantDiscoveryError {}\n\n// -- Data types ---------------------------------------------------------------\n\n/** Metadata describing the native agent store. Returned by `discover()`. */\nexport interface AgentStore {\n path: string;\n version: string;\n metadata: Record<string, unknown>;\n}\n\n/** Returned by `healthCheck()`. Consumed by the `bourdon doctor` CLI. */\nexport interface HealthStatus {\n status: \"ok\" | \"degraded\" | \"blocked\";\n reason?: string;\n details: Record<string, unknown>;\n /** A human-runnable command to remedy a non-ok status. */\n proposedFix?: string;\n}\n\n// -- Protocol -----------------------------------------------------------------\n\n/**\n * Structural interface every participant must satisfy (the Python\n * `@runtime_checkable Protocol`). Duck-typed at registration: a class is a\n * participant iff it has `agentId` + `agentType` + `exportL5` + `healthCheck`.\n *\n * Optional members (`displayName`, a `defaultNativePath` static) are documented\n * here as in the Python Protocol; discovery + the setup wizard fall back to\n * sensible defaults when absent.\n */\nexport interface BourdonParticipant {\n agentId: string;\n agentType: string;\n nativePath: string;\n\n /** Human-friendly label (e.g. \"GitHub Copilot\"). Optional. */\n displayName?: string;\n\n /** Quarantined-class marker (Python `QUARANTINED_CLASS`). When true, the CLI\n * requires `--i-understand-the-risk` to register the agent trusted, and its\n * exports are staged for operator review rather than written to the live\n * store (spec D6: quarantine follows the content, not the invoker). Absent =\n * a normal, non-quarantined participant. Read by `bourdon agent add/set-tier`\n * (cli/src/commands/federation.ts). */\n quarantinedClass?: boolean;\n\n /** Confirm the native store exists; return metadata. Throws\n * {@link ParticipantDiscoveryError} when missing/unreadable. */\n discover(): AgentStore;\n\n /** Build the L5 manifest from native memory, applying the visibility filter\n * BEFORE return. Deterministic — same store yields the same manifest. */\n exportL5(since?: Date): L5ManifestModel;\n\n /** Export recent sessions in normalized schema. */\n exportSessions(since?: Date, limit?: number): SessionModel[];\n\n /** Return ok / degraded / blocked with a reason. MUST NOT throw. */\n healthCheck(): HealthStatus;\n}\n\n/**\n * Tiny structural guard mirroring Python's `_PARTICIPANT_MARKER_ATTRS`\n * duck-type: a value is a participant iff it carries the four marker members.\n */\nexport function isParticipant(obj: unknown): obj is BourdonParticipant {\n if (obj === null || typeof obj !== \"object\") return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o[\"agentId\"] === \"string\" &&\n typeof o[\"agentType\"] === \"string\" &&\n typeof o[\"exportL5\"] === \"function\" &&\n typeof o[\"healthCheck\"] === \"function\"\n );\n}\n","/**\n * Shared read-only SQLite + normalization helpers — port of\n * `participants/_sqlite_base.py`.\n *\n * A SQLite-backed participant (hermes today; cursor/copilot_cli in the follow-on\n * slice) reads a foreign agent's native DB read-only so a live writer's lock can\n * never block the export, probes the schema defensively (native schemas drift\n * across versions), and turns epoch timestamps + paths into the L5 shapes.\n *\n * `better-sqlite3` is a NATIVE addon. It is loaded lazily through `createRequire`\n * inside a try/catch so this package — and the file/network readers — keep\n * working even on a toolchain where the addon failed to build: in that case\n * {@link sqliteAvailable} returns false and the sqlite readers degrade rather\n * than crashing import. Nothing here applies visibility or builds manifests;\n * that stays in the participant (per PARTICIPANT_CONTRACT.md).\n */\n\nimport { statSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\n\nimport type DatabaseT from \"better-sqlite3\";\n\n/** A better-sqlite3 connection (re-exported type alias for reader signatures). */\nexport type SqliteDatabase = DatabaseT.Database;\n\n// `import.meta.url` in ESM; esbuild empties it in the CJS bundle, where the\n// native `__filename` global is the real path — fall back to it so createRequire\n// resolves better-sqlite3 from either module format.\ndeclare const __filename: string | undefined;\nconst moduleUrl =\n (typeof import.meta !== \"undefined\" && import.meta.url) ||\n (typeof __filename !== \"undefined\" ? __filename : process.cwd());\nconst nodeRequire = createRequire(moduleUrl);\n\nlet driver: typeof DatabaseT | null | undefined;\n\n/** Lazily resolve the better-sqlite3 constructor, or null if the addon is\n * unavailable (failed native build). Cached after the first attempt. */\nfunction loadDriver(): typeof DatabaseT | null {\n if (driver !== undefined) return driver;\n try {\n driver = nodeRequire(\"better-sqlite3\") as typeof DatabaseT;\n } catch {\n driver = null;\n }\n return driver;\n}\n\n/** True when the better-sqlite3 native addon loaded successfully. Tests gate\n * the SQLite-reader assertions on this so a missing addon skips, not fails. */\nexport function sqliteAvailable(): boolean {\n return loadDriver() !== null;\n}\n\nexport interface OpenReadonlyOptions {\n /** `immutable=1`: skip locks + ignore the WAL. Only for genuinely static\n * snapshots; against a live writer it risks stale reads / SQLITE_CORRUPT. */\n immutable?: boolean;\n /** SQLite busy-timeout in milliseconds (Python's `timeout=2.0` seconds). */\n timeoutMs?: number;\n}\n\n// -- Read-only connection -----------------------------------------------------\n\n/**\n * Open a SQLite DB read-only so a live writer is never disturbed. The default\n * (`immutable` omitted) is the safe `mode=ro`: it respects SQLite locking and\n * reads the `-wal` sidecar of a live, actively-writing agent. Raises on a\n * genuine open failure; callers wanting the never-raises contract use\n * {@link tryOpenReadonly}.\n */\nexport function openReadonly(dbPath: string, opts: OpenReadonlyOptions = {}): SqliteDatabase {\n const Ctor = loadDriver();\n if (!Ctor) {\n throw new Error(\"better-sqlite3 native addon is not available\");\n }\n // better-sqlite3 maps `{readonly:true}` to SQLITE_OPEN_READONLY. There is no\n // first-class `immutable=1` knob; for our static snapshots `readonly` is\n // sufficient (we never open a concurrently-written fixture DB).\n return new Ctor(dbPath, {\n readonly: true,\n fileMustExist: true,\n timeout: opts.timeoutMs ?? 2000,\n });\n}\n\n/**\n * Like {@link openReadonly} but returns null instead of raising — for the\n * export/health path where a missing or corrupt DB must degrade to \"no rows\".\n */\nexport function tryOpenReadonly(\n dbPath: string,\n opts: OpenReadonlyOptions = {},\n): SqliteDatabase | null {\n try {\n if (!statSync(dbPath).isFile()) return null;\n } catch {\n return null;\n }\n try {\n return openReadonly(dbPath, opts);\n } catch {\n return null;\n }\n}\n\n// -- Defensive schema probes --------------------------------------------------\n\n/** True if `name` is a table in the connected DB (swallows errors → false). */\nexport function tableExists(db: SqliteDatabase, name: string): boolean {\n try {\n const row = db\n .prepare(\"SELECT 1 FROM sqlite_master WHERE type='table' AND name=? LIMIT 1\")\n .get(name);\n return row !== undefined;\n } catch {\n return false;\n }\n}\n\n/** Column names for `table` (empty set if absent / on error). PRAGMA cannot be\n * parameterized, matching the Python f-string. */\nexport function tableColumns(db: SqliteDatabase, table: string): Set<string> {\n try {\n const rows = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n return new Set(rows.map((r) => r.name));\n } catch {\n return new Set<string>();\n }\n}\n\n// -- Normalization ------------------------------------------------------------\n\nfunction toFiniteNumber(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Convert epoch seconds (number/string) to an ISO `YYYY-MM-DD` UTC date, or\n * null for missing/unparseable values. Mirrors `epoch_to_iso_date`.\n */\nexport function epochToIsoDate(value: unknown): string | null {\n const n = toFiniteNumber(value);\n if (n === null) return null;\n const d = new Date(n * 1000);\n if (Number.isNaN(d.getTime())) return null;\n return d.toISOString().slice(0, 10);\n}\n\n/**\n * Convert epoch seconds to a full ISO 8601 UTC datetime, or null. The offset is\n * rendered `+00:00` (Python `datetime(...).isoformat()` style) rather than `Z`.\n */\nexport function epochToIsoDatetime(value: unknown): string | null {\n const n = toFiniteNumber(value);\n if (n === null) return null;\n const d = new Date(n * 1000);\n if (Number.isNaN(d.getTime())) return null;\n return d.toISOString().replace(/\\.\\d{3}Z$/, \"+00:00\").replace(/Z$/, \"+00:00\");\n}\n\nfunction basenameOf(p: string): string {\n const trimmed = p.replace(/[\\\\/]+$/, \"\");\n const parts = trimmed.split(/[\\\\/]/);\n return parts[parts.length - 1] ?? \"\";\n}\n\n/**\n * Derive a lowercase project key from a working-directory path: the basename\n * lowercased, or null when the cwd is empty or its basename is \"generic\"\n * (carries no project identity). Mirrors `project_key_from_cwd`.\n */\nexport function projectKeyFromCwd(\n cwd: string | null | undefined,\n genericNames: ReadonlySet<string> = new Set(),\n): string | null {\n if (!cwd) return null;\n const name = basenameOf(cwd).trim().toLowerCase();\n if (!name || genericNames.has(name)) return null;\n return name;\n}\n\n/** Turn a slug-ish key (`my-cool_project`) into a Title Case label. */\nexport function friendlyLabel(key: string): string {\n return key\n .replace(/[-_]+/g, \" \")\n .trim()\n .replace(/\\S+/g, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());\n}\n","/**\n * Network-shaped participant base — port of `participants/_network_base.py`\n * (v0.3 adapter contract). Same `exportL5` / `exportSessions` half as a file\n * participant; only the discovery half differs (fetch from an authenticated\n * API). The base provides the three guarantees so adapters don't reimplement:\n *\n * 1. Local TTL cache under `~/.cache/bourdon/<slug>/payload.json` storing ONLY\n * `{fetched_at, payload}` — NEVER the token. A cache hit = zero network.\n * 2. Graceful degradation: network down → serve the most recent cached payload\n * (even expired) and report `degraded` (not silence).\n * 3. Auth boundary: an injected lazy {@link AuthProvider} (env / keychain).\n * An invalid token (401/403 non-ratelimit) ALWAYS propagates as `blocked`\n * and is NEVER masked by stale cache; a missing token serves stale when a\n * cache exists, else blocks; rate-limit degrades.\n *\n * A subclass sets `participantSlug` / `agentId` / `agentType` (+ `nativePath`)\n * and implements `fetchPayload(token)` + `payloadToL5(payload)` (pure, no I/O).\n */\n\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { L5ManifestModel, SessionModel } from \"@getbourdon/l5\";\n\nimport {\n ParticipantError,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"./base.js\";\n\nexport const NETWORK_CONTRACT_VERSION = \"0.3\";\n/** Default cache TTL — adapters override via `cacheTtlSeconds`. */\nexport const DEFAULT_CACHE_TTL_SECONDS = 15 * 60; // 15 minutes\n\n// -- Network-specific errors --------------------------------------------------\n\n/** Transport failure / timeout / 5xx / rate-limit — recoverable via cache fallback. */\nexport class NetworkUnavailable extends ParticipantError {}\n\n/** 401/403 / missing credential — NOT recoverable via cache. The user must fix\n * auth; surfaced as `blocked`, never silently served from stale cache (stale\n * data would mask a broken token indefinitely). */\nexport class ParticipantAuthError extends ParticipantError {}\n\n// -- Auth provider ------------------------------------------------------------\n\n/** A zero-arg callable returning the token string, or null if no credential is\n * available. Kept a callable (not a bare string) so the token is fetched lazily\n * at call time and never sits in the participant's fields or the cache. */\nexport type AuthProvider = () => string | null;\n\n/** Auth provider that reads a token from an environment variable. */\nexport function envAuthProvider(varName: string): AuthProvider {\n return () => process.env[varName] || null;\n}\n\n// -- Cache --------------------------------------------------------------------\n\n/** `$XDG_CACHE_HOME/bourdon` or `~/.cache/bourdon`. */\nexport function defaultCacheRoot(): string {\n const xdg = process.env.XDG_CACHE_HOME;\n const base = xdg ? xdg : join(homedir(), \".cache\");\n return join(base, \"bourdon\");\n}\n\n/** A cached payload + the wall-clock time it was fetched (epoch seconds). */\nexport class CacheEntry {\n constructor(\n readonly fetchedAt: number,\n readonly payload: Record<string, unknown>,\n ) {}\n\n get ageSeconds(): number {\n return Math.max(0, Date.now() / 1000 - this.fetchedAt);\n }\n\n isFresh(ttlSeconds: number): boolean {\n return this.ageSeconds < ttlSeconds;\n }\n}\n\n/**\n * A tiny JSON file cache, one file per participant slug. Stores only\n * `{fetched_at, payload}` — never the auth token. Read/write are best-effort: a\n * corrupt or unwritable cache degrades to \"no cache\", never raises.\n */\nexport class PayloadCache {\n readonly slug: string;\n readonly root: string;\n readonly path: string;\n\n constructor(slug: string, rootDir?: string) {\n this.slug = slug;\n this.root = join(rootDir ?? defaultCacheRoot(), slug);\n this.path = join(this.root, \"payload.json\");\n }\n\n read(): CacheEntry | null {\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(this.path, \"utf8\"));\n } catch {\n return null;\n }\n if (typeof raw !== \"object\" || raw === null || !(\"payload\" in raw)) return null;\n const obj = raw as Record<string, unknown>;\n let fetchedAt = Number(obj[\"fetched_at\"] ?? 0);\n if (!Number.isFinite(fetchedAt)) fetchedAt = 0;\n const payload = obj[\"payload\"];\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) return null;\n return new CacheEntry(fetchedAt, payload as Record<string, unknown>);\n }\n\n write(payload: Record<string, unknown>): void {\n try {\n mkdirSync(this.root, { recursive: true });\n const tmp = `${this.path}.tmp`;\n writeFileSync(tmp, JSON.stringify({ fetched_at: Date.now() / 1000, payload }), \"utf8\");\n renameSync(tmp, this.path); // atomic\n } catch {\n /* best-effort; a write failure degrades to \"no cache\" */\n }\n }\n}\n\nexport interface NetworkParticipantOptions {\n authProvider?: AuthProvider | null;\n cacheRoot?: string;\n}\n\n// -- Base participant ---------------------------------------------------------\n\n/**\n * Base for participants whose native state lives behind an authenticated API.\n * Caching, degradation, the auth boundary, and the\n * `discover`/`exportL5`/`exportSessions`/`healthCheck` plumbing live here;\n * subclasses provide only `fetchPayload` + `payloadToL5`.\n */\nexport abstract class NetworkParticipant implements BourdonParticipant {\n participantSlug = \"network\";\n agentId = \"network\";\n agentType = \"other\";\n cacheTtlSeconds: number = DEFAULT_CACHE_TTL_SECONDS;\n nativePath = \"network://\";\n\n protected readonly authProvider: AuthProvider | null;\n private readonly cacheRoot?: string;\n private cacheInstance?: PayloadCache;\n\n constructor(opts: NetworkParticipantOptions = {}) {\n this.authProvider = opts.authProvider ?? null;\n this.cacheRoot = opts.cacheRoot;\n }\n\n /** Lazily built so it reads the SUBCLASS's `participantSlug` — subclass field\n * initializers run after `super()`, so building the cache in the constructor\n * would capture the base \"network\" slug instead. */\n protected get cache(): PayloadCache {\n if (!this.cacheInstance) {\n this.cacheInstance = new PayloadCache(this.participantSlug, this.cacheRoot);\n }\n return this.cacheInstance;\n }\n\n // -- Subclass hooks ---------------------------------------------------------\n\n /** Do the authenticated API call; return a JSON-serializable dict. Raise\n * {@link NetworkUnavailable} on transport/5xx/rate-limit (→ cache fallback) or\n * {@link ParticipantAuthError} on 401/403 (→ blocked, no fallback). */\n abstract fetchPayload(token: string): Record<string, unknown>;\n\n /** Normalize a (fresh or cached) payload into an L5 manifest. Pure, no I/O. */\n abstract payloadToL5(payload: Record<string, unknown>): L5ManifestModel;\n\n // -- Core fetch-with-cache-and-degrade -------------------------------------\n\n /**\n * Resolve (payload, source) where source is 'cache' | 'network' | 'stale-cache'.\n * 1. Fresh cache hit → 'cache' (no network)\n * 2. Miss/expired + token → 'network' (fetch + refresh cache)\n * 3. Net fails + any cache → 'stale-cache' (serve last good payload)\n * 4. Net fails + no cache → raise\n * Auth errors are never swallowed — they propagate so health surfaces\n * 'blocked' rather than serving stale data behind a dead token.\n */\n protected getPayload(): { payload: Record<string, unknown>; source: string } {\n const cached = this.cache.read();\n if (cached !== null && cached.isFresh(this.cacheTtlSeconds)) {\n return { payload: cached.payload, source: \"cache\" };\n }\n\n const token = this.authProvider ? this.authProvider() : null;\n if (!token) {\n // No credential: if we have any cache, serve it stale; else blocked.\n if (cached !== null) return { payload: cached.payload, source: \"stale-cache\" };\n throw new ParticipantAuthError(\n `${this.participantSlug}: no auth token available and no cache`,\n );\n }\n\n let payload: Record<string, unknown>;\n try {\n payload = this.fetchPayload(token);\n } catch (err) {\n if (err instanceof ParticipantAuthError) throw err; // never mask a bad token\n if (err instanceof NetworkUnavailable) {\n if (cached !== null) return { payload: cached.payload, source: \"stale-cache\" };\n throw err;\n }\n throw err;\n }\n\n this.cache.write(payload);\n return { payload, source: \"network\" };\n }\n\n // -- Participant protocol ---------------------------------------------------\n\n discover(): AgentStore {\n const { source } = this.getPayload();\n return {\n path: this.nativePath,\n version: `${this.participantSlug}-network-v1`,\n metadata: { source, contract_version: NETWORK_CONTRACT_VERSION },\n };\n }\n\n exportL5(_since?: Date): L5ManifestModel {\n const { payload } = this.getPayload();\n return this.payloadToL5(payload);\n }\n\n exportSessions(since?: Date, limit = 100): SessionModel[] {\n const manifest = this.exportL5(since);\n let sessions = manifest.recent_sessions ?? [];\n if (since) {\n const cutoff = since.toISOString().slice(0, 10);\n sessions = sessions.filter((s) => (s.date || \"\") >= cutoff);\n }\n return sessions.slice(0, limit);\n }\n\n healthCheck(): HealthStatus {\n let source: string;\n try {\n source = this.getPayload().source;\n } catch (err) {\n if (err instanceof ParticipantAuthError) {\n return {\n status: \"blocked\",\n reason: String(err.message),\n details: { participant: this.participantSlug },\n proposedFix:\n `Provide a valid credential for ${this.participantSlug} ` +\n \"(see the adapter docs for the auth path) and re-run `bourdon export-all`.\",\n };\n }\n if (err instanceof NetworkUnavailable) {\n return {\n status: \"degraded\",\n reason: `network unavailable and no cache: ${err.message}`,\n details: { participant: this.participantSlug },\n proposedFix: \"Check connectivity, then re-run `bourdon export-all`.\",\n };\n }\n // Defense in depth: health_check must NEVER raise. An adapter's\n // fetchPayload should only raise the two contract errors; anything else is\n // reported as blocked rather than propagated.\n return {\n status: \"blocked\",\n reason: `unexpected error resolving payload: ${String(err)}`,\n details: { participant: this.participantSlug },\n proposedFix:\n `${this.participantSlug} raised an unexpected error during healthCheck; ` +\n \"its fetchPayload should only raise ParticipantAuthError / NetworkUnavailable.\",\n };\n }\n\n const cached = this.cache.read();\n const details: Record<string, unknown> = { participant: this.participantSlug, source };\n if (cached !== null) {\n details[\"cache_age_seconds\"] = Math.round(cached.ageSeconds * 10) / 10;\n details[\"cache_fetched_at\"] = new Date(cached.fetchedAt * 1000)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, \"+00:00\");\n }\n if (source === \"stale-cache\") {\n return {\n status: \"degraded\",\n reason: \"serving stale cache (network unavailable or no token)\",\n details,\n proposedFix: \"Restore connectivity / refresh the token to update.\",\n };\n }\n return { status: \"ok\", details };\n }\n}\n","/**\n * Hermes participant — normalize Hermes Agent (Nous Research) memory + sessions\n * into L5. Port of `participants/hermes.py`.\n *\n * Reads two surfaces under `~/.hermes/` (override `$HERMES_HOME`):\n * * `state.db` — a SQLite store (`sessions` + `messages` tables). Recent\n * non-archived sessions + project entities (from cwd basename) come from it.\n * * `memories/{memory.md,user.md}` — durable cross-session facts (one\n * Markdown bullet/line per memory). The highest-signal entities.\n *\n * Read-only (`mode=ro`), deterministic, visibility-enforced-before-emission,\n * and redaction on every native string. `healthCheck` never throws; `discover`\n * raises only {@link ParticipantDiscoveryError}.\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { redactText } from \"@getbourdon/redaction\";\n\nimport {\n CONTRACT_VERSION,\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\nimport {\n epochToIsoDate,\n friendlyLabel,\n projectKeyFromCwd,\n tableColumns,\n tableExists,\n tryOpenReadonly,\n type SqliteDatabase,\n} from \"../sqlite-base.js\";\n\nconst AGENT_ID = \"hermes\";\nconst AGENT_TYPE = \"code-assistant\";\nconst DISPLAY_NAME = \"Hermes Agent\";\nconst ROLE_NARRATIVE =\n \"General-purpose tool-calling assistant (Nous Research). Operates across CLI, \" +\n \"TUI, and messaging gateways (Slack/Telegram/Discord/WhatsApp); runs terminal, \" +\n \"file, web, and delegation toolsets. Carries durable cross-session memory and a \" +\n \"curated skill library. Federates session + memory context, not vendor account.\";\n\nconst DEFAULT_SESSION_LIMIT = 100;\n\n/** Hermes memory stores live as Markdown under `~/.hermes/memories/`. */\nconst MEMORY_FILENAMES = [\"memory.md\", \"user.md\"] as const;\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.TEAM,\n private_tags: [\"personal\", \"financial\", \"credential\", \"secret\", \"health\", \"family\", \"legal\"],\n team_tags: [\"hermes-memory\", \"hermes-session\", \"hermes-project\"],\n});\n\n/** cwd basenames that carry no project identity. */\nconst GENERIC_PROJECT_NAMES = new Set([\n \"\",\n \"root\",\n \"home\",\n \"tmp\",\n \"temp\",\n \"desktop\",\n \"documents\",\n \"downloads\",\n \"src\",\n]);\n\n// -- Path resolution ----------------------------------------------------------\n\n/**\n * Conventional Hermes home used by the setup wizard's detection.\n * Precedence: explicit `home` > `$HERMES_HOME` > `~/.hermes`.\n */\nexport function defaultNativePath(home?: string): string {\n if (home) return join(home, \".hermes\");\n const env = process.env.HERMES_HOME;\n if (env) return env;\n return join(homedir(), \".hermes\");\n}\n\nfunction isDir(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(p: string): boolean {\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\n// -- Text helpers -------------------------------------------------------------\n\ninterface SessionRecord {\n id: string;\n source: string;\n model: unknown;\n title: string | null;\n cwd: string | null;\n date: string;\n messageCount: number;\n toolCallCount: number;\n}\n\n/** Redact secrets, collapse whitespace, and clamp length. */\nfunction bounded(value: string, limit = 240): string {\n const cleaned = redactText((value || \"\").replace(/\\s+/g, \" \").trim(), limit);\n return cleaned.trim();\n}\n\nfunction projectKey(cwd: string | null | undefined): string | null {\n return projectKeyFromCwd(cwd, GENERIC_PROJECT_NAMES);\n}\n\n// -- SQLite (read-only) -------------------------------------------------------\n\n/** Pull recent, non-archived sessions newest-first. Never raises. */\nfunction collectSessionRows(stateDb: string, limit = DEFAULT_SESSION_LIMIT): SessionRecord[] {\n if (!isFile(stateDb)) return [];\n const conn = tryOpenReadonly(stateDb);\n if (!conn) return [];\n const out: SessionRecord[] = [];\n try {\n if (!tableExists(conn, \"sessions\")) return [];\n // `archived` may be absent in older schemas — guard the column.\n const cols = tableColumns(conn, \"sessions\");\n const archivedClause = cols.has(\"archived\") ? \"WHERE COALESCE(archived, 0) = 0\" : \"\";\n const rows = conn\n .prepare(\n `SELECT id, source, model, title, cwd, started_at, ended_at,\n message_count, tool_call_count\n FROM sessions\n ${archivedClause}\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(limit) as Array<Record<string, unknown>>;\n for (const r of rows) {\n const day = epochToIsoDate(r[\"started_at\"]);\n if (!day) continue;\n out.push({\n id: String(r[\"id\"]),\n source: String(r[\"source\"] ?? \"\").toLowerCase(),\n model: r[\"model\"],\n title: (r[\"title\"] as string | null) ?? null,\n cwd: (r[\"cwd\"] as string | null) ?? null,\n date: day,\n messageCount: Number(r[\"message_count\"] ?? 0) || 0,\n toolCallCount: Number(r[\"tool_call_count\"] ?? 0) || 0,\n });\n }\n } catch {\n /* degrade to whatever rows we gathered */\n } finally {\n conn.close();\n }\n return out;\n}\n\n/** Distinct tool names used in a session, for key_actions evidence. */\nfunction toolNamesForSession(conn: SqliteDatabase, sessionId: string): string[] {\n if (!tableExists(conn, \"messages\")) return [];\n try {\n const rows = conn\n .prepare(\n `SELECT DISTINCT tool_name FROM messages\n WHERE session_id = ? AND tool_name IS NOT NULL AND tool_name != ''`,\n )\n .all(sessionId) as Array<{ tool_name: string }>;\n const names = new Set<string>();\n for (const r of rows) {\n if (r.tool_name) names.add(r.tool_name);\n }\n return [...names].sort();\n } catch {\n return [];\n }\n}\n\n// -- Memory parsing -----------------------------------------------------------\n\nconst BULLET_RE = /^\\s*[-*]\\s+(.*)$/;\n\n/** Return memory entries (one per bullet / non-empty line). Never raises. */\nfunction parseMemoryFile(path: string): string[] {\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n return [];\n }\n const entries: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n const m = BULLET_RE.exec(line);\n const candidate = m ? (m[1] ?? \"\") : line.trim();\n if (candidate && !candidate.startsWith(\"#\")) entries.push(candidate);\n }\n return entries;\n}\n\n/** Map memory store name → list of entry strings. */\nfunction collectMemoryEntries(home: string): Array<[string, string[]]> {\n const memDir = join(home, \"memories\");\n const result: Array<[string, string[]]> = [];\n if (!isDir(memDir)) return result;\n for (const fname of MEMORY_FILENAMES) {\n const path = join(memDir, fname);\n if (isFile(path)) {\n const entries = parseMemoryFile(path);\n if (entries.length) {\n const stem = fname.replace(/\\.md$/, \"\");\n result.push([stem, entries]);\n }\n }\n }\n return result;\n}\n\n// -- Entity / session builders ------------------------------------------------\n\nfunction buildSession(record: SessionRecord, toolNames: string[]): SessionModel {\n const key = projectKey(record.cwd);\n const focus: string[] = [];\n if (key) focus.push(key);\n const keyActions: string[] = [];\n if (record.title) keyActions.push(bounded(record.title, 160));\n if (toolNames.length) {\n keyActions.push(\"Tools: \" + toolNames.slice(0, 8).join(\", \"));\n } else if (record.toolCallCount) {\n keyActions.push(`${record.toolCallCount} tool call(s)`);\n }\n return makeSession({\n date: record.date,\n cwd: record.cwd || undefined,\n project_focus: focus,\n key_actions: keyActions,\n visibility: Visibility.TEAM,\n });\n}\n\n/** Turn a single memory line into a team-visibility entity. */\nfunction memoryEntity(store: string, entry: string): EntityModel {\n const tag = store === \"user\" ? \"hermes-user-memory\" : \"hermes-memory\";\n return makeEntity({\n name: bounded(entry, 80),\n type: store === \"user\" ? \"preference\" : \"fact\",\n summary: bounded(entry, 240),\n tags: [tag],\n visibility: Visibility.TEAM,\n });\n}\n\nfunction projectEntities(records: SessionRecord[]): EntityModel[] {\n const counts = new Map<string, number>();\n for (const r of records) {\n const key = projectKey(r.cwd);\n if (key) counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n const entities: EntityModel[] = [];\n for (const [key, count] of counts) {\n let last: string | undefined;\n for (const r of records) {\n if (projectKey(r.cwd) === key) {\n if (last === undefined || r.date > last) last = r.date;\n }\n }\n entities.push(\n makeEntity({\n name: friendlyLabel(key),\n type: \"project\",\n summary: `Workspace observed across ${count} Hermes session(s).`,\n aliases: [key],\n last_touched: last,\n tags: [\"hermes-project\"],\n visibility: Visibility.TEAM,\n }),\n );\n }\n return entities;\n}\n\n// -- Participant --------------------------------------------------------------\n\n/** External participant for local Hermes Agent memory + sessions. */\nexport class HermesParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n displayName = DISPLAY_NAME;\n nativePath: string;\n\n private readonly home: string | null;\n\n static defaultNativePath(home?: string): string {\n return defaultNativePath(home);\n }\n\n /** `hermesHome` is the `.hermes` directory itself (matching the Python ctor). */\n constructor(hermesHome?: string) {\n if (hermesHome) {\n this.home = hermesHome;\n } else {\n const path = defaultNativePath();\n this.home = isDir(path) ? path : null;\n }\n this.nativePath = this.home ?? join(homedir(), \".hermes\");\n }\n\n private sources(): Record<string, string | null> {\n const home = this.home;\n const stateDb = home ? join(home, \"state.db\") : null;\n const memDir = home ? join(home, \"memories\") : null;\n const skillsDir = home ? join(home, \"skills\") : null;\n return {\n hermes_home: home,\n state_db: stateDb && isFile(stateDb) ? stateDb : null,\n memories_dir: memDir && isDir(memDir) ? memDir : null,\n skills_dir: skillsDir && isDir(skillsDir) ? skillsDir : null,\n };\n }\n\n discover(): AgentStore {\n const sources = this.sources();\n if (!Object.values(sources).some((v) => v)) {\n throw new ParticipantDiscoveryError(\n \"No Hermes memory sources found. Expected ~/.hermes/ (set $HERMES_HOME to override).\",\n );\n }\n if (!sources[\"state_db\"] && !sources[\"memories_dir\"]) {\n throw new ParticipantDiscoveryError(\n `Hermes home '${this.nativePath}' exists but has no state.db or memories/ — ` +\n \"nothing to federate yet.\",\n );\n }\n return {\n path: this.nativePath,\n version: \"hermes-home-v1\",\n metadata: { sources },\n };\n }\n\n exportSessions(since?: Date, limit = DEFAULT_SESSION_LIMIT): SessionModel[] {\n if (this.home === null) return [];\n const stateDb = join(this.home, \"state.db\");\n const cutoff = since ? since.toISOString().slice(0, 10) : null;\n const records = collectSessionRows(stateDb, limit);\n if (!records.length) return [];\n const conn = tryOpenReadonly(stateDb);\n const out: SessionModel[] = [];\n try {\n for (const rec of records) {\n if (cutoff && rec.date < cutoff) continue;\n const tools = conn ? toolNamesForSession(conn, rec.id) : [];\n out.push(buildSession(rec, tools));\n }\n } finally {\n if (conn) conn.close();\n }\n return out;\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const store = this.discover();\n const sources = (store.metadata[\"sources\"] ?? {}) as Record<string, string | null>;\n const capabilities = Object.entries(sources)\n .filter(([k, v]) => v && k !== \"hermes_home\")\n .map(([k]) => k)\n .sort();\n\n const home = this.home;\n const records = home ? collectSessionRows(join(home, \"state.db\"), DEFAULT_SESSION_LIMIT) : [];\n\n // Entities: project workspaces + memory-derived facts/preferences.\n const entities: EntityModel[] = projectEntities(records);\n const seen = new Set<string>();\n for (const e of entities) {\n seen.add(`${e.type || \"topic\"}\u0000${e.name.toLowerCase()}`);\n }\n if (home) {\n for (const [storeName, entries] of collectMemoryEntries(home)) {\n for (const entry of entries) {\n const ent = memoryEntity(storeName, entry);\n const key = `${ent.type || \"topic\"}\u0000${ent.name.toLowerCase()}`;\n if (seen.has(key)) continue;\n seen.add(key);\n entities.push(ent);\n }\n }\n }\n\n // Visibility enforced here, before emission (contract requirement).\n const visible = filterForFederation(entities, DEFAULT_POLICY);\n\n const sessions = this.exportSessions(\n since ?? new Date(0),\n DEFAULT_SESSION_LIMIT,\n );\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: this.agentId,\n type: this.agentType,\n role_narrative: ROLE_NARRATIVE,\n spec_version_compat: CONTRACT_VERSION,\n }),\n last_updated: new Date().toISOString(),\n capabilities,\n recent_sessions: sessions,\n known_entities: visible,\n visibility_policy: DEFAULT_POLICY,\n });\n }\n\n healthCheck(): HealthStatus {\n const details: Record<string, unknown> = {\n hermes_home: this.nativePath,\n state_db: \"missing\",\n memories_dir: \"missing\",\n skills_dir: \"missing\",\n };\n try {\n if (this.home === null) {\n return {\n status: \"blocked\",\n reason: \"~/.hermes/ not found — Hermes Agent not installed here\",\n details,\n proposedFix:\n \"Install Hermes Agent and run a session once, then `bourdon export-all`.\",\n };\n }\n const sources = this.sources();\n for (const key of [\"state_db\", \"memories_dir\", \"skills_dir\"] as const) {\n if (sources[key]) details[key] = sources[key];\n }\n if (sources[\"state_db\"]) {\n const records = collectSessionRows(join(this.home, \"state.db\"), 1);\n if (records.length) return { status: \"ok\", details };\n return {\n status: \"degraded\",\n reason: \"state.db present but no readable sessions yet\",\n details,\n proposedFix: \"Run at least one Hermes session, then `bourdon export-all`.\",\n };\n }\n if (sources[\"memories_dir\"]) {\n return {\n status: \"degraded\",\n reason: \"memories/ present but state.db missing — session history unavailable\",\n details,\n };\n }\n return {\n status: \"blocked\",\n reason: \"Hermes home has neither state.db nor memories/\",\n details,\n proposedFix: \"Run a Hermes session to populate ~/.hermes/state.db.\",\n };\n } catch (err) {\n // healthCheck must NEVER raise (contract).\n return {\n status: \"degraded\",\n reason: `unexpected error: ${String(err)}`,\n details,\n };\n }\n }\n}\n","/**\n * Claude Code participant — reads claude-brain + auto-memory + MCP knowledge\n * graph. Port of `participants/claude_code.py`.\n *\n * Three optional sources (the participant degrades gracefully):\n * 1. claude-brain/ — git-synced markdown records\n * 2. ~/.claude/projects/<ws>/memory/ — per-machine auto-memory frontmatter\n * 3. ~/claude-memory/memory.jsonl — MCP knowledge-graph JSONL\n *\n * Privacy: entities typed `person` (+ family/contact variants) and observations\n * containing credential-like strings default to PRIVATE and are filtered before\n * federation. Entities are deduped by case-insensitive name and sorted\n * alphabetically.\n */\n\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir, hostname } from \"node:os\";\nimport { basename, join } from \"node:path\";\n\nimport { parse as yamlParse } from \"yaml\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { containsSecret } from \"@getbourdon/redaction\";\n\nimport {\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\n\nconst AGENT_ID = \"claude-code\";\nconst AGENT_TYPE = \"code-assistant\";\nconst ROLE_NARRATIVE =\n \"Agentic manager and code-assistant. Coordinates the RADLAB agent fleet, \" +\n \"reviews PRs, and consults on architectural decisions. Capable of authoring \" +\n \"code but typically reviews + delegates to specialised code-assistants like \" +\n \"Codex for prime-code execution.\";\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.PUBLIC,\n private_tags: [\"personal\", \"financial\", \"credential\", \"health\", \"family\", \"legal\"],\n team_tags: [\"internal-roadmap\"],\n});\n\n/** Entity-type slugs that default to PRIVATE unless explicitly promoted. */\nconst PRIVATE_BY_DEFAULT_TYPES = new Set([\n \"person\",\n \"user\",\n \"individual\",\n \"contact\",\n \"family-member\",\n \"family_member\",\n]);\n\nconst MAX_SUMMARY_CHARS = 500;\nconst MAX_OBSERVATIONS_IN_SUMMARY = 2;\n\n// -- Path resolution ----------------------------------------------------------\n\nfunction isDir(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(p: string): boolean {\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\nfunction resolveClaudeBrainPath(): string | null {\n const envOverride = process.env.CLAUDE_BRAIN;\n if (envOverride && isDir(envOverride)) return envOverride;\n const homeCandidate = join(homeDir(), \"claude-brain\");\n if (isDir(homeCandidate)) return homeCandidate;\n const cwdCandidate = join(process.cwd(), \"claude-brain\");\n if (isDir(cwdCandidate)) return cwdCandidate;\n return null;\n}\n\nfunction homeDir(): string {\n // os.homedir() can throw under some sandboxes; stay defensive so import +\n // construction never crash even when HOME points at an unreadable path.\n try {\n return homedir();\n } catch {\n return process.env.HOME || process.env.USERPROFILE || \".\";\n }\n}\n\nfunction resolveAutoMemoryPath(): string | null {\n try {\n const base = join(homeDir(), \".claude\", \"projects\");\n if (!isDir(base)) return null;\n for (const child of readdirSync(base)) {\n const memMarker = join(base, child, \"memory\", \"MEMORY.md\");\n if (isFile(memMarker)) return join(base, child, \"memory\");\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction resolveKnowledgeGraphPath(): string | null {\n const candidate = join(homeDir(), \"claude-memory\", \"memory.jsonl\");\n return isFile(candidate) ? candidate : null;\n}\n\n// -- Privacy scrubbing --------------------------------------------------------\n\nfunction isPrivateType(entityType: string | null | undefined): boolean {\n if (!entityType) return false;\n const normalized = entityType.split(\"/\").pop()?.trim().toLowerCase() ?? \"\";\n return PRIVATE_BY_DEFAULT_TYPES.has(normalized);\n}\n\n// -- YAML frontmatter ---------------------------------------------------------\n\nconst FRONTMATTER_OPEN = \"---\\n\";\nconst FRONTMATTER_CLOSE = \"\\n---\\n\";\n\nfunction parseFrontmatter(text: string): { frontmatter: Record<string, unknown>; body: string } {\n if (!text.startsWith(FRONTMATTER_OPEN)) return { frontmatter: {}, body: text };\n const end = text.indexOf(FRONTMATTER_CLOSE, FRONTMATTER_OPEN.length);\n if (end === -1) return { frontmatter: {}, body: text };\n const fmText = text.slice(FRONTMATTER_OPEN.length, end);\n const body = text.slice(end + FRONTMATTER_CLOSE.length);\n let parsed: unknown;\n try {\n parsed = yamlParse(fmText);\n } catch {\n return { frontmatter: {}, body: text };\n }\n const fm =\n typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n return { frontmatter: fm, body };\n}\n\n// -- Parser: claude-brain PROJECTS + LOG --------------------------------------\n\nconst H1_RE = /^#[ \\t]+(.+?)[ \\t]*$/m;\nconst STATUS_SECTION_RE = /^##[ \\t]+(?:Current[ \\t]+)?Status[^\\n]*$/im;\nconst STATUS_DATE_RE = /\\b(\\d{4}-\\d{2}-\\d{2})\\b/;\nconst TITLE_SPLIT_RE = /\\s*[-—–:]+\\s+/;\n\nfunction extractH1Title(body: string): string | null {\n const match = H1_RE.exec(body);\n if (!match) return null;\n const title = (match[1] ?? \"\").trim();\n const head = title.split(TITLE_SPLIT_RE)[0] ?? title;\n return head.trim();\n}\n\nfunction extractFirstParagraph(body: string, maxChars = MAX_SUMMARY_CHARS): string {\n const paragraph: string[] = [];\n for (const line of body.split(/\\r?\\n/)) {\n const stripped = line.trim();\n if (!stripped) {\n if (paragraph.length) break;\n continue;\n }\n if (stripped.startsWith(\"#\")) continue;\n paragraph.push(stripped);\n if (paragraph.reduce((acc, s) => acc + s.length + 1, 0) > maxChars) break;\n }\n return paragraph.join(\" \").trim().slice(0, maxChars).trim();\n}\n\nfunction extractStatusTag(body: string): string[] {\n const match = STATUS_SECTION_RE.exec(body);\n if (!match) return [];\n const region = body.slice(match.index, match.index + 400).toLowerCase();\n const tags: string[] = [];\n for (const keyword of [\"archived\", \"canceled\", \"cancelled\", \"active\", \"shipped\", \"blocked\"]) {\n if (region.includes(keyword)) tags.push(keyword.replace(\"cancelled\", \"canceled\"));\n }\n return [...new Set(tags)];\n}\n\nconst END_OF_LIFE_TAGS = new Set([\"archived\", \"canceled\"]);\n\nfunction extractStatusDate(body: string): string | null {\n const match = STATUS_SECTION_RE.exec(body);\n if (!match) return null;\n const region = body.slice(match.index, match.index + 400);\n const dateMatch = STATUS_DATE_RE.exec(region);\n return dateMatch ? (dateMatch[1] ?? null) : null;\n}\n\nfunction parseProjectOverview(overviewPath: string): EntityModel | null {\n let text: string;\n try {\n text = readFileSync(overviewPath, \"utf8\");\n } catch {\n return null;\n }\n const { body } = parseFrontmatter(text);\n const title = extractH1Title(body) || basename(join(overviewPath, \"..\"));\n const summary = extractFirstParagraph(body);\n const tags = extractStatusTag(body);\n\n let validTo: string | null = null;\n if (tags.some((t) => END_OF_LIFE_TAGS.has(t))) {\n validTo = extractStatusDate(body);\n if (validTo === null) {\n try {\n const mtime = statSync(overviewPath).mtime;\n validTo = mtime.toISOString().slice(0, 10);\n } catch {\n validTo = null;\n }\n }\n }\n\n return makeEntity({\n name: title,\n type: \"project\",\n summary: summary || undefined,\n tags,\n valid_to: validTo ?? undefined,\n });\n}\n\nfunction parseProjectsDir(brainPath: string): EntityModel[] {\n const projectsDir = join(brainPath, \"PROJECTS\");\n if (!isDir(projectsDir)) return [];\n const entities: EntityModel[] = [];\n for (const name of readdirSync(projectsDir).sort()) {\n const projectDir = join(projectsDir, name);\n if (!isDir(projectDir)) continue;\n const overview = join(projectDir, \"OVERVIEW.md\");\n if (!isFile(overview)) continue;\n const entity = parseProjectOverview(overview);\n if (entity) entities.push(entity);\n }\n return entities;\n}\n\nconst LOG_FILENAME_RE = /^(\\d{4}-\\d{2}-\\d{2})(?:-(\\w+?))?(?:-.*)?\\.md$/;\n\nfunction parseLogFile(logPath: string): SessionModel | null {\n const m = LOG_FILENAME_RE.exec(basename(logPath));\n if (!m) return null;\n const sessionDate = m[1] ?? \"\";\n let text: string;\n try {\n text = readFileSync(logPath, \"utf8\");\n } catch {\n return null;\n }\n const { body } = parseFrontmatter(text);\n const headline = extractFirstParagraph(body, 250);\n return makeSession({\n date: sessionDate,\n key_actions: headline ? [headline] : [],\n files_touched: [`LOG/${basename(logPath)}`],\n });\n}\n\nfunction parseLogsDir(brainPath: string, since?: Date, limit = 100): SessionModel[] {\n const logDir = join(brainPath, \"LOG\");\n if (!isDir(logDir)) return [];\n const candidates: Array<[string, string]> = [];\n for (const fname of readdirSync(logDir)) {\n if (!fname.endsWith(\".md\")) continue;\n const m = LOG_FILENAME_RE.exec(fname);\n if (!m) continue;\n const d = m[1] ?? \"\";\n if (since) {\n if (d < since.toISOString().slice(0, 10)) continue;\n }\n candidates.push([d, join(logDir, fname)]);\n }\n candidates.sort((a, b) => (a[0] < b[0] ? 1 : a[0] > b[0] ? -1 : 0)); // newest first\n const sessions: SessionModel[] = [];\n for (const [, logFile] of candidates.slice(0, limit)) {\n const session = parseLogFile(logFile);\n if (session) sessions.push(session);\n }\n return sessions;\n}\n\n// -- Parser: auto-memory ------------------------------------------------------\n\nfunction parseAutoMemoryEntity(mdPath: string): EntityModel | null {\n let text: string;\n try {\n text = readFileSync(mdPath, \"utf8\");\n } catch {\n return null;\n }\n const { frontmatter, body } = parseFrontmatter(text);\n const name =\n (frontmatter[\"name\"] as string | undefined) ||\n extractH1Title(body) ||\n basename(mdPath).replace(/\\.md$/, \"\");\n const entityType = frontmatter[\"type\"] as string | undefined;\n const summaryRaw =\n (frontmatter[\"description\"] as string | undefined) || extractFirstParagraph(body);\n const rawTags = frontmatter[\"tags\"];\n const tags = Array.isArray(rawTags) ? rawTags.map((t) => String(t)) : [];\n\n const visibility = isPrivateType(entityType) ? Visibility.PRIVATE : undefined;\n\n return makeEntity({\n name: String(name),\n type: entityType ? String(entityType) : undefined,\n summary: summaryRaw ? String(summaryRaw).slice(0, MAX_SUMMARY_CHARS).trim() : undefined,\n tags,\n visibility,\n });\n}\n\nfunction parseAutoMemory(memoryPath: string): EntityModel[] {\n if (!isDir(memoryPath)) return [];\n const entities: EntityModel[] = [];\n for (const fname of readdirSync(memoryPath).sort()) {\n if (!fname.endsWith(\".md\") || fname === \"MEMORY.md\") continue;\n const entity = parseAutoMemoryEntity(join(memoryPath, fname));\n if (entity) entities.push(entity);\n }\n return entities;\n}\n\n// -- Parser: knowledge graph JSONL --------------------------------------------\n\nfunction graphEntityToBourdonEntity(record: Record<string, unknown>): EntityModel | null {\n const name = record[\"name\"];\n if (!name || typeof name !== \"string\") return null;\n const entityTypeSlug = (record[\"entityType\"] as string | undefined) || \"\";\n const normalizedType = entityTypeSlug ? (entityTypeSlug.split(\"/\").pop() ?? null) : null;\n const observations = Array.isArray(record[\"observations\"])\n ? (record[\"observations\"] as unknown[])\n : [];\n\n const safeObs: string[] = [];\n for (const obs of observations.slice(0, MAX_OBSERVATIONS_IN_SUMMARY)) {\n if (typeof obs !== \"string\") continue;\n safeObs.push(containsSecret(obs) ? \"[redacted -- contains credential-like content]\" : obs);\n }\n const joined = safeObs.join(\" | \").slice(0, MAX_SUMMARY_CHARS).trim();\n const summary = joined || undefined;\n\n const hasCredObs = observations.some((o) => typeof o === \"string\" && containsSecret(o));\n const visibility = isPrivateType(entityTypeSlug) || hasCredObs ? Visibility.PRIVATE : undefined;\n\n const tags =\n normalizedType && normalizedType !== name.toLowerCase() ? [normalizedType] : [];\n\n return makeEntity({\n name,\n type: normalizedType ?? undefined,\n summary,\n tags,\n visibility,\n });\n}\n\nfunction parseKnowledgeGraph(graphPath: string): EntityModel[] {\n if (!isFile(graphPath)) return [];\n let raw: string;\n try {\n raw = readFileSync(graphPath, \"utf8\");\n } catch {\n return [];\n }\n const entities: EntityModel[] = [];\n for (const lineRaw of raw.split(/\\r?\\n/)) {\n const line = lineRaw.trim();\n if (!line) continue;\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n continue; // skip malformed JSONL (logged at WARNING in the oracle)\n }\n if (typeof record !== \"object\" || record === null) continue;\n const rec = record as Record<string, unknown>;\n if (rec[\"type\"] !== \"entity\") continue;\n const entity = graphEntityToBourdonEntity(rec);\n if (entity) entities.push(entity);\n }\n return entities;\n}\n\n// -- Dedupe + merge -----------------------------------------------------------\n\nconst VIS_ORDER: Record<string, number> = {\n [Visibility.PRIVATE]: 0,\n [Visibility.TEAM]: 1,\n [Visibility.PUBLIC]: 2,\n none: 3,\n};\n\nfunction visRank(v: Visibility | null | undefined): number {\n return v == null ? VIS_ORDER[\"none\"]! : VIS_ORDER[v]!;\n}\n\nfunction mergeEntities(into: EntityModel, other: EntityModel): EntityModel {\n if (!into.type && other.type) into.type = other.type;\n if (other.summary && other.summary.trim() && other.summary.length > (into.summary?.length ?? 0)) {\n into.summary = other.summary;\n }\n into.tags = [...new Set([...(into.tags ?? []), ...(other.tags ?? [])])];\n if (visRank(other.visibility) < visRank(into.visibility)) {\n into.visibility = other.visibility;\n }\n return into;\n}\n\n/**\n * Merge multiple entity lists into one, deduping by case-insensitive name.\n * NOTE the faithful oracle quirk: the fresh copy DROPS valid_from / valid_to, so\n * an archived project keeps its `archived` tag but emits no `valid_to`. Do not\n * \"fix\" this — parity breaks otherwise.\n */\nfunction dedupeEntities(sourceLists: EntityModel[][]): EntityModel[] {\n const byKey = new Map<string, EntityModel>();\n for (const source of sourceLists) {\n for (const entity of source) {\n const key = entity.name.trim().toLowerCase();\n if (!key) continue;\n const existing = byKey.get(key);\n if (existing) {\n mergeEntities(existing, entity);\n } else {\n byKey.set(\n key,\n makeEntity({\n name: entity.name,\n type: entity.type,\n aliases: [...(entity.aliases ?? [])],\n summary: entity.summary,\n last_touched: entity.last_touched,\n tags: [...(entity.tags ?? [])],\n visibility: entity.visibility,\n // valid_from / valid_to intentionally dropped (oracle behavior).\n }),\n );\n }\n }\n }\n return [...byKey.values()].sort((a, b) => {\n const an = a.name.toLowerCase();\n const bn = b.name.toLowerCase();\n return an < bn ? -1 : an > bn ? 1 : 0;\n });\n}\n\n// -- Participant --------------------------------------------------------------\n\n/** External participant for Anthropic's Claude Code CLI. */\nexport class ClaudeCodeParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n nativePath: string;\n\n /** Public so a hermetic test can seed the discovered sources directly (path\n * RESOLUTION is not the parity contract — only the export output shape is). */\n brainPath: string | null;\n autoMemoryPath: string | null;\n knowledgeGraphPath: string | null;\n\n static defaultNativePath(home?: string): string {\n return join(home ?? homeDir(), \".claude\");\n }\n\n constructor() {\n this.nativePath = join(homeDir(), \"claude-brain\"); // primary anchor\n this.brainPath = resolveClaudeBrainPath();\n this.autoMemoryPath = resolveAutoMemoryPath();\n this.knowledgeGraphPath = resolveKnowledgeGraphPath();\n }\n\n discover(): AgentStore {\n const sources = {\n claude_brain: this.brainPath,\n auto_memory: this.autoMemoryPath,\n knowledge_graph: this.knowledgeGraphPath,\n };\n if (!Object.values(sources).some((v) => v)) {\n throw new ParticipantDiscoveryError(\n \"No Claude Code memory sources found. Expected one of: ~/claude-brain/, \" +\n \"~/.claude/projects/*/memory/, ~/claude-memory/memory.jsonl.\",\n );\n }\n return {\n path: this.nativePath,\n version: \"claude-code-memory-v1\",\n metadata: { sources },\n };\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const store = this.discover(); // re-raises on missing\n const sources = store.metadata[\"sources\"] as Record<string, string | null>;\n const capabilities = Object.entries(sources)\n .filter(([, v]) => v)\n .map(([k]) => k)\n .sort();\n\n const autoMemoryEntities = this.autoMemoryPath ? parseAutoMemory(this.autoMemoryPath) : [];\n const graphEntities = this.knowledgeGraphPath\n ? parseKnowledgeGraph(this.knowledgeGraphPath)\n : [];\n const projectEntities = this.brainPath ? parseProjectsDir(this.brainPath) : [];\n\n // Priority: auto-memory > graph > brain projects (first wins on collision).\n const allEntities = dedupeEntities([autoMemoryEntities, graphEntities, projectEntities]);\n\n // Visibility filter — private entities never leave this function.\n const visibleEntities = filterForFederation(allEntities, DEFAULT_POLICY);\n\n const sessions = this.brainPath ? parseLogsDir(this.brainPath, since) : [];\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: this.agentId,\n type: this.agentType,\n instance: hostname() || \"unknown\",\n spec_version_compat: `>=${SPEC_VERSION}`,\n role_narrative: ROLE_NARRATIVE,\n }),\n last_updated: new Date().toISOString(),\n capabilities,\n recent_sessions: sessions,\n known_entities: visibleEntities,\n visibility_policy: DEFAULT_POLICY,\n });\n }\n\n exportSessions(since?: Date, limit = 100): SessionModel[] {\n if (!this.brainPath) return [];\n return parseLogsDir(this.brainPath, since, limit);\n }\n\n healthCheck(): HealthStatus {\n try {\n const present = [this.brainPath, this.autoMemoryPath, this.knowledgeGraphPath].filter(\n (p) => p !== null,\n ).length;\n const details = {\n claude_brain: this.brainPath ?? \"missing\",\n auto_memory: this.autoMemoryPath ?? \"missing\",\n knowledge_graph: this.knowledgeGraphPath ?? \"missing\",\n };\n if (present === 3) return { status: \"ok\", details };\n if (present === 0) {\n return {\n status: \"blocked\",\n reason: \"No Claude Code memory sources found on this machine\",\n details,\n proposedFix:\n \"Run `bourdon setup` to wire the SessionEnd hook and bootstrap \" +\n \"~/agent-library/, then open Claude Code once to populate ~/.claude/projects/.\",\n };\n }\n return {\n status: \"degraded\",\n reason: `${present}/3 Claude Code memory sources found`,\n details,\n proposedFix:\n \"Run `bourdon setup` to (re-)wire missing sources, or set the CLAUDE_BRAIN \" +\n \"env var to point at your claude-brain checkout.\",\n };\n } catch (err) {\n return {\n status: \"degraded\",\n reason: `unexpected error: ${String(err)}`,\n details: {},\n };\n }\n }\n}\n","/**\n * GitHub-embedded Copilot participant — the v0.3 network-adapter reference.\n * Port of `participants/github_copilot.py`.\n *\n * Cloud-side Copilot (PR review, `@copilot` comments) persists nothing on the\n * user's machine — its state lives on github.com. This adapter federates it by\n * reading the user's GitHub activity over the REST API. The\n * {@link NetworkParticipant} base provides the cache, degradation, and auth\n * boundary; this class provides only the GitHub-specific fetch + payload→L5.\n *\n * Auth: a token with `repo` + `read:user` scope, sourced from `$GITHUB_TOKEN` /\n * `$GH_TOKEN`, else `gh auth token`. Fetched lazily; never stored in the cache\n * or the manifest.\n */\n\nimport { execFileSync } from \"node:child_process\";\n\nimport {\n Visibility,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { redactText } from \"@getbourdon/redaction\";\n\nimport { SPEC_VERSION } from \"../base.js\";\nimport {\n NetworkParticipant,\n NetworkUnavailable,\n ParticipantAuthError,\n type AuthProvider,\n type NetworkParticipantOptions,\n} from \"../network-base.js\";\n\nconst AGENT_ID = \"github-copilot\";\nconst AGENT_TYPE = \"code-assistant\";\nconst PARTICIPANT_SLUG = \"github-copilot\";\nconst DISPLAY_NAME = \"GitHub Copilot (cloud)\";\nconst ROLE_NARRATIVE =\n \"Cloud-side GitHub Copilot: PR review and @copilot-authored comments/\" +\n \"suggestions that live on github.com, not on the user's machine. Federated \" +\n \"via the GitHub REST API rather than a local artifact.\";\n\nconst GITHUB_API_ROOT = \"https://api.github.com\";\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.TEAM,\n private_tags: [\"personal\", \"financial\", \"credential\", \"secret\"],\n team_tags: [\"github-copilot\", \"pull-request\"],\n});\n\n// -- Auth resolution ----------------------------------------------------------\n\n/** Resolve a GitHub token: env var first, then the `gh` CLI keychain. */\nexport function ghTokenProvider(): string | null {\n for (const varName of [\"GITHUB_TOKEN\", \"GH_TOKEN\"]) {\n const val = process.env[varName];\n if (val) return val;\n }\n try {\n const out = execFileSync(\"gh\", [\"auth\", \"token\"], {\n encoding: \"utf8\",\n timeout: 5000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n const token = out.trim();\n if (token) return token;\n } catch {\n /* gh missing / not logged in */\n }\n return null;\n}\n\n// -- HTTP ---------------------------------------------------------------------\n\ninterface HttpResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\n/**\n * Synchronous GET via a tiny `curl` shell-out (the base class's fetch contract\n * is synchronous, matching the Python urllib reference). Returns parsed JSON.\n * Classifies failures into the two contract errors: rate-limit / 5xx /\n * transport / non-JSON → {@link NetworkUnavailable}; 401/403 →\n * {@link ParticipantAuthError}. Never raises anything else.\n */\nfunction githubGet(path: string, token: string, timeoutSec = 10): unknown {\n const url = path.startsWith(\"http\") ? path : `${GITHUB_API_ROOT}${path}`;\n let resp: HttpResponse;\n try {\n resp = curlGet(url, token, timeoutSec);\n } catch (err) {\n throw new NetworkUnavailable(`GitHub API unreachable: ${String(err)}`);\n }\n\n const remaining = resp.headers[\"x-ratelimit-remaining\"];\n if (resp.status === 429 || (resp.status === 403 && String(remaining) === \"0\")) {\n throw new NetworkUnavailable(`GitHub API ${resp.status}: rate-limited`);\n }\n if (resp.status === 401 || resp.status === 403) {\n throw new ParticipantAuthError(`GitHub API ${resp.status}: token invalid or lacks scope`);\n }\n if (resp.status >= 500) {\n throw new NetworkUnavailable(`GitHub API ${resp.status}`);\n }\n if (resp.status >= 400) {\n throw new NetworkUnavailable(`GitHub API ${resp.status}`);\n }\n try {\n return JSON.parse(resp.body);\n } catch (err) {\n // A 200 with a non-JSON body (captive portal / proxy splash) is a degraded\n // condition, not a hard crash.\n throw new NetworkUnavailable(`GitHub API returned a non-JSON body: ${String(err)}`);\n }\n}\n\nfunction curlGet(url: string, token: string, timeoutSec: number): HttpResponse {\n // `-sS` quiet but show errors; `-D -` dumps headers to stdout before the body;\n // `-w` appends the status code on its own trailing line for parsing.\n const raw = execFileSync(\n \"curl\",\n [\n \"-sS\",\n \"-D\",\n \"-\",\n \"-o\",\n \"-\",\n \"--max-time\",\n String(timeoutSec),\n \"-H\",\n `Authorization: Bearer ${token}`,\n \"-H\",\n \"Accept: application/vnd.github+json\",\n \"-H\",\n \"X-GitHub-Api-Version: 2022-11-28\",\n \"-H\",\n \"User-Agent: bourdon-github-copilot-participant\",\n \"-w\",\n \"\\n__BOURDON_STATUS__%{http_code}\",\n url,\n ],\n { encoding: \"utf8\", timeout: (timeoutSec + 2) * 1000, maxBuffer: 8 * 1024 * 1024 },\n );\n\n const statusMatch = /\\n__BOURDON_STATUS__(\\d+)$/.exec(raw);\n const status = statusMatch ? Number(statusMatch[1]) : 0;\n const withoutStatus = statusMatch ? raw.slice(0, statusMatch.index) : raw;\n\n // Split header block from body (last header section before body).\n const headerBodySplit = withoutStatus.indexOf(\"\\r\\n\\r\\n\");\n let headerBlock = \"\";\n let body = withoutStatus;\n if (headerBodySplit >= 0) {\n headerBlock = withoutStatus.slice(0, headerBodySplit);\n body = withoutStatus.slice(headerBodySplit + 4);\n } else {\n const lfSplit = withoutStatus.indexOf(\"\\n\\n\");\n if (lfSplit >= 0) {\n headerBlock = withoutStatus.slice(0, lfSplit);\n body = withoutStatus.slice(lfSplit + 2);\n }\n }\n\n const headers: Record<string, string> = {};\n for (const line of headerBlock.split(/\\r?\\n/)) {\n const idx = line.indexOf(\":\");\n if (idx > 0) {\n headers[line.slice(0, idx).trim().toLowerCase()] = line.slice(idx + 1).trim();\n }\n }\n return { status, headers, body };\n}\n\n// -- Participant --------------------------------------------------------------\n\n/** Federates cloud-side GitHub Copilot activity via the GitHub REST API. */\nexport class GitHubCopilotParticipant extends NetworkParticipant {\n override participantSlug = PARTICIPANT_SLUG;\n override agentId = AGENT_ID;\n override agentType = AGENT_TYPE;\n override nativePath = GITHUB_API_ROOT;\n displayName = DISPLAY_NAME;\n\n private readonly maxResults: number;\n\n constructor(opts: NetworkParticipantOptions & { maxResults?: number } = {}) {\n super({\n authProvider: opts.authProvider ?? ghTokenProvider,\n cacheRoot: opts.cacheRoot,\n });\n this.maxResults = opts.maxResults ?? 50;\n }\n\n static defaultNativePath(): string {\n return GITHUB_API_ROOT;\n }\n\n override fetchPayload(token: string): Record<string, unknown> {\n // Identify the authenticated user (also validates the token early).\n const me = githubGet(\"/user\", token);\n const login = me && typeof me === \"object\" ? (me as Record<string, unknown>)[\"login\"] : null;\n\n // PRs that involve the user where Copilot is a commenter/reviewer.\n const q = \"is:pr involves:@me commenter:copilot\";\n const encoded = encodeURIComponent(q);\n const search = githubGet(\n `/search/issues?q=${encoded}&sort=updated&per_page=${this.maxResults}`,\n token,\n );\n const items =\n search && typeof search === \"object\"\n ? ((search as Record<string, unknown>)[\"items\"] ?? [])\n : [];\n\n return {\n fetched_user: login ?? null,\n fetched_at: new Date().toISOString(),\n items,\n };\n }\n\n override payloadToL5(payload: Record<string, unknown>): L5ManifestModel {\n const items = Array.isArray(payload[\"items\"]) ? (payload[\"items\"] as unknown[]) : [];\n const sessions: SessionModel[] = [];\n const entities = new Map<string, EntityModel>();\n\n for (const item of items) {\n if (typeof item !== \"object\" || item === null) continue;\n const it = item as Record<string, unknown>;\n const repo = repoFromItem(it);\n const title = redactText(String(it[\"title\"] ?? \"\"), 160);\n const number = it[\"number\"];\n const updated = isoDate(it[\"updated_at\"]);\n const focus = repo ? [repo] : [];\n\n sessions.push(\n makeSession({\n date: updated || \"1970-01-01\",\n cwd: repo ? `github.com/${repo}` : undefined,\n project_focus: focus,\n key_actions: number != null ? [`PR #${String(number)}: ${title}`] : [title],\n visibility: Visibility.TEAM,\n }),\n );\n\n if (repo && !entities.has(repo)) {\n entities.set(\n repo,\n makeEntity({\n name: repo,\n type: \"repository\",\n summary: \"GitHub repo with Copilot PR activity.\",\n aliases: repo.includes(\"/\") ? [repo.split(\"/\").pop() ?? \"\"] : [],\n last_touched: updated ?? undefined,\n tags: [\"github-copilot\", \"pull-request\"],\n visibility: Visibility.TEAM,\n }),\n );\n }\n }\n\n // Keep sessions newest-first, bounded.\n sessions.sort((a, b) => (a.date < b.date ? 1 : a.date > b.date ? -1 : 0));\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: this.agentId,\n type: this.agentType,\n role_narrative: ROLE_NARRATIVE,\n instance: (payload[\"fetched_user\"] as string | null | undefined) ?? undefined,\n }),\n last_updated: new Date().toISOString(),\n capabilities: [\"github-search\", \"pull-request-comments\"],\n recent_sessions: sessions.slice(0, this.maxResults),\n known_entities: [...entities.values()],\n visibility_policy: DEFAULT_POLICY,\n });\n }\n}\n\n// -- Helpers ------------------------------------------------------------------\n\nfunction repoFromItem(item: Record<string, unknown>): string | null {\n const repoUrl = item[\"repository_url\"];\n if (typeof repoUrl === \"string\" && repoUrl.includes(\"/repos/\")) {\n return repoUrl.split(\"/repos/\")[1] ?? null;\n }\n return null;\n}\n\nfunction isoDate(value: unknown): string | null {\n if (typeof value === \"string\" && value.length >= 10) return value.slice(0, 10);\n return null;\n}\n\n// Re-export the provider type for adapters/tests that inject auth.\nexport type { AuthProvider };\n","/**\n * Cursor participant — reads Cursor's (the AI-first IDE) SQLite-backed\n * workspace/composer state and normalizes it into L5. Port of\n * `participants/cursor.py` + the extraction helper `participants/_cursor_sqlite.py`.\n *\n * Cursor stores workspace state in `state.vscdb` SQLite DBs at platform-specific\n * paths (`~/.config/Cursor/`, `~/Library/Application Support/Cursor/`,\n * `%APPDATA%/Cursor/`). This reader discovers those stores, reads the `ItemTable`\n * key/value rows read-only, parses the composer/chat records into sessions +\n * project/topic entities, and merges curated `.cursor/memory/short-index.json`\n * entities alongside them.\n *\n * SQLite access: the Python oracle copies each DB (+ its `-wal`/`-shm`\n * companions) to a tmp file and opens it read-write so SQLite folds the WAL into\n * a consistent snapshot. The TS mirror instead leans on {@link tryOpenReadonly}\n * (`mode=ro`), which respects SQLite locking and reads the `-wal` sidecar of a\n * live writer — the same consistent view without the copy. Read-only,\n * deterministic, visibility-enforced-before-emission, redaction on every native\n * string; `healthCheck` never throws.\n */\n\nimport { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { redactText } from \"@getbourdon/redaction\";\n\nimport {\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\nimport { tableExists, tryOpenReadonly } from \"../sqlite-base.js\";\n\nconst AGENT_ID = \"cursor\";\nconst AGENT_TYPE = \"code-assistant\";\nconst ROLE_NARRATIVE =\n \"AI-first IDE. Bourdon reads the SQLite-backed composer/workspace \" +\n \"state to surface recent sessions and project entities to other agents.\";\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.TEAM,\n private_tags: [\"personal\", \"credential\", \"secret\"],\n team_tags: [\"cursor\", \"workspace\", \"sqlite\"],\n});\n\nconst TOPIC_MIN_MENTIONS = 3;\n\n// -- Defensive fs helpers -----------------------------------------------------\n\nfunction homeDir(): string {\n try {\n return homedir();\n } catch {\n return process.env.HOME || process.env.USERPROFILE || \".\";\n }\n}\n\nfunction isDir(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(p: string): boolean {\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\n/** Redact credential-like content and cap length (redaction SSOT). */\nfunction scrubText(value: string, limit = 256): string {\n return redactText(value, limit);\n}\n\n// -- Extraction data shapes ---------------------------------------------------\n\ninterface CursorSessionMemory {\n date: string;\n cwd: string;\n keyActions: string[];\n filesTouched: string[];\n}\n\ninterface CursorEntityMemory {\n name: string;\n entityType: string;\n aliases: string[];\n summary: string;\n tags: string[];\n lastUpdated: string;\n}\n\ninterface CursorSQLiteMemories {\n sessions: CursorSessionMemory[];\n entities: CursorEntityMemory[];\n databasesScanned: string[];\n malformedRecords: number;\n}\n\n// -- Path resolution ----------------------------------------------------------\n\n/**\n * Platform-specific Cursor data dir (the SQLite workspace state lives here),\n * `$CURSOR_DIR` override first. Returns null on an unrecognized platform (or\n * Windows without `%APPDATA%`). Mirrors `default_cursor_dir`.\n */\nexport function defaultCursorDir(): string | null {\n const env = process.env.CURSOR_DIR;\n if (env) return env;\n switch (process.platform) {\n case \"darwin\":\n return join(homeDir(), \"Library\", \"Application Support\", \"Cursor\");\n case \"linux\":\n return join(homeDir(), \".config\", \"Cursor\");\n case \"win32\": {\n const appdata = process.env.APPDATA;\n return appdata ? join(appdata, \"Cursor\") : null;\n }\n default:\n return null;\n }\n}\n\n/** Candidate `state.vscdb` paths under a Cursor data dir that actually exist. */\nfunction iterStateDbs(root: string): string[] {\n const candidates: string[] = [\n join(root, \"state.vscdb\"),\n join(root, \"User\", \"globalStorage\", \"state.vscdb\"),\n ];\n const workspaceStorage = join(root, \"User\", \"workspaceStorage\");\n if (isDir(workspaceStorage)) {\n let children: string[] = [];\n try {\n children = readdirSync(workspaceStorage).sort();\n } catch {\n children = [];\n }\n for (const child of children) {\n candidates.push(join(workspaceStorage, child, \"state.vscdb\"));\n }\n }\n return candidates.filter((p) => isFile(p));\n}\n\n// -- SQLite ItemTable read (read-only) ----------------------------------------\n\n/**\n * Read the `(key, value)` rows of the `ItemTable`, JSON-decoding each value.\n * Returns the decoded records plus a count of values that failed to parse.\n * Never raises — a locked/corrupt/unreadable DB degrades to \"no rows\".\n */\nfunction readItemTable(dbPath: string): { records: Array<[string, unknown]>; malformed: number } {\n const records: Array<[string, unknown]> = [];\n let malformed = 0;\n\n const conn = tryOpenReadonly(dbPath);\n if (!conn) return { records, malformed };\n\n let rows: Array<{ key: unknown; value: unknown }>;\n try {\n if (!tableExists(conn, \"ItemTable\")) return { records, malformed };\n rows = conn.prepare(\"SELECT key, value FROM ItemTable\").all() as Array<{\n key: unknown;\n value: unknown;\n }>;\n } catch {\n // Locked (Windows holds a write lock on a live DB), corrupt, or otherwise\n // unreadable — skip this DB, never crash the whole export. The caller still\n // records it as scanned.\n return { records, malformed };\n } finally {\n conn.close();\n }\n\n for (const row of rows) {\n const raw = row.value;\n let text: string | null = null;\n if (typeof raw === \"string\") text = raw;\n else if (raw instanceof Uint8Array) text = Buffer.from(raw).toString(\"utf8\");\n if (text === null) {\n malformed += 1;\n continue;\n }\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch {\n malformed += 1;\n continue;\n }\n records.push([String(row.key), value]);\n }\n return { records, malformed };\n}\n\n// -- Record parsing -----------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction firstString(value: Record<string, unknown>, keys: readonly string[]): string {\n for (const key of keys) {\n const candidate = value[key];\n if (typeof candidate === \"string\" && candidate.trim()) return candidate.trim();\n }\n return \"\";\n}\n\nfunction firstMessageText(messages: unknown): string {\n if (!Array.isArray(messages)) return \"\";\n for (const message of messages) {\n if (!isRecord(message)) continue;\n // Python uses `content or text` — fall back whenever content is falsy\n // (incl. \"\"), not just null/undefined. `||` matches; `??` would drop a\n // {content:\"\", text:\"...\"} record and silently lose the session.\n const content = message[\"content\"] || message[\"text\"];\n if (typeof content === \"string\" && content.trim()) return content.trim();\n }\n return \"\";\n}\n\nfunction looksLikeComposerRecord(key: string, value: unknown): boolean {\n const loweredKey = key.toLowerCase();\n if (loweredKey.includes(\"composer\") || loweredKey.includes(\"aichat\") || loweredKey.includes(\"chat\")) {\n return true;\n }\n if (isRecord(value)) {\n const joinedKeys = Object.keys(value).join(\" \").toLowerCase();\n return joinedKeys.includes(\"message\") && (joinedKeys.includes(\"workspace\") || joinedKeys.includes(\"file\"));\n }\n return false;\n}\n\n/**\n * Parse a calendar date as written from an ISO-ish string (no tz conversion,\n * mirroring `datetime.fromisoformat(...).date()`) or an epoch number.\n */\nfunction parseDate(value: unknown): string {\n if (typeof value === \"string\") {\n const normalized = value.replaceAll(\"Z\", \"+00:00\");\n const m = /^(\\d{4}-\\d{2}-\\d{2})([T ].*)?$/.exec(normalized);\n if (!m) return \"\";\n const datePart = m[1] ?? \"\";\n // Reject calendar-impossible days (e.g. 2024-02-30): Python's\n // `datetime.fromisoformat` raises on these, but `new Date` silently rolls\n // the month over. Round-trip the date and require it to survive unchanged.\n const dayProbe = new Date(`${datePart}T00:00:00Z`);\n if (Number.isNaN(dayProbe.getTime()) || dayProbe.toISOString().slice(0, 10) !== datePart) {\n return \"\";\n }\n // Validate the full value parses as a real datetime; take the date as written.\n const probe = new Date(m[2] ? normalized.replace(\" \", \"T\") : `${datePart}T00:00:00`);\n if (Number.isNaN(probe.getTime())) return \"\";\n return datePart;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n const timestamp = value > 10_000_000_000 ? value / 1000 : value;\n const dt = new Date(timestamp * 1000);\n if (Number.isNaN(dt.getTime())) return \"\";\n return dt.toISOString().slice(0, 10);\n }\n return \"\";\n}\n\nfunction dateFromRecord(value: Record<string, unknown>): string {\n for (const key of [\"createdAt\", \"timestamp\", \"updatedAt\", \"lastUpdatedAt\", \"time\"]) {\n const parsed = parseDate(value[key]);\n if (parsed) return parsed;\n }\n return new Date().toISOString().slice(0, 10);\n}\n\nfunction stringsFromList(values: unknown[]): string[] {\n const strings: string[] = [];\n for (const item of values) {\n if (typeof item === \"string\" && item.trim()) {\n strings.push(item.trim());\n } else if (isRecord(item)) {\n const path = firstString(item, [\"path\", \"file\", \"uri\", \"relativePath\"]);\n if (path) strings.push(path);\n }\n }\n return strings;\n}\n\nfunction dedupe(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n if (!seen.has(value)) {\n seen.add(value);\n out.push(value);\n }\n }\n return out;\n}\n\nfunction extractFiles(value: Record<string, unknown>): string[] {\n const files: string[] = [];\n for (const key of [\"files\", \"filePaths\", \"filesTouched\", \"references\"]) {\n const candidate = value[key];\n if (Array.isArray(candidate)) files.push(...stringsFromList(candidate));\n }\n const messages = value[\"messages\"];\n if (Array.isArray(messages)) {\n for (const message of messages) {\n if (isRecord(message)) files.push(...extractFiles(message));\n }\n }\n return dedupe(files);\n}\n\nfunction recordToSession(key: string, value: unknown): CursorSessionMemory | null {\n if (!looksLikeComposerRecord(key, value)) return null;\n if (!isRecord(value)) return null;\n\n let cwd = firstString(value, [\"workspacePath\", \"workspace\", \"cwd\", \"folder\", \"rootPath\"]);\n if (!cwd && isRecord(value[\"workspace\"])) {\n cwd = firstString(value[\"workspace\"], [\"path\", \"folder\", \"cwd\"]);\n }\n if (!cwd) cwd = \"\";\n\n let action = firstString(value, [\"title\", \"text\", \"prompt\", \"summary\", \"name\"]);\n if (!action) action = firstMessageText(value[\"messages\"]);\n if (!action) return null;\n\n return {\n date: dateFromRecord(value),\n cwd,\n keyActions: [scrubText(action)],\n filesTouched: extractFiles(value),\n };\n}\n\nfunction projectName(cwd: string): string {\n if (!cwd) return \"\";\n const name = basename(cwd).trim();\n return name && name !== \".\" && name !== \"/\" ? name : \"\";\n}\n\n// -- Topic-entity inference ---------------------------------------------------\n\nconst STRIP_CHARS = new Set([\n \".\", \",\", \";\", \":\", \"!\", \"?\", '\"', \"'\", \"`\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", \"#\", \"-\", \"/\",\n]);\n\nfunction stripChars(token: string): string {\n let start = 0;\n let end = token.length;\n while (start < end && STRIP_CHARS.has(token[start]!)) start += 1;\n while (end > start && STRIP_CHARS.has(token[end - 1]!)) end -= 1;\n return token.slice(start, end);\n}\n\nconst TOPIC_STOPWORDS = new Set([\n \"the\", \"and\", \"for\", \"with\", \"this\", \"that\", \"from\", \"have\", \"will\",\n \"are\", \"was\", \"been\", \"not\", \"but\", \"all\", \"can\", \"has\", \"its\",\n \"add\", \"use\", \"set\", \"get\", \"new\", \"fix\", \"run\", \"now\", \"also\",\n \"into\", \"make\", \"just\", \"like\", \"need\", \"want\", \"work\", \"code\",\n \"file\", \"test\", \"data\", \"type\", \"should\", \"would\", \"could\",\n]);\n\n/** Extract recurring topic entities from session key_actions (in place). */\nfunction addTopicEntities(\n sessions: CursorSessionMemory[],\n entities: Map<string, CursorEntityMemory>,\n): void {\n const wordCounts = new Map<string, number>();\n const wordLatest = new Map<string, string>();\n\n for (const session of sessions) {\n for (const action of session.keyActions) {\n const words = new Set<string>();\n for (const token of action.toLowerCase().split(/\\s+/)) {\n const cleaned = stripChars(token);\n if (cleaned.length >= 4 && !TOPIC_STOPWORDS.has(cleaned) && /^\\p{L}+$/u.test(cleaned)) {\n words.add(cleaned);\n }\n }\n for (const word of words) {\n wordCounts.set(word, (wordCounts.get(word) ?? 0) + 1);\n if (session.date) {\n const prev = wordLatest.get(word);\n if (prev === undefined || session.date > prev) wordLatest.set(word, session.date);\n }\n }\n }\n }\n\n for (const [word, count] of wordCounts) {\n if (count >= TOPIC_MIN_MENTIONS && !entities.has(word)) {\n entities.set(word, {\n name: word,\n entityType: \"topic\",\n aliases: [],\n summary: `Recurring topic across ${count} Cursor sessions.`,\n tags: [\"cursor\", \"topic\", \"inferred\"],\n lastUpdated: wordLatest.get(word) ?? \"\",\n });\n }\n }\n}\n\n// -- Top-level extraction -----------------------------------------------------\n\nfunction extractCursorMemories(cursorDir: string | null = null): CursorSQLiteMemories {\n const root = cursorDir ?? defaultCursorDir();\n if (root === null || !isDir(root)) {\n return { sessions: [], entities: [], databasesScanned: [], malformedRecords: 0 };\n }\n\n const sessions: CursorSessionMemory[] = [];\n const entitiesByName = new Map<string, CursorEntityMemory>();\n const databasesScanned: string[] = [];\n let malformedRecords = 0;\n const projectLatest = new Map<string, string>();\n\n for (const dbPath of iterStateDbs(root)) {\n databasesScanned.push(dbPath);\n const { records, malformed } = readItemTable(dbPath);\n malformedRecords += malformed;\n for (const [key, value] of records) {\n const parsedSession = recordToSession(key, value);\n if (parsedSession === null) continue;\n sessions.push(parsedSession);\n\n const name = projectName(parsedSession.cwd);\n if (!name) continue;\n\n const prev = projectLatest.get(name) ?? \"\";\n if (!projectLatest.has(name) || (parsedSession.date && parsedSession.date > prev)) {\n projectLatest.set(name, parsedSession.date);\n }\n const existing = entitiesByName.get(name);\n const aliasSet = new Set<string>(parsedSession.cwd ? [parsedSession.cwd] : []);\n if (existing) {\n for (const a of existing.aliases) aliasSet.add(a);\n }\n entitiesByName.set(name, {\n name: scrubText(name, 120),\n entityType: \"project\",\n aliases: [...aliasSet].sort(),\n summary: scrubText(`Cursor workspace inferred from ${parsedSession.cwd}.`),\n tags: [\"cursor\", \"workspace\", \"sqlite\"],\n lastUpdated: projectLatest.get(name) ?? \"\",\n });\n }\n }\n\n addTopicEntities(sessions, entitiesByName);\n sessions.sort((a, b) => (a.date < b.date ? 1 : a.date > b.date ? -1 : 0));\n\n return {\n sessions,\n entities: [...entitiesByName.values()],\n databasesScanned,\n malformedRecords,\n };\n}\n\n// -- Short-index integration --------------------------------------------------\n\n/** Read a short-index.json and return its normalized entry dicts. */\nfunction readShortIndex(path: string): Array<Record<string, unknown>> {\n if (!isFile(path)) return [];\n let payload: unknown;\n try {\n const raw = readFileSync(path, \"utf8\").replace(/^\\uFEFF/, \"\"); // utf-8-sig: strip BOM\n payload = JSON.parse(raw);\n } catch {\n // Python logs a warning here; swallow + skip so a bad file never crashes export.\n return [];\n }\n if (!isRecord(payload)) return [];\n const entries = payload[\"entries\"];\n if (!Array.isArray(entries)) return [];\n return entries.filter(\n (e): e is Record<string, unknown> => isRecord(e) && Boolean(e[\"topic_key\"]),\n );\n}\n\n/** Merge workspace + global short-index files into Entity objects. */\nfunction shortIndexToEntities(\n workspaceRoot: string | null,\n _cursorDir: string | null,\n): EntityModel[] {\n const paths: string[] = [];\n if (workspaceRoot) {\n paths.push(join(workspaceRoot, \".cursor\", \"memory\", \"short-index.json\"));\n }\n const cursorHome = process.env.CURSOR_DIR ? process.env.CURSOR_DIR : null;\n const homeBase = cursorHome ?? join(homeDir(), \".cursor\");\n paths.push(join(homeBase, \"memory\", \"short-index.json\"));\n\n const merged = new Map<string, Record<string, unknown>>();\n for (const path of paths) {\n for (const entry of readShortIndex(path)) {\n const key = String(entry[\"topic_key\"]).trim().toLowerCase();\n merged.set(key, entry);\n }\n }\n\n const entities: EntityModel[] = [];\n for (const entry of merged.values()) {\n const nameRaw =\n entry[\"topic_name\"] !== undefined ? entry[\"topic_name\"] : (entry[\"topic_key\"] ?? \"\");\n const name = String(nameRaw).trim();\n if (!name) continue;\n\n const aliasesRaw =\n \"triggers\" in entry ? entry[\"triggers\"] : \"aliases\" in entry ? entry[\"aliases\"] : [];\n const aliases = Array.isArray(aliasesRaw)\n ? aliasesRaw.map((a) => String(a).trim()).filter((s) => s.length > 0)\n : [];\n\n const summary = String(entry[\"summary\"] ?? \"\").trim();\n\n const tagsRaw = entry[\"tags\"] ?? [];\n const tags = Array.isArray(tagsRaw)\n ? tagsRaw.map((t) => String(t).trim()).filter((s) => s.length > 0)\n : [];\n tags.push(\"short-index\");\n\n const access = String(entry[\"access_level\"] ?? \"team\").trim().toLowerCase();\n const visibility =\n access === \"private\"\n ? Visibility.PRIVATE\n : access === \"public\"\n ? Visibility.PUBLIC\n : Visibility.TEAM;\n\n const lastTouched = String(entry[\"last_updated\"] ?? \"\");\n\n entities.push(\n makeEntity({\n name,\n type: \"topic\",\n aliases,\n summary: summary || undefined,\n tags,\n last_touched: lastTouched || undefined,\n visibility,\n }),\n );\n }\n return entities;\n}\n\n// -- Conversion helpers -------------------------------------------------------\n\nfunction toSession(raw: CursorSessionMemory): SessionModel {\n return makeSession({\n date: raw.date || \"\",\n cwd: raw.cwd || undefined,\n project_focus: [],\n key_actions: [...raw.keyActions],\n files_touched: [...raw.filesTouched],\n });\n}\n\nfunction toEntity(raw: CursorEntityMemory): EntityModel {\n return makeEntity({\n name: raw.name,\n type: raw.entityType || undefined,\n aliases: [...raw.aliases],\n summary: raw.summary || undefined,\n tags: [...raw.tags],\n last_touched: raw.lastUpdated || undefined,\n });\n}\n\n/** Current UTC time, seconds precision + `+00:00` (Python `isoformat(timespec=\"seconds\")`). */\nfunction nowIsoSeconds(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, \"+00:00\");\n}\n\n// -- Participant --------------------------------------------------------------\n\n/** External participant for Cursor's SQLite workspace state. */\nexport class CursorParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n\n private readonly cursorDir: string | null;\n private readonly workspaceRoot: string | null;\n private readonly policy: VisibilityPolicyModel = DEFAULT_POLICY;\n\n /**\n * Conventional Cursor config dir (`~/.cursor`) used by the setup wizard. The\n * wizard probes `~/.cursor` for presence; the SQLite workspace state that\n * `exportL5` actually reads lives at {@link defaultCursorDir}. Detection and\n * extraction intentionally use different anchors.\n */\n static defaultNativePath(home?: string): string {\n return join(home ?? homeDir(), \".cursor\");\n }\n\n constructor(cursorDir?: string | null, workspaceRoot?: string | null) {\n this.cursorDir = cursorDir ?? null;\n this.workspaceRoot = workspaceRoot ?? null;\n }\n\n get nativePath(): string {\n const path = this.cursorDir ?? defaultCursorDir();\n return path ?? \"\";\n }\n\n discover(): AgentStore {\n const path = this.cursorDir ?? defaultCursorDir();\n if (path === null || !isDir(path)) {\n throw new ParticipantDiscoveryError(\n `Cursor data directory not found at ${path === null ? \"None\" : `'${path}'`}. ` +\n \"Pass an explicit cursor_dir to CursorParticipant() if Cursor stores its \" +\n \"state somewhere non-standard.\",\n );\n }\n const dbs = iterStateDbs(path);\n const dbDetails = dbs.map((db) => {\n let size: number;\n try {\n size = statSync(db).size;\n } catch {\n size = -1;\n }\n return { path: db, size_bytes: size };\n });\n\n return {\n path,\n version: \"unknown\",\n metadata: {\n platform_default: defaultCursorDir() ?? \"None\",\n databases_found: dbs.length,\n databases: dbDetails,\n },\n };\n }\n\n exportSessions(since?: Date, limit = 100): SessionModel[] {\n const memories = this.extract();\n const out: SessionModel[] = [];\n const sinceIso = since ? since.toISOString().slice(0, 10) : null;\n for (const raw of memories.sessions) {\n if (sinceIso && raw.date && raw.date < sinceIso) continue;\n out.push(toSession(raw));\n if (out.length >= limit) break;\n }\n return out;\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const memories = this.extract();\n let sessions = memories.sessions.map(toSession);\n if (since) {\n const sinceIso = since.toISOString().slice(0, 10);\n sessions = sessions.filter((s) => !s.date || s.date >= sinceIso);\n }\n\n const entities = memories.entities.map(toEntity);\n const shortIndexEntities = shortIndexToEntities(this.workspaceRoot, this.cursorDir);\n const seenNames = new Set(entities.map((e) => e.name.toLowerCase()));\n for (const si of shortIndexEntities) {\n const key = si.name.toLowerCase();\n if (!seenNames.has(key)) {\n entities.push(si);\n seenNames.add(key);\n }\n }\n const visibleEntities = filterForFederation(entities, this.policy);\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: AGENT_ID,\n type: AGENT_TYPE,\n role_narrative: ROLE_NARRATIVE,\n spec_version_compat: SPEC_VERSION,\n }),\n last_updated: nowIsoSeconds(),\n capabilities: [\"composer-history\", \"workspace-state\"],\n recent_sessions: sessions,\n known_entities: visibleEntities,\n visibility_policy: this.policy,\n });\n }\n\n healthCheck(): HealthStatus {\n const path = this.cursorDir ?? defaultCursorDir();\n if (path === null) {\n return {\n status: \"blocked\",\n reason: \"Cursor data directory not resolvable on this platform.\",\n details: {},\n proposedFix:\n \"Install Cursor (https://cursor.sh) and open it once. \" +\n \"Set CURSOR_DIR if Cursor stores state outside the default location.\",\n };\n }\n if (!isDir(path)) {\n return {\n status: \"blocked\",\n reason: `Cursor data directory not present at ${path}.`,\n details: { expected_path: path },\n proposedFix:\n \"Install Cursor and open it once to create the data directory, \" +\n \"or set CURSOR_DIR to the actual location.\",\n };\n }\n let memories: CursorSQLiteMemories;\n try {\n memories = this.extract();\n } catch (err) {\n // health check must not raise.\n return {\n status: \"degraded\",\n reason: \"Cursor data directory present but extraction failed.\",\n details: { error: String(err) },\n proposedFix:\n \"Close Cursor (its SQLite stores may be locked) then re-run \" +\n \"`bourdon cursor export`. If extraction still fails, file an \" +\n \"issue with the error above.\",\n };\n }\n if (memories.databasesScanned.length === 0) {\n return {\n status: \"degraded\",\n reason: \"No Cursor SQLite stores found under the data directory.\",\n details: { path },\n proposedFix:\n \"Open Cursor and use it for at least one chat session, then \" +\n \"re-run `bourdon cursor export`.\",\n };\n }\n return {\n status: \"ok\",\n details: {\n databases_scanned: memories.databasesScanned.length,\n sessions_extracted: memories.sessions.length,\n entities_extracted: memories.entities.length,\n malformed_records: memories.malformedRecords,\n },\n };\n }\n\n private extract(): CursorSQLiteMemories {\n return extractCursorMemories(this.cursorDir);\n }\n}\n","/**\n * GitHub Copilot (local convention) participant — reads the convention-based\n * memory file at `~/.copilot-bourdon/memory.md`. Port of `participants/copilot.py`.\n *\n * Copilot has no accessible local session index (its reasoning is cloud-side and\n * its native memory is not exposed on disk), so — like the Codex pre-distillation\n * fallback — this reader normalizes a user-maintained convention file into a\n * Bourdon L5 manifest. The file is YAML front-matter (structured `entities:` /\n * `sessions:`) followed by an optional freeform markdown body that Copilot Chat\n * reads as plain context but this reader ignores.\n *\n * NOT the cloud GitHub-Copilot network adapter ({@link GitHubCopilotParticipant})\n * and NOT the Copilot CLI SQLite reader.\n *\n * Paths checked (in order):\n * 1. `COPILOT_BOURDON_HOME` env-var override\n * 2. `~/.copilot-bourdon/` (default convention path)\n *\n * Defensive throughout: a missing convention directory raises\n * {@link ParticipantDiscoveryError} from `discover()`; malformed YAML degrades to\n * an empty manifest rather than raising; `healthCheck` never throws.\n */\n\nimport { mkdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { homedir, hostname } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { parse as yamlParse } from \"yaml\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { redactText } from \"@getbourdon/redaction\";\n\nimport {\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\n\nconst AGENT_ID = \"copilot\";\nconst AGENT_TYPE = \"code-assistant\";\nconst DISPLAY_NAME = \"GitHub Copilot\";\nconst ROLE_NARRATIVE =\n \"Inline completion and chat assistant present across every IDE the team uses. \" +\n \"Works alongside the human at the keystroke level -- the ambient layer that \" +\n \"recognises what is being typed before a full turn is even formed. Bourdon \" +\n \"gives Copilot cross-session entity awareness it would otherwise lack entirely.\";\n\n// Convention directory and file names. Override dir with COPILOT_BOURDON_HOME.\nconst CONVENTION_DIR_NAME = \".copilot-bourdon\";\nconst MEMORY_FILENAME = \"memory.md\";\n\n// Front-matter delimiters (mirrors claude-code's parseFrontmatter conventions).\nconst FRONTMATTER_OPEN = \"---\\n\";\nconst FRONTMATTER_CLOSE = \"\\n---\\n\";\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.TEAM,\n private_tags: [\"personal\", \"financial\", \"credential\", \"health\", \"family\", \"legal\"],\n team_tags: [\"copilot-memory\", \"workspace\", \"copilot\"],\n});\n\n/** Minimal logger so a degraded read is visible without pulling in a dep\n * (matches the registry's logging idiom). */\nconst logger = {\n warn(msg: string): void {\n // eslint-disable-next-line no-console\n console.warn(`[bourdon.participants] ${msg}`);\n },\n};\n\n/** Starter template written by `bourdon copilot init`. */\nconst MEMORY_TEMPLATE = `---\n# Copilot Bourdon Memory\n# Edit this file to give Copilot cross-session entity awareness.\n# The YAML front-matter is parsed by \\`bourdon copilot export\\`.\n# The markdown body below the closing \\`---\\` is freeform context for Copilot Chat.\n\nentities: []\n\nsessions: []\n---\n\n# Copilot notes\n\nAdd project notes, preferences, or anything else you want Copilot Chat to\nremember here. This section is freeform -- the participant only reads the YAML\nfront-matter above.\n`;\n\n// -- fs helpers ---------------------------------------------------------------\n\nfunction homeDir(): string {\n // os.homedir() can throw under some sandboxes; stay defensive so import +\n // construction never crash even when HOME points at an unreadable path.\n try {\n return homedir();\n } catch {\n return process.env.HOME || process.env.USERPROFILE || \".\";\n }\n}\n\nfunction isDir(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(p: string): boolean {\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\n// -- Path helpers -------------------------------------------------------------\n\n/**\n * Return the conventional `~/.copilot-bourdon/` directory path. Respects the\n * `COPILOT_BOURDON_HOME` env-var override (returned verbatim, even if absent;\n * the directory is not created here).\n */\nexport function defaultCopilotBourdonDir(): string {\n const env = process.env.COPILOT_BOURDON_HOME;\n if (env) return env;\n return join(homeDir(), CONVENTION_DIR_NAME);\n}\n\n/** Return the path to the convention memory file. */\nexport function defaultCopilotMemoryPath(copilotDir?: string | null): string {\n return join(copilotDir || defaultCopilotBourdonDir(), MEMORY_FILENAME);\n}\n\n// -- Coercion helpers (mirror Python str() / isinstance filtering) ------------\n\n/** Mirror Python `str(value)` for the value types YAML yields here. The `yaml`\n * lib parses timestamps into JS `Date`; Python's `yaml.safe_load` yields\n * `date`/`datetime` whose `str()` is ISO-ish, so a Date is rendered as its ISO\n * date (date-only callers slice to 10 anyway). */\nfunction coerceStr(v: unknown): string {\n if (v instanceof Date) return v.toISOString().slice(0, 10);\n return String(v);\n}\n\n/** Mirror Python `str(raw.get(key) or \"\") or None`. */\nfunction strOrUndef(v: unknown): string | undefined {\n const s = coerceStr((v as unknown) || \"\");\n return s || undefined;\n}\n\n/** Mirror `[str(x) for x in raw if isinstance(x, str) and x.strip()]`. */\nfunction strList(v: unknown): string[] {\n if (!Array.isArray(v)) return [];\n return v.filter((x): x is string => typeof x === \"string\" && x.trim() !== \"\");\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\n// -- YAML frontmatter ---------------------------------------------------------\n\n/**\n * Extract and parse the YAML front-matter block from memory file text. Returns\n * an empty object when the file has no front-matter or when the YAML cannot be\n * parsed (logged at WARNING in the oracle; never raises here either).\n */\nfunction parseFrontmatter(text: string, source?: string): Record<string, unknown> {\n if (!text.startsWith(FRONTMATTER_OPEN)) return {};\n const end = text.indexOf(FRONTMATTER_CLOSE, FRONTMATTER_OPEN.length);\n if (end === -1) return {};\n const fmText = text.slice(FRONTMATTER_OPEN.length, end);\n let parsed: unknown;\n try {\n parsed = yamlParse(fmText);\n } catch (err) {\n const where = source ? ` in ${source}` : \"\";\n const detail = String(err).replace(/\\n/g, \" \").slice(0, 200);\n logger.warn(\n `CopilotParticipant: malformed YAML frontmatter${where}; ` +\n `treating as no-frontmatter (${detail})`,\n );\n return {};\n }\n return isRecord(parsed) ? parsed : {};\n}\n\n/**\n * Read and parse a copilot-bourdon memory file. Returns an empty object on any\n * I/O or parse error — the participant degrades to an empty manifest.\n */\nfunction readMemoryFile(path: string): Record<string, unknown> {\n if (!isFile(path)) return {};\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch (err) {\n logger.warn(`CopilotParticipant: cannot read ${path}: ${String(err)}`);\n return {};\n }\n return parseFrontmatter(text, path);\n}\n\n// -- Entity / Session converters ----------------------------------------------\n\n/** Convert a raw YAML entity record to a Bourdon Entity. Skips malformed\n * entries (oracle logs at DEBUG). Never raises. */\nfunction buildEntity(raw: unknown): EntityModel | null {\n if (!isRecord(raw)) return null;\n const name = raw[\"name\"];\n if (typeof name !== \"string\" || name.trim() === \"\") return null;\n\n const summaryRaw = raw[\"summary\"] || \"\";\n const summary = summaryRaw ? redactText(coerceStr(summaryRaw)) : undefined;\n\n return makeEntity({\n name: name.trim(),\n type: strOrUndef(raw[\"type\"]),\n aliases: strList(raw[\"aliases\"]),\n summary,\n last_touched: strOrUndef(raw[\"last_touched\"]),\n tags: strList(raw[\"tags\"]),\n valid_from: strOrUndef(raw[\"valid_from\"]),\n valid_to: strOrUndef(raw[\"valid_to\"]),\n });\n}\n\n/** Convert a raw YAML session record to a Bourdon Session. Skips malformed\n * entries (oracle logs at DEBUG). Never raises. */\nfunction buildSession(raw: unknown): SessionModel | null {\n if (!isRecord(raw)) return null;\n const dateVal = raw[\"date\"];\n if (!dateVal) return null;\n const dateStr = coerceStr(dateVal).slice(0, 10); // keep YYYY-MM-DD prefix only\n\n return makeSession({\n date: dateStr,\n cwd: strOrUndef(raw[\"cwd\"]),\n project_focus: strList(raw[\"project_focus\"]),\n key_actions: strList(raw[\"key_actions\"]),\n files_touched: strList(raw[\"files_touched\"]),\n });\n}\n\n// -- Diagnostics --------------------------------------------------------------\n\n/** Diagnostic summary of the copilot-bourdon memory file (`bourdon copilot\n * doctor`). Never raises. */\nexport function inspectCopilotMemory(copilotDir?: string | null): Record<string, unknown> {\n const memPath = defaultCopilotMemoryPath(copilotDir);\n const report: Record<string, unknown> = {\n path: memPath,\n present: isFile(memPath),\n readable: false,\n frontmatter_valid: false,\n entity_count: 0,\n session_count: 0,\n error: null,\n };\n if (!isFile(memPath)) {\n report[\"error\"] = \"missing\";\n return report;\n }\n let text: string;\n try {\n text = readFileSync(memPath, \"utf8\");\n report[\"readable\"] = true;\n } catch (err) {\n report[\"error\"] = String(err);\n return report;\n }\n\n const data = parseFrontmatter(text, memPath);\n if (Object.keys(data).length > 0) report[\"frontmatter_valid\"] = true;\n report[\"entity_count\"] = asArray(data[\"entities\"]).length;\n report[\"session_count\"] = asArray(data[\"sessions\"]).length;\n return report;\n}\n\n// -- Participant --------------------------------------------------------------\n\n/**\n * External participant for GitHub Copilot via `~/.copilot-bourdon/memory.md`.\n * Implements {@link BourdonParticipant} structurally.\n */\nexport class CopilotParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n displayName = DISPLAY_NAME;\n nativePath: string;\n\n /** Conventional `~/.copilot-bourdon` dir used by the setup wizard's detection. */\n static defaultNativePath(home?: string): string {\n if (home !== undefined) return join(home, CONVENTION_DIR_NAME);\n return defaultCopilotBourdonDir();\n }\n\n private readonly copilotDir: string | null;\n\n constructor(copilotDir?: string | null) {\n this.copilotDir = copilotDir ?? null;\n this.nativePath = this.copilotDir || defaultCopilotBourdonDir();\n }\n\n discover(): AgentStore {\n const path = this.copilotDir || defaultCopilotBourdonDir();\n if (!isDir(path)) {\n throw new ParticipantDiscoveryError(\n `Copilot convention directory not found at '${path}'. ` +\n \"Run `bourdon copilot init` to create it with a starter template, \" +\n \"or create ~/.copilot-bourdon/memory.md manually.\",\n );\n }\n const memPath = join(path, MEMORY_FILENAME);\n return {\n path,\n version: \"convention-v1\",\n metadata: {\n memory_file: memPath,\n memory_file_present: isFile(memPath),\n },\n };\n }\n\n exportSessions(since?: Date, limit = 100): SessionModel[] {\n const data = this.read();\n const sinceIso = since ? since.toISOString().slice(0, 10) : null;\n const sessions: SessionModel[] = [];\n for (const raw of asArray(data[\"sessions\"])) {\n const session = buildSession(raw);\n if (session === null) continue;\n if (sinceIso && session.date && session.date < sinceIso) continue;\n sessions.push(session);\n if (sessions.length >= limit) break;\n }\n return sessions;\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const data = this.read();\n\n const entities: EntityModel[] = [];\n for (const raw of asArray(data[\"entities\"])) {\n const entity = buildEntity(raw);\n if (entity !== null) entities.push(entity);\n }\n const visibleEntities = filterForFederation(entities, DEFAULT_POLICY);\n\n const sinceIso = since ? since.toISOString().slice(0, 10) : null;\n const sessions: SessionModel[] = [];\n for (const raw of asArray(data[\"sessions\"])) {\n const session = buildSession(raw);\n if (session === null) continue;\n if (sinceIso && session.date && session.date < sinceIso) continue;\n sessions.push(session);\n }\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: AGENT_ID,\n type: AGENT_TYPE,\n instance: hostname() || \"unknown\",\n spec_version_compat: `>=${SPEC_VERSION}`,\n role_narrative: ROLE_NARRATIVE,\n }),\n last_updated: new Date().toISOString(),\n capabilities: [\"inline-completion\", \"chat\", \"pr-review\", \"convention-memory\"],\n recent_sessions: sessions,\n known_entities: visibleEntities,\n visibility_policy: DEFAULT_POLICY,\n });\n }\n\n healthCheck(): HealthStatus {\n const path = this.copilotDir || defaultCopilotBourdonDir();\n if (!isDir(path)) {\n return {\n status: \"blocked\",\n reason:\n `Convention directory ${path} not found. ` +\n \"Run `bourdon copilot init` to create it.\",\n details: { expected_path: path },\n proposedFix: \"Run `bourdon copilot init` to create the convention directory.\",\n };\n }\n const memPath = join(path, MEMORY_FILENAME);\n if (!isFile(memPath)) {\n return {\n status: \"degraded\",\n reason:\n `Memory file ${memPath} not found. ` +\n \"Run `bourdon copilot init` to write a starter template.\",\n details: { expected_memory_file: memPath },\n proposedFix: \"Run `bourdon copilot init` to write the starter memory.md template.\",\n };\n }\n let data: Record<string, unknown>;\n try {\n data = this.read();\n } catch (err) {\n logger.warn(`CopilotParticipant health_check failed: ${String(err)}`);\n return {\n status: \"degraded\",\n reason: \"Memory file present but could not be parsed.\",\n details: { error: String(err) },\n proposedFix:\n `Inspect ${memPath} for malformed YAML front-matter. ` +\n \"The opening and closing `---` fences must wrap a valid YAML \" +\n \"block. See docs/agent-integration-status.md for the schema.\",\n };\n }\n return {\n status: \"ok\",\n details: {\n memory_file: memPath,\n entity_count: asArray(data[\"entities\"]).length,\n session_count: asArray(data[\"sessions\"]).length,\n },\n };\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private read(): Record<string, unknown> {\n return readMemoryFile(defaultCopilotMemoryPath(this.copilotDir));\n }\n}\n\n// -- Init helper --------------------------------------------------------------\n\n/**\n * Create `~/.copilot-bourdon/memory.md` with a starter template. Returns the\n * written path. Throws when the file already exists unless `force` is true.\n */\nexport function initMemoryFile(copilotDir?: string | null, force = false): string {\n const targetDir = copilotDir || defaultCopilotBourdonDir();\n mkdirSync(targetDir, { recursive: true });\n const memPath = join(targetDir, MEMORY_FILENAME);\n if (isFile(memPath) && !force) {\n throw new Error(`${memPath} already exists. Pass --force to overwrite.`);\n }\n writeFileSync(memPath, MEMORY_TEMPLATE, \"utf8\");\n return memPath;\n}\n","/**\n * GitHub Copilot CLI participant — normalize the `copilot` terminal agent's\n * SQLite session store into L5. Port of `participants/copilot_cli.py`.\n *\n * Copilot CLI stores session history in a SQLite database at\n * `~/.copilot/session-store.db` (override `$COPILOT_CLI_HOME`). This is distinct\n * from:\n * - the VS Code Copilot Chat extension (`github-copilot` network reader)\n * - the `~/.copilot-bourdon/memory.md` convention-file participant (`copilot`)\n * - GitHub-embedded Copilot (no local state)\n *\n * The schema (schema_version 4) carries `sessions` / `turns` / `checkpoints`\n * plus `session_files` / `session_refs` / `dynamic_context_items`. The reader\n * opens the DB read-only (`mode=ro` via {@link tryOpenReadonly}) so a live\n * writer's lock can never block the export, probes each table defensively (a\n * missing table degrades to \"no rows\" rather than raising), redacts every native\n * string, applies the visibility filter BEFORE emission, and is deterministic.\n * `healthCheck` never throws.\n */\n\nimport { statSync } from \"node:fs\";\nimport { homedir, hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { redactText } from \"@getbourdon/redaction\";\n\nimport {\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\nimport { tryOpenReadonly, type SqliteDatabase } from \"../sqlite-base.js\";\n\nconst AGENT_ID = \"copilot-cli\";\nconst AGENT_TYPE = \"code-assistant\";\nconst DISPLAY_NAME = \"GitHub Copilot CLI\";\nconst ROLE_NARRATIVE =\n \"Terminal-native Copilot agent with full filesystem + tool access. \" +\n \"Runs multi-turn sessions with checkpoints, file edits, and git \" +\n \"operations. The CLI surface has the deepest tool integration of \" +\n \"all Copilot surfaces — shell, grep, edit, git — and persists \" +\n \"rich session history locally in SQLite.\";\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.TEAM,\n private_tags: [\"personal\", \"financial\", \"credential\", \"health\", \"family\", \"legal\"],\n team_tags: [\"copilot-cli\", \"copilot\", \"terminal\", \"workspace\"],\n});\n\nconst DB_FILENAME = \"session-store.db\";\nconst COPILOT_DIR_NAME = \".copilot\";\nconst MAX_SUMMARY_CHARS = 260;\nconst MAX_KEY_ACTIONS = 6;\nconst MAX_KEY_ACTION_CHARS = 280;\n\n// -- Path resolution ----------------------------------------------------------\n\n/**\n * Conventional `~/.copilot/` directory. Respects the `COPILOT_CLI_HOME`\n * environment-variable override (mirrors `default_copilot_cli_dir`).\n */\nexport function defaultCopilotCliDir(): string {\n const env = process.env.COPILOT_CLI_HOME;\n if (env) return env;\n return join(homedir(), COPILOT_DIR_NAME);\n}\n\n/** Path to `session-store.db` under the given (or conventional) copilot dir. */\nfunction defaultCopilotCliDbPath(copilotDir?: string | null): string {\n return join(copilotDir ?? defaultCopilotCliDir(), DB_FILENAME);\n}\n\nfunction isFile(p: string): boolean {\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\nfunction isDir(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\n// -- Text helpers -------------------------------------------------------------\n\n/** Redact secrets + clamp to the native-memory limit (`_safe_native_memory_text`). */\nfunction safeNativeMemoryText(value: string, limit = 180): string {\n return redactText(value, limit);\n}\n\n/**\n * Collapse whitespace and clamp with a single-char ellipsis (mirrors the\n * oracle's `_bounded`). NOTE: distinct from {@link redactText}'s `...` clamp —\n * this one uses `…` (U+2026) and does no redaction.\n */\nfunction bounded(value: string, limit: number): string {\n const normalized = value.split(/\\s+/).filter(Boolean).join(\" \");\n if (normalized.length <= limit) return normalized;\n return normalized.slice(0, limit - 1).replace(/\\s+$/, \"\") + \"…\";\n}\n\n// -- SQLite (read-only) -------------------------------------------------------\n\n/** Run a query and return rows as plain objects. Never raises (a missing table\n * or any SQLite error degrades to `[]`, matching the oracle's `_query_db`). */\nfunction queryDb(\n db: SqliteDatabase,\n sql: string,\n params: unknown[] = [],\n): Array<Record<string, unknown>> {\n try {\n return db.prepare(sql).all(...params) as Array<Record<string, unknown>>;\n } catch {\n return [];\n }\n}\n\nfunction extractSessions(db: SqliteDatabase, since?: string | null): Array<Record<string, unknown>> {\n let sql = \"SELECT id, cwd, repository, branch, summary, created_at, updated_at FROM sessions\";\n const params: unknown[] = [];\n if (since) {\n sql += \" WHERE created_at >= ?\";\n params.push(since);\n }\n sql += \" ORDER BY created_at DESC LIMIT 200\";\n return queryDb(db, sql, params);\n}\n\nfunction extractSessionFiles(db: SqliteDatabase, sessionId: string): string[] {\n const rows = queryDb(\n db,\n \"SELECT file_path FROM session_files WHERE session_id = ? LIMIT 20\",\n [sessionId],\n );\n const out: string[] = [];\n for (const r of rows) {\n const fp = r[\"file_path\"];\n if (fp) out.push(String(fp));\n }\n return out;\n}\n\nfunction extractSessionRefs(\n db: SqliteDatabase,\n sessionId: string,\n): Array<{ ref_type: string; ref_value: string }> {\n const rows = queryDb(\n db,\n \"SELECT ref_type, ref_value FROM session_refs WHERE session_id = ?\",\n [sessionId],\n );\n return rows.map((r) => ({\n ref_type: String(r[\"ref_type\"] ?? \"\"),\n ref_value: String(r[\"ref_value\"] ?? \"\"),\n }));\n}\n\nfunction extractCheckpoints(db: SqliteDatabase, sessionId: string): Array<Record<string, unknown>> {\n return queryDb(\n db,\n \"SELECT checkpoint_number, title, overview FROM checkpoints \" +\n \"WHERE session_id = ? ORDER BY checkpoint_number\",\n [sessionId],\n );\n}\n\nfunction extractDynamicContext(db: SqliteDatabase): Array<Record<string, unknown>> {\n return queryDb(\n db,\n \"SELECT repository, branch, src, name, description, content, read_count, count \" +\n \"FROM dynamic_context_items ORDER BY count DESC LIMIT 50\",\n );\n}\n\nfunction extractTurnCount(db: SqliteDatabase, sessionId: string): number {\n const rows = queryDb(db, \"SELECT COUNT(*) as cnt FROM turns WHERE session_id = ?\", [sessionId]);\n const first = rows[0];\n return first ? Number(first[\"cnt\"] ?? 0) || 0 : 0;\n}\n\n// -- Conversion to Bourdon types ----------------------------------------------\n\nfunction sessionToBourdon(\n raw: Record<string, unknown>,\n files: string[],\n refs: Array<{ ref_type: string; ref_value: string }>,\n checkpoints: Array<Record<string, unknown>>,\n turnCount: number,\n): SessionModel {\n const created = raw[\"created_at\"] ? String(raw[\"created_at\"]) : \"\";\n const dateStr = created ? created.slice(0, 10) : \"\";\n\n const keyActions: string[] = [];\n if (raw[\"summary\"]) {\n keyActions.push(bounded(safeNativeMemoryText(String(raw[\"summary\"])), MAX_KEY_ACTION_CHARS));\n }\n for (const cp of checkpoints.slice(0, 3)) {\n if (cp[\"title\"]) {\n keyActions.push(\n bounded(`checkpoint: ${safeNativeMemoryText(String(cp[\"title\"]))}`, MAX_KEY_ACTION_CHARS),\n );\n }\n }\n if (turnCount) {\n keyActions.push(`turns: ${turnCount}`);\n }\n for (const ref of refs.slice(0, 3)) {\n const refLabel = `${ref.ref_type}: ${ref.ref_value}`;\n keyActions.push(bounded(refLabel, MAX_KEY_ACTION_CHARS));\n }\n\n const projectFocus: string[] = [];\n if (raw[\"repository\"]) projectFocus.push(String(raw[\"repository\"]));\n\n return makeSession({\n date: dateStr,\n cwd: raw[\"cwd\"] ? String(raw[\"cwd\"]) : undefined,\n project_focus: projectFocus,\n key_actions: keyActions.slice(0, MAX_KEY_ACTIONS),\n files_touched: files.slice(0, 20),\n visibility: Visibility.TEAM,\n });\n}\n\nfunction entitiesFromSessionsAndContext(\n sessions: Array<Record<string, unknown>>,\n dynamicContext: Array<Record<string, unknown>>,\n): EntityModel[] {\n const entities = new Map<string, EntityModel>();\n\n // Repositories as project entities.\n for (const raw of sessions) {\n const repo = raw[\"repository\"] ? String(raw[\"repository\"]) : \"\";\n if (repo && !entities.has(repo)) {\n const created = raw[\"created_at\"] ? String(raw[\"created_at\"]) : \"\";\n const lastTouched = created.slice(0, 10) || null;\n entities.set(\n repo,\n makeEntity({\n name: repo,\n type: \"project\",\n summary: \"Repository worked on via Copilot CLI.\",\n last_touched: lastTouched ?? undefined,\n tags: [\"copilot-cli\", \"project\"],\n visibility: Visibility.TEAM,\n }),\n );\n }\n }\n\n // Dynamic context items as knowledge entities.\n for (const ctx of dynamicContext) {\n const name = ctx[\"name\"] ? String(ctx[\"name\"]) : \"\";\n if (!name || entities.has(name)) continue;\n const desc = ctx[\"description\"] ? String(ctx[\"description\"]) : \"\";\n const content = ctx[\"content\"] ? String(ctx[\"content\"]) : \"\";\n let summaryText = desc || content;\n if (summaryText) {\n summaryText = bounded(safeNativeMemoryText(summaryText), MAX_SUMMARY_CHARS);\n }\n entities.set(\n name,\n makeEntity({\n name,\n type: \"dynamic-context\",\n summary: summaryText || undefined,\n last_touched: undefined,\n tags: [\"copilot-cli\", \"dynamic-context\", ctx[\"src\"] ? String(ctx[\"src\"]) : \"unknown\"],\n visibility: Visibility.TEAM,\n }),\n );\n }\n\n return [...entities.values()];\n}\n\n/** UTC ISO datetime with `+00:00` offset (matching Python `isoformat`). */\nfunction toUtcIso(d: Date): string {\n return d.toISOString().replace(/\\.\\d{3}Z$/, \"+00:00\").replace(/Z$/, \"+00:00\");\n}\n\n// -- Participant --------------------------------------------------------------\n\n/**\n * External participant for GitHub Copilot CLI (`~/.copilot/session-store.db`).\n * Reads the SQLite database read-only (never locks the live db).\n */\nexport class CopilotCliParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n displayName = DISPLAY_NAME;\n nativePath: string;\n\n private readonly copilotDir: string | null;\n\n /** Conventional `~/.copilot` dir used by the setup wizard's detection. */\n static defaultNativePath(home?: string): string {\n if (home) return join(home, COPILOT_DIR_NAME);\n return defaultCopilotCliDir();\n }\n\n constructor(copilotDir?: string) {\n this.copilotDir = copilotDir ?? null;\n this.nativePath = this.copilotDir ?? defaultCopilotCliDir();\n }\n\n // -- Protocol surface -------------------------------------------------------\n\n discover(): AgentStore {\n const dbPath = defaultCopilotCliDbPath(this.copilotDir);\n if (!isFile(dbPath)) {\n throw new ParticipantDiscoveryError(\n `Copilot CLI session-store.db not found at ${dbPath}. ` +\n \"The Copilot CLI agent must be run at least once to create this database.\",\n );\n }\n let dbSize = 0;\n try {\n dbSize = statSync(dbPath).size;\n } catch {\n dbSize = 0;\n }\n return {\n path: dirname(dbPath),\n version: \"schema-v4\",\n metadata: { db_path: dbPath, db_size_bytes: dbSize },\n };\n }\n\n exportSessions(since?: Date, limit = 100): SessionModel[] {\n const dbPath = defaultCopilotCliDbPath(this.copilotDir);\n const db = tryOpenReadonly(dbPath);\n if (!db) return [];\n try {\n const sinceIso = since ? toUtcIso(since) : null;\n const rawSessions = extractSessions(db, sinceIso);\n const sessions: SessionModel[] = [];\n for (const raw of rawSessions.slice(0, limit)) {\n const sid = String(raw[\"id\"]);\n const files = extractSessionFiles(db, sid);\n const refs = extractSessionRefs(db, sid);\n const checkpoints = extractCheckpoints(db, sid);\n const turnCount = extractTurnCount(db, sid);\n sessions.push(sessionToBourdon(raw, files, refs, checkpoints, turnCount));\n }\n return sessions;\n } finally {\n db.close();\n }\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const dbPath = defaultCopilotCliDbPath(this.copilotDir);\n const db = tryOpenReadonly(dbPath);\n if (!db) return this.emptyManifest();\n try {\n const sinceIso = since ? toUtcIso(since) : null;\n const rawSessions = extractSessions(db, sinceIso);\n const dynamicContext = extractDynamicContext(db);\n\n const sessions: SessionModel[] = [];\n for (const raw of rawSessions.slice(0, 100)) {\n const sid = String(raw[\"id\"]);\n const files = extractSessionFiles(db, sid);\n const refs = extractSessionRefs(db, sid);\n const checkpoints = extractCheckpoints(db, sid);\n const turnCount = extractTurnCount(db, sid);\n sessions.push(sessionToBourdon(raw, files, refs, checkpoints, turnCount));\n }\n\n const entities = entitiesFromSessionsAndContext(rawSessions, dynamicContext);\n const visibleEntities = filterForFederation(entities, DEFAULT_POLICY);\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: AGENT_ID,\n type: AGENT_TYPE,\n instance: hostname() || \"unknown\",\n spec_version_compat: `>=${SPEC_VERSION}`,\n role_narrative: ROLE_NARRATIVE,\n }),\n last_updated: new Date().toISOString(),\n capabilities: [\n \"terminal-agent\",\n \"file-edit\",\n \"shell-execution\",\n \"git-operations\",\n \"multi-turn-sessions\",\n \"checkpoints\",\n \"dynamic-context\",\n ],\n recent_sessions: sessions,\n known_entities: visibleEntities,\n visibility_policy: DEFAULT_POLICY,\n });\n } finally {\n db.close();\n }\n }\n\n healthCheck(): HealthStatus {\n try {\n const copilotDir = this.copilotDir ?? defaultCopilotCliDir();\n if (!isDir(copilotDir)) {\n return {\n status: \"blocked\",\n reason: `Copilot CLI directory not found at ${copilotDir}.`,\n details: { expected_path: copilotDir },\n proposedFix:\n \"Run the Copilot CLI agent (`copilot` or `gh copilot`) at least once \" +\n \"to create the session store.\",\n };\n }\n const dbPath = defaultCopilotCliDbPath(copilotDir);\n if (!isFile(dbPath)) {\n return {\n status: \"blocked\",\n reason: `session-store.db not found at ${dbPath}.`,\n details: { expected_db: dbPath },\n proposedFix:\n \"Run the Copilot CLI agent at least once. The session-store.db is \" +\n \"created on first use.\",\n };\n }\n const db = tryOpenReadonly(dbPath);\n if (!db) {\n return {\n status: \"degraded\",\n reason: \"Cannot copy session-store.db for reading.\",\n details: { db_path: dbPath },\n proposedFix: \"Check file permissions on the session-store.db.\",\n };\n }\n try {\n const rawSessions = extractSessions(db);\n const dynamicContext = extractDynamicContext(db);\n const totalTurns = queryDb(db, \"SELECT COUNT(*) as cnt FROM turns\");\n const first = totalTurns[0];\n let dbSize = 0;\n try {\n dbSize = statSync(dbPath).size;\n } catch {\n dbSize = 0;\n }\n return {\n status: \"ok\",\n details: {\n db_path: dbPath,\n db_size_bytes: dbSize,\n session_count: rawSessions.length,\n total_turns: first ? Number(first[\"cnt\"] ?? 0) || 0 : 0,\n dynamic_context_items: dynamicContext.length,\n },\n };\n } finally {\n db.close();\n }\n } catch (err) {\n // healthCheck must NEVER raise (contract).\n return {\n status: \"degraded\",\n reason: `unexpected error: ${String(err)}`,\n details: {},\n };\n }\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private emptyManifest(): L5ManifestModel {\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: AGENT_ID,\n type: AGENT_TYPE,\n instance: hostname() || \"unknown\",\n spec_version_compat: `>=${SPEC_VERSION}`,\n role_narrative: ROLE_NARRATIVE,\n }),\n last_updated: new Date().toISOString(),\n capabilities: [],\n recent_sessions: [],\n known_entities: [],\n visibility_policy: DEFAULT_POLICY,\n });\n }\n}\n","/**\n * Cascade (Windsurf) participant — convention-file reader. Port of\n * `participants/cascade.py`.\n *\n * Cascade's internal state is not exposed on the filesystem in a standardized\n * format (like cloud Copilot). Instead this participant uses a CONVENTION FILE:\n * Cascade maintains a structured memory file at `~/.cascade-bourdon/memory.md`\n * with YAML front-matter carrying `entities` + `sessions`. Cascade owns that\n * projection explicitly (it writes what it knows at session end); the\n * participant normalizes the front-matter into an L5 manifest for federation.\n *\n * Privacy: entity/session summaries pass through the redaction SSOT; the\n * visibility policy (private_tags) filters PRIVATE entities before emission.\n */\n\nimport { mkdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { parse as yamlParse } from \"yaml\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { REDACTED, SENSITIVE_PATTERNS, redactText } from \"@getbourdon/redaction\";\n\nimport {\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\n\n// -- Constants -----------------------------------------------------------------\n\nconst AGENT_ID = \"cascade\";\nconst AGENT_TYPE = \"code-assistant\";\nconst DISPLAY_NAME = \"Cascade (Windsurf)\";\nconst ROLE_NARRATIVE =\n \"Agentic AI coding assistant embedded in Windsurf IDE. \" +\n \"Operates with multi-step planning, tool use (file editing, terminal, \" +\n \"browser preview, code search), persistent memory, and workspace-level \" +\n \"context awareness. Specializes in pair-programming workflows with \" +\n \"concurrent read-plan-execute cycles.\";\n\nconst CONVENTION_DIR_NAME = \".cascade-bourdon\";\nconst MEMORY_FILENAME = \"memory.md\";\n\nconst DEFAULT_POLICY: VisibilityPolicyModel = makeVisibilityPolicy({\n default: Visibility.PUBLIC,\n private_tags: [\"personal\", \"credential\", \"financial\", \"secret\", \"private\"],\n});\n\n/**\n * The native-memory sensitive-pattern set, extended with Cascade-specific\n * triggers (`secret`, `sk_test_*`). A match anywhere drops the WHOLE string to\n * the redaction sentinel (see {@link scrubCredential}). All non-global so they\n * are safe to reuse across `.test()`.\n */\nconst CASCADE_SENSITIVE_PATTERNS: readonly RegExp[] = [\n ...SENSITIVE_PATTERNS,\n /\\bsecret\\b/i,\n /sk[_-]test[_-]/i,\n];\n\n/** Minimal logger so a malformed-frontmatter warning is visible without a dep. */\nconst logger = {\n warn(msg: string): void {\n // eslint-disable-next-line no-console\n console.warn(`[bourdon.participants] ${msg}`);\n },\n};\n\n// -- Path helpers --------------------------------------------------------------\n\nfunction homeDir(): string {\n // os.homedir() can throw under some sandboxes; stay defensive so import +\n // construction never crash even when HOME points at an unreadable path.\n try {\n return homedir();\n } catch {\n return process.env.HOME || process.env.USERPROFILE || \".\";\n }\n}\n\nfunction isDir(p: string): boolean {\n try {\n return statSync(p).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(p: string): boolean {\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\n/** Return the default Cascade-Bourdon convention directory (`~/.cascade-bourdon`). */\nexport function defaultCascadeDir(): string {\n return join(homeDir(), CONVENTION_DIR_NAME);\n}\n\n/** Return the default path to the Cascade memory file. */\nexport function defaultCascadeMemoryPath(): string {\n return join(defaultCascadeDir(), MEMORY_FILENAME);\n}\n\n// -- Front-matter --------------------------------------------------------------\n\n/**\n * Extract YAML front-matter from a `---` fenced block. Returns an empty object\n * when the text has no valid front-matter. On YAML parse failure logs at WARNING\n * (with the source path when provided) and treats it as no-frontmatter.\n *\n * NOTE: this is the Cascade-specific fence parse (`startswith(\"---\")` +\n * `find(\"---\", 3)`), distinct from the claude-code reader's `---\\n` variant —\n * preserved faithfully from the oracle.\n */\nfunction parseFrontmatter(text: string, source?: string): Record<string, unknown> {\n if (!text.startsWith(\"---\")) return {};\n const end = text.indexOf(\"---\", 3);\n if (end === -1) return {};\n const yamlBlock = text.slice(3, end).trim();\n if (!yamlBlock) return {};\n let data: unknown;\n try {\n data = yamlParse(yamlBlock);\n } catch (exc) {\n const where = source ? ` in ${source}` : \"\";\n const detail = String(exc).replace(/\\n/g, \" \").slice(0, 200);\n logger.warn(\n `CascadeParticipant: malformed YAML frontmatter${where}; ` +\n `treating as no-frontmatter (${detail})`,\n );\n return {};\n }\n return typeof data === \"object\" && data !== null && !Array.isArray(data)\n ? (data as Record<string, unknown>)\n : {};\n}\n\n// -- Redaction -----------------------------------------------------------------\n\n/**\n * Redact + truncate native-memory text. Same semantics as the codex reader's\n * `_safe_native_memory_text` (the redaction SSOT), extended with Cascade-\n * specific patterns (`secret`, `sk_test_*`): if any match, drop the whole string\n * to the redaction sentinel; otherwise scrub + cap via {@link redactText}.\n */\nfunction scrubCredential(text: string): string {\n if (!text) return text;\n if (CASCADE_SENSITIVE_PATTERNS.some((p) => p.test(text))) {\n return REDACTED;\n }\n return redactText(text);\n}\n\n// -- Builders ------------------------------------------------------------------\n\n/** Python `list(x or [])`: copy a list verbatim, char-split a string, else []. */\nfunction asList(v: unknown): string[] {\n if (!v) return [];\n if (Array.isArray(v)) return v as string[];\n if (typeof v === \"string\") return Array.from(v);\n return [];\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/** Build an Entity from a raw front-matter dict entry. Returns null on invalid. */\nfunction buildEntity(raw: unknown): EntityModel | null {\n if (!isRecord(raw)) return null;\n const name = raw[\"name\"];\n if (typeof name !== \"string\" || !name.trim()) return null;\n\n let summary: string | undefined;\n const rawSummary = raw[\"summary\"];\n if (typeof rawSummary === \"string\") summary = scrubCredential(rawSummary);\n\n return makeEntity({\n name: name.trim(),\n type: typeof raw[\"type\"] === \"string\" ? (raw[\"type\"] as string) : undefined,\n summary,\n aliases: asList(raw[\"aliases\"]),\n tags: asList(raw[\"tags\"]),\n last_touched: raw[\"last_touched\"] ? String(raw[\"last_touched\"]) : undefined,\n valid_from: raw[\"valid_from\"] ? String(raw[\"valid_from\"]) : undefined,\n valid_to: raw[\"valid_to\"] ? String(raw[\"valid_to\"]) : undefined,\n visibility: undefined,\n });\n}\n\n/** Build a Session from a raw front-matter dict entry. Returns null on invalid. */\nfunction buildSession(raw: unknown): SessionModel | null {\n if (!isRecord(raw)) return null;\n const dateVal = raw[\"date\"];\n if (!dateVal) return null;\n // Normalize datetime strings to date-only (YYYY-MM-DD).\n const dateStr = String(dateVal).slice(0, 10);\n\n return makeSession({\n date: dateStr,\n cwd: raw[\"cwd\"] == null ? undefined : (raw[\"cwd\"] as string),\n key_actions: asList(raw[\"key_actions\"]),\n files_touched: asList(raw[\"files_touched\"]),\n project_focus: asList(raw[\"project_focus\"]),\n visibility: undefined,\n });\n}\n\n/**\n * Mirror `datetime.fromisoformat(date)` on a date-only string for the `since`\n * filter. Returns the UTC midnight Date, or null on a ValueError-equivalent\n * (the caller keeps the session when this is null, matching `except ValueError`).\n */\nfunction parseSessionDate(date: string): Date | null {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) return null;\n const ms = Date.parse(`${date}T00:00:00Z`);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nfunction buildSessions(rawSessions: unknown, since?: Date): SessionModel[] {\n const list = Array.isArray(rawSessions) ? rawSessions : [];\n const sessions: SessionModel[] = [];\n for (const raw of list) {\n const session = buildSession(raw);\n if (session === null) continue;\n if (since !== undefined) {\n const d = parseSessionDate(session.date);\n if (d !== null && d.getTime() < since.getTime()) continue;\n }\n sessions.push(session);\n }\n return sessions;\n}\n\n// -- Diagnostics ---------------------------------------------------------------\n\n/** Diagnostic inspection of the Cascade memory file: presence + content stats. */\nfunction inspectCascadeMemory(cascadeDir: string): Record<string, unknown> {\n const memoryPath = join(cascadeDir, MEMORY_FILENAME);\n if (!isFile(memoryPath)) return { present: false, error: \"missing\" };\n\n let text: string;\n try {\n text = readFileSync(memoryPath, \"utf8\");\n } catch (e) {\n return { present: true, readable: false, error: String(e) };\n }\n\n const data = parseFrontmatter(text, memoryPath);\n if (Object.keys(data).length === 0) {\n return {\n present: true,\n readable: true,\n frontmatter_valid: false,\n entity_count: 0,\n session_count: 0,\n };\n }\n\n const entities = data[\"entities\"];\n const sessions = data[\"sessions\"];\n return {\n present: true,\n readable: true,\n frontmatter_valid: true,\n entity_count: Array.isArray(entities) ? entities.length : 0,\n session_count: Array.isArray(sessions) ? sessions.length : 0,\n };\n}\n\n// -- Init helper ---------------------------------------------------------------\n\nconst MEMORY_TEMPLATE = `---\nentities:\n - name: Example Project\n type: project\n summary: Replace with real project summaries\n tags: [project]\nsessions:\n - date: \"{today}\"\n cwd: /path/to/workspace\n key_actions:\n - Initialized Cascade Bourdon memory\n files_touched: []\n project_focus: []\n---\n\n# Cascade Bourdon Memory\n\nThis file is maintained by Cascade (Windsurf) for cross-agent memory federation.\nEdit the YAML front-matter to update entities and sessions.\nCascade will update this file at session end when instructed.\n`;\n\n/**\n * Create a starter memory.md in the Cascade-Bourdon convention directory.\n *\n * @param cascadeDir Override the convention directory (default `~/.cascade-bourdon`).\n * @param force Overwrite an existing file; otherwise throws.\n * @returns the path to the created memory file.\n */\nexport function initMemoryFile(cascadeDir?: string, force = false): string {\n const targetDir = cascadeDir ?? defaultCascadeDir();\n mkdirSync(targetDir, { recursive: true });\n const memoryPath = join(targetDir, MEMORY_FILENAME);\n\n if (isFile(memoryPath) && !force) {\n throw new Error(\n `Memory file already exists: ${memoryPath}. Use force=True to overwrite.`,\n );\n }\n\n const today = new Date().toISOString().slice(0, 10);\n const content = MEMORY_TEMPLATE.replace(\"{today}\", today);\n writeFileSync(memoryPath, content, \"utf8\");\n return memoryPath;\n}\n\n// -- Participant ---------------------------------------------------------------\n\n/**\n * Convention-based Bourdon participant for Cascade (Windsurf). Reads structured\n * memory from `~/.cascade-bourdon/memory.md` and normalizes it into L5.\n */\nexport class CascadeParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n displayName = DISPLAY_NAME;\n\n private readonly dir: string;\n private readonly policy: VisibilityPolicyModel;\n\n static defaultNativePath(home?: string): string {\n if (home !== undefined) return join(home, CONVENTION_DIR_NAME);\n return defaultCascadeDir();\n }\n\n constructor(cascadeDir?: string, policy?: VisibilityPolicyModel) {\n this.dir = cascadeDir ?? defaultCascadeDir();\n this.policy = policy ?? DEFAULT_POLICY;\n }\n\n /** Path to the Cascade-Bourdon convention directory. */\n get nativePath(): string {\n return this.dir;\n }\n\n private memoryPath(): string {\n return join(this.dir, MEMORY_FILENAME);\n }\n\n private readFrontmatter(): Record<string, unknown> {\n const path = this.memoryPath();\n if (!isFile(path)) return {};\n let text: string;\n try {\n text = readFileSync(path, \"utf8\");\n } catch {\n return {};\n }\n return parseFrontmatter(text, path);\n }\n\n discover(): AgentStore {\n if (!isDir(this.dir)) {\n throw new ParticipantDiscoveryError(\n `Cascade-Bourdon directory not found: ${this.dir}`,\n );\n }\n const memoryPresent = isFile(this.memoryPath());\n return {\n path: this.dir,\n version: \"unknown\",\n metadata: {\n memory_file: this.memoryPath(),\n memory_file_present: memoryPresent,\n },\n };\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const data = this.readFrontmatter();\n\n // Build entities.\n const rawEntities = data[\"entities\"];\n const entityList = Array.isArray(rawEntities) ? rawEntities : [];\n const entities: EntityModel[] = [];\n for (const raw of entityList) {\n const entity = buildEntity(raw);\n if (entity !== null) entities.push(entity);\n }\n\n // Build sessions (since-filtered).\n const sessions = buildSessions(data[\"sessions\"], since);\n\n // Apply visibility policy — filter out PRIVATE entities before emission.\n const visibleEntities = filterForFederation(entities, this.policy);\n\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: AGENT_ID,\n type: AGENT_TYPE,\n role_narrative: ROLE_NARRATIVE,\n }),\n last_updated: new Date().toISOString(),\n known_entities: visibleEntities,\n recent_sessions: sessions,\n capabilities: [\"chat\", \"code-editing\", \"terminal\", \"planning\", \"search\"],\n });\n }\n\n exportSessions(since?: Date, limit?: number): SessionModel[] {\n const data = this.readFrontmatter();\n const sessions = buildSessions(data[\"sessions\"], since);\n sessions.sort((a, b) => (a.date < b.date ? 1 : a.date > b.date ? -1 : 0));\n if (limit !== undefined) return sessions.slice(0, limit);\n return sessions;\n }\n\n healthCheck(): HealthStatus {\n if (!isDir(this.dir)) {\n return {\n status: \"blocked\",\n reason: \"Cascade-Bourdon directory not found\",\n details: { expected_path: this.dir },\n proposedFix:\n \"Run `bourdon cascade init` to create the convention directory + starter memory.md.\",\n };\n }\n\n const report = inspectCascadeMemory(this.dir);\n if (!report[\"present\"]) {\n return {\n status: \"degraded\",\n reason: \"Memory file not found; run `bourdon cascade init` to create it\",\n details: report,\n proposedFix:\n \"Run `bourdon cascade init` to write the starter memory.md template.\",\n };\n }\n\n if (!report[\"readable\"]) {\n return {\n status: \"degraded\",\n reason: `Memory file not readable: ${String(report[\"error\"])}`,\n details: report,\n proposedFix:\n `Check filesystem permissions on ${join(this.dir, \"memory.md\")} ` +\n \"(should be readable by your user).\",\n };\n }\n\n if (!report[\"frontmatter_valid\"]) {\n return {\n status: \"degraded\",\n reason: \"Memory file has no valid YAML front-matter\",\n details: report,\n proposedFix:\n `Inspect ${join(this.dir, \"memory.md\")} -- the opening and closing ` +\n \"`---` fences must wrap a valid YAML block. Run \" +\n \"`bourdon cascade init --force` to reset to the template \" +\n \"(WARNING: this overwrites existing content).\",\n };\n }\n\n return {\n status: \"ok\",\n details: report,\n };\n }\n}\n","/**\n * OpenClaw participant — network-shaped, QUARANTINED-CLASS. Port of\n * `participants/openclaw.py` (v0.9.0, spec R4/D9).\n *\n * OpenClaw is the highest-demand adapter target in the ecosystem and also its\n * highest-risk agent class: CVE-2026-25253 (one-click RCE, CVSS 8.8, first\n * patched in 2026.1.29), tens of thousands of internet-exposed instances (~93%\n * without authentication), ClawHub's malicious-skill problem, and auth disabled\n * by default on port 8080. Bourdon therefore treats OpenClaw differently from\n * every on-disk participant:\n *\n * 1. **Network-shaped** — state is read from the OpenClaw instance's local\n * HTTP API, not on-disk artifacts. Because the {@link BourdonParticipant}\n * contract is SYNCHRONOUS (`discover`/`exportL5` return values, not\n * Promises) and `fetch` is async, the reads go through a tiny synchronous\n * `curl` shell-out (the same idiom as the github-copilot reader).\n * 2. **Hard handshake gate** — {@link OpenClawParticipant.discover} refuses to\n * talk to an instance that is unpatched (< 2026.1.29) or has authentication\n * disabled. These are refusals with exact reasons AND fixes, not warnings,\n * and every read re-runs the gate.\n * 3. **Quarantined-class** — `quarantinedClass = true`: registering the agent\n * trusted requires `--i-understand-the-risk`, and exports stage for\n * operator review (spec D6: quarantine follows the content, not the\n * invoker). Its content federates under TEAM, never PUBLIC.\n *\n * We gate on instance hygiene (version, auth) — NOT on auditing the user's\n * installed skills; that's ClawSecure et al.'s job (spec non-goal 3).\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport {\n Visibility,\n filterForFederation,\n makeAgentInfo,\n makeEntity,\n makeManifest,\n makeSession,\n makeVisibilityPolicy,\n type EntityModel,\n type L5ManifestModel,\n type SessionModel,\n type VisibilityPolicyModel,\n} from \"@getbourdon/l5\";\nimport { redactText } from \"@getbourdon/redaction\";\n\nimport {\n ParticipantDiscoveryError,\n SPEC_VERSION,\n type AgentStore,\n type BourdonParticipant,\n type HealthStatus,\n} from \"../base.js\";\n\n// -- Constants -----------------------------------------------------------------\n\nconst AGENT_ID = \"openclaw\";\nconst AGENT_TYPE = \"other\";\nconst DISPLAY_NAME = \"OpenClaw (quarantined)\";\nconst ROLE_NARRATIVE =\n \"OpenClaw personal AI assistant — federated as a QUARANTINED member: \" +\n \"its reads are limited to granted namespaces and its writes are staged \" +\n \"for operator review.\";\n\n/** First OpenClaw release that patches CVE-2026-25253 (one-click RCE). */\nexport const MIN_PATCHED_VERSION = \"2026.1.29\";\n\nconst DEFAULT_OPENCLAW_URL = \"http://127.0.0.1:8080\";\n\nconst SESSION_LIMIT = 50;\nconst ENTITY_LIMIT = 100;\n\n// -- Helpers -------------------------------------------------------------------\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/**\n * `_safe_native_memory_text(v)` in Python == `redact_text(v, limit=180)`. The\n * TS redaction SSOT exposes `redactText(value, limit = 180)` (positional), so\n * we pass the cap explicitly to make the surface's 180-char limit load-bearing.\n */\nfunction safeNativeMemoryText(value: string): string {\n return redactText(value, 180);\n}\n\n/**\n * `\"2026.1.29\"` -> `[2026, 1, 29]`. Tolerates suffixes like `\"2026.1.29-beta\"`;\n * returns null when nothing numeric parses. Faithful port of `_parse_version`.\n */\nfunction parseVersion(value: string): number[] | null {\n const parts: number[] = [];\n for (const chunk of String(value ?? \"\").trim().split(\".\")) {\n const match = /^(\\d+)/.exec(chunk);\n if (!match) break;\n parts.push(Number(match[1]));\n }\n return parts.length > 0 ? parts : null;\n}\n\n/** Tuple comparison mirroring Python's `tuple < tuple` (lexicographic, shorter\n * is smaller when it is a prefix). */\nfunction versionLessThan(a: number[], b: number[]): boolean {\n const n = Math.max(a.length, b.length);\n for (let i = 0; i < n; i += 1) {\n const av = i < a.length ? (a[i] as number) : undefined;\n const bv = i < b.length ? (b[i] as number) : undefined;\n if (av === undefined) return true; // a is a shorter prefix of b\n if (bv === undefined) return false; // b is a shorter prefix of a\n if (av < bv) return true;\n if (av > bv) return false;\n }\n return false;\n}\n\n/** `_status_version`: first non-empty of version / openclaw_version / app_version. */\nfunction statusVersion(status: Record<string, unknown>): string {\n for (const key of [\"version\", \"openclaw_version\", \"app_version\"]) {\n const value = status[key];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return \"\";\n}\n\n/** `_status_auth_enabled`: auth_enabled / authEnabled / auth.enabled. */\nfunction statusAuthEnabled(status: Record<string, unknown>): boolean {\n for (const key of [\"auth_enabled\", \"authEnabled\"]) {\n if (key in status) return Boolean(status[key]);\n }\n const auth = status[\"auth\"];\n if (isRecord(auth)) return Boolean(auth[\"enabled\"]);\n return false;\n}\n\n/**\n * Hard handshake preconditions (spec D9). Returns the version on success.\n * Raises {@link ParticipantDiscoveryError} with the exact reason AND the fix —\n * these are refusals, not warnings.\n */\nexport function verifyInstance(status: Record<string, unknown>, url: string): string {\n const version = statusVersion(status);\n const parsed = parseVersion(version);\n const minimum = parseVersion(MIN_PATCHED_VERSION) as number[];\n if (parsed === null) {\n throw new ParticipantDiscoveryError(\n `OpenClaw at ${url} did not report a parseable version ` +\n `(got ${JSON.stringify(version)}). Refusing handshake: cannot verify the ` +\n `CVE-2026-25253 patch level. Fix: upgrade OpenClaw to ` +\n `>= ${MIN_PATCHED_VERSION} and ensure /api/status reports it.`,\n );\n }\n if (versionLessThan(parsed, minimum)) {\n throw new ParticipantDiscoveryError(\n `OpenClaw at ${url} runs ${version}, which predates the ` +\n `CVE-2026-25253 patch (one-click RCE, CVSS 8.8). Refusing ` +\n `handshake. Fix: upgrade OpenClaw to >= ${MIN_PATCHED_VERSION}.`,\n );\n }\n if (!statusAuthEnabled(status)) {\n throw new ParticipantDiscoveryError(\n `OpenClaw at ${url} has authentication DISABLED (the exposed-` +\n \"instance default). Refusing handshake. Fix: enable auth in \" +\n \"your OpenClaw config (set auth.enabled=true / OPENCLAW_AUTH=1), \" +\n \"restart the instance, and set OPENCLAW_TOKEN for Bourdon.\",\n );\n }\n return version;\n}\n\n/**\n * Mirror `_before`: return true when `dateText` is strictly before `since`.\n * Reproduces `datetime.fromisoformat(dateText.replace(\"Z\",\"+00:00\"))` with the\n * naive→UTC coercion, and returns false on a parse (ValueError) miss so the\n * caller keeps the session.\n */\nfunction before(dateText: string, since: Date): boolean {\n const parsed = fromIsoformatUtc(dateText.replace(/Z/g, \"+00:00\"));\n if (parsed === null) return false; // ValueError -> keep\n return parsed.getTime() < since.getTime();\n}\n\n/**\n * A best-effort `datetime.fromisoformat` for the two shapes OpenClaw emits\n * (date-only and datetime, with or without an offset). A naive value (no\n * offset) is interpreted as UTC — matching the Python `parsed.replace(\n * tzinfo=timezone.utc)`. Returns null on an unparseable value.\n */\nfunction fromIsoformatUtc(text: string): Date | null {\n const value = text.trim();\n if (!value) return null;\n const hasOffset = /[+-]\\d{2}:?\\d{2}$/.test(value);\n // date-only ISO is already interpreted as UTC midnight by Date.parse;\n // a naive datetime (\"...T..\") must be pinned to UTC with a trailing Z.\n const normalized = hasOffset || !value.includes(\"T\") ? value : `${value}Z`;\n const ms = Date.parse(normalized);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\n/** Python `str(now_utc, \"%Y-%m-%dT%H:%M:%SZ\")` — second precision, Z suffix. */\nfunction nowIsoSeconds(): string {\n return new Date().toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\n// -- HTTP ----------------------------------------------------------------------\n\ninterface CurlResponse {\n status: number;\n body: string;\n}\n\n/**\n * Synchronous GET via a tiny `curl` shell-out — the base contract is\n * synchronous (matching the Python `urllib` reference), so `fetch` cannot be\n * used. `-w` appends the HTTP status on a trailing sentinel line for parsing.\n * Throws when curl itself fails (connection refused / timeout / DNS), which the\n * caller maps to \"instance unreachable\".\n */\nfunction curlGet(url: string, token: string | undefined, timeoutSec: number): CurlResponse {\n const args = [\"-sS\", \"-o\", \"-\", \"--max-time\", String(timeoutSec)];\n if (token) {\n args.push(\"-H\", `Authorization: Bearer ${token}`);\n }\n args.push(\"-w\", \"\\n__BOURDON_STATUS__%{http_code}\", url);\n\n const raw = execFileSync(\"curl\", args, {\n encoding: \"utf8\",\n timeout: (timeoutSec + 2) * 1000,\n maxBuffer: 8 * 1024 * 1024,\n });\n\n const statusMatch = /\\n__BOURDON_STATUS__(\\d+)$/.exec(raw);\n const status = statusMatch ? Number(statusMatch[1]) : 0;\n const body = statusMatch ? raw.slice(0, statusMatch.index) : raw;\n return { status, body };\n}\n\n/**\n * Minimal HTTP client for a local OpenClaw instance. Read-only: status,\n * sessions, memories. Failures raise {@link ParticipantDiscoveryError} with the\n * reason — the participant decides how to surface them.\n *\n * Error mapping (faithful to the Python `urllib` client): an HTTP >= 400\n * response -> \"returned HTTP {code}\"; a transport failure / timeout / non-JSON\n * body -> \"instance unreachable at {url}\".\n */\nexport class OpenClawApiClient {\n readonly url: string;\n private readonly token: string | undefined;\n readonly timeout: number;\n\n constructor(url: string, token?: string, timeout = 5.0) {\n this.url = url.replace(/\\/+$/, \"\");\n this.token = token;\n this.timeout = timeout;\n }\n\n private get(path: string): unknown {\n let resp: CurlResponse;\n try {\n resp = curlGet(this.url + path, this.token, this.timeout);\n } catch (err) {\n throw new ParticipantDiscoveryError(\n `OpenClaw instance unreachable at ${this.url} (${String(err)})`,\n );\n }\n if (resp.status >= 400) {\n throw new ParticipantDiscoveryError(\n `OpenClaw API ${path} returned HTTP ${resp.status}`,\n );\n }\n if (resp.status === 0) {\n throw new ParticipantDiscoveryError(\n `OpenClaw instance unreachable at ${this.url} (no HTTP response)`,\n );\n }\n try {\n return JSON.parse(resp.body);\n } catch (err) {\n throw new ParticipantDiscoveryError(\n `OpenClaw instance unreachable at ${this.url} (${String(err)})`,\n );\n }\n }\n\n status(): Record<string, unknown> {\n const data = this.get(\"/api/status\");\n return isRecord(data) ? data : {};\n }\n\n sessions(): Record<string, unknown>[] {\n return this.readCollection(\"/api/sessions\", \"sessions\");\n }\n\n memories(): Record<string, unknown>[] {\n return this.readCollection(\"/api/memories\", \"memories\");\n }\n\n /** Shared `sessions()`/`memories()` body: try/except-returns-[], unwrap the\n * `{ \"<key>\": [...] }` envelope, and keep only object rows. */\n private readCollection(path: string, key: string): Record<string, unknown>[] {\n let data: unknown;\n try {\n data = this.get(path);\n } catch (err) {\n if (err instanceof ParticipantDiscoveryError) return [];\n throw err;\n }\n if (isRecord(data)) {\n data = data[key] || [];\n }\n if (!Array.isArray(data)) return [];\n return data.filter(isRecord);\n }\n}\n\n// -- Participant ---------------------------------------------------------------\n\n/** Bourdon participant for OpenClaw (quarantined class). */\nexport class OpenClawParticipant implements BourdonParticipant {\n agentId = AGENT_ID;\n agentType = AGENT_TYPE;\n displayName = DISPLAY_NAME;\n /** Trust marker consumed by `bourdon agent add/set-tier` + export-all:\n * registering as trusted needs --i-understand-the-risk; exports stage. */\n quarantinedClass = true;\n\n readonly url: string;\n private readonly client: OpenClawApiClient;\n\n static defaultNativePath(home?: string): string {\n // Network-shaped: shown in the wizard for orientation only. The actual\n // store is the instance API (OPENCLAW_URL).\n return join(home ?? homedir(), \".openclaw\");\n }\n\n constructor(url?: string, token?: string, client?: OpenClawApiClient) {\n this.url = (url || process.env.OPENCLAW_URL || DEFAULT_OPENCLAW_URL).replace(/\\/+$/, \"\");\n this.client = client ?? new OpenClawApiClient(this.url, token ?? process.env.OPENCLAW_TOKEN);\n }\n\n get nativePath(): string {\n return this.url;\n }\n\n // -- protocol ----------------------------------------------------------------\n\n discover(): AgentStore {\n const status = this.client.status();\n const version = verifyInstance(status, this.url);\n return {\n path: this.url,\n version,\n metadata: { auth_enabled: true, transport: \"http\" },\n };\n }\n\n exportSessions(since?: Date, limit: number = SESSION_LIMIT): SessionModel[] {\n this.discover(); // handshake gate applies to every read\n const sessions: SessionModel[] = [];\n for (const row of this.client.sessions()) {\n const date = String(row[\"updated_at\"] || row[\"started_at\"] || row[\"date\"] || \"\").trim();\n if (!date) continue;\n if (since !== undefined && before(date, since)) continue;\n const title = safeNativeMemoryText(String(row[\"title\"] || row[\"summary\"] || \"\"));\n const projects = Array.isArray(row[\"projects\"]) ? row[\"projects\"].slice(0, 5) : [];\n sessions.push(\n makeSession({\n date,\n cwd: undefined,\n project_focus: projects.map((p) => safeNativeMemoryText(String(p))),\n key_actions: title ? [title] : [],\n }),\n );\n if (sessions.length >= limit) break;\n }\n return sessions;\n }\n\n exportL5(since?: Date): L5ManifestModel {\n const store = this.discover();\n const entities: EntityModel[] = [];\n for (const row of this.client.memories().slice(0, ENTITY_LIMIT)) {\n const name = safeNativeMemoryText(String(row[\"name\"] || row[\"title\"] || \"\"));\n if (!name) continue;\n const tags = Array.isArray(row[\"tags\"]) ? row[\"tags\"].slice(0, 8) : [];\n entities.push(\n makeEntity({\n name,\n type: String(row[\"type\"] || \"topic\"),\n summary: safeNativeMemoryText(String(row[\"summary\"] || \"\")),\n tags: tags.map((t) => safeNativeMemoryText(String(t))),\n }),\n );\n }\n // Quarantined-class content defaults to TEAM, never PUBLIC: it only\n // federates beyond the local library after an explicit operator promotion\n // AND a team-level read.\n const policy: VisibilityPolicyModel = makeVisibilityPolicy({ default: Visibility.TEAM });\n return makeManifest({\n spec_version: SPEC_VERSION,\n agent: makeAgentInfo({\n id: AGENT_ID,\n type: AGENT_TYPE,\n instance: this.url,\n role_narrative: ROLE_NARRATIVE,\n }),\n last_updated: nowIsoSeconds(),\n capabilities: [`openclaw ${store.version}`],\n recent_sessions: this.exportSessions(since),\n known_entities: filterForFederation(entities, policy),\n visibility_policy: policy,\n });\n }\n\n healthCheck(): HealthStatus {\n let store: AgentStore;\n try {\n store = this.discover();\n } catch (exc) {\n if (exc instanceof ParticipantDiscoveryError) {\n const reason = exc.message;\n let fix = \"see the refusal reason above\";\n if (reason.includes(\"upgrade OpenClaw\")) {\n fix = `upgrade the OpenClaw instance to >= ${MIN_PATCHED_VERSION}`;\n } else if (reason.includes(\"authentication DISABLED\")) {\n fix = \"enable auth on the OpenClaw instance, then set OPENCLAW_TOKEN\";\n } else if (reason.includes(\"unreachable\")) {\n fix =\n \"start OpenClaw locally or set OPENCLAW_URL to the instance address\";\n }\n return { status: \"blocked\", reason, proposedFix: fix, details: {} };\n }\n // health_check must never raise.\n return {\n status: \"degraded\",\n reason: exc instanceof Error ? exc.message : String(exc),\n details: {},\n };\n }\n return {\n status: \"ok\",\n details: { url: this.url, version: store.version, quarantined: true },\n };\n }\n}\n","/**\n * Participant discovery — a STATIC TS registry replacing Python's `pkgutil`\n * package scan + entry-point duck-type (`participants/__init__.py`).\n *\n * Python scans the `participants/` package at runtime and duck-types each class\n * by `_PARTICIPANT_MARKER_ATTRS`. A filesystem package scan does not survive\n * bundling (`npx bourdon` is a single file), so the JS side declares an explicit\n * {@link FIRST_PARTY} array. The three preserved invariants:\n * - output sorted by `agentId`\n * - first-wins dedupe on `agentId`\n * - log-and-skip a participant that throws on construction (one broken reader\n * must NOT abort discovery / crash the CLI)\n *\n * The marker-attr duck-typing collapses into the {@link BourdonParticipant}\n * interface conformance (checked structurally via {@link isParticipant}).\n */\n\nimport { isParticipant, type BourdonParticipant } from \"./base.js\";\nimport { CascadeParticipant } from \"./readers/cascade.js\";\nimport { ClaudeCodeParticipant } from \"./readers/claude-code.js\";\nimport { CopilotParticipant } from \"./readers/copilot.js\";\nimport { CopilotCliParticipant } from \"./readers/copilot-cli.js\";\nimport { CursorParticipant } from \"./readers/cursor.js\";\nimport { GitHubCopilotParticipant } from \"./readers/github-copilot.js\";\nimport { HermesParticipant } from \"./readers/hermes.js\";\nimport { OpenClawParticipant } from \"./readers/openclaw.js\";\n\n/** A zero-arg-constructible participant class. */\nexport type ParticipantCtor = new () => BourdonParticipant;\n\n/**\n * The first-party reader registry. Order here is irrelevant — discovery sorts by\n * `agentId`. (cursor / copilot-cli are the heavier SQLite readers; copilot is the\n * convention-file reader; cascade reads Windsurf; openclaw is the quarantined-\n * class network reader. codex — the ~2.6k-line turn-compiler reader — is still\n * deferred.)\n */\nexport const FIRST_PARTY: ParticipantCtor[] = [\n CascadeParticipant as unknown as ParticipantCtor,\n ClaudeCodeParticipant as unknown as ParticipantCtor,\n CopilotParticipant as unknown as ParticipantCtor,\n CopilotCliParticipant as unknown as ParticipantCtor,\n CursorParticipant as unknown as ParticipantCtor,\n GitHubCopilotParticipant as unknown as ParticipantCtor,\n HermesParticipant as unknown as ParticipantCtor,\n OpenClawParticipant as unknown as ParticipantCtor,\n];\n\n/** Minimal logger so a skipped participant is visible without a dep. */\nconst logger = {\n warn(msg: string): void {\n // eslint-disable-next-line no-console\n console.warn(`[bourdon.participants] ${msg}`);\n },\n};\n\n/**\n * Instantiate each registered participant, duck-type the contract, sort by\n * `agentId`, and first-wins dedupe. A class that throws on construction is\n * logged and skipped — never propagated.\n */\nexport function discoverParticipants(\n ctors: ParticipantCtor[] = FIRST_PARTY,\n): BourdonParticipant[] {\n const found = new Map<string, BourdonParticipant>();\n for (const Ctor of [...ctors, ...resolvePluginParticipants()]) {\n let instance: BourdonParticipant;\n try {\n instance = new Ctor();\n } catch (err) {\n logger.warn(\n `Skipping participant ${Ctor.name || \"<anonymous>\"}: construction failed: ${String(err)}`,\n );\n continue;\n }\n if (!isParticipant(instance)) continue;\n if (!found.has(instance.agentId)) found.set(instance.agentId, instance);\n }\n return [...found.values()].sort((a, b) =>\n a.agentId < b.agentId ? -1 : a.agentId > b.agentId ? 1 : 0,\n );\n}\n\n/**\n * Optional Layer 2: third-party plugins declared via a `package.json`\n * `\"bourdon\": { participants: { ... } }` field. Gated behind `BOURDON_PLUGINS=1`\n * and a no-op today (no external participant exists yet) — the resolver ships so\n * the seam is wired, defaulted off so `npx bourdon` stays predictable.\n */\nexport function resolvePluginParticipants(): ParticipantCtor[] {\n if (process.env.BOURDON_PLUGINS !== \"1\") return [];\n // No external participant package exists yet; the resolver is intentionally a\n // no-op stub. When one ships, resolve its declared ctors here.\n return [];\n}\n"],"mappings":"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","names":["import_node_fs","import_node_fs","import_node_os","import_node_path","import_node_fs","import_node_os","import_node_path","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","ROLE_NARRATIVE","DEFAULT_POLICY","isDir","isFile","yamlParse","projectEntities","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","ROLE_NARRATIVE","DEFAULT_POLICY","import_node_fs","import_node_os","import_node_path","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","ROLE_NARRATIVE","DEFAULT_POLICY","homeDir","isDir","isFile","import_node_fs","import_node_os","import_node_path","import_yaml","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","ROLE_NARRATIVE","FRONTMATTER_OPEN","FRONTMATTER_CLOSE","DEFAULT_POLICY","homeDir","isDir","isFile","isRecord","parseFrontmatter","FRONTMATTER_OPEN","FRONTMATTER_CLOSE","yamlParse","buildSession","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","isDir","isFile","buildSession","DEFAULT_POLICY","ROLE_NARRATIVE","import_node_fs","import_node_os","import_node_path","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","ROLE_NARRATIVE","DEFAULT_POLICY","MAX_SUMMARY_CHARS","isFile","isDir","bounded","import_node_fs","import_node_os","import_node_path","import_yaml","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","ROLE_NARRATIVE","CONVENTION_DIR_NAME","MEMORY_FILENAME","DEFAULT_POLICY","logger","homeDir","isDir","isFile","parseFrontmatter","yamlParse","logger","isRecord","buildEntity","buildSession","MEMORY_FILENAME","isFile","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","CONVENTION_DIR_NAME","DEFAULT_POLICY","MEMORY_FILENAME","isFile","parseFrontmatter","isDir","buildEntity","ROLE_NARRATIVE","import_node_child_process","import_node_os","import_node_path","import_l5","import_redaction","AGENT_ID","AGENT_TYPE","DISPLAY_NAME","ROLE_NARRATIVE","isRecord","safeNativeMemoryText","nowIsoSeconds","curlGet","logger","import_l5"]}
|