@sentropic/h2a 0.81.0 → 0.82.0
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 +5 -0
- package/dist/bin-routing.d.ts +13 -0
- package/dist/bin-routing.d.ts.map +1 -0
- package/dist/bin-routing.js +46 -0
- package/dist/bin-routing.js.map +1 -0
- package/dist/bin.js +40 -11
- package/dist/bin.js.map +1 -1
- package/dist/cli-contract.d.ts.map +1 -1
- package/dist/cli-contract.js +22 -6
- package/dist/cli-contract.js.map +1 -1
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +197 -11
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +3 -1
- package/dist/mcp.js.map +1 -1
- package/dist/runtime/canevas/adapter.d.ts +11 -0
- package/dist/runtime/canevas/adapter.d.ts.map +1 -0
- package/dist/runtime/canevas/adapter.js +22 -0
- package/dist/runtime/canevas/adapter.js.map +1 -0
- package/dist/runtime/canevas/aggregate.d.ts +56 -0
- package/dist/runtime/canevas/aggregate.d.ts.map +1 -0
- package/dist/runtime/canevas/aggregate.js +84 -0
- package/dist/runtime/canevas/aggregate.js.map +1 -0
- package/dist/runtime/canevas/answer.d.ts +21 -0
- package/dist/runtime/canevas/answer.d.ts.map +1 -0
- package/dist/runtime/canevas/answer.js +62 -0
- package/dist/runtime/canevas/answer.js.map +1 -0
- package/dist/runtime/canevas/app.d.ts +19 -0
- package/dist/runtime/canevas/app.d.ts.map +1 -0
- package/dist/runtime/canevas/app.js +49 -0
- package/dist/runtime/canevas/app.js.map +1 -0
- package/dist/runtime/canevas/gather.d.ts +3 -0
- package/dist/runtime/canevas/gather.d.ts.map +1 -0
- package/dist/runtime/canevas/gather.js +39 -0
- package/dist/runtime/canevas/gather.js.map +1 -0
- package/dist/runtime/canevas/reply.d.ts +27 -0
- package/dist/runtime/canevas/reply.d.ts.map +1 -0
- package/dist/runtime/canevas/reply.js +31 -0
- package/dist/runtime/canevas/reply.js.map +1 -0
- package/dist/runtime/canevas/serve.d.ts +11 -0
- package/dist/runtime/canevas/serve.d.ts.map +1 -0
- package/dist/runtime/canevas/serve.js +42 -0
- package/dist/runtime/canevas/serve.js.map +1 -0
- package/dist/runtime/canevas/ui.d.ts +2 -0
- package/dist/runtime/canevas/ui.d.ts.map +1 -0
- package/dist/runtime/canevas/ui.js +124 -0
- package/dist/runtime/canevas/ui.js.map +1 -0
- package/dist/runtime/loop/engine/adapters.d.ts +91 -0
- package/dist/runtime/loop/engine/adapters.d.ts.map +1 -0
- package/dist/runtime/loop/engine/adapters.js +292 -0
- package/dist/runtime/loop/engine/adapters.js.map +1 -0
- package/dist/runtime/loop/engine/decision.d.ts +71 -0
- package/dist/runtime/loop/engine/decision.d.ts.map +1 -0
- package/dist/runtime/loop/engine/decision.js +141 -0
- package/dist/runtime/loop/engine/decision.js.map +1 -0
- package/dist/runtime/loop/engine/execute.d.ts +33 -0
- package/dist/runtime/loop/engine/execute.d.ts.map +1 -0
- package/dist/runtime/loop/engine/execute.js +69 -0
- package/dist/runtime/loop/engine/execute.js.map +1 -0
- package/dist/runtime/loop/engine/tick.d.ts +27 -0
- package/dist/runtime/loop/engine/tick.d.ts.map +1 -0
- package/dist/runtime/loop/engine/tick.js +72 -0
- package/dist/runtime/loop/engine/tick.js.map +1 -0
- package/dist/runtime/loop/index.d.ts +14 -0
- package/dist/runtime/loop/index.d.ts.map +1 -1
- package/dist/runtime/loop/index.js +23 -0
- package/dist/runtime/loop/index.js.map +1 -1
- package/dist/runtime/mcp/handlers.d.ts +12 -0
- package/dist/runtime/mcp/handlers.d.ts.map +1 -1
- package/dist/runtime/mcp/handlers.js +42 -0
- package/dist/runtime/mcp/handlers.js.map +1 -1
- package/dist/runtime/mcp/server.d.ts.map +1 -1
- package/dist/runtime/mcp/server.js +5 -1
- package/dist/runtime/mcp/server.js.map +1 -1
- package/dist/runtime/mcp/tools.d.ts.map +1 -1
- package/dist/runtime/mcp/tools.js +22 -0
- package/dist/runtime/mcp/tools.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Objective-loop tick — PURE decision core.
|
|
2
|
+
//
|
|
3
|
+
// GOLDEN RULE: this module has ZERO IO and NEVER imports `@sentropic/h2a-runtime`,
|
|
4
|
+
// node-pty, tmux, k8s or the track CLI. It only sees plain data. The imperative
|
|
5
|
+
// shell (`tick.ts`) gathers inputs via adapters and EXECUTES the plan — the
|
|
6
|
+
// human-typing guard is re-checked there, at the last moment before any tmux
|
|
7
|
+
// injection, NOT here (the core's view can be stale).
|
|
8
|
+
//
|
|
9
|
+
// Double-consensus (opus-4-8 + codex xhigh, 2026-07-02): option (c) —
|
|
10
|
+
// functional core / imperative shell. `remote-facade.test.js` scans this file to
|
|
11
|
+
// forbid any runtime import (see RISK #1).
|
|
12
|
+
const TARGET_ROLES = new Set(["primary", "target"]);
|
|
13
|
+
/** Stable join key for a declared loop track-ref. Adapters MUST use the same. */
|
|
14
|
+
export function loopRefLocator(ref) {
|
|
15
|
+
return `${ref.system}:${ref.repoKey}:${ref.workspace}:${ref.aggregateKind}:${ref.aggregateId}`;
|
|
16
|
+
}
|
|
17
|
+
function action(a) {
|
|
18
|
+
return a;
|
|
19
|
+
}
|
|
20
|
+
/** True if the loop agent is present & not dead in the runtime projection. */
|
|
21
|
+
function findProjected(loopAgent, projected) {
|
|
22
|
+
return projected.find((p) => (loopAgent.h2aInstance !== undefined && p.h2aInstance === loopAgent.h2aInstance) ||
|
|
23
|
+
(loopAgent.remoteJobId !== undefined && p.jobId === loopAgent.remoteJobId) ||
|
|
24
|
+
(loopAgent.remoteAgentId !== undefined && p.id === loopAgent.remoteAgentId));
|
|
25
|
+
}
|
|
26
|
+
const DEAD_STATES = new Set(["dead", "failed", "done"]);
|
|
27
|
+
const IDLE_STATES = new Set(["idle", "detached"]);
|
|
28
|
+
/**
|
|
29
|
+
* Pure objective-loop tick decision. Deterministic; no IO. Implements the spec
|
|
30
|
+
* (2026-06-26 §Relaunch + §C completion) at MVP scope: degraded short-circuit,
|
|
31
|
+
* multi-ref completion rollup, and conservative launch/wake/route intents.
|
|
32
|
+
*
|
|
33
|
+
* The shell never auto-closes unless `close===true` (policy.closeWhenRefsSatisfied).
|
|
34
|
+
*/
|
|
35
|
+
export function planLoopTick(input) {
|
|
36
|
+
const { loop, agents, refs, inbox } = input;
|
|
37
|
+
const reasons = [];
|
|
38
|
+
const actions = [];
|
|
39
|
+
// 1) DEGRADED — runtime or track source unreachable. Never invent state, never
|
|
40
|
+
// inject, never close. Only surface pending human decisions (no injection).
|
|
41
|
+
if (agents.degraded || refs.degraded) {
|
|
42
|
+
if (agents.degraded)
|
|
43
|
+
reasons.push("agents source unreachable (runtime absent/degraded)");
|
|
44
|
+
if (refs.degraded)
|
|
45
|
+
reasons.push("track refs source unreachable");
|
|
46
|
+
for (const d of inbox.pendingDecisions) {
|
|
47
|
+
actions.push(action({
|
|
48
|
+
type: "route-decision",
|
|
49
|
+
decisionId: d.id,
|
|
50
|
+
reason: "pending decision surfaced while degraded",
|
|
51
|
+
...(d.forAgent !== undefined ? { agentId: d.forAgent } : {}),
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
return { loopId: loop.id, degraded: true, outcome: "degraded", close: false, actions, reasons };
|
|
55
|
+
}
|
|
56
|
+
// 2) REF ROLLUP — join declared loop.refs with the rollup statuses.
|
|
57
|
+
const statusByLocator = new Map(refs.refs.map((r) => [r.locator, r.status]));
|
|
58
|
+
const statusOf = (ref) => statusByLocator.get(loopRefLocator(ref)) ?? "unknown";
|
|
59
|
+
const targetRefs = loop.refs.filter((r) => TARGET_ROLES.has(r.role));
|
|
60
|
+
const blockerRefs = loop.refs.filter((r) => r.role === "blocker");
|
|
61
|
+
const decisionGateRefs = loop.refs.filter((r) => r.role === "decision-gate");
|
|
62
|
+
const targetStatuses = targetRefs.map(statusOf);
|
|
63
|
+
const anyTargetRejected = targetStatuses.includes("rejected");
|
|
64
|
+
const anyTargetUnresolved = targetStatuses.some((s) => s === "pending" || s === "unknown" || s === "stale" || s === "blocked");
|
|
65
|
+
const allTargetsSatisfied = targetRefs.length > 0 && targetStatuses.every((s) => s === "accepted" || s === "done");
|
|
66
|
+
const openBlockers = blockerRefs.filter((r) => {
|
|
67
|
+
const s = statusOf(r);
|
|
68
|
+
return s !== "done" && s !== "accepted";
|
|
69
|
+
});
|
|
70
|
+
const openDecisionGates = decisionGateRefs.filter((r) => {
|
|
71
|
+
const s = statusOf(r);
|
|
72
|
+
return s !== "accepted" && s !== "done";
|
|
73
|
+
});
|
|
74
|
+
const hasOpenDecision = inbox.pendingDecisions.length > 0 || openDecisionGates.length > 0;
|
|
75
|
+
const workPending = !allTargetsSatisfied;
|
|
76
|
+
// 3) OUTCOME — deterministic precedence (spec §C).
|
|
77
|
+
let outcome;
|
|
78
|
+
let close = false;
|
|
79
|
+
if (anyTargetRejected) {
|
|
80
|
+
outcome = "failed";
|
|
81
|
+
reasons.push("a primary/target ref is rejected/failed");
|
|
82
|
+
}
|
|
83
|
+
else if (openBlockers.length > 0) {
|
|
84
|
+
outcome = "stalled";
|
|
85
|
+
reasons.push(`${openBlockers.length} open blocker ref(s)`);
|
|
86
|
+
}
|
|
87
|
+
else if (hasOpenDecision) {
|
|
88
|
+
outcome = "waiting-human";
|
|
89
|
+
reasons.push("open decision gate(s) / pending decision(s)");
|
|
90
|
+
}
|
|
91
|
+
else if (allTargetsSatisfied) {
|
|
92
|
+
outcome = "eligible-for-close";
|
|
93
|
+
reasons.push("all primary/target refs accepted/done");
|
|
94
|
+
close = loop.policy.closeWhenRefsSatisfied === true;
|
|
95
|
+
if (close)
|
|
96
|
+
actions.push(action({ type: "close", reason: "refs satisfied and policy.closeWhenRefsSatisfied" }));
|
|
97
|
+
}
|
|
98
|
+
else if (anyTargetUnresolved) {
|
|
99
|
+
outcome = "waiting-agent";
|
|
100
|
+
reasons.push("primary/target refs still pending");
|
|
101
|
+
}
|
|
102
|
+
else if (targetRefs.length === 0) {
|
|
103
|
+
outcome = "running";
|
|
104
|
+
reasons.push("no primary/target refs declared");
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
outcome = "running";
|
|
108
|
+
}
|
|
109
|
+
// 4) DECISIONS — surface pending human decisions (route only; no injection here).
|
|
110
|
+
if (outcome !== "failed") {
|
|
111
|
+
for (const d of inbox.pendingDecisions) {
|
|
112
|
+
actions.push(action({
|
|
113
|
+
type: "route-decision",
|
|
114
|
+
decisionId: d.id,
|
|
115
|
+
reason: "pending decision",
|
|
116
|
+
...(d.forAgent !== undefined ? { agentId: d.forAgent } : {}),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// 5) AGENTS — conservative launch/wake INTENTS, only when work is pending and
|
|
121
|
+
// the objective is not failed/closing. The shell decides feasibility +
|
|
122
|
+
// re-checks the human-typing guard before any real injection.
|
|
123
|
+
if (workPending && outcome !== "failed" && !close) {
|
|
124
|
+
for (const a of loop.agents) {
|
|
125
|
+
if (a.status === "done" || a.status === "cancelled" || a.status === "failed")
|
|
126
|
+
continue;
|
|
127
|
+
const projected = findProjected(a, agents.agents);
|
|
128
|
+
if (!projected || DEAD_STATES.has(projected.state)) {
|
|
129
|
+
actions.push(action({ type: "request-launch", agentId: a.id, reason: "enrolled agent missing/dead while work pending" }));
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (IDLE_STATES.has(projected.state) || a.status === "idle") {
|
|
133
|
+
actions.push(action({ type: "wake", agentId: a.id, reason: "agent idle while work pending" }));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (actions.length === 0)
|
|
138
|
+
actions.push(action({ type: "noop", reason: "nothing to do this tick" }));
|
|
139
|
+
return { loopId: loop.id, degraded: false, outcome, close, actions, reasons };
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../../../src/runtime/loop/engine/decision.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,mFAAmF;AACnF,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,sDAAsD;AACtD,EAAE;AACF,sEAAsE;AACtE,iFAAiF;AACjF,2CAA2C;AAiG3C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEpD,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AACjG,CAAC;AAED,SAAS,MAAM,CAAC,CAAa;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,SAAS,aAAa,CACpB,SAA6C,EAC7C,SAAoC;IAEpC,OAAO,SAAS,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,SAAS,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,CAAC;QAChF,CAAC,SAAS,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,WAAW,CAAC;QAC1E,CAAC,SAAS,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,aAAa,CAAC,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,+EAA+E;IAC/E,+EAA+E;IAC/E,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACzF,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CACV,MAAM,CAAC;gBACL,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,CAAC,CAAC,EAAE;gBAChB,MAAM,EAAE,0CAA0C;gBAClD,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAClG,CAAC;IAED,oEAAoE;IACpE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAU,CAAC,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,CAAC,GAAoB,EAAa,EAAE,CACnD,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;IAExD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IAE7E,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,SAAS,CACvE,CAAC;IACF,MAAM,mBAAmB,GACvB,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;IAEzF,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,MAAM,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1F,MAAM,WAAW,GAAG,CAAC,mBAAmB,CAAC;IAEzC,mDAAmD;IACnD,IAAI,OAAoB,CAAC;IACzB,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,GAAG,QAAQ,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,GAAG,SAAS,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,sBAAsB,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,OAAO,GAAG,eAAe,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,mBAAmB,EAAE,CAAC;QAC/B,OAAO,GAAG,oBAAoB,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACtD,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,KAAK,IAAI,CAAC;QACpD,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC,CAAC,CAAC;IACjH,CAAC;SAAM,IAAI,mBAAmB,EAAE,CAAC;QAC/B,OAAO,GAAG,eAAe,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,GAAG,SAAS,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;IAED,kFAAkF;IAClF,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CACV,MAAM,CAAC;gBACL,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,CAAC,CAAC,EAAE;gBAChB,MAAM,EAAE,kBAAkB;gBAC1B,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,iEAAiE;IACjE,IAAI,WAAW,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YACvF,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,IAAI,CACV,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC,CAC5G,CAAC;gBACF,SAAS;YACX,CAAC;YACD,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;IAEpG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TickAction, TickPlan } from "./decision.js";
|
|
2
|
+
export type ActionOutcome = "done" | "deferred" | "skipped" | "failed";
|
|
3
|
+
export interface ActionContext {
|
|
4
|
+
readonly root: string;
|
|
5
|
+
readonly loopId: string;
|
|
6
|
+
readonly now: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ActionSink {
|
|
9
|
+
close(action: TickAction, ctx: ActionContext): Promise<ActionOutcome>;
|
|
10
|
+
requestLaunch(action: TickAction, ctx: ActionContext): Promise<ActionOutcome>;
|
|
11
|
+
wake(action: TickAction, ctx: ActionContext): Promise<ActionOutcome>;
|
|
12
|
+
routeDecision(action: TickAction, ctx: ActionContext): Promise<ActionOutcome>;
|
|
13
|
+
}
|
|
14
|
+
export interface ActionResult {
|
|
15
|
+
readonly type: TickAction["type"];
|
|
16
|
+
readonly agentId?: string;
|
|
17
|
+
readonly outcome: ActionOutcome;
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ExecReport {
|
|
21
|
+
readonly loopId: string;
|
|
22
|
+
readonly executed: boolean;
|
|
23
|
+
readonly results: readonly ActionResult[];
|
|
24
|
+
readonly counts: Record<ActionOutcome, number>;
|
|
25
|
+
}
|
|
26
|
+
/** Stable idempotency key for an action (used by sinks + event journal). */
|
|
27
|
+
export declare function actionKey(a: TickAction, loopId: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Execute a plan through the sink. A `degraded` plan runs NOTHING (safety). Each
|
|
30
|
+
* executed action appends a `loop.action.*` event. Returns a typed report.
|
|
31
|
+
*/
|
|
32
|
+
export declare function executePlan(root: string, loopId: string, plan: TickPlan, sink: ActionSink, now: number): Promise<ExecReport>;
|
|
33
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../../src/runtime/loop/engine/execute.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/D;AASD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,CAyCrB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Objective-loop tick — ACTION EXECUTOR (imperative shell).
|
|
2
|
+
//
|
|
3
|
+
// Thin orchestrator: takes a decided `TickPlan` + an injected `ActionSink`, runs
|
|
4
|
+
// each action through the sink, and records a per-action event. It performs NO
|
|
5
|
+
// tmux/store IO itself (only `appendLoopEvent`) — all effects live behind the
|
|
6
|
+
// sink (real impl in `adapters.ts::buildActionSink`, fakes in tests). Must NOT
|
|
7
|
+
// import `@sentropic/h2a-runtime` (only `adapters.ts` may); the golden-rule scan
|
|
8
|
+
// enforces it.
|
|
9
|
+
//
|
|
10
|
+
// Double-consensus (opus-4-8 + codex xhigh, 2026-07-02): tranche 1 executes ONLY
|
|
11
|
+
// `close`; wake/request-launch/route-decision are wired to the sink but return
|
|
12
|
+
// `skipped` ("not-enabled") until their guarded slices land. A `degraded` plan
|
|
13
|
+
// executes NOTHING.
|
|
14
|
+
import { appendLoopEvent } from "../index.js";
|
|
15
|
+
/** Stable idempotency key for an action (used by sinks + event journal). */
|
|
16
|
+
export function actionKey(a, loopId) {
|
|
17
|
+
return `${a.type}:${a.agentId ?? a.decisionId ?? a.refLocator ?? loopId}`;
|
|
18
|
+
}
|
|
19
|
+
const EVENT_FOR = {
|
|
20
|
+
done: "loop.action.applied",
|
|
21
|
+
deferred: "loop.action.deferred",
|
|
22
|
+
failed: "loop.action.failed",
|
|
23
|
+
skipped: "loop.action.skipped"
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Execute a plan through the sink. A `degraded` plan runs NOTHING (safety). Each
|
|
27
|
+
* executed action appends a `loop.action.*` event. Returns a typed report.
|
|
28
|
+
*/
|
|
29
|
+
export async function executePlan(root, loopId, plan, sink, now) {
|
|
30
|
+
const ctx = { root, loopId, now };
|
|
31
|
+
const results = [];
|
|
32
|
+
const counts = { done: 0, deferred: 0, skipped: 0, failed: 0 };
|
|
33
|
+
const at = new Date(now).toISOString();
|
|
34
|
+
const actions = plan.degraded ? [] : plan.actions;
|
|
35
|
+
for (const a of actions) {
|
|
36
|
+
let outcome;
|
|
37
|
+
switch (a.type) {
|
|
38
|
+
case "close":
|
|
39
|
+
outcome = await sink.close(a, ctx);
|
|
40
|
+
break;
|
|
41
|
+
case "request-launch":
|
|
42
|
+
outcome = await sink.requestLaunch(a, ctx);
|
|
43
|
+
break;
|
|
44
|
+
case "wake":
|
|
45
|
+
outcome = await sink.wake(a, ctx);
|
|
46
|
+
break;
|
|
47
|
+
case "route-decision":
|
|
48
|
+
outcome = await sink.routeDecision(a, ctx);
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
continue; // noop
|
|
52
|
+
}
|
|
53
|
+
counts[outcome] += 1;
|
|
54
|
+
results.push({
|
|
55
|
+
type: a.type,
|
|
56
|
+
...(a.agentId !== undefined ? { agentId: a.agentId } : {}),
|
|
57
|
+
outcome,
|
|
58
|
+
reason: a.reason
|
|
59
|
+
});
|
|
60
|
+
appendLoopEvent(root, {
|
|
61
|
+
type: EVENT_FOR[outcome],
|
|
62
|
+
loopId,
|
|
63
|
+
at,
|
|
64
|
+
payload: { action: a.type, key: actionKey(a, loopId), reason: a.reason }
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return { loopId, executed: true, results, counts };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../../src/runtime/loop/engine/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type TickPlan } from "./decision.js";
|
|
2
|
+
import { type ExecReport } from "./execute.js";
|
|
3
|
+
export interface RunTickResult {
|
|
4
|
+
readonly plan: TickPlan;
|
|
5
|
+
readonly exec?: ExecReport;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* One tick: gather → decide → record observation → return the plan. DRY-RUN by
|
|
9
|
+
* default (executes nothing). With `execute:true`, runs the plan through the
|
|
10
|
+
* action sink (tranche 1: only `close` acts; a `degraded` plan executes nothing).
|
|
11
|
+
*/
|
|
12
|
+
export declare function runTick(root: string, loopId: string, opts?: {
|
|
13
|
+
now?: number;
|
|
14
|
+
execute?: boolean;
|
|
15
|
+
}): Promise<RunTickResult>;
|
|
16
|
+
export interface WatchOptions {
|
|
17
|
+
readonly intervalMs?: number;
|
|
18
|
+
readonly max?: number;
|
|
19
|
+
readonly signal?: AbortSignal;
|
|
20
|
+
readonly stdout: {
|
|
21
|
+
write(s: string): void;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Periodic dry-run watch: tick, emit the plan (JSONL), repeat until a terminal
|
|
25
|
+
* outcome, the `--max` cap, or an abort signal. Executes nothing. */
|
|
26
|
+
export declare function runLoopWatch(root: string, loopId: string, opts: WatchOptions): Promise<number>;
|
|
27
|
+
//# sourceMappingURL=tick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../../src/runtime/loop/engine/tick.ts"],"names":[],"mappings":"AASA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;CAC5B;AAID;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,OAAO,CAAC,aAAa,CAAC,CAuBxB;AAaD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAC7C;AAED;sEACsE;AACtE,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,MAAM,CAAC,CAajB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Objective-loop tick — IMPERATIVE SHELL.
|
|
2
|
+
//
|
|
3
|
+
// Gathers inputs via adapters, calls the PURE core `planLoopTick`, and (SLICE-1)
|
|
4
|
+
// only OBSERVES: it records a `loop.tick` event and returns the plan. It executes
|
|
5
|
+
// NO injection/relaunch/close yet — those land in the next slice behind the
|
|
6
|
+
// human-typing guard. This file must NOT import `@sentropic/h2a-runtime`
|
|
7
|
+
// (only `adapters.ts` may); `remote-facade.test.js` enforces it.
|
|
8
|
+
import { appendLoopEvent, readObjectiveLoop } from "../index.js";
|
|
9
|
+
import { planLoopTick } from "./decision.js";
|
|
10
|
+
import { buildActionSink, readAgents, readInbox, readRefsRollup } from "./adapters.js";
|
|
11
|
+
import { executePlan } from "./execute.js";
|
|
12
|
+
const TERMINAL_OUTCOMES = new Set(["failed", "eligible-for-close"]);
|
|
13
|
+
/**
|
|
14
|
+
* One tick: gather → decide → record observation → return the plan. DRY-RUN by
|
|
15
|
+
* default (executes nothing). With `execute:true`, runs the plan through the
|
|
16
|
+
* action sink (tranche 1: only `close` acts; a `degraded` plan executes nothing).
|
|
17
|
+
*/
|
|
18
|
+
export async function runTick(root, loopId, opts = {}) {
|
|
19
|
+
const now = opts.now ?? Date.now();
|
|
20
|
+
const loop = readObjectiveLoop(root, loopId); // throws if missing → shell maps to exit code
|
|
21
|
+
const agents = await readAgents();
|
|
22
|
+
const refs = readRefsRollup(loop);
|
|
23
|
+
const inbox = readInbox(loop, root);
|
|
24
|
+
const plan = planLoopTick({ loop, agents, refs, inbox, now });
|
|
25
|
+
appendLoopEvent(root, {
|
|
26
|
+
type: "loop.tick",
|
|
27
|
+
loopId,
|
|
28
|
+
at: new Date(now).toISOString(),
|
|
29
|
+
payload: {
|
|
30
|
+
outcome: plan.outcome,
|
|
31
|
+
degraded: plan.degraded,
|
|
32
|
+
actions: plan.actions.map((a) => a.type),
|
|
33
|
+
dryRun: !opts.execute,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
if (!opts.execute)
|
|
37
|
+
return { plan };
|
|
38
|
+
const exec = await executePlan(root, loopId, plan, buildActionSink(), now);
|
|
39
|
+
return { plan, exec };
|
|
40
|
+
}
|
|
41
|
+
function delay(ms, signal) {
|
|
42
|
+
return new Promise((res) => {
|
|
43
|
+
if (signal?.aborted)
|
|
44
|
+
return res();
|
|
45
|
+
const t = setTimeout(res, ms);
|
|
46
|
+
signal?.addEventListener("abort", () => {
|
|
47
|
+
clearTimeout(t);
|
|
48
|
+
res();
|
|
49
|
+
}, { once: true });
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Periodic dry-run watch: tick, emit the plan (JSONL), repeat until a terminal
|
|
53
|
+
* outcome, the `--max` cap, or an abort signal. Executes nothing. */
|
|
54
|
+
export async function runLoopWatch(root, loopId, opts) {
|
|
55
|
+
const interval = opts.intervalMs && opts.intervalMs > 0 ? opts.intervalMs : 60_000;
|
|
56
|
+
let n = 0;
|
|
57
|
+
for (;;) {
|
|
58
|
+
const { plan } = await runTick(root, loopId);
|
|
59
|
+
opts.stdout.write(`${JSON.stringify(plan)}\n`);
|
|
60
|
+
n += 1;
|
|
61
|
+
if (TERMINAL_OUTCOMES.has(plan.outcome))
|
|
62
|
+
return 0;
|
|
63
|
+
if (opts.max !== undefined && n >= opts.max)
|
|
64
|
+
return 0;
|
|
65
|
+
if (opts.signal?.aborted)
|
|
66
|
+
return 0;
|
|
67
|
+
await delay(interval, opts.signal);
|
|
68
|
+
if (opts.signal?.aborted)
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=tick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tick.js","sourceRoot":"","sources":["../../../../src/runtime/loop/engine/tick.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,4 +70,18 @@ export declare function createObjectiveLoop(root: string, input: CreateObjective
|
|
|
70
70
|
export declare function readObjectiveLoop(root: string, loopId: string): H2AObjectiveLoop;
|
|
71
71
|
export declare function listObjectiveLoops(root: string): H2AObjectiveLoop[];
|
|
72
72
|
export declare function listLoopEvents(root: string, loopId: string): H2ALoopEvent[];
|
|
73
|
+
/**
|
|
74
|
+
* Transition a loop to a new status. IDEMPOTENT: if the loop is already at
|
|
75
|
+
* `status`, nothing is written and `changed:false` is returned. On a real
|
|
76
|
+
* change, rewrites `state.json` (status + updatedAt) and appends `loop.closed`
|
|
77
|
+
* (for "done") or `loop.status-changed`. This is the ONLY store write the
|
|
78
|
+
* objective-loop tick executor performs for the `close` action — no injection.
|
|
79
|
+
*/
|
|
80
|
+
export declare function updateObjectiveLoopStatus(root: string, loopId: string, status: H2ALoopStatus, opts?: {
|
|
81
|
+
now?: number;
|
|
82
|
+
reason?: string;
|
|
83
|
+
}): {
|
|
84
|
+
changed: boolean;
|
|
85
|
+
loop: H2AObjectiveLoop;
|
|
86
|
+
};
|
|
73
87
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/loop/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/loop/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,4 +104,27 @@ export function listLoopEvents(root, loopId) {
|
|
|
104
104
|
.filter((line) => line.length > 0)
|
|
105
105
|
.map((line) => JSON.parse(line));
|
|
106
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Transition a loop to a new status. IDEMPOTENT: if the loop is already at
|
|
109
|
+
* `status`, nothing is written and `changed:false` is returned. On a real
|
|
110
|
+
* change, rewrites `state.json` (status + updatedAt) and appends `loop.closed`
|
|
111
|
+
* (for "done") or `loop.status-changed`. This is the ONLY store write the
|
|
112
|
+
* objective-loop tick executor performs for the `close` action — no injection.
|
|
113
|
+
*/
|
|
114
|
+
export function updateObjectiveLoopStatus(root, loopId, status, opts = {}) {
|
|
115
|
+
const loop = readObjectiveLoop(root, loopId);
|
|
116
|
+
if (loop.status === status)
|
|
117
|
+
return { changed: false, loop };
|
|
118
|
+
const now = opts.now ?? Date.now();
|
|
119
|
+
const at = new Date(now).toISOString();
|
|
120
|
+
const next = { ...loop, status, updatedAt: at };
|
|
121
|
+
writeFileSync(stateFile(root, loopId), `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
122
|
+
appendLoopEvent(root, {
|
|
123
|
+
type: status === "done" ? "loop.closed" : "loop.status-changed",
|
|
124
|
+
loopId,
|
|
125
|
+
at,
|
|
126
|
+
payload: { status, ...(opts.reason !== undefined ? { reason: opts.reason } : {}) }
|
|
127
|
+
});
|
|
128
|
+
return { changed: true, loop: next };
|
|
129
|
+
}
|
|
107
130
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/loop/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/loop/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -192,5 +192,17 @@ export declare function handleConductorLaunch(root: string, args: {
|
|
|
192
192
|
instance?: string;
|
|
193
193
|
} | undefined): McpToolResult | McpErrorResult;
|
|
194
194
|
export declare function notImplemented(toolName: string): McpErrorResult;
|
|
195
|
+
/**
|
|
196
|
+
* h2a_loop_list — read-only projection of the objective loops in the local store.
|
|
197
|
+
*/
|
|
198
|
+
export declare function handleLoopList(root: string): McpToolResult;
|
|
199
|
+
/**
|
|
200
|
+
* h2a_loop_status — one loop's full state + its LAST recorded tick observation
|
|
201
|
+
* (from the journal) + recent events. Read-only; a fresh live plan needs the
|
|
202
|
+
* async `h2a loop tick` CLI (agents/refs/inbox gathering).
|
|
203
|
+
*/
|
|
204
|
+
export declare function handleLoopStatus(root: string, args: {
|
|
205
|
+
loopId?: string;
|
|
206
|
+
} | undefined): McpToolResult | McpErrorResult;
|
|
195
207
|
export {};
|
|
196
208
|
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/handlers.ts"],"names":[],"mappings":"AAGA,OAAO,EAsBL,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,OAAO,EAGZ,KAAK,mBAAmB,EAExB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAsBxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ import { createLocalStore } from "../local-files/store.js";
|
|
|
21
21
|
import { lastSpawnRequestAt, recordSpawnRequest, spawnAllowed } from "../governance/spawns.js";
|
|
22
22
|
import { gatherNhiSnapshot } from "../nhi.js";
|
|
23
23
|
import { agentVersion } from "../version/agent-version.js";
|
|
24
|
+
import { listLoopEvents, listObjectiveLoops, readObjectiveLoop } from "../loop/index.js";
|
|
24
25
|
const ESCALATION_CHANNELS = new Set(["advise", "decide", "alert"]);
|
|
25
26
|
function safeError(reason) {
|
|
26
27
|
if (reason instanceof Error)
|
|
@@ -1022,4 +1023,45 @@ export function handleConductorLaunch(root, args) {
|
|
|
1022
1023
|
export function notImplemented(toolName) {
|
|
1023
1024
|
return { error: `${toolName}: not implemented in this slice` };
|
|
1024
1025
|
}
|
|
1026
|
+
/**
|
|
1027
|
+
* h2a_loop_list — read-only projection of the objective loops in the local store.
|
|
1028
|
+
*/
|
|
1029
|
+
export function handleLoopList(root) {
|
|
1030
|
+
const loops = listObjectiveLoops(root).map((l) => ({
|
|
1031
|
+
id: l.id,
|
|
1032
|
+
name: l.name,
|
|
1033
|
+
goal: l.goal,
|
|
1034
|
+
status: l.status,
|
|
1035
|
+
refs: l.refs.length,
|
|
1036
|
+
agents: l.agents.length,
|
|
1037
|
+
updatedAt: l.updatedAt
|
|
1038
|
+
}));
|
|
1039
|
+
return { kind: "loop-list", version: 1, loops };
|
|
1040
|
+
}
|
|
1041
|
+
/**
|
|
1042
|
+
* h2a_loop_status — one loop's full state + its LAST recorded tick observation
|
|
1043
|
+
* (from the journal) + recent events. Read-only; a fresh live plan needs the
|
|
1044
|
+
* async `h2a loop tick` CLI (agents/refs/inbox gathering).
|
|
1045
|
+
*/
|
|
1046
|
+
export function handleLoopStatus(root, args) {
|
|
1047
|
+
if (typeof args?.loopId !== "string" || args.loopId.length === 0) {
|
|
1048
|
+
return { error: "h2a_loop_status: loopId is required" };
|
|
1049
|
+
}
|
|
1050
|
+
let loop;
|
|
1051
|
+
try {
|
|
1052
|
+
loop = readObjectiveLoop(root, args.loopId);
|
|
1053
|
+
}
|
|
1054
|
+
catch (err) {
|
|
1055
|
+
return { error: err.message };
|
|
1056
|
+
}
|
|
1057
|
+
const events = listLoopEvents(root, args.loopId);
|
|
1058
|
+
const lastTick = [...events].reverse().find((e) => e.type === "loop.tick");
|
|
1059
|
+
return {
|
|
1060
|
+
kind: "loop-status",
|
|
1061
|
+
version: 1,
|
|
1062
|
+
loop,
|
|
1063
|
+
...(lastTick ? { lastTick: lastTick.payload } : {}),
|
|
1064
|
+
recentEvents: events.slice(-10)
|
|
1065
|
+
};
|
|
1066
|
+
}
|
|
1025
1067
|
//# sourceMappingURL=handlers.js.map
|