@blockrun/clawrouter 0.12.95 → 0.12.96
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/auth.d.ts +82 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +388 -0
- package/dist/auth.js.map +1 -0
- package/dist/balance.d.ts +97 -0
- package/dist/balance.d.ts.map +1 -0
- package/dist/balance.js +157 -0
- package/dist/balance.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +256 -54994
- package/dist/cli.js.map +1 -1
- package/dist/compression/codebook.d.ts +24 -0
- package/dist/compression/codebook.d.ts.map +1 -0
- package/dist/compression/codebook.js +119 -0
- package/dist/compression/codebook.js.map +1 -0
- package/dist/compression/index.d.ts +33 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +246 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/compression/layers/deduplication.d.ts +28 -0
- package/dist/compression/layers/deduplication.d.ts.map +1 -0
- package/dist/compression/layers/deduplication.js +101 -0
- package/dist/compression/layers/deduplication.js.map +1 -0
- package/dist/compression/layers/dictionary.d.ts +21 -0
- package/dist/compression/layers/dictionary.d.ts.map +1 -0
- package/dist/compression/layers/dictionary.js +73 -0
- package/dist/compression/layers/dictionary.js.map +1 -0
- package/dist/compression/layers/dynamic-codebook.d.ts +26 -0
- package/dist/compression/layers/dynamic-codebook.d.ts.map +1 -0
- package/dist/compression/layers/dynamic-codebook.js +149 -0
- package/dist/compression/layers/dynamic-codebook.js.map +1 -0
- package/dist/compression/layers/json-compact.d.ts +23 -0
- package/dist/compression/layers/json-compact.d.ts.map +1 -0
- package/dist/compression/layers/json-compact.js +79 -0
- package/dist/compression/layers/json-compact.js.map +1 -0
- package/dist/compression/layers/observation.d.ts +21 -0
- package/dist/compression/layers/observation.d.ts.map +1 -0
- package/dist/compression/layers/observation.js +130 -0
- package/dist/compression/layers/observation.js.map +1 -0
- package/dist/compression/layers/paths.d.ts +24 -0
- package/dist/compression/layers/paths.d.ts.map +1 -0
- package/dist/compression/layers/paths.js +110 -0
- package/dist/compression/layers/paths.js.map +1 -0
- package/dist/compression/layers/whitespace.d.ts +27 -0
- package/dist/compression/layers/whitespace.d.ts.map +1 -0
- package/dist/compression/layers/whitespace.js +60 -0
- package/dist/compression/layers/whitespace.js.map +1 -0
- package/dist/compression/types.d.ts +84 -0
- package/dist/compression/types.d.ts.map +1 -0
- package/dist/compression/types.js +27 -0
- package/dist/compression/types.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/dedup.d.ts +34 -0
- package/dist/dedup.d.ts.map +1 -0
- package/dist/dedup.js +150 -0
- package/dist/dedup.js.map +1 -0
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +375 -0
- package/dist/doctor.js.map +1 -0
- package/dist/error-classification.test.d.ts +2 -0
- package/dist/error-classification.test.d.ts.map +1 -0
- package/dist/error-classification.test.js +59 -0
- package/dist/error-classification.test.js.map +1 -0
- package/dist/errors.d.ts +54 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +85 -0
- package/dist/errors.js.map +1 -0
- package/dist/exclude-models.d.ts +28 -0
- package/dist/exclude-models.d.ts.map +1 -0
- package/dist/exclude-models.integration.test.d.ts +2 -0
- package/dist/exclude-models.integration.test.d.ts.map +1 -0
- package/dist/exclude-models.integration.test.js +46 -0
- package/dist/exclude-models.integration.test.js.map +1 -0
- package/dist/exclude-models.js +70 -0
- package/dist/exclude-models.js.map +1 -0
- package/dist/exclude-models.test.d.ts +5 -0
- package/dist/exclude-models.test.d.ts.map +1 -0
- package/dist/exclude-models.test.js +95 -0
- package/dist/exclude-models.test.js.map +1 -0
- package/dist/fs-read.d.ts +11 -0
- package/dist/fs-read.d.ts.map +1 -0
- package/dist/fs-read.js +47 -0
- package/dist/fs-read.js.map +1 -0
- package/dist/index.d.ts +34 -1368
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1071 -56194
- package/dist/index.js.map +1 -1
- package/dist/journal.d.ts +67 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +184 -0
- package/dist/journal.js.map +1 -0
- package/dist/journal.test.d.ts +2 -0
- package/dist/journal.test.d.ts.map +1 -0
- package/dist/journal.test.js +201 -0
- package/dist/journal.test.js.map +1 -0
- package/dist/logger.d.ts +33 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +35 -0
- package/dist/logger.js.map +1 -0
- package/dist/models.d.ts +107 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +941 -0
- package/dist/models.js.map +1 -0
- package/dist/models.test.d.ts +2 -0
- package/dist/models.test.d.ts.map +1 -0
- package/dist/models.test.js +38 -0
- package/dist/models.test.js.map +1 -0
- package/dist/partners/index.d.ts +8 -0
- package/dist/partners/index.d.ts.map +1 -0
- package/dist/partners/index.js +6 -0
- package/dist/partners/index.js.map +1 -0
- package/dist/partners/registry.d.ts +51 -0
- package/dist/partners/registry.d.ts.map +1 -0
- package/dist/partners/registry.js +256 -0
- package/dist/partners/registry.js.map +1 -0
- package/dist/partners/tools.d.ts +24 -0
- package/dist/partners/tools.d.ts.map +1 -0
- package/dist/partners/tools.js +97 -0
- package/dist/partners/tools.js.map +1 -0
- package/dist/payment-preauth.d.ts +17 -0
- package/dist/payment-preauth.d.ts.map +1 -0
- package/dist/payment-preauth.js +102 -0
- package/dist/payment-preauth.js.map +1 -0
- package/dist/provider.d.ts +19 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +45 -0
- package/dist/provider.js.map +1 -0
- package/dist/proxy.d.ts +210 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.debrand.test.d.ts +2 -0
- package/dist/proxy.debrand.test.d.ts.map +1 -0
- package/dist/proxy.debrand.test.js +101 -0
- package/dist/proxy.debrand.test.js.map +1 -0
- package/dist/proxy.degraded-response.test.d.ts +2 -0
- package/dist/proxy.degraded-response.test.d.ts.map +1 -0
- package/dist/proxy.degraded-response.test.js +105 -0
- package/dist/proxy.degraded-response.test.js.map +1 -0
- package/dist/proxy.image-download.test.d.ts +2 -0
- package/dist/proxy.image-download.test.d.ts.map +1 -0
- package/dist/proxy.image-download.test.js +92 -0
- package/dist/proxy.image-download.test.js.map +1 -0
- package/dist/proxy.js +3810 -0
- package/dist/proxy.js.map +1 -0
- package/dist/proxy.models-endpoint.test.d.ts +2 -0
- package/dist/proxy.models-endpoint.test.d.ts.map +1 -0
- package/dist/proxy.models-endpoint.test.js +19 -0
- package/dist/proxy.models-endpoint.test.js.map +1 -0
- package/dist/proxy.multiturn-thinking.test.d.ts +2 -0
- package/dist/proxy.multiturn-thinking.test.d.ts.map +1 -0
- package/dist/proxy.multiturn-thinking.test.js +82 -0
- package/dist/proxy.multiturn-thinking.test.js.map +1 -0
- package/dist/proxy.payment-chain-reuse.test.d.ts +2 -0
- package/dist/proxy.payment-chain-reuse.test.d.ts.map +1 -0
- package/dist/proxy.payment-chain-reuse.test.js +30 -0
- package/dist/proxy.payment-chain-reuse.test.js.map +1 -0
- package/dist/proxy.solana-resilience.test.d.ts +12 -0
- package/dist/proxy.solana-resilience.test.d.ts.map +1 -0
- package/dist/proxy.solana-resilience.test.js +39 -0
- package/dist/proxy.solana-resilience.test.js.map +1 -0
- package/dist/report.d.ts +6 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +44 -0
- package/dist/report.js.map +1 -0
- package/dist/response-cache.advanced.test.d.ts +2 -0
- package/dist/response-cache.advanced.test.d.ts.map +1 -0
- package/dist/response-cache.advanced.test.js +566 -0
- package/dist/response-cache.advanced.test.js.map +1 -0
- package/dist/response-cache.d.ts +85 -0
- package/dist/response-cache.d.ts.map +1 -0
- package/dist/response-cache.edge-cases.test.d.ts +2 -0
- package/dist/response-cache.edge-cases.test.d.ts.map +1 -0
- package/dist/response-cache.edge-cases.test.js +488 -0
- package/dist/response-cache.edge-cases.test.js.map +1 -0
- package/dist/response-cache.extreme.test.d.ts +2 -0
- package/dist/response-cache.extreme.test.d.ts.map +1 -0
- package/dist/response-cache.extreme.test.js +561 -0
- package/dist/response-cache.extreme.test.js.map +1 -0
- package/dist/response-cache.js +240 -0
- package/dist/response-cache.js.map +1 -0
- package/dist/response-cache.test.d.ts +2 -0
- package/dist/response-cache.test.d.ts.map +1 -0
- package/dist/response-cache.test.js +242 -0
- package/dist/response-cache.test.js.map +1 -0
- package/dist/retry.d.ts +42 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +99 -0
- package/dist/retry.js.map +1 -0
- package/dist/router/config.d.ts +11 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +1215 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/index.d.ts +18 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +19 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/llm-classifier.d.ts +29 -0
- package/dist/router/llm-classifier.d.ts.map +1 -0
- package/dist/router/llm-classifier.js +99 -0
- package/dist/router/llm-classifier.js.map +1 -0
- package/dist/router/rules.d.ts +12 -0
- package/dist/router/rules.d.ts.map +1 -0
- package/dist/router/rules.js +202 -0
- package/dist/router/rules.js.map +1 -0
- package/dist/router/selector.d.ts +58 -0
- package/dist/router/selector.d.ts.map +1 -0
- package/dist/router/selector.js +165 -0
- package/dist/router/selector.js.map +1 -0
- package/dist/router/selector.test.d.ts +2 -0
- package/dist/router/selector.test.d.ts.map +1 -0
- package/dist/router/selector.test.js +67 -0
- package/dist/router/selector.test.js.map +1 -0
- package/dist/router/strategy.d.ts +19 -0
- package/dist/router/strategy.d.ts.map +1 -0
- package/dist/router/strategy.js +138 -0
- package/dist/router/strategy.js.map +1 -0
- package/dist/router/strategy.test.d.ts +2 -0
- package/dist/router/strategy.test.d.ts.map +1 -0
- package/dist/router/strategy.test.js +131 -0
- package/dist/router/strategy.test.js.map +1 -0
- package/dist/router/types.d.ts +127 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +11 -0
- package/dist/router/types.js.map +1 -0
- package/dist/session.d.ts +124 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +256 -0
- package/dist/session.js.map +1 -0
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +163 -0
- package/dist/session.test.js.map +1 -0
- package/dist/solana-balance.d.ts +48 -0
- package/dist/solana-balance.d.ts.map +1 -0
- package/dist/solana-balance.js +142 -0
- package/dist/solana-balance.js.map +1 -0
- package/dist/spend-control.d.ts +112 -0
- package/dist/spend-control.d.ts.map +1 -0
- package/dist/spend-control.js +278 -0
- package/dist/spend-control.js.map +1 -0
- package/dist/spend-control.test.d.ts +5 -0
- package/dist/spend-control.test.d.ts.map +1 -0
- package/dist/spend-control.test.js +210 -0
- package/dist/spend-control.test.js.map +1 -0
- package/dist/stats.d.ts +64 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +295 -0
- package/dist/stats.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/update-hint.test.d.ts +9 -0
- package/dist/update-hint.test.d.ts.map +1 -0
- package/dist/update-hint.test.js +156 -0
- package/dist/update-hint.test.js.map +1 -0
- package/dist/updater.d.ts +10 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +55 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/dist/wallet.d.ts +52 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +93 -0
- package/dist/wallet.js.map +1 -0
- package/dist/wallet.test.d.ts +6 -0
- package/dist/wallet.test.d.ts.map +1 -0
- package/dist/wallet.test.js +117 -0
- package/dist/wallet.test.js.map +1 -0
- package/dist/x402-sdk.test.d.ts +6 -0
- package/dist/x402-sdk.test.d.ts.map +1 -0
- package/dist/x402-sdk.test.js +161 -0
- package/dist/x402-sdk.test.js.map +1 -0
- package/package.json +1 -1
- package/scripts/e2e-multiturn.mjs +4 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Journal - Memory layer for ClawRouter
|
|
3
|
+
*
|
|
4
|
+
* Maintains a compact record of key actions per session, enabling agents
|
|
5
|
+
* to recall earlier work even when OpenClaw's sessions_history is truncated.
|
|
6
|
+
*
|
|
7
|
+
* How it works:
|
|
8
|
+
* 1. As LLM responses flow through, extracts key actions ("I created X", "I fixed Y")
|
|
9
|
+
* 2. Stores them in a compact journal per session
|
|
10
|
+
* 3. When a request mentions past work ("what did you do today?"), injects the journal
|
|
11
|
+
*/
|
|
12
|
+
export interface JournalEntry {
|
|
13
|
+
timestamp: number;
|
|
14
|
+
action: string;
|
|
15
|
+
model?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SessionJournalConfig {
|
|
18
|
+
/** Maximum entries per session (default: 100) */
|
|
19
|
+
maxEntries?: number;
|
|
20
|
+
/** Maximum age of entries in ms (default: 24 hours) */
|
|
21
|
+
maxAgeMs?: number;
|
|
22
|
+
/** Maximum events to extract per response (default: 5) */
|
|
23
|
+
maxEventsPerResponse?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class SessionJournal {
|
|
26
|
+
private journals;
|
|
27
|
+
private config;
|
|
28
|
+
constructor(config?: SessionJournalConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Extract key events from assistant response content.
|
|
31
|
+
* Looks for patterns like "I created...", "I fixed...", "Successfully..."
|
|
32
|
+
*/
|
|
33
|
+
extractEvents(content: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Record events to the session journal.
|
|
36
|
+
*/
|
|
37
|
+
record(sessionId: string, events: string[], model?: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Check if the user message indicates a need for historical context.
|
|
40
|
+
*/
|
|
41
|
+
needsContext(lastUserMessage: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Format the journal for injection into system message.
|
|
44
|
+
* Returns null if journal is empty.
|
|
45
|
+
*/
|
|
46
|
+
format(sessionId: string): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Get the raw journal entries for a session (for debugging/testing).
|
|
49
|
+
*/
|
|
50
|
+
getEntries(sessionId: string): JournalEntry[];
|
|
51
|
+
/**
|
|
52
|
+
* Clear journal for a specific session.
|
|
53
|
+
*/
|
|
54
|
+
clear(sessionId: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Clear all journals.
|
|
57
|
+
*/
|
|
58
|
+
clearAll(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Get stats about the journal.
|
|
61
|
+
*/
|
|
62
|
+
getStats(): {
|
|
63
|
+
sessions: number;
|
|
64
|
+
totalEntries: number;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAQD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,MAAM,CAAiC;gBAEnC,MAAM,CAAC,EAAE,oBAAoB;IAIzC;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IA2DxC;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBjE;;OAEG;IACH,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAqC9C;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkBxC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAI7C;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,QAAQ,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;CAUvD"}
|
package/dist/journal.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Journal - Memory layer for ClawRouter
|
|
3
|
+
*
|
|
4
|
+
* Maintains a compact record of key actions per session, enabling agents
|
|
5
|
+
* to recall earlier work even when OpenClaw's sessions_history is truncated.
|
|
6
|
+
*
|
|
7
|
+
* How it works:
|
|
8
|
+
* 1. As LLM responses flow through, extracts key actions ("I created X", "I fixed Y")
|
|
9
|
+
* 2. Stores them in a compact journal per session
|
|
10
|
+
* 3. When a request mentions past work ("what did you do today?"), injects the journal
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
maxEntries: 100,
|
|
14
|
+
maxAgeMs: 24 * 60 * 60 * 1000, // 24 hours
|
|
15
|
+
maxEventsPerResponse: 5,
|
|
16
|
+
};
|
|
17
|
+
export class SessionJournal {
|
|
18
|
+
journals = new Map();
|
|
19
|
+
config;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract key events from assistant response content.
|
|
25
|
+
* Looks for patterns like "I created...", "I fixed...", "Successfully..."
|
|
26
|
+
*/
|
|
27
|
+
extractEvents(content) {
|
|
28
|
+
if (!content || typeof content !== "string") {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const events = [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
// Patterns for identifying key actions
|
|
34
|
+
// Note: Patterns allow optional words like "also", "then", "have" between "I" and verb
|
|
35
|
+
const patterns = [
|
|
36
|
+
// Creation patterns
|
|
37
|
+
/I (?:also |then |have |)?(?:created|implemented|added|wrote|built|generated|set up|initialized) ([^.!?\n]{10,150})/gi,
|
|
38
|
+
// Fix patterns
|
|
39
|
+
/I (?:also |then |have |)?(?:fixed|resolved|solved|patched|corrected|addressed|debugged) ([^.!?\n]{10,150})/gi,
|
|
40
|
+
// Completion patterns
|
|
41
|
+
/I (?:also |then |have |)?(?:completed|finished|done with|wrapped up) ([^.!?\n]{10,150})/gi,
|
|
42
|
+
// Update patterns
|
|
43
|
+
/I (?:also |then |have |)?(?:updated|modified|changed|refactored|improved|enhanced|optimized) ([^.!?\n]{10,150})/gi,
|
|
44
|
+
// Success patterns
|
|
45
|
+
/Successfully ([^.!?\n]{10,150})/gi,
|
|
46
|
+
// Tool usage patterns (when agent uses tools)
|
|
47
|
+
/I (?:also |then |have |)?(?:ran|executed|called|invoked) ([^.!?\n]{10,100})/gi,
|
|
48
|
+
];
|
|
49
|
+
for (const pattern of patterns) {
|
|
50
|
+
// Reset pattern lastIndex for each iteration
|
|
51
|
+
pattern.lastIndex = 0;
|
|
52
|
+
let match;
|
|
53
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
54
|
+
const action = match[0].trim();
|
|
55
|
+
// Skip if already seen (dedup)
|
|
56
|
+
const normalized = action.toLowerCase();
|
|
57
|
+
if (seen.has(normalized)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Validate length (not too short or too long)
|
|
61
|
+
if (action.length >= 15 && action.length <= 200) {
|
|
62
|
+
events.push(action);
|
|
63
|
+
seen.add(normalized);
|
|
64
|
+
}
|
|
65
|
+
// Stop if we have enough events
|
|
66
|
+
if (events.length >= this.config.maxEventsPerResponse) {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (events.length >= this.config.maxEventsPerResponse) {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return events;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Record events to the session journal.
|
|
78
|
+
*/
|
|
79
|
+
record(sessionId, events, model) {
|
|
80
|
+
if (!sessionId || !events.length) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const journal = this.journals.get(sessionId) || [];
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
for (const action of events) {
|
|
86
|
+
journal.push({
|
|
87
|
+
timestamp: now,
|
|
88
|
+
action,
|
|
89
|
+
model,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Trim old entries and enforce max count
|
|
93
|
+
const cutoff = now - this.config.maxAgeMs;
|
|
94
|
+
const trimmed = journal.filter((e) => e.timestamp > cutoff).slice(-this.config.maxEntries);
|
|
95
|
+
this.journals.set(sessionId, trimmed);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if the user message indicates a need for historical context.
|
|
99
|
+
*/
|
|
100
|
+
needsContext(lastUserMessage) {
|
|
101
|
+
if (!lastUserMessage || typeof lastUserMessage !== "string") {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const lower = lastUserMessage.toLowerCase();
|
|
105
|
+
// Trigger phrases that indicate user wants to recall past work
|
|
106
|
+
const triggers = [
|
|
107
|
+
// Direct questions about past work
|
|
108
|
+
"what did you do",
|
|
109
|
+
"what have you done",
|
|
110
|
+
"what did we do",
|
|
111
|
+
"what have we done",
|
|
112
|
+
// Temporal references
|
|
113
|
+
"earlier",
|
|
114
|
+
"before",
|
|
115
|
+
"previously",
|
|
116
|
+
"this session",
|
|
117
|
+
"today",
|
|
118
|
+
"so far",
|
|
119
|
+
// Summary requests
|
|
120
|
+
"remind me",
|
|
121
|
+
"summarize",
|
|
122
|
+
"summary of",
|
|
123
|
+
"recap",
|
|
124
|
+
// Progress inquiries
|
|
125
|
+
"your work",
|
|
126
|
+
"your progress",
|
|
127
|
+
"accomplished",
|
|
128
|
+
"achievements",
|
|
129
|
+
"completed tasks",
|
|
130
|
+
];
|
|
131
|
+
return triggers.some((t) => lower.includes(t));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Format the journal for injection into system message.
|
|
135
|
+
* Returns null if journal is empty.
|
|
136
|
+
*/
|
|
137
|
+
format(sessionId) {
|
|
138
|
+
const journal = this.journals.get(sessionId);
|
|
139
|
+
if (!journal?.length) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const lines = journal.map((e) => {
|
|
143
|
+
const time = new Date(e.timestamp).toLocaleTimeString("en-US", {
|
|
144
|
+
hour: "2-digit",
|
|
145
|
+
minute: "2-digit",
|
|
146
|
+
hour12: true,
|
|
147
|
+
});
|
|
148
|
+
return `- ${time}: ${e.action}`;
|
|
149
|
+
});
|
|
150
|
+
return `[Session Memory - Key Actions]\n${lines.join("\n")}`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the raw journal entries for a session (for debugging/testing).
|
|
154
|
+
*/
|
|
155
|
+
getEntries(sessionId) {
|
|
156
|
+
return this.journals.get(sessionId) || [];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Clear journal for a specific session.
|
|
160
|
+
*/
|
|
161
|
+
clear(sessionId) {
|
|
162
|
+
this.journals.delete(sessionId);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Clear all journals.
|
|
166
|
+
*/
|
|
167
|
+
clearAll() {
|
|
168
|
+
this.journals.clear();
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get stats about the journal.
|
|
172
|
+
*/
|
|
173
|
+
getStats() {
|
|
174
|
+
let totalEntries = 0;
|
|
175
|
+
for (const entries of this.journals.values()) {
|
|
176
|
+
totalEntries += entries.length;
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
sessions: this.journals.size,
|
|
180
|
+
totalEntries,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,MAAM,cAAc,GAAmC;IACrD,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,WAAW;IAC1C,oBAAoB,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAgC,IAAI,GAAG,EAAE,CAAC;IAClD,MAAM,CAAiC;IAE/C,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,OAAe;QAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,uCAAuC;QACvC,uFAAuF;QACvF,MAAM,QAAQ,GAAG;YACf,oBAAoB;YACpB,sHAAsH;YACtH,eAAe;YACf,8GAA8G;YAC9G,sBAAsB;YACtB,2FAA2F;YAC3F,kBAAkB;YAClB,mHAAmH;YACnH,mBAAmB;YACnB,mCAAmC;YACnC,8CAA8C;YAC9C,+EAA+E;SAChF,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,6CAA6C;YAC7C,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YAEtB,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAE/B,+BAA+B;gBAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBACzB,SAAS;gBACX,CAAC;gBAED,8CAA8C;gBAC9C,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACvB,CAAC;gBAED,gCAAgC;gBAChC,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;oBACtD,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBACtD,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAiB,EAAE,MAAgB,EAAE,KAAc;QACxD,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,GAAG;gBACd,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,yCAAyC;QACzC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE3F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,eAAuB;QAClC,IAAI,CAAC,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QAE5C,+DAA+D;QAC/D,MAAM,QAAQ,GAAG;YACf,mCAAmC;YACnC,iBAAiB;YACjB,oBAAoB;YACpB,gBAAgB;YAChB,mBAAmB;YACnB,sBAAsB;YACtB,SAAS;YACT,QAAQ;YACR,YAAY;YACZ,cAAc;YACd,OAAO;YACP,QAAQ;YACR,mBAAmB;YACnB,WAAW;YACX,WAAW;YACX,YAAY;YACZ,OAAO;YACP,qBAAqB;YACrB,WAAW;YACX,eAAe;YACf,cAAc;YACd,cAAc;YACd,iBAAiB;SAClB,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,SAAiB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;gBAC7D,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;YACH,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,OAAO,mCAAmC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAiB;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;QACjC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC5B,YAAY;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.test.d.ts","sourceRoot":"","sources":["../src/journal.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { SessionJournal } from "./journal.js";
|
|
3
|
+
describe("SessionJournal", () => {
|
|
4
|
+
let journal;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
journal = new SessionJournal();
|
|
7
|
+
});
|
|
8
|
+
describe("extractEvents", () => {
|
|
9
|
+
it("should extract creation events", () => {
|
|
10
|
+
const content = `I created a new login component for the authentication system.`;
|
|
11
|
+
const events = journal.extractEvents(content);
|
|
12
|
+
expect(events).toHaveLength(1);
|
|
13
|
+
expect(events[0]).toContain("created");
|
|
14
|
+
expect(events[0]).toContain("login component");
|
|
15
|
+
});
|
|
16
|
+
it("should extract fix events", () => {
|
|
17
|
+
const content = `I fixed the authentication bug that was causing users to be logged out.`;
|
|
18
|
+
const events = journal.extractEvents(content);
|
|
19
|
+
expect(events).toHaveLength(1);
|
|
20
|
+
expect(events[0]).toContain("fixed");
|
|
21
|
+
});
|
|
22
|
+
it("should extract multiple events from one response", () => {
|
|
23
|
+
const content = `I created a new login component. Then I fixed the authentication bug that was causing issues. I also updated the user profile page.`;
|
|
24
|
+
const events = journal.extractEvents(content);
|
|
25
|
+
expect(events).toHaveLength(3);
|
|
26
|
+
expect(events.some((e) => e.includes("created"))).toBe(true);
|
|
27
|
+
expect(events.some((e) => e.includes("fixed"))).toBe(true);
|
|
28
|
+
expect(events.some((e) => e.includes("updated"))).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it("should extract success events", () => {
|
|
31
|
+
const content = `Successfully deployed the application to production.`;
|
|
32
|
+
const events = journal.extractEvents(content);
|
|
33
|
+
expect(events).toHaveLength(1);
|
|
34
|
+
expect(events[0]).toContain("Successfully deployed");
|
|
35
|
+
});
|
|
36
|
+
it("should limit to max 5 events per response by default", () => {
|
|
37
|
+
const content = `
|
|
38
|
+
I created component A.
|
|
39
|
+
I fixed bug B.
|
|
40
|
+
I implemented feature C.
|
|
41
|
+
I resolved issue D.
|
|
42
|
+
I added function E.
|
|
43
|
+
I wrote test F.
|
|
44
|
+
I built module G.
|
|
45
|
+
`;
|
|
46
|
+
const events = journal.extractEvents(content);
|
|
47
|
+
expect(events.length).toBeLessThanOrEqual(5);
|
|
48
|
+
});
|
|
49
|
+
it("should skip events that are too short", () => {
|
|
50
|
+
const content = `I fixed it.`; // Too short to be meaningful
|
|
51
|
+
const events = journal.extractEvents(content);
|
|
52
|
+
expect(events).toHaveLength(0);
|
|
53
|
+
});
|
|
54
|
+
it("should handle empty content", () => {
|
|
55
|
+
const events = journal.extractEvents("");
|
|
56
|
+
expect(events).toHaveLength(0);
|
|
57
|
+
});
|
|
58
|
+
it("should handle null/undefined content", () => {
|
|
59
|
+
const events = journal.extractEvents(null);
|
|
60
|
+
expect(events).toHaveLength(0);
|
|
61
|
+
});
|
|
62
|
+
it("should deduplicate similar events", () => {
|
|
63
|
+
const content = `I created a new login component. I also created a new login component for testing.`;
|
|
64
|
+
const events = journal.extractEvents(content);
|
|
65
|
+
// Should deduplicate based on normalized content
|
|
66
|
+
expect(events.length).toBeLessThanOrEqual(2);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("record", () => {
|
|
70
|
+
it("should record events to a session", () => {
|
|
71
|
+
journal.record("session1", ["Created login component", "Fixed auth bug"]);
|
|
72
|
+
const entries = journal.getEntries("session1");
|
|
73
|
+
expect(entries).toHaveLength(2);
|
|
74
|
+
});
|
|
75
|
+
it("should not record empty events", () => {
|
|
76
|
+
journal.record("session1", []);
|
|
77
|
+
const entries = journal.getEntries("session1");
|
|
78
|
+
expect(entries).toHaveLength(0);
|
|
79
|
+
});
|
|
80
|
+
it("should not record if sessionId is empty", () => {
|
|
81
|
+
journal.record("", ["Some event"]);
|
|
82
|
+
const entries = journal.getEntries("");
|
|
83
|
+
expect(entries).toHaveLength(0);
|
|
84
|
+
});
|
|
85
|
+
it("should store model with events", () => {
|
|
86
|
+
journal.record("session1", ["Created component"], "gpt-4");
|
|
87
|
+
const entries = journal.getEntries("session1");
|
|
88
|
+
expect(entries[0].model).toBe("gpt-4");
|
|
89
|
+
});
|
|
90
|
+
it("should append to existing session", () => {
|
|
91
|
+
journal.record("session1", ["Event 1"]);
|
|
92
|
+
journal.record("session1", ["Event 2"]);
|
|
93
|
+
const entries = journal.getEntries("session1");
|
|
94
|
+
expect(entries).toHaveLength(2);
|
|
95
|
+
});
|
|
96
|
+
it("should trim entries when exceeding maxEntries", () => {
|
|
97
|
+
const customJournal = new SessionJournal({ maxEntries: 3 });
|
|
98
|
+
customJournal.record("session1", ["Event 1"]);
|
|
99
|
+
customJournal.record("session1", ["Event 2"]);
|
|
100
|
+
customJournal.record("session1", ["Event 3"]);
|
|
101
|
+
customJournal.record("session1", ["Event 4"]);
|
|
102
|
+
const entries = customJournal.getEntries("session1");
|
|
103
|
+
expect(entries).toHaveLength(3);
|
|
104
|
+
// Should keep the most recent
|
|
105
|
+
expect(entries[2].action).toBe("Event 4");
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("needsContext", () => {
|
|
109
|
+
it("should detect 'what did you do' questions", () => {
|
|
110
|
+
expect(journal.needsContext("what did you do today?")).toBe(true);
|
|
111
|
+
expect(journal.needsContext("What did you do earlier?")).toBe(true);
|
|
112
|
+
});
|
|
113
|
+
it("should detect 'what have you done' questions", () => {
|
|
114
|
+
expect(journal.needsContext("what have you done so far?")).toBe(true);
|
|
115
|
+
});
|
|
116
|
+
it("should detect temporal references", () => {
|
|
117
|
+
expect(journal.needsContext("show me what we did earlier")).toBe(true);
|
|
118
|
+
expect(journal.needsContext("what happened before this?")).toBe(true);
|
|
119
|
+
expect(journal.needsContext("what did we do previously?")).toBe(true);
|
|
120
|
+
});
|
|
121
|
+
it("should detect summary requests", () => {
|
|
122
|
+
expect(journal.needsContext("can you summarize your work?")).toBe(true);
|
|
123
|
+
expect(journal.needsContext("remind me what we accomplished")).toBe(true);
|
|
124
|
+
expect(journal.needsContext("give me a recap")).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
it("should detect progress inquiries", () => {
|
|
127
|
+
expect(journal.needsContext("what's your progress?")).toBe(true);
|
|
128
|
+
expect(journal.needsContext("what have you accomplished?")).toBe(true);
|
|
129
|
+
});
|
|
130
|
+
it("should return false for normal requests", () => {
|
|
131
|
+
expect(journal.needsContext("please fix this bug")).toBe(false);
|
|
132
|
+
expect(journal.needsContext("create a new component")).toBe(false);
|
|
133
|
+
expect(journal.needsContext("what is JavaScript?")).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
it("should handle empty input", () => {
|
|
136
|
+
expect(journal.needsContext("")).toBe(false);
|
|
137
|
+
expect(journal.needsContext(null)).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe("format", () => {
|
|
141
|
+
it("should return null for empty journal", () => {
|
|
142
|
+
expect(journal.format("nonexistent")).toBeNull();
|
|
143
|
+
});
|
|
144
|
+
it("should format journal entries with timestamps", () => {
|
|
145
|
+
journal.record("session1", ["Created login component", "Fixed auth bug"]);
|
|
146
|
+
const formatted = journal.format("session1");
|
|
147
|
+
expect(formatted).not.toBeNull();
|
|
148
|
+
expect(formatted).toContain("[Session Memory");
|
|
149
|
+
expect(formatted).toContain("Created login component");
|
|
150
|
+
expect(formatted).toContain("Fixed auth bug");
|
|
151
|
+
// Should contain time format like "10:30 AM"
|
|
152
|
+
expect(formatted).toMatch(/\d{2}:\d{2}\s*(AM|PM)/i);
|
|
153
|
+
});
|
|
154
|
+
it("should format as bullet list", () => {
|
|
155
|
+
journal.record("session1", ["Event 1"]);
|
|
156
|
+
const formatted = journal.format("session1");
|
|
157
|
+
expect(formatted).toContain("- ");
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("clear", () => {
|
|
161
|
+
it("should clear specific session", () => {
|
|
162
|
+
journal.record("session1", ["Event 1"]);
|
|
163
|
+
journal.record("session2", ["Event 2"]);
|
|
164
|
+
journal.clear("session1");
|
|
165
|
+
expect(journal.getEntries("session1")).toHaveLength(0);
|
|
166
|
+
expect(journal.getEntries("session2")).toHaveLength(1);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe("clearAll", () => {
|
|
170
|
+
it("should clear all sessions", () => {
|
|
171
|
+
journal.record("session1", ["Event 1"]);
|
|
172
|
+
journal.record("session2", ["Event 2"]);
|
|
173
|
+
journal.clearAll();
|
|
174
|
+
expect(journal.getEntries("session1")).toHaveLength(0);
|
|
175
|
+
expect(journal.getEntries("session2")).toHaveLength(0);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe("getStats", () => {
|
|
179
|
+
it("should return correct stats", () => {
|
|
180
|
+
journal.record("session1", ["Event 1", "Event 2"]);
|
|
181
|
+
journal.record("session2", ["Event 3"]);
|
|
182
|
+
const stats = journal.getStats();
|
|
183
|
+
expect(stats.sessions).toBe(2);
|
|
184
|
+
expect(stats.totalEntries).toBe(3);
|
|
185
|
+
});
|
|
186
|
+
it("should return zero stats for empty journal", () => {
|
|
187
|
+
const stats = journal.getStats();
|
|
188
|
+
expect(stats.sessions).toBe(0);
|
|
189
|
+
expect(stats.totalEntries).toBe(0);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe("config options", () => {
|
|
193
|
+
it("should respect custom maxEventsPerResponse", () => {
|
|
194
|
+
const customJournal = new SessionJournal({ maxEventsPerResponse: 2 });
|
|
195
|
+
const content = `I created A. I fixed B. I implemented C. I built D.`;
|
|
196
|
+
const events = customJournal.extractEvents(content);
|
|
197
|
+
expect(events.length).toBeLessThanOrEqual(2);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
//# sourceMappingURL=journal.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.test.js","sourceRoot":"","sources":["../src/journal.test.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Logger
|
|
3
|
+
*
|
|
4
|
+
* Logs every LLM request as a JSON line to a daily log file.
|
|
5
|
+
* Files: ~/.openclaw/blockrun/logs/usage-YYYY-MM-DD.jsonl
|
|
6
|
+
*
|
|
7
|
+
* MVP: append-only JSON lines. No rotation, no cleanup.
|
|
8
|
+
* Logging never breaks the request flow — all errors are swallowed.
|
|
9
|
+
*/
|
|
10
|
+
export type UsageEntry = {
|
|
11
|
+
timestamp: string;
|
|
12
|
+
model: string;
|
|
13
|
+
tier: string;
|
|
14
|
+
cost: number;
|
|
15
|
+
baselineCost: number;
|
|
16
|
+
savings: number;
|
|
17
|
+
latencyMs: number;
|
|
18
|
+
/** Whether the request completed successfully or ended in an error */
|
|
19
|
+
status?: "success" | "error";
|
|
20
|
+
/** Input (prompt) tokens reported by the provider */
|
|
21
|
+
inputTokens?: number;
|
|
22
|
+
/** Output (completion) tokens reported by the provider */
|
|
23
|
+
outputTokens?: number;
|
|
24
|
+
/** Partner service ID (e.g., "x_users_lookup") — only set for partner API calls */
|
|
25
|
+
partnerId?: string;
|
|
26
|
+
/** Partner service name (e.g., "AttentionVC") — only set for partner API calls */
|
|
27
|
+
service?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Log a usage entry as a JSON line.
|
|
31
|
+
*/
|
|
32
|
+
export declare function logUsage(entry: UsageEntry): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAWF;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/D"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Logger
|
|
3
|
+
*
|
|
4
|
+
* Logs every LLM request as a JSON line to a daily log file.
|
|
5
|
+
* Files: ~/.openclaw/blockrun/logs/usage-YYYY-MM-DD.jsonl
|
|
6
|
+
*
|
|
7
|
+
* MVP: append-only JSON lines. No rotation, no cleanup.
|
|
8
|
+
* Logging never breaks the request flow — all errors are swallowed.
|
|
9
|
+
*/
|
|
10
|
+
import { appendFile, mkdir } from "node:fs/promises";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
const LOG_DIR = join(homedir(), ".openclaw", "blockrun", "logs");
|
|
14
|
+
let dirReady = false;
|
|
15
|
+
async function ensureDir() {
|
|
16
|
+
if (dirReady)
|
|
17
|
+
return;
|
|
18
|
+
await mkdir(LOG_DIR, { recursive: true });
|
|
19
|
+
dirReady = true;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Log a usage entry as a JSON line.
|
|
23
|
+
*/
|
|
24
|
+
export async function logUsage(entry) {
|
|
25
|
+
try {
|
|
26
|
+
await ensureDir();
|
|
27
|
+
const date = entry.timestamp.slice(0, 10); // YYYY-MM-DD
|
|
28
|
+
const file = join(LOG_DIR, `usage-${date}.jsonl`);
|
|
29
|
+
await appendFile(file, JSON.stringify(entry) + "\n");
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Never break the request flow
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAsBlC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AACjE,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,KAAK,UAAU,SAAS;IACtB,IAAI,QAAQ;QAAE,OAAO;IACrB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAiB;IAC9C,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,QAAQ,CAAC,CAAC;QAClD,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|