@jungjaehoon/mama-os 0.36.0 → 0.37.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/agent/agent-loop.d.ts +2 -1
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +17 -12
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +27 -2
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
- package/dist/agent/code-act/type-definition-generator.js +3 -1
- package/dist/agent/code-act/type-definition-generator.js.map +1 -1
- package/dist/agent/context-compile-service.d.ts +2 -0
- package/dist/agent/context-compile-service.d.ts.map +1 -1
- package/dist/agent/context-compile-service.js +1 -1
- package/dist/agent/context-compile-service.js.map +1 -1
- package/dist/agent/drive-tools.d.ts +27 -1
- package/dist/agent/drive-tools.d.ts.map +1 -1
- package/dist/agent/drive-tools.js +68 -2
- package/dist/agent/drive-tools.js.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts +11 -6
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +210 -37
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +2 -2
- package/dist/agent/tool-registry.js +2 -2
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +15 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/report-handler.d.ts +9 -5
- package/dist/api/report-handler.d.ts.map +1 -1
- package/dist/api/report-handler.js +26 -13
- package/dist/api/report-handler.js.map +1 -1
- package/dist/api/report-persistence.d.ts.map +1 -1
- package/dist/api/report-persistence.js +6 -3
- package/dist/api/report-persistence.js.map +1 -1
- package/dist/api/runtime-status-handler.d.ts +1 -0
- package/dist/api/runtime-status-handler.d.ts.map +1 -1
- package/dist/api/runtime-status-handler.js +1 -0
- package/dist/api/runtime-status-handler.js.map +1 -1
- package/dist/cli/commands/start.d.ts +14 -20
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +207 -248
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +89 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/config/types.d.ts +0 -21
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +0 -7
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/index.js +2 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/runtime/agent-loop-init.d.ts +2 -2
- package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
- package/dist/cli/runtime/agent-loop-init.js +3 -3
- package/dist/cli/runtime/agent-loop-init.js.map +1 -1
- package/dist/cli/runtime/api-routes-init.d.ts +7 -1
- package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +99 -38
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-server-init.js +3 -0
- package/dist/cli/runtime/api-server-init.js.map +1 -1
- package/dist/gateways/message-router.js +10 -10
- package/dist/gateways/message-router.js.map +1 -1
- package/dist/gateways/telegram.d.ts +2 -2
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +13 -7
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/multi-agent/agent-event-bus.d.ts +0 -5
- package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
- package/dist/multi-agent/agent-event-bus.js.map +1 -1
- package/dist/operator/action-verifier.d.ts +2 -0
- package/dist/operator/action-verifier.d.ts.map +1 -1
- package/dist/operator/action-verifier.js +3 -2
- package/dist/operator/action-verifier.js.map +1 -1
- package/dist/operator/board-reconcile.d.ts +2 -2
- package/dist/operator/board-reconcile.d.ts.map +1 -1
- package/dist/operator/board-reconcile.js +10 -2
- package/dist/operator/board-reconcile.js.map +1 -1
- package/dist/operator/board-refresh-gate.d.ts +34 -0
- package/dist/operator/board-refresh-gate.d.ts.map +1 -0
- package/dist/operator/board-refresh-gate.js +82 -0
- package/dist/operator/board-refresh-gate.js.map +1 -0
- package/dist/operator/briefs.d.ts.map +1 -1
- package/dist/operator/briefs.js +92 -4
- package/dist/operator/briefs.js.map +1 -1
- package/dist/operator/operator-trigger-loop.d.ts +7 -22
- package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
- package/dist/operator/operator-trigger-loop.js +33 -34
- package/dist/operator/operator-trigger-loop.js.map +1 -1
- package/dist/operator/owner-event-effects.d.ts +34 -0
- package/dist/operator/owner-event-effects.d.ts.map +1 -0
- package/dist/operator/owner-event-effects.js +131 -0
- package/dist/operator/owner-event-effects.js.map +1 -0
- package/dist/operator/{conductor-inbox.d.ts → owner-event-inbox.d.ts} +23 -12
- package/dist/operator/owner-event-inbox.d.ts.map +1 -0
- package/dist/operator/{conductor-inbox.js → owner-event-inbox.js} +97 -40
- package/dist/operator/owner-event-inbox.js.map +1 -0
- package/dist/operator/owner-event-loop.d.ts +59 -0
- package/dist/operator/owner-event-loop.d.ts.map +1 -0
- package/dist/operator/owner-event-loop.js +141 -0
- package/dist/operator/owner-event-loop.js.map +1 -0
- package/dist/operator/owner-event-outcome.d.ts +30 -0
- package/dist/operator/owner-event-outcome.d.ts.map +1 -0
- package/dist/operator/owner-event-outcome.js +108 -0
- package/dist/operator/owner-event-outcome.js.map +1 -0
- package/dist/operator/owner-event-policy.d.ts +20 -0
- package/dist/operator/owner-event-policy.d.ts.map +1 -0
- package/dist/operator/owner-event-policy.js +50 -0
- package/dist/operator/owner-event-policy.js.map +1 -0
- package/dist/operator/owner-event-prompt.d.ts +10 -0
- package/dist/operator/owner-event-prompt.d.ts.map +1 -0
- package/dist/operator/owner-event-prompt.js +63 -0
- package/dist/operator/owner-event-prompt.js.map +1 -0
- package/dist/operator/task-ledger.d.ts +2 -0
- package/dist/operator/task-ledger.d.ts.map +1 -1
- package/dist/operator/task-ledger.js +12 -1
- package/dist/operator/task-ledger.js.map +1 -1
- package/dist/operator/trigger-matcher.d.ts.map +1 -1
- package/dist/operator/trigger-matcher.js +4 -1
- package/dist/operator/trigger-matcher.js.map +1 -1
- package/dist/operator/trigger-registry.d.ts +1 -1
- package/dist/operator/trigger-registry.d.ts.map +1 -1
- package/dist/operator/trigger-registry.js +2 -2
- package/dist/operator/trigger-registry.js.map +1 -1
- package/dist/operator/trigger-types.d.ts +2 -0
- package/dist/operator/trigger-types.d.ts.map +1 -1
- package/dist/operator/workorder-hooks.d.ts +14 -0
- package/dist/operator/workorder-hooks.d.ts.map +1 -1
- package/dist/operator/workorder-hooks.js +64 -0
- package/dist/operator/workorder-hooks.js.map +1 -1
- package/dist/operator/workorder-publishers.d.ts +14 -4
- package/dist/operator/workorder-publishers.d.ts.map +1 -1
- package/dist/operator/workorder-publishers.js +51 -13
- package/dist/operator/workorder-publishers.js.map +1 -1
- package/dist/package-version.d.ts +3 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +18 -0
- package/dist/package-version.js.map +1 -0
- package/package.json +2 -2
- package/public/viewer/js/modules/system.js +1 -0
- package/public/viewer/src/modules/system.ts +2 -0
- package/dist/operator/board-reground.d.ts +0 -19
- package/dist/operator/board-reground.d.ts.map +0 -1
- package/dist/operator/board-reground.js +0 -31
- package/dist/operator/board-reground.js.map +0 -1
- package/dist/operator/conductor-inbox.d.ts.map +0 -1
- package/dist/operator/conductor-inbox.js.map +0 -1
- package/dist/operator/conductor-session.d.ts +0 -55
- package/dist/operator/conductor-session.d.ts.map +0 -1
- package/dist/operator/conductor-session.js +0 -110
- package/dist/operator/conductor-session.js.map +0 -1
- package/dist/operator/conductor.d.ts +0 -69
- package/dist/operator/conductor.d.ts.map +0 -1
- package/dist/operator/conductor.js +0 -90
- package/dist/operator/conductor.js.map +0 -1
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.OwnerEventInbox = void 0;
|
|
4
4
|
const MAX_ATTEMPTS = 5;
|
|
5
5
|
const ACKED_RETENTION_MS = 7 * 86_400_000;
|
|
6
6
|
/**
|
|
7
|
-
* Pending rows older than this park as dead
|
|
8
|
-
*
|
|
9
|
-
* runs per 30s tick the day the owner flips the flag (review F4). 7 days of
|
|
10
|
-
* shadow data is the observation window; older batches are stale, not lost -
|
|
11
|
-
* dead rows stay visible in depth().
|
|
7
|
+
* Pending rows older than this park as dead so a long provider outage cannot
|
|
8
|
+
* replay months of stale chat. Dead rows remain visible in depth().
|
|
12
9
|
*/
|
|
13
10
|
const PENDING_RETENTION_MS = 7 * 86_400_000;
|
|
14
11
|
/**
|
|
@@ -20,8 +17,20 @@ const PENDING_RETENTION_MS = 7 * 86_400_000;
|
|
|
20
17
|
*/
|
|
21
18
|
const EVENT_RETENTION_MS = 30 * 86_400_000;
|
|
22
19
|
const SEEN_CHUNK = 500; // stay under SQLITE_MAX_VARIABLE_NUMBER
|
|
23
|
-
|
|
20
|
+
function deadBatch(row, attempts) {
|
|
21
|
+
return {
|
|
22
|
+
id: row.id,
|
|
23
|
+
channelKey: row.channel_key,
|
|
24
|
+
eventIds: JSON.parse(row.event_ids_json),
|
|
25
|
+
lines: JSON.parse(row.lines_json),
|
|
26
|
+
activations: JSON.parse(row.activations_json),
|
|
27
|
+
status: 'dead',
|
|
28
|
+
attempts,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
class OwnerEventInbox {
|
|
24
32
|
db;
|
|
33
|
+
clock;
|
|
25
34
|
stmtInsertEvent;
|
|
26
35
|
stmtInsertBatch;
|
|
27
36
|
stmtClaimSelect;
|
|
@@ -34,64 +43,88 @@ class ConductorInbox {
|
|
|
34
43
|
stmtPruneEvents;
|
|
35
44
|
stmtReplay;
|
|
36
45
|
stmtDepth;
|
|
37
|
-
constructor(db) {
|
|
46
|
+
constructor(db, clock = () => Date.now()) {
|
|
38
47
|
this.db = db;
|
|
48
|
+
this.clock = clock;
|
|
39
49
|
this.db.exec(`
|
|
40
|
-
CREATE TABLE IF NOT EXISTS
|
|
50
|
+
CREATE TABLE IF NOT EXISTS owner_event_inbox (
|
|
41
51
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
42
52
|
channel_key TEXT NOT NULL,
|
|
43
53
|
event_ids_json TEXT NOT NULL,
|
|
44
54
|
lines_json TEXT NOT NULL,
|
|
55
|
+
activations_json TEXT NOT NULL,
|
|
45
56
|
status TEXT NOT NULL DEFAULT 'pending'
|
|
46
57
|
CHECK (status IN ('pending','claimed','acked','dead')),
|
|
47
58
|
attempts INTEGER NOT NULL DEFAULT 0,
|
|
48
59
|
last_error TEXT,
|
|
49
60
|
created_at INTEGER NOT NULL,
|
|
50
61
|
claimed_at INTEGER,
|
|
51
|
-
acked_at INTEGER
|
|
62
|
+
acked_at INTEGER,
|
|
63
|
+
retry_after INTEGER
|
|
52
64
|
);
|
|
53
|
-
CREATE INDEX IF NOT EXISTS
|
|
54
|
-
ON
|
|
55
|
-
CREATE TABLE IF NOT EXISTS
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_owner_event_inbox_status
|
|
66
|
+
ON owner_event_inbox(status, id);
|
|
67
|
+
CREATE TABLE IF NOT EXISTS owner_event_inbox_events (
|
|
56
68
|
event_id TEXT PRIMARY KEY,
|
|
57
69
|
seen_at INTEGER NOT NULL DEFAULT 0
|
|
58
70
|
);
|
|
59
|
-
CREATE INDEX IF NOT EXISTS
|
|
60
|
-
ON
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_owner_event_inbox_events_seen
|
|
72
|
+
ON owner_event_inbox_events(seen_at);
|
|
61
73
|
`);
|
|
74
|
+
const columns = this.db.prepare(`PRAGMA table_info(owner_event_inbox)`).all();
|
|
75
|
+
if (!columns.some((column) => column.name === 'retry_after')) {
|
|
76
|
+
this.db.exec(`ALTER TABLE owner_event_inbox ADD COLUMN retry_after INTEGER`);
|
|
77
|
+
}
|
|
62
78
|
// Prepared once: enqueue runs per channel per drain tick and re-preparing
|
|
63
79
|
// statements per call was measurable on backfill drains.
|
|
64
|
-
this.stmtInsertEvent = this.db.prepare(`INSERT OR IGNORE INTO
|
|
65
|
-
this.stmtInsertBatch = this.db.prepare(`INSERT INTO
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
80
|
+
this.stmtInsertEvent = this.db.prepare(`INSERT OR IGNORE INTO owner_event_inbox_events (event_id, seen_at) VALUES (?, ?)`);
|
|
81
|
+
this.stmtInsertBatch = this.db.prepare(`INSERT INTO owner_event_inbox
|
|
82
|
+
(channel_key, event_ids_json, lines_json, activations_json, created_at)
|
|
83
|
+
VALUES (?, ?, ?, ?, ?)`);
|
|
84
|
+
this.stmtClaimSelect = this.db.prepare(`SELECT id, channel_key, event_ids_json, lines_json, activations_json, attempts
|
|
85
|
+
FROM owner_event_inbox
|
|
86
|
+
WHERE status = 'pending' AND COALESCE(retry_after, 0) <= ?
|
|
87
|
+
ORDER BY id ASC LIMIT 1`);
|
|
88
|
+
this.stmtClaimUpdate = this.db.prepare(`UPDATE owner_event_inbox SET status = 'claimed', claimed_at = ?
|
|
70
89
|
WHERE id = ? AND status = 'pending'`);
|
|
71
|
-
this.stmtAck = this.db.prepare(`UPDATE
|
|
72
|
-
this.stmtRetry = this.db.prepare(`UPDATE
|
|
90
|
+
this.stmtAck = this.db.prepare(`UPDATE owner_event_inbox SET status = 'acked', acked_at = ? WHERE id = ?`);
|
|
91
|
+
this.stmtRetry = this.db.prepare(`UPDATE owner_event_inbox
|
|
73
92
|
SET status = CASE WHEN attempts + 1 >= ${MAX_ATTEMPTS} THEN 'dead' ELSE 'pending' END,
|
|
74
|
-
attempts = attempts + 1, last_error = ?, claimed_at = NULL
|
|
93
|
+
attempts = attempts + 1, last_error = ?, claimed_at = NULL,
|
|
94
|
+
retry_after = ? + CASE attempts
|
|
95
|
+
WHEN 0 THEN 60000
|
|
96
|
+
WHEN 1 THEN 300000
|
|
97
|
+
WHEN 2 THEN 1800000
|
|
98
|
+
WHEN 3 THEN 7200000
|
|
99
|
+
ELSE 43200000
|
|
100
|
+
END
|
|
75
101
|
WHERE id = ? AND status = 'claimed'`);
|
|
76
|
-
this.stmtRetryStatus = this.db.prepare(`SELECT status FROM
|
|
77
|
-
this.stmtPruneAcked = this.db.prepare(`DELETE FROM
|
|
78
|
-
this.stmtPrunePending = this.db.prepare(`UPDATE
|
|
102
|
+
this.stmtRetryStatus = this.db.prepare(`SELECT status FROM owner_event_inbox WHERE id = ?`);
|
|
103
|
+
this.stmtPruneAcked = this.db.prepare(`DELETE FROM owner_event_inbox WHERE status = 'acked' AND acked_at <= ?`);
|
|
104
|
+
this.stmtPrunePending = this.db.prepare(`UPDATE owner_event_inbox
|
|
79
105
|
SET status = 'dead', last_error = 'stale_pending_expired'
|
|
80
106
|
WHERE status = 'pending' AND created_at <= ?`);
|
|
81
|
-
this.stmtPruneEvents = this.db.prepare(`DELETE FROM
|
|
107
|
+
this.stmtPruneEvents = this.db.prepare(`DELETE FROM owner_event_inbox_events WHERE seen_at <= ?`);
|
|
82
108
|
// Same poison cap as retry(): a claim that expires its lease repeatedly
|
|
83
109
|
// (hung run, daemon death mid-flight) must park as dead too, not re-pend
|
|
84
110
|
// forever at the head of the queue (review F8).
|
|
85
|
-
this.stmtReplay = this.db.prepare(`UPDATE
|
|
111
|
+
this.stmtReplay = this.db.prepare(`UPDATE owner_event_inbox
|
|
86
112
|
SET status = CASE WHEN attempts + 1 >= ${MAX_ATTEMPTS} THEN 'dead' ELSE 'pending' END,
|
|
87
|
-
attempts = attempts + 1, claimed_at = NULL
|
|
113
|
+
attempts = attempts + 1, claimed_at = NULL,
|
|
114
|
+
retry_after = ? + CASE attempts
|
|
115
|
+
WHEN 0 THEN 60000
|
|
116
|
+
WHEN 1 THEN 300000
|
|
117
|
+
WHEN 2 THEN 1800000
|
|
118
|
+
WHEN 3 THEN 7200000
|
|
119
|
+
ELSE 43200000
|
|
120
|
+
END
|
|
88
121
|
WHERE status = 'claimed' AND COALESCE(claimed_at, 0) <= ?`);
|
|
89
122
|
// Grouped on the (status, id) index; never scans the acked bulk.
|
|
90
|
-
this.stmtDepth = this.db.prepare(`SELECT status, COUNT(*) AS n FROM
|
|
123
|
+
this.stmtDepth = this.db.prepare(`SELECT status, COUNT(*) AS n FROM owner_event_inbox
|
|
91
124
|
WHERE status IN ('pending','claimed','dead') GROUP BY status`);
|
|
92
125
|
}
|
|
93
126
|
now() {
|
|
94
|
-
return
|
|
127
|
+
return this.clock();
|
|
95
128
|
}
|
|
96
129
|
/**
|
|
97
130
|
* Dedupe is PER EVENT, not per batch shape. A batch-boundary key fails on
|
|
@@ -107,7 +140,7 @@ class ConductorInbox {
|
|
|
107
140
|
for (let i = 0; i < batch.eventIds.length; i += SEEN_CHUNK) {
|
|
108
141
|
const chunk = batch.eventIds.slice(i, i + SEEN_CHUNK);
|
|
109
142
|
const rows = this.db
|
|
110
|
-
.prepare(`SELECT event_id FROM
|
|
143
|
+
.prepare(`SELECT event_id FROM owner_event_inbox_events WHERE event_id IN (${chunk
|
|
111
144
|
.map(() => '?')
|
|
112
145
|
.join(',')})`)
|
|
113
146
|
.all(...chunk);
|
|
@@ -122,12 +155,12 @@ class ConductorInbox {
|
|
|
122
155
|
const now = this.now();
|
|
123
156
|
for (const id of fresh)
|
|
124
157
|
this.stmtInsertEvent.run(id, now);
|
|
125
|
-
return this.stmtInsertBatch.run(batch.channelKey, JSON.stringify(fresh), JSON.stringify(batch.lines), now);
|
|
158
|
+
return this.stmtInsertBatch.run(batch.channelKey, JSON.stringify(fresh), JSON.stringify(batch.lines), JSON.stringify(batch.activations), now);
|
|
126
159
|
});
|
|
127
160
|
return Number(run().lastInsertRowid);
|
|
128
161
|
}
|
|
129
162
|
claimNext() {
|
|
130
|
-
const row = this.stmtClaimSelect.get();
|
|
163
|
+
const row = this.stmtClaimSelect.get(this.now());
|
|
131
164
|
if (!row) {
|
|
132
165
|
return null;
|
|
133
166
|
}
|
|
@@ -140,6 +173,7 @@ class ConductorInbox {
|
|
|
140
173
|
channelKey: row.channel_key,
|
|
141
174
|
eventIds: JSON.parse(row.event_ids_json),
|
|
142
175
|
lines: JSON.parse(row.lines_json),
|
|
176
|
+
activations: JSON.parse(row.activations_json),
|
|
143
177
|
status: 'claimed',
|
|
144
178
|
attempts: row.attempts,
|
|
145
179
|
};
|
|
@@ -153,7 +187,7 @@ class ConductorInbox {
|
|
|
153
187
|
* permanent loss must never be silent.
|
|
154
188
|
*/
|
|
155
189
|
retry(id, error) {
|
|
156
|
-
const result = this.stmtRetry.run(error.slice(0, 500), id);
|
|
190
|
+
const result = this.stmtRetry.run(error.slice(0, 500), this.now(), id);
|
|
157
191
|
if (result.changes !== 1) {
|
|
158
192
|
return 'noop'; // replayStale already flipped it
|
|
159
193
|
}
|
|
@@ -161,14 +195,37 @@ class ConductorInbox {
|
|
|
161
195
|
return row?.status === 'dead' ? 'dead' : 'pending';
|
|
162
196
|
}
|
|
163
197
|
replayStale(olderThanMs, now = this.now()) {
|
|
198
|
+
return this.replayStaleDetailed(olderThanMs, now).replayed;
|
|
199
|
+
}
|
|
200
|
+
replayStaleDetailed(olderThanMs, now = this.now()) {
|
|
164
201
|
// Housekeeping rides along: acked rows age out, stale pending rows park
|
|
165
202
|
// as dead (visible, bounded), and the dedupe table keeps a wide but
|
|
166
203
|
// finite horizon - no table here grows without bound.
|
|
204
|
+
const stalePending = this.db
|
|
205
|
+
.prepare(`SELECT id, channel_key, event_ids_json, lines_json, activations_json, attempts
|
|
206
|
+
FROM owner_event_inbox
|
|
207
|
+
WHERE status = 'pending' AND created_at <= ?
|
|
208
|
+
ORDER BY id ASC`)
|
|
209
|
+
.all(now - PENDING_RETENTION_MS);
|
|
167
210
|
this.stmtPruneAcked.run(now - ACKED_RETENTION_MS);
|
|
168
211
|
this.stmtPrunePending.run(now - PENDING_RETENTION_MS);
|
|
169
212
|
this.stmtPruneEvents.run(now - EVENT_RETENTION_MS);
|
|
170
|
-
const
|
|
171
|
-
|
|
213
|
+
const cutoff = now - olderThanMs;
|
|
214
|
+
const dying = this.db
|
|
215
|
+
.prepare(`SELECT id, channel_key, event_ids_json, lines_json, activations_json, attempts
|
|
216
|
+
FROM owner_event_inbox
|
|
217
|
+
WHERE status = 'claimed' AND attempts + 1 >= ${MAX_ATTEMPTS}
|
|
218
|
+
AND COALESCE(claimed_at, 0) <= ?
|
|
219
|
+
ORDER BY id ASC`)
|
|
220
|
+
.all(cutoff);
|
|
221
|
+
const result = this.stmtReplay.run(now, cutoff);
|
|
222
|
+
return {
|
|
223
|
+
replayed: result.changes,
|
|
224
|
+
newlyDead: [
|
|
225
|
+
...stalePending.map((row) => deadBatch(row, row.attempts)),
|
|
226
|
+
...dying.map((row) => deadBatch(row, row.attempts + 1)),
|
|
227
|
+
],
|
|
228
|
+
};
|
|
172
229
|
}
|
|
173
230
|
depth() {
|
|
174
231
|
const rows = this.stmtDepth.all();
|
|
@@ -180,5 +237,5 @@ class ConductorInbox {
|
|
|
180
237
|
};
|
|
181
238
|
}
|
|
182
239
|
}
|
|
183
|
-
exports.
|
|
184
|
-
//# sourceMappingURL=
|
|
240
|
+
exports.OwnerEventInbox = OwnerEventInbox;
|
|
241
|
+
//# sourceMappingURL=owner-event-inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-event-inbox.js","sourceRoot":"","sources":["../../src/operator/owner-event-inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { AgentContext } from '../agent/types.js';
|
|
2
|
+
import type { Envelope } from '../envelope/types.js';
|
|
3
|
+
import type { OwnerEventBatch, OwnerEventInbox } from './owner-event-inbox.js';
|
|
4
|
+
import { buildOwnerEventEffectAuthority } from './owner-event-effects.js';
|
|
5
|
+
import { type OwnerEventHistoryMessage, type OwnerEventOutcome } from './owner-event-outcome.js';
|
|
6
|
+
type OwnerEventTerminalReceipt = Exclude<OwnerEventOutcome, {
|
|
7
|
+
status: 'retry';
|
|
8
|
+
}>;
|
|
9
|
+
interface OwnerEventRunner {
|
|
10
|
+
run(prompt: string, options: {
|
|
11
|
+
sessionKey: string;
|
|
12
|
+
source: 'owner-event';
|
|
13
|
+
actorId: 'mama-owner';
|
|
14
|
+
channelId: string;
|
|
15
|
+
resumeSession: true;
|
|
16
|
+
agentContext: AgentContext;
|
|
17
|
+
envelope: Envelope;
|
|
18
|
+
causeEventIds: readonly string[];
|
|
19
|
+
sourceMessageRef: string;
|
|
20
|
+
ownerEventEffects: ReturnType<typeof buildOwnerEventEffectAuthority>;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
response: string;
|
|
23
|
+
history: OwnerEventHistoryMessage[];
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface OwnerEventLoopDeps {
|
|
27
|
+
inbox: OwnerEventInbox;
|
|
28
|
+
runner: OwnerEventRunner;
|
|
29
|
+
agentContext: AgentContext;
|
|
30
|
+
buildPrompt: (batch: OwnerEventBatch) => Promise<string> | string;
|
|
31
|
+
issueEnvelope: (batch: OwnerEventBatch) => Promise<Envelope>;
|
|
32
|
+
getNoUpdateMaxId: (scope: string) => number;
|
|
33
|
+
getTerminalReceipt?: (batch: OwnerEventBatch) => OwnerEventTerminalReceipt | null;
|
|
34
|
+
recordTriggerOutcome?: (triggerId: string, outcome: 'succeeded' | 'failed') => void;
|
|
35
|
+
onDead?: (message: string) => void | Promise<void>;
|
|
36
|
+
log: (line: string) => void;
|
|
37
|
+
leaseMs?: number;
|
|
38
|
+
maxBatchesPerTick?: number;
|
|
39
|
+
}
|
|
40
|
+
export declare function closeOwnerEventBeforeDatabase(stopOwnerEvent: () => Promise<void>, closeOperatorDatabase: () => Promise<void> | void): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* The background event turn of the MAMA owner agent.
|
|
43
|
+
*
|
|
44
|
+
* This is deliberately not a planning persona. It consumes the same durable
|
|
45
|
+
* external events, runs the owner's current MAMA policy on a per-channel
|
|
46
|
+
* session, and ACKs only a receipted action, delegation, or exact no-update.
|
|
47
|
+
*/
|
|
48
|
+
export declare class OwnerEventLoop {
|
|
49
|
+
private readonly deps;
|
|
50
|
+
private readonly leaseMs;
|
|
51
|
+
private readonly maxBatchesPerTick;
|
|
52
|
+
constructor(deps: OwnerEventLoopDeps);
|
|
53
|
+
tick(): Promise<'idle' | 'processed' | 'failed'>;
|
|
54
|
+
private recordTriggerOutcomes;
|
|
55
|
+
private ackTerminalReceipt;
|
|
56
|
+
private notifyDead;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=owner-event-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-event-loop.d.ts","sourceRoot":"","sources":["../../src/operator/owner-event-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AAElC,KAAK,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEjF,UAAU,gBAAgB;IACxB,GAAG,CACD,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,aAAa,CAAC;QACtB,OAAO,EAAE,YAAY,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,IAAI,CAAC;QACpB,YAAY,EAAE,YAAY,CAAC;QAC3B,QAAQ,EAAE,QAAQ,CAAC;QACnB,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;QACjC,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAC;KACtE,GACA,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,wBAAwB,EAAE,CAAA;KAAE,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAClE,aAAa,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,yBAAyB,GAAG,IAAI,CAAC;IAClF,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,KAAK,IAAI,CAAC;IACpF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACnC,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAChD,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAEd,IAAI,EAAE,kBAAkB;IAK/C,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IA+FtD,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,kBAAkB;YAcZ,UAAU;CAazB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OwnerEventLoop = void 0;
|
|
4
|
+
exports.closeOwnerEventBeforeDatabase = closeOwnerEventBeforeDatabase;
|
|
5
|
+
const owner_event_effects_js_1 = require("./owner-event-effects.js");
|
|
6
|
+
const owner_event_outcome_js_1 = require("./owner-event-outcome.js");
|
|
7
|
+
async function closeOwnerEventBeforeDatabase(stopOwnerEvent, closeOperatorDatabase) {
|
|
8
|
+
await stopOwnerEvent();
|
|
9
|
+
await closeOperatorDatabase();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The background event turn of the MAMA owner agent.
|
|
13
|
+
*
|
|
14
|
+
* This is deliberately not a planning persona. It consumes the same durable
|
|
15
|
+
* external events, runs the owner's current MAMA policy on a per-channel
|
|
16
|
+
* session, and ACKs only a receipted action, delegation, or exact no-update.
|
|
17
|
+
*/
|
|
18
|
+
class OwnerEventLoop {
|
|
19
|
+
deps;
|
|
20
|
+
leaseMs;
|
|
21
|
+
maxBatchesPerTick;
|
|
22
|
+
constructor(deps) {
|
|
23
|
+
this.deps = deps;
|
|
24
|
+
this.leaseMs = deps.leaseMs ?? 10 * 60_000;
|
|
25
|
+
this.maxBatchesPerTick = deps.maxBatchesPerTick ?? 8;
|
|
26
|
+
}
|
|
27
|
+
async tick() {
|
|
28
|
+
const replay = this.deps.inbox.replayStaleDetailed(this.leaseMs);
|
|
29
|
+
if (replay.replayed > 0) {
|
|
30
|
+
this.deps.log(`[owner-event] replayed ${replay.replayed} stale claim(s)`);
|
|
31
|
+
}
|
|
32
|
+
for (const dead of replay.newlyDead) {
|
|
33
|
+
this.recordTriggerOutcomes(dead, 'failed');
|
|
34
|
+
await this.notifyDead(dead, 'lease expired repeatedly');
|
|
35
|
+
}
|
|
36
|
+
let processed = 0;
|
|
37
|
+
while (processed < this.maxBatchesPerTick) {
|
|
38
|
+
const batch = this.deps.inbox.claimNext();
|
|
39
|
+
if (!batch)
|
|
40
|
+
break;
|
|
41
|
+
const scope = `owner-event:${batch.id}`;
|
|
42
|
+
const recoveredBeforeRun = this.deps.getTerminalReceipt?.(batch) ?? null;
|
|
43
|
+
if (recoveredBeforeRun) {
|
|
44
|
+
this.ackTerminalReceipt(batch, recoveredBeforeRun, 'recovered before model run');
|
|
45
|
+
processed += 1;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const noUpdateBefore = this.deps.getNoUpdateMaxId(scope);
|
|
49
|
+
try {
|
|
50
|
+
const prompt = await this.deps.buildPrompt(batch);
|
|
51
|
+
const envelope = await this.deps.issueEnvelope(batch);
|
|
52
|
+
const result = await this.deps.runner.run(prompt, {
|
|
53
|
+
sessionKey: `owner-event:${batch.channelKey}`,
|
|
54
|
+
source: 'owner-event',
|
|
55
|
+
actorId: 'mama-owner',
|
|
56
|
+
channelId: batch.channelKey,
|
|
57
|
+
resumeSession: true,
|
|
58
|
+
agentContext: this.deps.agentContext,
|
|
59
|
+
envelope,
|
|
60
|
+
causeEventIds: batch.eventIds,
|
|
61
|
+
sourceMessageRef: `owner-event:${batch.id}`,
|
|
62
|
+
ownerEventEffects: (0, owner_event_effects_js_1.buildOwnerEventEffectAuthority)(batch),
|
|
63
|
+
});
|
|
64
|
+
const outcome = (0, owner_event_outcome_js_1.classifyOwnerEventOutcome)({
|
|
65
|
+
history: result.history,
|
|
66
|
+
noUpdateRecorded: this.deps.getNoUpdateMaxId(scope) > noUpdateBefore,
|
|
67
|
+
});
|
|
68
|
+
if (outcome.status === 'retry') {
|
|
69
|
+
const recoveredAfterRun = this.deps.getTerminalReceipt?.(batch) ?? null;
|
|
70
|
+
if (recoveredAfterRun) {
|
|
71
|
+
this.ackTerminalReceipt(batch, recoveredAfterRun, 'recovered after model run');
|
|
72
|
+
processed += 1;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const retry = this.deps.inbox.retry(batch.id, outcome.reason);
|
|
76
|
+
if (retry === 'dead') {
|
|
77
|
+
this.recordTriggerOutcomes(batch, 'failed');
|
|
78
|
+
await this.notifyDead(batch, outcome.reason);
|
|
79
|
+
}
|
|
80
|
+
this.deps.log(`[owner-event] batch ${batch.id} ${retry}: ${outcome.reason} (${batch.channelKey})`);
|
|
81
|
+
return 'failed';
|
|
82
|
+
}
|
|
83
|
+
this.deps.inbox.ack(batch.id);
|
|
84
|
+
this.recordTriggerOutcomes(batch, 'succeeded');
|
|
85
|
+
processed += 1;
|
|
86
|
+
this.deps.log(`[owner-event] batch ${batch.id} ${outcome.status}${outcome.tools.length > 0 ? ` via ${outcome.tools.join(',')}` : ''}`);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
90
|
+
const recoveredAfterError = this.deps.getTerminalReceipt?.(batch) ?? null;
|
|
91
|
+
if (recoveredAfterError) {
|
|
92
|
+
this.ackTerminalReceipt(batch, recoveredAfterError, 'recovered after runner error');
|
|
93
|
+
processed += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const retry = this.deps.inbox.retry(batch.id, reason);
|
|
97
|
+
if (retry === 'dead') {
|
|
98
|
+
this.recordTriggerOutcomes(batch, 'failed');
|
|
99
|
+
await this.notifyDead(batch, reason);
|
|
100
|
+
}
|
|
101
|
+
this.deps.log(`[owner-event] batch ${batch.id} ${retry}: ${reason}`);
|
|
102
|
+
return 'failed';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const depth = this.deps.inbox.depth();
|
|
106
|
+
if (depth.pending > 0 || depth.dead > 0) {
|
|
107
|
+
this.deps.log(`[owner-event] tick budget spent: ${processed} processed, ${depth.pending} pending, ${depth.dead} dead`);
|
|
108
|
+
}
|
|
109
|
+
return processed > 0 ? 'processed' : 'idle';
|
|
110
|
+
}
|
|
111
|
+
recordTriggerOutcomes(batch, outcome) {
|
|
112
|
+
if (!this.deps.recordTriggerOutcome)
|
|
113
|
+
return;
|
|
114
|
+
for (const triggerId of new Set(batch.activations.map((activation) => activation.triggerId))) {
|
|
115
|
+
try {
|
|
116
|
+
this.deps.recordTriggerOutcome(triggerId, outcome);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.deps.log(`[owner-event] trigger outcome skipped for ${triggerId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
ackTerminalReceipt(batch, receipt, reason) {
|
|
124
|
+
this.deps.inbox.ack(batch.id);
|
|
125
|
+
this.recordTriggerOutcomes(batch, 'succeeded');
|
|
126
|
+
this.deps.log(`[owner-event] batch ${batch.id} ${receipt.status} ${reason}${receipt.tools.length > 0 ? ` via ${receipt.tools.join(',')}` : ''}`);
|
|
127
|
+
}
|
|
128
|
+
async notifyDead(batch, reason) {
|
|
129
|
+
if (!this.deps.onDead)
|
|
130
|
+
return;
|
|
131
|
+
const message = `MAMA owner-event batch ${batch.id} (${batch.channelKey}) is dead: ${reason}`;
|
|
132
|
+
try {
|
|
133
|
+
await this.deps.onDead(message);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
this.deps.log(`[owner-event] dead-batch alert failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.OwnerEventLoop = OwnerEventLoop;
|
|
141
|
+
//# sourceMappingURL=owner-event-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-event-loop.js","sourceRoot":"","sources":["../../src/operator/owner-event-loop.ts"],"names":[],"mappings":";;;AA6CA,sEAMC;AAhDD,qEAA0E;AAC1E,qEAIkC;AAqC3B,KAAK,UAAU,6BAA6B,CACjD,cAAmC,EACnC,qBAAiD;IAEjD,MAAM,cAAc,EAAE,CAAC;IACvB,MAAM,qBAAqB,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAa,cAAc;IAII;IAHZ,OAAO,CAAS;IAChB,iBAAiB,CAAS;IAE3C,YAA6B,IAAwB;QAAxB,SAAI,GAAJ,IAAI,CAAoB;QACnD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,MAAM,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK;gBAAE,MAAM;YAClB,MAAM,KAAK,GAAG,eAAe,KAAK,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;YACzE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;gBACjF,SAAS,IAAI,CAAC,CAAC;gBACf,SAAS;YACX,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE;oBAChD,UAAU,EAAE,eAAe,KAAK,CAAC,UAAU,EAAE;oBAC7C,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE,YAAY;oBACrB,SAAS,EAAE,KAAK,CAAC,UAAU;oBAC3B,aAAa,EAAE,IAAI;oBACnB,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;oBACpC,QAAQ;oBACR,aAAa,EAAE,KAAK,CAAC,QAAQ;oBAC7B,gBAAgB,EAAE,eAAe,KAAK,CAAC,EAAE,EAAE;oBAC3C,iBAAiB,EAAE,IAAA,uDAA8B,EAAC,KAAK,CAAC;iBACzD,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,IAAA,kDAAyB,EAAC;oBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,cAAc;iBACrE,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;oBACxE,IAAI,iBAAiB,EAAE,CAAC;wBACtB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,CAAC,CAAC;wBAC/E,SAAS,IAAI,CAAC,CAAC;wBACf,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC9D,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;wBACrB,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;wBAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC/C,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,uBAAuB,KAAK,CAAC,EAAE,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,GAAG,CACpF,CAAC;oBACF,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC9B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBAC/C,SAAS,IAAI,CAAC,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,uBAAuB,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,GAC/C,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EACjE,EAAE,CACH,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;gBAC1E,IAAI,mBAAmB,EAAE,CAAC;oBACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,8BAA8B,CAAC,CAAC;oBACpF,SAAS,IAAI,CAAC,CAAC;oBACf,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACtD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrB,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,EAAE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;gBACrE,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,oCAAoC,SAAS,eAAe,KAAK,CAAC,OAAO,aAAa,KAAK,CAAC,IAAI,OAAO,CACxG,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IAEO,qBAAqB,CAAC,KAAsB,EAAE,OAA+B;QACnF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAC5C,KAAK,MAAM,SAAS,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7F,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,6CAA6C,SAAS,KACpD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB,CACxB,KAAsB,EACtB,OAAkC,EAClC,MAAc;QAEd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,uBAAuB,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,GACzD,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EACjE,EAAE,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,KAAsB,EAAE,MAAc;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAC9B,MAAM,OAAO,GAAG,0BAA0B,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,cAAc,MAAM,EAAE,CAAC;QAC9F,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,0CACE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAlJD,wCAkJC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Receipt-only terminal classification for a MAMA owner-event turn.
|
|
3
|
+
*
|
|
4
|
+
* Assistant prose is never evidence. Direct tools count only when paired with
|
|
5
|
+
* a successful tool_result. Nested Code-Act calls count only from the
|
|
6
|
+
* host-authored root execution ledger.
|
|
7
|
+
*/
|
|
8
|
+
export interface OwnerEventHistoryMessage {
|
|
9
|
+
role: string;
|
|
10
|
+
content: unknown;
|
|
11
|
+
}
|
|
12
|
+
export type OwnerEventOutcome = {
|
|
13
|
+
status: 'acted';
|
|
14
|
+
tools: string[];
|
|
15
|
+
} | {
|
|
16
|
+
status: 'delegated';
|
|
17
|
+
tools: string[];
|
|
18
|
+
} | {
|
|
19
|
+
status: 'no_update';
|
|
20
|
+
tools: string[];
|
|
21
|
+
} | {
|
|
22
|
+
status: 'retry';
|
|
23
|
+
tools: string[];
|
|
24
|
+
reason: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function classifyOwnerEventOutcome(input: {
|
|
27
|
+
history: ReadonlyArray<OwnerEventHistoryMessage>;
|
|
28
|
+
noUpdateRecorded: boolean;
|
|
29
|
+
}): OwnerEventOutcome;
|
|
30
|
+
//# sourceMappingURL=owner-event-outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-event-outcome.d.ts","sourceRoot":"","sources":["../../src/operator/owner-event-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAkFzD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC;CAC3B,GAAG,iBAAiB,CAapB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Receipt-only terminal classification for a MAMA owner-event turn.
|
|
4
|
+
*
|
|
5
|
+
* Assistant prose is never evidence. Direct tools count only when paired with
|
|
6
|
+
* a successful tool_result. Nested Code-Act calls count only from the
|
|
7
|
+
* host-authored root execution ledger.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.classifyOwnerEventOutcome = classifyOwnerEventOutcome;
|
|
11
|
+
const EFFECT_TOOLS = new Set(['telegram_send', 'drive_upload']);
|
|
12
|
+
const DELEGATION_TOOLS = new Set(['workorder_request']);
|
|
13
|
+
function normalizeToolName(name) {
|
|
14
|
+
const match = /^mcp__[A-Za-z0-9_-]+__(.+)$/.exec(name);
|
|
15
|
+
return match ? match[1] : name;
|
|
16
|
+
}
|
|
17
|
+
function parseObject(value) {
|
|
18
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
if (typeof value !== 'string')
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(value);
|
|
25
|
+
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
|
|
26
|
+
? parsed
|
|
27
|
+
: null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function successfulResult(value, isError) {
|
|
34
|
+
if (isError === true)
|
|
35
|
+
return false;
|
|
36
|
+
const parsed = parseObject(value);
|
|
37
|
+
return parsed?.success !== false && parsed?.code !== 'envelope_missing';
|
|
38
|
+
}
|
|
39
|
+
function nestedHostTools(value) {
|
|
40
|
+
const parsed = parseObject(value);
|
|
41
|
+
if (!parsed)
|
|
42
|
+
return [];
|
|
43
|
+
const trustedWrapper = (parsed.protocol === 'mama.code_act.result' && parsed.version === 1) ||
|
|
44
|
+
(parsed.protocol === undefined && Array.isArray(parsed.hostToolExecutions));
|
|
45
|
+
if (!trustedWrapper || !Array.isArray(parsed.hostToolExecutions))
|
|
46
|
+
return [];
|
|
47
|
+
return parsed.hostToolExecutions.flatMap((entry) => {
|
|
48
|
+
if (typeof entry !== 'object' || entry === null || Array.isArray(entry))
|
|
49
|
+
return [];
|
|
50
|
+
const execution = entry;
|
|
51
|
+
return execution.success === true && typeof execution.name === 'string' ? [execution.name] : [];
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function executedTools(history) {
|
|
55
|
+
const results = new Map();
|
|
56
|
+
for (const message of history) {
|
|
57
|
+
if (message.role !== 'user' || !Array.isArray(message.content))
|
|
58
|
+
continue;
|
|
59
|
+
for (const block of message.content) {
|
|
60
|
+
if (block.type !== 'tool_result' || typeof block.tool_use_id !== 'string')
|
|
61
|
+
continue;
|
|
62
|
+
results.set(block.tool_use_id, {
|
|
63
|
+
ok: successfulResult(block.content, block.is_error),
|
|
64
|
+
content: block.content,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const tools = [];
|
|
69
|
+
for (const message of history) {
|
|
70
|
+
if (message.role !== 'assistant' || !Array.isArray(message.content))
|
|
71
|
+
continue;
|
|
72
|
+
for (const block of message.content) {
|
|
73
|
+
if (block.type !== 'tool_use' ||
|
|
74
|
+
typeof block.id !== 'string' ||
|
|
75
|
+
typeof block.name !== 'string') {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const result = results.get(block.id);
|
|
79
|
+
if (!result)
|
|
80
|
+
continue;
|
|
81
|
+
const name = normalizeToolName(block.name);
|
|
82
|
+
if (name === 'code_act') {
|
|
83
|
+
tools.push(...nestedHostTools(result.content));
|
|
84
|
+
}
|
|
85
|
+
else if (result.ok) {
|
|
86
|
+
tools.push(name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return [...new Set(tools)];
|
|
91
|
+
}
|
|
92
|
+
function classifyOwnerEventOutcome(input) {
|
|
93
|
+
const tools = executedTools(input.history);
|
|
94
|
+
const delegated = tools.filter((tool) => DELEGATION_TOOLS.has(tool));
|
|
95
|
+
if (delegated.length > 0)
|
|
96
|
+
return { status: 'delegated', tools: delegated };
|
|
97
|
+
const acted = tools.filter((tool) => EFFECT_TOOLS.has(tool));
|
|
98
|
+
if (acted.length > 0)
|
|
99
|
+
return { status: 'acted', tools: acted };
|
|
100
|
+
if (input.noUpdateRecorded)
|
|
101
|
+
return { status: 'no_update', tools: [] };
|
|
102
|
+
return {
|
|
103
|
+
status: 'retry',
|
|
104
|
+
tools: [],
|
|
105
|
+
reason: 'no durable action or exact no-update receipt',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=owner-event-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-event-outcome.js","sourceRoot":"","sources":["../../src/operator/owner-event-outcome.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BackendType } from '../agent/model-runner.js';
|
|
2
|
+
import type { AgentContext } from '../agent/types.js';
|
|
3
|
+
import type { RoleConfig } from '../cli/config/types.js';
|
|
4
|
+
import type { PrivateConnectorPolicy } from '../connectors/private-connector-policy.js';
|
|
5
|
+
export declare function resolveOwnerEventExecution(input: {
|
|
6
|
+
issuance: 'off' | 'enabled' | 'required';
|
|
7
|
+
hasAuthority: boolean;
|
|
8
|
+
}): {
|
|
9
|
+
enabled: true;
|
|
10
|
+
} | {
|
|
11
|
+
enabled: false;
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function buildOwnerEventAgentContext(input: {
|
|
15
|
+
backend: BackendType;
|
|
16
|
+
model: string;
|
|
17
|
+
ownerRole: RoleConfig;
|
|
18
|
+
privateConnectorPolicy: PrivateConnectorPolicy;
|
|
19
|
+
}): AgentContext;
|
|
20
|
+
//# sourceMappingURL=owner-event-policy.d.ts.map
|