@twelvehart/orcats 0.0.0-seed.0 → 0.2.3
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/LICENSE +48 -0
- package/NOTICE +5 -0
- package/README.md +399 -0
- package/bin/orcats +4 -0
- package/dist/backends/acp-client.d.ts +74 -0
- package/dist/backends/acp-client.d.ts.map +1 -0
- package/dist/backends/acp-run.d.ts +31 -0
- package/dist/backends/acp-run.d.ts.map +1 -0
- package/dist/backends/claude-run.d.ts +35 -0
- package/dist/backends/claude-run.d.ts.map +1 -0
- package/dist/backends/claude-stream-json.d.ts +15 -0
- package/dist/backends/claude-stream-json.d.ts.map +1 -0
- package/dist/backends/codex-jsonl.d.ts +34 -0
- package/dist/backends/codex-jsonl.d.ts.map +1 -0
- package/dist/backends/codex-run.d.ts +40 -0
- package/dist/backends/codex-run.d.ts.map +1 -0
- package/dist/backends/codex.d.ts +5 -0
- package/dist/backends/codex.d.ts.map +1 -0
- package/dist/backends/conversation-config.d.ts +12 -0
- package/dist/backends/conversation-config.d.ts.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/opencode-run.d.ts +48 -0
- package/dist/backends/opencode-run.d.ts.map +1 -0
- package/dist/backends/opencode-sse.d.ts +35 -0
- package/dist/backends/opencode-sse.d.ts.map +1 -0
- package/dist/backends/pi-rpc.d.ts +21 -0
- package/dist/backends/pi-rpc.d.ts.map +1 -0
- package/dist/backends/pi-run.d.ts +21 -0
- package/dist/backends/pi-run.d.ts.map +1 -0
- package/dist/backends/select.d.ts +17 -0
- package/dist/backends/select.d.ts.map +1 -0
- package/dist/backends/subprocess-run.d.ts +68 -0
- package/dist/backends/subprocess-run.d.ts.map +1 -0
- package/dist/backends/types.d.ts +17 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/unsupported.d.ts +9 -0
- package/dist/backends/unsupported.d.ts.map +1 -0
- package/dist/baseline/index.d.ts +56 -0
- package/dist/baseline/index.d.ts.map +1 -0
- package/dist/cli/args.d.ts +22 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/embedded.d.ts +7 -0
- package/dist/cli/embedded.d.ts.map +1 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/conversation/ask-user.d.ts +17 -0
- package/dist/conversation/ask-user.d.ts.map +1 -0
- package/dist/conversation/conversation.d.ts +46 -0
- package/dist/conversation/conversation.d.ts.map +1 -0
- package/dist/conversation/harness.d.ts +14 -0
- package/dist/conversation/harness.d.ts.map +1 -0
- package/dist/conversation/index.d.ts +5 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/queue.d.ts +15 -0
- package/dist/conversation/queue.d.ts.map +1 -0
- package/dist/flow/accessors.d.ts +13 -0
- package/dist/flow/accessors.d.ts.map +1 -0
- package/dist/flow/approvals.d.ts +6 -0
- package/dist/flow/approvals.d.ts.map +1 -0
- package/dist/flow/args.d.ts +4 -0
- package/dist/flow/args.d.ts.map +1 -0
- package/dist/flow/context.d.ts +36 -0
- package/dist/flow/context.d.ts.map +1 -0
- package/dist/flow/index.d.ts +5 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/loop/builder/index.d.ts +17 -0
- package/dist/loop/builder/index.d.ts.map +1 -0
- package/dist/loop/builder/types.d.ts +97 -0
- package/dist/loop/builder/types.d.ts.map +1 -0
- package/dist/loop/context/compaction.d.ts +38 -0
- package/dist/loop/context/compaction.d.ts.map +1 -0
- package/dist/loop/context/index.d.ts +4 -0
- package/dist/loop/context/index.d.ts.map +1 -0
- package/dist/loop/context/offload.d.ts +34 -0
- package/dist/loop/context/offload.d.ts.map +1 -0
- package/dist/loop/context/types.d.ts +13 -0
- package/dist/loop/context/types.d.ts.map +1 -0
- package/dist/loop/engine/bridge.d.ts +21 -0
- package/dist/loop/engine/bridge.d.ts.map +1 -0
- package/dist/loop/engine/index.d.ts +73 -0
- package/dist/loop/engine/index.d.ts.map +1 -0
- package/dist/loop/execution.d.ts +68 -0
- package/dist/loop/execution.d.ts.map +1 -0
- package/dist/loop/fanout.d.ts +148 -0
- package/dist/loop/fanout.d.ts.map +1 -0
- package/dist/loop/firing.d.ts +54 -0
- package/dist/loop/firing.d.ts.map +1 -0
- package/dist/loop/graph/analyze.d.ts +8 -0
- package/dist/loop/graph/analyze.d.ts.map +1 -0
- package/dist/loop/graph/index.d.ts +3 -0
- package/dist/loop/graph/index.d.ts.map +1 -0
- package/dist/loop/graph/types.d.ts +35 -0
- package/dist/loop/graph/types.d.ts.map +1 -0
- package/dist/loop/index.d.ts +7 -0
- package/dist/loop/index.d.ts.map +1 -0
- package/dist/loop/io/index.d.ts +4 -0
- package/dist/loop/io/index.d.ts.map +1 -0
- package/dist/loop/io/linear.d.ts +142 -0
- package/dist/loop/io/linear.d.ts.map +1 -0
- package/dist/loop/io/sink.d.ts +47 -0
- package/dist/loop/io/sink.d.ts.map +1 -0
- package/dist/loop/io/source.d.ts +64 -0
- package/dist/loop/io/source.d.ts.map +1 -0
- package/dist/loop/serve.d.ts +97 -0
- package/dist/loop/serve.d.ts.map +1 -0
- package/dist/loop/state/index.d.ts +5 -0
- package/dist/loop/state/index.d.ts.map +1 -0
- package/dist/loop/state/manifest.d.ts +36 -0
- package/dist/loop/state/manifest.d.ts.map +1 -0
- package/dist/loop/state/port.d.ts +33 -0
- package/dist/loop/state/port.d.ts.map +1 -0
- package/dist/loop/state/snapshot.d.ts +15 -0
- package/dist/loop/state/snapshot.d.ts.map +1 -0
- package/dist/loop/state/sqlite.d.ts +31 -0
- package/dist/loop/state/sqlite.d.ts.map +1 -0
- package/dist/loop/termination-contract.d.ts +28 -0
- package/dist/loop/termination-contract.d.ts.map +1 -0
- package/dist/loop/termination.d.ts +33 -0
- package/dist/loop/termination.d.ts.map +1 -0
- package/dist/model/backend-config.d.ts +30 -0
- package/dist/model/backend-config.d.ts.map +1 -0
- package/dist/model/brand.d.ts +9 -0
- package/dist/model/brand.d.ts.map +1 -0
- package/dist/model/errors.d.ts +11 -0
- package/dist/model/errors.d.ts.map +1 -0
- package/dist/model/index.d.ts +8 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/json-schema.d.ts +4 -0
- package/dist/model/json-schema.d.ts.map +1 -0
- package/dist/model/result.d.ts +3 -0
- package/dist/model/result.d.ts.map +1 -0
- package/dist/model/schemas.d.ts +435 -0
- package/dist/model/schemas.d.ts.map +1 -0
- package/dist/model/structured.d.ts +9 -0
- package/dist/model/structured.d.ts.map +1 -0
- package/dist/monitor/index.d.ts +139 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/plan/index.d.ts +3 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/persistent.d.ts +23 -0
- package/dist/plan/persistent.d.ts.map +1 -0
- package/dist/plan/verdict.d.ts +9 -0
- package/dist/plan/verdict.d.ts.map +1 -0
- package/dist/review/index.d.ts +4 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/loop.d.ts +117 -0
- package/dist/review/loop.d.ts.map +1 -0
- package/dist/review/reviewers.d.ts +13 -0
- package/dist/review/reviewers.d.ts.map +1 -0
- package/dist/review/tool.d.ts +20 -0
- package/dist/review/tool.d.ts.map +1 -0
- package/dist/run-output/index.d.ts +112 -0
- package/dist/run-output/index.d.ts.map +1 -0
- package/dist/runner/index.d.ts +2 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/typecheck.d.ts +23 -0
- package/dist/runner/typecheck.d.ts.map +1 -0
- package/dist/test-utils/fakes.d.ts +76 -0
- package/dist/test-utils/fakes.d.ts.map +1 -0
- package/dist/test-utils/fixtures.d.ts +4 -0
- package/dist/test-utils/fixtures.d.ts.map +1 -0
- package/dist/test-utils/index.d.ts +4 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/tier2.d.ts +8 -0
- package/dist/test-utils/tier2.d.ts.map +1 -0
- package/dist/tools/fs.d.ts +11 -0
- package/dist/tools/fs.d.ts.map +1 -0
- package/dist/tools/git.d.ts +10 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/github.d.ts +13 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/linear.d.ts +117 -0
- package/dist/tools/linear.d.ts.map +1 -0
- package/dist/tools/process.d.ts +40 -0
- package/dist/tools/process.d.ts.map +1 -0
- package/dist/tools/terminal.d.ts +23 -0
- package/dist/tools/terminal.d.ts.map +1 -0
- package/package.json +89 -9
- package/src/backends/acp-client.ts +324 -0
- package/src/backends/acp-run.ts +636 -0
- package/src/backends/claude-run.ts +226 -0
- package/src/backends/claude-stream-json.ts +273 -0
- package/src/backends/codex-jsonl.ts +339 -0
- package/src/backends/codex-run.ts +177 -0
- package/src/backends/codex.ts +84 -0
- package/src/backends/conversation-config.ts +26 -0
- package/src/backends/index.ts +13 -0
- package/src/backends/opencode-run.ts +432 -0
- package/src/backends/opencode-sse.ts +360 -0
- package/src/backends/pi-rpc.ts +242 -0
- package/src/backends/pi-run.ts +154 -0
- package/src/backends/select.ts +77 -0
- package/src/backends/subprocess-run.ts +305 -0
- package/src/backends/types.ts +29 -0
- package/src/backends/unsupported.ts +48 -0
- package/src/baseline/index.ts +437 -0
- package/src/cli/args.ts +109 -0
- package/src/cli/embedded.ts +206 -0
- package/src/cli/main.ts +332 -0
- package/src/cli/version.ts +1 -0
- package/src/conversation/ask-user.ts +105 -0
- package/src/conversation/conversation.ts +109 -0
- package/src/conversation/harness.ts +39 -0
- package/src/conversation/index.ts +4 -0
- package/src/conversation/queue.ts +86 -0
- package/src/flow/accessors.ts +43 -0
- package/src/flow/approvals.ts +10 -0
- package/src/flow/args.ts +26 -0
- package/src/flow/context.ts +106 -0
- package/src/flow/index.ts +4 -0
- package/src/index.ts +17 -0
- package/src/loop/builder/index.ts +346 -0
- package/src/loop/builder/types.ts +131 -0
- package/src/loop/context/compaction.ts +175 -0
- package/src/loop/context/index.ts +3 -0
- package/src/loop/context/offload.ts +79 -0
- package/src/loop/context/types.ts +17 -0
- package/src/loop/engine/bridge.ts +61 -0
- package/src/loop/engine/index.ts +166 -0
- package/src/loop/execution.ts +453 -0
- package/src/loop/fanout.ts +444 -0
- package/src/loop/firing.ts +188 -0
- package/src/loop/graph/analyze.ts +128 -0
- package/src/loop/graph/index.ts +2 -0
- package/src/loop/graph/types.ts +45 -0
- package/src/loop/index.ts +11 -0
- package/src/loop/io/index.ts +3 -0
- package/src/loop/io/linear.ts +714 -0
- package/src/loop/io/sink.ts +170 -0
- package/src/loop/io/source.ts +255 -0
- package/src/loop/serve.ts +307 -0
- package/src/loop/state/index.ts +4 -0
- package/src/loop/state/manifest.ts +56 -0
- package/src/loop/state/port.ts +43 -0
- package/src/loop/state/snapshot.ts +129 -0
- package/src/loop/state/sqlite.ts +265 -0
- package/src/loop/termination-contract.ts +89 -0
- package/src/loop/termination.ts +156 -0
- package/src/model/backend-config.ts +34 -0
- package/src/model/brand.ts +11 -0
- package/src/model/errors.ts +28 -0
- package/src/model/index.ts +7 -0
- package/src/model/json-schema.ts +14 -0
- package/src/model/result.ts +28 -0
- package/src/model/schemas.ts +218 -0
- package/src/model/structured.ts +26 -0
- package/src/monitor/index.ts +367 -0
- package/src/plan/index.ts +2 -0
- package/src/plan/persistent.ts +98 -0
- package/src/plan/verdict.ts +3 -0
- package/src/review/index.ts +3 -0
- package/src/review/loop.ts +365 -0
- package/src/review/reviewers.ts +92 -0
- package/src/review/tool.ts +41 -0
- package/src/run-output/index.ts +319 -0
- package/src/runner/index.ts +1 -0
- package/src/runner/typecheck.ts +72 -0
- package/src/test-utils/fakes.ts +260 -0
- package/src/test-utils/fixtures.ts +33 -0
- package/src/test-utils/index.ts +3 -0
- package/src/test-utils/tier2.ts +12 -0
- package/src/tools/fs.ts +44 -0
- package/src/tools/git.ts +34 -0
- package/src/tools/github.ts +25 -0
- package/src/tools/index.ts +6 -0
- package/src/tools/linear.ts +428 -0
- package/src/tools/process.ts +156 -0
- package/src/tools/terminal.ts +116 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Hand-built 3-color (white/grey/black) DFS over the loop graph (design D6). No graph
|
|
2
|
+
// dependency: a loop is tens of nodes, so a single recursive pass yields the accidental
|
|
3
|
+
// back-edge set, a topological order, and the traversal at once — while keeping the
|
|
4
|
+
// declared loop back-edges as first-class domain data the builder hands us.
|
|
5
|
+
//
|
|
6
|
+
// The builder TELLS us which edges are loop back-edges; we trust that set rather than
|
|
7
|
+
// rediscovering it. DFS runs only over the FORWARD subgraph (all edges minus the declared
|
|
8
|
+
// back-edges), which is meant to be a DAG. Any back-edge the DFS finds there is therefore
|
|
9
|
+
// an ACCIDENTAL cycle the author did not declare, reported as `declared: false`.
|
|
10
|
+
|
|
11
|
+
import type { BackEdge, CycleReport, Edge, GraphInput, NodeId } from "./types.ts";
|
|
12
|
+
|
|
13
|
+
type Color = "white" | "grey" | "black";
|
|
14
|
+
|
|
15
|
+
/** Build adjacency in edge-insertion order so traversal/topo order are deterministic. */
|
|
16
|
+
function adjacency(nodes: readonly NodeId[], edges: readonly Edge[]): Map<NodeId, NodeId[]> {
|
|
17
|
+
const adj = new Map<NodeId, NodeId[]>();
|
|
18
|
+
for (const n of nodes) adj.set(n, []);
|
|
19
|
+
for (const { from, to } of edges) {
|
|
20
|
+
if (!adj.has(to)) adj.set(to, []);
|
|
21
|
+
const out = adj.get(from) ?? [];
|
|
22
|
+
out.push(to);
|
|
23
|
+
adj.set(from, out);
|
|
24
|
+
}
|
|
25
|
+
return adj;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const edgeKey = (from: NodeId, to: NodeId): string => `${from}\u0000${to}`;
|
|
29
|
+
|
|
30
|
+
/** Shortest forward path `from → … → to` over the DAG adjacency, or `null` if unreachable. */
|
|
31
|
+
function forwardPath(adj: Map<NodeId, NodeId[]>, from: NodeId, to: NodeId): readonly NodeId[] | null {
|
|
32
|
+
if (from === to) return [from];
|
|
33
|
+
const prev = new Map<NodeId, NodeId>();
|
|
34
|
+
const queue: NodeId[] = [from];
|
|
35
|
+
const seen = new Set<NodeId>([from]);
|
|
36
|
+
while (queue.length > 0) {
|
|
37
|
+
const u = queue.shift();
|
|
38
|
+
if (u === undefined) break;
|
|
39
|
+
for (const v of adj.get(u) ?? []) {
|
|
40
|
+
if (seen.has(v)) continue;
|
|
41
|
+
seen.add(v);
|
|
42
|
+
prev.set(v, u);
|
|
43
|
+
if (v === to) {
|
|
44
|
+
const path: NodeId[] = [to];
|
|
45
|
+
let cur: NodeId = to;
|
|
46
|
+
while (cur !== from) {
|
|
47
|
+
const p = prev.get(cur);
|
|
48
|
+
if (p === undefined) break;
|
|
49
|
+
cur = p;
|
|
50
|
+
path.push(cur);
|
|
51
|
+
}
|
|
52
|
+
return path.reverse();
|
|
53
|
+
}
|
|
54
|
+
queue.push(v);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* One-pass 3-color DFS. Declared back-edges are recorded first-class with the cycle they
|
|
62
|
+
* close (`to → … → from` over the forward DAG); accidental cycles are discovered by the DFS
|
|
63
|
+
* and named from the grey stack.
|
|
64
|
+
*/
|
|
65
|
+
export function analyzeGraph(input: GraphInput): CycleReport {
|
|
66
|
+
const { nodes, edges, declaredBackEdges } = input;
|
|
67
|
+
|
|
68
|
+
// Node universe: declared nodes ∪ every edge endpoint, in stable first-seen order.
|
|
69
|
+
const order: NodeId[] = [];
|
|
70
|
+
const known = new Set<NodeId>();
|
|
71
|
+
const see = (n: NodeId): void => {
|
|
72
|
+
if (!known.has(n)) {
|
|
73
|
+
known.add(n);
|
|
74
|
+
order.push(n);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
for (const n of nodes) see(n);
|
|
78
|
+
for (const { from, to } of edges) {
|
|
79
|
+
see(from);
|
|
80
|
+
see(to);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const declaredKeys = new Set(declaredBackEdges.map((e) => edgeKey(e.from, e.to)));
|
|
84
|
+
const forwardEdges = edges.filter((e) => !declaredKeys.has(edgeKey(e.from, e.to)));
|
|
85
|
+
const adj = adjacency(order, forwardEdges);
|
|
86
|
+
|
|
87
|
+
const color = new Map<NodeId, Color>(order.map((n) => [n, "white"]));
|
|
88
|
+
const traversal: NodeId[] = [];
|
|
89
|
+
const postorder: NodeId[] = [];
|
|
90
|
+
const accidental: BackEdge[] = [];
|
|
91
|
+
const stack: NodeId[] = [];
|
|
92
|
+
|
|
93
|
+
const visit = (u: NodeId): void => {
|
|
94
|
+
color.set(u, "grey");
|
|
95
|
+
stack.push(u);
|
|
96
|
+
traversal.push(u);
|
|
97
|
+
for (const v of adj.get(u) ?? []) {
|
|
98
|
+
const c = color.get(v);
|
|
99
|
+
if (c === "white") {
|
|
100
|
+
visit(v);
|
|
101
|
+
} else if (c === "grey") {
|
|
102
|
+
// v is an ancestor on the current path → u→v closes an accidental cycle.
|
|
103
|
+
const cycle = [...stack.slice(stack.indexOf(v)), v];
|
|
104
|
+
accidental.push({ from: u, to: v, declared: false, cycle });
|
|
105
|
+
}
|
|
106
|
+
// black ⇒ forward/cross edge within the DAG; not a cycle.
|
|
107
|
+
}
|
|
108
|
+
stack.pop();
|
|
109
|
+
color.set(u, "black");
|
|
110
|
+
postorder.push(u);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
for (const n of order) {
|
|
114
|
+
if (color.get(n) === "white") visit(n);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Declared back-edges: trusted, recorded with the forward cycle they close.
|
|
118
|
+
const declared: BackEdge[] = declaredBackEdges.map(({ from, to }) => {
|
|
119
|
+
const path = forwardPath(adj, to, from);
|
|
120
|
+
return { from, to, declared: true, cycle: path ? [...path] : [to, from] };
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
traversal,
|
|
125
|
+
topoOrder: [...postorder].reverse(),
|
|
126
|
+
backEdges: [...declared, ...accidental]
|
|
127
|
+
};
|
|
128
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Hand-built cycle-aware graph (design D6): a 3-color (white/grey/black) DFS giving
|
|
2
|
+
// cycle detection WITH the offending back-edge set, topological order, and traversal
|
|
3
|
+
// in one pass. No graph dependency. Implemented in L03 (tasks 4.3-4.5).
|
|
4
|
+
//
|
|
5
|
+
// Internal machinery: the loop() builder hides this, so it is intentionally NOT part
|
|
6
|
+
// of the public surface re-exported by ../index.ts.
|
|
7
|
+
|
|
8
|
+
export type NodeId = string;
|
|
9
|
+
|
|
10
|
+
export interface Edge {
|
|
11
|
+
readonly from: NodeId;
|
|
12
|
+
readonly to: NodeId;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A back-edge closes a cycle. `declared` distinguishes intentional loop back-edges —
|
|
17
|
+
* first-class domain data the builder hands us (design D6) — from accidental cycles the
|
|
18
|
+
* DFS discovers in the forward subgraph. `cycle` is the node path naming the loop, used
|
|
19
|
+
* to name the offending cycle in build/lint errors. For a declared back-edge it runs
|
|
20
|
+
* `to → … → from` (the forward path the back-edge closes); for an accidental one it is
|
|
21
|
+
* the grey DFS-stack slice `to → … → from`.
|
|
22
|
+
*/
|
|
23
|
+
export interface BackEdge extends Edge {
|
|
24
|
+
readonly declared: boolean;
|
|
25
|
+
readonly cycle: readonly NodeId[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Input to {@link analyzeGraph}: the node set, all edges, and which edges are declared loop back-edges. */
|
|
29
|
+
export interface GraphInput {
|
|
30
|
+
readonly nodes: readonly NodeId[];
|
|
31
|
+
readonly edges: readonly Edge[];
|
|
32
|
+
/** Edges the builder declares as intentional loop back-edges; trusted, not rediscovered. */
|
|
33
|
+
readonly declaredBackEdges: readonly Edge[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* One-pass 3-color DFS output. `traversal` is the preorder visit sequence; `topoOrder` is a
|
|
38
|
+
* valid topological order of the forward DAG (reverse postorder, back-edges removed);
|
|
39
|
+
* `backEdges` holds both declared loop back-edges and discovered accidental cycles.
|
|
40
|
+
*/
|
|
41
|
+
export interface CycleReport {
|
|
42
|
+
readonly traversal: readonly NodeId[];
|
|
43
|
+
readonly topoOrder: readonly NodeId[];
|
|
44
|
+
readonly backEdges: readonly BackEdge[];
|
|
45
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Public loop surface — Effect-FREE by mandate (design D2). The Effect-powered engine
|
|
2
|
+
// under ./engine is intentionally NOT re-exported here; the facade gate enforces that no
|
|
3
|
+
// Effect type reaches this surface or the root runtime export. ./graph stays internal too.
|
|
4
|
+
export * from "./builder/index.ts";
|
|
5
|
+
export type { LoopContextPressure, LoopExecutionContextOptions } from "./execution.ts";
|
|
6
|
+
export * from "./state/index.ts";
|
|
7
|
+
export * from "./io/index.ts";
|
|
8
|
+
export * from "./context/index.ts";
|
|
9
|
+
// L11 distribution: defineLoop + the serve supervisor. Effect-free; the CLI (run/serve/loops)
|
|
10
|
+
// and authored loop modules both consume this surface.
|
|
11
|
+
export * from "./serve.ts";
|