@eir-labs/coltrane 0.24.30 → 0.24.32

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 (87) hide show
  1. package/agents/change-verifier.json +4 -2
  2. package/agents/deploy-scout.json +2 -2
  3. package/agents/red-law-reviewer.json +54 -0
  4. package/agents/red-spec-attester.json +53 -0
  5. package/agents/red-spec-builder.json +56 -0
  6. package/agents/red-spec-drafter.json +1 -1
  7. package/agents/spec-reviewer.json +1 -1
  8. package/dist/src/chart.js +4 -0
  9. package/dist/src/chart.js.map +1 -1
  10. package/dist/src/chat_completions_port.d.ts +41 -0
  11. package/dist/src/chat_completions_port.js +221 -0
  12. package/dist/src/chat_completions_port.js.map +1 -0
  13. package/dist/src/claude_invoker.d.ts +18 -0
  14. package/dist/src/claude_invoker.js +771 -22
  15. package/dist/src/claude_invoker.js.map +1 -1
  16. package/dist/src/cli.d.ts +1 -1
  17. package/dist/src/cli.js +49 -8
  18. package/dist/src/cli.js.map +1 -1
  19. package/dist/src/completions_invoker.d.ts +79 -0
  20. package/dist/src/completions_invoker.js +220 -0
  21. package/dist/src/completions_invoker.js.map +1 -0
  22. package/dist/src/composition.d.ts +13 -0
  23. package/dist/src/composition.js +16 -0
  24. package/dist/src/composition.js.map +1 -1
  25. package/dist/src/genome_schema.d.ts +200 -0
  26. package/dist/src/genome_schema.js +37 -0
  27. package/dist/src/genome_schema.js.map +1 -1
  28. package/dist/src/genome_store.d.ts +30 -2
  29. package/dist/src/genome_store.js +51 -8
  30. package/dist/src/genome_store.js.map +1 -1
  31. package/dist/src/index.d.ts +5 -0
  32. package/dist/src/index.js +9 -0
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/src/invoker_selection.d.ts +58 -0
  35. package/dist/src/invoker_selection.js +110 -0
  36. package/dist/src/invoker_selection.js.map +1 -0
  37. package/dist/src/ledger.d.ts +45 -2
  38. package/dist/src/ledger.js +23 -3
  39. package/dist/src/ledger.js.map +1 -1
  40. package/dist/src/mcp.js +2 -2
  41. package/dist/src/mcp.js.map +1 -1
  42. package/dist/src/outputs.d.ts +24 -0
  43. package/dist/src/outputs.js +1 -0
  44. package/dist/src/outputs.js.map +1 -1
  45. package/dist/src/registry.js +16 -0
  46. package/dist/src/registry.js.map +1 -1
  47. package/dist/src/repo_index.d.ts +13 -0
  48. package/dist/src/repo_index.js +90 -10
  49. package/dist/src/repo_index.js.map +1 -1
  50. package/dist/src/reside_backing.d.ts +3 -2
  51. package/dist/src/reside_backing.js +8 -2
  52. package/dist/src/reside_backing.js.map +1 -1
  53. package/dist/src/reuse.d.ts +8 -0
  54. package/dist/src/reuse.js.map +1 -1
  55. package/dist/src/run_deps.d.ts +10 -10
  56. package/dist/src/run_deps.js +25 -15
  57. package/dist/src/run_deps.js.map +1 -1
  58. package/dist/src/runtime.d.ts +205 -109
  59. package/dist/src/runtime.js +908 -145
  60. package/dist/src/runtime.js.map +1 -1
  61. package/dist/src/server.js +148 -45
  62. package/dist/src/server.js.map +1 -1
  63. package/dist/src/server_relay.js +28 -0
  64. package/dist/src/server_relay.js.map +1 -1
  65. package/dist/src/skill_runner.mjs +9 -2
  66. package/dist/src/skill_subprocess.d.ts +20 -1
  67. package/dist/src/skill_subprocess.js +11 -4
  68. package/dist/src/skill_subprocess.js.map +1 -1
  69. package/dist/src/transcript_store.d.ts +14 -0
  70. package/dist/src/transcript_store.js +39 -0
  71. package/dist/src/transcript_store.js.map +1 -0
  72. package/dist/src/turn_loop.d.ts +173 -0
  73. package/dist/src/turn_loop.js +283 -0
  74. package/dist/src/turn_loop.js.map +1 -0
  75. package/dist/src/version.d.ts +1 -1
  76. package/dist/src/version.js +1 -1
  77. package/dist/src/worker.js +6 -0
  78. package/dist/src/worker.js.map +1 -1
  79. package/dist/src/worker_env.d.ts +4 -2
  80. package/dist/src/worker_env.js +42 -0
  81. package/dist/src/worker_env.js.map +1 -1
  82. package/domain_types/change-set.json +33 -22
  83. package/domain_types/red-spec.json +32 -23
  84. package/domain_types/seat-primer.json +65 -0
  85. package/package.json +1 -1
  86. package/standards/build-from-red-spec-v0.json +93 -0
  87. package/standards/draft-red-laws-v0.json +68 -0
