@getbourdon/participants 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1469 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +398 -0
- package/dist/index.js.map +1 -0
- package/package.json +4 -4
|
@@ -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/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. Three reader categories:\n * - SQLite (read-only, better-sqlite3 mode=ro): {@link HermesParticipant}\n * - file / convention: {@link ClaudeCodeParticipant}\n * - network (TTL cache + lazy AuthProvider): {@link GitHubCopilotParticipant}\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 * Follow-on slice: cursor + codex (heavier SQLite) + copilot_cli; openclaw ships\n * as the @getbourdon/openclaw plugin.\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\";\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 /** 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 * 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 { ClaudeCodeParticipant } from \"./readers/claude-code.js\";\nimport { GitHubCopilotParticipant } from \"./readers/github-copilot.js\";\nimport { HermesParticipant } from \"./readers/hermes.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 / codex / copilot_cli are the heavier SQLite readers of the\n * follow-on slice; openclaw ships as the `@getbourdon/openclaw` plugin.)\n */\nexport const FIRST_PARTY: ParticipantCtor[] = [\n ClaudeCodeParticipant as unknown as ParticipantCtor,\n GitHubCopilotParticipant as unknown as ParticipantCtor,\n HermesParticipant 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_l5"]}
|