@prismer/runtime 1.9.0-hotfix.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.
Files changed (39) hide show
  1. package/README.md +288 -0
  2. package/dist/adapter-registry-EMZFKFYK.mjs +8 -0
  3. package/dist/adapter-registry-EMZFKFYK.mjs.map +1 -0
  4. package/dist/artifacts-uploader-N2HNBSTW.mjs +159 -0
  5. package/dist/artifacts-uploader-N2HNBSTW.mjs.map +1 -0
  6. package/dist/auto-register-M4YSPJS6.mjs +204 -0
  7. package/dist/auto-register-M4YSPJS6.mjs.map +1 -0
  8. package/dist/bin/prismer.js +14988 -0
  9. package/dist/chunk-BJTO5JO5.mjs +11 -0
  10. package/dist/chunk-BJTO5JO5.mjs.map +1 -0
  11. package/dist/chunk-JIEDFDVI.mjs +148 -0
  12. package/dist/chunk-JIEDFDVI.mjs.map +1 -0
  13. package/dist/chunk-NDNX2G6O.mjs +68 -0
  14. package/dist/chunk-NDNX2G6O.mjs.map +1 -0
  15. package/dist/chunk-POWV475F.mjs +45 -0
  16. package/dist/chunk-POWV475F.mjs.map +1 -0
  17. package/dist/chunk-VTFKZAUY.mjs +68 -0
  18. package/dist/chunk-VTFKZAUY.mjs.map +1 -0
  19. package/dist/dispatch-mux-MW4HHICS.mjs +8 -0
  20. package/dist/dispatch-mux-MW4HHICS.mjs.map +1 -0
  21. package/dist/dispatch-rpc-J7H6KC2V.mjs +78 -0
  22. package/dist/dispatch-rpc-J7H6KC2V.mjs.map +1 -0
  23. package/dist/fs-rpc-OSHJZYK6.mjs +58 -0
  24. package/dist/fs-rpc-OSHJZYK6.mjs.map +1 -0
  25. package/dist/heartbeat-loop-H2LAI3V5.mjs +95 -0
  26. package/dist/heartbeat-loop-H2LAI3V5.mjs.map +1 -0
  27. package/dist/icon +21 -0
  28. package/dist/index.d.mts +2063 -0
  29. package/dist/index.d.ts +2063 -0
  30. package/dist/index.js +10013 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/index.mjs +8807 -0
  33. package/dist/index.mjs.map +1 -0
  34. package/dist/mode-b-DXJ7FJAL.mjs +152 -0
  35. package/dist/mode-b-DXJ7FJAL.mjs.map +1 -0
  36. package/dist/registry-ZYU2HDFL.mjs +12 -0
  37. package/dist/registry-ZYU2HDFL.mjs.map +1 -0
  38. package/dist/smallicon +6 -0
  39. package/package.json +72 -0
