@a5c-ai/genty-runtime 5.1.1-staging.0ad6ac75ae4a
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 +69 -0
- package/dist/apiResult.d.ts +19 -0
- package/dist/apiResult.d.ts.map +1 -0
- package/dist/apiResult.js +16 -0
- package/dist/background/state.d.ts +20 -0
- package/dist/background/state.d.ts.map +1 -0
- package/dist/background/state.js +52 -0
- package/dist/backgroundProcessRegistry.d.ts +124 -0
- package/dist/backgroundProcessRegistry.d.ts.map +1 -0
- package/dist/backgroundProcessRegistry.js +427 -0
- package/dist/cost/claudeCodeParser.d.ts +81 -0
- package/dist/cost/claudeCodeParser.d.ts.map +1 -0
- package/dist/cost/claudeCodeParser.js +232 -0
- package/dist/cost/collector.d.ts +42 -0
- package/dist/cost/collector.d.ts.map +1 -0
- package/dist/cost/collector.js +105 -0
- package/dist/cost/effectCost.d.ts +23 -0
- package/dist/cost/effectCost.d.ts.map +1 -0
- package/dist/cost/effectCost.js +26 -0
- package/dist/cost/index.d.ts +19 -0
- package/dist/cost/index.d.ts.map +1 -0
- package/dist/cost/index.js +39 -0
- package/dist/cost/journal.d.ts +40 -0
- package/dist/cost/journal.d.ts.map +1 -0
- package/dist/cost/journal.js +137 -0
- package/dist/cost/types.d.ts +164 -0
- package/dist/cost/types.d.ts.map +1 -0
- package/dist/cost/types.js +228 -0
- package/dist/daemon/automationExecutor.d.ts +16 -0
- package/dist/daemon/automationExecutor.d.ts.map +1 -0
- package/dist/daemon/automationExecutor.js +222 -0
- package/dist/daemon/config.d.ts +8 -0
- package/dist/daemon/config.d.ts.map +1 -0
- package/dist/daemon/config.js +245 -0
- package/dist/daemon/daemonLog.d.ts +30 -0
- package/dist/daemon/daemonLog.d.ts.map +1 -0
- package/dist/daemon/daemonLog.js +140 -0
- package/dist/daemon/durableQueue.d.ts +41 -0
- package/dist/daemon/durableQueue.d.ts.map +1 -0
- package/dist/daemon/durableQueue.js +183 -0
- package/dist/daemon/fileWatcher.d.ts +9 -0
- package/dist/daemon/fileWatcher.d.ts.map +1 -0
- package/dist/daemon/fileWatcher.js +144 -0
- package/dist/daemon/index.d.ts +15 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +25 -0
- package/dist/daemon/lifecycle.d.ts +13 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +320 -0
- package/dist/daemon/loop.d.ts +27 -0
- package/dist/daemon/loop.d.ts.map +1 -0
- package/dist/daemon/loop.js +387 -0
- package/dist/daemon/timerScheduler.d.ts +13 -0
- package/dist/daemon/timerScheduler.d.ts.map +1 -0
- package/dist/daemon/timerScheduler.js +212 -0
- package/dist/daemon/types.d.ts +122 -0
- package/dist/daemon/types.d.ts.map +1 -0
- package/dist/daemon/types.js +25 -0
- package/dist/daemon/webhookListener.d.ts +6 -0
- package/dist/daemon/webhookListener.d.ts.map +1 -0
- package/dist/daemon/webhookListener.js +132 -0
- package/dist/execution/index.d.ts +10 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +20 -0
- package/dist/execution/modes/docker.d.ts +26 -0
- package/dist/execution/modes/docker.d.ts.map +1 -0
- package/dist/execution/modes/docker.js +183 -0
- package/dist/execution/modes/index.d.ts +10 -0
- package/dist/execution/modes/index.d.ts.map +1 -0
- package/dist/execution/modes/index.js +14 -0
- package/dist/execution/modes/kubernetes.d.ts +46 -0
- package/dist/execution/modes/kubernetes.d.ts.map +1 -0
- package/dist/execution/modes/kubernetes.js +334 -0
- package/dist/execution/modes/local.d.ts +23 -0
- package/dist/execution/modes/local.d.ts.map +1 -0
- package/dist/execution/modes/local.js +117 -0
- package/dist/execution/modes/ssh.d.ts +23 -0
- package/dist/execution/modes/ssh.d.ts.map +1 -0
- package/dist/execution/modes/ssh.js +144 -0
- package/dist/execution/policy.d.ts +15 -0
- package/dist/execution/policy.d.ts.map +1 -0
- package/dist/execution/policy.js +121 -0
- package/dist/execution/provider.d.ts +32 -0
- package/dist/execution/provider.d.ts.map +1 -0
- package/dist/execution/provider.js +90 -0
- package/dist/execution/types.d.ts +189 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +9 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/observability/diagnostics.d.ts +25 -0
- package/dist/observability/diagnostics.d.ts.map +1 -0
- package/dist/observability/diagnostics.js +98 -0
- package/dist/observability/health.d.ts +19 -0
- package/dist/observability/health.d.ts.map +1 -0
- package/dist/observability/health.js +145 -0
- package/dist/observability/index.d.ts +7 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +25 -0
- package/dist/observability/runStatus.d.ts +44 -0
- package/dist/observability/runStatus.d.ts.map +1 -0
- package/dist/observability/runStatus.js +169 -0
- package/dist/observability/timeline.d.ts +11 -0
- package/dist/observability/timeline.d.ts.map +1 -0
- package/dist/observability/timeline.js +176 -0
- package/dist/observability/types.d.ts +65 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +8 -0
- package/dist/observability/webhooks.d.ts +68 -0
- package/dist/observability/webhooks.d.ts.map +1 -0
- package/dist/observability/webhooks.js +132 -0
- package/dist/resources/budget-tracker.d.ts +56 -0
- package/dist/resources/budget-tracker.d.ts.map +1 -0
- package/dist/resources/budget-tracker.js +131 -0
- package/dist/resources/concurrency-guard.d.ts +55 -0
- package/dist/resources/concurrency-guard.d.ts.map +1 -0
- package/dist/resources/concurrency-guard.js +132 -0
- package/dist/resources/index.d.ts +12 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +20 -0
- package/dist/resources/manager.d.ts +52 -0
- package/dist/resources/manager.d.ts.map +1 -0
- package/dist/resources/manager.js +150 -0
- package/dist/resources/timeout-cascade.d.ts +56 -0
- package/dist/resources/timeout-cascade.d.ts.map +1 -0
- package/dist/resources/timeout-cascade.js +145 -0
- package/dist/resources/types.d.ts +130 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +9 -0
- package/dist/rpc/index.d.ts +5 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js +7 -0
- package/dist/rpc/server.d.ts +13 -0
- package/dist/rpc/server.d.ts.map +1 -0
- package/dist/rpc/server.js +64 -0
- package/dist/rpc/server.test.d.ts +2 -0
- package/dist/rpc/server.test.d.ts.map +1 -0
- package/dist/rpc/server.test.js +35 -0
- package/dist/rpc/types.d.ts +23 -0
- package/dist/rpc/types.d.ts.map +1 -0
- package/dist/rpc/types.js +20 -0
- package/dist/session/context.d.ts +22 -0
- package/dist/session/context.d.ts.map +1 -0
- package/dist/session/context.js +113 -0
- package/dist/session/continuityState.d.ts +39 -0
- package/dist/session/continuityState.d.ts.map +1 -0
- package/dist/session/continuityState.js +164 -0
- package/dist/session/cost.d.ts +63 -0
- package/dist/session/cost.d.ts.map +1 -0
- package/dist/session/cost.js +194 -0
- package/dist/session/discovery.d.ts +22 -0
- package/dist/session/discovery.d.ts.map +1 -0
- package/dist/session/discovery.js +35 -0
- package/dist/session/export.d.ts +4 -0
- package/dist/session/export.d.ts.map +1 -0
- package/dist/session/export.js +56 -0
- package/dist/session/export.test.d.ts +2 -0
- package/dist/session/export.test.d.ts.map +1 -0
- package/dist/session/export.test.js +42 -0
- package/dist/session/history.d.ts +30 -0
- package/dist/session/history.d.ts.map +1 -0
- package/dist/session/history.js +143 -0
- package/dist/session/index.d.ts +20 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +78 -0
- package/dist/session/memoryExtraction.d.ts +65 -0
- package/dist/session/memoryExtraction.d.ts.map +1 -0
- package/dist/session/memoryExtraction.js +201 -0
- package/dist/session/parse.d.ts +45 -0
- package/dist/session/parse.d.ts.map +1 -0
- package/dist/session/parse.js +170 -0
- package/dist/session/persistence.d.ts +46 -0
- package/dist/session/persistence.d.ts.map +1 -0
- package/dist/session/persistence.js +180 -0
- package/dist/session/tree.d.ts +29 -0
- package/dist/session/tree.d.ts.map +1 -0
- package/dist/session/tree.js +115 -0
- package/dist/session/tree.test.d.ts +2 -0
- package/dist/session/tree.test.d.ts.map +1 -0
- package/dist/session/tree.test.js +75 -0
- package/dist/session/types.d.ts +267 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +45 -0
- package/dist/session/write.d.ts +61 -0
- package/dist/session/write.d.ts.map +1 -0
- package/dist/session/write.js +213 -0
- package/dist/shellInvocation.d.ts +6 -0
- package/dist/shellInvocation.d.ts.map +1 -0
- package/dist/shellInvocation.js +8 -0
- package/dist/shellInvocation.test.d.ts +2 -0
- package/dist/shellInvocation.test.d.ts.map +1 -0
- package/dist/shellInvocation.test.js +18 -0
- package/dist/telemetry/audit-log.d.ts +56 -0
- package/dist/telemetry/audit-log.d.ts.map +1 -0
- package/dist/telemetry/audit-log.js +59 -0
- package/dist/telemetry/exporters.d.ts +35 -0
- package/dist/telemetry/exporters.d.ts.map +1 -0
- package/dist/telemetry/exporters.js +141 -0
- package/dist/telemetry/index.d.ts +12 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +25 -0
- package/dist/telemetry/provider.d.ts +57 -0
- package/dist/telemetry/provider.d.ts.map +1 -0
- package/dist/telemetry/provider.js +261 -0
- package/dist/telemetry/span-tree.d.ts +46 -0
- package/dist/telemetry/span-tree.d.ts.map +1 -0
- package/dist/telemetry/span-tree.js +93 -0
- package/dist/telemetry/traceContext.d.ts +10 -0
- package/dist/telemetry/traceContext.d.ts.map +1 -0
- package/dist/telemetry/traceContext.js +43 -0
- package/dist/telemetry/types.d.ts +109 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +21 -0
- package/package.json +137 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RpcServer = void 0;
|
|
4
|
+
const node_readline_1 = require("node:readline");
|
|
5
|
+
class RpcServer {
|
|
6
|
+
handlers = new Map();
|
|
7
|
+
running = false;
|
|
8
|
+
register(method, handler) {
|
|
9
|
+
this.handlers.set(method, handler);
|
|
10
|
+
}
|
|
11
|
+
emit(event, data) {
|
|
12
|
+
const msg = { event, data, timestamp: new Date().toISOString() };
|
|
13
|
+
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
14
|
+
}
|
|
15
|
+
async start() {
|
|
16
|
+
this.running = true;
|
|
17
|
+
const rl = (0, node_readline_1.createInterface)({ input: process.stdin, terminal: false });
|
|
18
|
+
this.emit('server.ready', { methods: [...this.handlers.keys()] });
|
|
19
|
+
for await (const line of rl) {
|
|
20
|
+
if (!this.running)
|
|
21
|
+
break;
|
|
22
|
+
if (!line.trim())
|
|
23
|
+
continue;
|
|
24
|
+
let request;
|
|
25
|
+
try {
|
|
26
|
+
request = JSON.parse(line);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
this.sendError('parse-error', -32700, 'Parse error');
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (!request.id || !request.method) {
|
|
33
|
+
this.sendError(request.id ?? 'unknown', -32600, 'Invalid request: missing id or method');
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const handler = this.handlers.get(request.method);
|
|
37
|
+
if (!handler) {
|
|
38
|
+
this.sendError(request.id, -32601, `Method not found: ${request.method}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const result = await handler(request.params ?? {});
|
|
43
|
+
this.sendResult(request.id, result);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
47
|
+
this.sendError(request.id, -32000, message);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
stop() {
|
|
52
|
+
this.running = false;
|
|
53
|
+
this.emit('server.shutdown', {});
|
|
54
|
+
}
|
|
55
|
+
sendResult(id, result) {
|
|
56
|
+
const response = { id, result };
|
|
57
|
+
process.stdout.write(JSON.stringify(response) + '\n');
|
|
58
|
+
}
|
|
59
|
+
sendError(id, code, message, data) {
|
|
60
|
+
const response = { id, error: { code, message, data } };
|
|
61
|
+
process.stdout.write(JSON.stringify(response) + '\n');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.RpcServer = RpcServer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../src/rpc/server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const server_js_1 = require("./server.js");
|
|
5
|
+
(0, vitest_1.describe)('rpc/server', () => {
|
|
6
|
+
let stdoutWrites;
|
|
7
|
+
(0, vitest_1.beforeEach)(() => {
|
|
8
|
+
stdoutWrites = [];
|
|
9
|
+
vitest_1.vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
10
|
+
stdoutWrites.push(typeof chunk === 'string' ? chunk : chunk.toString());
|
|
11
|
+
return true;
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.it)('registers and calls a handler', async () => {
|
|
15
|
+
const server = new server_js_1.RpcServer();
|
|
16
|
+
server.register('health', async () => ({ status: 'ok' }));
|
|
17
|
+
(0, vitest_1.expect)(server['handlers'].has('health')).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.it)('emits events as JSONL to stdout', () => {
|
|
20
|
+
const server = new server_js_1.RpcServer();
|
|
21
|
+
server.emit('test.event', { key: 'value' });
|
|
22
|
+
(0, vitest_1.expect)(stdoutWrites).toHaveLength(1);
|
|
23
|
+
const parsed = JSON.parse(stdoutWrites[0]);
|
|
24
|
+
(0, vitest_1.expect)(parsed.event).toBe('test.event');
|
|
25
|
+
(0, vitest_1.expect)(parsed.data.key).toBe('value');
|
|
26
|
+
(0, vitest_1.expect)(parsed.timestamp).toBeTruthy();
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('stop emits shutdown event', () => {
|
|
29
|
+
const server = new server_js_1.RpcServer();
|
|
30
|
+
server.stop();
|
|
31
|
+
(0, vitest_1.expect)(stdoutWrites).toHaveLength(1);
|
|
32
|
+
const parsed = JSON.parse(stdoutWrites[0]);
|
|
33
|
+
(0, vitest_1.expect)(parsed.event).toBe('server.shutdown');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface RpcRequest {
|
|
2
|
+
id: string;
|
|
3
|
+
method: string;
|
|
4
|
+
params?: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface RpcResponse {
|
|
7
|
+
id: string;
|
|
8
|
+
result?: unknown;
|
|
9
|
+
error?: {
|
|
10
|
+
code: number;
|
|
11
|
+
message: string;
|
|
12
|
+
data?: unknown;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface RpcEvent {
|
|
16
|
+
event: string;
|
|
17
|
+
data: unknown;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
}
|
|
20
|
+
export type RpcMessage = RpcRequest | RpcResponse | RpcEvent;
|
|
21
|
+
export declare const RPC_METHODS: readonly ["session.create", "session.send", "session.getHistory", "session.fork", "session.list", "model.switch", "model.list", "tool.call", "tool.list", "extension.list", "extension.activate", "run.create", "run.iterate", "run.status", "health"];
|
|
22
|
+
export type RpcMethod = (typeof RPC_METHODS)[number];
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rpc/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3D;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE7D,eAAO,MAAM,WAAW,wPAgBd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RPC_METHODS = void 0;
|
|
4
|
+
exports.RPC_METHODS = [
|
|
5
|
+
'session.create',
|
|
6
|
+
'session.send',
|
|
7
|
+
'session.getHistory',
|
|
8
|
+
'session.fork',
|
|
9
|
+
'session.list',
|
|
10
|
+
'model.switch',
|
|
11
|
+
'model.list',
|
|
12
|
+
'tool.call',
|
|
13
|
+
'tool.list',
|
|
14
|
+
'extension.list',
|
|
15
|
+
'extension.activate',
|
|
16
|
+
'run.create',
|
|
17
|
+
'run.iterate',
|
|
18
|
+
'run.status',
|
|
19
|
+
'health',
|
|
20
|
+
];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session context persistence for cross-run knowledge sharing (GAP-SESSION-001).
|
|
3
|
+
* Stores accumulated notes and shared knowledge as a JSON file alongside the session state file.
|
|
4
|
+
*/
|
|
5
|
+
import type { SessionContext } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Get the file path for a session's context JSON file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getSessionContextPath(stateDir: string, sessionId: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Read session context from disk.
|
|
12
|
+
* Returns empty context if the file does not exist.
|
|
13
|
+
* Logs a warning and returns empty context if the file is corrupt.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getSessionContext(stateDir: string, sessionId: string): Promise<SessionContext>;
|
|
16
|
+
/**
|
|
17
|
+
* Update session context by merging new data with existing context.
|
|
18
|
+
* Notes are appended; sharedKnowledge keys are merged (newer values win).
|
|
19
|
+
* Uses atomic temp-file + rename pattern to prevent partial writes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function updateSessionContext(stateDir: string, sessionId: string, updates: Partial<SessionContext>): Promise<SessionContext>;
|
|
22
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/session/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAQD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA4BpG;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC,CAoBzB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session context persistence for cross-run knowledge sharing (GAP-SESSION-001).
|
|
4
|
+
* Stores accumulated notes and shared knowledge as a JSON file alongside the session state file.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.getSessionContextPath = getSessionContextPath;
|
|
41
|
+
exports.getSessionContext = getSessionContext;
|
|
42
|
+
exports.updateSessionContext = updateSessionContext;
|
|
43
|
+
const node_fs_1 = require("node:fs");
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
/**
|
|
46
|
+
* Get the file path for a session's context JSON file.
|
|
47
|
+
*/
|
|
48
|
+
function getSessionContextPath(stateDir, sessionId) {
|
|
49
|
+
return `${stateDir}/${sessionId}.context.json`;
|
|
50
|
+
}
|
|
51
|
+
const EMPTY_CONTEXT = {
|
|
52
|
+
notes: [],
|
|
53
|
+
sharedKnowledge: {},
|
|
54
|
+
worktree: undefined,
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Read session context from disk.
|
|
58
|
+
* Returns empty context if the file does not exist.
|
|
59
|
+
* Logs a warning and returns empty context if the file is corrupt.
|
|
60
|
+
*/
|
|
61
|
+
async function getSessionContext(stateDir, sessionId) {
|
|
62
|
+
const filePath = getSessionContextPath(stateDir, sessionId);
|
|
63
|
+
let raw;
|
|
64
|
+
try {
|
|
65
|
+
raw = await node_fs_1.promises.readFile(filePath, 'utf8');
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const err = error;
|
|
69
|
+
if (err.code === 'ENOENT') {
|
|
70
|
+
return { ...EMPTY_CONTEXT, sharedKnowledge: {} };
|
|
71
|
+
}
|
|
72
|
+
// Unexpected FS error — return empty rather than crash
|
|
73
|
+
return { ...EMPTY_CONTEXT, sharedKnowledge: {} };
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const data = JSON.parse(raw);
|
|
77
|
+
return {
|
|
78
|
+
notes: Array.isArray(data.notes) ? data.notes : [],
|
|
79
|
+
sharedKnowledge: data.sharedKnowledge && typeof data.sharedKnowledge === 'object'
|
|
80
|
+
? data.sharedKnowledge
|
|
81
|
+
: {},
|
|
82
|
+
worktree: data.worktree && typeof data.worktree === 'object'
|
|
83
|
+
? data.worktree
|
|
84
|
+
: undefined,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Corrupt JSON — return empty context rather than crash
|
|
89
|
+
return { ...EMPTY_CONTEXT, sharedKnowledge: {} };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Update session context by merging new data with existing context.
|
|
94
|
+
* Notes are appended; sharedKnowledge keys are merged (newer values win).
|
|
95
|
+
* Uses atomic temp-file + rename pattern to prevent partial writes.
|
|
96
|
+
*/
|
|
97
|
+
async function updateSessionContext(stateDir, sessionId, updates) {
|
|
98
|
+
const existing = await getSessionContext(stateDir, sessionId);
|
|
99
|
+
const merged = {
|
|
100
|
+
notes: updates.notes ? [...existing.notes, ...updates.notes] : existing.notes,
|
|
101
|
+
sharedKnowledge: updates.sharedKnowledge
|
|
102
|
+
? { ...existing.sharedKnowledge, ...updates.sharedKnowledge }
|
|
103
|
+
: existing.sharedKnowledge,
|
|
104
|
+
worktree: updates.worktree ? { ...(existing.worktree ?? {}), ...updates.worktree } : existing.worktree,
|
|
105
|
+
};
|
|
106
|
+
const filePath = getSessionContextPath(stateDir, sessionId);
|
|
107
|
+
const dir = path.dirname(filePath);
|
|
108
|
+
const tempPath = `${filePath}.tmp.${process.pid}`;
|
|
109
|
+
await node_fs_1.promises.mkdir(dir, { recursive: true });
|
|
110
|
+
await node_fs_1.promises.writeFile(tempPath, JSON.stringify(merged), 'utf8');
|
|
111
|
+
await node_fs_1.promises.rename(tempPath, filePath);
|
|
112
|
+
return merged;
|
|
113
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GAP-PERF-008: Structured Continuity State.
|
|
3
|
+
*
|
|
4
|
+
* Structured state that persists across session compaction. Captures
|
|
5
|
+
* key decisions, current phase, and working context for seamless
|
|
6
|
+
* resume after context compression.
|
|
7
|
+
*/
|
|
8
|
+
export interface ContinuityPhase {
|
|
9
|
+
name: string;
|
|
10
|
+
startedAt: string;
|
|
11
|
+
description: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ContinuityDecision {
|
|
14
|
+
key: string;
|
|
15
|
+
value: string;
|
|
16
|
+
rationale?: string;
|
|
17
|
+
madeAt: string;
|
|
18
|
+
runId?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ContinuityWorkingContext {
|
|
21
|
+
focus: string;
|
|
22
|
+
blockers: string[];
|
|
23
|
+
nextSteps: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface ContinuityState {
|
|
26
|
+
schemaVersion: string;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
currentPhase: ContinuityPhase | null;
|
|
29
|
+
decisions: ContinuityDecision[];
|
|
30
|
+
workingContext: ContinuityWorkingContext;
|
|
31
|
+
}
|
|
32
|
+
export declare const CONTINUITY_STATE_SCHEMA_VERSION = "2026.01.continuity-state-v1";
|
|
33
|
+
export declare function getContinuityStatePath(stateDir: string, sessionId: string): string;
|
|
34
|
+
export declare function getContinuityState(stateDir: string, sessionId: string): Promise<ContinuityState>;
|
|
35
|
+
export declare function setCurrentPhase(stateDir: string, sessionId: string, phase: Omit<ContinuityPhase, "startedAt">): Promise<void>;
|
|
36
|
+
export declare function upsertDecision(stateDir: string, sessionId: string, decision: Omit<ContinuityDecision, "madeAt">): Promise<void>;
|
|
37
|
+
export declare function updateWorkingContext(stateDir: string, sessionId: string, updates: Partial<ContinuityWorkingContext>): Promise<void>;
|
|
38
|
+
export declare function buildContinuityResumePrompt(stateDir: string, sessionId: string): Promise<string>;
|
|
39
|
+
//# sourceMappingURL=continuityState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continuityState.d.ts","sourceRoot":"","sources":["../../src/session/continuityState.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,cAAc,EAAE,wBAAwB,CAAC;CAC1C;AAMD,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAiD7E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEtG;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GAP-PERF-008: Structured Continuity State.
|
|
4
|
+
*
|
|
5
|
+
* Structured state that persists across session compaction. Captures
|
|
6
|
+
* key decisions, current phase, and working context for seamless
|
|
7
|
+
* resume after context compression.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.CONTINUITY_STATE_SCHEMA_VERSION = void 0;
|
|
44
|
+
exports.getContinuityStatePath = getContinuityStatePath;
|
|
45
|
+
exports.getContinuityState = getContinuityState;
|
|
46
|
+
exports.setCurrentPhase = setCurrentPhase;
|
|
47
|
+
exports.upsertDecision = upsertDecision;
|
|
48
|
+
exports.updateWorkingContext = updateWorkingContext;
|
|
49
|
+
exports.buildContinuityResumePrompt = buildContinuityResumePrompt;
|
|
50
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
51
|
+
const path = __importStar(require("node:path"));
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Constants
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
exports.CONTINUITY_STATE_SCHEMA_VERSION = "2026.01.continuity-state-v1";
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Internal helpers
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
function emptyContinuityState() {
|
|
60
|
+
return {
|
|
61
|
+
schemaVersion: exports.CONTINUITY_STATE_SCHEMA_VERSION,
|
|
62
|
+
updatedAt: new Date().toISOString(),
|
|
63
|
+
currentPhase: null,
|
|
64
|
+
decisions: [],
|
|
65
|
+
workingContext: { focus: "", blockers: [], nextSteps: [] },
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function readRaw(filePath) {
|
|
69
|
+
let raw;
|
|
70
|
+
try {
|
|
71
|
+
raw = await fs.readFile(filePath, "utf8");
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return emptyContinuityState();
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const data = JSON.parse(raw);
|
|
78
|
+
return {
|
|
79
|
+
schemaVersion: typeof data.schemaVersion === "string" ? data.schemaVersion : exports.CONTINUITY_STATE_SCHEMA_VERSION,
|
|
80
|
+
updatedAt: typeof data.updatedAt === "string" ? data.updatedAt : new Date().toISOString(),
|
|
81
|
+
currentPhase: data.currentPhase ?? null,
|
|
82
|
+
decisions: Array.isArray(data.decisions) ? data.decisions : [],
|
|
83
|
+
workingContext: data.workingContext ?? { focus: "", blockers: [], nextSteps: [] },
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return emptyContinuityState();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function writeRaw(filePath, data) {
|
|
91
|
+
const dir = path.dirname(filePath);
|
|
92
|
+
const tempPath = `${filePath}.tmp.${process.pid}`;
|
|
93
|
+
await fs.mkdir(dir, { recursive: true });
|
|
94
|
+
await fs.writeFile(tempPath, JSON.stringify(data, null, 2), "utf8");
|
|
95
|
+
await fs.rename(tempPath, filePath);
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Public API
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
function getContinuityStatePath(stateDir, sessionId) {
|
|
101
|
+
return path.join(stateDir, `${sessionId}.continuity.json`);
|
|
102
|
+
}
|
|
103
|
+
async function getContinuityState(stateDir, sessionId) {
|
|
104
|
+
return readRaw(getContinuityStatePath(stateDir, sessionId));
|
|
105
|
+
}
|
|
106
|
+
async function setCurrentPhase(stateDir, sessionId, phase) {
|
|
107
|
+
const filePath = getContinuityStatePath(stateDir, sessionId);
|
|
108
|
+
const state = await readRaw(filePath);
|
|
109
|
+
state.currentPhase = { ...phase, startedAt: new Date().toISOString() };
|
|
110
|
+
state.updatedAt = new Date().toISOString();
|
|
111
|
+
await writeRaw(filePath, state);
|
|
112
|
+
}
|
|
113
|
+
async function upsertDecision(stateDir, sessionId, decision) {
|
|
114
|
+
const filePath = getContinuityStatePath(stateDir, sessionId);
|
|
115
|
+
const state = await readRaw(filePath);
|
|
116
|
+
const existing = state.decisions.findIndex((d) => d.key === decision.key);
|
|
117
|
+
const entry = { ...decision, madeAt: new Date().toISOString() };
|
|
118
|
+
if (existing >= 0) {
|
|
119
|
+
state.decisions[existing] = entry;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
state.decisions.push(entry);
|
|
123
|
+
}
|
|
124
|
+
state.updatedAt = new Date().toISOString();
|
|
125
|
+
await writeRaw(filePath, state);
|
|
126
|
+
}
|
|
127
|
+
async function updateWorkingContext(stateDir, sessionId, updates) {
|
|
128
|
+
const filePath = getContinuityStatePath(stateDir, sessionId);
|
|
129
|
+
const state = await readRaw(filePath);
|
|
130
|
+
if (updates.focus !== undefined)
|
|
131
|
+
state.workingContext.focus = updates.focus;
|
|
132
|
+
if (updates.blockers !== undefined)
|
|
133
|
+
state.workingContext.blockers = updates.blockers;
|
|
134
|
+
if (updates.nextSteps !== undefined)
|
|
135
|
+
state.workingContext.nextSteps = updates.nextSteps;
|
|
136
|
+
state.updatedAt = new Date().toISOString();
|
|
137
|
+
await writeRaw(filePath, state);
|
|
138
|
+
}
|
|
139
|
+
async function buildContinuityResumePrompt(stateDir, sessionId) {
|
|
140
|
+
const state = await getContinuityState(stateDir, sessionId);
|
|
141
|
+
const sections = [];
|
|
142
|
+
if (state.currentPhase) {
|
|
143
|
+
sections.push(`## Current Phase: ${state.currentPhase.name}\n${state.currentPhase.description}`);
|
|
144
|
+
}
|
|
145
|
+
if (state.decisions.length > 0) {
|
|
146
|
+
const items = state.decisions.map((d) => {
|
|
147
|
+
const rationale = d.rationale ? ` (${d.rationale})` : "";
|
|
148
|
+
return `- **${d.key}**: ${d.value}${rationale}`;
|
|
149
|
+
});
|
|
150
|
+
sections.push(`## Key Decisions\n${items.join("\n")}`);
|
|
151
|
+
}
|
|
152
|
+
const wc = state.workingContext;
|
|
153
|
+
if (wc.focus || wc.blockers.length > 0 || wc.nextSteps.length > 0) {
|
|
154
|
+
const parts = [];
|
|
155
|
+
if (wc.focus)
|
|
156
|
+
parts.push(`**Focus**: ${wc.focus}`);
|
|
157
|
+
if (wc.blockers.length > 0)
|
|
158
|
+
parts.push(`**Blockers**: ${wc.blockers.join(", ")}`);
|
|
159
|
+
if (wc.nextSteps.length > 0)
|
|
160
|
+
parts.push(`**Next Steps**: ${wc.nextSteps.join(", ")}`);
|
|
161
|
+
sections.push(`## Working Context\n${parts.join("\n")}`);
|
|
162
|
+
}
|
|
163
|
+
return sections.length > 0 ? sections.join("\n\n") : "";
|
|
164
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GAP-SESSION-004: Session-Level Cost Tracking and Budgets.
|
|
3
|
+
*
|
|
4
|
+
* Aggregates cost data from runs within a session. Supports configurable
|
|
5
|
+
* budgets with threshold alerts and auto-pause.
|
|
6
|
+
* Uses the same atomic temp-file + rename pattern as context.ts.
|
|
7
|
+
*/
|
|
8
|
+
export interface SessionBudget {
|
|
9
|
+
/** Maximum cost in USD. 0 = unlimited. */
|
|
10
|
+
maxCostUsd: number;
|
|
11
|
+
/** Alert threshold percentages (default: [50, 80, 100]). */
|
|
12
|
+
alertThresholds: number[];
|
|
13
|
+
/** Whether to auto-pause orchestration when budget exceeded. */
|
|
14
|
+
autoPause: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface SessionCostState {
|
|
17
|
+
totalCostUsd: number;
|
|
18
|
+
totalInputTokens: number;
|
|
19
|
+
totalOutputTokens: number;
|
|
20
|
+
runCosts: Array<{
|
|
21
|
+
runId: string;
|
|
22
|
+
costUsd: number;
|
|
23
|
+
inputTokens: number;
|
|
24
|
+
outputTokens: number;
|
|
25
|
+
}>;
|
|
26
|
+
budget?: SessionBudget;
|
|
27
|
+
triggeredThresholds: number[];
|
|
28
|
+
paused: boolean;
|
|
29
|
+
lastUpdatedAt: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SessionBudgetAlert {
|
|
32
|
+
thresholdPct: number;
|
|
33
|
+
currentCostUsd: number;
|
|
34
|
+
budgetUsd: number;
|
|
35
|
+
currentPct: number;
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
export interface BudgetCheckResult {
|
|
39
|
+
exceeded: boolean;
|
|
40
|
+
alerts: SessionBudgetAlert[];
|
|
41
|
+
shouldPause: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface RunCostUpdate {
|
|
44
|
+
runId: string;
|
|
45
|
+
costUsd: number;
|
|
46
|
+
inputTokens: number;
|
|
47
|
+
outputTokens: number;
|
|
48
|
+
}
|
|
49
|
+
export declare function getSessionCostPath(stateDir: string, sessionId: string): string;
|
|
50
|
+
export declare function getSessionCost(stateDir: string, sessionId: string): Promise<SessionCostState>;
|
|
51
|
+
export declare function updateSessionCost(stateDir: string, sessionId: string, update: RunCostUpdate): Promise<SessionCostState>;
|
|
52
|
+
export declare function setSessionBudget(stateDir: string, sessionId: string, budget: SessionBudget): Promise<SessionCostState>;
|
|
53
|
+
/**
|
|
54
|
+
* Pure function: evaluate budget thresholds against current cost.
|
|
55
|
+
* Returns new alerts (excluding already-triggered thresholds).
|
|
56
|
+
*/
|
|
57
|
+
export declare function checkBudget(costState: SessionCostState): BudgetCheckResult;
|
|
58
|
+
/**
|
|
59
|
+
* Persist triggered thresholds back to cost state after checkBudget produces alerts.
|
|
60
|
+
* Call this after processing alerts to prevent re-triggering.
|
|
61
|
+
*/
|
|
62
|
+
export declare function markThresholdsTriggered(stateDir: string, sessionId: string, thresholds: number[]): Promise<void>;
|
|
63
|
+
//# sourceMappingURL=cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/session/cost.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAwDD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEnG;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAO3B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,gBAAgB,GAAG,iBAAiB,CA2B1E;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CASf"}
|