@evelinka-ai/core 0.1.3
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/README.md +16 -0
- package/dist/agent-lib/llm-semaphore.d.ts +47 -0
- package/dist/agent-lib/llm-semaphore.d.ts.map +1 -0
- package/dist/agent-lib/llm-semaphore.js +255 -0
- package/dist/agent-lib/llm-semaphore.js.map +1 -0
- package/dist/agent-lib/managed-tool.d.ts +29 -0
- package/dist/agent-lib/managed-tool.d.ts.map +1 -0
- package/dist/agent-lib/managed-tool.js +28 -0
- package/dist/agent-lib/managed-tool.js.map +1 -0
- package/dist/channels/catalog.d.ts +3 -0
- package/dist/channels/catalog.d.ts.map +1 -0
- package/dist/channels/catalog.js +20 -0
- package/dist/channels/catalog.js.map +1 -0
- package/dist/channels/model-catalog.d.ts +3 -0
- package/dist/channels/model-catalog.d.ts.map +1 -0
- package/dist/channels/model-catalog.js +6 -0
- package/dist/channels/model-catalog.js.map +1 -0
- package/dist/channels/usage.d.ts +3 -0
- package/dist/channels/usage.d.ts.map +1 -0
- package/dist/channels/usage.js +35 -0
- package/dist/channels/usage.js.map +1 -0
- package/dist/lib/atomic-file.d.ts +2 -0
- package/dist/lib/atomic-file.d.ts.map +1 -0
- package/dist/lib/atomic-file.js +16 -0
- package/dist/lib/atomic-file.js.map +1 -0
- package/dist/lib/budgets/record-call-usage.d.ts +31 -0
- package/dist/lib/budgets/record-call-usage.d.ts.map +1 -0
- package/dist/lib/budgets/record-call-usage.js +44 -0
- package/dist/lib/budgets/record-call-usage.js.map +1 -0
- package/dist/lib/budgets/token-budget.d.ts +61 -0
- package/dist/lib/budgets/token-budget.d.ts.map +1 -0
- package/dist/lib/budgets/token-budget.js +250 -0
- package/dist/lib/budgets/token-budget.js.map +1 -0
- package/dist/lib/budgets/token-usage-pg.d.ts +96 -0
- package/dist/lib/budgets/token-usage-pg.d.ts.map +1 -0
- package/dist/lib/budgets/token-usage-pg.js +305 -0
- package/dist/lib/budgets/token-usage-pg.js.map +1 -0
- package/dist/lib/budgets/usage.d.ts +103 -0
- package/dist/lib/budgets/usage.d.ts.map +1 -0
- package/dist/lib/budgets/usage.js +151 -0
- package/dist/lib/budgets/usage.js.map +1 -0
- package/dist/lib/control-plane/call-context.d.ts +7 -0
- package/dist/lib/control-plane/call-context.d.ts.map +1 -0
- package/dist/lib/control-plane/call-context.js +9 -0
- package/dist/lib/control-plane/call-context.js.map +1 -0
- package/dist/lib/control-plane/catalog.d.ts +33 -0
- package/dist/lib/control-plane/catalog.d.ts.map +1 -0
- package/dist/lib/control-plane/catalog.js +163 -0
- package/dist/lib/control-plane/catalog.js.map +1 -0
- package/dist/lib/control-plane/flow-settings.d.ts +32 -0
- package/dist/lib/control-plane/flow-settings.d.ts.map +1 -0
- package/dist/lib/control-plane/flow-settings.js +139 -0
- package/dist/lib/control-plane/flow-settings.js.map +1 -0
- package/dist/lib/control-plane/tools-config.d.ts +30 -0
- package/dist/lib/control-plane/tools-config.d.ts.map +1 -0
- package/dist/lib/control-plane/tools-config.js +104 -0
- package/dist/lib/control-plane/tools-config.js.map +1 -0
- package/dist/lib/delivery/push-store.d.ts +20 -0
- package/dist/lib/delivery/push-store.d.ts.map +1 -0
- package/dist/lib/delivery/push-store.js +74 -0
- package/dist/lib/delivery/push-store.js.map +1 -0
- package/dist/lib/delivery/push.d.ts +15 -0
- package/dist/lib/delivery/push.d.ts.map +1 -0
- package/dist/lib/delivery/push.js +97 -0
- package/dist/lib/delivery/push.js.map +1 -0
- package/dist/lib/delivery/schedule-lock.d.ts +16 -0
- package/dist/lib/delivery/schedule-lock.d.ts.map +1 -0
- package/dist/lib/delivery/schedule-lock.js +86 -0
- package/dist/lib/delivery/schedule-lock.js.map +1 -0
- package/dist/lib/memory/memory-dream.d.ts +181 -0
- package/dist/lib/memory/memory-dream.d.ts.map +1 -0
- package/dist/lib/memory/memory-dream.js +405 -0
- package/dist/lib/memory/memory-dream.js.map +1 -0
- package/dist/lib/memory/memory-vault-git.d.ts +14 -0
- package/dist/lib/memory/memory-vault-git.d.ts.map +1 -0
- package/dist/lib/memory/memory-vault-git.js +345 -0
- package/dist/lib/memory/memory-vault-git.js.map +1 -0
- package/dist/lib/memory/memory-vault.d.ts +83 -0
- package/dist/lib/memory/memory-vault.d.ts.map +1 -0
- package/dist/lib/memory/memory-vault.js +466 -0
- package/dist/lib/memory/memory-vault.js.map +1 -0
- package/dist/lib/memory/static-instructions.d.ts +2 -0
- package/dist/lib/memory/static-instructions.d.ts.map +1 -0
- package/dist/lib/memory/static-instructions.js +48 -0
- package/dist/lib/memory/static-instructions.js.map +1 -0
- package/dist/lib/memory/vault-explorer.d.ts +37 -0
- package/dist/lib/memory/vault-explorer.d.ts.map +1 -0
- package/dist/lib/memory/vault-explorer.js +212 -0
- package/dist/lib/memory/vault-explorer.js.map +1 -0
- package/dist/lib/models/llm-concurrency.d.ts +29 -0
- package/dist/lib/models/llm-concurrency.d.ts.map +1 -0
- package/dist/lib/models/llm-concurrency.js +103 -0
- package/dist/lib/models/llm-concurrency.js.map +1 -0
- package/dist/lib/models/model-catalog.d.ts +32 -0
- package/dist/lib/models/model-catalog.d.ts.map +1 -0
- package/dist/lib/models/model-catalog.js +115 -0
- package/dist/lib/models/model-catalog.js.map +1 -0
- package/dist/lib/models/model-config.d.ts +27 -0
- package/dist/lib/models/model-config.d.ts.map +1 -0
- package/dist/lib/models/model-config.js +155 -0
- package/dist/lib/models/model-config.js.map +1 -0
- package/dist/lib/observability/console-link.d.ts +3 -0
- package/dist/lib/observability/console-link.d.ts.map +1 -0
- package/dist/lib/observability/console-link.js +15 -0
- package/dist/lib/observability/console-link.js.map +1 -0
- package/dist/lib/observability/event-bus.d.ts +11 -0
- package/dist/lib/observability/event-bus.d.ts.map +1 -0
- package/dist/lib/observability/event-bus.js +24 -0
- package/dist/lib/observability/event-bus.js.map +1 -0
- package/dist/lib/observability/logger.d.ts +5 -0
- package/dist/lib/observability/logger.d.ts.map +1 -0
- package/dist/lib/observability/logger.js +47 -0
- package/dist/lib/observability/logger.js.map +1 -0
- package/dist/lib/observability/payload-store.d.ts +8 -0
- package/dist/lib/observability/payload-store.d.ts.map +1 -0
- package/dist/lib/observability/payload-store.js +101 -0
- package/dist/lib/observability/payload-store.js.map +1 -0
- package/dist/lib/observability/recorder-hook.d.ts +22 -0
- package/dist/lib/observability/recorder-hook.d.ts.map +1 -0
- package/dist/lib/observability/recorder-hook.js +241 -0
- package/dist/lib/observability/recorder-hook.js.map +1 -0
- package/dist/lib/observability/recorder.d.ts +339 -0
- package/dist/lib/observability/recorder.d.ts.map +1 -0
- package/dist/lib/observability/recorder.js +1182 -0
- package/dist/lib/observability/recorder.js.map +1 -0
- package/dist/tenant.d.ts +59 -0
- package/dist/tenant.d.ts.map +1 -0
- package/dist/tenant.js +18 -0
- package/dist/tenant.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { consolePath } from "../observability/console-link.js";
|
|
2
|
+
import { logger } from "../observability/logger.js";
|
|
3
|
+
import { tenant } from "../../tenant.js";
|
|
4
|
+
import { readPrefs, readSubscriptions, removeSubscription } from "./push-store.js";
|
|
5
|
+
const log = logger.child({ module: "push" });
|
|
6
|
+
export function vapidConfigured() {
|
|
7
|
+
return !!(process.env.VAPID_PUBLIC_KEY && process.env.VAPID_PRIVATE_KEY);
|
|
8
|
+
}
|
|
9
|
+
export function vapidPublicKey() {
|
|
10
|
+
return process.env.VAPID_PUBLIC_KEY ?? null;
|
|
11
|
+
}
|
|
12
|
+
let vapidSet = false;
|
|
13
|
+
async function getWebPush() {
|
|
14
|
+
const mod = await import("web-push");
|
|
15
|
+
const webpush = mod.default ?? mod;
|
|
16
|
+
if (!vapidSet && vapidConfigured()) {
|
|
17
|
+
webpush.setVapidDetails(process.env.VAPID_SUBJECT ?? "mailto:ops@localhost", process.env.VAPID_PUBLIC_KEY, process.env.VAPID_PRIVATE_KEY);
|
|
18
|
+
vapidSet = true;
|
|
19
|
+
}
|
|
20
|
+
return webpush;
|
|
21
|
+
}
|
|
22
|
+
export async function sendPushToAll(payload) {
|
|
23
|
+
if (!vapidConfigured())
|
|
24
|
+
return { sent: 0, pruned: 0 };
|
|
25
|
+
let webpush;
|
|
26
|
+
try {
|
|
27
|
+
webpush = await getWebPush();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
log.error({ err }, "web-push unavailable");
|
|
31
|
+
return { sent: 0, pruned: 0 };
|
|
32
|
+
}
|
|
33
|
+
const subs = readSubscriptions();
|
|
34
|
+
let sent = 0;
|
|
35
|
+
let pruned = 0;
|
|
36
|
+
await Promise.all(subs.map(async (sub) => {
|
|
37
|
+
try {
|
|
38
|
+
await webpush.sendNotification(sub, JSON.stringify(payload));
|
|
39
|
+
sent++;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const status = err.statusCode;
|
|
43
|
+
if (status === 404 || status === 410) {
|
|
44
|
+
removeSubscription(sub.endpoint);
|
|
45
|
+
pruned++;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
log.warn({ status, endpoint: sub.endpoint.slice(0, 48) }, "push send failed");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
return { sent, pruned };
|
|
53
|
+
}
|
|
54
|
+
const notified = new Set();
|
|
55
|
+
export async function notify(kind, sessionId) {
|
|
56
|
+
try {
|
|
57
|
+
if (!vapidConfigured())
|
|
58
|
+
return;
|
|
59
|
+
const key = `${sessionId}:${kind}`;
|
|
60
|
+
if (notified.has(key))
|
|
61
|
+
return;
|
|
62
|
+
const prefs = readPrefs();
|
|
63
|
+
if (kind === "approval" && !prefs.approvalWaiting)
|
|
64
|
+
return;
|
|
65
|
+
if (kind === "failed" && !prefs.runFailed)
|
|
66
|
+
return;
|
|
67
|
+
if (kind === "done" && !prefs.runDone)
|
|
68
|
+
return;
|
|
69
|
+
notified.add(key);
|
|
70
|
+
const product = tenant().displayName ?? tenant().name;
|
|
71
|
+
const payload = kind === "approval"
|
|
72
|
+
? {
|
|
73
|
+
title: "Approval needed",
|
|
74
|
+
body: `${product} is waiting for your approval — tap to review.`,
|
|
75
|
+
url: consolePath("/approvals"),
|
|
76
|
+
tag: "eve-approval",
|
|
77
|
+
}
|
|
78
|
+
: kind === "failed"
|
|
79
|
+
? {
|
|
80
|
+
title: "Run failed",
|
|
81
|
+
body: `A ${product} run failed — tap to view.`,
|
|
82
|
+
url: consolePath(`/runs/${sessionId}`),
|
|
83
|
+
tag: `eve-fail-${sessionId}`,
|
|
84
|
+
}
|
|
85
|
+
: {
|
|
86
|
+
title: "Run complete",
|
|
87
|
+
body: `A ${product} run finished.`,
|
|
88
|
+
url: consolePath(`/runs/${sessionId}`),
|
|
89
|
+
tag: `eve-done-${sessionId}`,
|
|
90
|
+
};
|
|
91
|
+
await sendPushToAll(payload);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
log.warn({ err, kind, sessionId }, "push notify failed");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/lib/delivery/push.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEnF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAS7C,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,KAAK,UAAU,UAAU;IACvB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,OAAO,GAAI,GAA6B,CAAC,OAAO,IAAI,GAAG,CAAC;IAC9D,IAAI,CAAC,QAAQ,IAAI,eAAe,EAAE,EAAE,CAAC;QAEjC,OACD,CAAC,eAAe,CACf,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,sBAAsB,EACnD,OAAO,CAAC,GAAG,CAAC,gBAA0B,EACtC,OAAO,CAAC,GAAG,CAAC,iBAA2B,CACxC,CAAC;QACF,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAoB;IAEpB,IAAI,CAAC,eAAe,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACtD,IAAI,OAA+C,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAChC,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7D,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAI,GAA+B,CAAC,UAAU,CAAC;YAC3D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACrC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACjC,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAKD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAMnC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAmB,EAAE,SAAiB;IACjE,IAAI,CAAC;QACH,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QAC/B,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;QACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC9B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,eAAe;YAAE,OAAO;QAC1D,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QAClD,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QAC9C,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC,IAAI,CAAC;QACtD,MAAM,OAAO,GACX,IAAI,KAAK,UAAU;YACjB,CAAC,CAAC;gBACE,KAAK,EAAE,iBAAiB;gBACxB,IAAI,EAAE,GAAG,OAAO,gDAAgD;gBAChE,GAAG,EAAE,WAAW,CAAC,YAAY,CAAC;gBAC9B,GAAG,EAAE,cAAc;aACpB;YACH,CAAC,CAAC,IAAI,KAAK,QAAQ;gBACjB,CAAC,CAAC;oBACE,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,KAAK,OAAO,4BAA4B;oBAC9C,GAAG,EAAE,WAAW,CAAC,SAAS,SAAS,EAAE,CAAC;oBACtC,GAAG,EAAE,YAAY,SAAS,EAAE;iBAC7B;gBACH,CAAC,CAAC;oBACE,KAAK,EAAE,cAAc;oBACrB,IAAI,EAAE,KAAK,OAAO,gBAAgB;oBAClC,GAAG,EAAE,WAAW,CAAC,SAAS,SAAS,EAAE,CAAC;oBACtC,GAAG,EAAE,YAAY,SAAS,EAAE;iBAC7B,CAAC;QACV,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ScheduleRunHandler } from "eve/schedules";
|
|
2
|
+
export interface LockClient {
|
|
3
|
+
query(sql: string, values?: unknown[]): Promise<{
|
|
4
|
+
rows: Array<Record<string, unknown>>;
|
|
5
|
+
}>;
|
|
6
|
+
release(destroy?: boolean): void;
|
|
7
|
+
}
|
|
8
|
+
export interface LockPool {
|
|
9
|
+
connect(): Promise<LockClient>;
|
|
10
|
+
}
|
|
11
|
+
export declare function schedulePoolConfig(): {
|
|
12
|
+
max: number;
|
|
13
|
+
connectionTimeoutMillis: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function exclusiveSchedule(name: string, run: ScheduleRunHandler, injectedPool?: LockPool): ScheduleRunHandler;
|
|
16
|
+
//# sourceMappingURL=schedule-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-lock.d.ts","sourceRoot":"","sources":["../../../src/lib/delivery/schedule-lock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA0B7E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IAE1F,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAClC;AAGD,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAChC;AA0BD,wBAAgB,kBAAkB,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,uBAAuB,EAAE,MAAM,CAAA;CAAE,CAErF;AA8BD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,kBAAkB,EACvB,YAAY,CAAC,EAAE,QAAQ,GACtB,kBAAkB,CA4EpB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Pool } from "pg";
|
|
2
|
+
import { logger } from "../observability/logger.js";
|
|
3
|
+
const log = logger.child({ module: "schedule-lock" });
|
|
4
|
+
let pool;
|
|
5
|
+
const registered = new Set();
|
|
6
|
+
const CONNECT_TIMEOUT_MS = 5_000;
|
|
7
|
+
export function schedulePoolConfig() {
|
|
8
|
+
return { max: registered.size + 2, connectionTimeoutMillis: CONNECT_TIMEOUT_MS };
|
|
9
|
+
}
|
|
10
|
+
function getPool() {
|
|
11
|
+
const url = process.env.WORKFLOW_POSTGRES_URL;
|
|
12
|
+
if (!url)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (!pool)
|
|
15
|
+
pool = new Pool({ connectionString: url, ...schedulePoolConfig() });
|
|
16
|
+
return pool;
|
|
17
|
+
}
|
|
18
|
+
function acquired(rows) {
|
|
19
|
+
const v = rows[0]?.ok;
|
|
20
|
+
return v === true || v === "t";
|
|
21
|
+
}
|
|
22
|
+
export function exclusiveSchedule(name, run, injectedPool) {
|
|
23
|
+
const key = `eve-schedule:${name}`;
|
|
24
|
+
registered.add(name);
|
|
25
|
+
return async (args) => {
|
|
26
|
+
const p = injectedPool ?? getPool();
|
|
27
|
+
if (!p) {
|
|
28
|
+
log.debug({ schedule: name }, "WORKFLOW_POSTGRES_URL unset — running tick unguarded");
|
|
29
|
+
await run(args);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let client;
|
|
33
|
+
try {
|
|
34
|
+
client = await p.connect();
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
log.error({ err, schedule: name }, "advisory-lock connect failed — running tick unguarded");
|
|
38
|
+
await run(args);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let locked = false;
|
|
42
|
+
try {
|
|
43
|
+
const res = await client.query("SELECT pg_try_advisory_lock(hashtext($1)::bigint) AS ok", [
|
|
44
|
+
key,
|
|
45
|
+
]);
|
|
46
|
+
locked = acquired(res.rows);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
client.release();
|
|
50
|
+
log.error({ err, schedule: name }, "advisory-lock query failed — running tick unguarded");
|
|
51
|
+
await run(args);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!locked) {
|
|
55
|
+
client.release();
|
|
56
|
+
log.debug({ schedule: name }, "tick skipped — another replica holds the schedule lock");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const tracked = [];
|
|
60
|
+
const ctx = {
|
|
61
|
+
...args,
|
|
62
|
+
waitUntil: (task) => {
|
|
63
|
+
tracked.push(task);
|
|
64
|
+
args.waitUntil(task);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
await run(ctx);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
while (tracked.length > 0) {
|
|
72
|
+
await Promise.allSettled(tracked.splice(0, tracked.length));
|
|
73
|
+
}
|
|
74
|
+
let unlocked = false;
|
|
75
|
+
try {
|
|
76
|
+
await client.query("SELECT pg_advisory_unlock(hashtext($1)::bigint) AS ok", [key]);
|
|
77
|
+
unlocked = true;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
log.error({ err, schedule: name }, "advisory unlock failed — destroying the connection");
|
|
81
|
+
}
|
|
82
|
+
client.release(unlocked ? undefined : true);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=schedule-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-lock.js","sourceRoot":"","sources":["../../../src/lib/delivery/schedule-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export type RuleLayer = "domain" | "profile";
|
|
3
|
+
export type RuleProvenance = "operator" | "dreamed" | "migrated";
|
|
4
|
+
export interface MemoryEvent {
|
|
5
|
+
id: string;
|
|
6
|
+
scope: string;
|
|
7
|
+
kind: string;
|
|
8
|
+
summary: string;
|
|
9
|
+
payload: Record<string, unknown>;
|
|
10
|
+
sourceSession: string | null;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
13
|
+
export interface MemoryRule {
|
|
14
|
+
id: string;
|
|
15
|
+
scope: string;
|
|
16
|
+
layer: RuleLayer;
|
|
17
|
+
rule: string;
|
|
18
|
+
why: string | null;
|
|
19
|
+
confidence: number;
|
|
20
|
+
support: number;
|
|
21
|
+
provenance: RuleProvenance;
|
|
22
|
+
pinned: boolean;
|
|
23
|
+
sources: string[];
|
|
24
|
+
createdAt: string;
|
|
25
|
+
lastReinforcedAt: string;
|
|
26
|
+
invalidatedAt: string | null;
|
|
27
|
+
invalidatedBy: string | null;
|
|
28
|
+
meta: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
export interface RuleInsert {
|
|
31
|
+
id?: string;
|
|
32
|
+
scope: string;
|
|
33
|
+
layer?: RuleLayer;
|
|
34
|
+
rule: string;
|
|
35
|
+
why?: string | null;
|
|
36
|
+
confidence: number;
|
|
37
|
+
support?: number;
|
|
38
|
+
provenance: RuleProvenance;
|
|
39
|
+
pinned?: boolean;
|
|
40
|
+
sources?: string[];
|
|
41
|
+
createdAt?: string;
|
|
42
|
+
meta?: Record<string, string>;
|
|
43
|
+
}
|
|
44
|
+
export type PlannedChange = {
|
|
45
|
+
type: "insert";
|
|
46
|
+
row: RuleInsert & {
|
|
47
|
+
id: string;
|
|
48
|
+
};
|
|
49
|
+
} | {
|
|
50
|
+
type: "reinforce";
|
|
51
|
+
id: string;
|
|
52
|
+
confidence: number;
|
|
53
|
+
addSources: string[];
|
|
54
|
+
} | {
|
|
55
|
+
type: "invalidate";
|
|
56
|
+
id: string;
|
|
57
|
+
byId: string | null;
|
|
58
|
+
};
|
|
59
|
+
export interface DreamRunOp {
|
|
60
|
+
scope: string;
|
|
61
|
+
op: string;
|
|
62
|
+
detail: string;
|
|
63
|
+
}
|
|
64
|
+
export interface DreamLogger {
|
|
65
|
+
warn(fields: Record<string, unknown>, message: string): void;
|
|
66
|
+
error(fields: Record<string, unknown>, message: string): void;
|
|
67
|
+
info(fields: Record<string, unknown>, message: string): void;
|
|
68
|
+
}
|
|
69
|
+
export interface MemoryDreamAdapter {
|
|
70
|
+
logger: DreamLogger;
|
|
71
|
+
ingesters: ReadonlyArray<{
|
|
72
|
+
name: string;
|
|
73
|
+
run: () => Promise<number>;
|
|
74
|
+
}>;
|
|
75
|
+
listMemoryRules(opts?: {
|
|
76
|
+
scope?: string;
|
|
77
|
+
includeInvalidated?: boolean;
|
|
78
|
+
}): Promise<MemoryRule[]>;
|
|
79
|
+
applyPlannedChanges(changes: PlannedChange[]): Promise<number | null>;
|
|
80
|
+
markEventsProcessed(ids: string[]): Promise<void>;
|
|
81
|
+
decayStaleRules(opts?: {
|
|
82
|
+
reviewFloor?: number;
|
|
83
|
+
}): Promise<MemoryRule[]>;
|
|
84
|
+
unprocessedEventsByScope(): Promise<Map<string, MemoryEvent[]>>;
|
|
85
|
+
pruneMemoryEngineEvents(days?: number): Promise<number>;
|
|
86
|
+
startDreamRun(kind: "nightly" | "weekly" | "manual"): Promise<string | null>;
|
|
87
|
+
finishDreamRun(id: string | null, result: {
|
|
88
|
+
summary: string;
|
|
89
|
+
scopes: string[];
|
|
90
|
+
ops: DreamRunOp[];
|
|
91
|
+
counts: Record<string, number>;
|
|
92
|
+
error?: string | null;
|
|
93
|
+
}): Promise<void>;
|
|
94
|
+
rebuildMemoryRenderings(): Promise<void>;
|
|
95
|
+
writeDreamNote(input: {
|
|
96
|
+
kind: "nightly" | "weekly" | "manual";
|
|
97
|
+
summary: string;
|
|
98
|
+
ops: DreamRunOp[];
|
|
99
|
+
}): Promise<unknown>;
|
|
100
|
+
}
|
|
101
|
+
export declare const REVIEW_FLOOR = 20;
|
|
102
|
+
declare const OpSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
103
|
+
op: z.ZodLiteral<"add">;
|
|
104
|
+
rule: z.ZodString;
|
|
105
|
+
why: z.ZodOptional<z.ZodString>;
|
|
106
|
+
confidence: z.ZodNumber;
|
|
107
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
108
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
109
|
+
op: z.ZodLiteral<"strengthen">;
|
|
110
|
+
ruleId: z.ZodString;
|
|
111
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
112
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
113
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
114
|
+
op: z.ZodLiteral<"generalize">;
|
|
115
|
+
ruleIds: z.ZodArray<z.ZodString>;
|
|
116
|
+
rule: z.ZodString;
|
|
117
|
+
why: z.ZodOptional<z.ZodString>;
|
|
118
|
+
confidence: z.ZodNumber;
|
|
119
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
120
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
121
|
+
op: z.ZodLiteral<"invalidate">;
|
|
122
|
+
ruleId: z.ZodString;
|
|
123
|
+
reason: z.ZodString;
|
|
124
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
125
|
+
}, z.core.$strip>], "op">;
|
|
126
|
+
export declare const DreamOpsSchema: z.ZodObject<{
|
|
127
|
+
ops: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
128
|
+
op: z.ZodLiteral<"add">;
|
|
129
|
+
rule: z.ZodString;
|
|
130
|
+
why: z.ZodOptional<z.ZodString>;
|
|
131
|
+
confidence: z.ZodNumber;
|
|
132
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
133
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
134
|
+
op: z.ZodLiteral<"strengthen">;
|
|
135
|
+
ruleId: z.ZodString;
|
|
136
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
137
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
138
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
139
|
+
op: z.ZodLiteral<"generalize">;
|
|
140
|
+
ruleIds: z.ZodArray<z.ZodString>;
|
|
141
|
+
rule: z.ZodString;
|
|
142
|
+
why: z.ZodOptional<z.ZodString>;
|
|
143
|
+
confidence: z.ZodNumber;
|
|
144
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
145
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
146
|
+
op: z.ZodLiteral<"invalidate">;
|
|
147
|
+
ruleId: z.ZodString;
|
|
148
|
+
reason: z.ZodString;
|
|
149
|
+
sources: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
150
|
+
}, z.core.$strip>], "op">>>;
|
|
151
|
+
}, z.core.$strip>;
|
|
152
|
+
export type DreamOp = z.infer<typeof OpSchema>;
|
|
153
|
+
export type DreamOps = z.infer<typeof DreamOpsSchema>;
|
|
154
|
+
export interface DreamDeps {
|
|
155
|
+
generate(prompt: string): Promise<DreamOps>;
|
|
156
|
+
}
|
|
157
|
+
export declare function extractJsonObject(text: string): unknown;
|
|
158
|
+
export declare const OPS_FORMAT = "\nReturn ONLY a JSON object of the shape {\"ops\": [...]} \u2014 no prose, no code fences.\nEach op is one of:\n {\"op\":\"add\",\"rule\":\"\u2026\",\"why\":\"\u2026?\",\"confidence\":0-100,\"sources\":[\"<event id>\",\u2026]}\n {\"op\":\"strengthen\",\"ruleId\":\"<rule id>\",\"confidence\":0-100?,\"sources\":[\u2026]}\n {\"op\":\"generalize\",\"ruleIds\":[\"<rule id>\",\"<rule id>\",\u2026],\"rule\":\"\u2026\",\"why\":\"\u2026?\",\"confidence\":0-100,\"sources\":[\u2026]}\n {\"op\":\"invalidate\",\"ruleId\":\"<rule id>\",\"reason\":\"\u2026\",\"sources\":[\u2026]}\n{\"ops\":[]} is a perfectly good answer.";
|
|
159
|
+
export interface PlanResult {
|
|
160
|
+
changes: PlannedChange[];
|
|
161
|
+
rejected: {
|
|
162
|
+
op: string;
|
|
163
|
+
reason: string;
|
|
164
|
+
}[];
|
|
165
|
+
}
|
|
166
|
+
export declare function planOps(scope: string, layer: RuleLayer, current: MemoryRule[], allowedSources: Set<string>, ops: DreamOp[], makeId?: () => string): PlanResult;
|
|
167
|
+
export declare function buildScopePrompt(scope: string, rules: MemoryRule[], events: MemoryEvent[], stale: MemoryRule[]): string;
|
|
168
|
+
export declare function buildProfilePrompt(scope: string, profileRules: MemoryRule[], evidence: MemoryRule[]): string;
|
|
169
|
+
export interface DreamResult {
|
|
170
|
+
runId: string | null;
|
|
171
|
+
scopes: string[];
|
|
172
|
+
counts: Record<string, number>;
|
|
173
|
+
summary: string;
|
|
174
|
+
error: string | null;
|
|
175
|
+
}
|
|
176
|
+
export declare function createMemoryDreamEngine(adapter: MemoryDreamAdapter, defaultDeps: DreamDeps): {
|
|
177
|
+
consolidateScope: (scope: string, events: MemoryEvent[], stale: MemoryRule[], deps: DreamDeps) => Promise<PlanResult>;
|
|
178
|
+
runDream: (kind: "nightly" | "weekly" | "manual", deps?: DreamDeps) => Promise<DreamResult>;
|
|
179
|
+
};
|
|
180
|
+
export {};
|
|
181
|
+
//# sourceMappingURL=memory-dream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-dream.d.ts","sourceRoot":"","sources":["../../../src/lib/memory/memory-dream.ts"],"names":[],"mappings":"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"}
|