@shapeshift-labs/loom 0.1.16 → 0.1.18

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/README.md CHANGED
@@ -34,6 +34,7 @@ Loom gives a repository a durable semantic workspace:
34
34
  - `.loom/index.json` records the current imported source graph.
35
35
  - `.loom/refs/` and `.loom/HEAD` track semantic graph snapshots.
36
36
  - `.loom/graph/current.json` is the current machine-readable source graph.
37
+ - `.loom/graph/runs/` stores durable swarm run graphs by run id.
37
38
  - `.loom/projections/` stores target-language projection plans.
38
39
  - `loom swarm ...` delegates to Frontier Swarm / Codex worker orchestration.
39
40
  - `loom ui ...` opens the dark Loom dashboard against a swarm run or collected
@@ -53,6 +54,8 @@ loom scan
53
54
  loom status --json
54
55
  loom snapshot -m "initial semantic graph"
55
56
  loom diff --json
57
+ loom run-graph status my-run --json
58
+ loom run-graph import-frontier-run agent-runs/my-run/run-events.jsonl --run-id my-run
56
59
  loom project --to python
57
60
  loom capabilities
58
61
  loom version
@@ -119,6 +122,57 @@ Prints `.loom/graph/current.json`.
119
122
  loom graph [--json]
120
123
  ```
121
124
 
125
+ ### `loom run-graph`
126
+
127
+ Reads and writes durable run dependency graphs stored under
128
+ `.loom/graph/runs/`. Run ids are sanitized into stable filenames, so a run id
129
+ such as `agent-runs/my-run` is stored as
130
+ `.loom/graph/runs/agent-runs_my-run.json`.
131
+
132
+ ```sh
133
+ loom run-graph read [<run-id>] [--run-id <id>]
134
+ loom run-graph status [<run-id>] [--run-id <id>] [--json]
135
+ loom run-graph write-json <file|-> [--run-id <id>] [--json]
136
+ loom run-graph import-frontier-run <run-events.jsonl|-> [--run-id <id>] [--json]
137
+ ```
138
+
139
+ `read` prints the stored `loom.run-graph` JSON. `status` reports whether the
140
+ graph file is missing, present, or present but invalid without surfacing a raw
141
+ stack trace. `write-json` stores a JSON `loom.run-graph` document using the
142
+ existing Loom run graph writer; pass `-` to read from stdin. `import-frontier-run`
143
+ normalizes the current `frontier-run` `run-events.jsonl` stream into Loom's
144
+ durable `.loom/graph/runs/` model. Imported graphs are stored as
145
+ `loom.run-graph` documents with `source: "frontier-run"`, `sourceKind`, and
146
+ `sourceMetadata` pointing back to the event log path. Native Loom graphs can use
147
+ `source: "loom-native"`; `status --json` includes `sourceKind` so tools can
148
+ distinguish native and imported graphs without parsing free-form metadata.
149
+
150
+ `loom.run-graph` also accepts an optional `decisionGraph` section for typed
151
+ durable decision graphs. The legacy `graph.nodes: string[]` and dependency
152
+ indexes stay compatible for older job graph readers, while `decisionGraph`
153
+ stores typed nodes, edges, events, snapshots, indexes, and records for evidence,
154
+ gates, semantic changes, merge candidates, tournaments, panels, replays, and
155
+ improvement loops. Built-in node kinds include `intent`, `task`, `worker`,
156
+ `candidate`, `evidence`, `gate`, `decision`, `merge`, `replay`, and `rsi`.
157
+ Swarm imports populate this section alongside the legacy graph.
158
+
159
+ Typed summaries include `summary.typedCounts` when imported data contains
160
+ recognizable intents, tasks, workers, candidates, gates, evidence, merges,
161
+ panels, tournaments, RSI loops, or semantic changes. `status` prints a compact
162
+ `typed graph:` line for non-JSON output. The JavaScript API also exports
163
+ projection and chunk helpers so UI/read-models can be derived from graph truth
164
+ instead of becoming separate sources of truth:
165
+
166
+ ```ts
167
+ const chain = buildRunGraphChainChunk(['intent:demo', 'task:demo', 'worker:demo']);
168
+ const mergeGate = buildRunGraphPatternChunk('merge-gate', [
169
+ 'candidate:demo',
170
+ 'gate:tests',
171
+ 'merge:demo'
172
+ ]);
173
+ const panels = createLoomRunGraphPanelRecords(runGraph.decisionGraph);
174
+ ```
175
+
122
176
  ### `loom diff`
123
177
 
124
178
  Compares the saved graph with the current source tree without mutating `.loom/`.
@@ -362,8 +416,16 @@ import {
362
416
  snapshotLoomProject,
363
417
  diffLoomProject,
364
418
  createLoomProjectionPlan,
419
+ importFrontierRunEvents,
420
+ normalizeFrontierRunEvents,
421
+ parseFrontierRunEventsInput,
422
+ buildRunGraphChainChunk,
423
+ buildRunGraphPatternChunk,
424
+ createLoomRunGraphPanelRecords,
425
+ readLoomRunGraph,
365
426
  readLoomCapabilities,
366
- runDelegateCommand
427
+ runDelegateCommand,
428
+ writeLoomRunGraph
367
429
  } from '@shapeshift-labs/loom';
368
430
 
369
431
  await initLoomProject({ name: 'demo', include: ['src/**/*.ts'] });
@@ -371,6 +433,30 @@ const scan = await scanLoomProject();
371
433
  const snapshot = await snapshotLoomProject({ message: 'semantic checkpoint' });
372
434
  const diff = await diffLoomProject();
373
435
  const projection = await createLoomProjectionPlan({ target: 'python' });
436
+ await writeLoomRunGraph({
437
+ kind: 'loom.run-graph',
438
+ version: 1,
439
+ generatedAt: new Date().toISOString(),
440
+ root: process.cwd(),
441
+ runId: 'demo',
442
+ summary: { nodes: 1, edges: 0, roots: 1, leaves: 1, issues: 0 },
443
+ graph: {
444
+ nodes: ['task-1'],
445
+ edges: [],
446
+ dependentsByJobId: { 'task-1': [] },
447
+ dependenciesByJobId: { 'task-1': [] },
448
+ roots: ['task-1'],
449
+ leaves: ['task-1'],
450
+ issues: []
451
+ }
452
+ });
453
+ const runGraph = await readLoomRunGraph({ runId: 'demo' });
454
+ const events = parseFrontierRunEventsInput(runEventsJsonl);
455
+ const normalized = normalizeFrontierRunEvents(events, {
456
+ runId: 'agent-runs/demo',
457
+ sourcePath: 'agent-runs/demo/run-events.jsonl'
458
+ });
459
+ const imported = await importFrontierRunEvents(events, { runId: 'agent-runs/demo' });
374
460
  const capabilities = await readLoomCapabilities();
375
461
  await runDelegateCommand('lang', ['import', 'src/app.ts', '--sidecar']);
376
462
  ```
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAmBA,wBAAsB,UAAU,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqD9E"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA2BA,wBAAsB,UAAU,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuD9E"}
package/dist/cli.js CHANGED
@@ -2,14 +2,15 @@
2
2
  import fs from 'node:fs';
