@jungjaehoon/mama-os 0.42.0 → 0.44.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 -0
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +96 -3
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/cline-native-tool-policy.d.ts +6 -0
- package/dist/agent/cline-native-tool-policy.d.ts.map +1 -1
- package/dist/agent/cline-native-tool-policy.js +11 -0
- package/dist/agent/cline-native-tool-policy.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +45 -0
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/codex-app-server-process.d.ts +9 -0
- package/dist/agent/codex-app-server-process.d.ts.map +1 -1
- package/dist/agent/codex-app-server-process.js +25 -2
- package/dist/agent/codex-app-server-process.js.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts +15 -0
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +206 -0
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +3 -0
- package/dist/agent/model-runner.d.ts +2 -0
- package/dist/agent/model-runner.d.ts.map +1 -1
- package/dist/agent/model-runner.js.map +1 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +18 -0
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +18 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +145 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/types.d.ts +7 -0
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +11 -1
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/runtime/agent-loop-init.d.ts +4 -0
- package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
- package/dist/cli/runtime/agent-loop-init.js +15 -1
- package/dist/cli/runtime/agent-loop-init.js.map +1 -1
- package/dist/evidence/effects.d.ts +7 -6
- package/dist/evidence/effects.d.ts.map +1 -1
- package/dist/evidence/effects.js +60 -1
- package/dist/evidence/effects.js.map +1 -1
- package/dist/observability/operational-issues.d.ts +55 -0
- package/dist/observability/operational-issues.d.ts.map +1 -0
- package/dist/observability/operational-issues.js +170 -0
- package/dist/observability/operational-issues.js.map +1 -0
- package/dist/operator/file-export.d.ts +22 -0
- package/dist/operator/file-export.d.ts.map +1 -0
- package/dist/operator/file-export.js +115 -0
- package/dist/operator/file-export.js.map +1 -0
- package/dist/operator/owner-event-loop.d.ts +6 -0
- package/dist/operator/owner-event-loop.d.ts.map +1 -1
- package/dist/operator/owner-event-loop.js +12 -1
- package/dist/operator/owner-event-loop.js.map +1 -1
- package/dist/operator/owner-event-policy.d.ts.map +1 -1
- package/dist/operator/owner-event-policy.js +4 -0
- package/dist/operator/owner-event-policy.js.map +1 -1
- package/dist/operator/repair-request.d.ts +29 -0
- package/dist/operator/repair-request.d.ts.map +1 -0
- package/dist/operator/repair-request.js +115 -0
- package/dist/operator/repair-request.js.map +1 -0
- package/dist/operator/report-context.d.ts +13 -0
- package/dist/operator/report-context.d.ts.map +1 -1
- package/dist/operator/report-context.js +39 -1
- package/dist/operator/report-context.js.map +1 -1
- package/dist/operator/task-ledger.d.ts +24 -1
- package/dist/operator/task-ledger.d.ts.map +1 -1
- package/dist/operator/task-ledger.js +64 -1
- package/dist/operator/task-ledger.js.map +1 -1
- package/dist/operator/worker-run.d.ts +4 -0
- package/dist/operator/worker-run.d.ts.map +1 -1
- package/dist/operator/worker-run.js +4 -1
- package/dist/operator/worker-run.js.map +1 -1
- package/dist/operator/workorder-consumer.d.ts +2 -0
- package/dist/operator/workorder-consumer.d.ts.map +1 -1
- package/dist/operator/workorder-consumer.js +22 -1
- package/dist/operator/workorder-consumer.js.map +1 -1
- package/dist/operator/workorder-publishers.d.ts +2 -0
- package/dist/operator/workorder-publishers.d.ts.map +1 -1
- package/dist/operator/workorder-publishers.js +12 -0
- package/dist/operator/workorder-publishers.js.map +1 -1
- package/package.json +2 -2
package/dist/evidence/effects.js
CHANGED
|
@@ -67,8 +67,19 @@ const EFFECT_KINDS = [
|
|
|
67
67
|
'report_publish',
|
|
68
68
|
'memory_write',
|
|
69
69
|
'wiki_write',
|
|
70
|
+
'file_export',
|
|
71
|
+
'repair_request',
|
|
72
|
+
'run_budget_stop',
|
|
73
|
+
];
|
|
74
|
+
const EFFECT_TARGETS = [
|
|
75
|
+
'task',
|
|
76
|
+
'report_slot',
|
|
77
|
+
'memory',
|
|
78
|
+
'wiki_page',
|
|
79
|
+
'file',
|
|
80
|
+
'issue',
|
|
81
|
+
'run',
|
|
70
82
|
];
|
|
71
|
-
const EFFECT_TARGETS = ['task', 'report_slot', 'memory', 'wiki_page'];
|
|
72
83
|
/** Long enough for any upstream id, short enough that the column cannot carry content. */
|
|
73
84
|
const MAX_EVENT_ID_LENGTH = 200;
|
|
74
85
|
const PAYLOAD_HASH_LENGTH = 32;
|
|
@@ -164,6 +175,7 @@ const INDEXES = [
|
|
|
164
175
|
function ensureEffectLedger(adapter) {
|
|
165
176
|
adapter.prepare(exports.EVIDENCE_EFFECTS_DDL).run();
|
|
166
177
|
migrateCauseKind(adapter);
|
|
178
|
+
widenClosedSets(adapter);
|
|
167
179
|
adapter.prepare(EVIDENCE_EFFECTS_CAUSE_TRIGGER).run();
|
|
168
180
|
adapter.prepare(EVIDENCE_EFFECTS_KIND_TRIGGER).run();
|
|
169
181
|
for (const sql of INDEXES) {
|
|
@@ -219,6 +231,53 @@ function migrateCauseKind(adapter) {
|
|
|
219
231
|
WHERE cause_state = 'unattributed' AND run_id IS NULL`)
|
|
220
232
|
.run();
|
|
221
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Phase 3 migration: the effect_kind / target_type CHECKs are closed sets baked into the
|
|
236
|
+
* table, and SQLite cannot alter a CHECK in place. When an installed ledger's CHECK is
|
|
237
|
+
* narrower than the current constants, rebuild the table inside one transaction: copy every
|
|
238
|
+
* row with identical ids and created_at, keep the cause_state CHECK and both triggers
|
|
239
|
+
* byte-identical (they are the invariant the ledger rests on), recreate the indices.
|
|
240
|
+
* Detection reads the stored DDL, so a ledger that already carries the current sets is
|
|
241
|
+
* untouched on every later boot.
|
|
242
|
+
*/
|
|
243
|
+
function widenClosedSets(adapter) {
|
|
244
|
+
const row = adapter
|
|
245
|
+
.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='evidence_effects'`)
|
|
246
|
+
.all()[0];
|
|
247
|
+
const storedDdl = row?.sql ?? '';
|
|
248
|
+
const missing = [...EFFECT_KINDS, ...EFFECT_TARGETS].filter((value) => !storedDdl.includes(`'${value}'`));
|
|
249
|
+
if (missing.length === 0) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const run = (sql) => adapter.prepare(sql).run();
|
|
253
|
+
run('BEGIN IMMEDIATE');
|
|
254
|
+
try {
|
|
255
|
+
run(exports.EVIDENCE_EFFECTS_DDL.replace('evidence_effects (', 'evidence_effects_new ('));
|
|
256
|
+
run(`INSERT INTO evidence_effects_new
|
|
257
|
+
(id, run_id, channel_id, cause_state, cause_kind, source_event_ids_json,
|
|
258
|
+
effect_kind, target_type, target_id, payload_hash, created_at)
|
|
259
|
+
SELECT id, run_id, channel_id, cause_state, cause_kind, source_event_ids_json,
|
|
260
|
+
effect_kind, target_type, target_id, payload_hash, created_at
|
|
261
|
+
FROM evidence_effects`);
|
|
262
|
+
run('DROP TABLE evidence_effects');
|
|
263
|
+
run('ALTER TABLE evidence_effects_new RENAME TO evidence_effects');
|
|
264
|
+
run(EVIDENCE_EFFECTS_CAUSE_TRIGGER);
|
|
265
|
+
run(EVIDENCE_EFFECTS_KIND_TRIGGER);
|
|
266
|
+
for (const sql of INDEXES) {
|
|
267
|
+
run(sql);
|
|
268
|
+
}
|
|
269
|
+
run('COMMIT');
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
try {
|
|
273
|
+
run('ROLLBACK');
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// BEGIN itself may have failed (busy lock, nested transaction): keep the original error.
|
|
277
|
+
}
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
222
281
|
class EffectWithoutCauseError extends Error {
|
|
223
282
|
constructor(kind, targetId) {
|
|
224
283
|
super(`Refusing to record ${kind} on ${targetId} with no source events: a change that cannot name its cause is not an effect.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/evidence/effects.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/evidence/effects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type IssueSurface = 'gateway' | 'envelope' | 'inbox' | 'ledger' | 'budget' | 'delivery';
|
|
2
|
+
export type IssueSeverity = 'info' | 'warn' | 'error';
|
|
3
|
+
export type IssueStatus = 'open' | 'repair_requested' | 'closed';
|
|
4
|
+
export interface RecordIssueInput {
|
|
5
|
+
surface: IssueSurface;
|
|
6
|
+
/** Stable, low-cardinality. NEVER free error text: that is what makes dedupe work. */
|
|
7
|
+
signature: string;
|
|
8
|
+
severity: IssueSeverity;
|
|
9
|
+
/** Raw text; redacted and bounded before storage. */
|
|
10
|
+
error: string;
|
|
11
|
+
/** Digested before storage. */
|
|
12
|
+
sourceRef?: string;
|
|
13
|
+
ownerAgent?: string;
|
|
14
|
+
nowMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface OperationalIssue {
|
|
17
|
+
issueId: string;
|
|
18
|
+
surface: IssueSurface;
|
|
19
|
+
severity: IssueSeverity;
|
|
20
|
+
status: IssueStatus;
|
|
21
|
+
signature: string;
|
|
22
|
+
lastError: string | null;
|
|
23
|
+
occurrences: number;
|
|
24
|
+
firstSeenAt: number;
|
|
25
|
+
lastSeenAt: number;
|
|
26
|
+
}
|
|
27
|
+
export interface IssueAdapter {
|
|
28
|
+
prepare(sql: string): {
|
|
29
|
+
run(...params: unknown[]): unknown;
|
|
30
|
+
all(...params: unknown[]): unknown[];
|
|
31
|
+
get?(...params: unknown[]): unknown;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare const MAX_ISSUE_ERROR_CHARS = 2000;
|
|
35
|
+
/** Idempotent: creates the table on a bare DB, adds `occurrences` to an installed one. */
|
|
36
|
+
export declare function ensureOperationalIssuesTable(db: IssueAdapter): void;
|
|
37
|
+
/** Redaction gate, fail closed: a non-clean scan stores none of the original characters. */
|
|
38
|
+
export declare function redactIssueError(raw: string): string;
|
|
39
|
+
export declare function issueDedupeKey(surface: string, signature: string): string;
|
|
40
|
+
export declare function recordOperationalIssue(db: IssueAdapter, input: RecordIssueInput): {
|
|
41
|
+
issueId: string;
|
|
42
|
+
occurrences: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Open issues: error before warn before info, then most recent, capped - ordered in SQL so an
|
|
46
|
+
* old error is never hidden behind newer info rows. `minSeverity` lets packets and the
|
|
47
|
+
* self-check turn skip designed refusals (info) while the table keeps counting them.
|
|
48
|
+
*/
|
|
49
|
+
export declare function listOpenOperationalIssues(db: IssueAdapter, limit?: number, minSeverity?: IssueSeverity): OperationalIssue[];
|
|
50
|
+
/** One issue by id, or null; the repair path checks existence before writing a bundle. */
|
|
51
|
+
export declare function getOperationalIssue(db: IssueAdapter, issueId: string): OperationalIssue | null;
|
|
52
|
+
export declare function setOperationalIssueStatus(db: IssueAdapter, issueId: string, status: IssueStatus): void;
|
|
53
|
+
/** Closing is a claim that the signature went quiet; an unknown id is an error, not a no-op. */
|
|
54
|
+
export declare function closeOperationalIssue(db: IssueAdapter, issueId: string, reason: string): void;
|
|
55
|
+
//# sourceMappingURL=operational-issues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operational-issues.d.ts","sourceRoot":"","sources":["../../src/observability/operational-issues.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC/F,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,kBAAkB,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QACpB,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;QACrC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;KACrC,CAAC;CACH;AAYD,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAmB3C,0FAA0F;AAC1F,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAcnE;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMpD;AAMD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,gBAAgB,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA0D1C;AAkBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,YAAY,EAChB,KAAK,SAAK,EACV,WAAW,GAAE,aAAsB,GAClC,gBAAgB,EAAE,CAapB;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAK9F;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,IAAI,CAON;AAED,gGAAgG;AAChG,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAK7F"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_ISSUE_ERROR_CHARS = void 0;
|
|
4
|
+
exports.ensureOperationalIssuesTable = ensureOperationalIssuesTable;
|
|
5
|
+
exports.redactIssueError = redactIssueError;
|
|
6
|
+
exports.issueDedupeKey = issueDedupeKey;
|
|
7
|
+
exports.recordOperationalIssue = recordOperationalIssue;
|
|
8
|
+
exports.listOpenOperationalIssues = listOpenOperationalIssues;
|
|
9
|
+
exports.getOperationalIssue = getOperationalIssue;
|
|
10
|
+
exports.setOperationalIssueStatus = setOperationalIssueStatus;
|
|
11
|
+
exports.closeOperationalIssue = closeOperationalIssue;
|
|
12
|
+
/**
|
|
13
|
+
* Operational issues: the system's own failures as first-class evidence.
|
|
14
|
+
*
|
|
15
|
+
* Every place a failure already passes through (gateway tool failure, envelope scope
|
|
16
|
+
* mismatch, dead owner-event batch, ledger stagnation) records one row here, aggregated
|
|
17
|
+
* by (surface, signature). Every packet carries the open rows, so the agent sees what is
|
|
18
|
+
* broken before it judges anything; the daily self-check turn triages them.
|
|
19
|
+
*
|
|
20
|
+
* Stored error text passes the secret scan first and FAILS CLOSED: a non-clean scan stores
|
|
21
|
+
* no original characters. This table is read into every prompt, which makes it a new place
|
|
22
|
+
* for credentials to land.
|
|
23
|
+
*
|
|
24
|
+
* Table: awareness_operational_issues in the mama-core database (migration 066 creates it
|
|
25
|
+
* on a fresh install; an installed table without `occurrences` gets the column here).
|
|
26
|
+
*/
|
|
27
|
+
const node_crypto_1 = require("node:crypto");
|
|
28
|
+
const secret_filter_js_1 = require("../memory/secret-filter.js");
|
|
29
|
+
const SURFACES = new Set([
|
|
30
|
+
'gateway',
|
|
31
|
+
'envelope',
|
|
32
|
+
'inbox',
|
|
33
|
+
'ledger',
|
|
34
|
+
'budget',
|
|
35
|
+
'delivery',
|
|
36
|
+
]);
|
|
37
|
+
const SEVERITIES = new Set(['info', 'warn', 'error']);
|
|
38
|
+
const SEVERITY_RANK = { error: 0, warn: 1, info: 2 };
|
|
39
|
+
exports.MAX_ISSUE_ERROR_CHARS = 2_000;
|
|
40
|
+
const MAX_SIGNATURE_CHARS = 120;
|
|
41
|
+
const TABLE_DDL = `
|
|
42
|
+
CREATE TABLE IF NOT EXISTS awareness_operational_issues (
|
|
43
|
+
issue_id TEXT PRIMARY KEY,
|
|
44
|
+
dedupe_key TEXT UNIQUE NOT NULL,
|
|
45
|
+
surface TEXT NOT NULL,
|
|
46
|
+
severity TEXT NOT NULL,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
source_delta_id TEXT,
|
|
49
|
+
first_seen_at INTEGER NOT NULL CHECK (first_seen_at >= 0),
|
|
50
|
+
last_seen_at INTEGER NOT NULL CHECK (last_seen_at >= first_seen_at),
|
|
51
|
+
next_retry_at INTEGER,
|
|
52
|
+
last_error TEXT,
|
|
53
|
+
owner_agent TEXT,
|
|
54
|
+
occurrences INTEGER NOT NULL DEFAULT 1
|
|
55
|
+
)`;
|
|
56
|
+
/** Idempotent: creates the table on a bare DB, adds `occurrences` to an installed one. */
|
|
57
|
+
function ensureOperationalIssuesTable(db) {
|
|
58
|
+
db.prepare(TABLE_DDL).run();
|
|
59
|
+
const columns = db.prepare('PRAGMA table_info(awareness_operational_issues)').all();
|
|
60
|
+
if (!columns.some((column) => column.name === 'occurrences')) {
|
|
61
|
+
db.prepare('ALTER TABLE awareness_operational_issues ADD COLUMN occurrences INTEGER NOT NULL DEFAULT 1').run();
|
|
62
|
+
}
|
|
63
|
+
db.prepare(`CREATE INDEX IF NOT EXISTS idx_awareness_operational_issues_status_seen
|
|
64
|
+
ON awareness_operational_issues(status, last_seen_at DESC)`).run();
|
|
65
|
+
}
|
|
66
|
+
/** Redaction gate, fail closed: a non-clean scan stores none of the original characters. */
|
|
67
|
+
function redactIssueError(raw) {
|
|
68
|
+
const scan = (0, secret_filter_js_1.scanForSecrets)(raw);
|
|
69
|
+
if (!scan.clean) {
|
|
70
|
+
return `[redacted: ${scan.matches.join(',')}]`;
|
|
71
|
+
}
|
|
72
|
+
return raw.replace(/\s+/g, ' ').trim().slice(0, exports.MAX_ISSUE_ERROR_CHARS);
|
|
73
|
+
}
|
|
74
|
+
function digest(value) {
|
|
75
|
+
return `sha256:${(0, node_crypto_1.createHash)('sha256').update(value).digest('hex').slice(0, 24)}`;
|
|
76
|
+
}
|
|
77
|
+
function issueDedupeKey(surface, signature) {
|
|
78
|
+
return (0, node_crypto_1.createHash)('sha256').update(`${surface}\0${signature}`).digest('hex');
|
|
79
|
+
}
|
|
80
|
+
function recordOperationalIssue(db, input) {
|
|
81
|
+
if (!SURFACES.has(input.surface)) {
|
|
82
|
+
throw new Error(`operational issue: unknown surface ${String(input.surface)}`);
|
|
83
|
+
}
|
|
84
|
+
if (!SEVERITIES.has(input.severity)) {
|
|
85
|
+
throw new Error(`operational issue: unknown severity ${String(input.severity)}`);
|
|
86
|
+
}
|
|
87
|
+
const signature = input.signature.replace(/\s+/g, ' ').trim().slice(0, MAX_SIGNATURE_CHARS);
|
|
88
|
+
if (!signature) {
|
|
89
|
+
throw new Error('operational issue: signature is required');
|
|
90
|
+
}
|
|
91
|
+
const now = input.nowMs ?? Date.now();
|
|
92
|
+
const dedupeKey = issueDedupeKey(input.surface, signature);
|
|
93
|
+
const lastError = redactIssueError(input.error);
|
|
94
|
+
const sourceRef = input.sourceRef ? digest(input.sourceRef) : null;
|
|
95
|
+
const existing = db
|
|
96
|
+
.prepare(`SELECT issue_id, occurrences, status FROM awareness_operational_issues WHERE dedupe_key = ?`)
|
|
97
|
+
.all(dedupeKey);
|
|
98
|
+
if (existing.length > 0) {
|
|
99
|
+
const row = existing[0];
|
|
100
|
+
// A closed issue that recurs reopens: closure was a claim about the signature going quiet.
|
|
101
|
+
db.prepare(`UPDATE awareness_operational_issues
|
|
102
|
+
SET last_seen_at = MAX(last_seen_at, ?), occurrences = occurrences + 1,
|
|
103
|
+
last_error = ?, severity = ?, source_delta_id = COALESCE(?, source_delta_id),
|
|
104
|
+
owner_agent = COALESCE(?, owner_agent),
|
|
105
|
+
status = CASE WHEN status = 'closed' THEN 'open' ELSE status END
|
|
106
|
+
WHERE dedupe_key = ?`).run(now, `${signature} | ${lastError}`, input.severity, sourceRef, input.ownerAgent ?? null, dedupeKey);
|
|
107
|
+
return { issueId: row.issue_id, occurrences: row.occurrences + 1 };
|
|
108
|
+
}
|
|
109
|
+
const issueId = `iss_${dedupeKey.slice(0, 16)}`;
|
|
110
|
+
db.prepare(`INSERT INTO awareness_operational_issues
|
|
111
|
+
(issue_id, dedupe_key, surface, severity, status, source_delta_id, first_seen_at,
|
|
112
|
+
last_seen_at, next_retry_at, last_error, owner_agent, occurrences)
|
|
113
|
+
VALUES (?, ?, ?, ?, 'open', ?, ?, ?, NULL, ?, ?, 1)`).run(issueId, dedupeKey, input.surface, input.severity, sourceRef, now, now, `${signature} | ${lastError}`, input.ownerAgent ?? null);
|
|
114
|
+
return { issueId, occurrences: 1 };
|
|
115
|
+
}
|
|
116
|
+
function rowToIssue(row) {
|
|
117
|
+
const stored = typeof row.last_error === 'string' ? row.last_error : '';
|
|
118
|
+
const separator = stored.indexOf(' | ');
|
|
119
|
+
return {
|
|
120
|
+
issueId: String(row.issue_id),
|
|
121
|
+
surface: String(row.surface),
|
|
122
|
+
severity: String(row.severity),
|
|
123
|
+
status: String(row.status),
|
|
124
|
+
signature: separator > 0 ? stored.slice(0, separator) : stored,
|
|
125
|
+
lastError: separator > 0 ? stored.slice(separator + 3) : stored || null,
|
|
126
|
+
occurrences: Number(row.occurrences ?? 1),
|
|
127
|
+
firstSeenAt: Number(row.first_seen_at),
|
|
128
|
+
lastSeenAt: Number(row.last_seen_at),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Open issues: error before warn before info, then most recent, capped - ordered in SQL so an
|
|
133
|
+
* old error is never hidden behind newer info rows. `minSeverity` lets packets and the
|
|
134
|
+
* self-check turn skip designed refusals (info) while the table keeps counting them.
|
|
135
|
+
*/
|
|
136
|
+
function listOpenOperationalIssues(db, limit = 20, minSeverity = 'info') {
|
|
137
|
+
const maxRank = SEVERITY_RANK[minSeverity] ?? 2;
|
|
138
|
+
const rows = db
|
|
139
|
+
.prepare(`SELECT * FROM awareness_operational_issues
|
|
140
|
+
WHERE status <> 'closed'
|
|
141
|
+
AND (CASE severity WHEN 'error' THEN 0 WHEN 'warn' THEN 1 ELSE 2 END) <= ?
|
|
142
|
+
ORDER BY (CASE severity WHEN 'error' THEN 0 WHEN 'warn' THEN 1 ELSE 2 END) ASC,
|
|
143
|
+
last_seen_at DESC
|
|
144
|
+
LIMIT ?`)
|
|
145
|
+
.all(maxRank, Math.min(Math.max(limit, 1), 200));
|
|
146
|
+
return rows.map(rowToIssue);
|
|
147
|
+
}
|
|
148
|
+
/** One issue by id, or null; the repair path checks existence before writing a bundle. */
|
|
149
|
+
function getOperationalIssue(db, issueId) {
|
|
150
|
+
const rows = db
|
|
151
|
+
.prepare(`SELECT * FROM awareness_operational_issues WHERE issue_id = ?`)
|
|
152
|
+
.all(issueId);
|
|
153
|
+
return rows.length > 0 ? rowToIssue(rows[0]) : null;
|
|
154
|
+
}
|
|
155
|
+
function setOperationalIssueStatus(db, issueId, status) {
|
|
156
|
+
const result = db
|
|
157
|
+
.prepare(`UPDATE awareness_operational_issues SET status = ? WHERE issue_id = ?`)
|
|
158
|
+
.run(status, issueId);
|
|
159
|
+
if (!result || result.changes !== 1) {
|
|
160
|
+
throw new Error(`operational issue not found: ${issueId}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Closing is a claim that the signature went quiet; an unknown id is an error, not a no-op. */
|
|
164
|
+
function closeOperationalIssue(db, issueId, reason) {
|
|
165
|
+
if (!reason.trim()) {
|
|
166
|
+
throw new Error('operational issue: a close reason is required');
|
|
167
|
+
}
|
|
168
|
+
setOperationalIssueStatus(db, issueId, 'closed');
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=operational-issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operational-issues.js","sourceRoot":"","sources":["../../src/observability/operational-issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type ExportFormat = 'csv' | 'md';
|
|
2
|
+
export interface ExportFileInput {
|
|
3
|
+
format: ExportFormat;
|
|
4
|
+
name: string;
|
|
5
|
+
columns?: string[];
|
|
6
|
+
rows?: Array<Record<string, string | number | null>>;
|
|
7
|
+
content?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ExportFileResult {
|
|
10
|
+
path: string;
|
|
11
|
+
bytes: number;
|
|
12
|
+
sha256: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const EXPORT_DIR_NAME = "exports";
|
|
15
|
+
/** The one place the exports root is computed. Mirrors owner-event-effects.ts (MAMA_WORKSPACE). */
|
|
16
|
+
export declare function resolveExportRoot(env?: NodeJS.ProcessEnv): string;
|
|
17
|
+
/** Safe basename: ascii letters, digits and dashes; everything else (including path parts) collapses. */
|
|
18
|
+
export declare function slugExportName(name: string): string;
|
|
19
|
+
export declare function renderCsv(rows: Array<Record<string, string | number | null>>, columns?: string[]): string;
|
|
20
|
+
/** Pure apart from the write. Never overwrites; never escapes the root. */
|
|
21
|
+
export declare function exportFile(input: ExportFileInput, root: string, nowMs?: number): Promise<ExportFileResult>;
|
|
22
|
+
//# sourceMappingURL=file-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-export.d.ts","sourceRoot":"","sources":["../../src/operator/file-export.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,YAAY,CAAC;AAIzC,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAG9E;AAED,yGAAyG;AACzG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAiBD,wBAAgB,SAAS,CACvB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,EACnD,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,MAAM,CAQR;AASD,2EAA2E;AAC3E,wBAAsB,UAAU,CAC9B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CA2C3B"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EXPORT_DIR_NAME = void 0;
|
|
4
|
+
exports.resolveExportRoot = resolveExportRoot;
|
|
5
|
+
exports.slugExportName = slugExportName;
|
|
6
|
+
exports.renderCsv = renderCsv;
|
|
7
|
+
exports.exportFile = exportFile;
|
|
8
|
+
/**
|
|
9
|
+
* file_export: the smallest path from "make me a file" to a file the owner can receive.
|
|
10
|
+
*
|
|
11
|
+
* Writes only under the private workspace exports root (the same root telegram_send and
|
|
12
|
+
* drive_upload accept through resolvePrivateWorkspaceFile), never overwrites (wx flag),
|
|
13
|
+
* never escapes the root, and returns the bytes and sha256 the executor records as an
|
|
14
|
+
* effect. csv and md ship first: both need no dependency and both open where the owner
|
|
15
|
+
* works. Formula-leading cells are neutralised because the owner opens the csv in Excel.
|
|
16
|
+
*/
|
|
17
|
+
const node_crypto_1 = require("node:crypto");
|
|
18
|
+
const node_fs_1 = require("node:fs");
|
|
19
|
+
const node_os_1 = require("node:os");
|
|
20
|
+
const node_path_1 = require("node:path");
|
|
21
|
+
exports.EXPORT_DIR_NAME = 'exports';
|
|
22
|
+
const MAX_ROWS = 5_000;
|
|
23
|
+
const MAX_BYTES = 8 * 1024 * 1024;
|
|
24
|
+
/** The one place the exports root is computed. Mirrors owner-event-effects.ts (MAMA_WORKSPACE). */
|
|
25
|
+
function resolveExportRoot(env = process.env) {
|
|
26
|
+
const workspace = (0, node_path_1.resolve)(env.MAMA_WORKSPACE || (0, node_path_1.join)((0, node_os_1.homedir)(), '.mama', 'workspace'));
|
|
27
|
+
return (0, node_path_1.join)(workspace, exports.EXPORT_DIR_NAME);
|
|
28
|
+
}
|
|
29
|
+
/** Safe basename: ascii letters, digits and dashes; everything else (including path parts) collapses. */
|
|
30
|
+
function slugExportName(name) {
|
|
31
|
+
const slug = name
|
|
32
|
+
.normalize('NFKD')
|
|
33
|
+
.replace(/[^\x20-\x7e]/g, '')
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
36
|
+
.replace(/^-+|-+$/g, '')
|
|
37
|
+
.slice(0, 60);
|
|
38
|
+
return slug || 'export';
|
|
39
|
+
}
|
|
40
|
+
function csvCell(value) {
|
|
41
|
+
if (value === null || value === undefined) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
let text = String(value);
|
|
45
|
+
// A leading =, +, -, @ (or a tab/CR) is a formula to a spreadsheet: prefix an apostrophe.
|
|
46
|
+
if (/^[=+\-@\t\r]/.test(text)) {
|
|
47
|
+
text = `'${text}`;
|
|
48
|
+
}
|
|
49
|
+
if (/[",\r\n]/.test(text)) {
|
|
50
|
+
return `"${text.replace(/"/g, '""')}"`;
|
|
51
|
+
}
|
|
52
|
+
return text;
|
|
53
|
+
}
|
|
54
|
+
function renderCsv(rows, columns) {
|
|
55
|
+
const header = columns && columns.length > 0 ? columns : [...new Set(rows.flatMap((row) => Object.keys(row)))];
|
|
56
|
+
const lines = [header.map(csvCell).join(',')];
|
|
57
|
+
for (const row of rows) {
|
|
58
|
+
lines.push(header.map((column) => csvCell(row[column] ?? null)).join(','));
|
|
59
|
+
}
|
|
60
|
+
return `${lines.join('\r\n')}\r\n`;
|
|
61
|
+
}
|
|
62
|
+
function timestampSuffix(nowMs) {
|
|
63
|
+
return new Date(nowMs)
|
|
64
|
+
.toISOString()
|
|
65
|
+
.replace(/[-:]/g, '')
|
|
66
|
+
.replace(/\.\d{3}Z$/, 'Z');
|
|
67
|
+
}
|
|
68
|
+
/** Pure apart from the write. Never overwrites; never escapes the root. */
|
|
69
|
+
async function exportFile(input, root, nowMs = Date.now()) {
|
|
70
|
+
if (input.format !== 'csv' && input.format !== 'md') {
|
|
71
|
+
throw new Error(`file_export: unsupported format ${String(input.format)}`);
|
|
72
|
+
}
|
|
73
|
+
let body;
|
|
74
|
+
if (input.format === 'csv') {
|
|
75
|
+
if (!Array.isArray(input.rows)) {
|
|
76
|
+
throw new Error('file_export: csv requires rows');
|
|
77
|
+
}
|
|
78
|
+
if (input.rows.length > MAX_ROWS) {
|
|
79
|
+
throw new Error(`file_export: csv rows exceed ${MAX_ROWS}`);
|
|
80
|
+
}
|
|
81
|
+
body = renderCsv(input.rows, input.columns);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (typeof input.content !== 'string' || input.content.trim() === '') {
|
|
85
|
+
throw new Error('file_export: md requires content');
|
|
86
|
+
}
|
|
87
|
+
body = input.content.endsWith('\n') ? input.content : `${input.content}\n`;
|
|
88
|
+
}
|
|
89
|
+
const bytes = Buffer.byteLength(body, 'utf-8');
|
|
90
|
+
if (bytes > MAX_BYTES) {
|
|
91
|
+
throw new Error(`file_export: ${bytes} bytes exceeds ${MAX_BYTES}`);
|
|
92
|
+
}
|
|
93
|
+
const realRoot = (0, node_path_1.resolve)(root);
|
|
94
|
+
(0, node_fs_1.mkdirSync)(realRoot, { recursive: true });
|
|
95
|
+
const base = `${slugExportName(input.name)}-${timestampSuffix(nowMs)}`;
|
|
96
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
97
|
+
const fileName = `${base}${attempt === 0 ? '' : `-${attempt}`}.${input.format}`;
|
|
98
|
+
const path = (0, node_path_1.resolve)(realRoot, fileName);
|
|
99
|
+
if (path !== realRoot && !path.startsWith(`${realRoot}${node_path_1.sep}`)) {
|
|
100
|
+
throw new Error(`file_export: refusing to write outside ${realRoot}`);
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
(0, node_fs_1.writeFileSync)(path, body, { encoding: 'utf-8', flag: 'wx' });
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error.code === 'EEXIST') {
|
|
107
|
+
continue; // never overwrite: same second, same name -> counter
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
return { path, bytes, sha256: (0, node_crypto_1.createHash)('sha256').update(body).digest('hex') };
|
|
112
|
+
}
|
|
113
|
+
throw new Error('file_export: could not find a free file name');
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=file-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-export.js","sourceRoot":"","sources":["../../src/operator/file-export.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ interface OwnerEventRunner {
|
|
|
21
21
|
}): Promise<{
|
|
22
22
|
response: string;
|
|
23
23
|
history: OwnerEventHistoryMessage[];
|
|
24
|
+
stoppedBy?: 'budget';
|
|
24
25
|
}>;
|
|
25
26
|
}
|
|
26
27
|
export interface OwnerEventLoopDeps {
|
|
@@ -35,6 +36,11 @@ export interface OwnerEventLoopDeps {
|
|
|
35
36
|
getTerminalReceipt?: (batch: OwnerEventBatch) => OwnerEventTerminalReceipt | null;
|
|
36
37
|
recordTriggerOutcome?: (triggerId: string, outcome: 'succeeded' | 'failed') => void;
|
|
37
38
|
onDead?: (message: string) => void | Promise<void>;
|
|
39
|
+
/** Failures become evidence: called once per dead batch with a stable signature. */
|
|
40
|
+
recordIssue?: (input: {
|
|
41
|
+
channelKey: string;
|
|
42
|
+
reason: string;
|
|
43
|
+
}) => void;
|
|
38
44
|
log: (line: string) => void;
|
|
39
45
|
leaseMs?: number;
|
|
40
46
|
maxBatchesPerTick?: number;
|
|
@@ -1 +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,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAExF,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,YAAY,EAAE,IAAI,CAAC;QACnB,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;
|
|
1
|
+
{"version":3,"file":"owner-event-loop.d.ts","sourceRoot":"","sources":["../../src/operator/owner-event-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,10 +77,15 @@ class OwnerEventLoop {
|
|
|
77
77
|
sourceMessageRef: `owner-event:${batch.id}`,
|
|
78
78
|
ownerEventEffects: (0, owner_event_effects_js_1.buildOwnerEventEffectAuthority)(batch),
|
|
79
79
|
});
|
|
80
|
-
const
|
|
80
|
+
const classified = (0, owner_event_outcome_js_1.classifyOwnerEventOutcome)({
|
|
81
81
|
history: result.history,
|
|
82
82
|
noUpdateRecorded: this.deps.getNoUpdateMaxId(scope) > noUpdateBefore,
|
|
83
83
|
});
|
|
84
|
+
// A budget stop is a host decision, not a model failure: the batch stays
|
|
85
|
+
// retryable with a named reason unless the run already changed the ledger.
|
|
86
|
+
const outcome = result.stoppedBy === 'budget' && classified.status !== 'acted'
|
|
87
|
+
? { status: 'retry', tools: [], reason: 'run stopped on its token budget' }
|
|
88
|
+
: classified;
|
|
84
89
|
if (outcome.status === 'retry') {
|
|
85
90
|
const recoveredAfterRun = this.deps.getTerminalReceipt?.(batch) ?? null;
|
|
86
91
|
if (recoveredAfterRun) {
|
|
@@ -149,6 +154,12 @@ class OwnerEventLoop {
|
|
|
149
154
|
this.deps.log(`[owner-event] batch ${batch.id} ${receipt.status} ${reason}${receipt.tools.length > 0 ? ` via ${receipt.tools.join(',')}` : ''}`);
|
|
150
155
|
}
|
|
151
156
|
async notifyDead(batch, reason) {
|
|
157
|
+
try {
|
|
158
|
+
this.deps.recordIssue?.({ channelKey: batch.channelKey, reason });
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
this.deps.log(`[owner-event] dead-batch issue record failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
162
|
+
}
|
|
152
163
|
if (!this.deps.onDead)
|
|
153
164
|
return;
|
|
154
165
|
const message = `MAMA owner-event batch ${batch.id} (${batch.channelKey}) is dead: ${reason}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-event-loop.js","sourceRoot":"","sources":["../../src/operator/owner-event-loop.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"owner-event-loop.js","sourceRoot":"","sources":["../../src/operator/owner-event-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-event-policy.d.ts","sourceRoot":"","sources":["../../src/operator/owner-event-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"owner-event-policy.d.ts","sourceRoot":"","sources":["../../src/operator/owner-event-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAkCxF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAIzD;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,UAAU,CAAC;IACtB,sBAAsB,EAAE,sBAAsB,CAAC;CAChD,GAAG,YAAY,CA2Bf"}
|
|
@@ -21,6 +21,10 @@ const OWNER_EVENT_BLOCKED_TOOLS = new Set([
|
|
|
21
21
|
'console_brief_update',
|
|
22
22
|
// fire-and-forget into another model turn = a second judgment surface
|
|
23
23
|
'report_request',
|
|
24
|
+
// the workspace shell and file writer are owner-conversation tools: an event turn is
|
|
25
|
+
// driven by untrusted connector text, and a shell would make that text a command
|
|
26
|
+
'Bash',
|
|
27
|
+
'Write',
|
|
24
28
|
// not in the completion set (owner-event-outcome.ts) and not receipted anywhere the
|
|
25
29
|
// crash-recovery resolver can read: `obsidian` covers reads as well as writes, and
|
|
26
30
|
// drive_translate_conti uploads outside the owner-event effect ledger, so a retry
|