@mce-bt/microagents-memory 0.10.0 → 0.12.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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/job-store-postgres.d.ts +36 -0
- package/dist/job-store-postgres.d.ts.map +1 -0
- package/dist/job-store-postgres.js +141 -0
- package/dist/job-store-postgres.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export { MemoryExtractor, createExtractionAdapter, type ExtractionLLMAdapter, ty
|
|
|
8
8
|
export { createMemoryTools } from './memory-tools.js';
|
|
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
|
+
export { PostgresJobStore, type PostgresJobStoreConfig } from './job-store-postgres.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,GACnB,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,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,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"}
|
|
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,GACnB,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,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,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"}
|
package/dist/index.js
CHANGED
|
@@ -8,4 +8,5 @@ export { MemoryExtractor, createExtractionAdapter, } from './memory-extractor.js
|
|
|
8
8
|
export { createMemoryTools } from './memory-tools.js';
|
|
9
9
|
export { SummarizationPipeline, } from './summarization-pipeline.js';
|
|
10
10
|
export { RedisSessionStore, RedisChannelSessionStore, RedisSchedulerStateStore, IoredisLockClient, createRedisStateStores, } from './redis-state.js';
|
|
11
|
+
export { PostgresJobStore } from './job-store-postgres.js';
|
|
11
12
|
//# 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,GAMf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,uBAAuB,GAMxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,qBAAqB,GAGtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GAGvB,MAAM,kBAAkB,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,GAMf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,uBAAuB,GAMxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AgentJob, CreateJobInput, JobStore } from '@mce-bt/microagents-core';
|
|
2
|
+
/**
|
|
3
|
+
* Postgres-backed durable job store for agent-authored scheduled work
|
|
4
|
+
* (schedule_task). Same conventions as the other stores here: lazy
|
|
5
|
+
* CREATE TABLE at start, a namespace column as the tenant isolation boundary,
|
|
6
|
+
* and unqualified table names (the host's search_path decides the schema).
|
|
7
|
+
*
|
|
8
|
+
* Claiming uses FOR UPDATE SKIP LOCKED inside a single UPDATE…RETURNING, so
|
|
9
|
+
* exactly one worker wins a due job across replicas — the same guarantee the
|
|
10
|
+
* heartbeat Redis lock provides, but transactional with the reschedule.
|
|
11
|
+
*/
|
|
12
|
+
export interface PostgresJobStoreConfig {
|
|
13
|
+
connectionString: string;
|
|
14
|
+
namespace?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class PostgresJobStore implements JobStore {
|
|
17
|
+
private readonly config;
|
|
18
|
+
private pool;
|
|
19
|
+
private readonly namespace;
|
|
20
|
+
constructor(config: PostgresJobStoreConfig);
|
|
21
|
+
start(): Promise<void>;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
private db;
|
|
24
|
+
private ensureSchema;
|
|
25
|
+
create(input: CreateJobInput): Promise<AgentJob>;
|
|
26
|
+
listActive(namespace: string, agentId: string): Promise<AgentJob[]>;
|
|
27
|
+
claimDue(agentId: string, limit: number): Promise<AgentJob[]>;
|
|
28
|
+
recordRun(id: string, outcome: {
|
|
29
|
+
status: AgentJob['status'];
|
|
30
|
+
nextRunAt?: Date;
|
|
31
|
+
lastResultHash?: string;
|
|
32
|
+
failed?: boolean;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
cancel(namespace: string, agentId: string, id: string): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=job-store-postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-store-postgres.d.ts","sourceRoot":"","sources":["../src/job-store-postgres.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD,qBAAa,gBAAiB,YAAW,QAAQ;IAInC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,IAAI,CAA0C;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,MAAM,EAAE,sBAAsB;IAIrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,CAAC,EAAE;YAKI,YAAY;IA+BpB,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IA4BhD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUnE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB7D,SAAS,CACb,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QACP,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3B,SAAS,CAAC,EAAE,IAAI,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,GACA,OAAO,CAAC,IAAI,CAAC;IAaV,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ/E"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import pkg from 'pg';
|
|
2
|
+
const { Pool } = pkg;
|
|
3
|
+
function rowToJob(r) {
|
|
4
|
+
return {
|
|
5
|
+
id: r.id,
|
|
6
|
+
agentId: r.agent_id,
|
|
7
|
+
namespace: r.namespace,
|
|
8
|
+
kind: r.kind,
|
|
9
|
+
runAt: new Date(r.run_at),
|
|
10
|
+
cron: r.cron ?? null,
|
|
11
|
+
intervalMs: r.interval_ms === null ? null : Number(r.interval_ms),
|
|
12
|
+
timezone: r.timezone ?? null,
|
|
13
|
+
goal: r.goal,
|
|
14
|
+
sendToChannels: Boolean(r.send_to_channels),
|
|
15
|
+
toolAllowlist: r.tool_allowlist ?? null,
|
|
16
|
+
endCondition: r.end_condition ?? null,
|
|
17
|
+
dedupKey: r.dedup_key ?? null,
|
|
18
|
+
status: r.status,
|
|
19
|
+
attempts: Number(r.attempts),
|
|
20
|
+
lastRunAt: r.last_run_at ? new Date(r.last_run_at) : null,
|
|
21
|
+
lastResultHash: r.last_result_hash ?? null,
|
|
22
|
+
createdBySession: r.created_by_session ?? null,
|
|
23
|
+
createdAt: new Date(r.created_at),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const COLUMNS = `id, agent_id, namespace, kind, run_at, cron, interval_ms, timezone, goal,
|
|
27
|
+
send_to_channels, tool_allowlist, end_condition, dedup_key, status, attempts,
|
|
28
|
+
last_run_at, last_result_hash, created_by_session, created_at`;
|
|
29
|
+
export class PostgresJobStore {
|
|
30
|
+
config;
|
|
31
|
+
pool = null;
|
|
32
|
+
namespace;
|
|
33
|
+
constructor(config) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.namespace = config.namespace ?? 'default';
|
|
36
|
+
}
|
|
37
|
+
async start() {
|
|
38
|
+
this.pool = new Pool({ connectionString: this.config.connectionString });
|
|
39
|
+
await this.ensureSchema();
|
|
40
|
+
}
|
|
41
|
+
async stop() {
|
|
42
|
+
if (this.pool) {
|
|
43
|
+
await this.pool.end();
|
|
44
|
+
this.pool = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
db() {
|
|
48
|
+
if (!this.pool)
|
|
49
|
+
throw new Error('PostgresJobStore not started');
|
|
50
|
+
return this.pool;
|
|
51
|
+
}
|
|
52
|
+
async ensureSchema() {
|
|
53
|
+
await this.db().query(`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS agent_jobs (
|
|
55
|
+
id TEXT PRIMARY KEY,
|
|
56
|
+
agent_id TEXT NOT NULL,
|
|
57
|
+
namespace TEXT NOT NULL DEFAULT 'default',
|
|
58
|
+
kind TEXT NOT NULL,
|
|
59
|
+
run_at TIMESTAMPTZ NOT NULL,
|
|
60
|
+
cron TEXT,
|
|
61
|
+
interval_ms BIGINT,
|
|
62
|
+
timezone TEXT,
|
|
63
|
+
goal TEXT NOT NULL,
|
|
64
|
+
send_to_channels BOOLEAN NOT NULL DEFAULT TRUE,
|
|
65
|
+
tool_allowlist TEXT[],
|
|
66
|
+
end_condition TEXT,
|
|
67
|
+
dedup_key TEXT,
|
|
68
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
69
|
+
attempts INT NOT NULL DEFAULT 0,
|
|
70
|
+
last_run_at TIMESTAMPTZ,
|
|
71
|
+
last_result_hash TEXT,
|
|
72
|
+
created_by_session TEXT,
|
|
73
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
74
|
+
);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_agent_jobs_due
|
|
76
|
+
ON agent_jobs (agent_id, run_at) WHERE status = 'active';
|
|
77
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_agent_jobs_dedup
|
|
78
|
+
ON agent_jobs (namespace, agent_id, dedup_key)
|
|
79
|
+
WHERE status = 'active' AND dedup_key IS NOT NULL;
|
|
80
|
+
`);
|
|
81
|
+
}
|
|
82
|
+
async create(input) {
|
|
83
|
+
const id = `job-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
84
|
+
const { rows } = await this.db().query(`INSERT INTO agent_jobs
|
|
85
|
+
(id, agent_id, namespace, kind, run_at, cron, interval_ms, timezone, goal,
|
|
86
|
+
send_to_channels, tool_allowlist, end_condition, dedup_key, created_by_session)
|
|
87
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)
|
|
88
|
+
RETURNING ${COLUMNS}`, [
|
|
89
|
+
id,
|
|
90
|
+
input.agentId,
|
|
91
|
+
input.namespace,
|
|
92
|
+
input.kind,
|
|
93
|
+
input.runAt,
|
|
94
|
+
input.cron ?? null,
|
|
95
|
+
input.intervalMs ?? null,
|
|
96
|
+
input.timezone ?? null,
|
|
97
|
+
input.goal,
|
|
98
|
+
input.sendToChannels ?? true,
|
|
99
|
+
input.toolAllowlist ?? null,
|
|
100
|
+
input.endCondition ?? null,
|
|
101
|
+
input.dedupKey ?? null,
|
|
102
|
+
input.createdBySession ?? null,
|
|
103
|
+
]);
|
|
104
|
+
return rowToJob(rows[0]);
|
|
105
|
+
}
|
|
106
|
+
async listActive(namespace, agentId) {
|
|
107
|
+
const { rows } = await this.db().query(`SELECT ${COLUMNS} FROM agent_jobs
|
|
108
|
+
WHERE namespace = $1 AND agent_id = $2 AND status = 'active'
|
|
109
|
+
ORDER BY run_at ASC`, [namespace, agentId]);
|
|
110
|
+
return rows.map((r) => rowToJob(r));
|
|
111
|
+
}
|
|
112
|
+
async claimDue(agentId, limit) {
|
|
113
|
+
// Push run_at forward on claim so a crashed worker's job re-becomes due
|
|
114
|
+
// after the visibility window instead of being lost mid-run.
|
|
115
|
+
const { rows } = await this.db().query(`UPDATE agent_jobs SET run_at = NOW() + interval '5 minutes'
|
|
116
|
+
WHERE id IN (
|
|
117
|
+
SELECT id FROM agent_jobs
|
|
118
|
+
WHERE agent_id = $1 AND status = 'active' AND run_at <= NOW()
|
|
119
|
+
ORDER BY run_at ASC
|
|
120
|
+
LIMIT $2
|
|
121
|
+
FOR UPDATE SKIP LOCKED
|
|
122
|
+
)
|
|
123
|
+
RETURNING ${COLUMNS}`, [agentId, limit]);
|
|
124
|
+
return rows.map((r) => rowToJob(r));
|
|
125
|
+
}
|
|
126
|
+
async recordRun(id, outcome) {
|
|
127
|
+
await this.db().query(`UPDATE agent_jobs
|
|
128
|
+
SET status = $2,
|
|
129
|
+
run_at = COALESCE($3, run_at),
|
|
130
|
+
last_run_at = NOW(),
|
|
131
|
+
last_result_hash = COALESCE($4, last_result_hash),
|
|
132
|
+
attempts = attempts + $5
|
|
133
|
+
WHERE id = $1`, [id, outcome.status, outcome.nextRunAt ?? null, outcome.lastResultHash ?? null, outcome.failed ? 1 : 0]);
|
|
134
|
+
}
|
|
135
|
+
async cancel(namespace, agentId, id) {
|
|
136
|
+
const { rowCount } = await this.db().query(`UPDATE agent_jobs SET status = 'cancelled'
|
|
137
|
+
WHERE namespace = $1 AND agent_id = $2 AND id = $3 AND status = 'active'`, [namespace, agentId, id]);
|
|
138
|
+
return (rowCount ?? 0) > 0;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=job-store-postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-store-postgres.js","sourceRoot":"","sources":["../src/job-store-postgres.ts"],"names":[],"mappings":"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"}
|