@winspan/claude-forge 8.30.0 → 8.33.2
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/README.md +4 -4
- package/dist/capability/execution-manager.d.ts +38 -1
- package/dist/capability/execution-manager.d.ts.map +1 -1
- package/dist/capability/execution-manager.js +93 -1
- package/dist/capability/execution-manager.js.map +1 -1
- package/dist/capability/executor/background-executor.d.ts +1 -0
- package/dist/capability/executor/background-executor.d.ts.map +1 -1
- package/dist/capability/executor/background-executor.js +27 -4
- package/dist/capability/executor/background-executor.js.map +1 -1
- package/dist/capability/executor/orchestrator.d.ts +15 -2
- package/dist/capability/executor/orchestrator.d.ts.map +1 -1
- package/dist/capability/executor/orchestrator.js +82 -3
- package/dist/capability/executor/orchestrator.js.map +1 -1
- package/dist/capability/executor/worker-auth-probe.d.ts.map +1 -1
- package/dist/capability/executor/worker-auth-probe.js +11 -2
- package/dist/capability/executor/worker-auth-probe.js.map +1 -1
- package/dist/capability/methodologies/bmad.yaml +17 -5
- package/dist/capability/methodologies/code-quality-audit.yaml +26 -0
- package/dist/capability/methodologies/harness-engineering.yaml +12 -6
- package/dist/capability/methodologies/test-coverage-scan.yaml +26 -0
- package/dist/capability/methodology-planner.d.ts +17 -1
- package/dist/capability/methodology-planner.d.ts.map +1 -1
- package/dist/capability/methodology-planner.js +125 -0
- package/dist/capability/methodology-planner.js.map +1 -1
- package/dist/capability/methodology-registry.d.ts.map +1 -1
- package/dist/capability/methodology-registry.js +21 -5
- package/dist/capability/methodology-registry.js.map +1 -1
- package/dist/capability/types.d.ts +2 -0
- package/dist/capability/types.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +82 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/ai/provider.d.ts +17 -9
- package/dist/core/ai/provider.d.ts.map +1 -1
- package/dist/core/ai/provider.js +130 -23
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/ai/types.d.ts +26 -5
- package/dist/core/ai/types.d.ts.map +1 -1
- package/dist/core/storage/rows.d.ts +153 -0
- package/dist/core/storage/rows.d.ts.map +1 -0
- package/dist/core/storage/rows.js +14 -0
- package/dist/core/storage/rows.js.map +1 -0
- package/dist/core/storage/schema.sql +26 -2
- package/dist/core/storage/sqlite.d.ts +95 -7
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +409 -22
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/utils/token-tracker.d.ts +40 -0
- package/dist/core/utils/token-tracker.d.ts.map +1 -0
- package/dist/core/utils/token-tracker.js +70 -0
- package/dist/core/utils/token-tracker.js.map +1 -0
- package/dist/daemon/handlers/post-tool-use.d.ts +1 -0
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +7 -0
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +11 -0
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +52 -0
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +63 -4
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/idle-detector.d.ts +35 -0
- package/dist/daemon/idle-detector.d.ts.map +1 -0
- package/dist/daemon/idle-detector.js +56 -0
- package/dist/daemon/idle-detector.js.map +1 -0
- package/dist/daemon/idle-trigger.d.ts +53 -0
- package/dist/daemon/idle-trigger.d.ts.map +1 -0
- package/dist/daemon/idle-trigger.js +153 -0
- package/dist/daemon/idle-trigger.js.map +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +30 -2
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/routing-observer.d.ts +2 -1
- package/dist/daemon/routing-observer.d.ts.map +1 -1
- package/dist/daemon/routing-observer.js +117 -39
- package/dist/daemon/routing-observer.js.map +1 -1
- package/dist/engine/agent-router.d.ts +6 -0
- package/dist/engine/agent-router.d.ts.map +1 -1
- package/dist/engine/agent-router.js +13 -1
- package/dist/engine/agent-router.js.map +1 -1
- package/dist/engine/conventions/routing.yaml +15 -0
- package/dist/engine/dsl/compiler.d.ts.map +1 -1
- package/dist/engine/dsl/compiler.js +85 -3
- package/dist/engine/dsl/compiler.js.map +1 -1
- package/dist/engine/recommender.d.ts.map +1 -1
- package/dist/engine/recommender.js +10 -1
- package/dist/engine/recommender.js.map +1 -1
- package/dist/intelligence/classifier.d.ts +6 -0
- package/dist/intelligence/classifier.d.ts.map +1 -1
- package/dist/intelligence/classifier.js +57 -0
- package/dist/intelligence/classifier.js.map +1 -1
- package/dist/skills/registry.d.ts +6 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +49 -14
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/semantic-matcher.d.ts +1 -0
- package/dist/skills/semantic-matcher.d.ts.map +1 -1
- package/dist/skills/semantic-matcher.js +6 -1
- package/dist/skills/semantic-matcher.js.map +1 -1
- package/dist/web/auth-middleware.d.ts +22 -0
- package/dist/web/auth-middleware.d.ts.map +1 -0
- package/dist/web/auth-middleware.js +51 -0
- package/dist/web/auth-middleware.js.map +1 -0
- package/dist/web/routes/agents.d.ts +7 -0
- package/dist/web/routes/agents.d.ts.map +1 -0
- package/dist/web/routes/agents.js +192 -0
- package/dist/web/routes/agents.js.map +1 -0
- package/dist/web/routes/ai.d.ts +10 -0
- package/dist/web/routes/ai.d.ts.map +1 -0
- package/dist/web/routes/ai.js +197 -0
- package/dist/web/routes/ai.js.map +1 -0
- package/dist/web/routes/auth.d.ts +12 -0
- package/dist/web/routes/auth.d.ts.map +1 -0
- package/dist/web/routes/auth.js +20 -0
- package/dist/web/routes/auth.js.map +1 -0
- package/dist/web/routes/events.d.ts +11 -0
- package/dist/web/routes/events.d.ts.map +1 -0
- package/dist/web/routes/events.js +43 -0
- package/dist/web/routes/events.js.map +1 -0
- package/dist/web/routes/execution-trace.d.ts +13 -0
- package/dist/web/routes/execution-trace.d.ts.map +1 -0
- package/dist/web/routes/execution-trace.js +308 -0
- package/dist/web/routes/execution-trace.js.map +1 -0
- package/dist/web/routes/experiments.d.ts +15 -0
- package/dist/web/routes/experiments.d.ts.map +1 -0
- package/dist/web/routes/experiments.js +187 -0
- package/dist/web/routes/experiments.js.map +1 -0
- package/dist/web/routes/methodology.d.ts +12 -0
- package/dist/web/routes/methodology.d.ts.map +1 -0
- package/dist/web/routes/methodology.js +228 -0
- package/dist/web/routes/methodology.js.map +1 -0
- package/dist/web/routes/patch.d.ts +7 -0
- package/dist/web/routes/patch.d.ts.map +1 -0
- package/dist/web/routes/patch.js +106 -0
- package/dist/web/routes/patch.js.map +1 -0
- package/dist/web/routes/routing.d.ts +17 -0
- package/dist/web/routes/routing.d.ts.map +1 -0
- package/dist/web/routes/routing.js +582 -0
- package/dist/web/routes/routing.js.map +1 -0
- package/dist/web/routes/rules.d.ts +7 -0
- package/dist/web/routes/rules.d.ts.map +1 -0
- package/dist/web/routes/rules.js +105 -0
- package/dist/web/routes/rules.js.map +1 -0
- package/dist/web/routes/sessions.d.ts +10 -0
- package/dist/web/routes/sessions.d.ts.map +1 -0
- package/dist/web/routes/sessions.js +234 -0
- package/dist/web/routes/sessions.js.map +1 -0
- package/dist/web/routes/skills.d.ts +10 -0
- package/dist/web/routes/skills.d.ts.map +1 -0
- package/dist/web/routes/skills.js +272 -0
- package/dist/web/routes/skills.js.map +1 -0
- package/dist/web/routes/static.d.ts +19 -0
- package/dist/web/routes/static.d.ts.map +1 -0
- package/dist/web/routes/static.js +61 -0
- package/dist/web/routes/static.js.map +1 -0
- package/dist/web/routes/status.d.ts +7 -0
- package/dist/web/routes/status.d.ts.map +1 -0
- package/dist/web/routes/status.js +28 -0
- package/dist/web/routes/status.js.map +1 -0
- package/dist/web/routes/token-usage.d.ts +7 -0
- package/dist/web/routes/token-usage.d.ts.map +1 -0
- package/dist/web/routes/token-usage.js +33 -0
- package/dist/web/routes/token-usage.js.map +1 -0
- package/dist/web/routes/types.d.ts +40 -0
- package/dist/web/routes/types.d.ts.map +1 -0
- package/dist/web/routes/types.js +52 -0
- package/dist/web/routes/types.js.map +1 -0
- package/dist/web/server.d.ts +7 -4
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +60 -2330
- package/dist/web/server.js.map +1 -1
- package/dist/web/ssrf-guard.d.ts +35 -0
- package/dist/web/ssrf-guard.d.ts.map +1 -0
- package/dist/web/ssrf-guard.js +93 -0
- package/dist/web/ssrf-guard.js.map +1 -0
- package/dist/web/static/assets/AIConfig-Dw13rVtT.js +2 -0
- package/dist/web/static/assets/AIConfig-Dw13rVtT.js.map +1 -0
- package/dist/web/static/assets/Agents-D1p3JhQs.js +2 -0
- package/dist/web/static/assets/Agents-D1p3JhQs.js.map +1 -0
- package/dist/web/static/assets/{Events-CnA3f740.js → Events-DqzBTrly.js} +2 -2
- package/dist/web/static/assets/{Events-CnA3f740.js.map → Events-DqzBTrly.js.map} +1 -1
- package/dist/web/static/assets/{ExecutionTrace-ClPfFIQa.js → ExecutionTrace-Z-zlH0KH.js} +2 -2
- package/dist/web/static/assets/{ExecutionTrace-ClPfFIQa.js.map → ExecutionTrace-Z-zlH0KH.js.map} +1 -1
- package/dist/web/static/assets/Methodologies-Br5KOWuF.js +5 -0
- package/dist/web/static/assets/Methodologies-Br5KOWuF.js.map +1 -0
- package/dist/web/static/assets/{Sessions-DwWOKgnl.js → Sessions-DOd65EkN.js} +2 -2
- package/dist/web/static/assets/{Sessions-DwWOKgnl.js.map → Sessions-DOd65EkN.js.map} +1 -1
- package/dist/web/static/assets/Skills-zacj_uSW.js +2 -0
- package/dist/web/static/assets/Skills-zacj_uSW.js.map +1 -0
- package/dist/web/static/assets/auth-Bnf8ZcqN.js +2 -0
- package/dist/web/static/assets/auth-Bnf8ZcqN.js.map +1 -0
- package/dist/web/static/assets/index-BVpUTHdp.js +3 -0
- package/dist/web/static/assets/{index-DUYj2ek1.js.map → index-BVpUTHdp.js.map} +1 -1
- package/dist/web/static/assets/index-Drpf7sLl.css +1 -0
- package/dist/web/static/index.html +2 -2
- package/package.json +4 -3
- package/dist/web/static/assets/AIConfig-nZgwaowr.js +0 -2
- package/dist/web/static/assets/AIConfig-nZgwaowr.js.map +0 -1
- package/dist/web/static/assets/Agents-BZGXKWC7.js +0 -2
- package/dist/web/static/assets/Agents-BZGXKWC7.js.map +0 -1
- package/dist/web/static/assets/Methodologies-CAXUXeox.js +0 -2
- package/dist/web/static/assets/Methodologies-CAXUXeox.js.map +0 -1
- package/dist/web/static/assets/Skills-DhM6ALhr.js +0 -2
- package/dist/web/static/assets/Skills-DhM6ALhr.js.map +0 -1
- package/dist/web/static/assets/index-CVWult53.css +0 -1
- package/dist/web/static/assets/index-DUYj2ek1.js +0 -3
package/dist/core/ai/provider.js
CHANGED
|
@@ -1,12 +1,61 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Claude AI provider —
|
|
3
|
-
*
|
|
2
|
+
* Claude AI provider — wrapper around @anthropic-ai/sdk.
|
|
3
|
+
*
|
|
4
|
+
* Adds per-request timeout (AbortController) and bounded retry with exponential
|
|
5
|
+
* backoff for transient failures (AbortError / 429 / 5xx / network errors).
|
|
6
|
+
* SDK's built-in retry is disabled (maxRetries: 0) to avoid double retry layers.
|
|
4
7
|
*/
|
|
5
8
|
import Anthropic from '@anthropic-ai/sdk';
|
|
6
9
|
import { logger } from '../utils/logger.js';
|
|
7
10
|
const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
8
11
|
const DEFAULT_MAX_TOKENS = 4096;
|
|
12
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
13
|
+
const DEFAULT_MAX_RETRIES = 2;
|
|
14
|
+
const MAX_BACKOFF_MS = 8_000;
|
|
15
|
+
/** Sleep helper — exported via object indirection so tests can stub it. */
|
|
16
|
+
export const timing = {
|
|
17
|
+
delay(ms) {
|
|
18
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
/** @deprecated Use `timing.delay`; kept for backward compatibility. */
|
|
22
|
+
export function delay(ms) {
|
|
23
|
+
return timing.delay(ms);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Determine whether an error from the Anthropic SDK (or network layer) is
|
|
27
|
+
* worth retrying. Covers:
|
|
28
|
+
* - Abort (our own timeout fires an AbortController)
|
|
29
|
+
* - 429 rate limit
|
|
30
|
+
* - 5xx server errors
|
|
31
|
+
* - Connection / network errors without a status code
|
|
32
|
+
*/
|
|
33
|
+
function isRetriable(err) {
|
|
34
|
+
if (!err || typeof err !== 'object')
|
|
35
|
+
return false;
|
|
36
|
+
const e = err;
|
|
37
|
+
if (e.name === 'AbortError' || e.name === 'APIUserAbortError')
|
|
38
|
+
return true;
|
|
39
|
+
if (typeof e.status === 'number') {
|
|
40
|
+
if (e.status === 429)
|
|
41
|
+
return true;
|
|
42
|
+
if (e.status >= 500 && e.status < 600)
|
|
43
|
+
return true;
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
// No HTTP status -> typically a connection error, worth retrying.
|
|
47
|
+
if (e.name === 'APIConnectionError' || e.name === 'APIConnectionTimeoutError')
|
|
48
|
+
return true;
|
|
49
|
+
if (e.code === 'ECONNRESET' || e.code === 'ETIMEDOUT' || e.code === 'ENOTFOUND')
|
|
50
|
+
return true;
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
function computeBackoffMs(attempt) {
|
|
54
|
+
return Math.min(1000 * Math.pow(2, attempt), MAX_BACKOFF_MS);
|
|
55
|
+
}
|
|
9
56
|
export class ClaudeProvider {
|
|
57
|
+
// Exposed for tests; production code treats it as private.
|
|
58
|
+
/** @internal */
|
|
10
59
|
client;
|
|
11
60
|
model;
|
|
12
61
|
callCount = 0;
|
|
@@ -21,29 +70,87 @@ export class ClaudeProvider {
|
|
|
21
70
|
});
|
|
22
71
|
}
|
|
23
72
|
async complete(prompt, options) {
|
|
73
|
+
const response = await this.completeWithUsage(prompt, options);
|
|
74
|
+
return response.text;
|
|
75
|
+
}
|
|
76
|
+
async completeWithUsage(prompt, options) {
|
|
24
77
|
this.callCount++;
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
78
|
+
const modelUsed = options?.model || this.model;
|
|
79
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
80
|
+
const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
81
|
+
const externalSignal = options?.signal;
|
|
82
|
+
let lastErr;
|
|
83
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
84
|
+
const start = Date.now();
|
|
85
|
+
const controller = new AbortController();
|
|
86
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
87
|
+
// Forward external aborts into our controller so both sources cancel
|
|
88
|
+
// the in-flight request.
|
|
89
|
+
const onExternalAbort = () => controller.abort();
|
|
90
|
+
if (externalSignal) {
|
|
91
|
+
if (externalSignal.aborted)
|
|
92
|
+
controller.abort();
|
|
93
|
+
else
|
|
94
|
+
externalSignal.addEventListener('abort', onExternalAbort, { once: true });
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const response = await this.client.messages.create({
|
|
98
|
+
model: modelUsed,
|
|
99
|
+
max_tokens: options?.maxTokens || DEFAULT_MAX_TOKENS,
|
|
100
|
+
...(options?.system ? { system: options.system } : {}),
|
|
101
|
+
messages: [{ role: 'user', content: prompt }],
|
|
102
|
+
}, {
|
|
103
|
+
signal: controller.signal,
|
|
104
|
+
// Disable SDK-level retry; this method owns retry semantics.
|
|
105
|
+
maxRetries: 0,
|
|
106
|
+
timeout: timeoutMs,
|
|
107
|
+
});
|
|
108
|
+
const latency = Date.now() - start;
|
|
109
|
+
this.totalLatencyMs += latency;
|
|
110
|
+
const usage = response.usage;
|
|
111
|
+
this.totalTokens += (usage?.input_tokens ?? 0) + (usage?.output_tokens ?? 0);
|
|
112
|
+
logger.debug(`[AI] ${latency}ms | ${usage?.input_tokens ?? 0}+${usage?.output_tokens ?? 0} tokens` +
|
|
113
|
+
(attempt > 0 ? ` (after ${attempt} retry)` : ''));
|
|
114
|
+
const textBlock = response.content.find((c) => c.type === 'text');
|
|
115
|
+
return {
|
|
116
|
+
text: textBlock?.text ?? '',
|
|
117
|
+
usage: usage
|
|
118
|
+
? {
|
|
119
|
+
input_tokens: usage.input_tokens,
|
|
120
|
+
output_tokens: usage.output_tokens,
|
|
121
|
+
}
|
|
122
|
+
: undefined,
|
|
123
|
+
model: modelUsed,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
this.totalLatencyMs += Date.now() - start;
|
|
128
|
+
lastErr = err;
|
|
129
|
+
// External caller aborted -> never retry, propagate immediately.
|
|
130
|
+
if (externalSignal?.aborted) {
|
|
131
|
+
this.totalErrors++;
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
const canRetry = attempt < maxRetries && isRetriable(err);
|
|
135
|
+
if (!canRetry) {
|
|
136
|
+
this.totalErrors++;
|
|
137
|
+
logger.error(`[AI] Claude API error: ${err instanceof Error ? err.message : String(err)}`);
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
const backoffMs = computeBackoffMs(attempt);
|
|
141
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
142
|
+
logger.warn(`[ClaudeProvider] retry ${attempt + 1}/${maxRetries} after ${backoffMs}ms (reason: ${reason})`);
|
|
143
|
+
await timing.delay(backoffMs);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
clearTimeout(timer);
|
|
147
|
+
if (externalSignal) {
|
|
148
|
+
externalSignal.removeEventListener('abort', onExternalAbort);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
46
151
|
}
|
|
152
|
+
// Unreachable: loop either returns or throws. Included for type safety.
|
|
153
|
+
throw lastErr instanceof Error ? lastErr : new Error('ClaudeProvider: exhausted retries');
|
|
47
154
|
}
|
|
48
155
|
formatStats() {
|
|
49
156
|
if (this.callCount === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/core/ai/provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/core/ai/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ai/types.d.ts
CHANGED
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AI Provider abstraction — minimal interface
|
|
3
3
|
*/
|
|
4
|
+
export interface TokenUsage {
|
|
5
|
+
input_tokens: number;
|
|
6
|
+
output_tokens: number;
|
|
7
|
+
}
|
|
8
|
+
export interface AIResponse {
|
|
9
|
+
text: string;
|
|
10
|
+
usage?: TokenUsage;
|
|
11
|
+
model?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Options for AI completion calls.
|
|
15
|
+
*
|
|
16
|
+
* `timeoutMs` (default 30_000) caps each individual request via AbortController.
|
|
17
|
+
* `maxRetries` (default 2) controls retry attempts for AbortError/429/5xx/network errors.
|
|
18
|
+
* `signal` lets callers abort externally (composed with internal timeout signal).
|
|
19
|
+
*/
|
|
20
|
+
export interface CompleteOptions {
|
|
21
|
+
system?: string;
|
|
22
|
+
maxTokens?: number;
|
|
23
|
+
model?: string;
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
maxRetries?: number;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
}
|
|
4
28
|
export interface AIProvider {
|
|
5
|
-
complete(prompt: string, options?:
|
|
6
|
-
|
|
7
|
-
maxTokens?: number;
|
|
8
|
-
model?: string;
|
|
9
|
-
}): Promise<string>;
|
|
29
|
+
complete(prompt: string, options?: CompleteOptions): Promise<string>;
|
|
30
|
+
completeWithUsage(prompt: string, options?: CompleteOptions): Promise<AIResponse>;
|
|
10
31
|
formatStats(): string;
|
|
11
32
|
}
|
|
12
33
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/ai/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/ai/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAErE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAElF,WAAW,IAAI,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据库行的 TypeScript 类型定义。
|
|
3
|
+
*
|
|
4
|
+
* 每个 interface 对应一张表的查询结果行(shape 与 schema.sql + runMigrations 后
|
|
5
|
+
* 的最终结构一致)。sqlite.ts 的所有 get/all 返回值都应该用这些类型而非 any,
|
|
6
|
+
* 以确保 schema 变动能在编译期而不是运行期暴露。
|
|
7
|
+
*
|
|
8
|
+
* 约定:
|
|
9
|
+
* - 字段可空性严格对齐 schema.sql 的 NOT NULL / DEFAULT NULL / 外键约束
|
|
10
|
+
* - enum 字段(status / mode / trigger_type 等)使用 string literal union
|
|
11
|
+
* - timestamp 字段按实际存储类型:文本时间戳 → string,Unix 毫秒数 → number
|
|
12
|
+
*/
|
|
13
|
+
export interface EventRow {
|
|
14
|
+
event_id: string;
|
|
15
|
+
session_id: string;
|
|
16
|
+
project_path: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
hook_type: 'PreToolUse' | 'PostToolUse' | 'UserPromptSubmit' | 'Notification' | 'Stop';
|
|
19
|
+
tool_name: string | null;
|
|
20
|
+
tool_input: string | null;
|
|
21
|
+
tool_output: string | null;
|
|
22
|
+
user_prompt: string | null;
|
|
23
|
+
ai_response: string | null;
|
|
24
|
+
distilled: number;
|
|
25
|
+
created_at: string;
|
|
26
|
+
}
|
|
27
|
+
export interface SessionRow {
|
|
28
|
+
session_id: string;
|
|
29
|
+
project_path: string;
|
|
30
|
+
status: 'active' | 'completed' | 'interrupted' | 'resumed' | 'abandoned';
|
|
31
|
+
first_prompt: string | null;
|
|
32
|
+
start_time: string;
|
|
33
|
+
end_time: string | null;
|
|
34
|
+
last_event_time: string | null;
|
|
35
|
+
event_count: number;
|
|
36
|
+
created_at: string;
|
|
37
|
+
updated_at: string;
|
|
38
|
+
}
|
|
39
|
+
export interface QualityIssueRow {
|
|
40
|
+
id: string;
|
|
41
|
+
session_id: string;
|
|
42
|
+
project_path: string;
|
|
43
|
+
file_path: string;
|
|
44
|
+
category: string;
|
|
45
|
+
level: string;
|
|
46
|
+
message: string;
|
|
47
|
+
resolved: number;
|
|
48
|
+
resolved_at: string | null;
|
|
49
|
+
created_at: string;
|
|
50
|
+
}
|
|
51
|
+
export interface DistillResultRow {
|
|
52
|
+
id: number;
|
|
53
|
+
session_id: string;
|
|
54
|
+
event_ids: string;
|
|
55
|
+
status: 'pending' | 'processing' | 'completed' | 'failed';
|
|
56
|
+
retry_count: number;
|
|
57
|
+
error_message: string | null;
|
|
58
|
+
created_at: string;
|
|
59
|
+
processed_at: string | null;
|
|
60
|
+
}
|
|
61
|
+
export interface ToolEventRow {
|
|
62
|
+
id: number;
|
|
63
|
+
session_id: string;
|
|
64
|
+
route_request_id: string | null;
|
|
65
|
+
tool: string;
|
|
66
|
+
args: string;
|
|
67
|
+
result: string | null;
|
|
68
|
+
success: number;
|
|
69
|
+
error: string | null;
|
|
70
|
+
timestamp: number;
|
|
71
|
+
created_at: string;
|
|
72
|
+
}
|
|
73
|
+
export interface DecisionRow {
|
|
74
|
+
id: number;
|
|
75
|
+
session_id: string;
|
|
76
|
+
event_id: number;
|
|
77
|
+
rule_id: string | null;
|
|
78
|
+
level: 'allow' | 'warn' | 'confirm' | 'block';
|
|
79
|
+
reason: string | null;
|
|
80
|
+
suggestion: string | null;
|
|
81
|
+
user_choice: string | null;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
created_at: string;
|
|
84
|
+
}
|
|
85
|
+
export interface InjectionRow {
|
|
86
|
+
id: string;
|
|
87
|
+
event_id: string | null;
|
|
88
|
+
session_id: string;
|
|
89
|
+
timestamp: string;
|
|
90
|
+
source_handler: string;
|
|
91
|
+
injection_type: 'systemMessage' | 'additionalContext' | 'reason';
|
|
92
|
+
content: string;
|
|
93
|
+
created_at: string;
|
|
94
|
+
}
|
|
95
|
+
export interface TaskRow {
|
|
96
|
+
id: string;
|
|
97
|
+
session_id: string;
|
|
98
|
+
title: string;
|
|
99
|
+
description: string | null;
|
|
100
|
+
start_time: string;
|
|
101
|
+
end_time: string | null;
|
|
102
|
+
status: 'active' | 'completed' | 'abandoned';
|
|
103
|
+
event_count: number;
|
|
104
|
+
created_at: string;
|
|
105
|
+
}
|
|
106
|
+
export interface MethodologyExecutionRow {
|
|
107
|
+
id: number;
|
|
108
|
+
session_id: string;
|
|
109
|
+
methodology_id: string;
|
|
110
|
+
plan_json: string;
|
|
111
|
+
original_plan_json: string | null;
|
|
112
|
+
current_phase_index: number;
|
|
113
|
+
status: 'running' | 'completed' | 'failed' | 'cancelled' | 'stale';
|
|
114
|
+
mode: 'foreground' | 'background';
|
|
115
|
+
worker_pid: number | null;
|
|
116
|
+
worker_session_id: string | null;
|
|
117
|
+
trigger_type: 'manual' | 'idle' | 'scheduled' | null;
|
|
118
|
+
retry_count: number | null;
|
|
119
|
+
last_progress_at: number | null;
|
|
120
|
+
started_at: number;
|
|
121
|
+
completed_at: number | null;
|
|
122
|
+
created_at: string;
|
|
123
|
+
}
|
|
124
|
+
export interface PhaseExecutionRow {
|
|
125
|
+
id: number;
|
|
126
|
+
methodology_execution_id: number;
|
|
127
|
+
phase_id: string;
|
|
128
|
+
phase_index: number;
|
|
129
|
+
agent_name: string;
|
|
130
|
+
prompt: string;
|
|
131
|
+
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
132
|
+
started_at: number | null;
|
|
133
|
+
completed_at: number | null;
|
|
134
|
+
duration_ms: number | null;
|
|
135
|
+
artifacts_json: string | null;
|
|
136
|
+
output_text: string | null;
|
|
137
|
+
error_message: string | null;
|
|
138
|
+
stream_log_path: string | null;
|
|
139
|
+
created_at: string;
|
|
140
|
+
}
|
|
141
|
+
export interface TokenUsageRow {
|
|
142
|
+
id: number;
|
|
143
|
+
session_id: string;
|
|
144
|
+
methodology_execution_id: number | null;
|
|
145
|
+
timestamp: number;
|
|
146
|
+
input_tokens: number;
|
|
147
|
+
output_tokens: number;
|
|
148
|
+
total_tokens: number;
|
|
149
|
+
model: string | null;
|
|
150
|
+
tool_name: string | null;
|
|
151
|
+
created_at: string;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=rows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../src/core/storage/rows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据库行的 TypeScript 类型定义。
|
|
3
|
+
*
|
|
4
|
+
* 每个 interface 对应一张表的查询结果行(shape 与 schema.sql + runMigrations 后
|
|
5
|
+
* 的最终结构一致)。sqlite.ts 的所有 get/all 返回值都应该用这些类型而非 any,
|
|
6
|
+
* 以确保 schema 变动能在编译期而不是运行期暴露。
|
|
7
|
+
*
|
|
8
|
+
* 约定:
|
|
9
|
+
* - 字段可空性严格对齐 schema.sql 的 NOT NULL / DEFAULT NULL / 外键约束
|
|
10
|
+
* - enum 字段(status / mode / trigger_type 等)使用 string literal union
|
|
11
|
+
* - timestamp 字段按实际存储类型:文本时间戳 → string,Unix 毫秒数 → number
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=rows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../src/core/storage/rows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -28,6 +28,7 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
28
28
|
session_id TEXT PRIMARY KEY,
|
|
29
29
|
project_path TEXT NOT NULL,
|
|
30
30
|
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'interrupted', 'resumed', 'abandoned')),
|
|
31
|
+
first_prompt TEXT, -- 首条 UserPromptSubmit 的 user_prompt 截断后入库,避免 querySessions 跑子查询
|
|
31
32
|
start_time TEXT NOT NULL,
|
|
32
33
|
end_time TEXT,
|
|
33
34
|
last_event_time TEXT,
|
|
@@ -38,6 +39,7 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
38
39
|
|
|
39
40
|
CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_path);
|
|
40
41
|
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time DESC);
|
|
41
43
|
|
|
42
44
|
-- ── Quality Issues ─────────────────────────────────────────────────────
|
|
43
45
|
|
|
@@ -229,9 +231,10 @@ CREATE TABLE IF NOT EXISTS methodology_executions (
|
|
|
229
231
|
methodology_id TEXT NOT NULL,
|
|
230
232
|
plan_json TEXT NOT NULL, -- 动态生成的执行计划(JSON)
|
|
231
233
|
current_phase_index INTEGER DEFAULT 0,
|
|
232
|
-
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'cancelled')),
|
|
234
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'cancelled', 'stale')),
|
|
233
235
|
started_at INTEGER NOT NULL,
|
|
234
236
|
completed_at INTEGER,
|
|
237
|
+
last_progress_at INTEGER, -- 最后一次推进时间戳(ms),用于 stale 判定
|
|
235
238
|
created_at TEXT DEFAULT (datetime('now'))
|
|
236
239
|
);
|
|
237
240
|
|
|
@@ -248,7 +251,7 @@ CREATE TABLE IF NOT EXISTS phase_executions (
|
|
|
248
251
|
phase_index INTEGER NOT NULL,
|
|
249
252
|
agent_name TEXT NOT NULL,
|
|
250
253
|
prompt TEXT NOT NULL,
|
|
251
|
-
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'running', 'completed', 'failed')),
|
|
254
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'running', 'completed', 'failed', 'cancelled')),
|
|
252
255
|
started_at INTEGER,
|
|
253
256
|
completed_at INTEGER,
|
|
254
257
|
duration_ms INTEGER,
|
|
@@ -259,3 +262,24 @@ CREATE TABLE IF NOT EXISTS phase_executions (
|
|
|
259
262
|
|
|
260
263
|
CREATE INDEX IF NOT EXISTS idx_phase_exec_methodology ON phase_executions(methodology_execution_id);
|
|
261
264
|
CREATE INDEX IF NOT EXISTS idx_phase_exec_status ON phase_executions(status);
|
|
265
|
+
|
|
266
|
+
-- ── Token Usage (Token 用量追踪) ──────────────────────────────────────────
|
|
267
|
+
-- 记录每次 AI 调用的 token 用量,用于成本可观测和预算控制
|
|
268
|
+
|
|
269
|
+
CREATE TABLE IF NOT EXISTS token_usage (
|
|
270
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
271
|
+
session_id TEXT NOT NULL,
|
|
272
|
+
methodology_execution_id INTEGER, -- 可选,关联方法论执行
|
|
273
|
+
timestamp INTEGER NOT NULL,
|
|
274
|
+
input_tokens INTEGER NOT NULL,
|
|
275
|
+
output_tokens INTEGER NOT NULL,
|
|
276
|
+
total_tokens INTEGER NOT NULL,
|
|
277
|
+
model TEXT, -- 如 'claude-opus-4-7'
|
|
278
|
+
tool_name TEXT, -- 如 'Task' / 'Read' / 'Agent' / 'classify' / 'plan'
|
|
279
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
280
|
+
FOREIGN KEY (methodology_execution_id) REFERENCES methodology_executions(id)
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
CREATE INDEX IF NOT EXISTS idx_token_usage_session ON token_usage(session_id);
|
|
284
|
+
CREATE INDEX IF NOT EXISTS idx_token_usage_methodology ON token_usage(methodology_execution_id);
|
|
285
|
+
CREATE INDEX IF NOT EXISTS idx_token_usage_timestamp ON token_usage(timestamp DESC);
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import Database from 'better-sqlite3';
|
|
6
6
|
import { EventEmitter } from 'node:events';
|
|
7
7
|
import type { ForgeEvent } from '../types.js';
|
|
8
|
+
import type { MethodologyExecutionRow, PhaseExecutionRow } from './rows.js';
|
|
9
|
+
export type { EventRow, SessionRow, QualityIssueRow, DistillResultRow, ToolEventRow, DecisionRow, InjectionRow, TaskRow, MethodologyExecutionRow, PhaseExecutionRow, TokenUsageRow, } from './rows.js';
|
|
8
10
|
type DecisionLevel = 'allow' | 'warn' | 'confirm' | 'block';
|
|
9
11
|
export interface SessionSummary {
|
|
10
12
|
session_id: string;
|
|
@@ -104,9 +106,48 @@ export declare class SQLiteStorage extends EventEmitter {
|
|
|
104
106
|
* New columns since the base schema.sql go here.
|
|
105
107
|
*/
|
|
106
108
|
private runMigrations;
|
|
109
|
+
/**
|
|
110
|
+
* 将 events 表按 session_id 聚合回填到 sessions 表,仅在 sessions 尚未对齐
|
|
111
|
+
* (没有任何一行带 first_prompt)时触发。旧库升级场景:引入 sessions 聚合表 +
|
|
112
|
+
* upsert 写入路径后,历史 events 不会自动同步到 sessions,必须通过一次性回填补齐。
|
|
113
|
+
*
|
|
114
|
+
* 幂等策略:检测到已有 first_prompt 非空的聚合行就跳过;避免覆盖已被新写路径
|
|
115
|
+
* upsert 过的数据。
|
|
116
|
+
*/
|
|
117
|
+
private backfillSessionsIfNeeded;
|
|
118
|
+
/**
|
|
119
|
+
* SQLite 无法直接修改 CHECK 约束。若旧库的 phase_executions.status CHECK
|
|
120
|
+
* 还没有 'cancelled',走经典的"新表 + 拷数据 + 重命名"路径升级。
|
|
121
|
+
*
|
|
122
|
+
* 幂等:检测到当前 CREATE TABLE 语句里已有 'cancelled' 就跳过。fresh install
|
|
123
|
+
* 的库会直接命中 schema.sql 里的新定义,这里也直接跳过。
|
|
124
|
+
*/
|
|
125
|
+
private rebuildPhaseExecutionsIfNeeded;
|
|
126
|
+
/**
|
|
127
|
+
* methodology_executions.status CHECK 升级:加入 'stale' 枚举值。
|
|
128
|
+
* 幂等:CREATE TABLE 语句里已含 'stale' 则跳过;fresh install 会命中 schema.sql
|
|
129
|
+
* 的新定义,这里也跳过。
|
|
130
|
+
*
|
|
131
|
+
* 注意:必须在 addColumnIfMissing('last_progress_at' / 'retry_count' /
|
|
132
|
+
* 'original_plan_json' / 'trigger_type', ...) 之后执行,重建表时才能把它们一起
|
|
133
|
+
* 拷贝过去。重建方法内部再做一次兜底 addColumnIfMissing,避免未来新列漏同步。
|
|
134
|
+
*/
|
|
135
|
+
private rebuildMethodologyExecutionsIfNeeded;
|
|
107
136
|
getDatabase(): Database.Database;
|
|
108
137
|
getDbPath(): string;
|
|
109
138
|
writeEvent(event: ForgeEvent): void;
|
|
139
|
+
/**
|
|
140
|
+
* 将事件聚合到 sessions 表,供 querySessions 直接读取,避免对 events 做 O(n²)
|
|
141
|
+
* 的 GROUP BY + 相关子查询。
|
|
142
|
+
*
|
|
143
|
+
* 语义:
|
|
144
|
+
* - 首次出现 session_id → 插入一行,start/end/last_event_time 都取当前事件时间戳
|
|
145
|
+
* - 已存在 → event_count += 1,end/last_event_time 取更晚的,first_prompt 只在
|
|
146
|
+
* 原值为 NULL 时才被 UserPromptSubmit 的前 200 字填充(保留"首条"语义)
|
|
147
|
+
* - 非 UserPromptSubmit 事件或 user_prompt 为空时 first_prompt 传 NULL,不会
|
|
148
|
+
* 覆盖已有值
|
|
149
|
+
*/
|
|
150
|
+
upsertSession(event: ForgeEvent): void;
|
|
110
151
|
writeToolEvent(event: ToolEventRecord): number;
|
|
111
152
|
writeDecision(decision: DecisionRecord): number;
|
|
112
153
|
queryEvents(filter: {
|
|
@@ -220,21 +261,32 @@ export declare class SQLiteStorage extends EventEmitter {
|
|
|
220
261
|
methodology_id: string;
|
|
221
262
|
plan_json: string;
|
|
222
263
|
mode?: 'foreground' | 'background';
|
|
264
|
+
trigger_type?: 'manual' | 'idle' | 'scheduled';
|
|
223
265
|
}): number;
|
|
224
|
-
getActiveMethodologyExecution(session_id: string):
|
|
266
|
+
getActiveMethodologyExecution(session_id: string): MethodologyExecutionRow | null;
|
|
225
267
|
updateMethodologyExecution(id: number, data: {
|
|
226
268
|
current_phase_index?: number;
|
|
227
|
-
status?:
|
|
269
|
+
status?: MethodologyExecutionRow['status'];
|
|
228
270
|
completed_at?: number;
|
|
229
271
|
worker_pid?: number | null;
|
|
230
272
|
worker_session_id?: string | null;
|
|
273
|
+
last_progress_at?: number;
|
|
274
|
+
plan_json?: string;
|
|
275
|
+
retry_count?: number;
|
|
231
276
|
}): void;
|
|
232
|
-
getMethodologyExecution(id: number):
|
|
277
|
+
getMethodologyExecution(id: number): MethodologyExecutionRow | null;
|
|
233
278
|
/**
|
|
234
279
|
* List all methodology_executions with status='running' and mode='background'.
|
|
235
280
|
* Used at daemon startup to detect crashed workers (worker_pid not alive).
|
|
236
281
|
*/
|
|
237
|
-
listRunningBackgroundExecutions():
|
|
282
|
+
listRunningBackgroundExecutions(): MethodologyExecutionRow[];
|
|
283
|
+
/**
|
|
284
|
+
* List all methodology_executions with status='running' and mode='foreground'.
|
|
285
|
+
* Used at daemon startup to sweep stale foreground executions — rows left
|
|
286
|
+
* behind when the originating Claude session ended without Stop hook firing
|
|
287
|
+
* (crash / detach / pre-guard legacy data).
|
|
288
|
+
*/
|
|
289
|
+
listRunningForegroundExecutions(): MethodologyExecutionRow[];
|
|
238
290
|
createPhaseExecution(data: {
|
|
239
291
|
methodology_execution_id: number;
|
|
240
292
|
phase_id: string;
|
|
@@ -243,14 +295,50 @@ export declare class SQLiteStorage extends EventEmitter {
|
|
|
243
295
|
prompt: string;
|
|
244
296
|
}): number;
|
|
245
297
|
updatePhaseExecution(id: number, data: {
|
|
246
|
-
status?:
|
|
298
|
+
status?: PhaseExecutionRow['status'];
|
|
247
299
|
completed_at?: number;
|
|
248
300
|
artifacts_json?: string;
|
|
249
301
|
output_text?: string | null;
|
|
250
302
|
error_message?: string | null;
|
|
251
303
|
stream_log_path?: string | null;
|
|
252
304
|
}): void;
|
|
253
|
-
getPhaseExecutions(methodology_execution_id: number):
|
|
305
|
+
getPhaseExecutions(methodology_execution_id: number): PhaseExecutionRow[];
|
|
306
|
+
/**
|
|
307
|
+
* 获取指定 session 和 methodology 的最后一次 idle 触发时间
|
|
308
|
+
*/
|
|
309
|
+
getLastIdleTrigger(session_id: string, methodology_id: string): number | null;
|
|
310
|
+
recordTokenUsage(params: {
|
|
311
|
+
session_id: string;
|
|
312
|
+
methodology_execution_id?: number;
|
|
313
|
+
input_tokens: number;
|
|
314
|
+
output_tokens: number;
|
|
315
|
+
model?: string;
|
|
316
|
+
tool_name?: string;
|
|
317
|
+
}): void;
|
|
318
|
+
getTokenUsageBySession(session_id: string): {
|
|
319
|
+
total_tokens: number;
|
|
320
|
+
input_tokens: number;
|
|
321
|
+
output_tokens: number;
|
|
322
|
+
};
|
|
323
|
+
getTokenUsageByMethodology(methodology_execution_id: number): {
|
|
324
|
+
total_tokens: number;
|
|
325
|
+
input_tokens: number;
|
|
326
|
+
output_tokens: number;
|
|
327
|
+
};
|
|
328
|
+
listTokenUsage(filter?: {
|
|
329
|
+
session_id?: string;
|
|
330
|
+
methodology_execution_id?: number;
|
|
331
|
+
limit?: number;
|
|
332
|
+
}): Array<{
|
|
333
|
+
id: number;
|
|
334
|
+
session_id: string;
|
|
335
|
+
methodology_execution_id: number | null;
|
|
336
|
+
timestamp: number;
|
|
337
|
+
input_tokens: number;
|
|
338
|
+
output_tokens: number;
|
|
339
|
+
total_tokens: number;
|
|
340
|
+
model: string | null;
|
|
341
|
+
tool_name: string | null;
|
|
342
|
+
}>;
|
|
254
343
|
}
|
|
255
|
-
export {};
|
|
256
344
|
//# sourceMappingURL=sqlite.d.ts.map
|