@mce-bt/microagents-memory 0.17.0 → 0.19.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/index.d.ts CHANGED
@@ -9,5 +9,6 @@ export { createMemoryTools, DUPLICATE_NOOP_THRESHOLD, DUPLICATE_HINT_THRESHOLD,
9
9
  export { SummarizationPipeline, type SummarizationPipelineConfig, type PipelineResult, } from './summarization-pipeline.js';
10
10
  export { RedisSessionStore, RedisChannelSessionStore, RedisSchedulerStateStore, IoredisLockClient, createRedisStateStores, type RedisStateConfig, type RedisStateStores, } from './redis-state.js';
11
11
  export { PostgresJobStore, type PostgresJobStoreConfig } from './job-store-postgres.js';
12
+ export { PostgresWorkStore, type PostgresWorkStoreConfig } from './work-store-postgres.js';
12
13
  export { PostgresArtifactStore, MAX_ARTIFACT_BYTES, MAX_ARTIFACTS_PER_SCOPE, type PostgresArtifactStoreConfig, } from './artifact-store.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,2BAA2B,GACjC,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,KAAK,cAAc,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,2BAA2B,GACjC,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -9,5 +9,6 @@ export { createMemoryTools, DUPLICATE_NOOP_THRESHOLD, DUPLICATE_HINT_THRESHOLD,
9
9
  export { SummarizationPipeline, } from './summarization-pipeline.js';
10
10
  export { RedisSessionStore, RedisChannelSessionStore, RedisSchedulerStateStore, IoredisLockClient, createRedisStateStores, } from './redis-state.js';
11
11
  export { PostgresJobStore } from './job-store-postgres.js';
12
+ export { PostgresWorkStore } from './work-store-postgres.js';
12
13
  export { PostgresArtifactStore, MAX_ARTIFACT_BYTES, MAX_ARTIFACTS_PER_SCOPE, } from './artifact-store.js';
13
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAuC,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAsC,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,aAAa,GAId,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,GAYf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,uBAAuB,GAMxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,GAGtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAA+B,MAAM,yBAAyB,CAAC;AACxF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAuC,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAsC,MAAM,UAAU,CAAC;AAC9E,OAAO,EACL,aAAa,GAId,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,GAYf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,uBAAuB,GAMxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,GAGtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAA+B,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAgC,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { CreateWorkInput, WorkActivityKind, WorkItem, WorkStatus, WorkStore } from '@mce-bt/microagents-core';
2
+ /**
3
+ * Postgres-backed durable work store — the agent/human coordination bus behind
4
+ * the work tools (see core/work-tools.ts for the model and the enforcement
5
+ * doctrine). Same conventions as the other stores here: lazy CREATE TABLE at
6
+ * start, a namespace column (tenant slug) as the isolation boundary, and
7
+ * unqualified table names (the host's search_path decides the schema).
8
+ *
9
+ * Everything that keeps `working` truthful is deterministic SQL in this file:
10
+ * atomic claiming with one-lease-at-a-time, session-bound resolution,
11
+ * run-end release (releaseSessionClaims), lease expiry for killed processes
12
+ * (expireLeases, also on a plain 5-minute timer), and escalation of the third
13
+ * unresolved attempt into a human_review item. None of it consults a model
14
+ * and none of it is configurable.
15
+ */
16
+ export interface PostgresWorkStoreConfig {
17
+ connectionString: string;
18
+ namespace?: string;
19
+ /** Grace after due_at before an untouched submitted item flips stale. */
20
+ staleAfterMs?: number;
21
+ }
22
+ export declare class PostgresWorkStore implements WorkStore {
23
+ private readonly config;
24
+ private pool;
25
+ private readonly namespace;
26
+ private readonly staleAfterMs;
27
+ private sweepTimer;
28
+ constructor(config: PostgresWorkStoreConfig);
29
+ start(): Promise<void>;
30
+ stop(): Promise<void>;
31
+ private db;
32
+ private ensureSchema;
33
+ create(input: CreateWorkInput): Promise<{
34
+ item: WorkItem;
35
+ duplicate: boolean;
36
+ }>;
37
+ get(namespace: string, id: string): Promise<WorkItem | null>;
38
+ listFor(namespace: string, assignee: string, statuses: WorkStatus[], limit: number): Promise<WorkItem[]>;
39
+ countOpen(namespace: string, assignee: string): Promise<number>;
40
+ countDeferred(namespace: string, assignee: string): Promise<number>;
41
+ claim(namespace: string, id: string, assignee: string, sessionId: string): Promise<{
42
+ item?: WorkItem;
43
+ error?: string;
44
+ }>;
45
+ /**
46
+ * Session-bound transition out of `working`. All three resolution paths and
47
+ * the release paths funnel through claimed_by_session = the caller's run —
48
+ * strict same-run resolution is a WHERE clause, not a convention.
49
+ */
50
+ private resolveClaimed;
51
+ complete(namespace: string, id: string, sessionId: string, result: string, artifactRefs?: string[]): Promise<{
52
+ item?: WorkItem;
53
+ error?: string;
54
+ }>;
55
+ fail(namespace: string, id: string, sessionId: string, reason: string): Promise<{
56
+ item?: WorkItem;
57
+ escalated?: boolean;
58
+ error?: string;
59
+ }>;
60
+ reject(namespace: string, id: string, assignee: string, sessionId: string | undefined, reason: string): Promise<{
61
+ item?: WorkItem;
62
+ error?: string;
63
+ }>;
64
+ needInput(namespace: string, id: string, sessionId: string, question: string): Promise<{
65
+ item?: WorkItem;
66
+ error?: string;
67
+ }>;
68
+ addActivity(namespace: string, id: string, actor: string, kind: WorkActivityKind, text: string): Promise<boolean>;
69
+ releaseSessionClaims(sessionId: string): Promise<number>;
70
+ expireLeases(): Promise<number>;
71
+ /**
72
+ * The one release transition both zombie paths share: back to the queue
73
+ * with the attempt counted, or — on the third strike — terminal `failed`
74
+ * plus a human_review escalation for the owner.
75
+ */
76
+ private release;
77
+ staleSweep(namespace: string): Promise<number>;
78
+ markReminded(namespace: string, id: string): Promise<void>;
79
+ markAssisted(namespace: string, id: string): Promise<void>;
80
+ /** Deterministic escalation sink: one human_review item per escalated item. */
81
+ private escalate;
82
+ }
83
+ //# sourceMappingURL=work-store-postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-store-postgres.d.ts","sourceRoot":"","sources":["../src/work-store-postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,417 @@
1
+ import pkg from 'pg';
2
+ const { Pool } = pkg;
3
+ import { OPEN_WORK_STATUSES, WORK_LEASE_MS } from '@mce-bt/microagents-core';
4
+ const ESCALATION_ATTEMPTS = 3;
5
+ const ACTIVITY_CAP = 50;
6
+ const SWEEP_INTERVAL_MS = 5 * 60_000;
7
+ const COLUMNS = `id, namespace, created_by, owner, assignee, title, description, type, metadata,
8
+ context_ref, follows_ref, expected_output, status, priority, due_at, not_before,
9
+ attempts, dedup_key, claimed_at, claimed_by_session, lease_until, result,
10
+ artifact_refs, activity, last_reminded_at, assisted_at, created_at, updated_at`;
11
+ /**
12
+ * A submitted row gated behind not_before is not actionable: my_work hides it
13
+ * and claim refuses it. Deferral is a column, not a judgment call.
14
+ */
15
+ const ELIGIBLE = `(not_before IS NULL OR not_before <= NOW())`;
16
+ /**
17
+ * Append one activity entry (a jsonb array parameter), dropping the oldest
18
+ * entry once the cap is reached so the row cannot grow without bound.
19
+ */
20
+ function appendActivity(param) {
21
+ return `CASE WHEN jsonb_array_length(activity) >= ${ACTIVITY_CAP}
22
+ THEN (activity - 0) || ${param}::jsonb
23
+ ELSE activity || ${param}::jsonb END`;
24
+ }
25
+ function entry(actor, kind, text) {
26
+ return JSON.stringify([{ at: new Date().toISOString(), actor, kind, text }]);
27
+ }
28
+ function rowToItem(r) {
29
+ return {
30
+ id: r.id,
31
+ namespace: r.namespace,
32
+ createdBy: r.created_by,
33
+ owner: r.owner,
34
+ assignee: r.assignee,
35
+ title: r.title,
36
+ description: r.description ?? null,
37
+ type: r.type,
38
+ metadata: r.metadata ?? {},
39
+ contextRef: r.context_ref ?? null,
40
+ followsRef: r.follows_ref ?? null,
41
+ expectedOutput: r.expected_output ?? null,
42
+ status: r.status,
43
+ priority: r.priority,
44
+ dueAt: r.due_at ? new Date(r.due_at) : null,
45
+ notBefore: r.not_before ? new Date(r.not_before) : null,
46
+ attempts: Number(r.attempts),
47
+ dedupKey: r.dedup_key ?? null,
48
+ claimedAt: r.claimed_at ? new Date(r.claimed_at) : null,
49
+ claimedBySession: r.claimed_by_session ?? null,
50
+ leaseUntil: r.lease_until ? new Date(r.lease_until) : null,
51
+ result: r.result ?? null,
52
+ artifactRefs: r.artifact_refs ?? [],
53
+ activity: r.activity ?? [],
54
+ lastRemindedAt: r.last_reminded_at ? new Date(r.last_reminded_at) : null,
55
+ assistedAt: r.assisted_at ? new Date(r.assisted_at) : null,
56
+ createdAt: new Date(r.created_at),
57
+ updatedAt: new Date(r.updated_at),
58
+ };
59
+ }
60
+ export class PostgresWorkStore {
61
+ config;
62
+ pool = null;
63
+ namespace;
64
+ staleAfterMs;
65
+ sweepTimer = null;
66
+ constructor(config) {
67
+ this.config = config;
68
+ this.namespace = config.namespace ?? 'default';
69
+ this.staleAfterMs = config.staleAfterMs ?? 7_200_000;
70
+ }
71
+ async start() {
72
+ this.pool = new Pool({ connectionString: this.config.connectionString });
73
+ await this.ensureSchema();
74
+ // Crash insurance runs on wall-clock, not on model goodwill: every store
75
+ // instance sweeps its own tenant; the SQL is idempotent across replicas.
76
+ this.sweepTimer = setInterval(() => {
77
+ void this.expireLeases().catch(() => { });
78
+ void this.staleSweep(this.namespace).catch(() => { });
79
+ }, SWEEP_INTERVAL_MS);
80
+ this.sweepTimer.unref?.();
81
+ }
82
+ async stop() {
83
+ if (this.sweepTimer) {
84
+ clearInterval(this.sweepTimer);
85
+ this.sweepTimer = null;
86
+ }
87
+ if (this.pool) {
88
+ await this.pool.end();
89
+ this.pool = null;
90
+ }
91
+ }
92
+ db() {
93
+ if (!this.pool)
94
+ throw new Error('PostgresWorkStore not started');
95
+ return this.pool;
96
+ }
97
+ async ensureSchema() {
98
+ await this.db().query(`
99
+ CREATE TABLE IF NOT EXISTS agent_work_items (
100
+ id TEXT PRIMARY KEY,
101
+ namespace TEXT NOT NULL DEFAULT 'default',
102
+ created_by TEXT NOT NULL,
103
+ owner TEXT NOT NULL,
104
+ assignee TEXT NOT NULL,
105
+ title TEXT NOT NULL,
106
+ description TEXT,
107
+ type TEXT NOT NULL DEFAULT 'action',
108
+ metadata JSONB NOT NULL DEFAULT '{}',
109
+ context_ref TEXT,
110
+ follows_ref TEXT,
111
+ expected_output TEXT,
112
+ status TEXT NOT NULL DEFAULT 'submitted'
113
+ CHECK (status IN ('submitted','working','input_required','completed','failed','canceled','rejected','stale')),
114
+ priority TEXT NOT NULL DEFAULT 'normal'
115
+ CHECK (priority IN ('urgent','high','normal','low')),
116
+ due_at TIMESTAMPTZ,
117
+ attempts INT NOT NULL DEFAULT 0,
118
+ dedup_key TEXT,
119
+ claimed_at TIMESTAMPTZ,
120
+ claimed_by_session TEXT,
121
+ lease_until TIMESTAMPTZ,
122
+ result TEXT,
123
+ artifact_refs TEXT[] NOT NULL DEFAULT '{}',
124
+ activity JSONB NOT NULL DEFAULT '[]',
125
+ last_reminded_at TIMESTAMPTZ,
126
+ assisted_at TIMESTAMPTZ,
127
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
128
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
129
+ );
130
+ CREATE INDEX IF NOT EXISTS idx_work_assignee
131
+ ON agent_work_items (namespace, assignee, status);
132
+ CREATE INDEX IF NOT EXISTS idx_work_due
133
+ ON agent_work_items (namespace, status, due_at);
134
+ CREATE INDEX IF NOT EXISTS idx_work_session
135
+ ON agent_work_items (claimed_by_session) WHERE status = 'working';
136
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_work_dedup
137
+ ON agent_work_items (namespace, dedup_key)
138
+ WHERE dedup_key IS NOT NULL AND status IN ('submitted','working','input_required');
139
+ ALTER TABLE agent_work_items ADD COLUMN IF NOT EXISTS not_before TIMESTAMPTZ;
140
+ `);
141
+ }
142
+ async create(input) {
143
+ const id = `wk-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
144
+ try {
145
+ const { rows } = await this.db().query(`INSERT INTO agent_work_items
146
+ (id, namespace, created_by, owner, assignee, title, description, type, metadata,
147
+ context_ref, follows_ref, expected_output, priority, due_at, not_before, dedup_key, activity)
148
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17)
149
+ RETURNING ${COLUMNS}`, [
150
+ id,
151
+ input.namespace,
152
+ input.createdBy,
153
+ input.owner,
154
+ input.assignee,
155
+ input.title,
156
+ input.description ?? null,
157
+ input.type ?? 'action',
158
+ JSON.stringify(input.metadata ?? {}),
159
+ input.contextRef ?? null,
160
+ input.followsRef ?? null,
161
+ input.expectedOutput ?? null,
162
+ input.priority ?? 'normal',
163
+ input.dueAt ?? null,
164
+ input.notBefore ?? null,
165
+ input.dedupKey ?? null,
166
+ entry(input.createdBy, 'status', `created for ${input.assignee}`),
167
+ ]);
168
+ return {
169
+ item: rowToItem(rows[0]),
170
+ duplicate: false,
171
+ };
172
+ }
173
+ catch (err) {
174
+ if (err.code === '23505' && input.dedupKey) {
175
+ const { rows } = await this.db().query(`SELECT ${COLUMNS} FROM agent_work_items
176
+ WHERE namespace = $1 AND dedup_key = $2 AND status = ANY($3)
177
+ LIMIT 1`, [input.namespace, input.dedupKey, OPEN_WORK_STATUSES]);
178
+ if (rows[0])
179
+ return {
180
+ item: rowToItem(rows[0]),
181
+ duplicate: true,
182
+ };
183
+ }
184
+ throw err;
185
+ }
186
+ }
187
+ async get(namespace, id) {
188
+ const { rows } = await this.db().query(`SELECT ${COLUMNS} FROM agent_work_items WHERE namespace = $1 AND id = $2`, [namespace, id]);
189
+ return rows[0] ? rowToItem(rows[0]) : null;
190
+ }
191
+ async listFor(namespace, assignee, statuses, limit) {
192
+ const { rows } = await this.db().query(`SELECT ${COLUMNS} FROM agent_work_items
193
+ WHERE namespace = $1 AND assignee = $2 AND status = ANY($3)
194
+ AND (status <> 'submitted' OR ${ELIGIBLE})
195
+ ORDER BY CASE priority WHEN 'urgent' THEN 0 WHEN 'high' THEN 1 WHEN 'normal' THEN 2 ELSE 3 END,
196
+ due_at ASC NULLS LAST, created_at ASC
197
+ LIMIT $4`, [namespace, assignee, statuses, limit]);
198
+ return rows.map((r) => rowToItem(r));
199
+ }
200
+ async countOpen(namespace, assignee) {
201
+ const { rows } = await this.db().query(`SELECT COUNT(*)::int AS n FROM agent_work_items
202
+ WHERE namespace = $1 AND assignee = $2 AND status = ANY($3)`, [namespace, assignee, OPEN_WORK_STATUSES]);
203
+ return rows[0].n;
204
+ }
205
+ async countDeferred(namespace, assignee) {
206
+ const { rows } = await this.db().query(`SELECT COUNT(*)::int AS n FROM agent_work_items
207
+ WHERE namespace = $1 AND assignee = $2 AND status = 'submitted'
208
+ AND not_before IS NOT NULL AND not_before > NOW()`, [namespace, assignee]);
209
+ return rows[0].n;
210
+ }
211
+ async claim(namespace, id, assignee, sessionId) {
212
+ const { rows } = await this.db().query(`UPDATE agent_work_items SET
213
+ status = 'working',
214
+ claimed_at = NOW(),
215
+ claimed_by_session = $4,
216
+ lease_until = NOW() + ($5::bigint * interval '1 millisecond'),
217
+ activity = ${appendActivity('$6')},
218
+ updated_at = NOW()
219
+ WHERE namespace = $1 AND id = $2 AND assignee = $3
220
+ AND status IN ('submitted','input_required')
221
+ AND ${ELIGIBLE}
222
+ AND NOT EXISTS (
223
+ SELECT 1 FROM agent_work_items b
224
+ WHERE b.namespace = $1 AND b.assignee = $3 AND b.status = 'working'
225
+ AND b.lease_until > NOW()
226
+ )
227
+ RETURNING ${COLUMNS}`, [namespace, id, assignee, sessionId, WORK_LEASE_MS, entry(assignee, 'status', 'claimed')]);
228
+ if (rows[0])
229
+ return { item: rowToItem(rows[0]) };
230
+ // Refused — name the actual reason so the model can correct course.
231
+ const item = await this.get(namespace, id);
232
+ if (!item)
233
+ return { error: `No work item "${id}" — check my_work.` };
234
+ if (item.assignee !== assignee) {
235
+ return {
236
+ error: `"${id}" is assigned to ${item.assignee}, not you — you can only claim your own work.`,
237
+ };
238
+ }
239
+ if (item.status === 'working') {
240
+ return { error: `"${id}" is already claimed by a live run.` };
241
+ }
242
+ if (!['submitted', 'input_required'].includes(item.status)) {
243
+ return {
244
+ error: `"${id}" is ${item.status} — terminal items cannot be claimed.`,
245
+ };
246
+ }
247
+ if (item.notBefore && item.notBefore.getTime() > Date.now()) {
248
+ return {
249
+ error: `"${id}" is deferred until ${item.notBefore.toISOString()} — it enters your queue then; leave it alone until it does.`,
250
+ };
251
+ }
252
+ const { rows: held } = await this.db().query(`SELECT id FROM agent_work_items
253
+ WHERE namespace = $1 AND assignee = $2 AND status = 'working' AND lease_until > NOW()
254
+ LIMIT 1`, [namespace, assignee]);
255
+ if (held[0]) {
256
+ return {
257
+ error: `You already hold a claim on "${held[0].id}" — resolve it first (one claim at a time).`,
258
+ };
259
+ }
260
+ return {
261
+ error: `Could not claim "${id}" — it changed under you; re-check my_work.`,
262
+ };
263
+ }
264
+ /**
265
+ * Session-bound transition out of `working`. All three resolution paths and
266
+ * the release paths funnel through claimed_by_session = the caller's run —
267
+ * strict same-run resolution is a WHERE clause, not a convention.
268
+ */
269
+ async resolveClaimed(namespace, id, sessionId, set, params) {
270
+ const { rows } = await this.db().query(`UPDATE agent_work_items SET ${set}, updated_at = NOW()
271
+ WHERE namespace = $1 AND id = $2 AND status = 'working' AND claimed_by_session = $3
272
+ RETURNING ${COLUMNS}`, [namespace, id, sessionId, ...params]);
273
+ if (rows[0])
274
+ return { item: rowToItem(rows[0]) };
275
+ const item = await this.get(namespace, id);
276
+ if (!item)
277
+ return { error: `No work item "${id}".` };
278
+ if (item.status !== 'working') {
279
+ return {
280
+ error: `"${id}" is ${item.status}, not claimed by you — claim_task first, then resolve it in the same run.`,
281
+ };
282
+ }
283
+ return {
284
+ error: `"${id}" was claimed by a different run — you can only resolve an item you claimed in THIS run.`,
285
+ };
286
+ }
287
+ async complete(namespace, id, sessionId, result, artifactRefs) {
288
+ return this.resolveClaimed(namespace, id, sessionId, `status = 'completed', result = $4, artifact_refs = $5,
289
+ claimed_at = NULL, claimed_by_session = NULL, lease_until = NULL,
290
+ activity = ${appendActivity('$6')}`, [result, artifactRefs ?? [], entry('assignee', 'result', result.slice(0, 500))]);
291
+ }
292
+ async fail(namespace, id, sessionId, reason) {
293
+ const res = await this.resolveClaimed(namespace, id, sessionId, `attempts = attempts + 1,
294
+ status = CASE WHEN attempts + 1 >= ${ESCALATION_ATTEMPTS} THEN 'failed' ELSE 'submitted' END,
295
+ result = CASE WHEN attempts + 1 >= ${ESCALATION_ATTEMPTS} THEN $4 ELSE result END,
296
+ claimed_at = NULL, claimed_by_session = NULL, lease_until = NULL,
297
+ activity = ${appendActivity('$5')}`, [reason, entry('assignee', 'error', reason.slice(0, 500))]);
298
+ if (res.item && res.item.status === 'failed') {
299
+ await this.escalate(res.item, `Failed ${res.item.attempts} times. Last reason: ${reason}`);
300
+ return { item: res.item, escalated: true };
301
+ }
302
+ return res;
303
+ }
304
+ async reject(namespace, id, assignee, sessionId, reason) {
305
+ const { rows } = await this.db().query(`UPDATE agent_work_items SET
306
+ status = 'rejected', result = $5,
307
+ claimed_at = NULL, claimed_by_session = NULL, lease_until = NULL,
308
+ activity = ${appendActivity('$6')},
309
+ updated_at = NOW()
310
+ WHERE namespace = $1 AND id = $2 AND (
311
+ (status IN ('submitted','input_required','stale') AND assignee = $3)
312
+ OR (status = 'working' AND claimed_by_session = $4)
313
+ )
314
+ RETURNING ${COLUMNS}`, [
315
+ namespace,
316
+ id,
317
+ assignee,
318
+ sessionId ?? null,
319
+ reason,
320
+ entry(assignee, 'status', `rejected: ${reason.slice(0, 400)}`),
321
+ ]);
322
+ if (rows[0])
323
+ return { item: rowToItem(rows[0]) };
324
+ const item = await this.get(namespace, id);
325
+ if (!item)
326
+ return { error: `No work item "${id}".` };
327
+ if (item.assignee !== assignee) {
328
+ return { error: `"${id}" is assigned to ${item.assignee}, not you.` };
329
+ }
330
+ return { error: `"${id}" is ${item.status} — it cannot be rejected now.` };
331
+ }
332
+ async needInput(namespace, id, sessionId, question) {
333
+ return this.resolveClaimed(namespace, id, sessionId, `status = 'input_required',
334
+ claimed_at = NULL, claimed_by_session = NULL, lease_until = NULL,
335
+ activity = ${appendActivity('$4')}`, [entry('assignee', 'question', question)]);
336
+ }
337
+ async addActivity(namespace, id, actor, kind, text) {
338
+ const { rowCount } = await this.db().query(`UPDATE agent_work_items SET activity = ${appendActivity('$3')}, updated_at = NOW()
339
+ WHERE namespace = $1 AND id = $2 AND status = ANY($4)`, [namespace, id, entry(actor, kind, text), [...OPEN_WORK_STATUSES, 'stale']]);
340
+ return (rowCount ?? 0) > 0;
341
+ }
342
+ async releaseSessionClaims(sessionId) {
343
+ return this.release(`claimed_by_session = $1 AND status = 'working'`, [sessionId], 'run ended without resolving this item — claim released');
344
+ }
345
+ async expireLeases() {
346
+ return this.release(`status = 'working' AND lease_until < NOW()`, [], 'lease expired (process died mid-run?) — claim released');
347
+ }
348
+ /**
349
+ * The one release transition both zombie paths share: back to the queue
350
+ * with the attempt counted, or — on the third strike — terminal `failed`
351
+ * plus a human_review escalation for the owner.
352
+ */
353
+ async release(where, params, note) {
354
+ const noteParam = `$${params.length + 1}`;
355
+ const { rows } = await this.db().query(`UPDATE agent_work_items SET
356
+ attempts = attempts + 1,
357
+ status = CASE WHEN attempts + 1 >= ${ESCALATION_ATTEMPTS} THEN 'failed' ELSE 'submitted' END,
358
+ claimed_at = NULL, claimed_by_session = NULL, lease_until = NULL,
359
+ activity = ${appendActivity(noteParam)},
360
+ updated_at = NOW()
361
+ WHERE ${where}
362
+ RETURNING ${COLUMNS}`, [...params, entry('system', 'status', note)]);
363
+ for (const r of rows) {
364
+ const item = rowToItem(r);
365
+ if (item.status === 'failed') {
366
+ await this.escalate(item, `Abandoned ${item.attempts} times without resolution (${note}).`);
367
+ }
368
+ }
369
+ return rows.length;
370
+ }
371
+ async staleSweep(namespace) {
372
+ const { rowCount } = await this.db().query(`UPDATE agent_work_items SET
373
+ status = 'stale',
374
+ activity = ${appendActivity('$3')},
375
+ updated_at = NOW()
376
+ WHERE namespace = $1 AND status = 'submitted'
377
+ AND due_at IS NOT NULL AND due_at < NOW() - ($2::bigint * interval '1 millisecond')`, [
378
+ namespace,
379
+ this.staleAfterMs,
380
+ entry('system', 'status', 'overdue with no action — flagged stale'),
381
+ ]);
382
+ return rowCount ?? 0;
383
+ }
384
+ async markReminded(namespace, id) {
385
+ await this.db().query(`UPDATE agent_work_items SET last_reminded_at = NOW(), updated_at = NOW()
386
+ WHERE namespace = $1 AND id = $2`, [namespace, id]);
387
+ }
388
+ async markAssisted(namespace, id) {
389
+ await this.db().query(`UPDATE agent_work_items SET assisted_at = NOW(), updated_at = NOW()
390
+ WHERE namespace = $1 AND id = $2`, [namespace, id]);
391
+ }
392
+ /** Deterministic escalation sink: one human_review item per escalated item. */
393
+ async escalate(item, reason) {
394
+ try {
395
+ await this.create({
396
+ namespace: item.namespace,
397
+ createdBy: 'system',
398
+ owner: item.owner,
399
+ assignee: item.owner,
400
+ title: `Needs your review: ${item.title}`,
401
+ description: `"${item.title}" (assigned to ${item.assignee}) could not be completed. ${reason}`,
402
+ type: 'human_review',
403
+ metadata: {
404
+ original_title: item.title,
405
+ original_assignee: item.assignee,
406
+ },
407
+ followsRef: item.id,
408
+ priority: 'high',
409
+ dedupKey: `escalation:${item.id}`,
410
+ });
411
+ }
412
+ catch {
413
+ // escalation must never break the release path
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=work-store-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-store-postgres.js","sourceRoot":"","sources":["../src/work-store-postgres.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,IAAI,CAAC;AACrB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;AAQrB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAuB7E,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC;AAErC,MAAM,OAAO,GAAG;;;gGAGgF,CAAC;AAEjG;;;GAGG;AACH,MAAM,QAAQ,GAAG,6CAA6C,CAAC;AAE/D;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,6CAA6C,YAAY;wCAC1B,KAAK;kCACX,KAAK,aAAa,CAAC;AACrD,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAsB,EAAE,IAAY;IAChE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,SAAS,CAAC,CAA0B;IAC3C,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,SAAS,EAAE,CAAC,CAAC,SAAmB;QAChC,SAAS,EAAE,CAAC,CAAC,UAAoB;QACjC,KAAK,EAAE,CAAC,CAAC,KAAe;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAkB;QAC9B,KAAK,EAAE,CAAC,CAAC,KAAe;QACxB,WAAW,EAAG,CAAC,CAAC,WAA6B,IAAI,IAAI;QACrD,IAAI,EAAE,CAAC,CAAC,IAAc;QACtB,QAAQ,EAAG,CAAC,CAAC,QAA2C,IAAI,EAAE;QAC9D,UAAU,EAAG,CAAC,CAAC,WAA6B,IAAI,IAAI;QACpD,UAAU,EAAG,CAAC,CAAC,WAA6B,IAAI,IAAI;QACpD,cAAc,EAAG,CAAC,CAAC,eAAiC,IAAI,IAAI;QAC5D,MAAM,EAAE,CAAC,CAAC,MAAoB;QAC9B,QAAQ,EAAE,CAAC,CAAC,QAAgC;QAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,CAAC,CAAC,IAAI;QACrD,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC,CAAC,CAAC,CAAC,IAAI;QACjE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,QAAQ,EAAG,CAAC,CAAC,SAA2B,IAAI,IAAI;QAChD,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC,CAAC,CAAC,CAAC,IAAI;QACjE,gBAAgB,EAAG,CAAC,CAAC,kBAAoC,IAAI,IAAI;QACjE,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAqB,CAAC,CAAC,CAAC,CAAC,IAAI;QACpE,MAAM,EAAG,CAAC,CAAC,MAAwB,IAAI,IAAI;QAC3C,YAAY,EAAG,CAAC,CAAC,aAAiC,IAAI,EAAE;QACxD,QAAQ,EAAG,CAAC,CAAC,QAAwC,IAAI,EAAE;QAC3D,cAAc,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,gBAA0B,CAAC,CAAC,CAAC,CAAC,IAAI;QAClF,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAqB,CAAC,CAAC,CAAC,CAAC,IAAI;QACpE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC;QAC3C,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,iBAAiB;IAMC;IALrB,IAAI,GAAqC,IAAI,CAAC;IACrC,SAAS,CAAS;IAClB,YAAY,CAAS;IAC9B,UAAU,GAA0C,IAAI,CAAC;IAEjE,YAA6B,MAA+B;QAA/B,WAAM,GAAN,MAAM,CAAyB;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACzC,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,EAAE;QACR,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAsB;QACjC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC;;;;qBAIa,OAAO,EAAE,EACtB;gBACE,EAAE;gBACF,KAAK,CAAC,SAAS;gBACf,KAAK,CAAC,SAAS;gBACf,KAAK,CAAC,KAAK;gBACX,KAAK,CAAC,QAAQ;gBACd,KAAK,CAAC,KAAK;gBACX,KAAK,CAAC,WAAW,IAAI,IAAI;gBACzB,KAAK,CAAC,IAAI,IAAI,QAAQ;gBACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACpC,KAAK,CAAC,UAAU,IAAI,IAAI;gBACxB,KAAK,CAAC,UAAU,IAAI,IAAI;gBACxB,KAAK,CAAC,cAAc,IAAI,IAAI;gBAC5B,KAAK,CAAC,QAAQ,IAAI,QAAQ;gBAC1B,KAAK,CAAC,KAAK,IAAI,IAAI;gBACnB,KAAK,CAAC,SAAS,IAAI,IAAI;gBACvB,KAAK,CAAC,QAAQ,IAAI,IAAI;gBACtB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,KAAK,CAAC,QAAQ,EAAE,CAAC;aAClE,CACF,CAAC;YACF,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC;gBACnD,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAAyB,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAClE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC,UAAU,OAAO;;oBAEP,EACV,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CACtD,CAAC;gBACF,IAAI,IAAI,CAAC,CAAC,CAAC;oBACT,OAAO;wBACL,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC;wBACnD,SAAS,EAAE,IAAI;qBAChB,CAAC;YACN,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,EAAU;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC,UAAU,OAAO,yDAAyD,EAC1E,CAAC,SAAS,EAAE,EAAE,CAAC,CAChB,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,QAAgB,EAChB,QAAsB,EACtB,KAAa;QAEb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC,UAAU,OAAO;;0CAEmB,QAAQ;;;iBAGjC,EACX,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CACvC,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAA4B,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,QAAgB;QACjD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC;oEAC8D,EAC9D,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAC1C,CAAC;QACF,OAAQ,IAAI,CAAC,CAAC,CAAmB,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,QAAgB;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC;;4DAEsD,EACtD,CAAC,SAAS,EAAE,QAAQ,CAAC,CACtB,CAAC;QACF,OAAQ,IAAI,CAAC,CAAC,CAAmB,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,EAAU,EACV,QAAgB,EAChB,SAAiB;QAEjB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC;;;;;uBAKiB,cAAc,CAAC,IAAI,CAAC;;;;gBAI3B,QAAQ;;;;;;oBAMJ,OAAO,EAAE,EACvB,CAAC,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAC1F,CAAC;QACF,IAAI,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,EAAE,CAAC;QAE5E,oEAAoE;QACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;QACrE,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACL,KAAK,EAAE,IAAI,EAAE,oBAAoB,IAAI,CAAC,QAAQ,+CAA+C;aAC9F,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,OAAO;gBACL,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,sCAAsC;aACvE,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC5D,OAAO;gBACL,KAAK,EAAE,IAAI,EAAE,uBAAuB,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,6DAA6D;aAC9H,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAC1C;;gBAEU,EACV,CAAC,SAAS,EAAE,QAAQ,CAAC,CACtB,CAAC;QACF,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACZ,OAAO;gBACL,KAAK,EAAE,gCACJ,IAAI,CAAC,CAAC,CAAoB,CAAC,EAC9B,6CAA6C;aAC9C,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,oBAAoB,EAAE,6CAA6C;SAC3E,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc,CAC1B,SAAiB,EACjB,EAAU,EACV,SAAiB,EACjB,GAAW,EACX,MAAiB;QAEjB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC,+BAA+B,GAAG;;oBAEpB,OAAO,EAAE,EACvB,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,CACtC,CAAC;QACF,IAAI,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO;gBACL,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,2EAA2E;aAC5G,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,IAAI,EAAE,0FAA0F;SACxG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,SAAiB,EACjB,EAAU,EACV,SAAiB,EACjB,MAAc,EACd,YAAuB;QAEvB,OAAO,IAAI,CAAC,cAAc,CACxB,SAAS,EACT,EAAE,EACF,SAAS,EACT;;oBAEc,cAAc,CAAC,IAAI,CAAC,EAAE,EACpC,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAChF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,SAAiB,EACjB,EAAU,EACV,SAAiB,EACjB,MAAc;QAEd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CACnC,SAAS,EACT,EAAE,EACF,SAAS,EACT;4CACsC,mBAAmB;4CACnB,mBAAmB;;oBAE3C,cAAc,CAAC,IAAI,CAAC,EAAE,EACpC,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAC3D,CAAC;QACF,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,wBAAwB,MAAM,EAAE,CAAC,CAAC;YAC3F,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,EAAU,EACV,QAAgB,EAChB,SAA6B,EAC7B,MAAc;QAEd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC;;;uBAGiB,cAAc,CAAC,IAAI,CAAC;;;;;;oBAMvB,OAAO,EAAE,EACvB;YACE,SAAS;YACT,EAAE;YACF,QAAQ;YACR,SAAS,IAAI,IAAI;YACjB,MAAM;YACN,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;SAC/D,CACF,CAAC;QACF,IAAI,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAA4B,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,IAAI,CAAC,QAAQ,YAAY,EAAE,CAAC;QACxE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,+BAA+B,EAAE,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,EAAU,EACV,SAAiB,EACjB,QAAgB;QAEhB,OAAO,IAAI,CAAC,cAAc,CACxB,SAAS,EACT,EAAE,EACF,SAAS,EACT;;oBAEc,cAAc,CAAC,IAAI,CAAC,EAAE,EACpC,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAC1C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,EAAU,EACV,KAAa,EACb,IAAsB,EACtB,IAAY;QAEZ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACxC,0CAA0C,cAAc,CAAC,IAAI,CAAC;8DACN,EACxD,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAC5E,CAAC;QACF,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAC1C,OAAO,IAAI,CAAC,OAAO,CACjB,gDAAgD,EAChD,CAAC,SAAS,CAAC,EACX,wDAAwD,CACzD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CACjB,4CAA4C,EAC5C,EAAE,EACF,wDAAwD,CACzD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,MAAiB,EAAE,IAAY;QAClE,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACpC;;+CAEyC,mBAAmB;;uBAE3C,cAAc,CAAC,SAAS,CAAC;;gBAEhC,KAAK;oBACD,OAAO,EAAE,EACvB,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAC7C,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,SAAS,CAAC,CAA4B,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,IAAI,CAAC,QAAQ,8BAA8B,IAAI,IAAI,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACxC;;uBAEiB,cAAc,CAAC,IAAI,CAAC;;;8FAGmD,EACxF;YACE,SAAS;YACT,IAAI,CAAC,YAAY;YACjB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,wCAAwC,CAAC;SACpE,CACF,CAAC;QACF,OAAO,QAAQ,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,EAAU;QAC9C,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACnB;yCACmC,EACnC,CAAC,SAAS,EAAE,EAAE,CAAC,CAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,EAAU;QAC9C,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CACnB;yCACmC,EACnC,CAAC,SAAS,EAAE,EAAE,CAAC,CAChB,CAAC;IACJ,CAAC;IAED,+EAA+E;IACvE,KAAK,CAAC,QAAQ,CAAC,IAAc,EAAE,MAAc;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC;gBAChB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI,CAAC,KAAK;gBACpB,KAAK,EAAE,sBAAsB,IAAI,CAAC,KAAK,EAAE;gBACzC,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,QAAQ,6BAA6B,MAAM,EAAE;gBAC/F,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE;oBACR,cAAc,EAAE,IAAI,CAAC,KAAK;oBAC1B,iBAAiB,EAAE,IAAI,CAAC,QAAQ;iBACjC;gBACD,UAAU,EAAE,IAAI,CAAC,EAAE;gBACnB,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,cAAc,IAAI,CAAC,EAAE,EAAE;aAClC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mce-bt/microagents-memory",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "3-tier memory system — STM (Redis), MTM (Postgres), LTM (Postgres + pgvector)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",