@@ -0,0 +1,221 @@
1
+ // ── MCP ↔ function-calling, losslessly ───────────────────────────────────────────────────────────
2
+ //
3
+ // A readable name survives unchanged (the model reasons better about `mcp__coltrane__output_query`
4
+ // than about a hex blob), and anything else is escaped reversibly. A name too long for either form
5
+ // is truncated with a digest — legal and collision-resistant, but no longer invertible on its own,
6
+ // which is why the reply is resolved through the offered list rather than by inverting the name.
7
+ const SAFE_NAME = /^[A-Za-z0-9_-]{1,64}$/;
8
+ const ESCAPE = "x0_";
9
+ /** The wire's own bound on a function name. Legality is a SEPARATE property from losslessness — a
10
+ * round-trip law proves the second and says nothing about the first, which is how a 68-character
11
+ * name came to encode to 139 and pass every test. */
12
+ const NAME_LIMIT = 64;
13
+ const TRUNC = "x1_";
14
+ /** A short deterministic digest, so two distinct long names cannot collapse onto one wire name. */
15
+ function shortDigest(s) {
16
+ let h1 = 0x811c9dc5;
17
+ let h2 = 0x01000193;
18
+ for (let i = 0; i < s.length; i++) {
19
+ h1 = Math.imul(h1 ^ s.charCodeAt(i), 0x01000193) >>> 0;
20
+ h2 = Math.imul(h2 + s.charCodeAt(i) + i, 0x85ebca6b) >>> 0;
21
+ }
22
+ return h1.toString(36).padStart(7, "0") + h2.toString(36).padStart(7, "0");
23
+ }
24
+ /**
25
+ * An MCP name → a name the wire will actually accept: `[A-Za-z0-9_-]{1,64}`.
26
+ *
27
+ * Three tiers, and the third is the one this needed. A safe short name passes through unchanged,
28
+ * because a model reasons better about `mcp__coltrane__output_query` than about a hex blob. Anything
29
+ * else is hex-escaped, which is reversible. And a name too long for EITHER form is truncated with a
30
+ * digest — legal and collision-resistant, but no longer invertible on its own.
31
+ *
32
+ * That last tier is why the caller resolves replies through the tool list it holds rather than by
33
+ * inverting the name: a long-named tool stays callable instead of being refused for the shape of its
34
+ * name.
35
+ */
36
+ export function encodeToolName(name) {
37
+ if (SAFE_NAME.test(name) && !name.startsWith(ESCAPE) && !name.startsWith(TRUNC))
38
+ return name;
39
+ let hex = "";
40
+ for (const byte of new TextEncoder().encode(name))
41
+ hex += byte.toString(16).padStart(2, "0");
42
+ const escaped = ESCAPE + hex;
43
+ if (escaped.length <= NAME_LIMIT)
44
+ return escaped;
45
+ const digest = shortDigest(name);
46
+ const room = NAME_LIMIT - TRUNC.length - digest.length - 1;
47
+ return `${TRUNC}${hex.slice(0, Math.max(0, room))}_${digest}`;
48
+ }
49
+ export function fromFunctionName(name) {
50
+ if (!name.startsWith(ESCAPE))
51
+ return name;
52
+ const hex = name.slice(ESCAPE.length);
53
+ const bytes = new Uint8Array(hex.length / 2);
54
+ for (let i = 0; i < bytes.length; i++)
55
+ bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
56
+ return new TextDecoder().decode(bytes);
57
+ }
58
+ export function toFunctionDef(tool) {
59
+ return {
60
+ type: "function",
61
+ function: {
62
+ name: encodeToolName(tool.name),
63
+ ...(tool.description !== undefined ? { description: tool.description } : {}),
64
+ parameters: tool.inputSchema,
65
+ },
66
+ };
67
+ }
68
+ /** A neutral transcript message → its wire shape. Assistant tool calls are encoded to wire names
69
+ * and their args serialized; a tool result carries its id and content. */
70
+ function toWireMessage(m) {
71
+ if (m.role === "assistant") {
72
+ const out = { role: "assistant", content: m.content };
73
+ if (m.tool_calls && m.tool_calls.length > 0) {
74
+ out["tool_calls"] = m.tool_calls.map((tc) => ({
75
+ id: tc.id,
76
+ type: "function",
77
+ function: { name: encodeToolName(tc.name), arguments: JSON.stringify(tc.args) },
78
+ }));
79
+ }
80
+ return out;
81
+ }
82
+ if (m.role === "tool") {
83
+ return { role: "tool", tool_call_id: m.tool_call_id, content: m.content };
84
+ }
85
+ return { role: m.role, content: m.content };
86
+ }
87
+ /** Split the wire's `prompt_tokens` into uncached input and cache reads (law 16). A cached prompt is
88
+ * still the full prompt; the split is what makes the cache visible without inventing a class the
89
+ * wire did not report. Absent usage stays absent — an unreported round is not a zero-token one.
90
+ *
91
+ * Two wire shapes report the same split. The OpenAI shape folds hits into
92
+ * `prompt_tokens_details.cached_tokens` and leaves `prompt_tokens` whole. A provider that reports
93
+ * hits and misses SEPARATELY names them `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens`;
94
+ * there the cache hits are the hit count and the uncached input is the reported miss count directly.
95
+ * Either way the prompt stays whole and only the reported split differs — pricing cache hits as
96
+ * uncached input (the pre-cache-hit bug) would overcharge a run priced in cents. */
97
+ function mapUsage(u) {
98
+ if (!u)
99
+ return undefined;
100
+ const cached = typeof u.prompt_cache_hit_tokens === "number"
101
+ ? u.prompt_cache_hit_tokens
102
+ : typeof u.prompt_tokens_details?.cached_tokens === "number"
103
+ ? u.prompt_tokens_details.cached_tokens
104
+ : 0;
105
+ const usage = {};
106
+ if (typeof u.prompt_cache_miss_tokens === "number")
107
+ usage.input_tokens = u.prompt_cache_miss_tokens;
108
+ else if (typeof u.prompt_tokens === "number")
109
+ usage.input_tokens = u.prompt_tokens - cached;
110
+ if (cached > 0)
111
+ usage.cache_read_tokens = cached;
112
+ if (typeof u.completion_tokens === "number")
113
+ usage.output_tokens = u.completion_tokens;
114
+ return usage;
115
+ }
116
+ function mapStop(finish) {
117
+ switch (finish) {
118
+ case "stop":
119
+ return "end";
120
+ case "tool_calls":
121
+ return "tool_use";
122
+ case "length":
123
+ return "max_tokens";
124
+ case "content_filter":
125
+ return "refusal";
126
+ default:
127
+ return finish ? "other" : undefined;
128
+ }
129
+ }
130
+ /**
131
+ * Build a `ModelPort` bound to one chat-completions endpoint. Each call POSTs the request and turns
132
+ * the reply into a neutral `ModelReply`; a non-2xx response THROWS with its status, so the loop can
133
+ * type it as `transport_failed` rather than the port swallowing it into a shrug.
134
+ */
135
+ export function makeChatCompletionsPort(opts) {
136
+ const doFetch = opts.fetchFn ?? fetch;
137
+ // Strip trailing '/' in LINEAR time (CodeQL js/polynomial-redos, PR #534). The old `/\/+$/` regex
138
+ // retries its slash run from every start position, so a long run of INTERIOR slashes backtracks
139
+ // quadratically (measured 2,707 ms at 40,000 slashes). A backward char-code scan (47 === '/') is
140
+ // linear by construction and touches only the trailing run — interior slashes and the rest of the
141
+ // URL are left exactly as given.
142
+ let end = opts.baseUrl.length;
143
+ while (end > 0 && opts.baseUrl.charCodeAt(end - 1) === 47)
144
+ end--;
145
+ const url = `${opts.baseUrl.slice(0, end)}/chat/completions`;
146
+ return async (req) => {
147
+ // contract-tool-wire-name-collision-v1 (O3) — before building the reverse map or fetching, check
148
+ // that the request's tools INVERT: two tools that encode to one wire name would be sent as two
149
+ // identical function definitions, and `new Map(entries)` silently keeps only the last, so a reply
150
+ // naming that wire name resolves to whichever tool won. Fail closed HERE, the reachable layer the
151
+ // K6 witness named — throw (as this port's other unrecoverable argument faults do), naming both
152
+ // tools and the wire name they collapsed onto; never build the map from a set it cannot invert.
153
+ const wireNames = req.tools.map((t) => encodeToolName(t.name));
154
+ if (new Set(wireNames).size !== wireNames.length) {
155
+ const byWire = new Map();
156
+ req.tools.forEach((t, i) => {
157
+ const w = wireNames[i];
158
+ const names = byWire.get(w);
159
+ if (names)
160
+ names.push(t.name);
161
+ else
162
+ byWire.set(w, [t.name]);
163
+ });
164
+ const detail = [...byWire.entries()]
165
+ .filter(([, names]) => names.length > 1)
166
+ .map(([w, names]) => `${names.join(", ")} → ${w}`)
167
+ .join("; ");
168
+ throw new Error(`chat-completions tools collide on the wire (indistinguishable to the model): ${detail}. ` +
169
+ `Refusing rather than resolving a reply to whichever tool won the reverse map.`);
170
+ }
171
+ // The offered list is the authority on what a wire name means: build the reverse map from it so
172
+ // a reply resolves to the MCP name even when that name was too long to invert.
173
+ const byWireName = new Map(req.tools.map((t) => [encodeToolName(t.name), t.name]));
174
+ const body = {
175
+ model: req.model,
176
+ messages: req.messages.map(toWireMessage),
177
+ ...(req.tools.length > 0 ? { tools: req.tools.map(toFunctionDef) } : {}),
178
+ ...(req.max_tokens !== undefined ? { max_tokens: req.max_tokens } : {}),
179
+ };
180
+ const res = await doFetch(url, {
181
+ method: "POST",
182
+ headers: { "content-type": "application/json", authorization: `Bearer ${opts.apiKey}` },
183
+ body: JSON.stringify(body),
184
+ signal: req.signal,
185
+ });
186
+ if (!res.ok) {
187
+ const text = await res.text().catch(() => "");
188
+ throw new Error(`chat completions ${res.status}: ${text.slice(0, 300)}`);
189
+ }
190
+ const wire = (await res.json());
191
+ const choice = wire.choices?.[0];
192
+ const message = choice?.message ?? {};
193
+ const toolCalls = (message.tool_calls ?? []).map((tc) => {
194
+ const wireName = tc.function?.name ?? "";
195
+ let args = {};
196
+ try {
197
+ args = JSON.parse(tc.function?.arguments || "{}");
198
+ }
199
+ catch {
200
+ args = {};
201
+ }
202
+ return { id: tc.id ?? "", name: byWireName.get(wireName) ?? fromFunctionName(wireName), args };
203
+ });
204
+ const reply = {
205
+ message: {
206
+ content: message.content ?? null,
207
+ ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),
208
+ },
209
+ };
210
+ if (typeof wire.model === "string")
211
+ reply.model = wire.model;
212
+ const usage = mapUsage(wire.usage);
213
+ if (usage !== undefined)
214
+ reply.usage = usage;
215
+ const stop = mapStop(choice?.finish_reason);
216
+ if (stop !== undefined)
217
+ reply.stop = stop;
218
+ return reply;
219
+ };
220
+ }
221
+ //# sourceMappingURL=chat_completions_port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat_completions_port.js","sourceRoot":"","sources":["../../src/chat_completions_port.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { type AgentInvocationContext, type AgentInvoker } from "./runtime.js";
2
2
  import type { Registry } from "./registry.js";
