@dmsdc-ai/aigentry-brain 0.0.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/bin/aigentry-brain-mcp.mjs +17 -0
- package/bin/aigentry-brain-setup.mjs +17 -0
- package/bin/aigentry-brain.mjs +17 -0
- package/dist/audit/AuditTrail.d.ts +15 -0
- package/dist/audit/AuditTrail.js +43 -0
- package/dist/audit/AuditTrail.js.map +1 -0
- package/dist/backend/GitBackend.d.ts +27 -0
- package/dist/backend/GitBackend.js +201 -0
- package/dist/backend/GitBackend.js.map +1 -0
- package/dist/backend/SyncBackend.d.ts +13 -0
- package/dist/backend/SyncBackend.js +2 -0
- package/dist/backend/SyncBackend.js.map +1 -0
- package/dist/cli/AutoUpdater.d.ts +7 -0
- package/dist/cli/AutoUpdater.js +275 -0
- package/dist/cli/AutoUpdater.js.map +1 -0
- package/dist/cli/ConfigStore.d.ts +17 -0
- package/dist/cli/ConfigStore.js +50 -0
- package/dist/cli/ConfigStore.js.map +1 -0
- package/dist/cli/GhIntegration.d.ts +55 -0
- package/dist/cli/GhIntegration.js +192 -0
- package/dist/cli/GhIntegration.js.map +1 -0
- package/dist/cli/Prerequisites.d.ts +48 -0
- package/dist/cli/Prerequisites.js +182 -0
- package/dist/cli/Prerequisites.js.map +1 -0
- package/dist/cli/SetupWizard.d.ts +26 -0
- package/dist/cli/SetupWizard.js +407 -0
- package/dist/cli/SetupWizard.js.map +1 -0
- package/dist/cli/braincli.d.ts +2 -0
- package/dist/cli/braincli.js +260 -0
- package/dist/cli/braincli.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.js +238 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/context/ConfidenceGuard.d.ts +11 -0
- package/dist/context/ConfidenceGuard.js +32 -0
- package/dist/context/ConfidenceGuard.js.map +1 -0
- package/dist/context/ContextBudgetPolicy.d.ts +21 -0
- package/dist/context/ContextBudgetPolicy.js +136 -0
- package/dist/context/ContextBudgetPolicy.js.map +1 -0
- package/dist/context/ContextPacker.d.ts +30 -0
- package/dist/context/ContextPacker.js +219 -0
- package/dist/context/ContextPacker.js.map +1 -0
- package/dist/context/ContextRestoreService.d.ts +39 -0
- package/dist/context/ContextRestoreService.js +134 -0
- package/dist/context/ContextRestoreService.js.map +1 -0
- package/dist/contract/BrainContract.d.ts +93 -0
- package/dist/contract/BrainContract.js +245 -0
- package/dist/contract/BrainContract.js.map +1 -0
- package/dist/core/ContentDedup.d.ts +43 -0
- package/dist/core/ContentDedup.js +145 -0
- package/dist/core/ContentDedup.js.map +1 -0
- package/dist/core/EntityGraph.d.ts +66 -0
- package/dist/core/EntityGraph.js +196 -0
- package/dist/core/EntityGraph.js.map +1 -0
- package/dist/core/EntrySchema.d.ts +46 -0
- package/dist/core/EntrySchema.js +4 -0
- package/dist/core/EntrySchema.js.map +1 -0
- package/dist/core/GraphStore.d.ts +16 -0
- package/dist/core/GraphStore.js +29 -0
- package/dist/core/GraphStore.js.map +1 -0
- package/dist/core/MemoryDecay.d.ts +49 -0
- package/dist/core/MemoryDecay.js +113 -0
- package/dist/core/MemoryDecay.js.map +1 -0
- package/dist/core/ProfileFormat.d.ts +38 -0
- package/dist/core/ProfileFormat.js +254 -0
- package/dist/core/ProfileFormat.js.map +1 -0
- package/dist/core/ProfileManager.d.ts +80 -0
- package/dist/core/ProfileManager.js +269 -0
- package/dist/core/ProfileManager.js.map +1 -0
- package/dist/core/SchemaMigration.d.ts +12 -0
- package/dist/core/SchemaMigration.js +34 -0
- package/dist/core/SchemaMigration.js.map +1 -0
- package/dist/crypto/AgeCrypto.d.ts +26 -0
- package/dist/crypto/AgeCrypto.js +101 -0
- package/dist/crypto/AgeCrypto.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/BrainMcpServer.d.ts +13 -0
- package/dist/mcp/BrainMcpServer.js +223 -0
- package/dist/mcp/BrainMcpServer.js.map +1 -0
- package/dist/mcp/cli.d.ts +2 -0
- package/dist/mcp/cli.js +107 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/metrics/ResumeMetrics.d.ts +20 -0
- package/dist/metrics/ResumeMetrics.js +46 -0
- package/dist/metrics/ResumeMetrics.js.map +1 -0
- package/dist/peers/PeerStore.d.ts +17 -0
- package/dist/peers/PeerStore.js +65 -0
- package/dist/peers/PeerStore.js.map +1 -0
- package/dist/policy/PolicyEngine.d.ts +16 -0
- package/dist/policy/PolicyEngine.js +70 -0
- package/dist/policy/PolicyEngine.js.map +1 -0
- package/dist/policy/PolicyEnvelope.d.ts +7 -0
- package/dist/policy/PolicyEnvelope.js +2 -0
- package/dist/policy/PolicyEnvelope.js.map +1 -0
- package/dist/policy/RetentionParser.d.ts +6 -0
- package/dist/policy/RetentionParser.js +48 -0
- package/dist/policy/RetentionParser.js.map +1 -0
- package/dist/shared/AtomicWrite.d.ts +1 -0
- package/dist/shared/AtomicWrite.js +11 -0
- package/dist/shared/AtomicWrite.js.map +1 -0
- package/dist/shared/Clock.d.ts +11 -0
- package/dist/shared/Clock.js +17 -0
- package/dist/shared/Clock.js.map +1 -0
- package/dist/shared/Config.d.ts +15 -0
- package/dist/shared/Config.js +67 -0
- package/dist/shared/Config.js.map +1 -0
- package/dist/shared/Encryption.d.ts +19 -0
- package/dist/shared/Encryption.js +47 -0
- package/dist/shared/Encryption.js.map +1 -0
- package/dist/shared/Logger.d.ts +12 -0
- package/dist/shared/Logger.js +40 -0
- package/dist/shared/Logger.js.map +1 -0
- package/dist/shared/Mutex.d.ts +7 -0
- package/dist/shared/Mutex.js +34 -0
- package/dist/shared/Mutex.js.map +1 -0
- package/dist/shared/SetupErrors.d.ts +31 -0
- package/dist/shared/SetupErrors.js +155 -0
- package/dist/shared/SetupErrors.js.map +1 -0
- package/dist/status/SyncStatusStore.d.ts +17 -0
- package/dist/status/SyncStatusStore.js +48 -0
- package/dist/status/SyncStatusStore.js.map +1 -0
- package/dist/sync/AutoCommitter.d.ts +17 -0
- package/dist/sync/AutoCommitter.js +68 -0
- package/dist/sync/AutoCommitter.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +7 -0
- package/dist/sync/ConflictResolver.js +56 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/PushPullManager.d.ts +23 -0
- package/dist/sync/PushPullManager.js +155 -0
- package/dist/sync/PushPullManager.js.map +1 -0
- package/dist/sync/SyncEngine.d.ts +43 -0
- package/dist/sync/SyncEngine.js +145 -0
- package/dist/sync/SyncEngine.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const INPUT_RATIO = 0.78;
|
|
2
|
+
const OUTPUT_RATIO = 0.22;
|
|
3
|
+
const OUTPUT_MIN = 900;
|
|
4
|
+
const INPUT_MIN = 512;
|
|
5
|
+
const MUST_KEEP_ABS_CAP = 2200;
|
|
6
|
+
const MUST_KEEP_RATIO_CAP = 0.18;
|
|
7
|
+
const RECALL_CONFIDENCE_THRESHOLD = 0.65;
|
|
8
|
+
const FIXED_MIN_RATIOS = {
|
|
9
|
+
systemPolicy: 0.08,
|
|
10
|
+
userRequest: 0.10,
|
|
11
|
+
mustKeep: 0.12,
|
|
12
|
+
};
|
|
13
|
+
const VARIABLE_RANGES = {
|
|
14
|
+
conversationSummary: { min: 0.08, max: 0.18 },
|
|
15
|
+
retrievalEvidence: { min: 0.20, max: 0.40 },
|
|
16
|
+
repackBuffer: { min: 0.10, max: 0.25 },
|
|
17
|
+
};
|
|
18
|
+
function clamp(value, min, max) {
|
|
19
|
+
return Math.max(min, Math.min(max, value));
|
|
20
|
+
}
|
|
21
|
+
function modeTargets(mode) {
|
|
22
|
+
if (mode === 'qa') {
|
|
23
|
+
return {
|
|
24
|
+
conversationSummary: 0.08,
|
|
25
|
+
retrievalEvidence: 0.40,
|
|
26
|
+
repackBuffer: 0.12,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (mode === 'coding') {
|
|
30
|
+
return {
|
|
31
|
+
conversationSummary: 0.10,
|
|
32
|
+
retrievalEvidence: 0.30,
|
|
33
|
+
repackBuffer: 0.20,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
conversationSummary: 0.18,
|
|
38
|
+
retrievalEvidence: 0.22,
|
|
39
|
+
repackBuffer: 0.20,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function ratioToTokens(total, ratio) {
|
|
43
|
+
return Math.max(0, Math.floor(total * ratio));
|
|
44
|
+
}
|
|
45
|
+
function adjustTargetsToBudget(inputBudget, targets) {
|
|
46
|
+
const adjusted = { ...targets };
|
|
47
|
+
let total = Object.values(adjusted).reduce((sum, value) => sum + value, 0);
|
|
48
|
+
if (total > inputBudget) {
|
|
49
|
+
const reductionOrder = [
|
|
50
|
+
'repackBuffer',
|
|
51
|
+
'retrievalEvidence',
|
|
52
|
+
'conversationSummary',
|
|
53
|
+
'mustKeep',
|
|
54
|
+
'userRequest',
|
|
55
|
+
'systemPolicy',
|
|
56
|
+
];
|
|
57
|
+
let overflow = total - inputBudget;
|
|
58
|
+
for (const key of reductionOrder) {
|
|
59
|
+
if (overflow <= 0)
|
|
60
|
+
break;
|
|
61
|
+
const reducible = Math.min(adjusted[key], overflow);
|
|
62
|
+
adjusted[key] -= reducible;
|
|
63
|
+
overflow -= reducible;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (total < inputBudget) {
|
|
67
|
+
adjusted.repackBuffer += (inputBudget - total);
|
|
68
|
+
}
|
|
69
|
+
total = Object.values(adjusted).reduce((sum, value) => sum + value, 0);
|
|
70
|
+
if (total !== inputBudget) {
|
|
71
|
+
adjusted.repackBuffer += (inputBudget - total);
|
|
72
|
+
}
|
|
73
|
+
return adjusted;
|
|
74
|
+
}
|
|
75
|
+
export function buildContextBudgetPlan(windowTokens, mode = 'coding') {
|
|
76
|
+
if (!Number.isFinite(windowTokens) || windowTokens <= 0) {
|
|
77
|
+
throw new Error('windowTokens must be a positive number');
|
|
78
|
+
}
|
|
79
|
+
const rawOutput = Math.max(Math.floor(windowTokens * OUTPUT_RATIO), OUTPUT_MIN);
|
|
80
|
+
const outputReserve = Math.min(rawOutput, Math.max(0, windowTokens - INPUT_MIN));
|
|
81
|
+
const inputBudget = Math.max(0, windowTokens - outputReserve);
|
|
82
|
+
const fixedMinTokens = {
|
|
83
|
+
systemPolicy: ratioToTokens(inputBudget, FIXED_MIN_RATIOS.systemPolicy),
|
|
84
|
+
userRequest: ratioToTokens(inputBudget, FIXED_MIN_RATIOS.userRequest),
|
|
85
|
+
mustKeep: ratioToTokens(inputBudget, FIXED_MIN_RATIOS.mustKeep),
|
|
86
|
+
};
|
|
87
|
+
const rawTargets = modeTargets(mode);
|
|
88
|
+
const variableTargetTokens = {
|
|
89
|
+
conversationSummary: ratioToTokens(inputBudget, clamp(rawTargets.conversationSummary, VARIABLE_RANGES.conversationSummary.min, VARIABLE_RANGES.conversationSummary.max)),
|
|
90
|
+
retrievalEvidence: ratioToTokens(inputBudget, clamp(rawTargets.retrievalEvidence, VARIABLE_RANGES.retrievalEvidence.min, VARIABLE_RANGES.retrievalEvidence.max)),
|
|
91
|
+
repackBuffer: ratioToTokens(inputBudget, clamp(rawTargets.repackBuffer, VARIABLE_RANGES.repackBuffer.min, VARIABLE_RANGES.repackBuffer.max)),
|
|
92
|
+
};
|
|
93
|
+
const adjustedTargets = adjustTargetsToBudget(inputBudget, {
|
|
94
|
+
systemPolicy: fixedMinTokens.systemPolicy,
|
|
95
|
+
userRequest: fixedMinTokens.userRequest,
|
|
96
|
+
mustKeep: fixedMinTokens.mustKeep,
|
|
97
|
+
conversationSummary: variableTargetTokens.conversationSummary,
|
|
98
|
+
retrievalEvidence: variableTargetTokens.retrievalEvidence,
|
|
99
|
+
repackBuffer: variableTargetTokens.repackBuffer,
|
|
100
|
+
});
|
|
101
|
+
const mustKeepCap = Math.min(MUST_KEEP_ABS_CAP, Math.floor(windowTokens * MUST_KEEP_RATIO_CAP));
|
|
102
|
+
return {
|
|
103
|
+
windowTokens,
|
|
104
|
+
inputBudget,
|
|
105
|
+
outputReserve,
|
|
106
|
+
mustKeepCap,
|
|
107
|
+
recallConfidenceThreshold: RECALL_CONFIDENCE_THRESHOLD,
|
|
108
|
+
slots: {
|
|
109
|
+
systemPolicy: {
|
|
110
|
+
minTokens: fixedMinTokens.systemPolicy,
|
|
111
|
+
targetTokens: adjustedTargets.systemPolicy,
|
|
112
|
+
},
|
|
113
|
+
userRequest: {
|
|
114
|
+
minTokens: fixedMinTokens.userRequest,
|
|
115
|
+
targetTokens: adjustedTargets.userRequest,
|
|
116
|
+
},
|
|
117
|
+
mustKeep: {
|
|
118
|
+
minTokens: fixedMinTokens.mustKeep,
|
|
119
|
+
targetTokens: adjustedTargets.mustKeep,
|
|
120
|
+
},
|
|
121
|
+
conversationSummary: {
|
|
122
|
+
minTokens: ratioToTokens(inputBudget, VARIABLE_RANGES.conversationSummary.min),
|
|
123
|
+
targetTokens: adjustedTargets.conversationSummary,
|
|
124
|
+
},
|
|
125
|
+
retrievalEvidence: {
|
|
126
|
+
minTokens: ratioToTokens(inputBudget, VARIABLE_RANGES.retrievalEvidence.min),
|
|
127
|
+
targetTokens: adjustedTargets.retrievalEvidence,
|
|
128
|
+
},
|
|
129
|
+
repackBuffer: {
|
|
130
|
+
minTokens: ratioToTokens(inputBudget, VARIABLE_RANGES.repackBuffer.min),
|
|
131
|
+
targetTokens: adjustedTargets.repackBuffer,
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ContextBudgetPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBudgetPolicy.js","sourceRoot":"","sources":["../../src/context/ContextBudgetPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ContextMode, ContextBudgetPlan } from './ContextBudgetPolicy.js';
|
|
2
|
+
export type ContextSlot = 'system_policy' | 'user_request' | 'must_keep' | 'conversation_summary' | 'retrieval_evidence';
|
|
3
|
+
export interface ContextBlock {
|
|
4
|
+
id: string;
|
|
5
|
+
slot: ContextSlot;
|
|
6
|
+
text: string;
|
|
7
|
+
tokens: number;
|
|
8
|
+
score?: number;
|
|
9
|
+
timestamp?: string;
|
|
10
|
+
duplicateKey?: string;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
compressed?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface PackContextInput {
|
|
15
|
+
windowTokens: number;
|
|
16
|
+
mode?: ContextMode;
|
|
17
|
+
blocks: ContextBlock[];
|
|
18
|
+
confidenceThreshold?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface PackedContextResult {
|
|
21
|
+
plan: ContextBudgetPlan;
|
|
22
|
+
selected: ContextBlock[];
|
|
23
|
+
dropped: ContextBlock[];
|
|
24
|
+
usedInputTokens: number;
|
|
25
|
+
slotUsage: Record<ContextSlot, number>;
|
|
26
|
+
overflowHandled: boolean;
|
|
27
|
+
recallConfidence: number;
|
|
28
|
+
shouldAskClarification: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare function packContext(input: PackContextInput): PackedContextResult;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { buildContextBudgetPlan } from './ContextBudgetPolicy.js';
|
|
2
|
+
import { evaluateRecallConfidence } from './ConfidenceGuard.js';
|
|
3
|
+
const SLOT_BUDGET_KEY = {
|
|
4
|
+
system_policy: 'systemPolicy',
|
|
5
|
+
user_request: 'userRequest',
|
|
6
|
+
must_keep: 'mustKeep',
|
|
7
|
+
conversation_summary: 'conversationSummary',
|
|
8
|
+
retrieval_evidence: 'retrievalEvidence',
|
|
9
|
+
};
|
|
10
|
+
function tokenSum(items) {
|
|
11
|
+
return items.reduce((sum, item) => sum + item.tokens, 0);
|
|
12
|
+
}
|
|
13
|
+
function parseTimestamp(value) {
|
|
14
|
+
if (!value)
|
|
15
|
+
return 0;
|
|
16
|
+
const parsed = Date.parse(value);
|
|
17
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
18
|
+
}
|
|
19
|
+
function scoreValue(block) {
|
|
20
|
+
return block.score ?? 0;
|
|
21
|
+
}
|
|
22
|
+
function byPriorityDesc(a, b) {
|
|
23
|
+
const reqA = a.required ? 1 : 0;
|
|
24
|
+
const reqB = b.required ? 1 : 0;
|
|
25
|
+
if (reqA !== reqB)
|
|
26
|
+
return reqB - reqA;
|
|
27
|
+
const scoreA = scoreValue(a);
|
|
28
|
+
const scoreB = scoreValue(b);
|
|
29
|
+
if (scoreA !== scoreB)
|
|
30
|
+
return scoreB - scoreA;
|
|
31
|
+
const tsA = parseTimestamp(a.timestamp);
|
|
32
|
+
const tsB = parseTimestamp(b.timestamp);
|
|
33
|
+
if (tsA !== tsB)
|
|
34
|
+
return tsB - tsA;
|
|
35
|
+
return a.id.localeCompare(b.id);
|
|
36
|
+
}
|
|
37
|
+
function cloneBlock(block) {
|
|
38
|
+
return { ...block };
|
|
39
|
+
}
|
|
40
|
+
function takeWithinBudget(sortedBlocks, budgetTokens) {
|
|
41
|
+
const selected = [];
|
|
42
|
+
const dropped = [];
|
|
43
|
+
let used = 0;
|
|
44
|
+
for (const block of sortedBlocks) {
|
|
45
|
+
const next = cloneBlock(block);
|
|
46
|
+
if (used + next.tokens <= budgetTokens || (next.required && selected.length === 0)) {
|
|
47
|
+
selected.push(next);
|
|
48
|
+
used += next.tokens;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
dropped.push(next);
|
|
52
|
+
}
|
|
53
|
+
return { selected, dropped };
|
|
54
|
+
}
|
|
55
|
+
function dropLowestScoreEvidence(selected, dropped) {
|
|
56
|
+
const evidence = selected
|
|
57
|
+
.filter(item => item.slot === 'retrieval_evidence' && !item.required)
|
|
58
|
+
.sort((a, b) => {
|
|
59
|
+
const scoreDiff = scoreValue(a) - scoreValue(b);
|
|
60
|
+
if (scoreDiff !== 0)
|
|
61
|
+
return scoreDiff;
|
|
62
|
+
return parseTimestamp(a.timestamp) - parseTimestamp(b.timestamp);
|
|
63
|
+
});
|
|
64
|
+
const target = evidence[0];
|
|
65
|
+
if (!target)
|
|
66
|
+
return false;
|
|
67
|
+
const idx = selected.findIndex(item => item.id === target.id);
|
|
68
|
+
if (idx === -1)
|
|
69
|
+
return false;
|
|
70
|
+
dropped.push(selected[idx]);
|
|
71
|
+
selected.splice(idx, 1);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
function dropOldestSummary(selected, dropped) {
|
|
75
|
+
const summaries = selected
|
|
76
|
+
.filter(item => item.slot === 'conversation_summary' && !item.required)
|
|
77
|
+
.sort((a, b) => parseTimestamp(a.timestamp) - parseTimestamp(b.timestamp));
|
|
78
|
+
const target = summaries[0];
|
|
79
|
+
if (!target)
|
|
80
|
+
return false;
|
|
81
|
+
const idx = selected.findIndex(item => item.id === target.id);
|
|
82
|
+
if (idx === -1)
|
|
83
|
+
return false;
|
|
84
|
+
dropped.push(selected[idx]);
|
|
85
|
+
selected.splice(idx, 1);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
function dropDuplicateMemory(selected, dropped) {
|
|
89
|
+
const byKey = new Map();
|
|
90
|
+
for (const item of selected) {
|
|
91
|
+
if (!item.duplicateKey)
|
|
92
|
+
continue;
|
|
93
|
+
const list = byKey.get(item.duplicateKey) ?? [];
|
|
94
|
+
list.push(item);
|
|
95
|
+
byKey.set(item.duplicateKey, list);
|
|
96
|
+
}
|
|
97
|
+
for (const items of byKey.values()) {
|
|
98
|
+
if (items.length <= 1)
|
|
99
|
+
continue;
|
|
100
|
+
const ranked = [...items].sort(byPriorityDesc);
|
|
101
|
+
const keep = ranked[0];
|
|
102
|
+
for (const candidate of ranked.slice(1)) {
|
|
103
|
+
if (candidate.required)
|
|
104
|
+
continue;
|
|
105
|
+
const idx = selected.findIndex(item => item.id === candidate.id);
|
|
106
|
+
if (idx !== -1 && selected[idx].id !== keep.id) {
|
|
107
|
+
dropped.push(selected[idx]);
|
|
108
|
+
selected.splice(idx, 1);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
function compressLowPriorityBlocks(selected, budget) {
|
|
116
|
+
let changed = false;
|
|
117
|
+
let used = tokenSum(selected);
|
|
118
|
+
if (used <= budget)
|
|
119
|
+
return false;
|
|
120
|
+
const compressCandidates = selected
|
|
121
|
+
.filter(item => !item.required && !item.compressed)
|
|
122
|
+
.sort((a, b) => {
|
|
123
|
+
const rankA = a.slot === 'retrieval_evidence' ? 0 : 1;
|
|
124
|
+
const rankB = b.slot === 'retrieval_evidence' ? 0 : 1;
|
|
125
|
+
if (rankA !== rankB)
|
|
126
|
+
return rankA - rankB;
|
|
127
|
+
return scoreValue(a) - scoreValue(b);
|
|
128
|
+
});
|
|
129
|
+
for (const block of compressCandidates) {
|
|
130
|
+
if (used <= budget)
|
|
131
|
+
break;
|
|
132
|
+
const compressedTokens = Math.max(8, Math.ceil(block.tokens * 0.65));
|
|
133
|
+
if (compressedTokens >= block.tokens)
|
|
134
|
+
continue;
|
|
135
|
+
used -= (block.tokens - compressedTokens);
|
|
136
|
+
block.tokens = compressedTokens;
|
|
137
|
+
block.compressed = true;
|
|
138
|
+
changed = true;
|
|
139
|
+
}
|
|
140
|
+
return changed;
|
|
141
|
+
}
|
|
142
|
+
function runOverflowChain(selected, dropped, inputBudget) {
|
|
143
|
+
let handled = false;
|
|
144
|
+
while (tokenSum(selected) > inputBudget) {
|
|
145
|
+
if (dropLowestScoreEvidence(selected, dropped)) {
|
|
146
|
+
handled = true;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (dropOldestSummary(selected, dropped)) {
|
|
150
|
+
handled = true;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (dropDuplicateMemory(selected, dropped)) {
|
|
154
|
+
handled = true;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (compressLowPriorityBlocks(selected, inputBudget)) {
|
|
158
|
+
handled = true;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
return handled;
|
|
164
|
+
}
|
|
165
|
+
export function packContext(input) {
|
|
166
|
+
const mode = input.mode ?? 'coding';
|
|
167
|
+
const plan = buildContextBudgetPlan(input.windowTokens, mode);
|
|
168
|
+
const slotBuckets = plan.slots;
|
|
169
|
+
const bySlot = {
|
|
170
|
+
system_policy: [],
|
|
171
|
+
user_request: [],
|
|
172
|
+
must_keep: [],
|
|
173
|
+
conversation_summary: [],
|
|
174
|
+
retrieval_evidence: [],
|
|
175
|
+
};
|
|
176
|
+
for (const block of input.blocks) {
|
|
177
|
+
if (block.tokens <= 0)
|
|
178
|
+
continue;
|
|
179
|
+
bySlot[block.slot].push(block);
|
|
180
|
+
}
|
|
181
|
+
let selected = [];
|
|
182
|
+
let dropped = [];
|
|
183
|
+
for (const slot of Object.keys(bySlot)) {
|
|
184
|
+
const sorted = [...bySlot[slot]].sort(byPriorityDesc);
|
|
185
|
+
const budgetKey = SLOT_BUDGET_KEY[slot];
|
|
186
|
+
let slotBudget = slotBuckets[budgetKey].targetTokens;
|
|
187
|
+
if (slot === 'must_keep') {
|
|
188
|
+
slotBudget = Math.min(slotBudget, plan.mustKeepCap);
|
|
189
|
+
}
|
|
190
|
+
const slotResult = takeWithinBudget(sorted, slotBudget);
|
|
191
|
+
selected = selected.concat(slotResult.selected);
|
|
192
|
+
dropped = dropped.concat(slotResult.dropped);
|
|
193
|
+
}
|
|
194
|
+
const overflowHandled = runOverflowChain(selected, dropped, plan.inputBudget);
|
|
195
|
+
const slotUsage = {
|
|
196
|
+
system_policy: 0,
|
|
197
|
+
user_request: 0,
|
|
198
|
+
must_keep: 0,
|
|
199
|
+
conversation_summary: 0,
|
|
200
|
+
retrieval_evidence: 0,
|
|
201
|
+
};
|
|
202
|
+
for (const block of selected) {
|
|
203
|
+
slotUsage[block.slot] += block.tokens;
|
|
204
|
+
}
|
|
205
|
+
const confidence = evaluateRecallConfidence(selected
|
|
206
|
+
.filter(item => item.slot === 'retrieval_evidence')
|
|
207
|
+
.map(item => ({ tokens: item.tokens, score: item.score })), input.confidenceThreshold ?? plan.recallConfidenceThreshold);
|
|
208
|
+
return {
|
|
209
|
+
plan,
|
|
210
|
+
selected,
|
|
211
|
+
dropped,
|
|
212
|
+
usedInputTokens: tokenSum(selected),
|
|
213
|
+
slotUsage,
|
|
214
|
+
overflowHandled,
|
|
215
|
+
recallConfidence: confidence.recallConfidence,
|
|
216
|
+
shouldAskClarification: confidence.shouldAskClarification,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=ContextPacker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextPacker.js","sourceRoot":"","sources":["../../src/context/ContextPacker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ProfileManager } from '../core/ProfileManager.js';
|
|
2
|
+
import type { Entry } from '../core/EntrySchema.js';
|
|
3
|
+
import type { ContextBlock, PackedContextResult } from './ContextPacker.js';
|
|
4
|
+
import type { ContextMode } from './ContextBudgetPolicy.js';
|
|
5
|
+
import type { ResumeResult } from '../metrics/ResumeMetrics.js';
|
|
6
|
+
import type { Clock } from '../shared/Clock.js';
|
|
7
|
+
export interface ContextResumeOptions {
|
|
8
|
+
windowTokens: number;
|
|
9
|
+
mode?: ContextMode;
|
|
10
|
+
confidenceThreshold?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ContextResumeResult {
|
|
13
|
+
packed: PackedContextResult;
|
|
14
|
+
resume: ResumeResult;
|
|
15
|
+
restoredEntries: Entry[];
|
|
16
|
+
}
|
|
17
|
+
/** Convert a memory Entry to a ContextBlock for the packer. */
|
|
18
|
+
export declare function entryToContextBlock(entry: Entry, nowMs: number): ContextBlock;
|
|
19
|
+
export declare class ContextRestoreService {
|
|
20
|
+
private profileManager;
|
|
21
|
+
private clock;
|
|
22
|
+
constructor(profileManager: ProfileManager, clock?: Clock);
|
|
23
|
+
/**
|
|
24
|
+
* Build the Structured Judgment Protocol block (~50 tokens).
|
|
25
|
+
* Guides the LLM on how to judge what memories to store via brain_append.
|
|
26
|
+
*/
|
|
27
|
+
private buildJudgmentProtocolBlock;
|
|
28
|
+
/**
|
|
29
|
+
* Build the Memory Context block — compact summary of protected entries.
|
|
30
|
+
* Enables LLM to perform dedup checks and upsert existing memories.
|
|
31
|
+
*/
|
|
32
|
+
private buildMemoryContextBlock;
|
|
33
|
+
/**
|
|
34
|
+
* Restore context from synced profile.
|
|
35
|
+
* Loads active entries, converts to ContextBlocks, packs within budget.
|
|
36
|
+
* Includes Layer 1 (Judgment Protocol) and Layer 2 (Memory Context).
|
|
37
|
+
*/
|
|
38
|
+
restore(options: ContextResumeOptions): Promise<ContextResumeResult>;
|
|
39
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { PROTECTED_CATEGORIES } from '../core/ProfileManager.js';
|
|
2
|
+
import { packContext } from './ContextPacker.js';
|
|
3
|
+
import { startResumeTimer } from '../metrics/ResumeMetrics.js';
|
|
4
|
+
import { SystemClock } from '../shared/Clock.js';
|
|
5
|
+
/** Category → ContextSlot mapping */
|
|
6
|
+
const CATEGORY_SLOT_MAP = {
|
|
7
|
+
preference: 'must_keep',
|
|
8
|
+
constraint: 'must_keep',
|
|
9
|
+
identity: 'must_keep',
|
|
10
|
+
skill: 'must_keep',
|
|
11
|
+
habit: 'must_keep',
|
|
12
|
+
summary: 'conversation_summary',
|
|
13
|
+
decision: 'conversation_summary',
|
|
14
|
+
context: 'retrieval_evidence',
|
|
15
|
+
observation: 'retrieval_evidence',
|
|
16
|
+
fact: 'retrieval_evidence',
|
|
17
|
+
};
|
|
18
|
+
const DEFAULT_SLOT = 'retrieval_evidence';
|
|
19
|
+
/** Rough token estimate: ~4 chars per token (conservative). */
|
|
20
|
+
function estimateTokens(text) {
|
|
21
|
+
return Math.max(1, Math.ceil(text.length / 4));
|
|
22
|
+
}
|
|
23
|
+
/** Score an entry based on confidence + recency. */
|
|
24
|
+
function scoreEntry(entry, nowMs) {
|
|
25
|
+
const base = entry.confidence ?? 0.5;
|
|
26
|
+
const updatedMs = new Date(entry.updated).getTime();
|
|
27
|
+
const ageMs = Math.max(0, nowMs - updatedMs);
|
|
28
|
+
const oneDay = 86_400_000;
|
|
29
|
+
// Recency boost: decays over 30 days (max +0.2 for very recent)
|
|
30
|
+
const recencyBoost = 0.2 * Math.max(0, 1 - ageMs / (30 * oneDay));
|
|
31
|
+
return Math.min(1, base + recencyBoost);
|
|
32
|
+
}
|
|
33
|
+
/** Convert a memory Entry to a ContextBlock for the packer. */
|
|
34
|
+
export function entryToContextBlock(entry, nowMs) {
|
|
35
|
+
const slot = CATEGORY_SLOT_MAP[entry.category] ?? DEFAULT_SLOT;
|
|
36
|
+
const text = `[${entry.category}] ${entry.content}`;
|
|
37
|
+
return {
|
|
38
|
+
id: entry.id,
|
|
39
|
+
slot,
|
|
40
|
+
text,
|
|
41
|
+
tokens: estimateTokens(text),
|
|
42
|
+
score: scoreEntry(entry, nowMs),
|
|
43
|
+
timestamp: entry.updated,
|
|
44
|
+
required: slot === 'must_keep',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export class ContextRestoreService {
|
|
48
|
+
profileManager;
|
|
49
|
+
clock;
|
|
50
|
+
constructor(profileManager, clock) {
|
|
51
|
+
this.profileManager = profileManager;
|
|
52
|
+
this.clock = clock ?? SystemClock;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build the Structured Judgment Protocol block (~50 tokens).
|
|
56
|
+
* Guides the LLM on how to judge what memories to store via brain_append.
|
|
57
|
+
*/
|
|
58
|
+
buildJudgmentProtocolBlock() {
|
|
59
|
+
const text = [
|
|
60
|
+
'[Memory Guide]',
|
|
61
|
+
'Before storing via brain_append:',
|
|
62
|
+
'1. Useful next session? (temporal) 2. Useful on other devices? (cross-device)',
|
|
63
|
+
'3. Similar memory below? → upsert existing id (dedup) 4. Pick category:',
|
|
64
|
+
'Protected (permanent): preference|identity|skill|habit',
|
|
65
|
+
'Prunable: context|observation|fact',
|
|
66
|
+
'5. Confidence: user_stated=0.9 repeated=0.7 inferred=0.5 uncertain=0.3',
|
|
67
|
+
].join('\n');
|
|
68
|
+
return {
|
|
69
|
+
id: '__judgment_protocol__',
|
|
70
|
+
slot: 'system_policy',
|
|
71
|
+
text,
|
|
72
|
+
tokens: estimateTokens(text),
|
|
73
|
+
score: 1.0,
|
|
74
|
+
required: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Build the Memory Context block — compact summary of protected entries.
|
|
79
|
+
* Enables LLM to perform dedup checks and upsert existing memories.
|
|
80
|
+
*/
|
|
81
|
+
buildMemoryContextBlock(entries) {
|
|
82
|
+
const protectedEntries = entries.filter(e => PROTECTED_CATEGORIES.has(e.category));
|
|
83
|
+
if (protectedEntries.length === 0)
|
|
84
|
+
return null;
|
|
85
|
+
const lines = ['[Existing Memories]'];
|
|
86
|
+
for (const e of protectedEntries) {
|
|
87
|
+
const content = e.content.length > 50 ? e.content.slice(0, 47) + '...' : e.content;
|
|
88
|
+
lines.push(`- ${e.id} | ${e.category} | ${content}`);
|
|
89
|
+
}
|
|
90
|
+
const text = lines.join('\n');
|
|
91
|
+
return {
|
|
92
|
+
id: '__memory_context__',
|
|
93
|
+
slot: 'must_keep',
|
|
94
|
+
text,
|
|
95
|
+
tokens: estimateTokens(text),
|
|
96
|
+
score: 1.0,
|
|
97
|
+
required: true,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Restore context from synced profile.
|
|
102
|
+
* Loads active entries, converts to ContextBlocks, packs within budget.
|
|
103
|
+
* Includes Layer 1 (Judgment Protocol) and Layer 2 (Memory Context).
|
|
104
|
+
*/
|
|
105
|
+
async restore(options) {
|
|
106
|
+
const timer = startResumeTimer();
|
|
107
|
+
// Load active (non-deleted) entries
|
|
108
|
+
const entries = await this.profileManager.getAll();
|
|
109
|
+
const nowMs = this.clock.now().getTime();
|
|
110
|
+
// Convert entries to context blocks
|
|
111
|
+
const blocks = [];
|
|
112
|
+
// Layer 1: Structured Judgment Protocol
|
|
113
|
+
blocks.push(this.buildJudgmentProtocolBlock());
|
|
114
|
+
// Layer 2: Memory Context (protected entries summary for LLM dedup)
|
|
115
|
+
const memoryCtx = this.buildMemoryContextBlock(entries);
|
|
116
|
+
if (memoryCtx)
|
|
117
|
+
blocks.push(memoryCtx);
|
|
118
|
+
// Entry-based blocks
|
|
119
|
+
blocks.push(...entries.map(e => entryToContextBlock(e, nowMs)));
|
|
120
|
+
// Pack within budget
|
|
121
|
+
const packed = packContext({
|
|
122
|
+
windowTokens: options.windowTokens,
|
|
123
|
+
mode: options.mode ?? 'coding',
|
|
124
|
+
blocks,
|
|
125
|
+
confidenceThreshold: options.confidenceThreshold,
|
|
126
|
+
});
|
|
127
|
+
// Measure resume quality: compare all entries vs actually packed entries
|
|
128
|
+
const selectedIds = new Set(packed.selected.map(b => b.id));
|
|
129
|
+
const actualEntries = entries.filter(e => selectedIds.has(e.id));
|
|
130
|
+
const resume = timer.stop(entries, actualEntries);
|
|
131
|
+
return { packed, resume, restoredEntries: entries };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ContextRestoreService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextRestoreService.js","sourceRoot":"","sources":["../../src/context/ContextRestoreService.ts"],"names":[],"mappings":"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"}
|