@smartmemory/stratum 0.3.3 → 0.4.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/dist/cli/guard.js +63 -6
- package/dist/cli/guard.js.map +1 -1
- package/dist/cli/learn.js +226 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/query_gate.js +2 -1
- package/dist/cli/query_gate.js.map +1 -1
- package/dist/cli/stratum.js +5 -2
- package/dist/cli/stratum.js.map +1 -1
- package/dist/connectors/background.js +58 -10
- package/dist/connectors/background.js.map +1 -1
- package/dist/connectors/base.js +16 -0
- package/dist/connectors/base.js.map +1 -1
- package/dist/connectors/cancellation.js +119 -0
- package/dist/connectors/cancellation.js.map +1 -0
- package/dist/connectors/claude-bg-worker.js +9 -1
- package/dist/connectors/claude-bg-worker.js.map +1 -1
- package/dist/connectors/claude.js +179 -86
- package/dist/connectors/claude.js.map +1 -1
- package/dist/connectors/codex.js +289 -61
- package/dist/connectors/codex.js.map +1 -1
- package/dist/connectors/runner.js +44 -3
- package/dist/connectors/runner.js.map +1 -1
- package/dist/contracts/events.json +34 -1
- package/dist/contracts/guard-signers.allowed +36 -0
- package/dist/contracts/mcp-surface.json +1097 -104
- package/dist/engine/checkpoint.js +8 -1
- package/dist/engine/checkpoint.js.map +1 -1
- package/dist/engine/engine.js +508 -42
- package/dist/engine/engine.js.map +1 -1
- package/dist/engine/evaluate.js +61 -0
- package/dist/engine/evaluate.js.map +1 -0
- package/dist/engine/ledger.js +12 -0
- package/dist/engine/ledger.js.map +1 -1
- package/dist/engine/receipts.js +91 -0
- package/dist/engine/receipts.js.map +1 -0
- package/dist/engine/state.js +51 -1
- package/dist/engine/state.js.map +1 -1
- package/dist/guard/authorization.js +71 -0
- package/dist/guard/authorization.js.map +1 -0
- package/dist/guard/descriptors.js +248 -0
- package/dist/guard/descriptors.js.map +1 -0
- package/dist/guard/errors.js +12 -0
- package/dist/guard/errors.js.map +1 -1
- package/dist/guard/evidence.js +24 -3
- package/dist/guard/evidence.js.map +1 -1
- package/dist/guard/sshsig.js +264 -0
- package/dist/guard/sshsig.js.map +1 -0
- package/dist/guard/store.js +13 -0
- package/dist/guard/store.js.map +1 -1
- package/dist/guard/transition.js +484 -33
- package/dist/guard/transition.js.map +1 -1
- package/dist/guard/trust.js +78 -0
- package/dist/guard/trust.js.map +1 -0
- package/dist/ir/schema.js +8 -1
- package/dist/ir/schema.js.map +1 -1
- package/dist/ir/validate.js +3 -1
- package/dist/ir/validate.js.map +1 -1
- package/dist/judge/judged.js +1 -1
- package/dist/judge/pricing.js +1 -0
- package/dist/judge/pricing.js.map +1 -1
- package/dist/learn/apply.js +600 -0
- package/dist/learn/apply.js.map +1 -0
- package/dist/learn/candidate.js +186 -0
- package/dist/learn/candidate.js.map +1 -0
- package/dist/learn/classify.js +181 -0
- package/dist/learn/classify.js.map +1 -0
- package/dist/learn/harvest.js +138 -0
- package/dist/learn/harvest.js.map +1 -0
- package/dist/learn/smartmemory_egress.js +330 -0
- package/dist/learn/smartmemory_egress.js.map +1 -0
- package/dist/mcp/server.js +155 -24
- package/dist/mcp/server.js.map +1 -1
- package/dist/policy/bundle.js +195 -0
- package/dist/policy/bundle.js.map +1 -0
- package/dist/policy/events.js +51 -0
- package/dist/policy/events.js.map +1 -0
- package/dist/policy/smartmemory_client.js +332 -0
- package/dist/policy/smartmemory_client.js.map +1 -0
- package/dist/policy/types.js +2 -0
- package/dist/policy/types.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export function buildGuardTransitionEvent(options) {
|
|
2
|
+
const { entry } = options;
|
|
3
|
+
return {
|
|
4
|
+
event_id: `${options.runId}:${entry.entry_digest}`,
|
|
5
|
+
kind: "guard_transition",
|
|
6
|
+
run_id: options.runId,
|
|
7
|
+
bundle_id: options.bundleId,
|
|
8
|
+
runner: "local",
|
|
9
|
+
occurred_at: options.occurredAt ?? new Date().toISOString(),
|
|
10
|
+
resource_id: options.resourceId,
|
|
11
|
+
from_state: entry.from_state,
|
|
12
|
+
to_state: entry.to_state,
|
|
13
|
+
outcome: entry.outcome,
|
|
14
|
+
resolved_by: entry.resolved_by,
|
|
15
|
+
...(options.resolvedByUserId !== undefined ? { resolved_by_user_id: options.resolvedByUserId } : {}),
|
|
16
|
+
...(entry.rationale !== null ? { rationale: entry.rationale } : {}),
|
|
17
|
+
ledger_ref: entry.entry_digest,
|
|
18
|
+
entry_digest: entry.entry_digest,
|
|
19
|
+
prev_digest: entry.prev_digest,
|
|
20
|
+
...(entry.payload_digest !== null ? { payload_digest: entry.payload_digest } : {}),
|
|
21
|
+
rules_evaluated: structuredClone(options.rulesEvaluated),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function buildGateResolutionEvent(options) {
|
|
25
|
+
return {
|
|
26
|
+
event_id: `${options.runId}:gate:${options.stepId}:${options.round}`,
|
|
27
|
+
kind: "gate_resolution",
|
|
28
|
+
run_id: options.runId,
|
|
29
|
+
bundle_id: options.bundleId,
|
|
30
|
+
runner: "local",
|
|
31
|
+
occurred_at: options.occurredAt ?? new Date().toISOString(),
|
|
32
|
+
outcome: options.outcome,
|
|
33
|
+
resolved_by: "human",
|
|
34
|
+
...(options.resolvedByUserId !== undefined ? { resolved_by_user_id: options.resolvedByUserId } : {}),
|
|
35
|
+
rules_evaluated: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function buildFlowTerminalEvent(options) {
|
|
39
|
+
return {
|
|
40
|
+
event_id: `${options.runId}:flow`,
|
|
41
|
+
kind: "flow_terminal",
|
|
42
|
+
run_id: options.runId,
|
|
43
|
+
bundle_id: options.bundleId,
|
|
44
|
+
runner: "local",
|
|
45
|
+
occurred_at: options.occurredAt ?? new Date().toISOString(),
|
|
46
|
+
outcome: options.outcome,
|
|
47
|
+
resolved_by: "agent",
|
|
48
|
+
rules_evaluated: structuredClone(options.rulesEvaluated),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/policy/events.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,yBAAyB,CAAC,OAQzC;IACC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,OAAO;QACL,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,EAAE;QAClD,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3D,WAAW,EAAE,OAAO,CAAC,UAAU;QAC/B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAgC;QACnD,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,UAAU,EAAE,KAAK,CAAC,YAAY;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,eAAe,EAAE,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAQxC;IACC,OAAO;QACL,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,SAAS,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE;QACpE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO;QACpB,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,eAAe,EAAE,EAAE;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAMtC;IACC,OAAO;QACL,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,OAAO;QACjC,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO;QACpB,eAAe,EAAE,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmodSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { chmod, mkdir, open, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { resolve, sep } from "node:path";
|
|
6
|
+
const DELIVERY_WARNING = "policy events not delivered: SMARTMEMORY_API_URL/KEY unset";
|
|
7
|
+
const DRAIN_LIMIT = 100;
|
|
8
|
+
export const OUTBOX_MAX_FILES = 1_000;
|
|
9
|
+
export const OUTBOX_MAX_BYTES = 50 * 1024 * 1024;
|
|
10
|
+
const DRAIN_LOCK_STALE_MS = 60_000;
|
|
11
|
+
const MIN_BACKOFF_MS = 1_000;
|
|
12
|
+
const MAX_BACKOFF_MS = 5 * 60_000;
|
|
13
|
+
let disabledWarningLogged = false;
|
|
14
|
+
let defaultClient;
|
|
15
|
+
class DrainLeaseLost extends Error {
|
|
16
|
+
}
|
|
17
|
+
export class SmartMemoryClient {
|
|
18
|
+
url;
|
|
19
|
+
apiKey;
|
|
20
|
+
workspaceId;
|
|
21
|
+
outboxDir;
|
|
22
|
+
fetchImpl;
|
|
23
|
+
warn;
|
|
24
|
+
maxOutboxFiles;
|
|
25
|
+
maxOutboxBytes;
|
|
26
|
+
now;
|
|
27
|
+
random;
|
|
28
|
+
drainTail = Promise.resolve();
|
|
29
|
+
consecutiveFailures = 0;
|
|
30
|
+
nextAttemptAt = 0;
|
|
31
|
+
constructor(options = {}) {
|
|
32
|
+
const env = options.env ?? process.env;
|
|
33
|
+
const url = env.SMARTMEMORY_API_URL?.replace(/\/+$/, "");
|
|
34
|
+
this.url = url ? url : undefined;
|
|
35
|
+
this.apiKey = env.SMARTMEMORY_API_KEY || undefined;
|
|
36
|
+
this.workspaceId = env.SMARTMEMORY_WORKSPACE_ID ?? "";
|
|
37
|
+
this.outboxDir = resolve(options.outboxDir ?? resolve(homedir(), ".stratum", "policy-outbox"));
|
|
38
|
+
this.fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
39
|
+
this.warn = options.warn ?? ((warning) => console.warn(warning));
|
|
40
|
+
this.maxOutboxFiles = options.maxOutboxFiles ?? OUTBOX_MAX_FILES;
|
|
41
|
+
this.maxOutboxBytes = options.maxOutboxBytes ?? OUTBOX_MAX_BYTES;
|
|
42
|
+
this.now = options.now ?? Date.now;
|
|
43
|
+
this.random = options.random ?? Math.random;
|
|
44
|
+
this.repairOutboxPermissions();
|
|
45
|
+
}
|
|
46
|
+
async postEvent(event) {
|
|
47
|
+
validateEventId(event.event_id);
|
|
48
|
+
if (this.url === undefined || this.apiKey === undefined) {
|
|
49
|
+
if (!disabledWarningLogged) {
|
|
50
|
+
disabledWarningLogged = true;
|
|
51
|
+
this.warn(DELIVERY_WARNING);
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (this.now() < this.nextAttemptAt) {
|
|
56
|
+
await this.writeOutbox(event);
|
|
57
|
+
this.warn(`policy event ${event.event_id} queued during delivery backoff`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let response;
|
|
61
|
+
let failure;
|
|
62
|
+
try {
|
|
63
|
+
response = await this.request(event);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
failure = error;
|
|
67
|
+
}
|
|
68
|
+
if (response?.ok) {
|
|
69
|
+
this.resetBackoff();
|
|
70
|
+
await this.drainOutbox();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.recordFailure();
|
|
74
|
+
await this.writeOutbox(event);
|
|
75
|
+
const detail = response === undefined ? message(failure) : `HTTP ${response.status}`;
|
|
76
|
+
this.warn(`policy event ${event.event_id} queued after delivery failure: ${detail}`);
|
|
77
|
+
}
|
|
78
|
+
repairOutboxPermissions() {
|
|
79
|
+
try {
|
|
80
|
+
mkdirSync(this.outboxDir, { recursive: true, mode: 0o700 });
|
|
81
|
+
chmodSync(this.outboxDir, 0o700);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.warn(`policy outbox permissions could not be repaired: ${message(error)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async ensureOutboxDir() {
|
|
88
|
+
await mkdir(this.outboxDir, { recursive: true, mode: 0o700 });
|
|
89
|
+
await chmod(this.outboxDir, 0o700);
|
|
90
|
+
}
|
|
91
|
+
outboxPath(name) {
|
|
92
|
+
const path = resolve(this.outboxDir, name);
|
|
93
|
+
if (!path.startsWith(`${this.outboxDir}${sep}`)) {
|
|
94
|
+
throw new Error(`policy outbox path escapes configured directory: ${JSON.stringify(name)}`);
|
|
95
|
+
}
|
|
96
|
+
return path;
|
|
97
|
+
}
|
|
98
|
+
eventPath(eventId) {
|
|
99
|
+
validateEventId(eventId);
|
|
100
|
+
const filename = `${createHash("sha256").update(eventId, "utf8").digest("hex")}.json`;
|
|
101
|
+
return this.outboxPath(filename);
|
|
102
|
+
}
|
|
103
|
+
async request(event) {
|
|
104
|
+
const controller = new AbortController();
|
|
105
|
+
const timeout = setTimeout(() => controller.abort(), 5_000);
|
|
106
|
+
try {
|
|
107
|
+
return await this.fetchImpl(`${this.url}/memory/policy/events`, {
|
|
108
|
+
method: "POST",
|
|
109
|
+
headers: {
|
|
110
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
111
|
+
"X-Workspace-Id": this.workspaceId,
|
|
112
|
+
"Content-Type": "application/json",
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify(event),
|
|
115
|
+
signal: controller.signal,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
clearTimeout(timeout);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
recordFailure() {
|
|
123
|
+
this.consecutiveFailures += 1;
|
|
124
|
+
const exponent = Math.min(this.consecutiveFailures - 1, 20);
|
|
125
|
+
const base = Math.min(MAX_BACKOFF_MS, MIN_BACKOFF_MS * (2 ** exponent));
|
|
126
|
+
const jittered = Math.min(MAX_BACKOFF_MS, base + (base * 0.2 * this.random()));
|
|
127
|
+
this.nextAttemptAt = this.now() + jittered;
|
|
128
|
+
}
|
|
129
|
+
resetBackoff() {
|
|
130
|
+
this.consecutiveFailures = 0;
|
|
131
|
+
this.nextAttemptAt = 0;
|
|
132
|
+
}
|
|
133
|
+
async writeOutbox(event) {
|
|
134
|
+
try {
|
|
135
|
+
await this.ensureOutboxDir();
|
|
136
|
+
const path = this.eventPath(event.event_id);
|
|
137
|
+
await writeFile(path, JSON.stringify(event), { encoding: "utf8", mode: 0o600 });
|
|
138
|
+
await chmod(path, 0o600);
|
|
139
|
+
await this.enforceOutboxCap();
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.warn(`policy event ${event.event_id} could not be written to outbox: ${message(error)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async outboxFiles() {
|
|
146
|
+
const names = (await readdir(this.outboxDir)).filter((name) => name.endsWith(".json"));
|
|
147
|
+
const files = await Promise.all(names.map(async (name) => {
|
|
148
|
+
const path = this.outboxPath(name);
|
|
149
|
+
try {
|
|
150
|
+
const details = await stat(path);
|
|
151
|
+
if (!details.isFile())
|
|
152
|
+
return undefined;
|
|
153
|
+
return { name, path, modified: details.mtimeMs, size: details.size };
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
}));
|
|
159
|
+
return files.filter((file) => file !== undefined)
|
|
160
|
+
.sort((left, right) => left.modified - right.modified || left.name.localeCompare(right.name));
|
|
161
|
+
}
|
|
162
|
+
async enforceOutboxCap() {
|
|
163
|
+
const files = await this.outboxFiles();
|
|
164
|
+
let bytes = files.reduce((total, file) => total + file.size, 0);
|
|
165
|
+
while (files.length > this.maxOutboxFiles || bytes > this.maxOutboxBytes) {
|
|
166
|
+
const dropped = files.shift();
|
|
167
|
+
if (dropped === undefined)
|
|
168
|
+
return;
|
|
169
|
+
let eventId = dropped.name;
|
|
170
|
+
try {
|
|
171
|
+
const event = JSON.parse(await readFile(dropped.path, "utf8"));
|
|
172
|
+
if (typeof event.event_id === "string")
|
|
173
|
+
eventId = event.event_id;
|
|
174
|
+
}
|
|
175
|
+
catch { /* Name the hashed file when a malformed entry cannot name itself. */ }
|
|
176
|
+
await rm(this.outboxPath(dropped.name), { force: true });
|
|
177
|
+
bytes -= dropped.size;
|
|
178
|
+
this.warn(`WARNING: policy outbox cap dropped ${JSON.stringify(eventId)} (${dropped.name})`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
drainOutbox() {
|
|
182
|
+
const current = this.drainTail.then(() => this.drainOutboxSingleFlight());
|
|
183
|
+
this.drainTail = current.catch(() => undefined);
|
|
184
|
+
return current;
|
|
185
|
+
}
|
|
186
|
+
async acquireDrainLock() {
|
|
187
|
+
await this.ensureOutboxDir();
|
|
188
|
+
const path = this.outboxPath(".drain.lock");
|
|
189
|
+
const token = randomUUID();
|
|
190
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
191
|
+
try {
|
|
192
|
+
const handle = await open(path, "wx", 0o600);
|
|
193
|
+
await handle.writeFile(token, "utf8");
|
|
194
|
+
return { handle, path, token };
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (!hasCode(error, "EEXIST"))
|
|
198
|
+
throw error;
|
|
199
|
+
try {
|
|
200
|
+
const observedToken = await readFile(path, "utf8");
|
|
201
|
+
const details = await stat(path);
|
|
202
|
+
if (this.now() - details.mtimeMs <= DRAIN_LOCK_STALE_MS)
|
|
203
|
+
return undefined;
|
|
204
|
+
const stalePath = this.outboxPath(`.drain.lock.stale.${token}`);
|
|
205
|
+
await this.renameDrainLock(path, stalePath);
|
|
206
|
+
const movedToken = await readFile(stalePath, "utf8");
|
|
207
|
+
const movedDetails = await stat(stalePath);
|
|
208
|
+
if (movedToken !== observedToken || this.now() - movedDetails.mtimeMs <= DRAIN_LOCK_STALE_MS) {
|
|
209
|
+
await this.renameDrainLock(stalePath, path);
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
await rm(stalePath, { force: true });
|
|
213
|
+
}
|
|
214
|
+
catch (lockError) {
|
|
215
|
+
if (!hasCode(lockError, "ENOENT"))
|
|
216
|
+
throw lockError;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
async renameDrainLock(source, destination) {
|
|
223
|
+
await rename(source, destination);
|
|
224
|
+
}
|
|
225
|
+
async assertDrainLockOwned(lock) {
|
|
226
|
+
try {
|
|
227
|
+
const [held, current, token] = await Promise.all([
|
|
228
|
+
lock.handle.stat(),
|
|
229
|
+
stat(lock.path),
|
|
230
|
+
readFile(lock.path, "utf8"),
|
|
231
|
+
]);
|
|
232
|
+
if (held.dev !== current.dev || held.ino !== current.ino || token !== lock.token)
|
|
233
|
+
throw new DrainLeaseLost();
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (error instanceof DrainLeaseLost || hasCode(error, "ENOENT")) {
|
|
237
|
+
throw new DrainLeaseLost(`policy outbox drain lease ${lock.token} was lost`);
|
|
238
|
+
}
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async heartbeatDrainLock(lock) {
|
|
243
|
+
await this.assertDrainLockOwned(lock);
|
|
244
|
+
const timestamp = new Date(this.now());
|
|
245
|
+
await lock.handle.utimes(timestamp, timestamp);
|
|
246
|
+
await this.assertDrainLockOwned(lock);
|
|
247
|
+
}
|
|
248
|
+
async releaseDrainLock(lock) {
|
|
249
|
+
try {
|
|
250
|
+
await this.assertDrainLockOwned(lock);
|
|
251
|
+
const releasedPath = this.outboxPath(`.drain.lock.released.${lock.token}`);
|
|
252
|
+
await this.renameDrainLock(lock.path, releasedPath);
|
|
253
|
+
const [held, released] = await Promise.all([lock.handle.stat(), stat(releasedPath)]);
|
|
254
|
+
if (held.dev !== released.dev || held.ino !== released.ino)
|
|
255
|
+
throw new DrainLeaseLost();
|
|
256
|
+
await rm(releasedPath, { force: true });
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (!(error instanceof DrainLeaseLost))
|
|
261
|
+
this.warn(`policy outbox lock could not be released: ${message(error)}`);
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
await lock.handle.close().catch(() => undefined);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async drainOutboxSingleFlight() {
|
|
269
|
+
let lock;
|
|
270
|
+
let leaseLost = false;
|
|
271
|
+
try {
|
|
272
|
+
lock = await this.acquireDrainLock();
|
|
273
|
+
if (lock === undefined)
|
|
274
|
+
return;
|
|
275
|
+
const files = await this.outboxFiles();
|
|
276
|
+
for (const file of files.slice(0, DRAIN_LIMIT)) {
|
|
277
|
+
try {
|
|
278
|
+
const event = JSON.parse(await readFile(file.path, "utf8"));
|
|
279
|
+
validateEventId(event.event_id);
|
|
280
|
+
await this.heartbeatDrainLock(lock);
|
|
281
|
+
const response = await this.request(event);
|
|
282
|
+
if (!response.ok) {
|
|
283
|
+
this.recordFailure();
|
|
284
|
+
this.warn(`policy outbox drain stopped at ${event.event_id}: HTTP ${response.status}`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this.resetBackoff();
|
|
288
|
+
await this.assertDrainLockOwned(lock);
|
|
289
|
+
await rm(this.outboxPath(file.name), { force: true });
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
if (error instanceof DrainLeaseLost) {
|
|
293
|
+
leaseLost = true;
|
|
294
|
+
this.warn(`WARNING: policy outbox drain lease lost; leaving ${file.name} and remaining files for the new owner`);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
this.recordFailure();
|
|
298
|
+
this.warn(`policy outbox drain stopped at ${file.name}: ${message(error)}`);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
this.warn(`policy outbox could not be drained: ${message(error)}`);
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
if (lock !== undefined) {
|
|
308
|
+
const released = await this.releaseDrainLock(lock);
|
|
309
|
+
if (!released && !leaseLost) {
|
|
310
|
+
this.warn("WARNING: policy outbox drain lease lost before release; remaining files belong to the new owner");
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
export function emitPolicyEvent(event) {
|
|
317
|
+
defaultClient ??= new SmartMemoryClient();
|
|
318
|
+
return defaultClient.postEvent(event);
|
|
319
|
+
}
|
|
320
|
+
function validateEventId(eventId) {
|
|
321
|
+
if (typeof eventId !== "string" || eventId.length === 0)
|
|
322
|
+
throw new TypeError("event_id must be a non-empty string");
|
|
323
|
+
if (eventId.includes("\0"))
|
|
324
|
+
throw new TypeError("event_id must not contain NUL");
|
|
325
|
+
}
|
|
326
|
+
function hasCode(error, code) {
|
|
327
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === code;
|
|
328
|
+
}
|
|
329
|
+
function message(error) {
|
|
330
|
+
return error instanceof Error ? error.message : String(error);
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=smartmemory_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartmemory_client.js","sourceRoot":"","sources":["../../src/policy/smartmemory_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/policy/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartmemory/stratum",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Stratum engine
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Stratum engine: your agent proposes the step, Stratum decides whether it actually finished. Typed, resumable, postcondition-enforced workflows for AI agents.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"repository": {
|
|
7
8
|
"type": "git",
|