@soleri/core 9.10.0 → 9.12.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/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/brain/brain.d.ts +5 -1
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +97 -10
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +4 -0
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +1 -1
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/dream/cron-manager.d.ts +10 -0
- package/dist/dream/cron-manager.d.ts.map +1 -0
- package/dist/dream/cron-manager.js +122 -0
- package/dist/dream/cron-manager.js.map +1 -0
- package/dist/dream/dream-engine.d.ts +34 -0
- package/dist/dream/dream-engine.d.ts.map +1 -0
- package/dist/dream/dream-engine.js +88 -0
- package/dist/dream/dream-engine.js.map +1 -0
- package/dist/dream/dream-ops.d.ts +8 -0
- package/dist/dream/dream-ops.d.ts.map +1 -0
- package/dist/dream/dream-ops.js +49 -0
- package/dist/dream/dream-ops.js.map +1 -0
- package/dist/dream/index.d.ts +7 -0
- package/dist/dream/index.d.ts.map +1 -0
- package/dist/dream/index.js +5 -0
- package/dist/dream/index.js.map +1 -0
- package/dist/dream/schema.d.ts +3 -0
- package/dist/dream/schema.d.ts.map +1 -0
- package/dist/dream/schema.js +16 -0
- package/dist/dream/schema.js.map +1 -0
- package/dist/embeddings/index.d.ts +5 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +3 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/openai-provider.d.ts +31 -0
- package/dist/embeddings/openai-provider.d.ts.map +1 -0
- package/dist/embeddings/openai-provider.js +120 -0
- package/dist/embeddings/openai-provider.js.map +1 -0
- package/dist/embeddings/pipeline.d.ts +36 -0
- package/dist/embeddings/pipeline.d.ts.map +1 -0
- package/dist/embeddings/pipeline.js +78 -0
- package/dist/embeddings/pipeline.js.map +1 -0
- package/dist/embeddings/types.d.ts +62 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +3 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/engine/bin/soleri-engine.js +4 -1
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +20 -0
- package/dist/engine/module-manifest.js.map +1 -1
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +12 -0
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/flows/chain-types.d.ts +8 -8
- package/dist/flows/dispatch-registry.d.ts +15 -1
- package/dist/flows/dispatch-registry.d.ts.map +1 -1
- package/dist/flows/dispatch-registry.js +28 -1
- package/dist/flows/dispatch-registry.js.map +1 -1
- package/dist/flows/executor.d.ts +20 -2
- package/dist/flows/executor.d.ts.map +1 -1
- package/dist/flows/executor.js +79 -1
- package/dist/flows/executor.js.map +1 -1
- package/dist/flows/index.d.ts +2 -1
- package/dist/flows/index.d.ts.map +1 -1
- package/dist/flows/index.js.map +1 -1
- package/dist/flows/types.d.ts +43 -21
- package/dist/flows/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/planning/plan-lifecycle.d.ts.map +1 -1
- package/dist/planning/plan-lifecycle.js +4 -2
- package/dist/planning/plan-lifecycle.js.map +1 -1
- package/dist/planning/planner-types.d.ts +1 -1
- package/dist/planning/planner-types.d.ts.map +1 -1
- package/dist/plugins/types.d.ts +31 -31
- package/dist/runtime/admin-ops.d.ts.map +1 -1
- package/dist/runtime/admin-ops.js +15 -0
- package/dist/runtime/admin-ops.js.map +1 -1
- package/dist/runtime/admin-setup-ops.js +2 -2
- package/dist/runtime/admin-setup-ops.js.map +1 -1
- package/dist/runtime/embedding-ops.d.ts +12 -0
- package/dist/runtime/embedding-ops.d.ts.map +1 -0
- package/dist/runtime/embedding-ops.js +96 -0
- package/dist/runtime/embedding-ops.js.map +1 -0
- package/dist/runtime/facades/embedding-facade.d.ts +7 -0
- package/dist/runtime/facades/embedding-facade.d.ts.map +1 -0
- package/dist/runtime/facades/embedding-facade.js +8 -0
- package/dist/runtime/facades/embedding-facade.js.map +1 -0
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +12 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/orchestrate-facade.d.ts.map +1 -1
- package/dist/runtime/facades/orchestrate-facade.js +120 -0
- package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
- package/dist/runtime/feature-flags.d.ts.map +1 -1
- package/dist/runtime/feature-flags.js +4 -0
- package/dist/runtime/feature-flags.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +146 -12
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js +51 -0
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/preflight.d.ts +32 -0
- package/dist/runtime/preflight.d.ts.map +1 -0
- package/dist/runtime/preflight.js +29 -0
- package/dist/runtime/preflight.js.map +1 -0
- package/dist/runtime/quality-signals.d.ts +6 -1
- package/dist/runtime/quality-signals.d.ts.map +1 -1
- package/dist/runtime/quality-signals.js +41 -5
- package/dist/runtime/quality-signals.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +33 -2
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +27 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/skills/step-tracker.d.ts +39 -0
- package/dist/skills/step-tracker.d.ts.map +1 -0
- package/dist/skills/step-tracker.js +105 -0
- package/dist/skills/step-tracker.js.map +1 -0
- package/dist/skills/sync-skills.d.ts +3 -2
- package/dist/skills/sync-skills.d.ts.map +1 -1
- package/dist/skills/sync-skills.js +42 -8
- package/dist/skills/sync-skills.js.map +1 -1
- package/dist/subagent/dispatcher.d.ts +4 -3
- package/dist/subagent/dispatcher.d.ts.map +1 -1
- package/dist/subagent/dispatcher.js +57 -35
- package/dist/subagent/dispatcher.js.map +1 -1
- package/dist/subagent/index.d.ts +1 -0
- package/dist/subagent/index.d.ts.map +1 -1
- package/dist/subagent/index.js.map +1 -1
- package/dist/subagent/orphan-reaper.d.ts +51 -4
- package/dist/subagent/orphan-reaper.d.ts.map +1 -1
- package/dist/subagent/orphan-reaper.js +103 -3
- package/dist/subagent/orphan-reaper.js.map +1 -1
- package/dist/subagent/types.d.ts +7 -0
- package/dist/subagent/types.d.ts.map +1 -1
- package/dist/subagent/workspace-resolver.d.ts +2 -0
- package/dist/subagent/workspace-resolver.d.ts.map +1 -1
- package/dist/subagent/workspace-resolver.js +3 -1
- package/dist/subagent/workspace-resolver.js.map +1 -1
- package/dist/vault/vault-entries.d.ts +18 -0
- package/dist/vault/vault-entries.d.ts.map +1 -1
- package/dist/vault/vault-entries.js +73 -0
- package/dist/vault/vault-entries.js.map +1 -1
- package/dist/vault/vault-manager.d.ts.map +1 -1
- package/dist/vault/vault-manager.js +1 -0
- package/dist/vault/vault-manager.js.map +1 -1
- package/dist/vault/vault-schema.d.ts.map +1 -1
- package/dist/vault/vault-schema.js +14 -0
- package/dist/vault/vault-schema.js.map +1 -1
- package/dist/vault/vault.d.ts +1 -0
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js.map +1 -1
- package/package.json +3 -5
- package/src/__tests__/cron-manager.test.ts +132 -0
- package/src/__tests__/deviation-detection.test.ts +234 -0
- package/src/__tests__/embeddings.test.ts +536 -0
- package/src/__tests__/preflight.test.ts +97 -0
- package/src/__tests__/step-persistence.test.ts +324 -0
- package/src/__tests__/step-tracker.test.ts +260 -0
- package/src/__tests__/subagent/dispatcher.test.ts +122 -4
- package/src/__tests__/subagent/orphan-reaper.test.ts +148 -12
- package/src/__tests__/subagent/process-lifecycle.test.ts +422 -0
- package/src/__tests__/subagent/workspace-resolver.test.ts +6 -1
- package/src/adapters/types.ts +2 -0
- package/src/brain/brain.ts +117 -9
- package/src/brain/intelligence.ts +4 -0
- package/src/brain/types.ts +6 -1
- package/src/dream/cron-manager.ts +137 -0
- package/src/dream/dream-engine.ts +119 -0
- package/src/dream/dream-ops.ts +56 -0
- package/src/dream/dream.test.ts +182 -0
- package/src/dream/index.ts +6 -0
- package/src/dream/schema.ts +17 -0
- package/src/embeddings/openai-provider.ts +158 -0
- package/src/embeddings/pipeline.ts +126 -0
- package/src/embeddings/types.ts +67 -0
- package/src/engine/bin/soleri-engine.ts +4 -1
- package/src/engine/module-manifest.test.ts +4 -4
- package/src/engine/module-manifest.ts +20 -0
- package/src/engine/register-engine.ts +12 -0
- package/src/flows/dispatch-registry.ts +44 -1
- package/src/flows/executor.ts +93 -2
- package/src/flows/index.ts +2 -0
- package/src/flows/types.ts +39 -1
- package/src/index.ts +11 -0
- package/src/planning/goal-ancestry.test.ts +3 -5
- package/src/planning/plan-lifecycle.ts +5 -2
- package/src/planning/planner-types.ts +1 -1
- package/src/planning/planner.test.ts +73 -3
- package/src/runtime/admin-ops.test.ts +2 -2
- package/src/runtime/admin-ops.ts +17 -0
- package/src/runtime/admin-setup-ops.ts +2 -2
- package/src/runtime/embedding-ops.ts +116 -0
- package/src/runtime/facades/admin-facade.test.ts +31 -0
- package/src/runtime/facades/embedding-facade.ts +11 -0
- package/src/runtime/facades/index.ts +12 -0
- package/src/runtime/facades/orchestrate-facade.test.ts +16 -0
- package/src/runtime/facades/orchestrate-facade.ts +146 -0
- package/src/runtime/feature-flags.ts +4 -0
- package/src/runtime/orchestrate-ops.test.ts +182 -2
- package/src/runtime/orchestrate-ops.ts +170 -13
- package/src/runtime/planning-extra-ops.ts +77 -0
- package/src/runtime/preflight.ts +53 -0
- package/src/runtime/quality-signals.test.ts +182 -8
- package/src/runtime/quality-signals.ts +44 -5
- package/src/runtime/runtime.ts +41 -2
- package/src/runtime/types.ts +20 -0
- package/src/skills/__tests__/sync-skills.test.ts +132 -0
- package/src/skills/step-tracker.ts +162 -0
- package/src/skills/sync-skills.ts +54 -9
- package/src/subagent/dispatcher.ts +62 -39
- package/src/subagent/index.ts +1 -0
- package/src/subagent/orphan-reaper.test.ts +135 -0
- package/src/subagent/orphan-reaper.ts +130 -7
- package/src/subagent/types.ts +10 -0
- package/src/subagent/workspace-resolver.ts +3 -1
- package/src/vault/vault-entries.ts +112 -0
- package/src/vault/vault-manager.ts +1 -0
- package/src/vault/vault-scaling.test.ts +3 -2
- package/src/vault/vault-schema.ts +15 -0
- package/src/vault/vault.ts +1 -0
- package/vitest.config.ts +2 -1
- package/dist/brain/strength-scorer.d.ts +0 -31
- package/dist/brain/strength-scorer.d.ts.map +0 -1
- package/dist/brain/strength-scorer.js +0 -264
- package/dist/brain/strength-scorer.js.map +0 -1
- package/dist/engine/index.d.ts +0 -21
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js +0 -18
- package/dist/engine/index.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -2
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -2
- package/dist/hooks/index.js.map +0 -1
- package/dist/persona/index.d.ts +0 -5
- package/dist/persona/index.d.ts.map +0 -1
- package/dist/persona/index.js +0 -4
- package/dist/persona/index.js.map +0 -1
- package/dist/vault/vault-interfaces.d.ts +0 -153
- package/dist/vault/vault-interfaces.d.ts.map +0 -1
- package/dist/vault/vault-interfaces.js +0 -2
- package/dist/vault/vault-interfaces.js.map +0 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
const CRON_TAG = '# soleri:dream';
|
|
6
|
+
const SOLERI_DIR = join(homedir(), '.soleri');
|
|
7
|
+
const LOG_PATH = join(SOLERI_DIR, 'dream-cron.log');
|
|
8
|
+
function ensureSoleriDir() {
|
|
9
|
+
if (!existsSync(SOLERI_DIR)) {
|
|
10
|
+
mkdirSync(SOLERI_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function getCurrentCrontab() {
|
|
14
|
+
try {
|
|
15
|
+
return execSync('crontab -l 2>/dev/null', { encoding: 'utf-8' });
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function writeCrontab(content) {
|
|
22
|
+
execSync(`echo ${JSON.stringify(content)} | crontab -`, { encoding: 'utf-8' });
|
|
23
|
+
}
|
|
24
|
+
function resolveClaudePath() {
|
|
25
|
+
try {
|
|
26
|
+
const result = execSync('which claude 2>/dev/null', { encoding: 'utf-8' }).trim();
|
|
27
|
+
if (result)
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// fall through to default
|
|
32
|
+
}
|
|
33
|
+
return join(homedir(), '.claude', 'local', 'claude');
|
|
34
|
+
}
|
|
35
|
+
function parseDreamLine(line) {
|
|
36
|
+
if (!line.includes(CRON_TAG))
|
|
37
|
+
return null;
|
|
38
|
+
const parts = line.trim().split(/\s+/);
|
|
39
|
+
if (parts.length < 6)
|
|
40
|
+
return null;
|
|
41
|
+
const minute = parts[0];
|
|
42
|
+
const hour = parts[1];
|
|
43
|
+
// Extract --project-dir value from the line
|
|
44
|
+
const projDirMatch = line.match(/--project-dir\s+(\S+)/);
|
|
45
|
+
const projectDir = projDirMatch ? projDirMatch[1] : '';
|
|
46
|
+
return { minute, hour, projectDir };
|
|
47
|
+
}
|
|
48
|
+
export function getSchedule() {
|
|
49
|
+
try {
|
|
50
|
+
const crontab = getCurrentCrontab();
|
|
51
|
+
const dreamLine = crontab.split('\n').find((l) => l.includes(CRON_TAG));
|
|
52
|
+
if (!dreamLine) {
|
|
53
|
+
return { isScheduled: false, time: null, logPath: null, projectDir: null };
|
|
54
|
+
}
|
|
55
|
+
const parsed = parseDreamLine(dreamLine);
|
|
56
|
+
if (!parsed) {
|
|
57
|
+
return { isScheduled: false, time: null, logPath: null, projectDir: null };
|
|
58
|
+
}
|
|
59
|
+
const time = `${parsed.hour.padStart(2, '0')}:${parsed.minute.padStart(2, '0')}`;
|
|
60
|
+
return {
|
|
61
|
+
isScheduled: true,
|
|
62
|
+
time,
|
|
63
|
+
logPath: LOG_PATH,
|
|
64
|
+
projectDir: parsed.projectDir || null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return { isScheduled: false, time: null, logPath: null, projectDir: null };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function schedule(time, projectDir) {
|
|
72
|
+
ensureSoleriDir();
|
|
73
|
+
const match = time.match(/^(\d{1,2}):(\d{2})$/);
|
|
74
|
+
if (!match) {
|
|
75
|
+
return { isScheduled: false, time: null, logPath: null, projectDir: null };
|
|
76
|
+
}
|
|
77
|
+
const hour = parseInt(match[1], 10);
|
|
78
|
+
let minute = parseInt(match[2], 10);
|
|
79
|
+
// Add a few minutes offset to avoid running exactly on the hour
|
|
80
|
+
if (minute === 0) {
|
|
81
|
+
minute = 3;
|
|
82
|
+
}
|
|
83
|
+
const claudePath = resolveClaudePath();
|
|
84
|
+
const cronLine = `${minute} ${hour} * * * ${claudePath} --dangerously-skip-permissions -p "Run /ernesto-dream" --project-dir ${projectDir} >> ${LOG_PATH} 2>&1 ${CRON_TAG}`;
|
|
85
|
+
try {
|
|
86
|
+
const crontab = getCurrentCrontab();
|
|
87
|
+
// Remove any existing dream lines (idempotent)
|
|
88
|
+
const filtered = crontab
|
|
89
|
+
.split('\n')
|
|
90
|
+
.filter((l) => !l.includes(CRON_TAG))
|
|
91
|
+
.join('\n');
|
|
92
|
+
const newCrontab = filtered.endsWith('\n')
|
|
93
|
+
? `${filtered}${cronLine}\n`
|
|
94
|
+
: `${filtered}\n${cronLine}\n`;
|
|
95
|
+
writeCrontab(newCrontab);
|
|
96
|
+
const formattedTime = `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;
|
|
97
|
+
return {
|
|
98
|
+
isScheduled: true,
|
|
99
|
+
time: formattedTime,
|
|
100
|
+
logPath: LOG_PATH,
|
|
101
|
+
projectDir,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return { isScheduled: false, time: null, logPath: null, projectDir: null };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function unschedule() {
|
|
109
|
+
try {
|
|
110
|
+
const crontab = getCurrentCrontab();
|
|
111
|
+
const filtered = crontab
|
|
112
|
+
.split('\n')
|
|
113
|
+
.filter((l) => !l.includes(CRON_TAG))
|
|
114
|
+
.join('\n');
|
|
115
|
+
writeCrontab(filtered);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Graceful degradation — if crontab fails, just return unscheduled
|
|
119
|
+
}
|
|
120
|
+
return { isScheduled: false, time: null, logPath: null, projectDir: null };
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=cron-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-manager.js","sourceRoot":"","sources":["../../src/dream/cron-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Vault } from '../vault/vault.js';
|
|
2
|
+
import type { Curator } from '../curator/curator.js';
|
|
3
|
+
export interface DreamReport {
|
|
4
|
+
durationMs: number;
|
|
5
|
+
duplicatesFound: number;
|
|
6
|
+
staleArchived: number;
|
|
7
|
+
contradictionsFound: number;
|
|
8
|
+
totalDreams: number;
|
|
9
|
+
timestamp: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DreamStatus {
|
|
12
|
+
sessionsSinceLastDream: number;
|
|
13
|
+
lastDreamAt: string | null;
|
|
14
|
+
lastDreamDurationMs: number | null;
|
|
15
|
+
totalDreams: number;
|
|
16
|
+
gateEligible: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class DreamEngine {
|
|
19
|
+
private curator;
|
|
20
|
+
private sessionThreshold;
|
|
21
|
+
private hourThreshold;
|
|
22
|
+
private provider;
|
|
23
|
+
constructor(vault: Vault, curator: Curator, sessionThreshold?: number, hourThreshold?: number);
|
|
24
|
+
run(): DreamReport;
|
|
25
|
+
incrementSessionCount(): void;
|
|
26
|
+
getStatus(): DreamStatus;
|
|
27
|
+
checkGate(): {
|
|
28
|
+
eligible: boolean;
|
|
29
|
+
reason: string;
|
|
30
|
+
};
|
|
31
|
+
private isGateEligible;
|
|
32
|
+
private getMeta;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dream-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream-engine.d.ts","sourceRoot":"","sources":["../../src/dream/dream-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,WAAW;IAKpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,aAAa;IANvB,OAAO,CAAC,QAAQ,CAAsB;gBAGpC,KAAK,EAAE,KAAK,EACJ,OAAO,EAAE,OAAO,EAChB,gBAAgB,GAAE,MAAU,EAC5B,aAAa,GAAE,MAAW;IAKpC,GAAG,IAAI,WAAW;IAkClB,qBAAqB,IAAI,IAAI;IAM7B,SAAS,IAAI,WAAW;IAWxB,SAAS,IAAI;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAsBlD,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,OAAO;CAGhB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export class DreamEngine {
|
|
2
|
+
curator;
|
|
3
|
+
sessionThreshold;
|
|
4
|
+
hourThreshold;
|
|
5
|
+
provider;
|
|
6
|
+
constructor(vault, curator, sessionThreshold = 5, hourThreshold = 24) {
|
|
7
|
+
this.curator = curator;
|
|
8
|
+
this.sessionThreshold = sessionThreshold;
|
|
9
|
+
this.hourThreshold = hourThreshold;
|
|
10
|
+
this.provider = vault.getProvider();
|
|
11
|
+
}
|
|
12
|
+
run() {
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
const result = this.curator.consolidate({
|
|
15
|
+
dryRun: false,
|
|
16
|
+
staleDaysThreshold: 90,
|
|
17
|
+
duplicateThreshold: 0.45,
|
|
18
|
+
contradictionThreshold: 0.4,
|
|
19
|
+
});
|
|
20
|
+
const durationMs = Date.now() - start;
|
|
21
|
+
const now = new Date().toISOString();
|
|
22
|
+
this.provider.run(`UPDATE dream_meta SET
|
|
23
|
+
sessions_since_last_dream = 0,
|
|
24
|
+
last_dream_at = ?,
|
|
25
|
+
last_dream_duration_ms = ?,
|
|
26
|
+
last_dream_report = ?,
|
|
27
|
+
total_dreams = total_dreams + 1,
|
|
28
|
+
updated_at = ?
|
|
29
|
+
WHERE id = 1`, [now, durationMs, JSON.stringify(result), now]);
|
|
30
|
+
const meta = this.getMeta();
|
|
31
|
+
return {
|
|
32
|
+
durationMs,
|
|
33
|
+
duplicatesFound: result.duplicates?.length ?? 0,
|
|
34
|
+
staleArchived: result.staleEntries?.length ?? 0,
|
|
35
|
+
contradictionsFound: result.contradictions?.length ?? 0,
|
|
36
|
+
totalDreams: meta.total_dreams,
|
|
37
|
+
timestamp: now,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
incrementSessionCount() {
|
|
41
|
+
this.provider.run("UPDATE dream_meta SET sessions_since_last_dream = sessions_since_last_dream + 1, updated_at = datetime('now') WHERE id = 1");
|
|
42
|
+
}
|
|
43
|
+
getStatus() {
|
|
44
|
+
const meta = this.getMeta();
|
|
45
|
+
return {
|
|
46
|
+
sessionsSinceLastDream: meta.sessions_since_last_dream,
|
|
47
|
+
lastDreamAt: meta.last_dream_at,
|
|
48
|
+
lastDreamDurationMs: meta.last_dream_duration_ms,
|
|
49
|
+
totalDreams: meta.total_dreams,
|
|
50
|
+
gateEligible: this.isGateEligible(meta),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
checkGate() {
|
|
54
|
+
const meta = this.getMeta();
|
|
55
|
+
const sessions = meta.sessions_since_last_dream;
|
|
56
|
+
const lastDream = meta.last_dream_at;
|
|
57
|
+
if (sessions < this.sessionThreshold) {
|
|
58
|
+
return {
|
|
59
|
+
eligible: false,
|
|
60
|
+
reason: `Only ${sessions}/${this.sessionThreshold} sessions since last dream`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (lastDream) {
|
|
64
|
+
const hoursSince = (Date.now() - new Date(lastDream).getTime()) / (1000 * 60 * 60);
|
|
65
|
+
if (hoursSince < this.hourThreshold) {
|
|
66
|
+
return {
|
|
67
|
+
eligible: false,
|
|
68
|
+
reason: `Only ${Math.round(hoursSince)}h/${this.hourThreshold}h since last dream`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { eligible: true, reason: 'Gate conditions met' };
|
|
73
|
+
}
|
|
74
|
+
isGateEligible(meta) {
|
|
75
|
+
const sessions = meta.sessions_since_last_dream;
|
|
76
|
+
const lastDream = meta.last_dream_at;
|
|
77
|
+
if (sessions < this.sessionThreshold)
|
|
78
|
+
return false;
|
|
79
|
+
if (!lastDream)
|
|
80
|
+
return true;
|
|
81
|
+
const hoursSince = (Date.now() - new Date(lastDream).getTime()) / (1000 * 60 * 60);
|
|
82
|
+
return hoursSince >= this.hourThreshold;
|
|
83
|
+
}
|
|
84
|
+
getMeta() {
|
|
85
|
+
return this.provider.get('SELECT * FROM dream_meta WHERE id = 1');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=dream-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream-engine.js","sourceRoot":"","sources":["../../src/dream/dream-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dream runtime ops — facade operations for the dream engine.
|
|
3
|
+
* dream_run, dream_status, dream_check_gate.
|
|
4
|
+
*/
|
|
5
|
+
import type { OpDefinition } from '../facades/types.js';
|
|
6
|
+
import type { AgentRuntime } from '../runtime/types.js';
|
|
7
|
+
export declare function createDreamOps(runtime: AgentRuntime): OpDefinition[];
|
|
8
|
+
//# sourceMappingURL=dream-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream-ops.d.ts","sourceRoot":"","sources":["../../src/dream/dream-ops.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,EAAE,CA4CpE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dream runtime ops — facade operations for the dream engine.
|
|
3
|
+
* dream_run, dream_status, dream_check_gate.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { DreamEngine } from './dream-engine.js';
|
|
7
|
+
import { ensureDreamSchema } from './schema.js';
|
|
8
|
+
export function createDreamOps(runtime) {
|
|
9
|
+
const { vault, curator } = runtime;
|
|
10
|
+
ensureDreamSchema(vault.getProvider());
|
|
11
|
+
const engine = new DreamEngine(vault, curator);
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
name: 'dream_run',
|
|
15
|
+
description: 'Run a dream cycle — consolidate vault knowledge (duplicates, stale entries, contradictions). Checks gate unless force=true.',
|
|
16
|
+
auth: 'write',
|
|
17
|
+
schema: z.object({
|
|
18
|
+
force: z.boolean().optional().describe('Skip gate check. Default false.'),
|
|
19
|
+
}),
|
|
20
|
+
handler: async (params) => {
|
|
21
|
+
const force = params.force ?? false;
|
|
22
|
+
if (!force) {
|
|
23
|
+
const gate = engine.checkGate();
|
|
24
|
+
if (!gate.eligible) {
|
|
25
|
+
return { skipped: true, reason: gate.reason, status: engine.getStatus() };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return engine.run();
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'dream_status',
|
|
33
|
+
description: 'Dream status — sessions since last dream, last dream timestamp, gate eligibility.',
|
|
34
|
+
auth: 'read',
|
|
35
|
+
handler: async () => {
|
|
36
|
+
return engine.getStatus();
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'dream_check_gate',
|
|
41
|
+
description: 'Check whether dream gate conditions are met (session threshold + time threshold).',
|
|
42
|
+
auth: 'read',
|
|
43
|
+
handler: async () => {
|
|
44
|
+
return engine.checkGate();
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=dream-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream-ops.js","sourceRoot":"","sources":["../../src/dream/dream-ops.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE/C,OAAO;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,6HAA6H;YAC/H,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;aAC1E,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxB,MAAM,KAAK,GAAI,MAAM,CAAC,KAAiB,IAAI,KAAK,CAAC;gBACjD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;oBAC5E,CAAC;gBACH,CAAC;gBACD,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC;YACtB,CAAC;SACF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,mFAAmF;YACrF,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5B,CAAC;SACF;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACT,mFAAmF;YACrF,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5B,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ensureDreamSchema } from './schema.js';
|
|
2
|
+
export { DreamEngine } from './dream-engine.js';
|
|
3
|
+
export type { DreamReport, DreamStatus } from './dream-engine.js';
|
|
4
|
+
export { createDreamOps } from './dream-ops.js';
|
|
5
|
+
export { getSchedule, schedule, unschedule } from './cron-manager.js';
|
|
6
|
+
export type { CronSchedule } from './cron-manager.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/dream/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAcrE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function ensureDreamSchema(provider) {
|
|
2
|
+
provider.execSql(`
|
|
3
|
+
CREATE TABLE IF NOT EXISTS dream_meta (
|
|
4
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
5
|
+
sessions_since_last_dream INTEGER NOT NULL DEFAULT 0,
|
|
6
|
+
last_dream_at TEXT,
|
|
7
|
+
last_dream_duration_ms INTEGER,
|
|
8
|
+
last_dream_report TEXT,
|
|
9
|
+
total_dreams INTEGER NOT NULL DEFAULT 0,
|
|
10
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
11
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
12
|
+
)
|
|
13
|
+
`);
|
|
14
|
+
provider.run('INSERT OR IGNORE INTO dream_meta (id) VALUES (1)');
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/dream/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,QAA6B;IAC7D,QAAQ,CAAC,OAAO,CAAC;;;;;;;;;;;GAWhB,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { EmbeddingProvider, EmbeddingResult, EmbeddingConfig, StoredVector, EmbeddingStats, } from './types.js';
|
|
2
|
+
export { OpenAIEmbeddingProvider } from './openai-provider.js';
|
|
3
|
+
export { EmbeddingPipeline } from './pipeline.js';
|
|
4
|
+
export type { BatchEmbedOptions, BatchEmbedResult } from './pipeline.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Embedding Provider — generates dense vector embeddings via the
|
|
3
|
+
* OpenAI embeddings API. Supports key pool rotation and batch chunking.
|
|
4
|
+
*/
|
|
5
|
+
import type { EmbeddingProvider, EmbeddingResult, EmbeddingConfig } from './types.js';
|
|
6
|
+
import type { KeyPool } from '../llm/key-pool.js';
|
|
7
|
+
/**
|
|
8
|
+
* Embedding provider that calls the OpenAI `/v1/embeddings` endpoint.
|
|
9
|
+
*
|
|
10
|
+
* Supports optional {@link KeyPool} for key rotation — on 429 responses the
|
|
11
|
+
* pool is rotated so the next call uses a fresh key. If no pool is provided,
|
|
12
|
+
* falls back to `config.apiKey`.
|
|
13
|
+
*/
|
|
14
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
15
|
+
readonly providerName = "openai";
|
|
16
|
+
readonly model: string;
|
|
17
|
+
readonly dimensions: number;
|
|
18
|
+
private readonly apiUrl;
|
|
19
|
+
private readonly batchSize;
|
|
20
|
+
private readonly apiKey?;
|
|
21
|
+
private readonly keyPool?;
|
|
22
|
+
constructor(config: EmbeddingConfig, keyPool?: KeyPool);
|
|
23
|
+
/**
|
|
24
|
+
* Embed one or more texts, returning one vector per input text.
|
|
25
|
+
* Automatically chunks requests that exceed {@link batchSize}.
|
|
26
|
+
*/
|
|
27
|
+
embed(texts: string[]): Promise<EmbeddingResult>;
|
|
28
|
+
private resolveApiKey;
|
|
29
|
+
private callApi;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=openai-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AA4BlD;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;gBAEvB,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO;IAkBtD;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BtD,OAAO,CAAC,aAAa;YAUP,OAAO;CA6CtB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Embedding Provider — generates dense vector embeddings via the
|
|
3
|
+
* OpenAI embeddings API. Supports key pool rotation and batch chunking.
|
|
4
|
+
*/
|
|
5
|
+
import { LLMError } from '../llm/types.js';
|
|
6
|
+
import { retry } from '../llm/utils.js';
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// CONSTANTS
|
|
9
|
+
// =============================================================================
|
|
10
|
+
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
11
|
+
const DEFAULT_DIMENSIONS = 1536;
|
|
12
|
+
const DEFAULT_BATCH_SIZE = 2048;
|
|
13
|
+
const DEFAULT_BASE_URL = 'https://api.openai.com';
|
|
14
|
+
const REQUEST_TIMEOUT_MS = 60_000;
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// PROVIDER
|
|
17
|
+
// =============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Embedding provider that calls the OpenAI `/v1/embeddings` endpoint.
|
|
20
|
+
*
|
|
21
|
+
* Supports optional {@link KeyPool} for key rotation — on 429 responses the
|
|
22
|
+
* pool is rotated so the next call uses a fresh key. If no pool is provided,
|
|
23
|
+
* falls back to `config.apiKey`.
|
|
24
|
+
*/
|
|
25
|
+
export class OpenAIEmbeddingProvider {
|
|
26
|
+
providerName = 'openai';
|
|
27
|
+
model;
|
|
28
|
+
dimensions;
|
|
29
|
+
apiUrl;
|
|
30
|
+
batchSize;
|
|
31
|
+
apiKey;
|
|
32
|
+
keyPool;
|
|
33
|
+
constructor(config, keyPool) {
|
|
34
|
+
this.model = config.model || DEFAULT_MODEL;
|
|
35
|
+
this.dimensions = DEFAULT_DIMENSIONS;
|
|
36
|
+
this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
37
|
+
this.apiKey = config.apiKey;
|
|
38
|
+
this.keyPool = keyPool;
|
|
39
|
+
const baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
40
|
+
this.apiUrl = `${baseUrl}/v1/embeddings`;
|
|
41
|
+
if (!this.keyPool?.hasKeys && !this.apiKey) {
|
|
42
|
+
throw new LLMError('OpenAI embedding provider requires an API key — provide config.apiKey or a KeyPool with keys', { retryable: false });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Embed one or more texts, returning one vector per input text.
|
|
47
|
+
* Automatically chunks requests that exceed {@link batchSize}.
|
|
48
|
+
*/
|
|
49
|
+
async embed(texts) {
|
|
50
|
+
if (texts.length === 0) {
|
|
51
|
+
return { vectors: [], tokensUsed: 0, model: this.model };
|
|
52
|
+
}
|
|
53
|
+
// Single batch — no chunking needed
|
|
54
|
+
if (texts.length <= this.batchSize) {
|
|
55
|
+
return this.callApi(texts);
|
|
56
|
+
}
|
|
57
|
+
// Chunk into batches and concatenate results
|
|
58
|
+
const allVectors = [];
|
|
59
|
+
let totalTokens = 0;
|
|
60
|
+
for (let offset = 0; offset < texts.length; offset += this.batchSize) {
|
|
61
|
+
const chunk = texts.slice(offset, offset + this.batchSize);
|
|
62
|
+
// oxlint-disable-next-line eslint(no-await-in-loop)
|
|
63
|
+
const result = await this.callApi(chunk);
|
|
64
|
+
allVectors.push(...result.vectors);
|
|
65
|
+
totalTokens += result.tokensUsed;
|
|
66
|
+
}
|
|
67
|
+
return { vectors: allVectors, tokensUsed: totalTokens, model: this.model };
|
|
68
|
+
}
|
|
69
|
+
// ===========================================================================
|
|
70
|
+
// INTERNALS
|
|
71
|
+
// ===========================================================================
|
|
72
|
+
resolveApiKey() {
|
|
73
|
+
if (this.keyPool?.hasKeys) {
|
|
74
|
+
return this.keyPool.getActiveKey().expose();
|
|
75
|
+
}
|
|
76
|
+
if (this.apiKey) {
|
|
77
|
+
return this.apiKey;
|
|
78
|
+
}
|
|
79
|
+
throw new LLMError('No API key available for OpenAI embeddings', { retryable: false });
|
|
80
|
+
}
|
|
81
|
+
async callApi(texts) {
|
|
82
|
+
const doRequest = async () => {
|
|
83
|
+
const apiKey = this.resolveApiKey();
|
|
84
|
+
const response = await fetch(this.apiUrl, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: {
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
Authorization: `Bearer ${apiKey}`,
|
|
89
|
+
},
|
|
90
|
+
body: JSON.stringify({
|
|
91
|
+
model: this.model,
|
|
92
|
+
input: texts,
|
|
93
|
+
}),
|
|
94
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
// Rotate key on rate limit
|
|
98
|
+
if (response.status === 429 && this.keyPool && this.keyPool.poolSize > 1) {
|
|
99
|
+
this.keyPool.rotateOnError();
|
|
100
|
+
}
|
|
101
|
+
const errorBody = await response.text();
|
|
102
|
+
throw new LLMError(`OpenAI Embeddings API error: ${response.status} - ${errorBody}`, {
|
|
103
|
+
retryable: response.status === 429 || response.status >= 500,
|
|
104
|
+
statusCode: response.status,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const data = (await response.json());
|
|
108
|
+
// OpenAI returns data sorted by index, but sort defensively
|
|
109
|
+
const sorted = [...data.data].sort((a, b) => a.index - b.index);
|
|
110
|
+
const vectors = sorted.map((d) => d.embedding);
|
|
111
|
+
return {
|
|
112
|
+
vectors,
|
|
113
|
+
tokensUsed: data.usage?.total_tokens ?? 0,
|
|
114
|
+
model: this.model,
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
return retry(doRequest, { maxAttempts: 3 });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=openai-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/embeddings/openai-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding pipeline — batch and incremental embedding of vault entries.
|
|
3
|
+
*/
|
|
4
|
+
import type { EmbeddingProvider } from './types.js';
|
|
5
|
+
import type { PersistenceProvider } from '../persistence/types.js';
|
|
6
|
+
export interface BatchEmbedOptions {
|
|
7
|
+
/** Number of entries per API call (default 100). */
|
|
8
|
+
batchSize?: number;
|
|
9
|
+
/** Called after each batch with (completed, total). */
|
|
10
|
+
onProgress?: (completed: number, total: number) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface BatchEmbedResult {
|
|
13
|
+
embedded: number;
|
|
14
|
+
skipped: number;
|
|
15
|
+
failed: number;
|
|
16
|
+
tokensUsed: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class EmbeddingPipeline {
|
|
19
|
+
private provider;
|
|
20
|
+
private persistence;
|
|
21
|
+
constructor(provider: EmbeddingProvider, persistence: PersistenceProvider);
|
|
22
|
+
/**
|
|
23
|
+
* Batch embed all entries missing vectors for the current model.
|
|
24
|
+
* Processes in chunks; skips entries that already have vectors.
|
|
25
|
+
* On batch failure, logs and continues with the next batch.
|
|
26
|
+
*/
|
|
27
|
+
batchEmbed(options?: BatchEmbedOptions): Promise<BatchEmbedResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Embed a single entry and store its vector.
|
|
30
|
+
* Returns true if embedded, false if skipped (vector already exists).
|
|
31
|
+
*/
|
|
32
|
+
embedEntry(entryId: string, text: string): Promise<boolean>;
|
|
33
|
+
/** Build the text to embed for a vault entry. */
|
|
34
|
+
private getEmbeddableText;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/embeddings/pipeline.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;gBADX,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,mBAAmB;IAG1C;;;;OAIG;IACG,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8DxE;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAejE,iDAAiD;IACjD,OAAO,CAAC,iBAAiB;CAW1B"}
|