@zhivex-ai/core 1.29.0 → 1.30.1
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/cancellation-intent.d.ts +14 -0
- package/dist/agent/cancellation-intent.d.ts.map +1 -0
- package/dist/agent/cancellation-intent.js +93 -0
- package/dist/agent/cancellation-intent.js.map +1 -0
- package/dist/agent/cancellation.d.ts.map +1 -1
- package/dist/agent/cancellation.js +33 -61
- package/dist/agent/cancellation.js.map +1 -1
- package/dist/agent/children.d.ts.map +1 -1
- package/dist/agent/children.js +2 -1
- package/dist/agent/children.js.map +1 -1
- package/dist/agent/common.d.ts.map +1 -1
- package/dist/agent/common.js +9 -3
- package/dist/agent/common.js.map +1 -1
- package/dist/agent/context.d.ts +8 -0
- package/dist/agent/context.d.ts.map +1 -1
- package/dist/agent/context.js +32 -12
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/execution.d.ts.map +1 -1
- package/dist/agent/execution.js +137 -12
- package/dist/agent/execution.js.map +1 -1
- package/dist/agent/lifecycle.d.ts.map +1 -1
- package/dist/agent/lifecycle.js +4 -2
- package/dist/agent/lifecycle.js.map +1 -1
- package/dist/agent/memory.d.ts +5 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +20 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/state.d.ts +2 -2
- package/dist/agent/state.d.ts.map +1 -1
- package/dist/agent/state.js +60 -6
- package/dist/agent/state.js.map +1 -1
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +14 -0
- package/dist/agent-state.js.map +1 -1
- package/dist/agent-store/file.d.ts.map +1 -1
- package/dist/agent-store/file.js +196 -93
- package/dist/agent-store/file.js.map +1 -1
- package/dist/agent-store/memory.d.ts.map +1 -1
- package/dist/agent-store/memory.js +18 -17
- package/dist/agent-store/memory.js.map +1 -1
- package/dist/agent-store/postgres.d.ts.map +1 -1
- package/dist/agent-store/postgres.js +181 -47
- package/dist/agent-store/postgres.js.map +1 -1
- package/dist/agent-store/shared.d.ts +20 -0
- package/dist/agent-store/shared.d.ts.map +1 -1
- package/dist/agent-store/shared.js +50 -10
- package/dist/agent-store/shared.js.map +1 -1
- package/dist/agent-store/sqlite.d.ts.map +1 -1
- package/dist/agent-store/sqlite.js +103 -54
- package/dist/agent-store/sqlite.js.map +1 -1
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +14 -3
- package/dist/errors.js.map +1 -1
- package/dist/generate-object.d.ts.map +1 -1
- package/dist/generate-object.js +3 -11
- package/dist/generate-object.js.map +1 -1
- package/dist/generate-text.d.ts.map +1 -1
- package/dist/generate-text.js +23 -3
- package/dist/generate-text.js.map +1 -1
- package/dist/middleware-runtime.d.ts.map +1 -1
- package/dist/middleware-runtime.js +16 -6
- package/dist/middleware-runtime.js.map +1 -1
- package/dist/safety-policy.js +3 -3
- package/dist/safety-policy.js.map +1 -1
- package/dist/stream.d.ts +6 -0
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +59 -28
- package/dist/stream.js.map +1 -1
- package/dist/types/agent-state.d.ts +12 -0
- package/dist/types/agent-state.d.ts.map +1 -1
- package/dist/types/agents.d.ts +4 -0
- package/dist/types/agents.d.ts.map +1 -1
- package/dist/types/generation.d.ts +4 -0
- package/dist/types/generation.d.ts.map +1 -1
- package/dist/types/model-tools.d.ts +2 -0
- package/dist/types/model-tools.d.ts.map +1 -1
- package/dist/types/stream.d.ts +3 -0
- package/dist/types/stream.d.ts.map +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +39 -5
- package/dist/workflow.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { normalizeAgentRunState } from "../agent-state.js";
|
|
2
2
|
import { ConflictError, ValidationError } from "../errors.js";
|
|
3
|
-
import { scopedKey, resolveScope, cloneState, assertLeaseOwner, assertExpectedRevision, nextStoredState,
|
|
3
|
+
import { scopedKey, matchesScope, journalKey as canonicalJournalKey, resolveScope, cloneState, assertLeaseOwner, assertExpectedRevision, nextStoredState, listStates, validateLeaseOptions, cloneJournalEntry, assertJournalRevision, nextJournalEntry, defaultMemoryKey, defaultMemoryMessages } from "./shared.js";
|
|
4
4
|
const cloneMessages = (messages) => JSON.parse(JSON.stringify(messages));
|
|
5
5
|
export const createInMemoryAgentRunStore = (options = {}) => {
|
|
6
6
|
const states = new Map();
|
|
@@ -10,7 +10,7 @@ export const createInMemoryAgentRunStore = (options = {}) => {
|
|
|
10
10
|
const journal = new Map();
|
|
11
11
|
const runKey = (runId, scope) => scopedKey(resolveScope(options.scope, scope), runId);
|
|
12
12
|
const idempotencyKey = (key, scope) => scopedKey(resolveScope(options.scope, scope), key);
|
|
13
|
-
const journalKey = (runId, toolCallId, scope) =>
|
|
13
|
+
const journalKey = (runId, toolCallId, scope) => canonicalJournalKey(resolveScope(options.scope, scope), runId, toolCallId);
|
|
14
14
|
const removeParentIndex = (state) => {
|
|
15
15
|
if (!state?.parentRunId) {
|
|
16
16
|
return;
|
|
@@ -68,15 +68,17 @@ export const createInMemoryAgentRunStore = (options = {}) => {
|
|
|
68
68
|
const current = states.get(runKey(state.runId, scope));
|
|
69
69
|
assertExpectedRevision(current, saveOptions?.expectedRevision);
|
|
70
70
|
const normalized = nextStoredState(state, saveOptions);
|
|
71
|
-
removeParentIndex(current);
|
|
72
|
-
states.set(runKey(normalized.runId, scope), cloneState({ ...normalized, ...(scope ? { scope } : {}) }));
|
|
73
71
|
if (normalized.idempotencyKey) {
|
|
74
72
|
const owner = idempotencyKeys.get(idempotencyKey(normalized.idempotencyKey, scope));
|
|
75
73
|
if (owner && owner !== runKey(normalized.runId, scope)) {
|
|
76
74
|
throw new ConflictError("AgentRunState idempotency key conflict.");
|
|
77
75
|
}
|
|
78
|
-
idempotencyKeys.set(idempotencyKey(normalized.idempotencyKey, scope), runKey(normalized.runId, scope));
|
|
79
76
|
}
|
|
77
|
+
const stored = cloneState({ ...normalized, ...(scope ? { scope } : {}) });
|
|
78
|
+
removeParentIndex(current);
|
|
79
|
+
states.set(runKey(normalized.runId, scope), stored);
|
|
80
|
+
if (normalized.idempotencyKey)
|
|
81
|
+
idempotencyKeys.set(idempotencyKey(normalized.idempotencyKey, scope), runKey(normalized.runId, scope));
|
|
80
82
|
if (normalized.parentRunId) {
|
|
81
83
|
const parentKey = scopedKey(scope, normalized.parentRunId);
|
|
82
84
|
const children = parentRunIds.get(parentKey) ?? new Set();
|
|
@@ -93,18 +95,18 @@ export const createInMemoryAgentRunStore = (options = {}) => {
|
|
|
93
95
|
removeParentIndex(state);
|
|
94
96
|
states.delete(key);
|
|
95
97
|
leases.delete(key);
|
|
96
|
-
for (const journalEntryKey of journal
|
|
97
|
-
if (
|
|
98
|
+
for (const [journalEntryKey, entry] of journal) {
|
|
99
|
+
if (entry.runId === runId && matchesScope(entry.scope, resolveScope(options.scope, scope)))
|
|
98
100
|
journal.delete(journalEntryKey);
|
|
99
101
|
}
|
|
100
102
|
},
|
|
101
103
|
list(listOptions, scope) {
|
|
102
|
-
const
|
|
103
|
-
return listStates([...states.
|
|
104
|
+
const targetScope = resolveScope(options.scope, scope);
|
|
105
|
+
return listStates([...states.values()].filter(state => !targetScope || matchesScope(state.scope, targetScope)), listOptions);
|
|
104
106
|
},
|
|
105
107
|
deleteExpired(retention, scope) {
|
|
106
|
-
const
|
|
107
|
-
const candidates = listStates([...states.
|
|
108
|
+
const targetScope = resolveScope(options.scope, scope);
|
|
109
|
+
const candidates = listStates([...states.values()].filter(state => !targetScope || matchesScope(state.scope, targetScope)), {
|
|
108
110
|
statuses: retention.statuses,
|
|
109
111
|
updatedBefore: retention.before,
|
|
110
112
|
limit: retention.limit ?? 1_000
|
|
@@ -151,10 +153,9 @@ export const createInMemoryAgentRunStore = (options = {}) => {
|
|
|
151
153
|
return this.loadToolCall?.(runId, toolCallId, scope);
|
|
152
154
|
},
|
|
153
155
|
listToolCalls(runId, scope) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
.
|
|
157
|
-
.map(([, entry]) => cloneJournalEntry(entry))
|
|
156
|
+
return [...journal.values()]
|
|
157
|
+
.filter(entry => entry.runId === runId && matchesScope(entry.scope, resolveScope(options.scope, scope)))
|
|
158
|
+
.map(entry => cloneJournalEntry(entry))
|
|
158
159
|
.sort((left, right) => left.updatedAt - right.updatedAt || left.toolCallId.localeCompare(right.toolCallId));
|
|
159
160
|
},
|
|
160
161
|
saveToolCall(entry, journalOptions) {
|
|
@@ -165,7 +166,7 @@ export const createInMemoryAgentRunStore = (options = {}) => {
|
|
|
165
166
|
const key = journalKey(entry.runId, entry.toolCallId, scope);
|
|
166
167
|
const current = journal.get(key);
|
|
167
168
|
assertJournalRevision(current, journalOptions?.expectedRevision);
|
|
168
|
-
const next = nextJournalEntry(entry, journalOptions);
|
|
169
|
+
const next = nextJournalEntry({ ...entry, ...(scope ? { scope } : {}) }, journalOptions);
|
|
169
170
|
journal.set(key, next);
|
|
170
171
|
return cloneJournalEntry(next);
|
|
171
172
|
},
|
|
@@ -188,7 +189,7 @@ export const createInMemoryAgentMemoryStore = (options = {}) => {
|
|
|
188
189
|
const memories = new Map(Object.entries(options.initialMessages ?? {}).map(([key, messages]) => [key, cloneMessages(messages)]));
|
|
189
190
|
return {
|
|
190
191
|
load(context) {
|
|
191
|
-
return cloneMessages(memories.get(keyFor(context)) ?? (context.agentId ? options.initialMessages?.[context.agentId] : undefined) ?? []);
|
|
192
|
+
return cloneMessages(memories.get(keyFor(context)) ?? (!context.scope ? options.initialMessages?.[context.runId] : undefined) ?? (context.agentId ? options.initialMessages?.[context.agentId] : undefined) ?? []);
|
|
192
193
|
},
|
|
193
194
|
save(context) {
|
|
194
195
|
memories.set(keyFor(context), cloneMessages(selectMessages(context.state)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/agent-store/memory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/agent-store/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/agent-store/postgres.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EAGhB,aAAa,EAIb,+BAA+B,EAC/B,4BAA4B,EAE7B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/agent-store/postgres.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EAGhB,aAAa,EAIb,+BAA+B,EAC/B,4BAA4B,EAE7B,MAAM,aAAa,CAAC;AAsErB,eAAO,MAAM,2BAA2B,YAAa,4BAA4B,KAAG,aAscnF,CAAC;AAEF,eAAO,MAAM,8BAA8B,YAAa,+BAA+B,KAAG,gBAmDzF,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeAgentRunState } from "../agent-state.js";
|
|
2
2
|
import { ConflictError, ValidationError } from "../errors.js";
|
|
3
3
|
import { assertPostgresClient } from "../postgres-client.js";
|
|
4
|
-
import { validateIdentifier, scopedKey, resolveScope, getRecordField, nextStoredState,
|
|
4
|
+
import { validateIdentifier, scopedKey, legacyScopedKey, matchesRun, matchesScope, resolveScope, getRecordField, nextStoredState, listStates, parseAgentRunListOptions, validateLeaseOptions, cloneJournalEntry, nextJournalEntry, defaultMemoryKey, legacyDefaultMemoryKey, encodeAgentMemory, decodeAgentMemory, LEGACY_MEMORY_MIGRATION_MESSAGE, defaultMemoryMessages } from "./shared.js";
|
|
5
5
|
const isConcurrentPostgresTableCreationConflict = (error) => {
|
|
6
6
|
if (!error || typeof error !== "object")
|
|
7
7
|
return false;
|
|
@@ -90,8 +90,39 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
90
90
|
updated_at_ms BIGINT NOT NULL,
|
|
91
91
|
PRIMARY KEY (run_key, tool_call_id)
|
|
92
92
|
)`;
|
|
93
|
+
// Use persisted logical timestamps, not the database write timestamp. These
|
|
94
|
+
// expressions also apply to legacy rows without changing their physical keys.
|
|
95
|
+
const sortTimeSql = "COALESCE((state_json->>'updatedAt')::double precision, (state_json->>'startedAt')::double precision, 0)";
|
|
96
|
+
const updatedTimeSql = "COALESCE((state_json->>'updatedAt')::double precision, 0)";
|
|
97
|
+
const tenantSql = "(state_json #>> '{scope,tenantId}')";
|
|
98
|
+
const userSql = "(state_json #>> '{scope,userId}')";
|
|
99
|
+
const namespaceSql = "(state_json #>> '{scope,namespace}')";
|
|
100
|
+
// Scope strings are unbounded. Hash index entries so valid long identifiers
|
|
101
|
+
// cannot exceed PostgreSQL's B-tree tuple limit; raw predicates below still
|
|
102
|
+
// establish exact identity even if two values ever share a digest.
|
|
103
|
+
const scopeHashSql = (expression) => `md5(${expression})`;
|
|
104
|
+
// JS string ordering compares UTF-16 code units. PostgreSQL's C collation
|
|
105
|
+
// compares UTF-8 bytes instead, so supplementary characters need surrogate
|
|
106
|
+
// pairs in this sort key to preserve existing cursors exactly.
|
|
107
|
+
const runIdSortSql = `(SELECT string_agg(
|
|
108
|
+
CASE WHEN ascii(character) <= 65535 THEN lpad(to_hex(ascii(character)), 4, '0')
|
|
109
|
+
ELSE lpad(to_hex(55296 + (ascii(character) - 65536) / 1024), 4, '0')
|
|
110
|
+
|| lpad(to_hex(56320 + (ascii(character) - 65536) % 1024), 4, '0') END,
|
|
111
|
+
'' ORDER BY position)
|
|
112
|
+
FROM regexp_split_to_table(state_json->>'runId', '') WITH ORDINALITY AS units(character, position)) COLLATE "C"`;
|
|
113
|
+
// Recreate scopedKey from logical JSON identity, including legacy rows. Build
|
|
114
|
+
// compact JSON explicitly: json[b]_build_array textual output adds spaces.
|
|
115
|
+
const scopeTupleSql = `CASE WHEN state_json->'scope' IS NULL THEN 'null' ELSE
|
|
116
|
+
'[' || COALESCE((state_json #> '{scope,namespace}')::text, 'null') || ','
|
|
117
|
+
|| (state_json #> '{scope,tenantId}')::text || ','
|
|
118
|
+
|| COALESCE((state_json #> '{scope,userId}')::text, 'null') || ']' END`;
|
|
119
|
+
const scopedSortSql = `('agent-run:v2:' || encode(sha256(convert_to(
|
|
120
|
+
'[' || to_json((${scopeTupleSql})::text)::text || ',' || (state_json->'runId')::text || ']',
|
|
121
|
+
'UTF8')), 'hex')) COLLATE "C"`;
|
|
93
122
|
const createIndexesSql = `
|
|
94
123
|
CREATE INDEX IF NOT EXISTS ${tableName}_updated_idx ON ${tableName} (updated_at_ms DESC, run_id);
|
|
124
|
+
CREATE INDEX IF NOT EXISTS ${tableName}_scope_hash_page_idx ON ${tableName} ((${scopeHashSql(tenantSql)}), (${scopeHashSql(userSql)}), (${scopeHashSql(namespaceSql)}), (${sortTimeSql}) DESC);
|
|
125
|
+
CREATE INDEX IF NOT EXISTS ${tableName}_logical_time_idx ON ${tableName} ((${sortTimeSql}) DESC);
|
|
95
126
|
CREATE INDEX IF NOT EXISTS ${parentTableName}_parent_idx ON ${parentTableName} (parent_run_id, updated_at_ms DESC);
|
|
96
127
|
CREATE INDEX IF NOT EXISTS ${leaseTableName}_expiry_idx ON ${leaseTableName} (expires_at_ms);
|
|
97
128
|
CREATE INDEX IF NOT EXISTS ${journalTableName}_run_idx ON ${journalTableName} (run_key, updated_at_ms, tool_call_id)
|
|
@@ -104,53 +135,79 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
104
135
|
await ensurePostgresTable(options.client, journalTableName, createJournalSql);
|
|
105
136
|
await ensurePostgresTable(options.client, `${tableName}:indexes`, createIndexesSql);
|
|
106
137
|
};
|
|
138
|
+
const physicalKey = async (runId, scope) => {
|
|
139
|
+
const targetScope = resolveScope(options.scope, scope);
|
|
140
|
+
const canonical = dbKey(runId, scope);
|
|
141
|
+
for (const key of [canonical, legacyScopedKey(targetScope, runId)]) {
|
|
142
|
+
const result = await options.client.query(`SELECT state_json FROM ${tableName} WHERE run_id = $1`, [key]);
|
|
143
|
+
const state = getRecordField(result.rows[0], ["state_json", "stateJson"]);
|
|
144
|
+
if (state && matchesRun(state, runId, targetScope))
|
|
145
|
+
return key;
|
|
146
|
+
if (state && key === canonical)
|
|
147
|
+
throw new ConflictError("Canonical agent key is occupied by a different legacy identity; migrate that identity before writing.");
|
|
148
|
+
}
|
|
149
|
+
return canonical;
|
|
150
|
+
};
|
|
151
|
+
const findByIdempotencyKey = async (idempotencyKey, scope) => {
|
|
152
|
+
const targetScope = resolveScope(options.scope, scope);
|
|
153
|
+
for (const key of [dbKey(idempotencyKey, scope), legacyScopedKey(targetScope, idempotencyKey)]) {
|
|
154
|
+
const result = await options.client.query(`SELECT runs.state_json FROM ${tableName} runs INNER JOIN ${idempotencyTableName} keys ON keys.run_id = runs.run_id WHERE keys.idempotency_key = $1`, [key]);
|
|
155
|
+
const state = getRecordField(result.rows[0], ["state_json", "stateJson"]);
|
|
156
|
+
if (state && state.idempotencyKey === idempotencyKey && matchesScope(state.scope, targetScope))
|
|
157
|
+
return normalizeAgentRunState(state);
|
|
158
|
+
if (state && key === dbKey(idempotencyKey, scope))
|
|
159
|
+
throw new ConflictError("Canonical idempotency key is occupied by a different legacy identity; migrate that index before writing.");
|
|
160
|
+
}
|
|
161
|
+
return undefined;
|
|
162
|
+
};
|
|
107
163
|
return {
|
|
108
164
|
async load(runId, scope) {
|
|
109
165
|
await ensureAllTables();
|
|
110
|
-
const result = await options.client.query(`SELECT state_json FROM ${tableName} WHERE run_id = $1`, [
|
|
166
|
+
const result = await options.client.query(`SELECT state_json FROM ${tableName} WHERE run_id = $1`, [await physicalKey(runId, scope)]);
|
|
111
167
|
const state = result.rows[0] ? (getRecordField(result.rows[0], ["state_json", "stateJson"]) ?? undefined) : undefined;
|
|
112
|
-
return state ? normalizeAgentRunState(state) : undefined;
|
|
168
|
+
return state && matchesRun(state, runId, resolveScope(options.scope, scope)) ? normalizeAgentRunState(state) : undefined;
|
|
113
169
|
},
|
|
114
170
|
async findByIdempotencyKey(idempotencyKey, scope) {
|
|
115
171
|
await ensureAllTables();
|
|
116
|
-
|
|
117
|
-
FROM ${tableName} runs
|
|
118
|
-
INNER JOIN ${idempotencyTableName} keys ON keys.run_id = runs.run_id
|
|
119
|
-
WHERE keys.idempotency_key = $1`, [dbKey(idempotencyKey, scope)]);
|
|
120
|
-
const state = result.rows[0] ? (getRecordField(result.rows[0], ["state_json", "stateJson"]) ?? undefined) : undefined;
|
|
121
|
-
return state ? normalizeAgentRunState(state) : undefined;
|
|
172
|
+
return findByIdempotencyKey(idempotencyKey, scope);
|
|
122
173
|
},
|
|
123
174
|
async findByParentRunId(parentRunId, scope) {
|
|
124
175
|
await ensureAllTables();
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
176
|
+
const targetScope = resolveScope(options.scope, scope);
|
|
177
|
+
const states = new Map();
|
|
178
|
+
for (const key of [dbKey(parentRunId, scope), legacyScopedKey(targetScope, parentRunId)]) {
|
|
179
|
+
const result = await options.client.query(`SELECT runs.state_json FROM ${tableName} runs INNER JOIN ${parentTableName} parents ON parents.run_id = runs.run_id WHERE parents.parent_run_id = $1`, [key]);
|
|
180
|
+
for (const row of result.rows) {
|
|
181
|
+
const state = getRecordField(row, ["state_json", "stateJson"]);
|
|
182
|
+
if (state && state.parentRunId === parentRunId && matchesScope(state.scope, targetScope))
|
|
183
|
+
states.set(state.runId, normalizeAgentRunState(state));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return [...states.values()];
|
|
133
187
|
},
|
|
134
188
|
async claimIdempotencyKey(state) {
|
|
135
189
|
await ensureAllTables();
|
|
136
190
|
const scope = resolveScope(options.scope, state.scope);
|
|
191
|
+
const existingOwner = await findByIdempotencyKey(state.idempotencyKey, scope);
|
|
192
|
+
if (existingOwner)
|
|
193
|
+
return { claimed: false, state: existingOwner };
|
|
137
194
|
const normalized = normalizeAgentRunState({ ...state, ...(scope ? { scope } : {}) });
|
|
138
195
|
const updatedAt = Date.now();
|
|
139
196
|
await options.client.query(`INSERT INTO ${tableName} (run_id, state_json, updated_at_ms)
|
|
140
197
|
VALUES ($1, $2::jsonb, $3)
|
|
141
|
-
ON CONFLICT(run_id) DO NOTHING`, [
|
|
198
|
+
ON CONFLICT(run_id) DO NOTHING`, [await physicalKey(normalized.runId, scope), normalized, updatedAt]);
|
|
142
199
|
const claim = await options.client.query(`INSERT INTO ${idempotencyTableName} (idempotency_key, run_id, updated_at_ms)
|
|
143
200
|
VALUES ($1, $2, $3)
|
|
144
201
|
ON CONFLICT(idempotency_key) DO NOTHING
|
|
145
|
-
RETURNING run_id`, [dbKey(state.idempotencyKey, scope),
|
|
202
|
+
RETURNING run_id`, [dbKey(state.idempotencyKey, scope), await physicalKey(normalized.runId, scope), updatedAt]);
|
|
146
203
|
const claimedRunId = getRecordField(claim.rows[0], ["run_id", "runId"]);
|
|
147
|
-
if (claimedRunId ===
|
|
204
|
+
if (claimedRunId === await physicalKey(normalized.runId, scope)) {
|
|
148
205
|
if (normalized.parentRunId) {
|
|
149
206
|
await options.client.query(`INSERT INTO ${parentTableName} (run_id, parent_run_id, updated_at_ms)
|
|
150
207
|
VALUES ($1, $2, $3)
|
|
151
208
|
ON CONFLICT(run_id) DO UPDATE SET
|
|
152
209
|
parent_run_id = EXCLUDED.parent_run_id,
|
|
153
|
-
updated_at_ms = EXCLUDED.updated_at_ms`, [
|
|
210
|
+
updated_at_ms = EXCLUDED.updated_at_ms`, [await physicalKey(normalized.runId, scope), dbKey(normalized.parentRunId, scope), updatedAt]);
|
|
154
211
|
}
|
|
155
212
|
return { claimed: true, state: normalized };
|
|
156
213
|
}
|
|
@@ -161,11 +218,11 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
161
218
|
const existingState = existing.rows[0]
|
|
162
219
|
? getRecordField(existing.rows[0], ["state_json", "stateJson"])
|
|
163
220
|
: undefined;
|
|
164
|
-
if (!existingState) {
|
|
165
|
-
throw new ConflictError("AgentRunState idempotency claim could not be loaded.");
|
|
221
|
+
if (!existingState || existingState.idempotencyKey !== state.idempotencyKey || !matchesScope(existingState.scope, scope)) {
|
|
222
|
+
throw new ConflictError("AgentRunState idempotency claim could not be loaded with the expected identity.");
|
|
166
223
|
}
|
|
167
224
|
if (existingState.runId !== normalized.runId) {
|
|
168
|
-
await options.client.query(`DELETE FROM ${tableName} WHERE run_id = $1`, [
|
|
225
|
+
await options.client.query(`DELETE FROM ${tableName} WHERE run_id = $1`, [await physicalKey(normalized.runId, scope)]);
|
|
169
226
|
}
|
|
170
227
|
return { claimed: false, state: normalizeAgentRunState(existingState) };
|
|
171
228
|
},
|
|
@@ -176,9 +233,12 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
176
233
|
const stored = { ...normalized, ...(scope ? { scope } : {}) };
|
|
177
234
|
const updatedAt = Date.now();
|
|
178
235
|
if (normalized.idempotencyKey) {
|
|
236
|
+
const existingOwner = await findByIdempotencyKey(normalized.idempotencyKey, scope);
|
|
237
|
+
if (existingOwner && existingOwner.runId !== normalized.runId)
|
|
238
|
+
throw new ConflictError("AgentRunState idempotency key conflict.");
|
|
179
239
|
const owner = await options.client.query(`SELECT run_id FROM ${idempotencyTableName} WHERE idempotency_key = $1`, [dbKey(normalized.idempotencyKey, scope)]);
|
|
180
240
|
const ownerRunId = getRecordField(owner.rows[0], ["run_id", "runId"]);
|
|
181
|
-
if (typeof ownerRunId === "string" && ownerRunId !==
|
|
241
|
+
if (typeof ownerRunId === "string" && ownerRunId !== await physicalKey(normalized.runId, scope)) {
|
|
182
242
|
throw new ConflictError("AgentRunState idempotency key conflict.");
|
|
183
243
|
}
|
|
184
244
|
}
|
|
@@ -187,7 +247,7 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
187
247
|
VALUES ($1, $2::jsonb, $3)
|
|
188
248
|
ON CONFLICT(run_id) DO UPDATE SET
|
|
189
249
|
state_json = EXCLUDED.state_json,
|
|
190
|
-
updated_at_ms = EXCLUDED.updated_at_ms`, [
|
|
250
|
+
updated_at_ms = EXCLUDED.updated_at_ms`, [await physicalKey(normalized.runId, scope), stored, updatedAt]);
|
|
191
251
|
}
|
|
192
252
|
else {
|
|
193
253
|
const saved = await options.client.query(`INSERT INTO ${tableName} (run_id, state_json, updated_at_ms)
|
|
@@ -196,28 +256,28 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
196
256
|
state_json = EXCLUDED.state_json,
|
|
197
257
|
updated_at_ms = EXCLUDED.updated_at_ms
|
|
198
258
|
WHERE COALESCE((${tableName}.state_json->>'revision')::bigint, 0) = $4
|
|
199
|
-
RETURNING run_id`, [
|
|
200
|
-
if (getRecordField(saved.rows[0], ["run_id", "runId"]) !==
|
|
259
|
+
RETURNING run_id`, [await physicalKey(normalized.runId, scope), stored, updatedAt, saveOptions.expectedRevision]);
|
|
260
|
+
if (getRecordField(saved.rows[0], ["run_id", "runId"]) !== await physicalKey(normalized.runId, scope)) {
|
|
201
261
|
throw new ConflictError("AgentRunState revision conflict.");
|
|
202
262
|
}
|
|
203
263
|
}
|
|
204
264
|
if (normalized.idempotencyKey) {
|
|
205
265
|
await options.client.query(`INSERT INTO ${idempotencyTableName} (idempotency_key, run_id, updated_at_ms)
|
|
206
266
|
VALUES ($1, $2, $3)
|
|
207
|
-
ON CONFLICT(idempotency_key) DO NOTHING`, [dbKey(normalized.idempotencyKey, scope),
|
|
267
|
+
ON CONFLICT(idempotency_key) DO NOTHING`, [dbKey(normalized.idempotencyKey, scope), await physicalKey(normalized.runId, scope), updatedAt]);
|
|
208
268
|
}
|
|
209
|
-
await options.client.query(`DELETE FROM ${parentTableName} WHERE run_id = $1`, [
|
|
269
|
+
await options.client.query(`DELETE FROM ${parentTableName} WHERE run_id = $1`, [await physicalKey(normalized.runId, scope)]);
|
|
210
270
|
if (normalized.parentRunId) {
|
|
211
271
|
await options.client.query(`INSERT INTO ${parentTableName} (run_id, parent_run_id, updated_at_ms)
|
|
212
272
|
VALUES ($1, $2, $3)
|
|
213
273
|
ON CONFLICT(run_id) DO UPDATE SET
|
|
214
274
|
parent_run_id = EXCLUDED.parent_run_id,
|
|
215
|
-
updated_at_ms = EXCLUDED.updated_at_ms`, [
|
|
275
|
+
updated_at_ms = EXCLUDED.updated_at_ms`, [await physicalKey(normalized.runId, scope), dbKey(normalized.parentRunId, scope), updatedAt]);
|
|
216
276
|
}
|
|
217
277
|
},
|
|
218
278
|
async delete(runId, scope) {
|
|
219
279
|
await ensureAllTables();
|
|
220
|
-
const key =
|
|
280
|
+
const key = await physicalKey(runId, scope);
|
|
221
281
|
await options.client.query(`WITH deleted_run AS (
|
|
222
282
|
DELETE FROM ${tableName} WHERE run_id = $1 RETURNING run_id
|
|
223
283
|
), deleted_idempotency AS (
|
|
@@ -229,14 +289,63 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
229
289
|
)
|
|
230
290
|
DELETE FROM ${journalTableName} WHERE run_key = $1`, [key]);
|
|
231
291
|
},
|
|
232
|
-
async list(listOptions, scope) {
|
|
292
|
+
async list(listOptions = {}, scope) {
|
|
293
|
+
const targetScope = resolveScope(options.scope, scope);
|
|
294
|
+
const { limit, cursor } = parseAgentRunListOptions(listOptions);
|
|
295
|
+
const parameters = [];
|
|
296
|
+
const bind = (value) => { parameters.push(value); return `$${parameters.length}`; };
|
|
297
|
+
const predicates = [];
|
|
298
|
+
if (targetScope) {
|
|
299
|
+
for (const [expression, value] of [
|
|
300
|
+
[tenantSql, targetScope.tenantId],
|
|
301
|
+
[userSql, targetScope.userId],
|
|
302
|
+
[namespaceSql, targetScope.namespace]
|
|
303
|
+
]) {
|
|
304
|
+
if (value === undefined) {
|
|
305
|
+
predicates.push(`${scopeHashSql(expression)} IS NULL`, `${expression} IS NULL`);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
const parameter = `${bind(value)}::text`;
|
|
309
|
+
predicates.push(`${scopeHashSql(expression)} = ${scopeHashSql(parameter)}`, `${expression} = ${parameter}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (listOptions.agentId !== undefined)
|
|
314
|
+
predicates.push(`state_json->>'agentId' = ${bind(listOptions.agentId)}::text`);
|
|
315
|
+
if (listOptions.parentRunId !== undefined)
|
|
316
|
+
predicates.push(`state_json->>'parentRunId' = ${bind(listOptions.parentRunId)}::text`);
|
|
317
|
+
if (listOptions.statuses?.length)
|
|
318
|
+
predicates.push(`state_json->>'status' = ANY(${bind(listOptions.statuses)}::text[])`);
|
|
319
|
+
if (listOptions.updatedAfter !== undefined)
|
|
320
|
+
predicates.push(`${updatedTimeSql} > ${bind(listOptions.updatedAfter)}::double precision`);
|
|
321
|
+
if (listOptions.updatedBefore !== undefined)
|
|
322
|
+
predicates.push(`${updatedTimeSql} < ${bind(listOptions.updatedBefore)}::double precision`);
|
|
323
|
+
let cursorPredicate = "";
|
|
324
|
+
if (cursor) {
|
|
325
|
+
const utf16RunId = Array.from({ length: cursor[1].length }, (_, index) => cursor[1].charCodeAt(index).toString(16).padStart(4, "0")).join("");
|
|
326
|
+
const time = bind(cursor[0]);
|
|
327
|
+
const id = bind(utf16RunId);
|
|
328
|
+
cursorPredicate = cursor[2] === undefined
|
|
329
|
+
? `WHERE (sort_time, run_id_sort) < (${time}::double precision, ${id}::text COLLATE "C")`
|
|
330
|
+
: `WHERE (sort_time, run_id_sort, scope_sort) < (${time}::double precision, ${id}::text COLLATE "C", ${bind(cursor[2])}::text COLLATE "C")`;
|
|
331
|
+
}
|
|
332
|
+
const query = `WITH candidates AS (
|
|
333
|
+
SELECT state_json, ${sortTimeSql} AS sort_time,
|
|
334
|
+
${runIdSortSql} AS run_id_sort, ${scopedSortSql} AS scope_sort
|
|
335
|
+
FROM ${tableName}
|
|
336
|
+
${predicates.length ? `WHERE ${predicates.join(" AND ")}` : ""}
|
|
337
|
+
)
|
|
338
|
+
SELECT state_json FROM candidates ${cursorPredicate}
|
|
339
|
+
ORDER BY sort_time DESC, run_id_sort DESC, scope_sort DESC
|
|
340
|
+
LIMIT ${bind(limit + 1)}::integer`;
|
|
233
341
|
await ensureAllTables();
|
|
234
|
-
const
|
|
235
|
-
const result = await options.client.query(`SELECT state_json FROM ${tableName} WHERE run_id >= $1 AND run_id < $2`, [prefix, `${prefix}\uffff`]);
|
|
342
|
+
const result = await options.client.query(query, parameters);
|
|
236
343
|
const states = result.rows.flatMap((row) => {
|
|
237
344
|
const state = getRecordField(row, ["state_json", "stateJson"]);
|
|
238
|
-
return state ? [normalizeAgentRunState(state)] : [];
|
|
345
|
+
return state && (!targetScope || matchesScope(state.scope, targetScope)) ? [normalizeAgentRunState(state)] : [];
|
|
239
346
|
});
|
|
347
|
+
// At most limit + 1 matching states cross the connection. Shared projection
|
|
348
|
+
// preserves exactly the same cursor format as memory, file and SQLite.
|
|
240
349
|
return listStates(states, listOptions);
|
|
241
350
|
},
|
|
242
351
|
async deleteExpired(retention, scope) {
|
|
@@ -249,7 +358,7 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
249
358
|
validateLeaseOptions(leaseOptions);
|
|
250
359
|
await ensureAllTables();
|
|
251
360
|
const now = leaseOptions.now ?? Date.now();
|
|
252
|
-
const key =
|
|
361
|
+
const key = await physicalKey(runId, scope);
|
|
253
362
|
const expiresAt = now + leaseOptions.ttlMs;
|
|
254
363
|
const result = await options.client.query(`INSERT INTO ${leaseTableName} (run_key, run_id, owner_id, expires_at_ms)
|
|
255
364
|
SELECT $1, $2, $3, $4
|
|
@@ -270,20 +379,22 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
270
379
|
const result = await options.client.query(`UPDATE ${leaseTableName}
|
|
271
380
|
SET expires_at_ms = $3
|
|
272
381
|
WHERE run_key = $1 AND owner_id = $2 AND expires_at_ms > $4
|
|
273
|
-
RETURNING owner_id`, [
|
|
382
|
+
RETURNING owner_id`, [await physicalKey(runId, scope), leaseOptions.ownerId, expiresAt, now]);
|
|
274
383
|
return getRecordField(result.rows[0], ["owner_id", "ownerId"]) === leaseOptions.ownerId
|
|
275
384
|
? { runId, ownerId: leaseOptions.ownerId, expiresAt }
|
|
276
385
|
: undefined;
|
|
277
386
|
},
|
|
278
387
|
async releaseLease(runId, ownerId, scope) {
|
|
279
388
|
await ensureAllTables();
|
|
280
|
-
const result = await options.client.query(`DELETE FROM ${leaseTableName} WHERE run_key = $1 AND owner_id = $2 RETURNING owner_id`, [
|
|
389
|
+
const result = await options.client.query(`DELETE FROM ${leaseTableName} WHERE run_key = $1 AND owner_id = $2 RETURNING owner_id`, [await physicalKey(runId, scope), ownerId]);
|
|
281
390
|
return getRecordField(result.rows[0], ["owner_id", "ownerId"]) === ownerId;
|
|
282
391
|
},
|
|
283
392
|
async loadToolCall(runId, toolCallId, scope) {
|
|
284
393
|
await ensureAllTables();
|
|
285
|
-
const result = await options.client.query(`SELECT entry_json FROM ${journalTableName} WHERE run_key = $1 AND tool_call_id = $2`, [
|
|
394
|
+
const result = await options.client.query(`SELECT entry_json FROM ${journalTableName} WHERE run_key = $1 AND tool_call_id = $2`, [await physicalKey(runId, scope), toolCallId]);
|
|
286
395
|
const entry = getRecordField(result.rows[0], ["entry_json", "entryJson"]);
|
|
396
|
+
if (entry && typeof entry === "object" && (!matchesRun(entry, runId, resolveScope(options.scope, scope)) || entry.toolCallId !== toolCallId))
|
|
397
|
+
throw new ConflictError("Persisted journal identity cannot be verified; reconcile or migrate before executing the tool.");
|
|
287
398
|
return entry && typeof entry === "object" ? cloneJournalEntry(entry) : undefined;
|
|
288
399
|
},
|
|
289
400
|
async loadToolExecution(runId, toolCallId, scope) {
|
|
@@ -291,16 +402,20 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
291
402
|
},
|
|
292
403
|
async listToolCalls(runId, scope) {
|
|
293
404
|
await ensureAllTables();
|
|
294
|
-
const result = await options.client.query(`SELECT entry_json FROM ${journalTableName} WHERE run_key = $1 ORDER BY updated_at_ms, tool_call_id`, [
|
|
405
|
+
const result = await options.client.query(`SELECT entry_json FROM ${journalTableName} WHERE run_key = $1 ORDER BY updated_at_ms, tool_call_id`, [await physicalKey(runId, scope)]);
|
|
295
406
|
return result.rows.flatMap((row) => {
|
|
296
407
|
const entry = getRecordField(row, ["entry_json", "entryJson"]);
|
|
408
|
+
if (entry && typeof entry === "object" && !matchesRun(entry, runId, resolveScope(options.scope, scope)))
|
|
409
|
+
throw new ConflictError("Persisted journal identity cannot be verified; reconcile or migrate before continuing.");
|
|
297
410
|
return entry && typeof entry === "object" ? [cloneJournalEntry(entry)] : [];
|
|
298
411
|
});
|
|
299
412
|
},
|
|
300
413
|
async saveToolCall(entry, journalOptions) {
|
|
301
414
|
await ensureAllTables();
|
|
302
|
-
|
|
303
|
-
const
|
|
415
|
+
await this.loadToolCall?.(entry.runId, entry.toolCallId, entry.scope);
|
|
416
|
+
const scope = resolveScope(options.scope, entry.scope);
|
|
417
|
+
const next = nextJournalEntry({ ...entry, ...(scope ? { scope } : {}) }, journalOptions);
|
|
418
|
+
const key = await physicalKey(entry.runId, entry.scope);
|
|
304
419
|
const result = journalOptions?.expectedRevision === undefined
|
|
305
420
|
? await options.client.query(`INSERT INTO ${journalTableName} (run_key, tool_call_id, entry_json, revision, updated_at_ms)
|
|
306
421
|
VALUES ($1, $2, $3::jsonb, $4, $5)
|
|
@@ -322,12 +437,13 @@ export const createPostgresAgentRunStore = (options) => {
|
|
|
322
437
|
},
|
|
323
438
|
async claimToolExecution(entry) {
|
|
324
439
|
await ensureAllTables();
|
|
325
|
-
const
|
|
440
|
+
const scope = resolveScope(options.scope, entry.scope);
|
|
441
|
+
const next = nextJournalEntry({ ...entry, ...(scope ? { scope } : {}), status: "running", revision: 0 });
|
|
326
442
|
const result = await options.client.query(`INSERT INTO ${journalTableName} (run_key, tool_call_id, entry_json, revision, updated_at_ms)
|
|
327
443
|
SELECT $1, $2, $3::jsonb, 0, $4
|
|
328
444
|
WHERE EXISTS (SELECT 1 FROM ${tableName} WHERE run_id = $1)
|
|
329
445
|
ON CONFLICT(run_key, tool_call_id) DO NOTHING
|
|
330
|
-
RETURNING entry_json`, [
|
|
446
|
+
RETURNING entry_json`, [await physicalKey(entry.runId, entry.scope), entry.toolCallId, next, next.updatedAt]);
|
|
331
447
|
const claimed = getRecordField(result.rows[0], ["entry_json", "entryJson"]);
|
|
332
448
|
if (claimed && typeof claimed === "object")
|
|
333
449
|
return { claimed: true, entry: next };
|
|
@@ -345,6 +461,9 @@ export const createPostgresAgentMemoryStore = (options) => {
|
|
|
345
461
|
assertPostgresClient(options.client);
|
|
346
462
|
const tableName = validateIdentifier(options.tableName ?? "zhivex_agent_memory", "tableName");
|
|
347
463
|
const keyFor = (context) => (options.key ?? defaultMemoryKey)({ ...context, scope: resolveScope(options.scope, context.scope) });
|
|
464
|
+
const memoryContext = (context) => ({ ...context, scope: resolveScope(options.scope, context.scope) });
|
|
465
|
+
const encode = (context, messages) => options.key ? messages : encodeAgentMemory(memoryContext(context), messages);
|
|
466
|
+
const decode = (context, value) => options.key ? value : decodeAgentMemory(memoryContext(context), value);
|
|
348
467
|
const selectMessages = options.selectMessages ?? defaultMemoryMessages;
|
|
349
468
|
const createSql = `
|
|
350
469
|
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
@@ -353,21 +472,36 @@ export const createPostgresAgentMemoryStore = (options) => {
|
|
|
353
472
|
updated_at_ms BIGINT NOT NULL
|
|
354
473
|
)
|
|
355
474
|
`;
|
|
475
|
+
const assertMemoryIdentity = async (context) => {
|
|
476
|
+
if (options.key)
|
|
477
|
+
return;
|
|
478
|
+
const canonical = await options.client.query(`SELECT messages_json FROM ${tableName} WHERE memory_key = $1`, [keyFor(context)]);
|
|
479
|
+
if (canonical.rows.length) {
|
|
480
|
+
decode(context, getRecordField(canonical.rows[0], ["messages_json", "messagesJson"]));
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const legacy = legacyDefaultMemoryKey({ ...context, scope: resolveScope(options.scope, context.scope) });
|
|
484
|
+
const previous = await options.client.query(`SELECT messages_json FROM ${tableName} WHERE memory_key = $1`, [legacy]);
|
|
485
|
+
if (previous.rows.length)
|
|
486
|
+
throw new ValidationError(LEGACY_MEMORY_MIGRATION_MESSAGE);
|
|
487
|
+
};
|
|
356
488
|
return {
|
|
357
489
|
async load(context) {
|
|
358
490
|
await ensurePostgresTable(options.client, tableName, createSql);
|
|
491
|
+
await assertMemoryIdentity(context);
|
|
359
492
|
const result = await options.client.query(`SELECT messages_json FROM ${tableName} WHERE memory_key = $1`, [keyFor(context)]);
|
|
360
493
|
return result.rows[0]
|
|
361
|
-
? (getRecordField(result.rows[0], ["messages_json", "messagesJson"])
|
|
494
|
+
? decode(context, getRecordField(result.rows[0], ["messages_json", "messagesJson"]))
|
|
362
495
|
: [];
|
|
363
496
|
},
|
|
364
497
|
async save(context) {
|
|
365
498
|
await ensurePostgresTable(options.client, tableName, createSql);
|
|
499
|
+
await assertMemoryIdentity(context);
|
|
366
500
|
await options.client.query(`INSERT INTO ${tableName} (memory_key, messages_json, updated_at_ms)
|
|
367
501
|
VALUES ($1, $2::jsonb, $3)
|
|
368
502
|
ON CONFLICT(memory_key) DO UPDATE SET
|
|
369
503
|
messages_json = EXCLUDED.messages_json,
|
|
370
|
-
updated_at_ms = EXCLUDED.updated_at_ms`, [keyFor(context), selectMessages(context.state), Date.now()]);
|
|
504
|
+
updated_at_ms = EXCLUDED.updated_at_ms`, [keyFor(context), encode(context, selectMessages(context.state)), Date.now()]);
|
|
371
505
|
}
|
|
372
506
|
};
|
|
373
507
|
};
|