zora-agent 0.9.4 → 0.9.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/CHANGELOG.md +1 -1
- package/README.md +103 -92
- package/dist/cli/audit-commands.d.ts.map +1 -1
- package/dist/cli/audit-commands.js +3 -1
- package/dist/cli/audit-commands.js.map +1 -1
- package/dist/cli/daemon.js +86 -28
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/edit-commands.d.ts.map +1 -1
- package/dist/cli/edit-commands.js +3 -1
- package/dist/cli/edit-commands.js.map +1 -1
- package/dist/cli/hook-commands.d.ts +9 -0
- package/dist/cli/hook-commands.d.ts.map +1 -0
- package/dist/cli/hook-commands.js +106 -0
- package/dist/cli/hook-commands.js.map +1 -0
- package/dist/cli/index.js +87 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +108 -9
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/memory-commands.d.ts +1 -1
- package/dist/cli/memory-commands.d.ts.map +1 -1
- package/dist/cli/memory-commands.js +213 -1
- package/dist/cli/memory-commands.js.map +1 -1
- package/dist/cli/presets.d.ts.map +1 -1
- package/dist/cli/presets.js +2 -1
- package/dist/cli/presets.js.map +1 -1
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +4 -2
- package/dist/cli/skill-commands.js.map +1 -1
- package/dist/cli/steer-commands.d.ts.map +1 -1
- package/dist/cli/steer-commands.js +6 -4
- package/dist/cli/steer-commands.js.map +1 -1
- package/dist/cli/team-commands.d.ts.map +1 -1
- package/dist/cli/team-commands.js +3 -1
- package/dist/cli/team-commands.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +12 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +23 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +64 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/config/policy-loader.d.ts +14 -0
- package/dist/config/policy-loader.d.ts.map +1 -1
- package/dist/config/policy-loader.js +33 -0
- package/dist/config/policy-loader.js.map +1 -1
- package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
- package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
- package/dist/dashboard/frontend/dist/index.html +17 -0
- package/dist/dashboard/server.d.ts +19 -2
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +121 -20
- package/dist/dashboard/server.js.map +1 -1
- package/dist/hooks/hook-runner.d.ts +55 -0
- package/dist/hooks/hook-runner.d.ts.map +1 -0
- package/dist/hooks/hook-runner.js +120 -0
- package/dist/hooks/hook-runner.js.map +1 -0
- package/dist/hooks/hook-types.d.ts +82 -0
- package/dist/hooks/hook-types.d.ts.map +1 -0
- package/dist/hooks/hook-types.js +20 -0
- package/dist/hooks/hook-types.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +108 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +307 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +88 -4
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +299 -7
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/observation-store.d.ts +75 -0
- package/dist/memory/observation-store.d.ts.map +1 -0
- package/dist/memory/observation-store.js +162 -0
- package/dist/memory/observation-store.js.map +1 -0
- package/dist/memory/observer-worker.d.ts +34 -0
- package/dist/memory/observer-worker.d.ts.map +1 -0
- package/dist/memory/observer-worker.js +161 -0
- package/dist/memory/observer-worker.js.map +1 -0
- package/dist/memory/reflector-worker.d.ts +40 -0
- package/dist/memory/reflector-worker.d.ts.map +1 -0
- package/dist/memory/reflector-worker.js +185 -0
- package/dist/memory/reflector-worker.js.map +1 -0
- package/dist/memory/salience-scorer.d.ts +16 -6
- package/dist/memory/salience-scorer.d.ts.map +1 -1
- package/dist/memory/salience-scorer.js +42 -22
- package/dist/memory/salience-scorer.js.map +1 -1
- package/dist/memory/structured-memory.d.ts +36 -1
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +207 -8
- package/dist/memory/structured-memory.js.map +1 -1
- package/dist/memory/token-estimator.d.ts +31 -0
- package/dist/memory/token-estimator.d.ts.map +1 -0
- package/dist/memory/token-estimator.js +77 -0
- package/dist/memory/token-estimator.js.map +1 -0
- package/dist/memory/validation-pipeline.d.ts +37 -0
- package/dist/memory/validation-pipeline.d.ts.map +1 -0
- package/dist/memory/validation-pipeline.js +106 -0
- package/dist/memory/validation-pipeline.js.map +1 -0
- package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
- package/dist/orchestrator/auth-monitor.js +3 -1
- package/dist/orchestrator/auth-monitor.js.map +1 -1
- package/dist/orchestrator/execution-loop.d.ts +23 -0
- package/dist/orchestrator/execution-loop.d.ts.map +1 -1
- package/dist/orchestrator/execution-loop.js +60 -19
- package/dist/orchestrator/execution-loop.js.map +1 -1
- package/dist/orchestrator/failover-controller.d.ts +26 -2
- package/dist/orchestrator/failover-controller.d.ts.map +1 -1
- package/dist/orchestrator/failover-controller.js +143 -23
- package/dist/orchestrator/failover-controller.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +70 -7
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +416 -92
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/retry-queue.d.ts.map +1 -1
- package/dist/orchestrator/retry-queue.js +24 -9
- package/dist/orchestrator/retry-queue.js.map +1 -1
- package/dist/orchestrator/router.d.ts +16 -1
- package/dist/orchestrator/router.d.ts.map +1 -1
- package/dist/orchestrator/router.js +79 -20
- package/dist/orchestrator/router.js.map +1 -1
- package/dist/orchestrator/session-manager.d.ts +26 -1
- package/dist/orchestrator/session-manager.d.ts.map +1 -1
- package/dist/orchestrator/session-manager.js +88 -4
- package/dist/orchestrator/session-manager.js.map +1 -1
- package/dist/providers/circuit-breaker.d.ts +78 -0
- package/dist/providers/circuit-breaker.d.ts.map +1 -0
- package/dist/providers/circuit-breaker.js +129 -0
- package/dist/providers/circuit-breaker.js.map +1 -0
- package/dist/providers/claude-provider.d.ts +27 -11
- package/dist/providers/claude-provider.d.ts.map +1 -1
- package/dist/providers/claude-provider.js +161 -46
- package/dist/providers/claude-provider.js.map +1 -1
- package/dist/providers/gemini-provider.d.ts +9 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +97 -48
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts +7 -0
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +89 -18
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/routines/heartbeat.d.ts +10 -2
- package/dist/routines/heartbeat.d.ts.map +1 -1
- package/dist/routines/heartbeat.js +42 -5
- package/dist/routines/heartbeat.js.map +1 -1
- package/dist/routines/routine-manager.d.ts.map +1 -1
- package/dist/routines/routine-manager.js +22 -15
- package/dist/routines/routine-manager.js.map +1 -1
- package/dist/security/audit-logger.d.ts.map +1 -1
- package/dist/security/audit-logger.js +5 -7
- package/dist/security/audit-logger.js.map +1 -1
- package/dist/security/policy-engine.d.ts +28 -17
- package/dist/security/policy-engine.d.ts.map +1 -1
- package/dist/security/policy-engine.js +42 -185
- package/dist/security/policy-engine.js.map +1 -1
- package/dist/security/policy-serializer.d.ts +19 -0
- package/dist/security/policy-serializer.d.ts.map +1 -0
- package/dist/security/policy-serializer.js +100 -0
- package/dist/security/policy-serializer.js.map +1 -0
- package/dist/security/shell-validator.d.ts +42 -0
- package/dist/security/shell-validator.d.ts.map +1 -0
- package/dist/security/shell-validator.js +231 -0
- package/dist/security/shell-validator.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-loader.d.ts +38 -2
- package/dist/skills/skill-loader.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +83 -2
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/subagent-loader.d.ts +66 -0
- package/dist/skills/subagent-loader.d.ts.map +1 -0
- package/dist/skills/subagent-loader.js +143 -0
- package/dist/skills/subagent-loader.js.map +1 -0
- package/dist/steering/flag-manager.d.ts +20 -0
- package/dist/steering/flag-manager.d.ts.map +1 -1
- package/dist/steering/flag-manager.js +94 -11
- package/dist/steering/flag-manager.js.map +1 -1
- package/dist/steering/steering-manager.d.ts +11 -0
- package/dist/steering/steering-manager.d.ts.map +1 -1
- package/dist/steering/steering-manager.js +23 -0
- package/dist/steering/steering-manager.js.map +1 -1
- package/dist/steering/telegram-gateway.d.ts +4 -1
- package/dist/steering/telegram-gateway.d.ts.map +1 -1
- package/dist/steering/telegram-gateway.js +49 -10
- package/dist/steering/telegram-gateway.js.map +1 -1
- package/dist/teams/bridge-watchdog.d.ts.map +1 -1
- package/dist/teams/bridge-watchdog.js +5 -3
- package/dist/teams/bridge-watchdog.js.map +1 -1
- package/dist/teams/gemini-bridge.d.ts.map +1 -1
- package/dist/teams/gemini-bridge.js +9 -4
- package/dist/teams/gemini-bridge.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +16 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +207 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +3 -1
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/tool-factory.d.ts +36 -0
- package/dist/tools/tool-factory.d.ts.map +1 -0
- package/dist/tools/tool-factory.js +55 -0
- package/dist/tools/tool-factory.js.map +1 -0
- package/dist/types.d.ts +205 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +47 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/errors.d.ts +21 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +29 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-filter.d.ts +25 -0
- package/dist/utils/event-filter.d.ts.map +1 -0
- package/dist/utils/event-filter.js +61 -0
- package/dist/utils/event-filter.js.map +1 -0
- package/dist/utils/logger.d.ts +33 -36
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -130
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validate-job-id.d.ts +6 -0
- package/dist/utils/validate-job-id.d.ts.map +1 -0
- package/dist/utils/validate-job-id.js +10 -0
- package/dist/utils/validate-job-id.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observation-store.js","sourceRoot":"","sources":["../../src/memory/observation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObserverWorker — Background agent that compresses raw messages
|
|
3
|
+
* into dated, priority-tagged observations.
|
|
4
|
+
*
|
|
5
|
+
* Runs asynchronously so the agent never blocks during compression.
|
|
6
|
+
* Uses a cheap/fast model (e.g., Gemini Flash) for cost efficiency.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentEvent } from '../types.js';
|
|
9
|
+
import type { ObservationBlock } from './observation-store.js';
|
|
10
|
+
/**
|
|
11
|
+
* Function signature for the LLM compression call.
|
|
12
|
+
* Accepts a prompt string, returns the compressed observations.
|
|
13
|
+
*/
|
|
14
|
+
export type CompressFn = (prompt: string) => Promise<string>;
|
|
15
|
+
export declare class ObserverWorker {
|
|
16
|
+
private readonly _compressFn;
|
|
17
|
+
constructor(compressFn: CompressFn);
|
|
18
|
+
/**
|
|
19
|
+
* Compress a chunk of messages into an observation block.
|
|
20
|
+
* This is the core compression operation — called in the background by ContextCompressor.
|
|
21
|
+
*
|
|
22
|
+
* @param messages The raw messages to compress
|
|
23
|
+
* @param startIndex The global message index of the first message (for the prompt)
|
|
24
|
+
* @param existingObservations Previously compressed observations (for dedup context)
|
|
25
|
+
* @param sessionId The session these messages belong to
|
|
26
|
+
*/
|
|
27
|
+
compress(messages: AgentEvent[], startIndex: number, existingObservations: string, sessionId: string): Promise<ObservationBlock>;
|
|
28
|
+
/**
|
|
29
|
+
* Fallback compression when the LLM call fails.
|
|
30
|
+
* Produces a minimal summary from event types and timestamps.
|
|
31
|
+
*/
|
|
32
|
+
private _fallbackCompress;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=observer-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-worker.d.ts","sourceRoot":"","sources":["../../src/memory/observer-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO/D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAsF7D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAE7B,UAAU,EAAE,UAAU;IAIlC;;;;;;;;OAQG;IACG,QAAQ,CACZ,QAAQ,EAAE,UAAU,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC;IAmC5B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAqC1B"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObserverWorker — Background agent that compresses raw messages
|
|
3
|
+
* into dated, priority-tagged observations.
|
|
4
|
+
*
|
|
5
|
+
* Runs asynchronously so the agent never blocks during compression.
|
|
6
|
+
* Uses a cheap/fast model (e.g., Gemini Flash) for cost efficiency.
|
|
7
|
+
*/
|
|
8
|
+
import { ObservationStore } from './observation-store.js';
|
|
9
|
+
import { estimateTokens } from './token-estimator.js';
|
|
10
|
+
import { createLogger } from '../utils/logger.js';
|
|
11
|
+
const log = createLogger('observer-worker');
|
|
12
|
+
/**
|
|
13
|
+
* Serializes an AgentEvent into a human-readable string for the observer prompt.
|
|
14
|
+
*/
|
|
15
|
+
function serializeEvent(event, index) {
|
|
16
|
+
const ts = event.timestamp instanceof Date
|
|
17
|
+
? event.timestamp.toISOString()
|
|
18
|
+
: String(event.timestamp);
|
|
19
|
+
const content = event.content;
|
|
20
|
+
if (typeof content === 'string') {
|
|
21
|
+
return `[${index}] ${ts} [${event.type}] ${content}`;
|
|
22
|
+
}
|
|
23
|
+
if (content && typeof content === 'object') {
|
|
24
|
+
const obj = content;
|
|
25
|
+
switch (event.type) {
|
|
26
|
+
case 'text':
|
|
27
|
+
case 'thinking':
|
|
28
|
+
case 'steering':
|
|
29
|
+
return `[${index}] ${ts} [${event.type}] ${String(obj['text'] ?? '')}`;
|
|
30
|
+
case 'tool_call':
|
|
31
|
+
return `[${index}] ${ts} [tool_call] ${String(obj['tool'] ?? 'unknown')}(${JSON.stringify(obj['arguments'] ?? {}).substring(0, 500)})`;
|
|
32
|
+
case 'tool_result': {
|
|
33
|
+
const resultStr = JSON.stringify(obj['result'] ?? '');
|
|
34
|
+
const truncated = resultStr.length > 500 ? resultStr.substring(0, 500) + '...' : resultStr;
|
|
35
|
+
return `[${index}] ${ts} [tool_result] ${truncated}`;
|
|
36
|
+
}
|
|
37
|
+
case 'error':
|
|
38
|
+
return `[${index}] ${ts} [error] ${String(obj['message'] ?? JSON.stringify(content))}`;
|
|
39
|
+
case 'done':
|
|
40
|
+
return `[${index}] ${ts} [done] ${String(obj['text'] ?? '')}`;
|
|
41
|
+
default:
|
|
42
|
+
return `[${index}] ${ts} [${event.type}] ${JSON.stringify(content).substring(0, 500)}`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return `[${index}] ${ts} [${event.type}] ${String(content)}`;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build the observer prompt.
|
|
49
|
+
*/
|
|
50
|
+
function buildObserverPrompt(messages, startIndex, existingObservations) {
|
|
51
|
+
const serialized = messages.map((m, i) => serializeEvent(m, startIndex + i)).join('\n');
|
|
52
|
+
const existingBlock = existingObservations
|
|
53
|
+
? `\nExisting observations (for context, do NOT repeat these):\n${existingObservations}\n`
|
|
54
|
+
: '';
|
|
55
|
+
return `You are a conversation observer. Compress the following messages into concise, dated observations. Preserve:
|
|
56
|
+
- Decisions made and their reasoning
|
|
57
|
+
- Key facts learned or stated
|
|
58
|
+
- Tool results that inform future actions
|
|
59
|
+
- Errors encountered and how they were resolved
|
|
60
|
+
- User preferences expressed
|
|
61
|
+
|
|
62
|
+
Format each observation as:
|
|
63
|
+
[YYYY-MM-DD HH:MM] <PRIORITY> <observation>
|
|
64
|
+
|
|
65
|
+
Priority levels:
|
|
66
|
+
CRITICAL — Decisions, errors, blockers that affect future actions
|
|
67
|
+
IMPORTANT — Key facts, preferences, tool outcomes
|
|
68
|
+
NOTE — Background context, minor details
|
|
69
|
+
|
|
70
|
+
Rules:
|
|
71
|
+
- Be concise. Target 3-6x compression ratio.
|
|
72
|
+
- Preserve exact names, paths, IDs, and values (never paraphrase these).
|
|
73
|
+
- Group related observations by topic when possible.
|
|
74
|
+
- If a tool result is very large, summarize the outcome, not the raw output.
|
|
75
|
+
- Do not repeat information from existing observations.
|
|
76
|
+
${existingBlock}
|
|
77
|
+
Messages to compress:
|
|
78
|
+
${serialized}`;
|
|
79
|
+
}
|
|
80
|
+
export class ObserverWorker {
|
|
81
|
+
_compressFn;
|
|
82
|
+
constructor(compressFn) {
|
|
83
|
+
this._compressFn = compressFn;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Compress a chunk of messages into an observation block.
|
|
87
|
+
* This is the core compression operation — called in the background by ContextCompressor.
|
|
88
|
+
*
|
|
89
|
+
* @param messages The raw messages to compress
|
|
90
|
+
* @param startIndex The global message index of the first message (for the prompt)
|
|
91
|
+
* @param existingObservations Previously compressed observations (for dedup context)
|
|
92
|
+
* @param sessionId The session these messages belong to
|
|
93
|
+
*/
|
|
94
|
+
async compress(messages, startIndex, existingObservations, sessionId) {
|
|
95
|
+
const prompt = buildObserverPrompt(messages, startIndex, existingObservations);
|
|
96
|
+
let observations;
|
|
97
|
+
try {
|
|
98
|
+
observations = await this._compressFn(prompt);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
// On failure, fall back to a basic summary
|
|
102
|
+
log.error({ err, messageCount: messages.length }, 'Observer compression failed, using fallback');
|
|
103
|
+
observations = this._fallbackCompress(messages, startIndex);
|
|
104
|
+
}
|
|
105
|
+
const block = {
|
|
106
|
+
id: ObservationStore.generateId(),
|
|
107
|
+
sessionId,
|
|
108
|
+
createdAt: new Date().toISOString(),
|
|
109
|
+
tier: 'session',
|
|
110
|
+
observations,
|
|
111
|
+
sourceMessageRange: [startIndex, startIndex + messages.length],
|
|
112
|
+
estimatedTokens: estimateTokens(observations),
|
|
113
|
+
};
|
|
114
|
+
log.info({
|
|
115
|
+
sessionId,
|
|
116
|
+
inputMessages: messages.length,
|
|
117
|
+
outputTokens: block.estimatedTokens,
|
|
118
|
+
range: block.sourceMessageRange,
|
|
119
|
+
}, 'Observation block created');
|
|
120
|
+
return block;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Fallback compression when the LLM call fails.
|
|
124
|
+
* Produces a minimal summary from event types and timestamps.
|
|
125
|
+
*/
|
|
126
|
+
_fallbackCompress(messages, startIndex) {
|
|
127
|
+
const first = messages[0];
|
|
128
|
+
const last = messages[messages.length - 1];
|
|
129
|
+
const firstTs = first?.timestamp instanceof Date
|
|
130
|
+
? first.timestamp.toISOString().substring(0, 16).replace('T', ' ')
|
|
131
|
+
: 'unknown';
|
|
132
|
+
const lastTs = last?.timestamp instanceof Date
|
|
133
|
+
? last.timestamp.toISOString().substring(0, 16).replace('T', ' ')
|
|
134
|
+
: 'unknown';
|
|
135
|
+
const typeCounts = new Map();
|
|
136
|
+
for (const m of messages) {
|
|
137
|
+
typeCounts.set(m.type, (typeCounts.get(m.type) ?? 0) + 1);
|
|
138
|
+
}
|
|
139
|
+
const typeBreakdown = [...typeCounts.entries()]
|
|
140
|
+
.map(([type, count]) => `${count} ${type}`)
|
|
141
|
+
.join(', ');
|
|
142
|
+
// Extract text content from text events for minimal context
|
|
143
|
+
const textSnippets = [];
|
|
144
|
+
for (const m of messages) {
|
|
145
|
+
if (m.type === 'text' && m.content && typeof m.content === 'object') {
|
|
146
|
+
const text = m.content['text'];
|
|
147
|
+
if (typeof text === 'string' && text.length > 0) {
|
|
148
|
+
textSnippets.push(text.substring(0, 100));
|
|
149
|
+
if (textSnippets.length >= 3)
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
let summary = `[${firstTs}] NOTE — Compressed ${messages.length} messages (indices ${startIndex}-${startIndex + messages.length - 1}): ${typeBreakdown}`;
|
|
155
|
+
if (textSnippets.length > 0) {
|
|
156
|
+
summary += `\n[${lastTs}] NOTE — Key content: ${textSnippets.join(' | ')}`;
|
|
157
|
+
}
|
|
158
|
+
return summary;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=observer-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-worker.js","sourceRoot":"","sources":["../../src/memory/observer-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReflectorWorker — Condenses session observations into cross-session memory.
|
|
3
|
+
*
|
|
4
|
+
* When session-tier observations exceed their token budget, the Reflector:
|
|
5
|
+
* 1. Extracts persistent facts worth remembering across sessions
|
|
6
|
+
* 2. Condenses remaining observations (merge related, drop stale)
|
|
7
|
+
* 3. Feeds extracted facts into StructuredMemory as new MemoryItems
|
|
8
|
+
*
|
|
9
|
+
* Also runs on session end to capture any remaining valuable observations.
|
|
10
|
+
*/
|
|
11
|
+
import type { MemoryManager } from './memory-manager.js';
|
|
12
|
+
import { ObservationStore } from './observation-store.js';
|
|
13
|
+
import type { CompressFn } from './observer-worker.js';
|
|
14
|
+
export interface ReflectionResult {
|
|
15
|
+
itemsCreated: number;
|
|
16
|
+
condensedObservations: string;
|
|
17
|
+
condensedTokens: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class ReflectorWorker {
|
|
20
|
+
private readonly _compressFn;
|
|
21
|
+
private readonly _memoryManager;
|
|
22
|
+
constructor(compressFn: CompressFn, memoryManager: MemoryManager);
|
|
23
|
+
/**
|
|
24
|
+
* Reflect on session observations: extract persistent facts and condense.
|
|
25
|
+
*
|
|
26
|
+
* @param observations The session-tier observation text to reflect on
|
|
27
|
+
* @param sessionId The session ID (used as source for created items)
|
|
28
|
+
*/
|
|
29
|
+
reflect(observations: string, sessionId: string): Promise<ReflectionResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Run reflection and persist condensed observations as a cross-session block.
|
|
32
|
+
*/
|
|
33
|
+
reflectAndPersist(observations: string, sessionId: string, store: ObservationStore): Promise<ReflectionResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Parse the reflector's response into facts and condensed observations.
|
|
36
|
+
* Handles malformed responses gracefully.
|
|
37
|
+
*/
|
|
38
|
+
private _parseReflectorResponse;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=reflector-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflector-worker.d.ts","sourceRoot":"","sources":["../../src/memory/reflector-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAevD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB;AAkCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;gBAEnC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa;IAKhE;;;;;OAKG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkEjF;;OAEG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,CAAC;IAqB5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CAgDhC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReflectorWorker — Condenses session observations into cross-session memory.
|
|
3
|
+
*
|
|
4
|
+
* When session-tier observations exceed their token budget, the Reflector:
|
|
5
|
+
* 1. Extracts persistent facts worth remembering across sessions
|
|
6
|
+
* 2. Condenses remaining observations (merge related, drop stale)
|
|
7
|
+
* 3. Feeds extracted facts into StructuredMemory as new MemoryItems
|
|
8
|
+
*
|
|
9
|
+
* Also runs on session end to capture any remaining valuable observations.
|
|
10
|
+
*/
|
|
11
|
+
import { ObservationStore } from './observation-store.js';
|
|
12
|
+
import { estimateTokens } from './token-estimator.js';
|
|
13
|
+
import { createLogger } from '../utils/logger.js';
|
|
14
|
+
const log = createLogger('reflector-worker');
|
|
15
|
+
const VALID_TYPES = ['profile', 'event', 'knowledge', 'behavior', 'skill', 'tool'];
|
|
16
|
+
/**
|
|
17
|
+
* Build the reflector prompt.
|
|
18
|
+
*/
|
|
19
|
+
function buildReflectorPrompt(observations) {
|
|
20
|
+
return `You are a memory reflector. Review these session observations and produce TWO sections:
|
|
21
|
+
|
|
22
|
+
## SECTION 1: PERSISTENT FACTS
|
|
23
|
+
Extract facts worth remembering across sessions. These are things like:
|
|
24
|
+
- User preferences, habits, or identity facts
|
|
25
|
+
- Project decisions that affect future work
|
|
26
|
+
- Important configurations, paths, or environment details
|
|
27
|
+
- Skills or procedures the agent learned
|
|
28
|
+
- Recurring patterns or behaviors
|
|
29
|
+
|
|
30
|
+
Output as a JSON array on a SINGLE line after the header "FACTS:":
|
|
31
|
+
FACTS: [{"summary": "...", "type": "knowledge|behavior|profile|event|skill|tool", "tags": ["tag1", "tag2"]}]
|
|
32
|
+
|
|
33
|
+
If no persistent facts, output: FACTS: []
|
|
34
|
+
|
|
35
|
+
## SECTION 2: CONDENSED OBSERVATIONS
|
|
36
|
+
Condense the remaining observations:
|
|
37
|
+
- Merge related entries
|
|
38
|
+
- Drop anything no longer relevant (completed tasks, resolved errors)
|
|
39
|
+
- Keep CRITICAL items verbatim
|
|
40
|
+
- Preserve exact names, paths, IDs
|
|
41
|
+
|
|
42
|
+
Output the condensed observations in the same dated format after the header "CONDENSED:"
|
|
43
|
+
|
|
44
|
+
Observations to reflect on:
|
|
45
|
+
${observations}`;
|
|
46
|
+
}
|
|
47
|
+
export class ReflectorWorker {
|
|
48
|
+
_compressFn;
|
|
49
|
+
_memoryManager;
|
|
50
|
+
constructor(compressFn, memoryManager) {
|
|
51
|
+
this._compressFn = compressFn;
|
|
52
|
+
this._memoryManager = memoryManager;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reflect on session observations: extract persistent facts and condense.
|
|
56
|
+
*
|
|
57
|
+
* @param observations The session-tier observation text to reflect on
|
|
58
|
+
* @param sessionId The session ID (used as source for created items)
|
|
59
|
+
*/
|
|
60
|
+
async reflect(observations, sessionId) {
|
|
61
|
+
if (!observations.trim()) {
|
|
62
|
+
return { itemsCreated: 0, condensedObservations: '', condensedTokens: 0 };
|
|
63
|
+
}
|
|
64
|
+
const prompt = buildReflectorPrompt(observations);
|
|
65
|
+
let response;
|
|
66
|
+
try {
|
|
67
|
+
response = await this._compressFn(prompt);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
log.error({ err }, 'Reflector compression call failed');
|
|
71
|
+
// On failure, return observations unchanged
|
|
72
|
+
return {
|
|
73
|
+
itemsCreated: 0,
|
|
74
|
+
condensedObservations: observations,
|
|
75
|
+
condensedTokens: estimateTokens(observations),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Parse the response into facts + condensed observations
|
|
79
|
+
const { facts, condensed } = this._parseReflectorResponse(response);
|
|
80
|
+
// Create memory items from extracted facts
|
|
81
|
+
let itemsCreated = 0;
|
|
82
|
+
for (const fact of facts) {
|
|
83
|
+
try {
|
|
84
|
+
const itemType = VALID_TYPES.includes(fact.type)
|
|
85
|
+
? fact.type
|
|
86
|
+
: 'knowledge';
|
|
87
|
+
await this._memoryManager.structuredMemory.createItem({
|
|
88
|
+
type: itemType,
|
|
89
|
+
summary: fact.summary,
|
|
90
|
+
source: sessionId,
|
|
91
|
+
source_type: 'agent_analysis',
|
|
92
|
+
tags: fact.tags,
|
|
93
|
+
category: `${itemType}/reflected`,
|
|
94
|
+
});
|
|
95
|
+
itemsCreated++;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
log.debug({ err, fact: fact.summary }, 'Failed to create reflected memory item');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Invalidate memory index since we added items
|
|
102
|
+
if (itemsCreated > 0) {
|
|
103
|
+
this._memoryManager.invalidateIndex();
|
|
104
|
+
}
|
|
105
|
+
const condensedTokens = estimateTokens(condensed);
|
|
106
|
+
log.info({
|
|
107
|
+
sessionId,
|
|
108
|
+
factsExtracted: facts.length,
|
|
109
|
+
itemsCreated,
|
|
110
|
+
inputTokens: estimateTokens(observations),
|
|
111
|
+
condensedTokens,
|
|
112
|
+
}, 'Reflection complete');
|
|
113
|
+
return { itemsCreated, condensedObservations: condensed, condensedTokens };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Run reflection and persist condensed observations as a cross-session block.
|
|
117
|
+
*/
|
|
118
|
+
async reflectAndPersist(observations, sessionId, store) {
|
|
119
|
+
const result = await this.reflect(observations, sessionId);
|
|
120
|
+
if (result.condensedObservations.trim()) {
|
|
121
|
+
const block = {
|
|
122
|
+
id: ObservationStore.generateId(),
|
|
123
|
+
sessionId,
|
|
124
|
+
createdAt: new Date().toISOString(),
|
|
125
|
+
tier: 'cross-session',
|
|
126
|
+
observations: result.condensedObservations,
|
|
127
|
+
sourceMessageRange: [0, 0], // Not applicable for cross-session
|
|
128
|
+
estimatedTokens: result.condensedTokens,
|
|
129
|
+
};
|
|
130
|
+
await store.append(block);
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
// ── Private helpers ──────────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Parse the reflector's response into facts and condensed observations.
|
|
137
|
+
* Handles malformed responses gracefully.
|
|
138
|
+
*/
|
|
139
|
+
_parseReflectorResponse(response) {
|
|
140
|
+
let facts = [];
|
|
141
|
+
let condensed = '';
|
|
142
|
+
// Extract FACTS line
|
|
143
|
+
const factsMatch = response.match(/FACTS:\s*(\[[\s\S]*?\])\s*(?:\n|CONDENSED:|$)/);
|
|
144
|
+
if (factsMatch?.[1]) {
|
|
145
|
+
try {
|
|
146
|
+
const parsed = JSON.parse(factsMatch[1]);
|
|
147
|
+
if (Array.isArray(parsed)) {
|
|
148
|
+
facts = parsed.filter((f) => typeof f === 'object' &&
|
|
149
|
+
f !== null &&
|
|
150
|
+
typeof f.summary === 'string' &&
|
|
151
|
+
f.summary.length > 0).map(f => ({
|
|
152
|
+
summary: f.summary,
|
|
153
|
+
type: typeof f.type === 'string' ? f.type : 'knowledge',
|
|
154
|
+
tags: Array.isArray(f.tags) ? f.tags.filter((t) => typeof t === 'string') : [],
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
log.debug('Failed to parse FACTS JSON from reflector response');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Extract CONDENSED section (everything after "CONDENSED:")
|
|
163
|
+
const condensedMatch = response.match(/CONDENSED:\s*([\s\S]*)/);
|
|
164
|
+
if (condensedMatch?.[1]) {
|
|
165
|
+
condensed = condensedMatch[1].trim();
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Fallback: if no CONDENSED marker, use the part after FACTS
|
|
169
|
+
// Use proper bracket matching to avoid cutting off inside JSON arrays
|
|
170
|
+
const factsMatch = response.match(/FACTS:\s*(\[[\s\S]*?\](?:\s*,\s*\[[\s\S]*?\])*)/);
|
|
171
|
+
if (factsMatch) {
|
|
172
|
+
const afterFacts = response.substring(factsMatch.index + factsMatch[0].length).trim();
|
|
173
|
+
if (afterFacts) {
|
|
174
|
+
condensed = afterFacts;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// No FACTS found at all, use entire response as condensed
|
|
179
|
+
condensed = response.trim();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return { facts, condensed };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=reflector-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflector-worker.js","sourceRoot":"","sources":["../../src/memory/reflector-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SalienceScorer — Ranks memory items by contextual relevance.
|
|
3
3
|
*
|
|
4
|
-
* Spec SS5.4 "Salience-Aware Retrieval":
|
|
5
|
-
* salience =
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Spec SS5.4 "Salience-Aware Retrieval" (updated):
|
|
5
|
+
* salience = bm25Score * recencyDecay * frequencyBoost * trustScore
|
|
6
|
+
*
|
|
7
|
+
* Multiplicative composition ensures all factors contribute.
|
|
8
|
+
* Half-life defaults to 14 days (configurable).
|
|
9
9
|
*/
|
|
10
10
|
import type { MemoryItem, SalienceScore, SourceType } from './memory-types.js';
|
|
11
11
|
export declare class SalienceScorer {
|
|
12
|
-
|
|
12
|
+
private readonly _halfLifeDays;
|
|
13
|
+
constructor(halfLifeDays?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Score an item using multiplicative composition.
|
|
16
|
+
* When a BM25 score is available (from MiniSearch), pass it as bm25Score.
|
|
17
|
+
* Falls back to keyword relevance score when bm25Score is not provided.
|
|
18
|
+
*/
|
|
19
|
+
scoreItem(item: MemoryItem, query: string, bm25Score?: number): SalienceScore;
|
|
13
20
|
rankItems(items: MemoryItem[], query: string, limit?: number): SalienceScore[];
|
|
14
21
|
recencyDecay(lastAccessed: string): number;
|
|
22
|
+
frequencyBoost(accessCount: number): number;
|
|
23
|
+
trustScore(sourceType: SourceType): number;
|
|
15
24
|
relevanceScore(query: string, item: MemoryItem): number;
|
|
25
|
+
/** @deprecated Use trustScore() instead */
|
|
16
26
|
sourceTrustBonus(sourceType: SourceType): number;
|
|
17
27
|
private _tokenize;
|
|
18
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salience-scorer.d.ts","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/E,qBAAa,cAAc;IACzB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"salience-scorer.d.ts","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/E,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,YAAY,GAAE,MAA+B;IAIzD;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa;IAkB7E,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAM9E,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAQ1C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK3C,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAc1C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM;IAgBvD,2CAA2C;IAC3C,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAIhD,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SalienceScorer — Ranks memory items by contextual relevance.
|
|
3
3
|
*
|
|
4
|
-
* Spec SS5.4 "Salience-Aware Retrieval":
|
|
5
|
-
* salience =
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Spec SS5.4 "Salience-Aware Retrieval" (updated):
|
|
5
|
+
* salience = bm25Score * recencyDecay * frequencyBoost * trustScore
|
|
6
|
+
*
|
|
7
|
+
* Multiplicative composition ensures all factors contribute.
|
|
8
|
+
* Half-life defaults to 14 days (configurable).
|
|
9
9
|
*/
|
|
10
|
-
const
|
|
10
|
+
const DEFAULT_HALF_LIFE_DAYS = 14;
|
|
11
11
|
const LN2 = Math.LN2;
|
|
12
12
|
export class SalienceScorer {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
_halfLifeDays;
|
|
14
|
+
constructor(halfLifeDays = DEFAULT_HALF_LIFE_DAYS) {
|
|
15
|
+
this._halfLifeDays = halfLifeDays;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Score an item using multiplicative composition.
|
|
19
|
+
* When a BM25 score is available (from MiniSearch), pass it as bm25Score.
|
|
20
|
+
* Falls back to keyword relevance score when bm25Score is not provided.
|
|
21
|
+
*/
|
|
22
|
+
scoreItem(item, query, bm25Score) {
|
|
15
23
|
const recencyDecay = this.recencyDecay(item.last_accessed);
|
|
16
|
-
const
|
|
17
|
-
const
|
|
24
|
+
const frequencyBoost = this.frequencyBoost(item.access_count);
|
|
25
|
+
const trustScore = this.trustScore(item.source_type);
|
|
26
|
+
const relevanceScore = bm25Score ?? this.relevanceScore(query, item);
|
|
18
27
|
return {
|
|
19
28
|
itemId: item.id,
|
|
20
|
-
score:
|
|
29
|
+
score: relevanceScore * recencyDecay * frequencyBoost * trustScore,
|
|
21
30
|
components: {
|
|
22
|
-
accessWeight,
|
|
31
|
+
accessWeight: frequencyBoost,
|
|
23
32
|
recencyDecay,
|
|
24
33
|
relevanceScore,
|
|
25
|
-
sourceTrustBonus,
|
|
34
|
+
sourceTrustBonus: trustScore,
|
|
26
35
|
},
|
|
27
36
|
};
|
|
28
37
|
}
|
|
@@ -36,7 +45,24 @@ export class SalienceScorer {
|
|
|
36
45
|
const accessed = new Date(lastAccessed).getTime();
|
|
37
46
|
const daysSince = Math.max(0, (now - accessed) / (1000 * 60 * 60 * 24));
|
|
38
47
|
// Exponential decay: e^(-ln(2) * days / halfLife)
|
|
39
|
-
return Math.exp((-LN2 * daysSince) /
|
|
48
|
+
return Math.exp((-LN2 * daysSince) / this._halfLifeDays);
|
|
49
|
+
}
|
|
50
|
+
frequencyBoost(accessCount) {
|
|
51
|
+
// Logarithmic: diminishing returns after ~10 accesses
|
|
52
|
+
return 1.0 + Math.log2(1 + accessCount) * 0.15;
|
|
53
|
+
}
|
|
54
|
+
trustScore(sourceType) {
|
|
55
|
+
switch (sourceType) {
|
|
56
|
+
case 'user_instruction':
|
|
57
|
+
return 1.0;
|
|
58
|
+
case 'agent_analysis':
|
|
59
|
+
return 0.7;
|
|
60
|
+
case 'tool_output':
|
|
61
|
+
return 0.3;
|
|
62
|
+
default:
|
|
63
|
+
// Fallback for unknown source types (should not happen with proper typing)
|
|
64
|
+
return 0.0;
|
|
65
|
+
}
|
|
40
66
|
}
|
|
41
67
|
relevanceScore(query, item) {
|
|
42
68
|
const queryWords = this._tokenize(query);
|
|
@@ -52,15 +78,9 @@ export class SalienceScorer {
|
|
|
52
78
|
}
|
|
53
79
|
return matchCount / queryWords.length; // normalize 0-1
|
|
54
80
|
}
|
|
81
|
+
/** @deprecated Use trustScore() instead */
|
|
55
82
|
sourceTrustBonus(sourceType) {
|
|
56
|
-
|
|
57
|
-
case 'user_instruction':
|
|
58
|
-
return 0.2;
|
|
59
|
-
case 'agent_analysis':
|
|
60
|
-
return 0.1;
|
|
61
|
-
case 'tool_output':
|
|
62
|
-
return 0.0;
|
|
63
|
-
}
|
|
83
|
+
return this.trustScore(sourceType);
|
|
64
84
|
}
|
|
65
85
|
_tokenize(text) {
|
|
66
86
|
return text
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,
|
|
1
|
+
{"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"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"}
|