@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.
Files changed (158) hide show
  1. package/dist/agent/agent-loop.d.ts +2 -1
  2. package/dist/agent/agent-loop.d.ts.map +1 -1
  3. package/dist/agent/agent-loop.js +17 -12
  4. package/dist/agent/agent-loop.js.map +1 -1
  5. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  6. package/dist/agent/code-act/host-bridge.js +27 -2
  7. package/dist/agent/code-act/host-bridge.js.map +1 -1
  8. package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
  9. package/dist/agent/code-act/type-definition-generator.js +3 -1
  10. package/dist/agent/code-act/type-definition-generator.js.map +1 -1
  11. package/dist/agent/context-compile-service.d.ts +2 -0
  12. package/dist/agent/context-compile-service.d.ts.map +1 -1
  13. package/dist/agent/context-compile-service.js +1 -1
  14. package/dist/agent/context-compile-service.js.map +1 -1
  15. package/dist/agent/drive-tools.d.ts +27 -1
  16. package/dist/agent/drive-tools.d.ts.map +1 -1
  17. package/dist/agent/drive-tools.js +68 -2
  18. package/dist/agent/drive-tools.js.map +1 -1
  19. package/dist/agent/gateway-tool-executor.d.ts +11 -6
  20. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  21. package/dist/agent/gateway-tool-executor.js +210 -37
  22. package/dist/agent/gateway-tool-executor.js.map +1 -1
  23. package/dist/agent/gateway-tools.md +2 -2
  24. package/dist/agent/tool-registry.js +2 -2
  25. package/dist/agent/tool-registry.js.map +1 -1
  26. package/dist/agent/types.d.ts +15 -0
  27. package/dist/agent/types.d.ts.map +1 -1
  28. package/dist/agent/types.js.map +1 -1
  29. package/dist/api/report-handler.d.ts +9 -5
  30. package/dist/api/report-handler.d.ts.map +1 -1
  31. package/dist/api/report-handler.js +26 -13
  32. package/dist/api/report-handler.js.map +1 -1
  33. package/dist/api/report-persistence.d.ts.map +1 -1
  34. package/dist/api/report-persistence.js +6 -3
  35. package/dist/api/report-persistence.js.map +1 -1
  36. package/dist/api/runtime-status-handler.d.ts +1 -0
  37. package/dist/api/runtime-status-handler.d.ts.map +1 -1
  38. package/dist/api/runtime-status-handler.js +1 -0
  39. package/dist/api/runtime-status-handler.js.map +1 -1
  40. package/dist/cli/commands/start.d.ts +14 -20
  41. package/dist/cli/commands/start.d.ts.map +1 -1
  42. package/dist/cli/commands/start.js +207 -248
  43. package/dist/cli/commands/start.js.map +1 -1
  44. package/dist/cli/commands/status.d.ts +6 -0
  45. package/dist/cli/commands/status.d.ts.map +1 -1
  46. package/dist/cli/commands/status.js +89 -0
  47. package/dist/cli/commands/status.js.map +1 -1
  48. package/dist/cli/config/types.d.ts +0 -21
  49. package/dist/cli/config/types.d.ts.map +1 -1
  50. package/dist/cli/config/types.js +0 -7
  51. package/dist/cli/config/types.js.map +1 -1
  52. package/dist/cli/index.js +2 -15
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/cli/runtime/agent-loop-init.d.ts +2 -2
  55. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  56. package/dist/cli/runtime/agent-loop-init.js +3 -3
  57. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  58. package/dist/cli/runtime/api-routes-init.d.ts +7 -1
  59. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  60. package/dist/cli/runtime/api-routes-init.js +99 -38
  61. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  62. package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
  63. package/dist/cli/runtime/api-server-init.js +3 -0
  64. package/dist/cli/runtime/api-server-init.js.map +1 -1
  65. package/dist/gateways/message-router.js +10 -10
  66. package/dist/gateways/message-router.js.map +1 -1
  67. package/dist/gateways/telegram.d.ts +2 -2
  68. package/dist/gateways/telegram.d.ts.map +1 -1
  69. package/dist/gateways/telegram.js +13 -7
  70. package/dist/gateways/telegram.js.map +1 -1
  71. package/dist/multi-agent/agent-event-bus.d.ts +0 -5
  72. package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
  73. package/dist/multi-agent/agent-event-bus.js.map +1 -1
  74. package/dist/operator/action-verifier.d.ts +2 -0
  75. package/dist/operator/action-verifier.d.ts.map +1 -1
  76. package/dist/operator/action-verifier.js +3 -2
  77. package/dist/operator/action-verifier.js.map +1 -1
  78. package/dist/operator/board-reconcile.d.ts +2 -2
  79. package/dist/operator/board-reconcile.d.ts.map +1 -1
  80. package/dist/operator/board-reconcile.js +10 -2
  81. package/dist/operator/board-reconcile.js.map +1 -1
  82. package/dist/operator/board-refresh-gate.d.ts +34 -0
  83. package/dist/operator/board-refresh-gate.d.ts.map +1 -0
  84. package/dist/operator/board-refresh-gate.js +82 -0
  85. package/dist/operator/board-refresh-gate.js.map +1 -0
  86. package/dist/operator/briefs.d.ts.map +1 -1
  87. package/dist/operator/briefs.js +92 -4
  88. package/dist/operator/briefs.js.map +1 -1
  89. package/dist/operator/operator-trigger-loop.d.ts +7 -22
  90. package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
  91. package/dist/operator/operator-trigger-loop.js +33 -34
  92. package/dist/operator/operator-trigger-loop.js.map +1 -1
  93. package/dist/operator/owner-event-effects.d.ts +34 -0
  94. package/dist/operator/owner-event-effects.d.ts.map +1 -0
  95. package/dist/operator/owner-event-effects.js +131 -0
  96. package/dist/operator/owner-event-effects.js.map +1 -0
  97. package/dist/operator/{conductor-inbox.d.ts → owner-event-inbox.d.ts} +23 -12
  98. package/dist/operator/owner-event-inbox.d.ts.map +1 -0
  99. package/dist/operator/{conductor-inbox.js → owner-event-inbox.js} +97 -40
  100. package/dist/operator/owner-event-inbox.js.map +1 -0
  101. package/dist/operator/owner-event-loop.d.ts +59 -0
  102. package/dist/operator/owner-event-loop.d.ts.map +1 -0
  103. package/dist/operator/owner-event-loop.js +141 -0
  104. package/dist/operator/owner-event-loop.js.map +1 -0
  105. package/dist/operator/owner-event-outcome.d.ts +30 -0
  106. package/dist/operator/owner-event-outcome.d.ts.map +1 -0
  107. package/dist/operator/owner-event-outcome.js +108 -0
  108. package/dist/operator/owner-event-outcome.js.map +1 -0
  109. package/dist/operator/owner-event-policy.d.ts +20 -0
  110. package/dist/operator/owner-event-policy.d.ts.map +1 -0
  111. package/dist/operator/owner-event-policy.js +50 -0
  112. package/dist/operator/owner-event-policy.js.map +1 -0
  113. package/dist/operator/owner-event-prompt.d.ts +10 -0
  114. package/dist/operator/owner-event-prompt.d.ts.map +1 -0
  115. package/dist/operator/owner-event-prompt.js +63 -0
  116. package/dist/operator/owner-event-prompt.js.map +1 -0
  117. package/dist/operator/task-ledger.d.ts +2 -0
  118. package/dist/operator/task-ledger.d.ts.map +1 -1
  119. package/dist/operator/task-ledger.js +12 -1
  120. package/dist/operator/task-ledger.js.map +1 -1
  121. package/dist/operator/trigger-matcher.d.ts.map +1 -1
  122. package/dist/operator/trigger-matcher.js +4 -1
  123. package/dist/operator/trigger-matcher.js.map +1 -1
  124. package/dist/operator/trigger-registry.d.ts +1 -1
  125. package/dist/operator/trigger-registry.d.ts.map +1 -1
  126. package/dist/operator/trigger-registry.js +2 -2
  127. package/dist/operator/trigger-registry.js.map +1 -1
  128. package/dist/operator/trigger-types.d.ts +2 -0
  129. package/dist/operator/trigger-types.d.ts.map +1 -1
  130. package/dist/operator/workorder-hooks.d.ts +14 -0
  131. package/dist/operator/workorder-hooks.d.ts.map +1 -1
  132. package/dist/operator/workorder-hooks.js +64 -0
  133. package/dist/operator/workorder-hooks.js.map +1 -1
  134. package/dist/operator/workorder-publishers.d.ts +14 -4
  135. package/dist/operator/workorder-publishers.d.ts.map +1 -1
  136. package/dist/operator/workorder-publishers.js +51 -13
  137. package/dist/operator/workorder-publishers.js.map +1 -1
  138. package/dist/package-version.d.ts +3 -0
  139. package/dist/package-version.d.ts.map +1 -0
  140. package/dist/package-version.js +18 -0
  141. package/dist/package-version.js.map +1 -0
  142. package/package.json +2 -2
  143. package/public/viewer/js/modules/system.js +1 -0
  144. package/public/viewer/src/modules/system.ts +2 -0
  145. package/dist/operator/board-reground.d.ts +0 -19
  146. package/dist/operator/board-reground.d.ts.map +0 -1
  147. package/dist/operator/board-reground.js +0 -31
  148. package/dist/operator/board-reground.js.map +0 -1
  149. package/dist/operator/conductor-inbox.d.ts.map +0 -1
  150. package/dist/operator/conductor-inbox.js.map +0 -1
  151. package/dist/operator/conductor-session.d.ts +0 -55
  152. package/dist/operator/conductor-session.d.ts.map +0 -1
  153. package/dist/operator/conductor-session.js +0 -110
  154. package/dist/operator/conductor-session.js.map +0 -1
  155. package/dist/operator/conductor.d.ts +0 -69
  156. package/dist/operator/conductor.d.ts.map +0 -1
  157. package/dist/operator/conductor.js +0 -90
  158. 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.ConductorInbox = void 0;
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: in shadow mode nothing acks, and
8
- * an unbounded pending queue detonates as months of stale chat replayed at 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
- class ConductorInbox {
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 conductor_inbox (
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 idx_conductor_inbox_status
54
- ON conductor_inbox(status, id);
55
- CREATE TABLE IF NOT EXISTS conductor_inbox_events (
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 idx_conductor_inbox_events_seen
60
- ON conductor_inbox_events(seen_at);
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 conductor_inbox_events (event_id, seen_at) VALUES (?, ?)`);
65
- this.stmtInsertBatch = this.db.prepare(`INSERT INTO conductor_inbox (channel_key, event_ids_json, lines_json, created_at)
66
- VALUES (?, ?, ?, ?)`);
67
- this.stmtClaimSelect = this.db.prepare(`SELECT id, channel_key, event_ids_json, lines_json, attempts
68
- FROM conductor_inbox WHERE status = 'pending' ORDER BY id ASC LIMIT 1`);
69
- this.stmtClaimUpdate = this.db.prepare(`UPDATE conductor_inbox SET status = 'claimed', claimed_at = ?
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 conductor_inbox SET status = 'acked', acked_at = ? WHERE id = ?`);
72
- this.stmtRetry = this.db.prepare(`UPDATE conductor_inbox
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 conductor_inbox WHERE id = ?`);
77
- this.stmtPruneAcked = this.db.prepare(`DELETE FROM conductor_inbox WHERE status = 'acked' AND acked_at <= ?`);
78
- this.stmtPrunePending = this.db.prepare(`UPDATE conductor_inbox
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 conductor_inbox_events WHERE seen_at <= ?`);
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 conductor_inbox
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 conductor_inbox
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 Date.now();
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 conductor_inbox_events WHERE event_id IN (${chunk
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 result = this.stmtReplay.run(now - olderThanMs);
171
- return result.changes;
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.ConductorInbox = ConductorInbox;
184
- //# sourceMappingURL=conductor-inbox.js.map
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":"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"}
@@ -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":";AAAA;;;;;;GAMG;;AA6FH,8DAgBC;AAhGD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;AAChE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAExD,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,KAAgC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,OAA4B;IACpE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,EAAE,OAAO,KAAK,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK,kBAAkB,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,cAAc,GAClB,CAAC,MAAM,CAAC,QAAQ,KAAK,sBAAsB,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;QACpE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5E,OAAO,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnF,MAAM,SAAS,GAAG,KAAgC,CAAC;QACnD,OAAO,SAAS,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,OAAgD;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6C,CAAC;IACrE,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS;QACzE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAyC,EAAE,CAAC;YACtE,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;gBAAE,SAAS;YACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;gBAC7B,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAA+B,CAAC;gBAC1E,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS;QAC9E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAyC,EAAE,CAAC;YACtE,IACE,KAAK,CAAC,IAAI,KAAK,UAAU;gBACzB,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;gBAC5B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAC9B,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,yBAAyB,CAAC,KAGzC;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAE3E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC/D,IAAI,KAAK,CAAC,gBAAgB;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACtE,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,8CAA8C;KACvD,CAAC;AACJ,CAAC"}
@@ -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