@theihtisham/agent-shadow-brain 7.1.4 → 7.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +478 -462
- package/README.md +97 -24
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/auto-update.js.map +1 -1
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/brain-portability.js.map +1 -1
- package/dist/brain/client-integrations.js +1 -1
- package/dist/brain/client-integrations.js.map +1 -1
- package/dist/brain/context-assembly.d.ts +10 -0
- package/dist/brain/context-assembly.d.ts.map +1 -1
- package/dist/brain/context-assembly.js +15 -6
- package/dist/brain/context-assembly.js.map +1 -1
- package/dist/brain/context-efficiency.d.ts +48 -0
- package/dist/brain/context-efficiency.d.ts.map +1 -0
- package/dist/brain/context-efficiency.js +34 -0
- package/dist/brain/context-efficiency.js.map +1 -0
- package/dist/brain/context-request.d.ts +1 -1
- package/dist/brain/context-request.d.ts.map +1 -1
- package/dist/brain/context-request.js +4 -2
- package/dist/brain/context-request.js.map +1 -1
- package/dist/brain/context-retrieval.d.ts +1 -1
- package/dist/brain/context-retrieval.d.ts.map +1 -1
- package/dist/brain/context-retrieval.js +2 -1
- package/dist/brain/context-retrieval.js.map +1 -1
- package/dist/brain/feature-settings.d.ts +5 -0
- package/dist/brain/feature-settings.d.ts.map +1 -1
- package/dist/brain/feature-settings.js +8 -2
- package/dist/brain/feature-settings.js.map +1 -1
- package/dist/brain/global-brain.d.ts +1 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +1 -0
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/managed-project-skills.d.ts +48 -0
- package/dist/brain/managed-project-skills.d.ts.map +1 -0
- package/dist/brain/managed-project-skills.js +230 -0
- package/dist/brain/managed-project-skills.js.map +1 -0
- package/dist/brain/mcp-presence.d.ts +50 -0
- package/dist/brain/mcp-presence.d.ts.map +1 -0
- package/dist/brain/mcp-presence.js +214 -0
- package/dist/brain/mcp-presence.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +12 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +177 -31
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/mcp-stdio.d.ts +1 -1
- package/dist/brain/mcp-stdio.d.ts.map +1 -1
- package/dist/brain/mcp-stdio.js +19 -1
- package/dist/brain/mcp-stdio.js.map +1 -1
- package/dist/brain/memory-annotations.d.ts +2 -0
- package/dist/brain/memory-annotations.d.ts.map +1 -1
- package/dist/brain/memory-annotations.js +13 -0
- package/dist/brain/memory-annotations.js.map +1 -1
- package/dist/brain/memory-inspection.d.ts +1 -0
- package/dist/brain/memory-inspection.d.ts.map +1 -1
- package/dist/brain/memory-inspection.js +1 -1
- package/dist/brain/memory-inspection.js.map +1 -1
- package/dist/brain/memory-mcp-content.d.ts +4 -2
- package/dist/brain/memory-mcp-content.d.ts.map +1 -1
- package/dist/brain/memory-mcp-content.js +20 -16
- package/dist/brain/memory-mcp-content.js.map +1 -1
- package/dist/brain/model-registry.d.ts +4 -5
- package/dist/brain/model-registry.d.ts.map +1 -1
- package/dist/brain/model-registry.js +22 -207
- package/dist/brain/model-registry.js.map +1 -1
- package/dist/brain/model-usage.d.ts +66 -0
- package/dist/brain/model-usage.d.ts.map +1 -0
- package/dist/brain/model-usage.js +246 -0
- package/dist/brain/model-usage.js.map +1 -0
- package/dist/brain/native-codex.d.ts +105 -0
- package/dist/brain/native-codex.d.ts.map +1 -0
- package/dist/brain/native-codex.js +292 -0
- package/dist/brain/native-codex.js.map +1 -0
- package/dist/brain/native-session-import.d.ts +56 -0
- package/dist/brain/native-session-import.d.ts.map +1 -0
- package/dist/brain/native-session-import.js +307 -0
- package/dist/brain/native-session-import.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/orchestrator.js.map +1 -1
- package/dist/brain/project-feedback.d.ts +1 -1
- package/dist/brain/project-feedback.d.ts.map +1 -1
- package/dist/brain/project-feedback.js +19 -8
- package/dist/brain/project-feedback.js.map +1 -1
- package/dist/brain/project-hub-contract.d.ts +6 -0
- package/dist/brain/project-hub-contract.d.ts.map +1 -1
- package/dist/brain/project-hub-contract.js +2 -1
- package/dist/brain/project-hub-contract.js.map +1 -1
- package/dist/brain/project-hub-mcp.d.ts +14 -0
- package/dist/brain/project-hub-mcp.d.ts.map +1 -1
- package/dist/brain/project-hub-mcp.js +6 -1
- package/dist/brain/project-hub-mcp.js.map +1 -1
- package/dist/brain/project-hub-store.d.ts +14 -2
- package/dist/brain/project-hub-store.d.ts.map +1 -1
- package/dist/brain/project-hub-store.js +70 -2
- package/dist/brain/project-hub-store.js.map +1 -1
- package/dist/brain/project-hub.d.ts +5 -0
- package/dist/brain/project-hub.d.ts.map +1 -1
- package/dist/brain/project-hub.js +23 -1
- package/dist/brain/project-hub.js.map +1 -1
- package/dist/brain/project-kit.d.ts +10 -0
- package/dist/brain/project-kit.d.ts.map +1 -1
- package/dist/brain/project-kit.js +80 -16
- package/dist/brain/project-kit.js.map +1 -1
- package/dist/brain/project-policy-delivery.d.ts +8 -0
- package/dist/brain/project-policy-delivery.d.ts.map +1 -0
- package/dist/brain/project-policy-delivery.js +38 -0
- package/dist/brain/project-policy-delivery.js.map +1 -0
- package/dist/brain/project-policy.d.ts +88 -0
- package/dist/brain/project-policy.d.ts.map +1 -0
- package/dist/brain/project-policy.js +267 -0
- package/dist/brain/project-policy.js.map +1 -0
- package/dist/brain/project-session-contract.d.ts +180 -0
- package/dist/brain/project-session-contract.d.ts.map +1 -0
- package/dist/brain/project-session-contract.js +50 -0
- package/dist/brain/project-session-contract.js.map +1 -0
- package/dist/brain/project-session-mcp.d.ts +145 -0
- package/dist/brain/project-session-mcp.d.ts.map +1 -0
- package/dist/brain/project-session-mcp.js +58 -0
- package/dist/brain/project-session-mcp.js.map +1 -0
- package/dist/brain/project-sessions.d.ts +97 -0
- package/dist/brain/project-sessions.d.ts.map +1 -0
- package/dist/brain/project-sessions.js +223 -0
- package/dist/brain/project-sessions.js.map +1 -0
- package/dist/brain/project-source-contract.d.ts +109 -0
- package/dist/brain/project-source-contract.d.ts.map +1 -0
- package/dist/brain/project-source-contract.js +2 -0
- package/dist/brain/project-source-contract.js.map +1 -0
- package/dist/brain/project-source-intake.d.ts +26 -0
- package/dist/brain/project-source-intake.d.ts.map +1 -0
- package/dist/brain/project-source-intake.js +457 -0
- package/dist/brain/project-source-intake.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/context-cli.d.ts.map +1 -1
- package/dist/context-cli.js +9 -3
- package/dist/context-cli.js.map +1 -1
- package/dist/dashboard/brain-hub-actions.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-actions.js +232 -135
- package/dist/dashboard/brain-hub-actions.js.map +1 -1
- package/dist/dashboard/brain-hub-agent-dock.d.ts +2 -0
- package/dist/dashboard/brain-hub-agent-dock.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-agent-dock.js +255 -0
- package/dist/dashboard/brain-hub-agent-dock.js.map +1 -0
- package/dist/dashboard/brain-hub-brand-icons.d.ts +2 -0
- package/dist/dashboard/brain-hub-brand-icons.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-brand-icons.js +9 -0
- package/dist/dashboard/brain-hub-brand-icons.js.map +1 -0
- package/dist/dashboard/brain-hub-client.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-client.js +433 -333
- package/dist/dashboard/brain-hub-client.js.map +1 -1
- package/dist/dashboard/brain-hub-context.d.ts +2 -0
- package/dist/dashboard/brain-hub-context.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-context.js +37 -0
- package/dist/dashboard/brain-hub-context.js.map +1 -0
- package/dist/dashboard/brain-hub-controls.d.ts +2 -0
- package/dist/dashboard/brain-hub-controls.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-controls.js +63 -0
- package/dist/dashboard/brain-hub-controls.js.map +1 -0
- package/dist/dashboard/brain-hub-exchanges.d.ts +2 -0
- package/dist/dashboard/brain-hub-exchanges.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-exchanges.js +82 -0
- package/dist/dashboard/brain-hub-exchanges.js.map +1 -0
- package/dist/dashboard/brain-hub-graph.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-graph.js +236 -74
- package/dist/dashboard/brain-hub-graph.js.map +1 -1
- package/dist/dashboard/brain-hub-html.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-html.js +56 -1
- package/dist/dashboard/brain-hub-html.js.map +1 -1
- package/dist/dashboard/brain-hub-knowledge.d.ts +2 -0
- package/dist/dashboard/brain-hub-knowledge.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-knowledge.js +33 -0
- package/dist/dashboard/brain-hub-knowledge.js.map +1 -0
- package/dist/dashboard/brain-hub-live.d.ts +2 -0
- package/dist/dashboard/brain-hub-live.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-live.js +151 -0
- package/dist/dashboard/brain-hub-live.js.map +1 -0
- package/dist/dashboard/brain-hub-managed-skills.d.ts +2 -0
- package/dist/dashboard/brain-hub-managed-skills.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-managed-skills.js +20 -0
- package/dist/dashboard/brain-hub-managed-skills.js.map +1 -0
- package/dist/dashboard/brain-hub-native.d.ts +2 -0
- package/dist/dashboard/brain-hub-native.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-native.js +44 -0
- package/dist/dashboard/brain-hub-native.js.map +1 -0
- package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-project-views.js +78 -77
- package/dist/dashboard/brain-hub-project-views.js.map +1 -1
- package/dist/dashboard/brain-hub-sessions.d.ts +2 -0
- package/dist/dashboard/brain-hub-sessions.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-sessions.js +40 -0
- package/dist/dashboard/brain-hub-sessions.js.map +1 -0
- package/dist/dashboard/brain-hub-usage.d.ts +2 -0
- package/dist/dashboard/brain-hub-usage.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-usage.js +28 -0
- package/dist/dashboard/brain-hub-usage.js.map +1 -0
- package/dist/dashboard/brain-hub-views.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-views.js +151 -146
- package/dist/dashboard/brain-hub-views.js.map +1 -1
- package/dist/dashboard/live-workspace-html.js +1039 -1039
- package/dist/dashboard/managed-project-skills-api.d.ts +29 -0
- package/dist/dashboard/managed-project-skills-api.d.ts.map +1 -0
- package/dist/dashboard/managed-project-skills-api.js +28 -0
- package/dist/dashboard/managed-project-skills-api.js.map +1 -0
- package/dist/dashboard/native-codex-api.d.ts +83 -0
- package/dist/dashboard/native-codex-api.d.ts.map +1 -0
- package/dist/dashboard/native-codex-api.js +91 -0
- package/dist/dashboard/native-codex-api.js.map +1 -0
- package/dist/dashboard/project-file-watch.d.ts +46 -0
- package/dist/dashboard/project-file-watch.d.ts.map +1 -0
- package/dist/dashboard/project-file-watch.js +221 -0
- package/dist/dashboard/project-file-watch.js.map +1 -0
- package/dist/dashboard/project-live-stream.d.ts +33 -0
- package/dist/dashboard/project-live-stream.d.ts.map +1 -0
- package/dist/dashboard/project-live-stream.js +233 -0
- package/dist/dashboard/project-live-stream.js.map +1 -0
- package/dist/dashboard/project-policy-api.d.ts +37 -0
- package/dist/dashboard/project-policy-api.d.ts.map +1 -0
- package/dist/dashboard/project-policy-api.js +31 -0
- package/dist/dashboard/project-policy-api.js.map +1 -0
- package/dist/dashboard/project-session-api.d.ts +28 -0
- package/dist/dashboard/project-session-api.d.ts.map +1 -0
- package/dist/dashboard/project-session-api.js +84 -0
- package/dist/dashboard/project-session-api.js.map +1 -0
- package/dist/dashboard/project-source-api.d.ts +11 -0
- package/dist/dashboard/project-source-api.d.ts.map +1 -0
- package/dist/dashboard/project-source-api.js +67 -0
- package/dist/dashboard/project-source-api.js.map +1 -0
- package/dist/dashboard/project-workspace.d.ts.map +1 -1
- package/dist/dashboard/project-workspace.js +18 -0
- package/dist/dashboard/project-workspace.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +64 -25
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
- package/dist/dashboard/v6-dashboard-html.js +4261 -4309
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts.map +1 -1
- package/dist/dashboard/workspace-api.js +105 -23
- package/dist/dashboard/workspace-api.js.map +1 -1
- package/dist/dashboard/workspace-status.d.ts +3 -0
- package/dist/dashboard/workspace-status.d.ts.map +1 -1
- package/dist/dashboard/workspace-status.js +4 -3
- package/dist/dashboard/workspace-status.js.map +1 -1
- package/dist/project-cli.js +1 -1
- package/dist/project-cli.js.map +1 -1
- package/docs/BRAND_ASSETS.md +36 -0
- package/docs/FEATURES_AND_LIMITS.md +29 -24
- package/docs/INTEGRATIONS.md +4 -2
- package/docs/LEARNING.md +1 -1
- package/docs/PROJECT_KIT.md +6 -1
- package/docs/QUICKSTART.md +62 -44
- package/docs/README.md +36 -33
- package/docs/SESSIONS.md +77 -0
- package/docs/SOURCE_INTAKE.md +33 -0
- package/docs/STATS.md +21 -21
- package/docs/VISUAL_GUIDE_v7.22.0.md +73 -0
- package/docs/WORKFLOW_INTEGRATION.md +3 -1
- package/docs/WORKSPACE.md +63 -37
- package/docs/assets/7.22.0-agent-dock-mobile.png +0 -0
- package/docs/assets/7.22.0-agent-dock.gif +0 -0
- package/docs/assets/7.22.0-agent-dock.png +0 -0
- package/docs/assets/7.22.0-hub-exchange.png +0 -0
- package/docs/assets/7.22.0-hub-exchanges.gif +0 -0
- package/docs/assets/7.22.0-hub-graph.png +0 -0
- package/docs/assets/7.22.0-hub-mobile-empty.png +0 -0
- package/docs/assets/7.22.0-managed-skills.png +0 -0
- package/docs/assets/7.22.0-plain-evidence.png +0 -0
- package/docs/assets/7.22.0-project-controls.png +0 -0
- package/docs/assets/7.22.0-sessions.png +0 -0
- package/docs/assets/7.22.0-teach-brain.png +0 -0
- package/docs/launch/RELEASE_ACCEPTANCE_v7.22.0.md +48 -0
- package/docs/launch/RELEASE_NOTES_v7.22.0.md +53 -0
- package/docs/launch/RESEARCH_AND_PLAN_v7.22.0.md +672 -0
- package/package.json +135 -130
- package/skills/shadow-workflow/SKILL.md +2 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { closeSync, linkSync, lstatSync, openSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
5
|
+
import { ensureProjectDirectory, projectLocalPath } from './project-kit-paths.js';
|
|
6
|
+
const directoryName = '.shadow-brain';
|
|
7
|
+
const fileName = 'model-usage.sqlite';
|
|
8
|
+
const retentionLimit = 1000;
|
|
9
|
+
const maximumBytes = 8 * 1024 * 1024;
|
|
10
|
+
const initializationWait = new Int32Array(new SharedArrayBuffer(4));
|
|
11
|
+
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;
|
|
12
|
+
const counters = ['inputTokens', 'outputTokens', 'cacheReadInputTokens', 'cacheWriteInputTokens', 'reasoningOutputTokens'];
|
|
13
|
+
export class ModelUsageError extends Error {
|
|
14
|
+
constructor(code, message, status = 400) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.status = status;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const unavailable = () => new ModelUsageError('USAGE_STORAGE_UNAVAILABLE', 'Usage storage could not be opened. Check the project store and retry.', 503);
|
|
21
|
+
const identityFor = (input) => JSON.stringify([input.projectId, input.agent, input.sessionId, input.operationId]);
|
|
22
|
+
const fingerprintFor = (input) => createHash('sha256').update(JSON.stringify(input)).digest('hex');
|
|
23
|
+
export function parseUsageInput(value, projectId) {
|
|
24
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
25
|
+
throw new TypeError('Send a usage receipt object.');
|
|
26
|
+
const input = value;
|
|
27
|
+
const labels = ['operationId', 'projectId', 'sessionId', 'agent', 'provider', 'requestModel', 'responseModel', 'reasoningEffort'];
|
|
28
|
+
if (Object.keys(input).some(key => ![...labels, ...counters, 'outcome'].includes(key)))
|
|
29
|
+
throw new TypeError('Usage receipts accept labels and token counters only.');
|
|
30
|
+
const result = {};
|
|
31
|
+
for (const key of labels) {
|
|
32
|
+
const field = input[key];
|
|
33
|
+
if (field === undefined && ['provider', 'requestModel', 'responseModel', 'reasoningEffort'].includes(key))
|
|
34
|
+
continue;
|
|
35
|
+
if (typeof field !== 'string' || (key === 'reasoningEffort' ? !/^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/u.test(field) : !/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/u.test(field) || field.includes('://')))
|
|
36
|
+
throw new TypeError('Use short plain labels for ' + key + '.');
|
|
37
|
+
result[key] = field;
|
|
38
|
+
}
|
|
39
|
+
if (result.projectId !== projectId)
|
|
40
|
+
throw new ModelUsageError('USAGE_PROJECT_MISMATCH', 'This receipt belongs to another project.', 409);
|
|
41
|
+
for (const key of counters)
|
|
42
|
+
if (input[key] !== undefined) {
|
|
43
|
+
if (!Number.isSafeInteger(input[key]) || Number(input[key]) < 0 || Number(input[key]) > 1000000000)
|
|
44
|
+
throw new TypeError(key + ' must be an integer from zero to one billion.');
|
|
45
|
+
result[key] = input[key];
|
|
46
|
+
}
|
|
47
|
+
if (input.outcome !== undefined) {
|
|
48
|
+
if (!['success', 'error', 'cancelled'].includes(input.outcome))
|
|
49
|
+
throw new TypeError('Invalid inference outcome.');
|
|
50
|
+
result.outcome = input.outcome;
|
|
51
|
+
}
|
|
52
|
+
const receipt = result;
|
|
53
|
+
if (receipt.inputTokens !== undefined && (receipt.cacheReadInputTokens ?? 0) + (receipt.cacheWriteInputTokens ?? 0) > receipt.inputTokens)
|
|
54
|
+
throw new TypeError('Cached input subsets cannot exceed input tokens.');
|
|
55
|
+
if (receipt.outputTokens !== undefined && (receipt.reasoningOutputTokens ?? 0) > receipt.outputTokens)
|
|
56
|
+
throw new TypeError('Reasoning tokens cannot exceed output tokens.');
|
|
57
|
+
return receipt;
|
|
58
|
+
}
|
|
59
|
+
/** Explicit metadata receipts. Never reads providers, sessions, prompts or credentials. */
|
|
60
|
+
export class ModelUsageStore {
|
|
61
|
+
constructor(root, projectId, now = Date.now) {
|
|
62
|
+
this.root = root;
|
|
63
|
+
this.projectId = projectId;
|
|
64
|
+
this.now = now;
|
|
65
|
+
}
|
|
66
|
+
path() {
|
|
67
|
+
const directory = projectLocalPath(this.root, directoryName);
|
|
68
|
+
const directoryInfo = lstatSync(directory, { throwIfNoEntry: false });
|
|
69
|
+
if (directoryInfo && (!directoryInfo.isDirectory() || directoryInfo.isSymbolicLink()))
|
|
70
|
+
throw unavailable();
|
|
71
|
+
const filename = join(directory, fileName);
|
|
72
|
+
for (const suffix of ['-journal', '-wal', '-shm']) {
|
|
73
|
+
const stat = lstatSync(filename + suffix, { throwIfNoEntry: false });
|
|
74
|
+
if (stat && (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1 || stat.size > maximumBytes))
|
|
75
|
+
throw unavailable();
|
|
76
|
+
}
|
|
77
|
+
// A cooperating first writer briefly links its complete new database into place.
|
|
78
|
+
// Retry that publication interval before reporting a persistently unsafe path.
|
|
79
|
+
const deadline = performance.now() + 250;
|
|
80
|
+
for (;;) {
|
|
81
|
+
const stat = lstatSync(filename, { throwIfNoEntry: false });
|
|
82
|
+
if (!stat)
|
|
83
|
+
return { filename, exists: false };
|
|
84
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > maximumBytes)
|
|
85
|
+
throw unavailable();
|
|
86
|
+
if (stat.nlink === 1)
|
|
87
|
+
return { filename, exists: true };
|
|
88
|
+
if (performance.now() >= deadline)
|
|
89
|
+
throw unavailable();
|
|
90
|
+
Atomics.wait(initializationWait, 0, 0, 4);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
metadata(db) {
|
|
94
|
+
const rows = db.prepare('SELECT project,version,dropped FROM usage_meta LIMIT 2').all();
|
|
95
|
+
if (rows.length !== 1 || rows[0].project !== this.projectId || rows[0].version !== 1 ||
|
|
96
|
+
!Number.isSafeInteger(rows[0].dropped) || Number(rows[0].dropped) < 0)
|
|
97
|
+
throw unavailable();
|
|
98
|
+
return Number(rows[0].dropped);
|
|
99
|
+
}
|
|
100
|
+
create(filename) {
|
|
101
|
+
const temporary = projectLocalPath(this.root, `${directoryName}/${fileName}.${randomUUID()}.tmp`);
|
|
102
|
+
const fd = openSync(temporary, 'wx', 0o600);
|
|
103
|
+
try {
|
|
104
|
+
closeSync(fd);
|
|
105
|
+
const db = new DatabaseSync(temporary, { allowExtension: false });
|
|
106
|
+
try {
|
|
107
|
+
db.exec('PRAGMA trusted_schema=OFF; PRAGMA synchronous=FULL; BEGIN IMMEDIATE;'
|
|
108
|
+
+ 'CREATE TABLE usage_meta(project TEXT PRIMARY KEY,version INTEGER NOT NULL,dropped INTEGER NOT NULL) STRICT;'
|
|
109
|
+
+ 'CREATE TABLE receipts(seq INTEGER PRIMARY KEY,identity TEXT UNIQUE NOT NULL,fingerprint TEXT NOT NULL,data TEXT NOT NULL) STRICT;');
|
|
110
|
+
db.prepare('INSERT INTO usage_meta VALUES(?,1,0)').run(this.projectId);
|
|
111
|
+
db.exec('COMMIT');
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
db.close();
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
linkSync(temporary, filename);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error.code !== 'EEXIST')
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
unlinkSync(temporary);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
open(write) {
|
|
129
|
+
if (write)
|
|
130
|
+
ensureProjectDirectory(this.root, directoryName);
|
|
131
|
+
const { filename, exists } = this.path();
|
|
132
|
+
if (!exists && !write)
|
|
133
|
+
return undefined;
|
|
134
|
+
if (!exists) {
|
|
135
|
+
this.create(filename);
|
|
136
|
+
if (!this.path().exists)
|
|
137
|
+
throw unavailable();
|
|
138
|
+
}
|
|
139
|
+
const db = new DatabaseSync(filename, { readOnly: !write, allowExtension: false });
|
|
140
|
+
try {
|
|
141
|
+
db.exec('PRAGMA busy_timeout=3000; PRAGMA trusted_schema=OFF;');
|
|
142
|
+
return db;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
db.close();
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
receipt(row) {
|
|
150
|
+
try {
|
|
151
|
+
const { id, recordedAt, provenance, ...fields } = JSON.parse(row.data);
|
|
152
|
+
const input = parseUsageInput(fields, this.projectId);
|
|
153
|
+
if (typeof id !== 'string' || !uuid.test(id) || typeof recordedAt !== 'string' || !Number.isFinite(Date.parse(recordedAt)) ||
|
|
154
|
+
new Date(recordedAt).toISOString() !== recordedAt || provenance !== 'host-reported' ||
|
|
155
|
+
row.identity !== identityFor(input) || row.fingerprint !== fingerprintFor(input))
|
|
156
|
+
throw unavailable();
|
|
157
|
+
return { ...input, id, recordedAt, provenance };
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw unavailable();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
receipts(db) {
|
|
164
|
+
const rows = db.prepare('SELECT identity,fingerprint,data FROM receipts ORDER BY seq LIMIT ?').all(retentionLimit + 1);
|
|
165
|
+
const receipts = rows.map(row => this.receipt(row));
|
|
166
|
+
if (receipts.length > retentionLimit || new Set(receipts.map(receipt => receipt.id)).size !== receipts.length)
|
|
167
|
+
throw unavailable();
|
|
168
|
+
return receipts;
|
|
169
|
+
}
|
|
170
|
+
report(value) {
|
|
171
|
+
const input = parseUsageInput(value, this.projectId);
|
|
172
|
+
const identity = identityFor(input);
|
|
173
|
+
const fingerprint = fingerprintFor(input);
|
|
174
|
+
let db;
|
|
175
|
+
try {
|
|
176
|
+
db = this.open(true);
|
|
177
|
+
db.exec('BEGIN IMMEDIATE');
|
|
178
|
+
const dropped = this.metadata(db);
|
|
179
|
+
const existing = db.prepare('SELECT identity,fingerprint,data FROM receipts WHERE identity=?').get(identity);
|
|
180
|
+
if (existing) {
|
|
181
|
+
const prior = this.receipt(existing);
|
|
182
|
+
if (existing.fingerprint !== fingerprint)
|
|
183
|
+
throw new ModelUsageError('USAGE_CONFLICT', 'This operation already has a different usage receipt.', 409);
|
|
184
|
+
db.exec('COMMIT');
|
|
185
|
+
return prior;
|
|
186
|
+
}
|
|
187
|
+
const count = Number(db.prepare('SELECT count(*) AS count FROM receipts').get()?.count);
|
|
188
|
+
if (!Number.isSafeInteger(count) || count < 0 || count > retentionLimit)
|
|
189
|
+
throw unavailable();
|
|
190
|
+
if (count === retentionLimit) {
|
|
191
|
+
if (dropped >= Number.MAX_SAFE_INTEGER - 1)
|
|
192
|
+
throw unavailable();
|
|
193
|
+
this.receipt(db.prepare('SELECT identity,fingerprint,data FROM receipts ORDER BY seq LIMIT 1').get());
|
|
194
|
+
db.exec('DELETE FROM receipts WHERE seq=(SELECT min(seq) FROM receipts); UPDATE usage_meta SET dropped=dropped+1;');
|
|
195
|
+
}
|
|
196
|
+
const receipt = { ...input, id: randomUUID(), recordedAt: new Date(this.now()).toISOString(), provenance: 'host-reported' };
|
|
197
|
+
db.prepare('INSERT INTO receipts(identity,fingerprint,data) VALUES(?,?,?)').run(identity, fingerprint, JSON.stringify(receipt));
|
|
198
|
+
db.exec('COMMIT');
|
|
199
|
+
return receipt;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
try {
|
|
203
|
+
db?.exec('ROLLBACK');
|
|
204
|
+
}
|
|
205
|
+
catch { /* Preserve the original failure. */ }
|
|
206
|
+
throw error instanceof ModelUsageError ? error : unavailable();
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
db?.close();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
read() {
|
|
213
|
+
let db;
|
|
214
|
+
try {
|
|
215
|
+
db = this.open(false);
|
|
216
|
+
db?.exec('BEGIN');
|
|
217
|
+
const dropped = db ? this.metadata(db) : 0;
|
|
218
|
+
const receipts = db ? this.receipts(db) : [];
|
|
219
|
+
db?.exec('COMMIT');
|
|
220
|
+
const aggregate = (rows) => Object.fromEntries(counters.map(key => {
|
|
221
|
+
const known = rows.filter(row => row[key] !== undefined);
|
|
222
|
+
return [key, { total: known.length ? known.reduce((sum, row) => sum + row[key], 0) : null, known: known.length, receipts: rows.length }];
|
|
223
|
+
}));
|
|
224
|
+
const groups = new Map();
|
|
225
|
+
for (const receipt of receipts) {
|
|
226
|
+
const key = JSON.stringify([receipt.agent, receipt.provider ?? null, receipt.requestModel ?? null, receipt.responseModel ?? null]);
|
|
227
|
+
const group = groups.get(key);
|
|
228
|
+
if (group)
|
|
229
|
+
group.push(receipt);
|
|
230
|
+
else
|
|
231
|
+
groups.set(key, [receipt]);
|
|
232
|
+
}
|
|
233
|
+
return { provenance: 'host-reported', retentionLimit, dropped,
|
|
234
|
+
oldestAt: receipts[0]?.recordedAt ?? null, newestAt: receipts.at(-1)?.recordedAt ?? null,
|
|
235
|
+
receipts, totals: aggregate(receipts), models: [...groups.values()].map(rows => ({ agent: rows[0].agent, provider: rows[0].provider ?? null,
|
|
236
|
+
requestModel: rows[0].requestModel ?? null, responseModel: rows[0].responseModel ?? null, lastAt: rows.at(-1).recordedAt, count: rows.length, totals: aggregate(rows) })) };
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
throw unavailable();
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
db?.close();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=model-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-usage.js","sourceRoot":"","sources":["../../src/brain/model-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams } from 'node:child_process';
|
|
2
|
+
import type { NativeSessionSnapshot } from './native-session-import.js';
|
|
3
|
+
export declare class NativeCodexError extends Error {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly status: number;
|
|
6
|
+
constructor(code: string, message: string, status?: number);
|
|
7
|
+
}
|
|
8
|
+
export interface NativeCodexRpc {
|
|
9
|
+
request(method: string, params: object): Promise<unknown>;
|
|
10
|
+
notify(method: string, params: object): void;
|
|
11
|
+
close(): void;
|
|
12
|
+
isOpen?(): boolean;
|
|
13
|
+
}
|
|
14
|
+
export type NativeCodexFactory = () => NativeCodexRpc;
|
|
15
|
+
export type NativeCodexThread = {
|
|
16
|
+
id: string;
|
|
17
|
+
sessionId: string | null;
|
|
18
|
+
parentThreadId: string | null;
|
|
19
|
+
name: string | null;
|
|
20
|
+
cwd: string;
|
|
21
|
+
createdAt: string | null;
|
|
22
|
+
updatedAt: string | null;
|
|
23
|
+
status: {
|
|
24
|
+
type: 'notLoaded' | 'idle' | 'systemError' | 'active' | 'unknown';
|
|
25
|
+
activeFlags?: string[];
|
|
26
|
+
};
|
|
27
|
+
archived: boolean;
|
|
28
|
+
};
|
|
29
|
+
export type NativeCodexMessage = {
|
|
30
|
+
id: string;
|
|
31
|
+
locator: string;
|
|
32
|
+
role: 'user' | 'assistant';
|
|
33
|
+
text: string;
|
|
34
|
+
phase?: 'commentary' | 'partial_answer' | 'final_answer';
|
|
35
|
+
};
|
|
36
|
+
export declare class NativeCodexStdioRpc implements NativeCodexRpc {
|
|
37
|
+
private readonly timeoutMs;
|
|
38
|
+
private readonly child;
|
|
39
|
+
private buffer;
|
|
40
|
+
private next;
|
|
41
|
+
private closed;
|
|
42
|
+
private readonly pending;
|
|
43
|
+
constructor(launch?: () => ChildProcessWithoutNullStreams, timeoutMs?: number);
|
|
44
|
+
private receive;
|
|
45
|
+
request(method: string, params: object): Promise<unknown>;
|
|
46
|
+
notify(method: string, params: object): void;
|
|
47
|
+
isOpen(): boolean;
|
|
48
|
+
close(): void;
|
|
49
|
+
}
|
|
50
|
+
export declare class NativeCodexConnection {
|
|
51
|
+
private readonly root;
|
|
52
|
+
private readonly factory;
|
|
53
|
+
private readonly now;
|
|
54
|
+
private rpc?;
|
|
55
|
+
private expires?;
|
|
56
|
+
private connectedAt;
|
|
57
|
+
private generation;
|
|
58
|
+
private readonly allowed;
|
|
59
|
+
private readonly itemCursors;
|
|
60
|
+
private readonly listCursors;
|
|
61
|
+
constructor(root: string, factory?: NativeCodexFactory, now?: () => number);
|
|
62
|
+
status(): {
|
|
63
|
+
connected: boolean;
|
|
64
|
+
connectedAt: string | null;
|
|
65
|
+
expiresAt: string | null;
|
|
66
|
+
scope: string;
|
|
67
|
+
note: string;
|
|
68
|
+
};
|
|
69
|
+
connect(): Promise<{
|
|
70
|
+
connected: boolean;
|
|
71
|
+
connectedAt: string | null;
|
|
72
|
+
expiresAt: string | null;
|
|
73
|
+
scope: string;
|
|
74
|
+
note: string;
|
|
75
|
+
}>;
|
|
76
|
+
close(): void;
|
|
77
|
+
private active;
|
|
78
|
+
list(archived?: boolean, cursor?: string | null): Promise<{
|
|
79
|
+
connected: boolean;
|
|
80
|
+
observedAt: string;
|
|
81
|
+
threads: NativeCodexThread[];
|
|
82
|
+
nextCursor: string | null;
|
|
83
|
+
}>;
|
|
84
|
+
read(threadId: string, cursor?: string | null): Promise<{
|
|
85
|
+
thread: NativeCodexThread;
|
|
86
|
+
messages: NativeCodexMessage[];
|
|
87
|
+
omitted: number;
|
|
88
|
+
nextCursor: string | null;
|
|
89
|
+
pageCoverage: {
|
|
90
|
+
kind: "page";
|
|
91
|
+
direction: "newest-first";
|
|
92
|
+
hasEarlier: boolean;
|
|
93
|
+
hasLater: boolean;
|
|
94
|
+
cursorSha256: string | null;
|
|
95
|
+
omittedInPage: number;
|
|
96
|
+
};
|
|
97
|
+
sha256: string;
|
|
98
|
+
observedAt: string;
|
|
99
|
+
}>;
|
|
100
|
+
snapshot(threadId: string, cursor?: string | null): Promise<{
|
|
101
|
+
snapshot: NativeSessionSnapshot;
|
|
102
|
+
nextCursor: string | null;
|
|
103
|
+
}>;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=native-codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-codex.d.ts","sourceRoot":"","sources":["../../src/brain/native-codex.ts"],"names":[],"mappings":"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"}
|