3
3
  import { pathToFileURL } from 'node:url';
4
4
  import { parseArgs, boolArg, listArg, stringArg } from './args.js';
5
- import { packageVersion } from './common.js';
5
+ import { abs, packageVersion, pathExists, readJson, resolveRoot } from './common.js';
6
6
  import { readLoomCapabilities } from './capabilities.js';
7
+ import { readLoomConfig } from './config.js';
7
8
  import { helpText } from './help.js';
8
9
  import { printResult } from './output.js';
9
10
  import { initLoomProject } from './init.js';
10
11
  import { scanLoomProject } from './scan.js';
11
12
  import { readLoomStatus, doctorLoomProject } from './status.js';
12
- import { readLoomGraph } from './graph.js';
13
+ import { importFrontierRunEvents, loomRunGraphSourceKind, parseFrontierRunEventsInput, readLoomGraph, readLoomRunGraph, writeLoomRunGraph } from './graph.js';
13
14
  import { diffLoomProject } from './diff.js';
14
15
  import { createLoomProjectionPlan } from './project.js';
15
16
  import { catLoomObject, snapshotLoomProject } from './snapshot.js';
@@ -49,6 +50,9 @@ export async function runLoomCli(argv = process.argv.slice(2)) {
49
50
  else if (command === 'graph') {
50
51
  printResult(await readLoomGraph(), json);
51
52
  }
53
+ else if (command === 'run-graph') {
54
+ return await runLoomRunGraphCommand(args, json);
55
+ }
52
56
  else if (command === 'diff') {
53
57
  printResult(await diffLoomProject(), json);
54
58
  }
@@ -87,6 +91,144 @@ export async function runLoomCli(argv = process.argv.slice(2)) {
87
91
  return 1;
88
92
  }
89
93
  }