@@ -0,0 +1,204 @@
1
+ import {
2
+ AGENT_CATALOG
3
+ } from "./chunk-JIEDFDVI.mjs";
4
+ import "./chunk-BJTO5JO5.mjs";
5
+
6
+ // src/adapters/cli-adapter.ts
7
+ import { spawn } from "child_process";
8
+ function createCliAdapter(config) {
9
+ const promptVia = config.promptVia ?? "last-arg";
10
+ const timeoutMs = config.timeoutMs ?? 5 * 60 * 1e3;
11
+ return {
12
+ name: config.name,
13
+ tiersSupported: config.tiersSupported,
14
+ capabilityTags: config.capabilityTags,
15
+ metadata: { binary: config.binary, promptVia },
16
+ async dispatch(input) {
17
+ return await runCliOnce(config, input, { promptVia, timeoutMs });
18
+ },
19
+ async health() {
20
+ return { healthy: true };
21
+ },
22
+ async reset(_agentName) {
23
+ return { ok: true, state: "stateless_noop" };
24
+ }
25
+ };
26
+ }
27
+ function runCliOnce(config, input, runOpts) {
28
+ return new Promise((resolve) => {
29
+ const args = [...config.baseArgs ?? []];
30
+ if (runOpts.promptVia === "last-arg") {
31
+ args.push(input.prompt);
32
+ }
33
+ const spawnOpts = {
34
+ cwd: config.cwd,
35
+ env: { ...process.env, ...config.env ?? {} },
36
+ stdio: ["pipe", "pipe", "pipe"]
37
+ };
38
+ let child;
39
+ try {
40
+ child = spawn(config.binary, args, spawnOpts);
41
+ } catch (err) {
42
+ resolve({ ok: false, error: `spawn_failed:${err.message}` });
43
+ return;
44
+ }
45
+ if (runOpts.promptVia === "stdin") {
46
+ child.stdin?.end(input.prompt, "utf8");
47
+ } else if (child.stdin) {
48
+ child.stdin.end();
49
+ }
50
+ let stdoutBuf = "";
51
+ let stderrBuf = "";
52
+ const MAX_BUF = 8 * 1024 * 1024;
53
+ child.stdout?.on("data", (chunk) => {
54
+ if (stdoutBuf.length < MAX_BUF) stdoutBuf += chunk.toString();
55
+ });
56
+ child.stderr?.on("data", (chunk) => {
57
+ if (stderrBuf.length < MAX_BUF) stderrBuf += chunk.toString();
58
+ });
59
+ let timedOut = false;
60
+ const timer = setTimeout(() => {
61
+ timedOut = true;
62
+ try {
63
+ child.kill("SIGTERM");
64
+ } catch {
65
+ }
66
+ }, runOpts.timeoutMs);
67
+ if (typeof timer.unref === "function") {
68
+ timer.unref();
69
+ }
70
+ child.on("error", (err) => {
71
+ clearTimeout(timer);
72
+ resolve({ ok: false, error: `spawn_error:${err.message}`, output: stderrBuf || void 0 });
73
+ });
74
+ child.on("exit", (code, signal) => {
75
+ clearTimeout(timer);
76
+ if (timedOut) {
77
+ resolve({
78
+ ok: false,
79
+ error: `timeout:${runOpts.timeoutMs}ms`,
80
+ output: stdoutBuf || void 0,
81
+ metadata: { stderr: stderrBuf, signal }
82
+ });
83
+ return;
84
+ }
85
+ if (code === 0) {
86
+ resolve({ ok: true, output: stdoutBuf, metadata: { stderr: stderrBuf, exitCode: 0 } });
87
+ } else {
88
+ resolve({
89
+ ok: false,
90
+ error: `nonzero_exit:${code ?? signal ?? "unknown"}`,
91
+ output: stdoutBuf || void 0,
92
+ metadata: { stderr: stderrBuf, exitCode: code, signal }
93
+ });
94
+ }
95
+ });
96
+ });
97
+ }
98
+
99
+ // src/adapters/auto-register.ts
100
+ var PER_ADAPTER_DEFAULTS = {
101
+ hermes: { promptVia: "stdin" }
102
+ };
103
+ var defaultHermesModeBResolver = async (registry) => {
104
+ let mod;
105
+ try {
106
+ const specifier = "@prismer/adapter-hermes";
107
+ mod = await import(specifier);
108
+ } catch (err) {
109
+ const code = err?.code;
110
+ if (code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") {
111
+ return null;
112
+ }
113
+ return {
114
+ installed: false,
115
+ reason: `import_failed:${err.message}`
116
+ };
117
+ }
118
+ try {
119
+ const res = await mod.autoRegisterHermes(registry);
120
+ return {
121
+ installed: res.installed,
122
+ loopbackUrl: res.loopbackUrl,
123
+ reason: res.reason
124
+ };
125
+ } catch (err) {
126
+ return {
127
+ installed: false,
128
+ reason: `probe_failed:${err.message}`
129
+ };
130
+ }
131
+ };
132
+ async function autoRegisterAdapters(registry, opts = {}) {
133
+ const catalog = opts.catalog ?? AGENT_CATALOG;
134
+ const result = { registered: [], skipped: [] };
135
+ for (const entry of catalog) {
136
+ if (registry.has(entry.name)) {
137
+ result.skipped.push({ name: entry.name, reason: "already_registered" });
138
+ continue;
139
+ }
140
+ let binary;
141
+ if (opts.forceBinaryFor && opts.forceBinaryFor[entry.name]) {
142
+ binary = opts.forceBinaryFor[entry.name];
143
+ } else if (opts.skipDetection) {
144
+ binary = entry.upstreamBinary;
145
+ } else {
146
+ try {
147
+ const detected = await entry.detect();
148
+ if (!detected.found || !detected.binaryPath) {
149
+ result.skipped.push({ name: entry.name, reason: "not_installed" });
150
+ continue;
151
+ }
152
+ binary = detected.binaryPath;
153
+ } catch (err) {
154
+ result.skipped.push({ name: entry.name, reason: `detect_failed:${err.message}` });
155
+ continue;
156
+ }
157
+ }
158
+ const baseConfig = {
159
+ name: entry.name,
160
+ binary,
161
+ tiersSupported: entry.tiersSupported,
162
+ capabilityTags: entry.capabilityTags,
163
+ ...PER_ADAPTER_DEFAULTS[entry.name] ?? {},
164
+ ...opts.configOverrides?.[entry.name] ?? {}
165
+ };
166
+ const adapter = createCliAdapter(baseConfig);
167
+ try {
168
+ registry.register(adapter);
169
+ result.registered.push({ name: entry.name, binary, source: "cli_shim" });
170
+ } catch (err) {
171
+ result.skipped.push({ name: entry.name, reason: `register_failed:${err.message}` });
172
+ }
173
+ }
174
+ const hermesEntryIdx = result.registered.findIndex((r) => r.name === "hermes");
175
+ if (hermesEntryIdx >= 0 && !opts.skipHermesModeB) {
176
+ const resolve = opts.resolveHermesModeB ?? defaultHermesModeBResolver;
177
+ try {
178
+ const probe = await resolve(registry);
179
+ if (probe === null) {
180
+ console.log(
181
+ "[AutoRegister] @prismer/adapter-hermes not installed; Hermes stays on CLI shim"
182
+ );
183
+ } else if (probe.installed) {
184
+ result.registered[hermesEntryIdx].source = "mode_b";
185
+ console.log(
186
+ `[AutoRegister] Hermes upgraded to Mode B at ${probe.loopbackUrl ?? "loopback"}`
187
+ );
188
+ } else {
189
+ console.log(
190
+ `[AutoRegister] Hermes Mode B unavailable (${probe.reason ?? "unknown"}); keeping CLI shim`
191
+ );
192
+ }
193
+ } catch (err) {
194
+ console.warn(
195
+ `[AutoRegister] Hermes Mode B probe threw: ${err.message}; keeping CLI shim`
196
+ );
197
+ }
198
+ }
199
+ return result;
200
+ }
201
+ export {
202
+ autoRegisterAdapters
203
+ };
204
+ //# sourceMappingURL=auto-register-M4YSPJS6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/cli-adapter.ts","../src/adapters/auto-register.ts"],"sourcesContent":["/**\n * Prismer Runtime — Generic CLI-spawn adapter factory (Sprint C1/C2)\n *\n * Most agent CLIs (Claude Code, Codex, OpenClaw, Hermes) expose\n * roughly the same interface: `binary <flags> <prompt>` produces output\n * on stdout. This factory builds an AdapterImpl by capturing those\n * conventions in a single, testable place.\n *\n * Each per-adapter file under this directory specializes the shape of\n * the spawn (flag set, env, working directory, stdin vs argv prompt)\n * and registers itself with the central AdapterRegistry on daemon\n * startup via auto-register.ts.\n *\n * What this factory does NOT do (yet):\n * - Streaming output. dispatch() resolves once the child exits;\n * incremental token streams need the cloud relay opcode 0x01\n * bridge, which lands in a follow-up sprint.\n * - Permission gating. The PARA Tier 5 approval gate runs before\n * dispatch is called, not inside it.\n */\n\nimport { spawn, type SpawnOptions } from 'node:child_process';\nimport type { AdapterImpl, AdapterDispatchInput, AdapterDispatchResult } from '../adapter-registry.js';\n\nexport interface CliAdapterConfig {\n /** Catalog name — used as the adapter id. */\n name: string;\n /** Path to the binary. Resolved once at registration time. */\n binary: string;\n /** Base flags prepended before the prompt. */\n baseArgs?: string[];\n /** PARA tiers this adapter can host. */\n tiersSupported: number[];\n /** Capability tags this adapter can satisfy. */\n capabilityTags: string[];\n /** How to pass the prompt to the binary. */\n promptVia?: 'stdin' | 'last-arg';\n /** Soft timeout in ms. Defaults to 5 minutes. */\n timeoutMs?: number;\n /** Working directory for the child process. */\n cwd?: string;\n /** Extra env vars to inject. */\n env?: Record<string, string>;\n}\n\nexport function createCliAdapter(config: CliAdapterConfig): AdapterImpl {\n const promptVia = config.promptVia ?? 'last-arg';\n const timeoutMs = config.timeoutMs ?? 5 * 60 * 1000;\n\n return {\n name: config.name,\n tiersSupported: config.tiersSupported,\n capabilityTags: config.capabilityTags,\n metadata: { binary: config.binary, promptVia },\n async dispatch(input: AdapterDispatchInput): Promise<AdapterDispatchResult> {\n return await runCliOnce(config, input, { promptVia, timeoutMs });\n },\n async health() {\n // Cheap probe — the binary path was resolved at registration time,\n // so just confirm we can still find it. Heavier probes would slow\n // every health request and hide a stalled adapter behind a passing\n // probe; we leave deeper liveness checks to the agent itself.\n return { healthy: true };\n },\n async reset(_agentName?: string) {\n // Each `dispatch` spawns a fresh child process; there is no persistent\n // per-agent state to clear. Report stateless_noop so the caller can\n // ack cleanly. v1.9.x agent_restart semantic — see\n // adapter-registry.ts::AdapterImpl.reset for the contract.\n return { ok: true, state: 'stateless_noop' };\n },\n };\n}\n\ninterface RunOpts {\n promptVia: 'stdin' | 'last-arg';\n timeoutMs: number;\n}\n\nfunction runCliOnce(\n config: CliAdapterConfig,\n input: AdapterDispatchInput,\n runOpts: RunOpts,\n): Promise<AdapterDispatchResult> {\n return new Promise((resolve) => {\n const args = [...(config.baseArgs ?? [])];\n if (runOpts.promptVia === 'last-arg') {\n args.push(input.prompt);\n }\n\n const spawnOpts: SpawnOptions = {\n cwd: config.cwd,\n env: { ...process.env, ...(config.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n };\n\n let child;\n try {\n child = spawn(config.binary, args, spawnOpts);\n } catch (err) {\n resolve({ ok: false, error: `spawn_failed:${(err as Error).message}` });\n return;\n }\n\n if (runOpts.promptVia === 'stdin') {\n child.stdin?.end(input.prompt, 'utf8');\n } else if (child.stdin) {\n child.stdin.end();\n }\n\n let stdoutBuf = '';\n let stderrBuf = '';\n const MAX_BUF = 8 * 1024 * 1024; // 8 MiB cap so a runaway log doesn't OOM the daemon\n\n child.stdout?.on('data', (chunk) => {\n if (stdoutBuf.length < MAX_BUF) stdoutBuf += chunk.toString();\n });\n child.stderr?.on('data', (chunk) => {\n if (stderrBuf.length < MAX_BUF) stderrBuf += chunk.toString();\n });\n\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n child.kill('SIGTERM');\n } catch {\n // child may have already exited\n }\n }, runOpts.timeoutMs);\n if (typeof (timer as unknown as { unref: () => void }).unref === 'function') {\n (timer as unknown as { unref: () => void }).unref();\n }\n\n child.on('error', (err) => {\n clearTimeout(timer);\n resolve({ ok: false, error: `spawn_error:${err.message}`, output: stderrBuf || undefined });\n });\n\n child.on('exit', (code, signal) => {\n clearTimeout(timer);\n if (timedOut) {\n resolve({\n ok: false,\n error: `timeout:${runOpts.timeoutMs}ms`,\n output: stdoutBuf || undefined,\n metadata: { stderr: stderrBuf, signal },\n });\n return;\n }\n if (code === 0) {\n resolve({ ok: true, output: stdoutBuf, metadata: { stderr: stderrBuf, exitCode: 0 } });\n } else {\n resolve({\n ok: false,\n error: `nonzero_exit:${code ?? signal ?? 'unknown'}`,\n output: stdoutBuf || undefined,\n metadata: { stderr: stderrBuf, exitCode: code, signal },\n });\n }\n });\n });\n}\n","/**\n * Prismer Runtime — Auto-register installed adapters (Sprint C1/C2).\n *\n * On daemon startup, walk the agent catalog, detect which agents are\n * actually installed on this machine, and register an AdapterImpl\n * (built via createCliAdapter) for each. This means cloud's TaskRouter\n * can immediately dispatch to whatever the user has installed without\n * any per-adapter wiring code in daemon-runner.\n *\n * Returns the list of registered adapter names (not just descriptors)\n * so the caller can log which ones came online.\n *\n * Per-adapter overrides\n * ClaudeCode is the reference shape — see the per-adapter map below\n * for any divergences (different CLI flag conventions, prompt path).\n * Adapter teams that need richer integration should publish their\n * own AdapterImpl module + register on init; this auto-registrar\n * then yields to the user-supplied implementation.\n *\n * Hermes Mode B upgrade\n * Hermes is special-cased: after the CLI shim is registered we opt-in\n * to probe the local Hermes HTTP loopback (`@prismer/adapter-hermes`)\n * and, if reachable, swap the CLI shim for the Mode B adapter. The\n * `@prismer/adapter-hermes` dependency is resolved via dynamic import\n * and is intentionally NOT listed in this package's dependencies —\n * users opt in by installing it alongside @prismer/runtime. The\n * fallback chain is: Mode B (if reachable) → CLI shim → nothing.\n * Swap failures never break CLI-shim registration.\n */\n\nimport { AGENT_CATALOG } from '../agents/registry.js';\nimport type { AdapterRegistry, AdapterImpl } from '../adapter-registry.js';\nimport { createCliAdapter, type CliAdapterConfig } from './cli-adapter.js';\n\n/**\n * Result of probing `@prismer/adapter-hermes` for a reachable Mode B\n * endpoint. `installed: true` means a Mode B AdapterImpl was registered\n * (replacing any CLI shim); anything else is a no-op.\n */\nexport interface HermesModeBProbeResult {\n installed: boolean;\n loopbackUrl?: string;\n reason?: string;\n}\n\n/**\n * Seam used to resolve + invoke `@prismer/adapter-hermes`. Production\n * code defaults to a dynamic-import-based resolver; tests inject their\n * own to exercise the hit / miss / not-installed branches without\n * depending on a live Hermes instance or the real package being on disk.\n */\nexport type HermesModeBResolver = (\n registry: AdapterRegistry,\n) => Promise<HermesModeBProbeResult | null>;\n\nexport interface AutoRegisterOptions {\n /** When true, skip detection and assume every catalog entry is installed.\n * Useful for tests + local dev where you want the registration path\n * to run end-to-end without binaries being present. */\n skipDetection?: boolean;\n /** Override the catalog (for tests). Defaults to AGENT_CATALOG. */\n catalog?: typeof AGENT_CATALOG;\n /** Map of adapter-name → spawn config overrides. Useful when an\n * adapter ships its own dispatch shape (different flags, stdin, etc.). */\n configOverrides?: Record<string, Partial<CliAdapterConfig>>;\n /** Override binary detection result entirely (tests). */\n forceBinaryFor?: Record<string, string>;\n /** Disable the Hermes Mode B upgrade probe — force the CLI shim. Default false. */\n skipHermesModeB?: boolean;\n /** Injectable probe for Hermes Mode B. Defaults to dynamic-importing\n * `@prismer/adapter-hermes` and calling its `autoRegisterHermes()`. */\n resolveHermesModeB?: HermesModeBResolver;\n}\n\nexport interface RegisteredEntry {\n name: string;\n binary: string;\n /** Which code path produced this registration. Defaults to \"cli_shim\"\n * for adapters registered by the generic catalog path; \"mode_b\" means\n * a per-adapter module (currently only Hermes) replaced the shim. */\n source?: 'cli_shim' | 'mode_b';\n}\n\nexport interface AutoRegisterResult {\n registered: RegisteredEntry[];\n skipped: Array<{ name: string; reason: string }>;\n}\n\n/**\n * Per-adapter quirks. Default behavior (`promptVia: 'last-arg'`) works\n * for Claude Code + Codex + OpenClaw out of the box. Hermes is a Python\n * server and prefers stdin; the contract is documented separately\n * (Sprint C3) — this map applies to the local CLI shim only.\n */\nconst PER_ADAPTER_DEFAULTS: Record<string, Partial<CliAdapterConfig>> = {\n hermes: { promptVia: 'stdin' },\n};\n\n/**\n * Default resolver: dynamic-import `@prismer/adapter-hermes` and invoke\n * its autoRegisterHermes(). Returns `null` when the package isn't\n * installed (`ERR_MODULE_NOT_FOUND` / `MODULE_NOT_FOUND`). Any other\n * failure is surfaced as `{ installed: false, reason }` so the caller\n * can log it but keep the CLI shim.\n */\n// Shape of the bit of `@prismer/adapter-hermes` we consume. Kept as a\n// local type so this package doesn't need a compile-time dependency on\n// the adapter (it's dynamic-imported at runtime and not listed in deps).\ninterface HermesAdapterModule {\n autoRegisterHermes(\n registry: unknown,\n opts?: unknown,\n ): Promise<{\n installed: boolean;\n loopbackUrl?: string;\n reason?: string;\n }>;\n}\n\nconst defaultHermesModeBResolver: HermesModeBResolver = async (registry) => {\n let mod: HermesAdapterModule;\n try {\n // NOTE: @prismer/adapter-hermes is NOT listed in this package's deps —\n // users install it separately if they want Hermes Mode B. A missing\n // module here is the expected common case, not an error. The\n // specifier goes through a variable so bundlers don't try to resolve\n // it eagerly at build time.\n const specifier = '@prismer/adapter-hermes';\n mod = (await import(specifier)) as HermesAdapterModule;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') {\n return null;\n }\n return {\n installed: false,\n reason: `import_failed:${(err as Error).message}`,\n };\n }\n\n try {\n const res = await mod.autoRegisterHermes(registry);\n return {\n installed: res.installed,\n loopbackUrl: res.loopbackUrl,\n reason: res.reason,\n };\n } catch (err) {\n return {\n installed: false,\n reason: `probe_failed:${(err as Error).message}`,\n };\n }\n};\n\nexport async function autoRegisterAdapters(\n registry: AdapterRegistry,\n opts: AutoRegisterOptions = {},\n): Promise<AutoRegisterResult> {\n const catalog = opts.catalog ?? AGENT_CATALOG;\n const result: AutoRegisterResult = { registered: [], skipped: [] };\n\n for (const entry of catalog) {\n // If the adapter is already registered (e.g. an out-of-band module\n // beat us to it), respect that — don't replace user code with a stub.\n if (registry.has(entry.name)) {\n result.skipped.push({ name: entry.name, reason: 'already_registered' });\n continue;\n }\n\n let binary: string | undefined;\n if (opts.forceBinaryFor && opts.forceBinaryFor[entry.name]) {\n binary = opts.forceBinaryFor[entry.name];\n } else if (opts.skipDetection) {\n // Fake it — use the catalog's `upstreamBinary` as if `which` returned it.\n binary = entry.upstreamBinary;\n } else {\n try {\n const detected = await entry.detect();\n if (!detected.found || !detected.binaryPath) {\n result.skipped.push({ name: entry.name, reason: 'not_installed' });\n continue;\n }\n binary = detected.binaryPath;\n } catch (err) {\n result.skipped.push({ name: entry.name, reason: `detect_failed:${(err as Error).message}` });\n continue;\n }\n }\n\n const baseConfig: CliAdapterConfig = {\n name: entry.name,\n binary,\n tiersSupported: entry.tiersSupported,\n capabilityTags: entry.capabilityTags,\n ...(PER_ADAPTER_DEFAULTS[entry.name] ?? {}),\n ...(opts.configOverrides?.[entry.name] ?? {}),\n };\n\n const adapter: AdapterImpl = createCliAdapter(baseConfig);\n try {\n registry.register(adapter);\n result.registered.push({ name: entry.name, binary, source: 'cli_shim' });\n } catch (err) {\n result.skipped.push({ name: entry.name, reason: `register_failed:${(err as Error).message}` });\n }\n }\n\n // --- Hermes Mode B upgrade probe ---------------------------------\n // The CLI shim above is the always-available fallback. If the user\n // installed @prismer/adapter-hermes AND has a reachable Hermes gateway,\n // swap the shim for the Mode B adapter. Any failure (package missing,\n // probe timeout, network error, etc.) keeps the CLI shim intact.\n const hermesEntryIdx = result.registered.findIndex((r) => r.name === 'hermes');\n if (hermesEntryIdx >= 0 && !opts.skipHermesModeB) {\n const resolve = opts.resolveHermesModeB ?? defaultHermesModeBResolver;\n try {\n const probe = await resolve(registry);\n if (probe === null) {\n console.log(\n '[AutoRegister] @prismer/adapter-hermes not installed; Hermes stays on CLI shim',\n );\n } else if (probe.installed) {\n result.registered[hermesEntryIdx].source = 'mode_b';\n console.log(\n `[AutoRegister] Hermes upgraded to Mode B at ${probe.loopbackUrl ?? 'loopback'}`,\n );\n } else {\n console.log(\n `[AutoRegister] Hermes Mode B unavailable (${probe.reason ?? 'unknown'}); keeping CLI shim`,\n );\n }\n } catch (err) {\n // Absolute last-resort guard — the default resolver already\n // catches its own errors, so this only trips if a custom resolver\n // throws. Never let it fail the whole auto-register call.\n console.warn(\n `[AutoRegister] Hermes Mode B probe threw: ${(err as Error).message}; keeping CLI shim`,\n );\n }\n }\n\n return result;\n}\n"],"mappings":"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","names":[]}