@goah/cli 0.2.0 → 0.3.1
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/dist/cli.js +51 -6
- package/dist/cli.js.map +1 -1
- package/dist/execution.d.ts +2 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +2 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +60 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +109 -0
- package/dist/inspect.js.map +1 -0
- package/dist/kernel.d.ts +2 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +2 -0
- package/dist/kernel.js.map +1 -0
- package/dist/metrics.d.ts +2 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +2 -0
- package/dist/metrics.js.map +1 -0
- package/dist/runner-pi.d.ts +2 -0
- package/dist/runner-pi.d.ts.map +1 -0
- package/dist/runner-pi.js +2 -0
- package/dist/runner-pi.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2 -0
- package/dist/session.js.map +1 -0
- package/dist/sqlite.d.ts +2 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +2 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/supervisor.d.ts +2 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +2 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.d.ts.map +1 -0
- package/dist/testkit.js +2 -0
- package/dist/testkit.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts +205 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.js +18 -0
- package/node_modules/goah-ledger-contract/dist/execution.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/index.d.ts +5 -0
- package/node_modules/goah-ledger-contract/dist/index.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/index.js +5 -0
- package/node_modules/goah-ledger-contract/dist/index.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts +33 -0
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/kernel.js +6 -0
- package/node_modules/goah-ledger-contract/dist/kernel.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/metrics.d.ts +40 -0
- package/node_modules/goah-ledger-contract/dist/metrics.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/metrics.js +25 -0
- package/node_modules/goah-ledger-contract/dist/metrics.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/session.d.ts +37 -0
- package/node_modules/goah-ledger-contract/dist/session.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/session.js +53 -0
- package/node_modules/goah-ledger-contract/dist/session.js.map +1 -0
- package/node_modules/goah-ledger-contract/package.json +29 -0
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts +66 -0
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts.map +1 -0
- package/node_modules/goah-ledger-sqlite/dist/index.js +537 -0
- package/node_modules/goah-ledger-sqlite/dist/index.js.map +1 -0
- package/node_modules/goah-ledger-sqlite/package.json +26 -0
- package/node_modules/goah-runner-pi/dist/index.d.ts +53 -0
- package/node_modules/goah-runner-pi/dist/index.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/index.js +229 -0
- package/node_modules/goah-runner-pi/dist/index.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/model-provider.d.ts +13 -0
- package/node_modules/goah-runner-pi/dist/model-provider.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/model-provider.js +75 -0
- package/node_modules/goah-runner-pi/dist/model-provider.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts +14 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.js +278 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.d.ts +2 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.js +48 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.js.map +1 -0
- package/node_modules/goah-runner-pi/package.json +28 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts +23 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/context-view.js +47 -0
- package/node_modules/goah-supervisor/dist/context-view.js.map +1 -0
- package/node_modules/goah-supervisor/dist/index.d.ts +54 -0
- package/node_modules/goah-supervisor/dist/index.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/index.js +436 -0
- package/node_modules/goah-supervisor/dist/index.js.map +1 -0
- package/node_modules/goah-supervisor/dist/roles.d.ts +3 -0
- package/node_modules/goah-supervisor/dist/roles.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/roles.js +8 -0
- package/node_modules/goah-supervisor/dist/roles.js.map +1 -0
- package/node_modules/goah-supervisor/dist/verification.d.ts +82 -0
- package/node_modules/goah-supervisor/dist/verification.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/verification.js +110 -0
- package/node_modules/goah-supervisor/dist/verification.js.map +1 -0
- package/node_modules/goah-supervisor/package.json +26 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts +2 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.js +29 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.js.map +1 -0
- package/node_modules/goah-testkit/dist/index.d.ts +51 -0
- package/node_modules/goah-testkit/dist/index.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/index.js +96 -0
- package/node_modules/goah-testkit/dist/index.js.map +1 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts +2 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.js +29 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.js.map +1 -0
- package/node_modules/goah-testkit/package.json +29 -0
- package/package.json +27 -8
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import type { EventInput, EventRecord, EventStore, JsonValue } from "./kernel.js";
|
|
2
|
+
import type { MetricSample } from "./metrics.js";
|
|
3
|
+
export type WakeStatus = "queued" | "leased" | "running" | "done" | "abnormal" | "merge_blocked";
|
|
4
|
+
export type ActionStatus = "requested" | "approved" | "dispatching" | "confirmed" | "failed" | "unknown";
|
|
5
|
+
export interface GoalSnapshot {
|
|
6
|
+
id: string;
|
|
7
|
+
parentId: string | null;
|
|
8
|
+
objective: string;
|
|
9
|
+
owner: string;
|
|
10
|
+
phase: string;
|
|
11
|
+
revision: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ScheduleSnapshot {
|
|
14
|
+
id: string;
|
|
15
|
+
agent: string;
|
|
16
|
+
nextWakeAt: string;
|
|
17
|
+
reason: string;
|
|
18
|
+
setBy: string;
|
|
19
|
+
}
|
|
20
|
+
export interface WakeSnapshot {
|
|
21
|
+
id: string;
|
|
22
|
+
agent: string;
|
|
23
|
+
triggerRef: string;
|
|
24
|
+
status: WakeStatus;
|
|
25
|
+
leaseUntil: string | null;
|
|
26
|
+
attempt: number;
|
|
27
|
+
startedAt: string | null;
|
|
28
|
+
endedAt: string | null;
|
|
29
|
+
enqueuedSeq: number;
|
|
30
|
+
leaseToken: string | null;
|
|
31
|
+
runnerPid: number | null;
|
|
32
|
+
}
|
|
33
|
+
export type MailLevel = "fyi" | "decision" | "emergency";
|
|
34
|
+
export interface MailSnapshot {
|
|
35
|
+
id: string;
|
|
36
|
+
to: string;
|
|
37
|
+
from: string;
|
|
38
|
+
level: MailLevel;
|
|
39
|
+
body: JsonValue;
|
|
40
|
+
readAt: string | null;
|
|
41
|
+
}
|
|
42
|
+
export interface AuditAdvice {
|
|
43
|
+
by: string;
|
|
44
|
+
at: string;
|
|
45
|
+
body: JsonValue;
|
|
46
|
+
evidence: number[];
|
|
47
|
+
}
|
|
48
|
+
export interface ActionSnapshot {
|
|
49
|
+
id: string;
|
|
50
|
+
agent: string;
|
|
51
|
+
kind: string;
|
|
52
|
+
connector: string;
|
|
53
|
+
payload: JsonValue;
|
|
54
|
+
reason: string;
|
|
55
|
+
evidence: number[];
|
|
56
|
+
gated: boolean;
|
|
57
|
+
status: ActionStatus;
|
|
58
|
+
reconciledAt: string | null;
|
|
59
|
+
externalRef: string | null;
|
|
60
|
+
auditAdvice: AuditAdvice | null;
|
|
61
|
+
adviceAcked: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface Handoff {
|
|
64
|
+
observations: string[];
|
|
65
|
+
results: string[];
|
|
66
|
+
nextSteps: string[];
|
|
67
|
+
blocker?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface MailDraft {
|
|
70
|
+
to: string;
|
|
71
|
+
level: MailLevel;
|
|
72
|
+
body: JsonValue;
|
|
73
|
+
}
|
|
74
|
+
export interface WakeOutput {
|
|
75
|
+
handoff: Handoff;
|
|
76
|
+
mail: MailDraft[];
|
|
77
|
+
nextWakeAt: string | null;
|
|
78
|
+
}
|
|
79
|
+
export interface RunnerTraceEvent {
|
|
80
|
+
type: string;
|
|
81
|
+
data: JsonValue;
|
|
82
|
+
}
|
|
83
|
+
export type AgentRole = "child" | "ceo" | "verifier" | "audit";
|
|
84
|
+
export type AgentCapability = "ledger.search" | "mail.send" | "schedule.set" | "action.submit" | "audit.ack" | "audit.write" | "goal.put";
|
|
85
|
+
export interface AgentProfile {
|
|
86
|
+
agent: string;
|
|
87
|
+
role: AgentRole;
|
|
88
|
+
capabilities?: AgentCapability[];
|
|
89
|
+
systemPrompt?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface RunRequest {
|
|
92
|
+
wake: WakeSnapshot;
|
|
93
|
+
context: JsonValue;
|
|
94
|
+
now(): string;
|
|
95
|
+
emit(event: RunnerTraceEvent): void;
|
|
96
|
+
rpc?(method: AgentCapability, params: JsonValue): Promise<JsonValue>;
|
|
97
|
+
}
|
|
98
|
+
export type RunnerResult = {
|
|
99
|
+
outcome: "handoff";
|
|
100
|
+
output: WakeOutput;
|
|
101
|
+
} | {
|
|
102
|
+
outcome: "abnormal";
|
|
103
|
+
reason: string;
|
|
104
|
+
};
|
|
105
|
+
export interface RunnerHandle {
|
|
106
|
+
pid: number | null;
|
|
107
|
+
begin(): void;
|
|
108
|
+
result: Promise<RunnerResult>;
|
|
109
|
+
terminate(): Promise<void>;
|
|
110
|
+
}
|
|
111
|
+
export interface Runner {
|
|
112
|
+
readonly isolation: "process";
|
|
113
|
+
prepare(request: RunRequest): RunnerHandle;
|
|
114
|
+
terminateProcess(pid: number): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
export interface ConnectorCapability {
|
|
117
|
+
kind: string;
|
|
118
|
+
nativeIdempotency: boolean;
|
|
119
|
+
query: "by_idempotency_key" | "by_external_ref" | "none";
|
|
120
|
+
automaticRetry: boolean;
|
|
121
|
+
risk: "reversible" | "gated" | "irreversible";
|
|
122
|
+
}
|
|
123
|
+
export interface ConnectorManifest {
|
|
124
|
+
contractVersion: "0.3.0";
|
|
125
|
+
connector: string;
|
|
126
|
+
dryRun: boolean;
|
|
127
|
+
capabilities: ConnectorCapability[];
|
|
128
|
+
}
|
|
129
|
+
export interface ConnectorDispatchResult {
|
|
130
|
+
status: "confirmed" | "failed";
|
|
131
|
+
externalRef?: string;
|
|
132
|
+
}
|
|
133
|
+
export interface ConnectorQueryResult {
|
|
134
|
+
status: "confirmed" | "failed" | "pending";
|
|
135
|
+
externalRef?: string;
|
|
136
|
+
}
|
|
137
|
+
export interface ConnectorProcessSpec {
|
|
138
|
+
manifest: ConnectorManifest;
|
|
139
|
+
command: string;
|
|
140
|
+
args: string[];
|
|
141
|
+
env?: Record<string, string>;
|
|
142
|
+
timeoutMs?: number;
|
|
143
|
+
}
|
|
144
|
+
export interface HandoffCommit {
|
|
145
|
+
agent: string;
|
|
146
|
+
wakeId: string;
|
|
147
|
+
ts: string;
|
|
148
|
+
output: WakeOutput;
|
|
149
|
+
outgoingMail: MailSnapshot[];
|
|
150
|
+
schedule: ScheduleSnapshot | null;
|
|
151
|
+
}
|
|
152
|
+
/** Standard execution modules composed on top of the generic event store. */
|
|
153
|
+
export interface Ledger extends EventStore {
|
|
154
|
+
putGoal(goal: GoalSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
155
|
+
putSchedule(schedule: ScheduleSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
156
|
+
enqueueWake(wake: WakeSnapshot, actor: string): {
|
|
157
|
+
event: EventRecord;
|
|
158
|
+
created: boolean;
|
|
159
|
+
};
|
|
160
|
+
claimNextWake(now: string, leaseUntil: string, leaseToken: string): WakeSnapshot | null;
|
|
161
|
+
markWakeRunning(id: string, now: string, leaseToken: string): WakeSnapshot;
|
|
162
|
+
attachWakeProcess(id: string, leaseToken: string, pid: number, now: string): WakeSnapshot;
|
|
163
|
+
renewWakeLease(id: string, leaseToken: string, leaseUntil: string, now: string): WakeSnapshot;
|
|
164
|
+
finishWake(id: string, status: "done" | "abnormal" | "merge_blocked", now: string): WakeSnapshot;
|
|
165
|
+
expiredWakes(now: string): WakeSnapshot[];
|
|
166
|
+
recoverExpiredWake(id: string, now: string): WakeSnapshot;
|
|
167
|
+
appendRunnerEvent(input: EventInput, leaseToken: string): EventRecord;
|
|
168
|
+
requestAction(action: ActionSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
169
|
+
approveAction(id: string, approver: string, reason: string, evidence: number[]): ActionSnapshot;
|
|
170
|
+
rejectAction(id: string, approver: string, reason: string, evidence: number[]): ActionSnapshot;
|
|
171
|
+
transitionAction(id: string, status: ActionStatus, patch?: Partial<Pick<ActionSnapshot, "externalRef" | "reconciledAt">>): ActionSnapshot;
|
|
172
|
+
recoverDispatchingActions(): ActionSnapshot[];
|
|
173
|
+
putAuditAdvice(id: string, advice: Omit<AuditAdvice, "at">, wakeId?: string): ActionSnapshot;
|
|
174
|
+
ackAuditAdvice(id: string, agent: string): ActionSnapshot;
|
|
175
|
+
putMail(mail: MailSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
176
|
+
commitHandoff(commit: HandoffCommit): EventRecord;
|
|
177
|
+
dueSchedules(now: string): ScheduleSnapshot[];
|
|
178
|
+
unreadMail(agent: string): MailSnapshot[];
|
|
179
|
+
unackedAuditAdvice(agent: string): ActionSnapshot[];
|
|
180
|
+
lastEvent(actor: string, type: string): EventRecord | null;
|
|
181
|
+
eventsForWake(wakeId: string): EventRecord[];
|
|
182
|
+
wake(id: string): WakeSnapshot | null;
|
|
183
|
+
wakeByTrigger(agent: string, triggerRef: string): WakeSnapshot | null;
|
|
184
|
+
queuedWakeForAgent(agent: string): WakeSnapshot | null;
|
|
185
|
+
action(id: string): ActionSnapshot | null;
|
|
186
|
+
goalsForOwner(owner: string): GoalSnapshot[];
|
|
187
|
+
goal(id: string): GoalSnapshot | null;
|
|
188
|
+
triggeringMail(): MailSnapshot[];
|
|
189
|
+
searchEvents(query: string, limit?: number): EventRecord[];
|
|
190
|
+
metricSamples(goalId: string): MetricSample[];
|
|
191
|
+
goals(): GoalSnapshot[];
|
|
192
|
+
schedules(): ScheduleSnapshot[];
|
|
193
|
+
wakes(): WakeSnapshot[];
|
|
194
|
+
actions(): ActionSnapshot[];
|
|
195
|
+
mailbox(): MailSnapshot[];
|
|
196
|
+
rebuildProjections(): void;
|
|
197
|
+
close(): void;
|
|
198
|
+
}
|
|
199
|
+
export declare function assertWakeTransition(from: WakeStatus, to: WakeStatus): void;
|
|
200
|
+
export declare function assertActionTransition(from: ActionStatus, to: ActionStatus): void;
|
|
201
|
+
export declare function assertHandoff(value: Handoff): void;
|
|
202
|
+
export declare function assertActionRequest(value: ActionSnapshot): void;
|
|
203
|
+
export declare function assertGoalSnapshot(value: GoalSnapshot): void;
|
|
204
|
+
export declare function capabilityFor(manifest: ConnectorManifest, kind: string): ConnectorCapability | null;
|
|
205
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const wakeTransitions = { queued: ["leased", "abnormal"], leased: ["queued", "running", "abnormal"], running: ["done", "abnormal", "merge_blocked"], done: [], abnormal: [], merge_blocked: [] };
|
|
2
|
+
const actionTransitions = { requested: ["approved", "failed"], approved: ["dispatching", "failed"], dispatching: ["confirmed", "failed", "unknown"], unknown: ["dispatching", "confirmed", "failed"], confirmed: [], failed: [] };
|
|
3
|
+
export function assertWakeTransition(from, to) { if (!wakeTransitions[from].includes(to))
|
|
4
|
+
throw new Error(`invalid wake transition: ${from} -> ${to}`); }
|
|
5
|
+
export function assertActionTransition(from, to) { if (!actionTransitions[from].includes(to))
|
|
6
|
+
throw new Error(`invalid action transition: ${from} -> ${to}`); }
|
|
7
|
+
export function assertHandoff(value) { if (!Array.isArray(value.observations) || !Array.isArray(value.results) || !Array.isArray(value.nextSteps))
|
|
8
|
+
throw new Error("invalid handoff: observations, results and nextSteps are required arrays"); }
|
|
9
|
+
export function assertActionRequest(value) { if (!value.reason.trim())
|
|
10
|
+
throw new Error("action reason is required"); if (value.evidence.length === 0)
|
|
11
|
+
throw new Error("action evidence is required"); if (value.status !== "requested")
|
|
12
|
+
throw new Error("new action must be requested"); if (!value.connector.trim())
|
|
13
|
+
throw new Error("action connector is required"); if (value.reconciledAt !== null)
|
|
14
|
+
throw new Error("requested action cannot be reconciled"); }
|
|
15
|
+
export function assertGoalSnapshot(value) { if (!value.objective.trim() || !value.owner.trim())
|
|
16
|
+
throw new Error("goal objective and owner are required"); }
|
|
17
|
+
export function capabilityFor(manifest, kind) { return manifest.capabilities.find((capability) => capability.kind === kind) ?? null; }
|
|
18
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AA6EA,MAAM,eAAe,GAA8C,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;AAC5O,MAAM,iBAAiB,GAAkD,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACjR,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAAE,EAAc,IAAU,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvL,MAAM,UAAU,sBAAsB,CAAC,IAAkB,EAAE,EAAgB,IAAU,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACjM,MAAM,UAAU,aAAa,CAAC,KAAc,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC,CAAC,CAAC;AAChQ,MAAM,UAAU,mBAAmB,CAAC,KAAqB,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;IAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;IAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;IAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC;AACzd,MAAM,UAAU,kBAAkB,CAAC,KAAmB,IAAU,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC;AAC/K,MAAM,UAAU,aAAa,CAAC,QAA2B,EAAE,IAAY,IAAgC,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const CONTRACT_VERSION: "0.3.0";
|
|
2
|
+
export declare const CONTRACT_STABILITY: "experimental";
|
|
3
|
+
export type JsonPrimitive = string | number | boolean | null;
|
|
4
|
+
export type JsonValue = JsonPrimitive | JsonValue[] | {
|
|
5
|
+
[key: string]: JsonValue;
|
|
6
|
+
};
|
|
7
|
+
/** One append request. Sequence numbers are assigned by the ledger. */
|
|
8
|
+
export interface EventInput {
|
|
9
|
+
streamId: string;
|
|
10
|
+
ts: string;
|
|
11
|
+
actor: string;
|
|
12
|
+
type: string;
|
|
13
|
+
data: JsonValue;
|
|
14
|
+
}
|
|
15
|
+
/** One immutable fact in the global ledger and in one logical stream. */
|
|
16
|
+
export interface EventRecord extends EventInput {
|
|
17
|
+
seq: number;
|
|
18
|
+
streamSeq: number;
|
|
19
|
+
}
|
|
20
|
+
export interface EventStore {
|
|
21
|
+
appendEvent(input: EventInput): EventRecord;
|
|
22
|
+
appendEvents(inputs: EventInput[]): EventRecord[];
|
|
23
|
+
readStream(streamId: string, fromStreamSeq?: number): EventRecord[];
|
|
24
|
+
eventsSince(seq: number, types?: string[]): EventRecord[];
|
|
25
|
+
events(): EventRecord[];
|
|
26
|
+
}
|
|
27
|
+
export interface Clock {
|
|
28
|
+
now(): Date;
|
|
29
|
+
}
|
|
30
|
+
export declare function wakeStream(wakeId: string): string;
|
|
31
|
+
export declare function controlStream(actor?: string): string;
|
|
32
|
+
export declare function goalStream(goalId: string): string;
|
|
33
|
+
//# sourceMappingURL=kernel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAG,OAAgB,CAAC;AACjD,eAAO,MAAM,kBAAkB,EAAG,cAAuB,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnF,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC;IAC5C,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC;IAClD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IACpE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IAC1D,MAAM,IAAI,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IAAG,GAAG,IAAI,IAAI,CAAA;CAAE;AAEtC,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAA6B;AAC/E,wBAAgB,aAAa,CAAC,KAAK,SAAe,GAAG,MAAM,CAA+B;AAC1F,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAA6B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const CONTRACT_VERSION = "0.3.0";
|
|
2
|
+
export const CONTRACT_STABILITY = "experimental";
|
|
3
|
+
export function wakeStream(wakeId) { return `wake:${wakeId}`; }
|
|
4
|
+
export function controlStream(actor = "supervisor") { return `control:${actor}`; }
|
|
5
|
+
export function goalStream(goalId) { return `goal:${goalId}`; }
|
|
6
|
+
//# sourceMappingURL=kernel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.js","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAgB,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAuB,CAAC;AA8B1D,MAAM,UAAU,UAAU,CAAC,MAAc,IAAY,OAAO,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/E,MAAM,UAAU,aAAa,CAAC,KAAK,GAAG,YAAY,IAAY,OAAO,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1F,MAAM,UAAU,UAAU,CAAC,MAAc,IAAY,OAAO,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { JsonValue } from "./kernel.js";
|
|
2
|
+
/** Optional goal-measurement policy. It is not part of the Goal contract. */
|
|
3
|
+
export interface MetricContract {
|
|
4
|
+
source: string;
|
|
5
|
+
window: string;
|
|
6
|
+
direction: "increase" | "decrease" | "at_least" | "at_most";
|
|
7
|
+
target: number;
|
|
8
|
+
freshnessMs: number;
|
|
9
|
+
onMissing: "abnormal" | "wake_owner";
|
|
10
|
+
onStale: "abnormal" | "wake_owner";
|
|
11
|
+
sustainForMs?: number;
|
|
12
|
+
guardrails?: Array<{
|
|
13
|
+
metric: string;
|
|
14
|
+
direction: "at_least" | "at_most";
|
|
15
|
+
target: number;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export interface MetricSample {
|
|
19
|
+
goalId: string;
|
|
20
|
+
source: string;
|
|
21
|
+
observedAt: string;
|
|
22
|
+
value: number | null;
|
|
23
|
+
guardrails?: Record<string, number>;
|
|
24
|
+
}
|
|
25
|
+
export interface MetricEvaluation {
|
|
26
|
+
goalId: string;
|
|
27
|
+
status: "met" | "missed" | "missing" | "stale" | "guardrail_breached";
|
|
28
|
+
shouldWakeOwner: boolean;
|
|
29
|
+
evaluatedAt: string;
|
|
30
|
+
value: number | null;
|
|
31
|
+
}
|
|
32
|
+
export interface MetricProcessSpec {
|
|
33
|
+
command: string;
|
|
34
|
+
args: string[];
|
|
35
|
+
env?: Record<string, string>;
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function evaluateMetric(metric: MetricContract, samples: MetricSample[], now: string): MetricEvaluation;
|
|
39
|
+
export declare function metricEventData(value: MetricSample | MetricEvaluation): JsonValue;
|
|
40
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,GAAG,YAAY,CAAC;IACrC,OAAO,EAAE,UAAU,GAAG,YAAY,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AAC/I,MAAM,WAAW,gBAAgB;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,oBAAoB,CAAC;IAAC,eAAe,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAChM,MAAM,WAAW,iBAAiB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAExH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAmB7G;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAA0C"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function evaluateMetric(metric, samples, now) {
|
|
2
|
+
const latest = samples.filter((sample) => sample.source === metric.source).sort((a, b) => b.observedAt.localeCompare(a.observedAt))[0];
|
|
3
|
+
if (!latest || latest.value === null)
|
|
4
|
+
return { goalId: latest?.goalId ?? "unknown", status: "missing", shouldWakeOwner: metric.onMissing === "wake_owner", evaluatedAt: now, value: null };
|
|
5
|
+
if (Date.parse(now) - Date.parse(latest.observedAt) > metric.freshnessMs)
|
|
6
|
+
return { goalId: latest.goalId, status: "stale", shouldWakeOwner: metric.onStale === "wake_owner", evaluatedAt: now, value: latest.value };
|
|
7
|
+
const guardrailBreached = (metric.guardrails ?? []).some((guardrail) => {
|
|
8
|
+
const value = latest.guardrails?.[guardrail.metric];
|
|
9
|
+
return value === undefined || (guardrail.direction === "at_least" ? value < guardrail.target : value > guardrail.target);
|
|
10
|
+
});
|
|
11
|
+
if (guardrailBreached)
|
|
12
|
+
return { goalId: latest.goalId, status: "guardrail_breached", shouldWakeOwner: true, evaluatedAt: now, value: latest.value };
|
|
13
|
+
const meets = (value) => metric.direction === "increase" || metric.direction === "at_least" ? value >= metric.target : value <= metric.target;
|
|
14
|
+
let met = meets(latest.value);
|
|
15
|
+
if (met && metric.sustainForMs) {
|
|
16
|
+
const cutoff = Date.parse(now) - metric.sustainForMs;
|
|
17
|
+
const ordered = samples.filter((sample) => sample.source === metric.source && sample.value !== null && Date.parse(sample.observedAt) <= Date.parse(now)).sort((a, b) => a.observedAt.localeCompare(b.observedAt));
|
|
18
|
+
const baseline = ordered.findLast((sample) => Date.parse(sample.observedAt) <= cutoff);
|
|
19
|
+
const sustained = ordered.filter((sample) => Date.parse(sample.observedAt) >= cutoff);
|
|
20
|
+
met = Boolean(baseline && meets(baseline.value) && sustained.every((sample) => meets(sample.value)));
|
|
21
|
+
}
|
|
22
|
+
return { goalId: latest.goalId, status: met ? "met" : "missed", shouldWakeOwner: !met, evaluatedAt: now, value: latest.value };
|
|
23
|
+
}
|
|
24
|
+
export function metricEventData(value) { return value; }
|
|
25
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { EventInput, EventRecord, JsonValue } from "./kernel.js";
|
|
2
|
+
export type SessionEventType = "session.started" | "request.prepared" | "turn.started" | "message.user" | "message.assistant.delta" | "message.assistant.completed" | "tool.called" | "tool.completed" | "context.compacted" | "turn.completed" | "session.completed" | "session.interrupted";
|
|
3
|
+
export interface SessionMessage {
|
|
4
|
+
id: string;
|
|
5
|
+
role: "user" | "assistant" | "tool";
|
|
6
|
+
content: JsonValue;
|
|
7
|
+
toolCallId?: string;
|
|
8
|
+
usage?: JsonValue;
|
|
9
|
+
}
|
|
10
|
+
export interface RequestSnapshot {
|
|
11
|
+
provider: string;
|
|
12
|
+
model: string;
|
|
13
|
+
systemPrompt: string;
|
|
14
|
+
activeContext: string;
|
|
15
|
+
messages: JsonValue[];
|
|
16
|
+
tools: JsonValue[];
|
|
17
|
+
modelConfig: JsonValue;
|
|
18
|
+
sourceSeqs: number[];
|
|
19
|
+
}
|
|
20
|
+
export interface ReplayedSession {
|
|
21
|
+
messages: SessionMessage[];
|
|
22
|
+
status: "running" | "completed" | "interrupted";
|
|
23
|
+
openToolCalls: Array<{
|
|
24
|
+
callId: string;
|
|
25
|
+
name: string;
|
|
26
|
+
arguments: JsonValue;
|
|
27
|
+
}>;
|
|
28
|
+
lastRequest: RequestSnapshot | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function isSessionEvent(event: Pick<EventRecord, "type">): event is EventRecord & {
|
|
31
|
+
type: SessionEventType;
|
|
32
|
+
};
|
|
33
|
+
/** Rebuild the model-visible transcript from canonical, normalized session events. */
|
|
34
|
+
export declare function replaySession(events: readonly EventRecord[]): ReplayedSession;
|
|
35
|
+
/** Synthetic facts that close an interrupted session without hiding unknown tool outcomes. */
|
|
36
|
+
export declare function interruptedSessionEvents(events: readonly EventRecord[], ts: string, actor: string): EventInput[];
|
|
37
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,cAAc,GAAG,cAAc,GAAG,yBAAyB,GAAG,6BAA6B,GAAG,aAAa,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAC9R,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE;AAC/I,MAAM,WAAW,eAAe;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,WAAW,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE;AAC1M,MAAM,WAAW,eAAe;IAAG,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;IAAC,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAAC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE;AAGnO,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,KAAK,IAAI,WAAW,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAA8D;AAEjL,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,eAAe,CA6B7E;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAOhH"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const SESSION_TYPES = new Set(["session.started", "request.prepared", "turn.started", "message.user", "message.assistant.delta", "message.assistant.completed", "tool.called", "tool.completed", "context.compacted", "turn.completed", "session.completed", "session.interrupted"]);
|
|
2
|
+
export function isSessionEvent(event) { return SESSION_TYPES.has(event.type); }
|
|
3
|
+
/** Rebuild the model-visible transcript from canonical, normalized session events. */
|
|
4
|
+
export function replaySession(events) {
|
|
5
|
+
let expected = events[0]?.streamSeq ?? 1;
|
|
6
|
+
const messages = [];
|
|
7
|
+
const calls = new Map();
|
|
8
|
+
let status = "running";
|
|
9
|
+
let lastRequest = null;
|
|
10
|
+
for (const event of events) {
|
|
11
|
+
if (event.streamSeq !== expected)
|
|
12
|
+
throw new Error(`session stream gap: expected ${expected}, got ${event.streamSeq}`);
|
|
13
|
+
expected += 1;
|
|
14
|
+
if (!isSessionEvent(event))
|
|
15
|
+
continue;
|
|
16
|
+
const data = event.data;
|
|
17
|
+
if (event.type === "message.user" || event.type === "message.assistant.completed")
|
|
18
|
+
messages.push(data.message);
|
|
19
|
+
else if (event.type === "tool.called") {
|
|
20
|
+
const call = { callId: String(data.callId), name: String(data.name), arguments: (data.arguments ?? null) };
|
|
21
|
+
calls.set(call.callId, call);
|
|
22
|
+
}
|
|
23
|
+
else if (event.type === "tool.completed") {
|
|
24
|
+
const callId = String(data.callId);
|
|
25
|
+
calls.delete(callId);
|
|
26
|
+
messages.push({ id: String(data.messageId ?? `tool:${callId}`), role: "tool", toolCallId: callId, content: (data.result ?? null) });
|
|
27
|
+
}
|
|
28
|
+
else if (event.type === "context.compacted") {
|
|
29
|
+
const replaced = new Set(Array.isArray(data.replacedMessageIds) ? data.replacedMessageIds.map(String) : []);
|
|
30
|
+
const kept = messages.filter((message) => !replaced.has(message.id));
|
|
31
|
+
messages.splice(0, messages.length, ...kept);
|
|
32
|
+
messages.unshift({ id: String(data.summaryMessageId), role: "user", content: String(data.summary) });
|
|
33
|
+
}
|
|
34
|
+
else if (event.type === "request.prepared")
|
|
35
|
+
lastRequest = event.data;
|
|
36
|
+
else if (event.type === "session.completed")
|
|
37
|
+
status = "completed";
|
|
38
|
+
else if (event.type === "session.interrupted")
|
|
39
|
+
status = "interrupted";
|
|
40
|
+
}
|
|
41
|
+
return { messages, status, openToolCalls: [...calls.values()], lastRequest };
|
|
42
|
+
}
|
|
43
|
+
/** Synthetic facts that close an interrupted session without hiding unknown tool outcomes. */
|
|
44
|
+
export function interruptedSessionEvents(events, ts, actor) {
|
|
45
|
+
const replayed = replaySession(events);
|
|
46
|
+
if (replayed.status !== "running" || !events.some((event) => event.type === "session.started"))
|
|
47
|
+
return [];
|
|
48
|
+
const streamId = events[0].streamId;
|
|
49
|
+
const repairs = replayed.openToolCalls.map((call) => ({ streamId, ts, actor, type: "tool.completed", data: { callId: call.callId, messageId: `repair:${call.callId}`, result: { outcome: "unknown", synthetic: true, reason: "runner interrupted before a durable result" } } }));
|
|
50
|
+
repairs.push({ streamId, ts, actor, type: "session.interrupted", data: { reason: "runner interrupted" } });
|
|
51
|
+
return repairs;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "goah-ledger-contract",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.3.1",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/billc8128/goah.git",
|
|
9
|
+
"directory": "packages/ledger-contract"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=24.0.0"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"!dist/**/*.test.*",
|
|
17
|
+
"!dist/.tsbuildinfo"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": "./dist/index.js",
|
|
24
|
+
"./kernel": "./dist/kernel.js",
|
|
25
|
+
"./session": "./dist/session.js",
|
|
26
|
+
"./execution": "./dist/execution.js",
|
|
27
|
+
"./metrics": "./dist/metrics.js"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { type ActionSnapshot, type ActionStatus, type AuditAdvice, type Clock, type EventInput, type EventRecord, type GoalSnapshot, type HandoffCommit, type Ledger, type MailSnapshot, type MetricSample, type ScheduleSnapshot, type WakeSnapshot } from "goah-ledger-contract";
|
|
3
|
+
type FaultPoint = "after_event_before_projection";
|
|
4
|
+
type FaultInjector = (point: FaultPoint) => void;
|
|
5
|
+
export declare const SQLITE_SCHEMA_VERSION = 6;
|
|
6
|
+
export interface SqliteLedgerOptions {
|
|
7
|
+
faultInjector?: FaultInjector;
|
|
8
|
+
clock?: Clock;
|
|
9
|
+
busyTimeoutMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class SqliteLedger implements Ledger {
|
|
12
|
+
#private;
|
|
13
|
+
readonly db: DatabaseSync;
|
|
14
|
+
constructor(path?: string, options?: SqliteLedgerOptions);
|
|
15
|
+
close(): void;
|
|
16
|
+
appendEvent(input: EventInput): EventRecord;
|
|
17
|
+
appendEvents(inputs: EventInput[]): EventRecord[];
|
|
18
|
+
readStream(streamId: string, fromStreamSeq?: number): EventRecord[];
|
|
19
|
+
putGoal(goal: GoalSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
20
|
+
putSchedule(value: ScheduleSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
21
|
+
enqueueWake(input: WakeSnapshot, actor: string): {
|
|
22
|
+
event: EventRecord;
|
|
23
|
+
created: boolean;
|
|
24
|
+
};
|
|
25
|
+
claimNextWake(now: string, leaseUntil: string, leaseToken: string): WakeSnapshot | null;
|
|
26
|
+
markWakeRunning(id: string, now: string, leaseToken: string): WakeSnapshot;
|
|
27
|
+
attachWakeProcess(id: string, leaseToken: string, pid: number, now: string): WakeSnapshot;
|
|
28
|
+
renewWakeLease(id: string, leaseToken: string, leaseUntil: string, now: string): WakeSnapshot;
|
|
29
|
+
finishWake(id: string, status: "done" | "abnormal" | "merge_blocked", now: string): WakeSnapshot;
|
|
30
|
+
expiredWakes(now: string): WakeSnapshot[];
|
|
31
|
+
recoverExpiredWake(id: string, now: string): WakeSnapshot;
|
|
32
|
+
appendRunnerEvent(input: EventInput, leaseToken: string): EventRecord;
|
|
33
|
+
requestAction(action: ActionSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
34
|
+
approveAction(id: string, approver: string, reason: string, evidence: number[]): ActionSnapshot;
|
|
35
|
+
rejectAction(id: string, approver: string, reason: string, evidence: number[]): ActionSnapshot;
|
|
36
|
+
transitionAction(id: string, status: ActionStatus, patch?: Partial<Pick<ActionSnapshot, "externalRef" | "reconciledAt">>): ActionSnapshot;
|
|
37
|
+
recoverDispatchingActions(): ActionSnapshot[];
|
|
38
|
+
putAuditAdvice(id: string, input: Omit<AuditAdvice, "at">, wakeId?: string): ActionSnapshot;
|
|
39
|
+
ackAuditAdvice(id: string, agent: string): ActionSnapshot;
|
|
40
|
+
putMail(mail: MailSnapshot, actor: string, wakeId?: string): EventRecord;
|
|
41
|
+
commitHandoff(commit: HandoffCommit): EventRecord;
|
|
42
|
+
dueSchedules(now: string): ScheduleSnapshot[];
|
|
43
|
+
unreadMail(agent: string): MailSnapshot[];
|
|
44
|
+
unackedAuditAdvice(agent: string): ActionSnapshot[];
|
|
45
|
+
lastEvent(actor: string, type: string): EventRecord | null;
|
|
46
|
+
eventsForWake(wakeId: string): EventRecord[];
|
|
47
|
+
wake(id: string): WakeSnapshot | null;
|
|
48
|
+
wakeByTrigger(agent: string, triggerRef: string): WakeSnapshot | null;
|
|
49
|
+
queuedWakeForAgent(agent: string): WakeSnapshot | null;
|
|
50
|
+
action(id: string): ActionSnapshot | null;
|
|
51
|
+
goalsForOwner(owner: string): GoalSnapshot[];
|
|
52
|
+
goal(id: string): GoalSnapshot | null;
|
|
53
|
+
triggeringMail(): MailSnapshot[];
|
|
54
|
+
eventsSince(seq: number, types?: string[]): EventRecord[];
|
|
55
|
+
searchEvents(query: string, limit?: number): EventRecord[];
|
|
56
|
+
metricSamples(goalId: string): MetricSample[];
|
|
57
|
+
events(): EventRecord[];
|
|
58
|
+
goals(): GoalSnapshot[];
|
|
59
|
+
schedules(): ScheduleSnapshot[];
|
|
60
|
+
wakes(): WakeSnapshot[];
|
|
61
|
+
actions(): ActionSnapshot[];
|
|
62
|
+
mailbox(): MailSnapshot[];
|
|
63
|
+
rebuildProjections(): void;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|