94
+ async function runLoomRunGraphCommand(args, json) {
95
+ const subcommand = args._[0] ?? 'status';
96
+ if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
97
+ process.stdout.write(runGraphHelpText());
98
+ return 0;
99
+ }
100
+ if (subcommand === 'read') {
101
+ const runId = runGraphRunId(args, 1);
102
+ printResult(await readLoomRunGraph({ root: stringArg(args.root), runId }), true);
103
+ return 0;
104
+ }
105
+ if (subcommand === 'status') {
106
+ printResult(await readLoomRunGraphStatus({ root: stringArg(args.root), runId: runGraphRunId(args, 1) }), json);
107
+ return 0;
108
+ }
109
+ if (subcommand === 'write-json') {
110
+ const input = args._[1] ?? stringArg(args.input);
111
+ if (!input)
112
+ throw new Error('run-graph write-json requires <file|->');
113
+ const graph = await readRunGraphJson(input);
114
+ const targetRunId = runGraphRunId(args, 2) ?? graph.runId ?? 'current';
115
+ const path = await writeLoomRunGraph(graph, { root: stringArg(args.root), runId: targetRunId });
116
+ printResult({
117
+ ok: true,
118
+ message: `wrote loom run graph ${targetRunId}`,
119
+ path,
120
+ runId: targetRunId,
121
+ present: true,
122
+ graphSummary: graph.summary
123
+ }, json);
124
+ return 0;
125
+ }
126
+ if (subcommand === 'import-frontier-run' || subcommand === 'import-run') {
127
+ const input = args._[1] ?? stringArg(args.input);
128
+ if (!input)
129
+ throw new Error('run-graph import-frontier-run requires <run-events.jsonl|->');
130
+ const events = parseFrontierRunEventsInput(readTextInput(input));
131
+ const targetRunId = runGraphRunId(args, 2);
132
+ printResult(await importFrontierRunEvents(events, {
133
+ root: stringArg(args.root),
134
+ runId: targetRunId,
135
+ sourcePath: input === '-' ? 'stdin' : input
136
+ }), json);
137
+ return 0;
138
+ }
139
+ throw new Error(`unknown run-graph command: ${subcommand}`);
140
+ }
141
+ async function readLoomRunGraphStatus(options) {
142
+ const root = resolveRoot(options.root);
143
+ const runId = options.runId ?? 'current';
144
+ const label = options.runId ?? 'current';
145
+ let path;
146
+ try {
147
+ const config = await readLoomConfig(root);
148
+ path = abs(root, `${config.generated.graph}/runs/${loomRunGraphFileName(options.runId)}.json`);
149
+ }
150
+ catch (error) {
151
+ return {
152
+ ok: false,
153
+ message: errorMessage(error),
154
+ runId: label,
155
+ present: false
156
+ };
157
+ }
158
+ if (!(await pathExists(path))) {
159
+ return {
160
+ ok: false,
161
+ message: `missing loom run graph for ${label}`,
162
+ path,
163
+ runId: label,
164
+ present: false
165
+ };
166
+ }
167
+ try {
168
+ const graph = await readLoomRunGraph(options);
169
+ const sourceKind = loomRunGraphSourceKind(graph);
170
+ return {
171
+ ok: true,
172
+ message: `found loom run graph ${graph.runId ?? runId}`,
173
+ path,
174
+ runId: graph.runId ?? runId,
175
+ present: true,
176
+ planId: graph.planId,
177
+ source: graph.source ?? sourceKind,
178
+ sourceKind,
179
+ sourceMetadata: graph.sourceMetadata,
180
+ graphSummary: graph.summary
181
+ };
182
+ }
183
+ catch (error) {
184
+ return {
185
+ ok: false,
186
+ message: `invalid loom run graph for ${label}: ${errorMessage(error)}`,
187
+ path,
188
+ runId: label,
189
+ present: true
190
+ };
191
+ }
192
+ }
193
+ function runGraphRunId(args, positionalIndex) {
194
+ return stringArg(args['run-id'] ?? args.runId ?? args.run ?? args.id) ?? args._[positionalIndex];
195
+ }
196
+ async function readRunGraphJson(input) {
197
+ return readJsonInput(input);
198
+ }
199
+ async function readJsonInput(input) {
200
+ if (input === '-')
201
+ return JSON.parse(readTextInput(input));
202
+ return readJson(input);
203
+ }
204
+ function readTextInput(input) {
205
+ if (input === '-')
206
+ return fs.readFileSync(0, 'utf8');
207
+ return fs.readFileSync(input, 'utf8');
208
+ }
209
+ function loomRunGraphFileName(runId = 'current') {
210
+ const cleaned = runId.trim().replace(/[^A-Za-z0-9._-]+/g, '_').replace(/^_+|_+$/g, '');
211
+ return cleaned || 'current';
212
+ }
213
+ function runGraphHelpText() {
214
+ return `loom run-graph - durable swarm run dependency graph helpers
215
+
216
+ Usage:
217
+ loom run-graph read [<run-id>] [--run-id <id>]
218
+ loom run-graph status [<run-id>] [--run-id <id>] [--json]
219
+ loom run-graph write-json <file|-> [--run-id <id>] [--json]
220
+ loom run-graph import-frontier-run <run-events.jsonl|-> [--run-id <id>] [--json]
221
+
222
+ Examples:
223
+ loom run-graph status agent-run-2026 --json
224
+ loom run-graph read agent-run-2026
225
+ loom run-graph write-json run-graph.json --run-id agent-run-2026
226
+ loom run-graph import-frontier-run agent-runs/my-run/run-events.jsonl --run-id agent-runs/my-run
227
+ `;
228
+ }
229
+ function errorMessage(error) {
230
+ return error instanceof Error ? error.message : String(error);
231
+ }
90
232
  function isCliEntrypoint() {
91
233
  if (!process.argv[1])
92
234
  return false;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { FrontierRun, FrontierRunProjection } from '@shapeshift-labs/frontier-run';
2
+ import type { LoomDecisionGraph, LoomRunGraphSourceKind, LoomRunJobGraph } from './types.js';
3
+ export declare const FRONTIER_RUN_GRAPH_SOURCE: LoomRunGraphSourceKind;
4
+ export declare function normalizeFrontierRunJobGraph(input: FrontierRun['graph']): LoomRunJobGraph;
5
+ export declare function normalizeFrontierRunDecisionGraph(projection: FrontierRunProjection): LoomDecisionGraph;
6
+ //# sourceMappingURL=graph-frontier-run-convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-frontier-run-convert.d.ts","sourceRoot":"","sources":["../src/graph-frontier-run-convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAIX,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AAOvC,OAAO,KAAK,EACV,iBAAiB,EAWjB,sBAAsB,EACtB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,yBAAyB,EAAE,sBAAuC,CAAC;AAEhF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,eAAe,CA6CzF;AAED,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,qBAAqB,GAAG,iBAAiB,CAuBtG"}
@@ -0,0 +1,219 @@
1
+ import { nowIso } from './common.js';
2
+ import { frontierRunStringFromData, normalizeFrontierRunDecisionRecords, toFrontierRunJsonRecord } from './graph-frontier-run-records.js';
3
+ export const FRONTIER_RUN_GRAPH_SOURCE = 'frontier-run';
4
+ export function normalizeFrontierRunJobGraph(input) {
5
+ const nodeIds = new Set(Object.keys(input.nodes));
6
+ const edges = [];
7
+ const issues = [];
8
+ const seenEdges = new Set();
9
+ for (const edge of Object.values(input.edges)) {
10
+ const from = edge.from;
11
+ const to = edge.to;
12
+ if (!from || !to) {
13
+ issues.push({ code: 'invalid-edge', severity: 'warning', message: `frontier-run edge ${edge.id || '<unknown>'} is missing from/to` });
14
+ continue;
15
+ }
16
+ if (!nodeIds.has(from)) {
17
+ issues.push({ code: 'missing-edge-node', severity: 'warning', message: `frontier-run edge ${edge.id || '<unknown>'} references missing source node ${from}`, path: `/graph/edges/${edge.id || edges.length}/from` });
18
+ nodeIds.add(from);
19
+ }
20
+ if (!nodeIds.has(to)) {
21
+ issues.push({ code: 'missing-edge-node', severity: 'warning', message: `frontier-run edge ${edge.id || '<unknown>'} references missing target node ${to}`, path: `/graph/edges/${edge.id || edges.length}/to` });
22
+ nodeIds.add(to);
23
+ }
24
+ const normalized = { from, to, type: normalizeFrontierRunEdgeKind(edge.type) };
25
+ const key = `${normalized.type}\0${normalized.from}\0${normalized.to}`;
26
+ if (seenEdges.has(key))
27
+ continue;
28
+ seenEdges.add(key);
29
+ edges.push(normalized);
30
+ }
31
+ const nodes = Array.from(nodeIds).sort();
32
+ edges.sort((left, right) => left.from.localeCompare(right.from) || left.to.localeCompare(right.to) || left.type.localeCompare(right.type));
33
+ const dependentsByJobId = emptyGraphIndex(nodes);
34
+ const dependenciesByJobId = emptyGraphIndex(nodes);
35
+ for (const edge of edges) {
36
+ dependentsByJobId[edge.from]?.push(edge.to);
37
+ dependenciesByJobId[edge.to]?.push(edge.from);
38
+ }
39
+ sortGraphIndex(dependentsByJobId);
40
+ sortGraphIndex(dependenciesByJobId);
41
+ return {
42
+ nodes,
43
+ edges,
44
+ dependentsByJobId,
45
+ dependenciesByJobId,
46
+ roots: nodes.filter((node) => dependenciesByJobId[node]?.length === 0),
47
+ leaves: nodes.filter((node) => dependentsByJobId[node]?.length === 0),
48
+ issues
49
+ };
50
+ }
51
+ export function normalizeFrontierRunDecisionGraph(projection) {
52
+ const nodes = Object.values(projection.run.graph.nodes).map((node) => normalizeFrontierRunDecisionNode(node)).sort((left, right) => left.id.localeCompare(right.id));
53
+ const edges = Object.values(projection.run.graph.edges).map((edge) => normalizeFrontierRunDecisionEdge(edge)).sort((left, right) => left.id.localeCompare(right.id));
54
+ const events = projection.events.map((event, index) => normalizeFrontierRunDecisionEvent(event, index)).sort((left, right) => left.generatedAt.localeCompare(right.generatedAt) || left.id.localeCompare(right.id));
55
+ const records = normalizeFrontierRunDecisionRecords(nodes);
56
+ return {
57
+ kind: 'loom.decision-graph',
58
+ version: 1,
59
+ generatedAt: projection.run.updatedAt || nowIso(),
60
+ nodes,
61
+ edges,
62
+ events,
63
+ snapshots: [normalizeFrontierRunDecisionSnapshot(projection.run, nodes, edges, events, records)],
64
+ indexes: createDecisionGraphIndexes(nodes, edges),
65
+ records,
66
+ metadata: toFrontierRunJsonRecord({
67
+ sourceKind: FRONTIER_RUN_GRAPH_SOURCE,
68
+ runId: projection.run.id,
69
+ goal: projection.run.goal,
70
+ eventCount: projection.events.length,
71
+ heads: projection.run.heads
72
+ })
73
+ };
74
+ }
75
+ function normalizeFrontierRunDecisionNode(node) {
76
+ const kind = normalizeFrontierRunNodeKind(node.kind);
77
+ const data = toFrontierRunJsonRecord(node);
78
+ const metadata = toFrontierRunJsonRecord('metadata' in node ? node.metadata : undefined);
79
+ const taskId = node.kind === 'task' ? node.id : frontierRunStringFromData(data, 'taskId') ?? frontierRunStringFromData(metadata, 'taskId');
80
+ const jobId = frontierRunStringFromData(data, 'jobId') ?? frontierRunStringFromData(metadata, 'jobId');
81
+ const lane = node.kind === 'lane' ? node.id : frontierRunStringFromData(data, 'laneId') ?? frontierRunStringFromData(data, 'lane') ?? frontierRunStringFromData(metadata, 'lane');
82
+ const pathValue = frontierRunStringFromData(data, 'path') ?? frontierRunStringFromData(data, 'uri');
83
+ const status = frontierRunStringFromData(data, 'status');
84
+ const outcome = node.kind === 'decision' ? node.decision : node.kind === 'evidence' ? node.result : node.kind === 'verification' ? node.status : undefined;
85
+ return {
86
+ id: node.id,
87
+ kind,
88
+ ...(kind !== node.kind ? { sourceKind: node.kind } : {}),
89
+ ...(node.title ? { label: node.title } : {}),
90
+ ...(taskId ? { taskId } : {}),
91
+ ...(jobId ? { jobId } : {}),
92
+ ...(lane ? { lane } : {}),
93
+ ...(status ? { status } : {}),
94
+ ...(outcome ? { outcome } : {}),
95
+ ...(pathValue ? { path: pathValue } : {}),
96
+ ...(node.createdAt ? { createdAt: node.createdAt } : {}),
97
+ ...(node.updatedAt ? { updatedAt: node.updatedAt } : {}),
98
+ ...(node.kind === 'attempt' ? { workerId: node.actorId ?? node.runnerId ?? node.id } : {}),
99
+ ...(node.kind === 'patch' ? { candidateId: node.id } : {}),
100
+ ...(data ? { data } : {})
101
+ };
102
+ }
103
+ function normalizeFrontierRunDecisionEdge(edge) {
104
+ const kind = normalizeFrontierRunEdgeKind(edge.type);
105
+ const data = toFrontierRunJsonRecord(edge.metadata);
106
+ return {
107
+ id: edge.id || `${kind}:${edge.from}->${edge.to}`,
108
+ kind,
109
+ from: edge.from,
110
+ to: edge.to,
111
+ ...(kind !== edge.type ? { sourceKind: edge.type } : {}),
112
+ ...(edge.createdAt ? { createdAt: edge.createdAt } : {}),
113
+ ...(data ? { data } : {})
114
+ };
115
+ }
116
+ function normalizeFrontierRunDecisionEvent(event, index) {
117
+ const nodes = frontierRunEventNodes(event).map((node) => normalizeFrontierRunDecisionNode(node)).sort((left, right) => left.id.localeCompare(right.id));
118
+ const edges = frontierRunEventEdges(event).map((edge) => normalizeFrontierRunDecisionEdge(edge)).sort((left, right) => left.id.localeCompare(right.id));
119
+ const data = toFrontierRunJsonRecord({ id: event.id, actorId: event.actorId, actorSeq: event.actorSeq, parents: event.parents, previousActorEventId: event.previousActorEventId, payload: event.payload, hash: event.hash });
120
+ return {
121
+ kind: 'loom.decision-graph.event',
122
+ version: 1,
123
+ id: event.id || `frontier-run-event:${index}`,
124
+ type: event.type,
125
+ generatedAt: event.time,
126
+ runId: event.runId,
127
+ ...(nodes.length ? { nodeIds: nodes.map((node) => node.id), nodes } : {}),
128
+ ...(edges.length ? { edgeIds: edges.map((edge) => edge.id), edges } : {}),
129
+ ...(data ? { data } : {})
130
+ };
131
+ }
132
+ function normalizeFrontierRunDecisionSnapshot(run, nodes, edges, events, records) {
133
+ return {
134
+ kind: 'loom.decision-graph.snapshot',
135
+ version: 1,
136
+ id: `snapshot:${run.id}`,
137
+ generatedAt: run.updatedAt || nowIso(),
138
+ label: 'current',
139
+ nodeIds: nodes.map((node) => node.id),
140
+ edgeIds: edges.map((edge) => edge.id),
141
+ eventIds: events.map((event) => event.id),
142
+ summary: { nodes: nodes.length, edges: edges.length, events: events.length, records: records.length },
143
+ data: toFrontierRunJsonRecord({ sourceKind: FRONTIER_RUN_GRAPH_SOURCE, runId: run.id, goal: run.goal })
144
+ };
145
+ }
146
+ function createDecisionGraphIndexes(nodes, edges) {
147
+ const indexes = { byNodeKind: {}, byEdgeKind: {}, byTaskId: {}, byJobId: {}, byLane: {} };
148
+ for (const node of nodes) {
149
+ addIndexValue(indexes.byNodeKind, node.kind, node.id);
150
+ if (node.taskId)
151
+ addIndexValue(indexes.byTaskId, node.taskId, node.id);
152
+ if (node.jobId)
153
+ addIndexValue(indexes.byJobId, node.jobId, node.id);
154
+ if (node.lane)
155
+ addIndexValue(indexes.byLane, node.lane, node.id);
156
+ }
157
+ for (const edge of edges)
158
+ addIndexValue(indexes.byEdgeKind, edge.kind, edge.id);
159
+ sortGraphIndex(indexes.byNodeKind);
160
+ sortGraphIndex(indexes.byEdgeKind);
161
+ sortGraphIndex(indexes.byTaskId);
162
+ sortGraphIndex(indexes.byJobId);
163
+ sortGraphIndex(indexes.byLane);
164
+ return indexes;
165
+ }
166
+ function addIndexValue(index, key, value) {
167
+ const values = index[key] ?? [];
168
+ if (!values.includes(value))
169
+ values.push(value);
170
+ index[key] = values;
171
+ }
172
+ function normalizeFrontierRunNodeKind(kind) {
173
+ if (kind === 'goal')
174
+ return 'intent';
175
+ if (kind === 'attempt')
176
+ return 'worker';
177
+ if (kind === 'patch')
178
+ return 'candidate';
179
+ if (kind === 'artifact')
180
+ return 'evidence';
181
+ if (kind === 'verification')
182
+ return 'gate';
183
+ if (kind === 'human-question' || kind === 'lease')
184
+ return 'decision';
185
+ return kind;
186
+ }
187
+ function normalizeFrontierRunEdgeKind(kind) {
188
+ if (kind === 'belongs-to-lane' || kind === 'contains-task' || kind === 'attempts-task')
189
+ return 'parent-task';
190
+ if (kind === 'produces-artifact' || kind === 'produces-evidence' || kind === 'produces-patch')
191
+ return 'produces';
192
+ if (kind === 'verified-by')
193
+ return 'verifies';
194
+ if (kind === 'decided-by')
195
+ return 'approves';
196
+ return kind;
197
+ }
198
+ function frontierRunEventNodes(event) {
199
+ const payload = event.payload;
200
+ return ['node', 'artifact', 'decision', 'lease'].map((key) => payload[key]).filter(isFrontierRunNode);
201
+ }
202
+ function frontierRunEventEdges(event) {
203
+ const payload = event.payload;
204
+ return isFrontierRunEdge(payload.edge) ? [payload.edge] : [];
205
+ }
206
+ function isFrontierRunNode(value) {
207
+ return !!value && typeof value === 'object' && !Array.isArray(value) && typeof value.id === 'string' && typeof value.kind === 'string';
208
+ }
209
+ function isFrontierRunEdge(value) {
210
+ return !!value && typeof value === 'object' && !Array.isArray(value) && typeof value.id === 'string' && typeof value.from === 'string' && typeof value.to === 'string' && typeof value.type === 'string';
211
+ }
212
+ function emptyGraphIndex(nodes) {
213
+ return Object.fromEntries(nodes.map((node) => [node, []]));
214
+ }
215
+ function sortGraphIndex(index) {
216
+ for (const values of Object.values(index))
217
+ values.sort();
218
+ }
219
+ //# sourceMappingURL=graph-frontier-run-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-frontier-run-convert.js","sourceRoot":"","sources":["../src/graph-frontier-run-convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { JsonValue, LoomDecisionGraph, LoomDecisionGraphNode, LoomDecisionGraphRecord, LoomPanelProjectionRecord, LoomRunGraphTypedCounts } from './types.js';
2
+ export declare function createFrontierRunPanelRecords(graph: LoomDecisionGraph): LoomPanelProjectionRecord[];
3
+ export declare function normalizeFrontierRunDecisionRecords(nodes: readonly LoomDecisionGraphNode[]): LoomDecisionGraphRecord[];
4
+ export declare function summarizeFrontierRunTypedCounts(graph: LoomDecisionGraph): LoomRunGraphTypedCounts;
5
+ export declare function toFrontierRunJsonValue(value: unknown): JsonValue;
6
+ export declare function toFrontierRunJsonRecord(value: unknown): Record<string, JsonValue> | undefined;
7
+ export declare function frontierRunStringFromData(data: Record<string, JsonValue> | undefined, key: string): string | undefined;
8
+ export declare function uniqueFrontierRunStrings(values: readonly string[]): string[];
9
+ //# sourceMappingURL=graph-frontier-run-records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-frontier-run-records.d.ts","sourceRoot":"","sources":["../src/graph-frontier-run-records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EAGvB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,iBAAiB,GAAG,yBAAyB,EAAE,CAUnG;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,GAAG,uBAAuB,EAAE,CA4BtH;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,GAAG,uBAAuB,CAYjG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAchE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAI7F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtH;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5E"}