abmind 0.2.5-alpha.0 → 0.2.6
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/SUPPORTED-SURFACE.md +52 -0
- package/dist/cli/abmind-backup.js +1 -1
- package/dist/cli/abmind-backup.js.map +1 -1
- package/dist/cli/abmind-deps.d.ts +8 -0
- package/dist/cli/abmind-deps.d.ts.map +1 -0
- package/dist/cli/abmind-deps.js +55 -0
- package/dist/cli/abmind-deps.js.map +1 -0
- package/dist/cli/abmind-doctor.js +9 -7
- package/dist/cli/abmind-doctor.js.map +1 -1
- package/dist/cli/abmind-embed.js +2 -3
- package/dist/cli/abmind-embed.js.map +1 -1
- package/dist/cli/abmind-expand.d.ts.map +1 -1
- package/dist/cli/abmind-expand.js +2 -3
- package/dist/cli/abmind-expand.js.map +1 -1
- package/dist/cli/abmind-install.js +9 -23
- package/dist/cli/abmind-install.js.map +1 -1
- package/dist/cli/abmind-passwd.js +2 -3
- package/dist/cli/abmind-passwd.js.map +1 -1
- package/dist/cli/abmind-secrets.d.ts.map +1 -1
- package/dist/cli/abmind-secrets.js +2 -3
- package/dist/cli/abmind-secrets.js.map +1 -1
- package/dist/cli/abmind-status-runtime.js +10 -12
- package/dist/cli/abmind-status-runtime.js.map +1 -1
- package/dist/cli/abmind-update-args.d.ts +26 -0
- package/dist/cli/abmind-update-args.d.ts.map +1 -0
- package/dist/cli/abmind-update-args.js +56 -0
- package/dist/cli/abmind-update-args.js.map +1 -0
- package/dist/cli/abmind-update.d.ts +13 -5
- package/dist/cli/abmind-update.d.ts.map +1 -1
- package/dist/cli/abmind-update.js +151 -147
- package/dist/cli/abmind-update.js.map +1 -1
- package/dist/cli/abmind.js +6 -10
- package/dist/cli/abmind.js.map +1 -1
- package/dist/cli/banner.d.ts +6 -0
- package/dist/cli/banner.d.ts.map +1 -1
- package/dist/cli/banner.js +14 -22
- package/dist/cli/banner.js.map +1 -1
- package/dist/cli/lib/native-dep.d.ts +15 -0
- package/dist/cli/lib/native-dep.d.ts.map +1 -0
- package/dist/cli/lib/native-dep.js +25 -0
- package/dist/cli/lib/native-dep.js.map +1 -0
- package/dist/src/context-orchestrator.d.ts +38 -2
- package/dist/src/context-orchestrator.d.ts.map +1 -1
- package/dist/src/context-orchestrator.js +84 -12
- package/dist/src/context-orchestrator.js.map +1 -1
- package/dist/src/fts-utils.d.ts +47 -0
- package/dist/src/fts-utils.d.ts.map +1 -0
- package/dist/src/fts-utils.js +65 -0
- package/dist/src/fts-utils.js.map +1 -0
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory-db.d.ts.map +1 -1
- package/dist/src/memory-db.js +13 -5
- package/dist/src/memory-db.js.map +1 -1
- package/dist/src/memory-index.d.ts +0 -16
- package/dist/src/memory-index.d.ts.map +1 -1
- package/dist/src/memory-index.js +1 -60
- package/dist/src/memory-index.js.map +1 -1
- package/dist/src/memory-manager.d.ts +8 -0
- package/dist/src/memory-manager.d.ts.map +1 -1
- package/dist/src/memory-manager.js +8 -0
- package/dist/src/memory-manager.js.map +1 -1
- package/dist/src/ollama-embed.d.ts.map +1 -1
- package/dist/src/ollama-embed.js +11 -1
- package/dist/src/ollama-embed.js.map +1 -1
- package/dist/src/recall-boosts.d.ts +15 -0
- package/dist/src/recall-boosts.d.ts.map +1 -0
- package/dist/src/recall-boosts.js +159 -0
- package/dist/src/recall-boosts.js.map +1 -0
- package/dist/src/recall-engine.d.ts +0 -2
- package/dist/src/recall-engine.d.ts.map +1 -1
- package/dist/src/recall-engine.js +1 -151
- package/dist/src/recall-engine.js.map +1 -1
- package/dist/src/sleep/audit.d.ts +33 -0
- package/dist/src/sleep/audit.d.ts.map +1 -0
- package/dist/src/sleep/audit.js +160 -0
- package/dist/src/sleep/audit.js.map +1 -0
- package/dist/src/sleep/catchup.d.ts +19 -0
- package/dist/src/sleep/catchup.d.ts.map +1 -0
- package/dist/src/sleep/catchup.js +159 -0
- package/dist/src/sleep/catchup.js.map +1 -0
- package/dist/src/sleep/llm-budget.d.ts +29 -0
- package/dist/src/sleep/llm-budget.d.ts.map +1 -0
- package/dist/src/sleep/llm-budget.js +92 -0
- package/dist/src/sleep/llm-budget.js.map +1 -0
- package/dist/src/sleep/locks.d.ts +19 -0
- package/dist/src/sleep/locks.d.ts.map +1 -0
- package/dist/src/sleep/locks.js +42 -0
- package/dist/src/sleep/locks.js.map +1 -0
- package/dist/src/sleep/orchestrator.d.ts +18 -1
- package/dist/src/sleep/orchestrator.d.ts.map +1 -1
- package/dist/src/sleep/orchestrator.js +104 -420
- package/dist/src/sleep/orchestrator.js.map +1 -1
- package/dist/src/sleep/sleep-prompt-loader.d.ts +0 -5
- package/dist/src/sleep/sleep-prompt-loader.d.ts.map +1 -1
- package/dist/src/sleep/sleep-prompt-loader.js +0 -12
- package/dist/src/sleep/sleep-prompt-loader.js.map +1 -1
- package/dist/src/sleep/state.d.ts +56 -0
- package/dist/src/sleep/state.d.ts.map +1 -0
- package/dist/src/sleep/state.js +83 -0
- package/dist/src/sleep/state.js.map +1 -0
- package/package.json +2 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/sleep/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sleep/catchup.ts — Catch-up orchestration for incomplete previous-day sleep cycles.
|
|
3
|
+
* Extracted from orchestrator.ts (#1229).
|
|
4
|
+
*/
|
|
5
|
+
import type { SleepStep } from "../sleep-pipeline.js";
|
|
6
|
+
import type { SleepRuntime } from "./runtime.js";
|
|
7
|
+
import type { SleepDataAccess } from "../sleep-data-access.js";
|
|
8
|
+
import type { SleepState, SleepStepEvent } from "./state.js";
|
|
9
|
+
import type { PreviousLock } from "./locks.js";
|
|
10
|
+
import type { LlmBudget } from "./llm-budget.js";
|
|
11
|
+
import type { RawArgs } from "./orchestrator.js";
|
|
12
|
+
/** Steps whose failure blocks watermark advance. Public so tests can derive reject targets. */
|
|
13
|
+
export declare const ESSENTIAL_STEPS: ReadonlySet<string>;
|
|
14
|
+
export declare const CATCHUP_MAX_AGE_DAYS = 3;
|
|
15
|
+
export declare function failedEssentials(state: SleepState): string[];
|
|
16
|
+
export declare function runCatchUp(locks: PreviousLock[], sleepData: SleepDataAccess, memoryConfig: {
|
|
17
|
+
memoryDir: string;
|
|
18
|
+
}, steps: SleepStep[], flags: RawArgs, runtime: SleepRuntime, budget?: LlmBudget, retryDelayMs?: number, onStep?: (e: SleepStepEvent) => void): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=catchup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catchup.d.ts","sourceRoot":"","sources":["../../../src/sleep/catchup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIjD,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAAmE,CAAC;AACpH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAS5D;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,eAAe,EAC1B,YAAY,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EACnC,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,SAAS,EAClB,YAAY,SAAO,EACnB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,GACnC,OAAO,CAAC,IAAI,CAAC,CA6Hf"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sleep/catchup.ts — Catch-up orchestration for incomplete previous-day sleep cycles.
|
|
3
|
+
* Extracted from orchestrator.ts (#1229).
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
6
|
+
import { join, basename } from "node:path";
|
|
7
|
+
import { getAbmindEnv } from "../env-schema.js";
|
|
8
|
+
import { buildDailySummary, writeDailyFile, LLMUnavailableError, extractFromDaily } from "../sleep-pipeline.js";
|
|
9
|
+
import { logInfo, logWarn, logError } from "../mem-logger.js";
|
|
10
|
+
import { writeStateFile, fireOnStep } from "./state.js";
|
|
11
|
+
import { dateStrToMs, dateStrToFormatted } from "./locks.js";
|
|
12
|
+
import { sendWithRetry } from "./llm-budget.js";
|
|
13
|
+
const TAG = "abmind-sleep";
|
|
14
|
+
/** Steps whose failure blocks watermark advance. Public so tests can derive reject targets. */
|
|
15
|
+
export const ESSENTIAL_STEPS = new Set(["daily-summary", "extract-memories", "retrospective"]);
|
|
16
|
+
export const CATCHUP_MAX_AGE_DAYS = 3;
|
|
17
|
+
export function failedEssentials(state) {
|
|
18
|
+
const failed = [];
|
|
19
|
+
for (const name of ESSENTIAL_STEPS) {
|
|
20
|
+
const s = state.steps[name];
|
|
21
|
+
if (!s || s.status === "failed" || s.status === "timeout" || s.status === "pending") {
|
|
22
|
+
failed.push(name);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return failed;
|
|
26
|
+
}
|
|
27
|
+
export async function runCatchUp(locks, sleepData, memoryConfig, steps, flags, runtime, budget, retryDelayMs = 6000, onStep) {
|
|
28
|
+
for (const lock of locks) {
|
|
29
|
+
if (lock.ageDays > CATCHUP_MAX_AGE_DAYS) {
|
|
30
|
+
logError(TAG, `[CATCH-UP] Abandoning stale lock ${basename(lock.path)} — ${lock.ageDays} days old, data unrecoverable`);
|
|
31
|
+
unlinkSync(lock.path);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const needed = failedEssentials(lock.state);
|
|
35
|
+
if (needed.length === 0) {
|
|
36
|
+
logInfo(TAG, `[CATCH-UP] Cleaning up completed lock ${basename(lock.path)}`);
|
|
37
|
+
unlinkSync(lock.path);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
logInfo(TAG, `[CATCH-UP] ${basename(lock.path)} — recovering: ${needed.join(", ")}`);
|
|
41
|
+
// 04a — daily summary with date-range
|
|
42
|
+
if (needed.includes("daily-summary")) {
|
|
43
|
+
const start = Date.now();
|
|
44
|
+
try {
|
|
45
|
+
const ctxWindow = getAbmindEnv().sleepCtxWindow;
|
|
46
|
+
const userId = sleepData.getPrimaryUserId();
|
|
47
|
+
const dayStart = dateStrToMs(lock.dateStr);
|
|
48
|
+
const dayEnd = dayStart + 86400000;
|
|
49
|
+
const summary = await buildDailySummary(sleepData.getDb(), (p) => sendWithRetry(runtime, p, "catch-up-04a", flags.verbose, budget, retryDelayMs).then(r => { if (r === null)
|
|
50
|
+
throw new LLMUnavailableError(); return r; }), {
|
|
51
|
+
ctxWindow, memoryDir: memoryConfig.memoryDir, userId, watermarkTs: 0,
|
|
52
|
+
dateRange: { startTs: dayStart, endTs: dayEnd },
|
|
53
|
+
});
|
|
54
|
+
if (summary) {
|
|
55
|
+
writeDailyFile(memoryConfig.memoryDir, dateStrToFormatted(lock.dateStr), summary);
|
|
56
|
+
lock.state.steps["daily-summary"] = { status: "ok", duration: Math.round((Date.now() - start) / 100) / 10 };
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
lock.state.steps["daily-summary"] = { status: "skipped" };
|
|
60
|
+
}
|
|
61
|
+
logInfo(TAG, `[CATCH-UP] ✓ 04a-daily-summary for ${lock.dateStr} (${((Date.now() - start) / 1000).toFixed(1)}s)`);
|
|
62
|
+
fireOnStep(onStep, {
|
|
63
|
+
name: "daily-summary", filename: "catch-up",
|
|
64
|
+
index: 0, total: 0,
|
|
65
|
+
phase: summary ? "done" : "skipped",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logWarn(TAG, `[CATCH-UP] ✗ 04a-daily-summary for ${lock.dateStr}: ${err instanceof Error ? err.message : String(err)}`);
|
|
70
|
+
lock.state.steps["daily-summary"] = { status: "failed", duration: Math.round((Date.now() - start) / 100) / 10 };
|
|
71
|
+
fireOnStep(onStep, {
|
|
72
|
+
name: "daily-summary", filename: "catch-up",
|
|
73
|
+
index: 0, total: 0,
|
|
74
|
+
phase: "failed",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
writeStateFile(lock.path, lock.state);
|
|
78
|
+
}
|
|
79
|
+
// 04b — extract memories from daily (needs daily file to exist)
|
|
80
|
+
if (needed.includes("extract-memories")) {
|
|
81
|
+
const dailyPath = join(memoryConfig.memoryDir, "daily", `daily_${dateStrToFormatted(lock.dateStr)}.md`);
|
|
82
|
+
if (!existsSync(dailyPath)) {
|
|
83
|
+
logInfo(TAG, `[CATCH-UP] ⏭ 04b — no daily file for ${lock.dateStr}`);
|
|
84
|
+
lock.state.steps["extract-memories"] = { status: "skipped" };
|
|
85
|
+
fireOnStep(onStep, {
|
|
86
|
+
name: "extract-memories", filename: "catch-up",
|
|
87
|
+
index: 0, total: 0,
|
|
88
|
+
phase: "skipped",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const start = Date.now();
|
|
93
|
+
try {
|
|
94
|
+
const userId = sleepData.getPrimaryUserId();
|
|
95
|
+
const result = await extractFromDaily(dailyPath, userId, (p) => sendWithRetry(runtime, p, "catch-up-04b", flags.verbose, budget, retryDelayMs).then(r => { if (r === null)
|
|
96
|
+
throw new LLMUnavailableError(); return r; }));
|
|
97
|
+
lock.state.steps["extract-memories"] = { status: "ok", duration: Math.round((Date.now() - start) / 100) / 10 };
|
|
98
|
+
logInfo(TAG, `[CATCH-UP] ✓ 04b-extract-memories for ${lock.dateStr} (${((Date.now() - start) / 1000).toFixed(1)}s) — ${result.slice(0, 80)}`);
|
|
99
|
+
fireOnStep(onStep, {
|
|
100
|
+
name: "extract-memories", filename: "catch-up",
|
|
101
|
+
index: 0, total: 0,
|
|
102
|
+
phase: "done",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
logWarn(TAG, `[CATCH-UP] ✗ 04b for ${lock.dateStr}: ${err instanceof Error ? err.message : String(err)}`);
|
|
107
|
+
lock.state.steps["extract-memories"] = { status: "failed", duration: Math.round((Date.now() - start) / 100) / 10 };
|
|
108
|
+
fireOnStep(onStep, {
|
|
109
|
+
name: "extract-memories", filename: "catch-up",
|
|
110
|
+
index: 0, total: 0,
|
|
111
|
+
phase: "failed",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
writeStateFile(lock.path, lock.state);
|
|
116
|
+
}
|
|
117
|
+
// Prompt-driven essentials (retrospective)
|
|
118
|
+
for (const stepName of ["retrospective"]) {
|
|
119
|
+
if (!needed.includes(stepName))
|
|
120
|
+
continue;
|
|
121
|
+
const step = steps.find(s => s.name === stepName);
|
|
122
|
+
if (!step) {
|
|
123
|
+
logWarn(TAG, `[CATCH-UP] Step file not found: ${stepName}`);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const start = Date.now();
|
|
127
|
+
const response = await sendWithRetry(runtime, step.rawPrompt, `catch-up-${stepName}`, flags.verbose, budget, retryDelayMs);
|
|
128
|
+
if (response) {
|
|
129
|
+
lock.state.steps[stepName] = { status: "ok", duration: Math.round((Date.now() - start) / 100) / 10 };
|
|
130
|
+
logInfo(TAG, `[CATCH-UP] ✓ ${stepName} (${((Date.now() - start) / 1000).toFixed(1)}s)`);
|
|
131
|
+
fireOnStep(onStep, {
|
|
132
|
+
name: stepName, filename: "catch-up",
|
|
133
|
+
index: 0, total: 0,
|
|
134
|
+
phase: "done",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
lock.state.steps[stepName] = { status: "failed", duration: Math.round((Date.now() - start) / 100) / 10 };
|
|
139
|
+
logWarn(TAG, `[CATCH-UP] ✗ ${stepName}`);
|
|
140
|
+
fireOnStep(onStep, {
|
|
141
|
+
name: stepName, filename: "catch-up",
|
|
142
|
+
index: 0, total: 0,
|
|
143
|
+
phase: "failed",
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
writeStateFile(lock.path, lock.state);
|
|
147
|
+
}
|
|
148
|
+
// Final check
|
|
149
|
+
const stillFailing = failedEssentials(lock.state);
|
|
150
|
+
if (stillFailing.length === 0) {
|
|
151
|
+
logInfo(TAG, `[CATCH-UP] ✅ ${basename(lock.path)} — all essentials recovered, lock deleted`);
|
|
152
|
+
unlinkSync(lock.path);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
logWarn(TAG, `[CATCH-UP] ${basename(lock.path)} — still failing: ${stillFailing.join(", ")} (failing ${lock.ageDays} day(s))`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=catchup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catchup.js","sourceRoot":"","sources":["../../../src/sleep/catchup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sleep/llm-budget.ts — LLM call budget tracking and retry-with-transport-backoff.
|
|
3
|
+
* Extracted from orchestrator.ts (#1229). Carries the full transport-aware
|
|
4
|
+
* sendWithRetry from #1279.
|
|
5
|
+
*/
|
|
6
|
+
import { LLMUnavailableError } from "../sleep-pipeline.js";
|
|
7
|
+
import type { SleepRuntime } from "./runtime.js";
|
|
8
|
+
import type { SleepState } from "./state.js";
|
|
9
|
+
export declare const MAX_RETRIES = 3;
|
|
10
|
+
export declare const TRANSPORT_MAX_RETRIES = 6;
|
|
11
|
+
export declare const DEFAULT_TRANSPORT_RETRY_WINDOW_MS: number;
|
|
12
|
+
/** Thrown by sendWithRetry when runtime.complete() throws on every attempt within the retry window.
|
|
13
|
+
* Extends LLMUnavailableError so buildDailySummary and extractFromDaily rethrow it naturally
|
|
14
|
+
* (those functions check instanceof LLMUnavailableError to propagate errors up). */
|
|
15
|
+
export declare class ModelUnavailableError extends LLMUnavailableError {
|
|
16
|
+
constructor(stepName: string);
|
|
17
|
+
}
|
|
18
|
+
/** Budget tracker — shared across all sendWithRetry calls in a sleep cycle. */
|
|
19
|
+
export declare class LlmBudget {
|
|
20
|
+
private state;
|
|
21
|
+
private readonly statePath;
|
|
22
|
+
exhausted: boolean;
|
|
23
|
+
constructor(state: SleepState, statePath: string);
|
|
24
|
+
/** Increment counter, return false if budget exhausted. */
|
|
25
|
+
consume(): boolean;
|
|
26
|
+
get calls(): number;
|
|
27
|
+
}
|
|
28
|
+
export declare function sendWithRetry(runtime: SleepRuntime, prompt: string, stepName: string, _verbose: boolean, budget?: LlmBudget, delayMs?: number, transportBackoffMs?: (attempt: number) => number, transportRetryWindowMs?: number, nowFn?: () => number): Promise<string | null>;
|
|
29
|
+
//# sourceMappingURL=llm-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-budget.d.ts","sourceRoot":"","sources":["../../../src/sleep/llm-budget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,iCAAiC,QAAa,CAAC;AAE5D;;qFAEqF;AACrF,qBAAa,qBAAsB,SAAQ,mBAAmB;gBAChD,QAAQ,EAAE,MAAM;CAI7B;AAED,+EAA+E;AAC/E,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,SAAS,UAAS;gBAEN,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM;IAKhD,2DAA2D;IAC3D,OAAO,IAAI,OAAO;IAUlB,IAAI,KAAK,IAAI,MAAM,CAAqC;CACzD;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,SAAS,EAClB,OAAO,SAAO,EACd,kBAAkB,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAA8D,EACvG,sBAAsB,SAAoC,EAC1D,KAAK,GAAE,MAAM,MAAiB,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmDxB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sleep/llm-budget.ts — LLM call budget tracking and retry-with-transport-backoff.
|
|
3
|
+
* Extracted from orchestrator.ts (#1229). Carries the full transport-aware
|
|
4
|
+
* sendWithRetry from #1279.
|
|
5
|
+
*/
|
|
6
|
+
import { getAbmindEnv } from "../env-schema.js";
|
|
7
|
+
import { logWarn, logError, logInfo } from "../mem-logger.js";
|
|
8
|
+
import { LLMUnavailableError } from "../sleep-pipeline.js";
|
|
9
|
+
import { writeStateFile } from "./state.js";
|
|
10
|
+
const TAG = "abmind-sleep";
|
|
11
|
+
export const MAX_RETRIES = 3;
|
|
12
|
+
export const TRANSPORT_MAX_RETRIES = 6;
|
|
13
|
+
export const DEFAULT_TRANSPORT_RETRY_WINDOW_MS = 8 * 60_000; // 8 minutes
|
|
14
|
+
/** Thrown by sendWithRetry when runtime.complete() throws on every attempt within the retry window.
|
|
15
|
+
* Extends LLMUnavailableError so buildDailySummary and extractFromDaily rethrow it naturally
|
|
16
|
+
* (those functions check instanceof LLMUnavailableError to propagate errors up). */
|
|
17
|
+
export class ModelUnavailableError extends LLMUnavailableError {
|
|
18
|
+
constructor(stepName) {
|
|
19
|
+
super(`Model unavailable for step "${stepName}" after retry window`);
|
|
20
|
+
this.name = "ModelUnavailableError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Budget tracker — shared across all sendWithRetry calls in a sleep cycle. */
|
|
24
|
+
export class LlmBudget {
|
|
25
|
+
state;
|
|
26
|
+
statePath;
|
|
27
|
+
exhausted = false;
|
|
28
|
+
constructor(state, statePath) {
|
|
29
|
+
this.state = state;
|
|
30
|
+
this.statePath = statePath;
|
|
31
|
+
}
|
|
32
|
+
/** Increment counter, return false if budget exhausted. */
|
|
33
|
+
consume() {
|
|
34
|
+
this.state.llmCalls = (this.state.llmCalls ?? 0) + 1;
|
|
35
|
+
writeStateFile(this.statePath, this.state);
|
|
36
|
+
if (this.state.llmCalls > getAbmindEnv().sleepMaxLlmCalls) {
|
|
37
|
+
this.exhausted = true;
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
get calls() { return this.state.llmCalls ?? 0; }
|
|
43
|
+
}
|
|
44
|
+
export async function sendWithRetry(runtime, prompt, stepName, _verbose, budget, delayMs = 6000, transportBackoffMs = (n) => Math.min(30_000 * Math.pow(2, n - 1), 120_000), transportRetryWindowMs = DEFAULT_TRANSPORT_RETRY_WINDOW_MS, nowFn = Date.now) {
|
|
45
|
+
const deadline = nowFn() + transportRetryWindowMs;
|
|
46
|
+
let emptyAttempts = 0;
|
|
47
|
+
let transportAttempts = 0;
|
|
48
|
+
// Budget-exhaustion pre-check: if we are already over the cap, bail immediately.
|
|
49
|
+
// This mirrors the old pre-loop consume() guard without burning a call.
|
|
50
|
+
if (budget?.exhausted) {
|
|
51
|
+
logWarn(TAG, `[BUDGET] LLM call limit (${getAbmindEnv().sleepMaxLlmCalls}) reached at step ${stepName} — suspending`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
while (true) {
|
|
55
|
+
try {
|
|
56
|
+
const result = await runtime.complete(prompt);
|
|
57
|
+
// Real call reached the model — count it now (success OR empty, never a throw).
|
|
58
|
+
if (budget && !budget.consume()) {
|
|
59
|
+
logWarn(TAG, `[BUDGET] LLM call limit (${getAbmindEnv().sleepMaxLlmCalls}) reached at step ${stepName} — suspending`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (!result || !result.trim()) {
|
|
63
|
+
emptyAttempts++;
|
|
64
|
+
logWarn(TAG, `Step ${stepName} attempt ${emptyAttempts}/${MAX_RETRIES} returned empty response`);
|
|
65
|
+
if (emptyAttempts >= MAX_RETRIES) {
|
|
66
|
+
logError(TAG, `Step ${stepName} failed after ${MAX_RETRIES} attempts (empty), skipping`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (delayMs > 0)
|
|
70
|
+
await new Promise(r => setTimeout(r, delayMs));
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// Transport failure — model unreachable. Do NOT consume budget (no tokens used).
|
|
77
|
+
transportAttempts++;
|
|
78
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
79
|
+
const backoff = transportBackoffMs(transportAttempts);
|
|
80
|
+
const timeRemaining = deadline - nowFn();
|
|
81
|
+
logWarn(TAG, `Step ${stepName} transport fail (${transportAttempts}/${TRANSPORT_MAX_RETRIES}): ${msg}`);
|
|
82
|
+
if (transportAttempts >= TRANSPORT_MAX_RETRIES || timeRemaining <= backoff) {
|
|
83
|
+
logError(TAG, `Step ${stepName} — model unavailable after ${transportAttempts} attempt(s), ${Math.round(transportRetryWindowMs / 60_000)}min window exhausted`);
|
|
84
|
+
throw new ModelUnavailableError(stepName);
|
|
85
|
+
}
|
|
86
|
+
logInfo(TAG, `[SLEEP] Model unreachable — waiting ${Math.round(backoff / 1000)}s before retry (step ${stepName})`);
|
|
87
|
+
if (backoff > 0)
|
|
88
|
+
await new Promise(r => setTimeout(r, backoff));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=llm-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-budget.js","sourceRoot":"","sources":["../../../src/sleep/llm-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sleep/locks.ts — Lock-file discovery and date-string helpers.
|
|
3
|
+
* Extracted from orchestrator.ts (#1229).
|
|
4
|
+
*/
|
|
5
|
+
import type { SleepState } from "./state.js";
|
|
6
|
+
export interface PreviousLock {
|
|
7
|
+
path: string;
|
|
8
|
+
dateStr: string;
|
|
9
|
+
state: SleepState;
|
|
10
|
+
ageDays: number;
|
|
11
|
+
}
|
|
12
|
+
/** Format a timestamp as YYYYMMDD (for lock file names). */
|
|
13
|
+
export declare function toDateStr(ts: number): string;
|
|
14
|
+
/** Format a timestamp as YYYY-MM-DD (for daily file paths). */
|
|
15
|
+
export declare function toIsoDate(ts: number): string;
|
|
16
|
+
export declare function dateStrToMs(ds: string): number;
|
|
17
|
+
export declare function dateStrToFormatted(ds: string): string;
|
|
18
|
+
export declare function scanPreviousLocks(sleepDir: string, todayStr: string): PreviousLock[];
|
|
19
|
+
//# sourceMappingURL=locks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../../src/sleep/locks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAapF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sleep/locks.ts — Lock-file discovery and date-string helpers.
|
|
3
|
+
* Extracted from orchestrator.ts (#1229).
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { readStateFile } from "./state.js";
|
|
8
|
+
/** Format a timestamp as YYYYMMDD (for lock file names). */
|
|
9
|
+
export function toDateStr(ts) {
|
|
10
|
+
const d = new Date(ts);
|
|
11
|
+
return `${d.getFullYear()}${String(d.getMonth() + 1).padStart(2, "0")}${String(d.getDate()).padStart(2, "0")}`;
|
|
12
|
+
}
|
|
13
|
+
/** Format a timestamp as YYYY-MM-DD (for daily file paths). */
|
|
14
|
+
export function toIsoDate(ts) {
|
|
15
|
+
const d = new Date(ts);
|
|
16
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
17
|
+
}
|
|
18
|
+
export function dateStrToMs(ds) {
|
|
19
|
+
return new Date(`${ds.slice(0, 4)}-${ds.slice(4, 6)}-${ds.slice(6, 8)}T00:00:00`).getTime();
|
|
20
|
+
}
|
|
21
|
+
export function dateStrToFormatted(ds) {
|
|
22
|
+
return `${ds.slice(0, 4)}-${ds.slice(4, 6)}-${ds.slice(6, 8)}`;
|
|
23
|
+
}
|
|
24
|
+
export function scanPreviousLocks(sleepDir, todayStr) {
|
|
25
|
+
if (!existsSync(sleepDir))
|
|
26
|
+
return [];
|
|
27
|
+
const locks = [];
|
|
28
|
+
const todayMs = dateStrToMs(todayStr);
|
|
29
|
+
for (const f of readdirSync(sleepDir)) {
|
|
30
|
+
const m = f.match(/^sleep_(\d{8})\.lock$/);
|
|
31
|
+
if (!m || m[1] === todayStr)
|
|
32
|
+
continue;
|
|
33
|
+
const state = readStateFile(join(sleepDir, f));
|
|
34
|
+
if (!state)
|
|
35
|
+
continue;
|
|
36
|
+
const ageDays = Math.round((todayMs - dateStrToMs(m[1])) / 86400000);
|
|
37
|
+
if (ageDays > 0)
|
|
38
|
+
locks.push({ path: join(sleepDir, f), dateStr: m[1], state, ageDays });
|
|
39
|
+
}
|
|
40
|
+
return locks.sort((a, b) => b.dateStr.localeCompare(a.dateStr)); // newest first
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=locks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locks.js","sourceRoot":"","sources":["../../../src/sleep/locks.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import type { SleepRuntime } from "./runtime.js";
|
|
18
18
|
import { type Level } from "./levels.js";
|
|
19
|
+
import type { SleepStepEvent } from "./state.js";
|
|
19
20
|
/** Steps whose failure blocks watermark advance. Public so tests can derive reject targets. */
|
|
20
|
-
export
|
|
21
|
+
export { ESSENTIAL_STEPS } from "./catchup.js";
|
|
21
22
|
/** Thrown by runSleepCycle when memory layer fails to initialize. */
|
|
22
23
|
export declare class SleepInitError extends Error {
|
|
23
24
|
constructor(message: string);
|
|
@@ -26,6 +27,9 @@ export declare class SleepInitError extends Error {
|
|
|
26
27
|
export declare class SleepTimeoutError extends Error {
|
|
27
28
|
constructor(message: string);
|
|
28
29
|
}
|
|
30
|
+
/** Step-lifecycle event fired by the orchestrator at each step boundary (#895).
|
|
31
|
+
* Best-effort — a throwing handler must never break memory consolidation. */
|
|
32
|
+
export type { SleepStepEvent } from "./state.js";
|
|
29
33
|
/** Options for runSleepCycle. All optional — defaults preserve current main() behavior. */
|
|
30
34
|
export interface RunOpts {
|
|
31
35
|
flags?: RawArgs;
|
|
@@ -42,8 +46,20 @@ export interface RunOpts {
|
|
|
42
46
|
backoffMs?: (consecutiveFailures: number) => number;
|
|
43
47
|
/** Override intra-step retry delay in ms. Default: 6000. Tests: 0. */
|
|
44
48
|
retryDelayMs?: number;
|
|
49
|
+
/** Override transport-failure backoff per attempt (ms). Default: capped exp (30s/60s/120s). Tests: () => 0. */
|
|
50
|
+
transportBackoffMs?: (attempt: number) => number;
|
|
51
|
+
/** Override transport-failure retry window (ms). Default: 8 minutes. Tests: small value. */
|
|
52
|
+
transportRetryWindowMs?: number;
|
|
45
53
|
/** Override memory config (temp dirs in tests). */
|
|
46
54
|
memoryConfigOverride?: Partial<import("../memory-config.js").MemoryConfig>;
|
|
55
|
+
/** Step-lifecycle hook (#895) — fired at each step boundary.
|
|
56
|
+
* Display-only: a throwing handler never breaks the cycle. */
|
|
57
|
+
onStep?: (e: SleepStepEvent) => void;
|
|
58
|
+
/** Hook fired once at the start of a cycle (before any step runs).
|
|
59
|
+
* Used by hosts to create a stepped card, reset per-night state, etc. */
|
|
60
|
+
onCycleStart?: (e: {
|
|
61
|
+
totalSteps: number;
|
|
62
|
+
}) => void;
|
|
47
63
|
}
|
|
48
64
|
/** Result of runSleepCycle — thrown errors handled separately. */
|
|
49
65
|
export interface RunResult {
|
|
@@ -56,6 +72,7 @@ export type RawArgs = {
|
|
|
56
72
|
force: boolean;
|
|
57
73
|
};
|
|
58
74
|
export declare function parseArgs(argv: string[]): RawArgs;
|
|
75
|
+
/** LLM call entry for sleep steps — caller provides the runtime via RunOpts. */
|
|
59
76
|
/**
|
|
60
77
|
* Run the full sleep cycle. Extracted from main() for testability (#175).
|
|
61
78
|
* - Deterministic time injection via opts.now for decision sites
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/sleep/orchestrator.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/sleep/orchestrator.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAiBH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,KAAK,KAAK,EAA6B,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAiE,cAAc,EAAE,MAAM,YAAY,CAAC;AAWhH,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,qEAAqE;AACrE,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAC5B;AAED,qFAAqF;AACrF,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAC5B;AAED;8EAC8E;AAC9E,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,2FAA2F;AAC3F,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iHAAiH;IACjH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,SAAS,CAAC,EAAE,CAAC,mBAAmB,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+GAA+G;IAC/G,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,4FAA4F;IAC5F,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mDAAmD;IACnD,oBAAoB,CAAC,EAAE,OAAO,CAAC,OAAO,qBAAqB,EAAE,YAAY,CAAC,CAAC;IAC3E;mEAC+D;IAC/D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IACrC;8EAC0E;IAC1E,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACpD;AAED,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,MAAM,OAAO,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAmBjD;AAID,gFAAgF;AAMhF;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA2sBrE"}
|