@tangle-network/sdk-provider-cli-base 0.13.17 → 0.13.19

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.
@@ -0,0 +1,446 @@
1
+ import { Ft as spawnAcpBridge, L as AcpProviderAdapterBase, ot as prependPromptSection } from "../../src-Fn8Pu1xq.mjs";
2
+ import { PRIME_AGENT_DIR_ENV_VAR, PRIME_AGENT_DIR_ENV_VARS, PRIME_HARNESS_STATE_ENV_DENYLIST, PRIME_HARNESS_STATE_ENV_DENYLIST as PRIME_HARNESS_STATE_ENV_DENYLIST$1, PRIME_KERNEL_DEAD_MARKERS, PRIME_KERNEL_ENV_PASSTHROUGH, PRIME_KERNEL_ENV_PASSTHROUGH as PRIME_KERNEL_ENV_PASSTHROUGH$1, PRIME_MCP_UNSUPPORTED_REASON, PrimeHarnessStateError, PrimeProfileError, assertPrimeModelAgreement, assertPrimeModelAgreement as assertPrimeModelAgreement$1, buildPiModelsConfig, hasPrimeProfileMaterial, matchPrimeKernelDeadMarker, materializePrimeProfileControls, materializePrimeProfileControls as materializePrimeProfileControls$1, primeAgentDirEnv, primeAgentDirEnv as primeAgentDirEnv$1, primeHarnessStatePath, primeProfileNeedsAgentDir, primeSubagentEntryId as subagentEntryId, primeThinkingLevel, primeThinkingLevel as primeThinkingLevel$1, prunePrimeProfileMaterial, readPrimeProfileControls, readPrimeProfileControls as readPrimeProfileControls$1, writePrimeAgentFile } from "@tangle-network/agent-profile-materialize";
3
+ import { isAbsolute, join, relative, sep } from "node:path";
4
+ import { existsSync, lchownSync, lstatSync, mkdirSync } from "node:fs";
5
+ import { z } from "zod";
6
+ //#region src/adapters/prime/agent-dir.ts
7
+ /**
8
+ * File work inside a prime agent dir, run as the dir's owner. argv `read
9
+ * <file>...` prints `{file: text | null}`; argv `write` reads
10
+ * `[{path, data}]` from stdin and replaces each file whole through a private
11
+ * temp name, so prime never reads a partial models.json.
12
+ */
13
+ const AGENT_DIR_SCRIPT = `
14
+ const fs = require("node:fs");
15
+ const path = require("node:path");
16
+ const crypto = require("node:crypto");
17
+ const [mode, ...files] = process.argv.slice(1);
18
+ if (mode === "read") {
19
+ const out = {};
20
+ for (const file of files) {
21
+ try {
22
+ out[file] = fs.readFileSync(file, "utf8");
23
+ } catch (error) {
24
+ if (error.code !== "ENOENT") throw error;
25
+ out[file] = null;
26
+ }
27
+ }
28
+ process.stdout.write(JSON.stringify(out));
29
+ } else {
30
+ const chunks = [];
31
+ process.stdin.on("data", (chunk) => chunks.push(chunk));
32
+ process.stdin.on("end", () => {
33
+ for (const entry of JSON.parse(Buffer.concat(chunks).toString("utf8"))) {
34
+ fs.mkdirSync(path.dirname(entry.path), { recursive: true, mode: 0o700 });
35
+ const temp = entry.path + "." + crypto.randomUUID() + ".tmp";
36
+ try {
37
+ fs.writeFileSync(temp, entry.data, { encoding: "utf8", mode: 0o600, flag: "wx" });
38
+ fs.renameSync(temp, entry.path);
39
+ } finally {
40
+ fs.rmSync(temp, { force: true });
41
+ }
42
+ }
43
+ });
44
+ }
45
+ `;
46
+ /**
47
+ * Materialize a prime agent dir as the user prime-agent runs as.
48
+ *
49
+ * A root sidecar demotes prime-agent, so the agent dir and every file in it
50
+ * must belong to that user: a root-owned models.json is unreadable to it, and
51
+ * prime-agent exits before `initialize` with `Unknown provider "tangle"`.
52
+ * Root only makes the per-session dir inside the adapter's own storage tree,
53
+ * refusing a symlink anywhere below `storageRoot`, and hands the dir over
54
+ * with lchown, which never follows a symlink. Every read and write inside it
55
+ * runs through `runAsOwner` (the adapter's `runNodeAsSubprocess`), so a link
56
+ * the agent plants there reaches only what the agent could already reach.
57
+ *
58
+ * `build` lowers the files through the port: `reads` are taken as the owner
59
+ * first, and the writes it records are replayed as the owner after.
60
+ */
61
+ async function materializeAgentDirAsOwner(options) {
62
+ const { storageRoot, agentDir, owner, reads, build } = options;
63
+ const runAsOwner = async (args, input) => {
64
+ try {
65
+ return await options.runAsOwner(AGENT_DIR_SCRIPT, args, input);
66
+ } catch (error) {
67
+ throw new Error(`prime: cannot ${args[0]} the agent dir as its owner: ${error instanceof Error ? error.message : String(error)}`);
68
+ }
69
+ };
70
+ const snapshot = ensureOwnedAgentDir(storageRoot, agentDir, owner) ? Object.fromEntries(reads.map((file) => [file, null])) : JSON.parse(await runAsOwner(["read", ...reads]));
71
+ const writes = [];
72
+ const result = build({
73
+ read: (file) => {
74
+ if (!Object.hasOwn(snapshot, file)) throw new Error(`prime: agent-dir read of ${file} was not taken`);
75
+ return snapshot[file] ?? void 0;
76
+ },
77
+ write: (file, data) => {
78
+ writes.push({
79
+ path: file,
80
+ data
81
+ });
82
+ }
83
+ });
84
+ if (writes.length > 0) await runAsOwner(["write"], JSON.stringify(writes));
85
+ return result;
86
+ }
87
+ /**
88
+ * Make each missing dir from `storageRoot` down to `agentDir` and give the
89
+ * leaf to `owner`; true when this call made the leaf. A symlink or a
90
+ * non-directory on that path is refused, so root never creates or chowns
91
+ * through a link the agent planted under its home.
92
+ */
93
+ function ensureOwnedAgentDir(storageRoot, agentDir, owner) {
94
+ const below = relative(storageRoot, agentDir);
95
+ if (!below || below.startsWith("..") || isAbsolute(below)) throw new Error(`prime: agent dir ${agentDir} is outside ${storageRoot}`);
96
+ let dir = storageRoot;
97
+ let created = false;
98
+ for (const name of below.split(sep)) {
99
+ dir = join(dir, name);
100
+ created = true;
101
+ try {
102
+ mkdirSync(dir, dir === agentDir ? { mode: 448 } : void 0);
103
+ } catch (error) {
104
+ if (error.code !== "EEXIST") throw error;
105
+ created = false;
106
+ }
107
+ if (!lstatSync(dir).isDirectory()) throw new Error(`prime: agent dir path ${dir} is not a directory`);
108
+ }
109
+ if (owner) lchownSync(agentDir, owner.uid, owner.gid);
110
+ return created;
111
+ }
112
+ //#endregion
113
+ //#region src/adapters/prime/models-config.ts
114
+ /**
115
+ * Materialization of prime-agent's `<agentDir>/models.json` from the
116
+ * sandbox's model tuple.
117
+ *
118
+ * prime-agent resolves custom providers from `models.json` under its agent
119
+ * config dir (fork `src/config.ts` `getAgentDir()` — overridable via
120
+ * `PRIME_AGENT_CODING_AGENT_DIR`, which the adapter always sets). A custom
121
+ * provider entry needs `baseUrl` + `api` + `apiKey` + at least one model id
122
+ * (fork `docs/models.md`). `apiKey` accepts an env-var name, a `!shell`
123
+ * command, or a literal; the sandbox writes the LITERAL key because inline
124
+ * key injection is the established in-box router-auth pattern — the value is
125
+ * the salted egress-proxy dummy, swapped for the real key at the network
126
+ * boundary, so nothing secret lands on disk inside the box.
127
+ */
128
+ /**
129
+ * Write `models.json` into `agentDir`. The atomic temp+rename with an
130
+ * owner-only mode is the shared agent-dir write: prime reloads this file at
131
+ * model-resolution time, so a live process must never observe a partial write,
132
+ * and the file names a credential either way (a literal here, an env var name
133
+ * on the host path). `io` writes it as the agent dir's owner instead.
134
+ */
135
+ function materializePrimeModelsConfig(agentDir, input, io = { write: writePrimeAgentFile }) {
136
+ const target = join(agentDir, "models.json");
137
+ io.write(target, `${JSON.stringify(buildPiModelsConfig(input), null, 2)}\n`);
138
+ return target;
139
+ }
140
+ //#endregion
141
+ //#region src/adapters/prime/types.ts
142
+ /**
143
+ * Typed session-fatal error for a dead IPython kernel. Callers must treat the
144
+ * session as unrecoverable and start a new one; the adapter has already
145
+ * closed and evicted the backing prime-agent process when this throws.
146
+ */
147
+ var PrimeKernelDeadError = class extends Error {
148
+ reason = "harness_exit";
149
+ constructor(sessionId, marker) {
150
+ super(`prime: IPython kernel died and prime-agent never re-provisions it headlessly (marker: "${marker}"). The session is unrecoverable; start a new session. (session ${sessionId})`);
151
+ this.sessionId = sessionId;
152
+ this.marker = marker;
153
+ this.name = "PrimeKernelDeadError";
154
+ }
155
+ };
156
+ //#endregion
157
+ //#region src/adapters/prime/adapter.ts
158
+ const DEFAULT_MODEL_PROVIDER = "tangle";
159
+ /**
160
+ * Env vars the adapter sets on the spawned prime-agent. The bridge lays this
161
+ * env over the sidecar's inherited one (sdk-cli-runner mergeSpawnEnv), so the
162
+ * runtime proxy and CA variables still reach prime; this list does not narrow
163
+ * that. The model key travels via the materialized models.json, not env.
164
+ */
165
+ const BASELINE_ENV_ALLOWLIST = [
166
+ "PATH",
167
+ "HOME",
168
+ "USER",
169
+ "LANG",
170
+ "LC_ALL",
171
+ "TZ",
172
+ "TMPDIR",
173
+ "TMP",
174
+ "TEMP",
175
+ "NODE_OPTIONS",
176
+ "NODE_PATH",
177
+ "NODE_NO_WARNINGS",
178
+ "NIX_BIN_PATH"
179
+ ];
180
+ /**
181
+ * Prime-specific operator knobs forwarded when present, and the env vars that
182
+ * must never be forwarded — both fork facts, so both come from the shared
183
+ * lowering. `PRIME_HARNESS_STATE_ENV_DENYLIST` names the vars that re-point the
184
+ * self-modifying harness store OUTSIDE the per-session agent dir;
185
+ * `config.continualHarnessState` is the one sanctioned escape hatch.
186
+ */
187
+ const PRIME_ENV_PASSTHROUGH = PRIME_KERNEL_ENV_PASSTHROUGH$1;
188
+ const primeProfileExtensionSchema = z.object({
189
+ modelProvider: z.string().min(1).optional(),
190
+ contextWindow: z.number().int().positive().optional(),
191
+ maxTokens: z.number().int().positive().optional(),
192
+ reasoningModel: z.boolean().optional(),
193
+ continualHarnessState: z.boolean().optional(),
194
+ promptTimeoutMs: z.number().int().positive().optional(),
195
+ bootstrapTimeoutMs: z.number().int().positive().optional(),
196
+ bridgeIdleMs: z.number().int().nonnegative().optional(),
197
+ protocolVersion: z.number().int().min(1).optional()
198
+ }).strict();
199
+ /**
200
+ * Read `profile.extensions.prime` — the only part of the profile surface that
201
+ * is adapter-specific rather than a fork fact. Every fork-level refusal (mcp,
202
+ * connections, permissions, tools, hooks, modes, confidential, and the
203
+ * resource kinds with no agent-dir read path) belongs to the shared lowering
204
+ * and is raised by `readPrimeProfileControls`, so the two executors driving
205
+ * this fork cannot drift on what it can honor.
206
+ *
207
+ * Honored profile surface: `model.default` falls back into the model id (and
208
+ * must agree with it — `assertPrimeModelAgreement`), `model.reasoningEffort`
209
+ * maps onto prime's `--thinking`, and `readPrimeProfileControls` closes
210
+ * `harness: "prime"`, `prompt.systemPrompt`, `prompt.appendSystemPrompt`,
211
+ * `prompt.instructions`, inline `resources.skills`, and `subagents` (see the
212
+ * shared materializer's `src/prime-profile.ts` for each fork-verified path).
213
+ */
214
+ function readPrimeProfileExtension(profile) {
215
+ if (!profile) return {};
216
+ const unsupportedExtensions = Object.entries(profile.extensions ?? {}).filter(([name, value]) => name !== "prime" && value !== void 0).map(([name]) => name);
217
+ if (unsupportedExtensions.length > 0) throw new Error(`prime does not support AgentProfile extension namespaces: ${unsupportedExtensions.join(", ")}`);
218
+ return primeProfileExtensionSchema.parse(profile.extensions?.prime ?? {});
219
+ }
220
+ let bridgeFactoryOverride = null;
221
+ /** Test seam — production always spawns via sdk-cli-runner's spawnRpcBridge. */
222
+ function __setPrimeBridgeFactoryForTesting(factory) {
223
+ bridgeFactoryOverride = factory;
224
+ }
225
+ /**
226
+ * Prime Agent provider adapter.
227
+ *
228
+ * Spawns `prime-agent --mode acp` (JSON-RPC 2.0 over NDJSON on stdio — no
229
+ * TUI; the fork internally routes the session through a client-owned daemon
230
+ * worker that inherits this spawn's env, see types.ts). The ACP session
231
+ * lifecycle is the shared {@link AcpProviderAdapterBase}; this adapter owns
232
+ * prime's process, model tuple and failure signals.
233
+ *
234
+ * Each config directory owns its model tuple, daemon and harness state.
235
+ * Kernel death closes the session with a typed failure.
236
+ *
237
+ * prime hosts one session per connection and has no `session/load`: a new
238
+ * process opens a new ACP session, and the conversation resumes from prime's
239
+ * own session files in the per-session agent dir.
240
+ */
241
+ var PrimeProviderAdapter = class extends AcpProviderAdapterBase {
242
+ provider = "prime";
243
+ defaultCliPath = "prime-agent";
244
+ loadsNativeSessions = false;
245
+ /** A dead kernel closes the ACP process and produces a typed turn failure. */
246
+ kernelDeaths = /* @__PURE__ */ new Map();
247
+ resolveTurn(input) {
248
+ const profileExtension = readPrimeProfileExtension(this.config.profile);
249
+ const profileControls = readPrimeProfileControls$1(this.config.profile);
250
+ const config = {
251
+ ...this.config,
252
+ ...profileExtensionToConfig(profileExtension),
253
+ ...input.model?.model ? { model: input.model.model } : {},
254
+ ...input.model?.apiKey ? { apiKey: input.model.apiKey } : {},
255
+ ...input.model?.baseUrl ? { baseUrl: input.model.baseUrl } : {}
256
+ };
257
+ const modelId = config.model ?? this.config.profile?.model?.default;
258
+ if (!modelId || !config.baseUrl || !config.apiKey) {
259
+ const missing = [
260
+ ["model", modelId],
261
+ ["baseUrl", config.baseUrl],
262
+ ["apiKey", config.apiKey]
263
+ ].filter(([, value]) => !value).map(([name]) => name);
264
+ throw new Error(`prime: a full model tuple is required (missing: ${missing.join(", ")}). The sandbox must deliver model + baseUrl + apiKey; prime-agent has no usable fallback inside an isolated agent dir and would exit at startup.`);
265
+ }
266
+ assertPrimeModelAgreement$1(this.config.profile, { model: modelId });
267
+ return {
268
+ config,
269
+ processKey: this.modelKey(config, modelId),
270
+ modelId,
271
+ profileControls
272
+ };
273
+ }
274
+ async processSpec(turn, context) {
275
+ const { config, modelId } = turn;
276
+ const agentDir = this.resolveAgentDir(config, context.sessionId);
277
+ const profileArgs = await materializeAgentDirAsOwner({
278
+ storageRoot: this.agentDirOwnerRoot(agentDir),
279
+ agentDir,
280
+ owner: this.subprocessIdentity(),
281
+ runAsOwner: (script, args, input) => this.runNodeAsSubprocess(script, args, input),
282
+ reads: [primeHarnessStatePath(agentDir)],
283
+ build: (io) => {
284
+ materializePrimeModelsConfig(agentDir, {
285
+ providerName: config.modelProvider ?? DEFAULT_MODEL_PROVIDER,
286
+ modelId,
287
+ baseUrl: config.baseUrl,
288
+ apiKey: config.apiKey,
289
+ contextWindow: config.contextWindow,
290
+ maxTokens: config.maxTokens,
291
+ reasoning: config.reasoningModel,
292
+ supportsStore: false
293
+ }, io);
294
+ return materializePrimeProfileControls$1(agentDir, turn.profileControls, {
295
+ warn: (msg, meta) => this.logger.warn(msg, meta),
296
+ io
297
+ });
298
+ }
299
+ });
300
+ const env = this.buildSpawnEnv(agentDir);
301
+ return {
302
+ command: this.getCliPath(),
303
+ args: [
304
+ ...this.buildSpawnArgs(config, modelId, profileArgs),
305
+ "--daemon-socket",
306
+ env.PRIME_AGENT_DAEMON_SOCKET
307
+ ],
308
+ env,
309
+ statusDetail: "Spawning prime-agent (ACP mode)"
310
+ };
311
+ }
312
+ spawnFailureMessage(failure) {
313
+ return failure.missingBinary ? `prime: "${this.getCliPath()}" not found on PATH. The container image must ship the pinned Prime native CLI and prepared Python kernel — see packages/sdk-provider-cli-base/docs/prime.md.` : `prime: failed to spawn prime-agent: ${failure.message}`;
314
+ }
315
+ spawnBridge(request) {
316
+ return (bridgeFactoryOverride ?? spawnAcpBridge)(request);
317
+ }
318
+ /**
319
+ * A failed tool whose output carries a kernel-death marker (the ipython
320
+ * tool, or a bootstrap diagnostic) ends the session: record it and close
321
+ * the process so the in-flight prompt can never hang on a dead kernel.
322
+ */
323
+ onToolFailed(sessionId, failureText) {
324
+ const marker = failureText ? matchPrimeKernelDeadMarker(failureText) : void 0;
325
+ if (!marker || this.kernelDeaths.has(sessionId)) return [];
326
+ this.kernelDeaths.set(sessionId, marker);
327
+ this.logger.error("prime: IPython kernel died — failing session", {
328
+ sessionId,
329
+ marker
330
+ });
331
+ this.evictAcpSession(sessionId, "kernel-dead");
332
+ return [{
333
+ type: "warning",
334
+ code: "PRIME_KERNEL_DEAD",
335
+ message: `IPython kernel died ("${marker}") and prime-agent never re-provisions it headlessly. The session is unrecoverable.`
336
+ }];
337
+ }
338
+ takeTurnFailure(sessionId) {
339
+ const marker = this.kernelDeaths.get(sessionId);
340
+ if (!marker) return void 0;
341
+ this.kernelDeaths.delete(sessionId);
342
+ return new PrimeKernelDeadError(sessionId, marker);
343
+ }
344
+ getCapabilities() {
345
+ return {
346
+ streaming: true,
347
+ toolUse: true,
348
+ reasoning: true,
349
+ multimodal: true,
350
+ contextWindow: this.config.contextWindow ?? 128e3
351
+ };
352
+ }
353
+ /** Prime accepts ACP image blocks, so images are forwarded natively. */
354
+ nativeAttachmentKinds() {
355
+ return ["image"];
356
+ }
357
+ async afterInitialize(_config) {
358
+ readPrimeProfileExtension(this.config.profile);
359
+ readPrimeProfileControls$1(this.config.profile);
360
+ }
361
+ /** Continual mode explicitly shares the native config and harness state. */
362
+ resolveAgentDir(config, sessionId) {
363
+ const leaf = config.continualHarnessState ? "continual" : sessionId;
364
+ const workspaceDir = join(this.agentDirsRoot(this.storagePath), leaf);
365
+ const home = config.runtimeHome?.trim();
366
+ if (!home || existsSync(workspaceDir)) return workspaceDir;
367
+ return join(this.agentDirsRoot(home), leaf);
368
+ }
369
+ agentDirsRoot(base) {
370
+ return join(base, this.storageDir, "prime-agent-dirs");
371
+ }
372
+ /** The dir every agent dir of this adapter is created below. */
373
+ agentDirOwnerRoot(agentDir) {
374
+ const home = this.config.runtimeHome?.trim();
375
+ return home && agentDir.startsWith(`${this.agentDirsRoot(home)}/`) ? home : this.storagePath;
376
+ }
377
+ buildSpawnEnv(agentDir) {
378
+ const env = {};
379
+ for (const name of [...BASELINE_ENV_ALLOWLIST, ...PRIME_ENV_PASSTHROUGH]) {
380
+ const value = process.env[name];
381
+ if (value !== void 0) env[name] = value;
382
+ }
383
+ for (const name of PRIME_HARNESS_STATE_ENV_DENYLIST$1) delete env[name];
384
+ Object.assign(env, primeAgentDirEnv$1(agentDir));
385
+ return env;
386
+ }
387
+ buildSpawnArgs(config, modelId, profileArgs = []) {
388
+ const args = ["--mode", "acp"];
389
+ args.push("--provider", config.modelProvider ?? DEFAULT_MODEL_PROVIDER);
390
+ args.push("--model", modelId);
391
+ const thinking = primeThinkingLevel$1(this.config.profile?.model?.reasoningEffort);
392
+ if (thinking) args.push("--thinking", thinking);
393
+ args.push(...profileArgs);
394
+ if (config.extraFlags) args.push(...config.extraFlags);
395
+ return args;
396
+ }
397
+ modelKey(config, modelId) {
398
+ return [
399
+ config.modelProvider ?? DEFAULT_MODEL_PROVIDER,
400
+ modelId,
401
+ config.baseUrl ?? "",
402
+ config.apiKey ?? ""
403
+ ].join("|");
404
+ }
405
+ /**
406
+ * ACP prompt blocks for a turn: the composed text plus every natively
407
+ * deliverable image. An image that could not be inlined (over budget,
408
+ * unreadable, remote-url) falls back to its text marker so the model still
409
+ * sees the reference instead of silently losing it.
410
+ */
411
+ promptBlocks(input, preparedInput, turn) {
412
+ const imageBlocks = [];
413
+ const undeliverableMarkers = [];
414
+ for (const attachment of preparedInput.attachments) {
415
+ if (attachment.kind !== "image") continue;
416
+ if (attachment.base64 && attachment.mediaType) imageBlocks.push({
417
+ type: "image",
418
+ data: attachment.base64,
419
+ mimeType: attachment.mediaType
420
+ });
421
+ else undeliverableMarkers.push(attachment.marker);
422
+ }
423
+ const composed = prependPromptSection(input.systemPrompt === turn.profileControls.systemPrompt ? void 0 : input.systemPrompt, preparedInput.promptText);
424
+ return [{
425
+ type: "text",
426
+ text: undeliverableMarkers.length > 0 ? `${composed}\n\n${undeliverableMarkers.join("\n")}` : composed
427
+ }, ...imageBlocks];
428
+ }
429
+ };
430
+ function profileExtensionToConfig(extension) {
431
+ const out = {};
432
+ if (extension.modelProvider !== void 0) out.modelProvider = extension.modelProvider;
433
+ if (extension.contextWindow !== void 0) out.contextWindow = extension.contextWindow;
434
+ if (extension.maxTokens !== void 0) out.maxTokens = extension.maxTokens;
435
+ if (extension.reasoningModel !== void 0) out.reasoningModel = extension.reasoningModel;
436
+ if (extension.continualHarnessState !== void 0) out.continualHarnessState = extension.continualHarnessState;
437
+ if (extension.promptTimeoutMs !== void 0) out.promptTimeoutMs = extension.promptTimeoutMs;
438
+ if (extension.bootstrapTimeoutMs !== void 0) out.bootstrapTimeoutMs = extension.bootstrapTimeoutMs;
439
+ if (extension.bridgeIdleMs !== void 0) out.bridgeIdleMs = extension.bridgeIdleMs;
440
+ if (extension.protocolVersion !== void 0) out.protocolVersion = extension.protocolVersion;
441
+ return out;
442
+ }
443
+ //#endregion
444
+ export { PRIME_AGENT_DIR_ENV_VAR, PRIME_AGENT_DIR_ENV_VARS, PRIME_HARNESS_STATE_ENV_DENYLIST, PRIME_KERNEL_DEAD_MARKERS, PRIME_KERNEL_ENV_PASSTHROUGH, PRIME_MCP_UNSUPPORTED_REASON, PrimeHarnessStateError, PrimeKernelDeadError, PrimeProfileError, PrimeProviderAdapter, __setPrimeBridgeFactoryForTesting, assertPrimeModelAgreement, hasPrimeProfileMaterial, matchPrimeKernelDeadMarker, materializePrimeProfileControls, primeAgentDirEnv, primeProfileNeedsAgentDir, primeThinkingLevel, prunePrimeProfileMaterial, readPrimeProfileControls, subagentEntryId };
445
+
446
+ //# sourceMappingURL=index.mjs.map
@@ -1,4 +1,4 @@
1
- import { i as PreparedAttachment } from "../prompt-input-BHn_1z69.mjs";
1
+ import { i as PreparedAttachment } from "../prompt-input-CD7okX8T.mjs";
2
2
  import { StreamEvent } from "@tangle-network/agent-interface";
3
3
 
4
4
  //#region src/conformance/attachments.d.ts