3
3
  import type { Depth, ModelTier } from "./pricing.js";
4
+ import type { Effort } from "./genome_schema.js";
4
5
  import { type ToolProviderRegistry } from "./tool_providers.js";
5
6
  export declare const MODEL_TIER_MAP: Record<ModelTier, string>;
6
7
  /**
@@ -249,11 +250,28 @@ export declare const PROMPT_ARG_LIMIT_DEFAULT = 16000;
249
250
  * to the size test rather than failing a dispatch.
250
251
  */
251
252
  export declare function promptViaStdin(prompt: string): boolean;
253
+ /**
254
+ * The `claude` session id a chair's conversation is NAMED by, derived deterministically from
255
+ * `(gig_id, role)`. The same seat used twice in one gig derives the SAME uuid, so its second reach
256
+ * can `--resume` the conversation the first opened instead of re-reading cold; two roles in one gig,
257
+ * or one role across two gigs, never collide (a v5-shaped uuid over a `gig_id\x1frole` string).
258
+ *
259
+ * A gig-less invocation (no `gig_id`) returns undefined: with nothing to key the session on there is
260
+ * nothing to name and nothing to resume, so the spawn carries neither `--session-id` nor `--resume`.
261
+ * The uuid is a valid RFC 4122 string (version nibble 5, variant 8–b) so the CLI accepts it as a
262
+ * session id and the spec's UUID shape holds.
263
+ */
264
+ export declare function sessionUuidFor(gig_id: string | undefined, role: string | undefined): string | undefined;
252
265
  export declare function buildInvokerArgs(prompt: string, mcpConfigPath: string, opts: {
253
266
  model?: string | undefined;
254
267
  allowed_tools?: readonly string[] | undefined;
255
268
  disallowed_tools?: readonly string[] | undefined;
256
269
  max_tool_calls?: number | undefined;
270
+ effort?: Effort | undefined;
271
+ session_id?: string | undefined;
272
+ resume?: boolean | undefined;
273
+ fork_from_session?: string | undefined;
274
+ resume_session_at?: string | undefined;
257
275
  }): string[];
258
276
  /** Everything except the box's own credentials. Returns a plain object, so the spawn is given an
259
277
  * explicit environment rather than inheriting one — the difference matters when a new secret is