@dsh-enhanced/assistant-goals 0.1.30

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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -0
  3. package/cordis.patch.yml +3 -0
  4. package/lib/budget-store.d.ts +73 -0
  5. package/lib/budget-store.d.ts.map +1 -0
  6. package/lib/budget-store.js +345 -0
  7. package/lib/budget-store.js.map +1 -0
  8. package/lib/budget.d.ts +78 -0
  9. package/lib/budget.d.ts.map +1 -0
  10. package/lib/budget.js +344 -0
  11. package/lib/budget.js.map +1 -0
  12. package/lib/dependency.d.ts +11 -0
  13. package/lib/dependency.d.ts.map +1 -0
  14. package/lib/dependency.js +34 -0
  15. package/lib/dependency.js.map +1 -0
  16. package/lib/event-wait-store.d.ts +56 -0
  17. package/lib/event-wait-store.d.ts.map +1 -0
  18. package/lib/event-wait-store.js +189 -0
  19. package/lib/event-wait-store.js.map +1 -0
  20. package/lib/event-wait.d.ts +47 -0
  21. package/lib/event-wait.d.ts.map +1 -0
  22. package/lib/event-wait.js +372 -0
  23. package/lib/event-wait.js.map +1 -0
  24. package/lib/execution-store.d.ts +23 -0
  25. package/lib/execution-store.d.ts.map +1 -0
  26. package/lib/execution-store.js +207 -0
  27. package/lib/execution-store.js.map +1 -0
  28. package/lib/execution.d.ts +49 -0
  29. package/lib/execution.d.ts.map +1 -0
  30. package/lib/execution.js +438 -0
  31. package/lib/execution.js.map +1 -0
  32. package/lib/feedback.d.ts +63 -0
  33. package/lib/feedback.d.ts.map +1 -0
  34. package/lib/feedback.js +134 -0
  35. package/lib/feedback.js.map +1 -0
  36. package/lib/index.d.ts +27 -0
  37. package/lib/index.d.ts.map +1 -0
  38. package/lib/index.js +9 -0
  39. package/lib/index.js.map +1 -0
  40. package/lib/outcome-store.d.ts +47 -0
  41. package/lib/outcome-store.d.ts.map +1 -0
  42. package/lib/outcome-store.js +271 -0
  43. package/lib/outcome-store.js.map +1 -0
  44. package/lib/outcome.d.ts +77 -0
  45. package/lib/outcome.d.ts.map +1 -0
  46. package/lib/outcome.js +417 -0
  47. package/lib/outcome.js.map +1 -0
  48. package/lib/service.d.ts +363 -0
  49. package/lib/service.d.ts.map +1 -0
  50. package/lib/service.js +1839 -0
  51. package/lib/service.js.map +1 -0
  52. package/lib/store.d.ts +21 -0
  53. package/lib/store.d.ts.map +1 -0
  54. package/lib/store.js +577 -0
  55. package/lib/store.js.map +1 -0
  56. package/lib/strategy-feedback.d.ts +29 -0
  57. package/lib/strategy-feedback.d.ts.map +1 -0
  58. package/lib/strategy-feedback.js +53 -0
  59. package/lib/strategy-feedback.js.map +1 -0
  60. package/lib/strategy-identity.d.ts +11 -0
  61. package/lib/strategy-identity.d.ts.map +1 -0
  62. package/lib/strategy-identity.js +10 -0
  63. package/lib/strategy-identity.js.map +1 -0
  64. package/lib/strategy-store.d.ts +76 -0
  65. package/lib/strategy-store.d.ts.map +1 -0
  66. package/lib/strategy-store.js +277 -0
  67. package/lib/strategy-store.js.map +1 -0
  68. package/lib/strategy.d.ts +56 -0
  69. package/lib/strategy.d.ts.map +1 -0
  70. package/lib/strategy.js +478 -0
  71. package/lib/strategy.js.map +1 -0
  72. package/lib/tools.d.ts +4 -0
  73. package/lib/tools.d.ts.map +1 -0
  74. package/lib/tools.js +130 -0
  75. package/lib/tools.js.map +1 -0
  76. package/lib/types.d.ts +285 -0
  77. package/lib/types.d.ts.map +1 -0
  78. package/lib/types.js +10 -0
  79. package/lib/types.js.map +1 -0
  80. package/lib/verified-artifact.d.ts +72 -0
  81. package/lib/verified-artifact.d.ts.map +1 -0
  82. package/lib/verified-artifact.js +142 -0
  83. package/lib/verified-artifact.js.map +1 -0
  84. package/lib/verified-workflow.d.ts +120 -0
  85. package/lib/verified-workflow.d.ts.map +1 -0
  86. package/lib/verified-workflow.js +253 -0
  87. package/lib/verified-workflow.js.map +1 -0
  88. package/lib/version.d.ts +2 -0
  89. package/lib/version.d.ts.map +1 -0
  90. package/lib/version.js +2 -0
  91. package/lib/version.js.map +1 -0
  92. package/lib/wake-store.d.ts +38 -0
  93. package/lib/wake-store.d.ts.map +1 -0
  94. package/lib/wake-store.js +177 -0
  95. package/lib/wake-store.js.map +1 -0
  96. package/lib/wake.d.ts +45 -0
  97. package/lib/wake.d.ts.map +1 -0
  98. package/lib/wake.js +327 -0
  99. package/lib/wake.js.map +1 -0
  100. package/package.json +143 -0
@@ -0,0 +1,345 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { acceptanceCanonicalJson } from '@dsh-enhanced/task-acceptance-contract';
3
+ import { GoalStoreError } from './types.js';
4
+ import { prepareGoalStoreDatabaseFile } from './store.js';
5
+ const max = 1_000_000_000;
6
+ const idPattern = /^[A-Za-z0-9_.:-]{1,512}$/u;
7
+ const routeText = (value) => typeof value === 'string' && value.length > 0 && value.length <= 512 && !/[\s\p{Cc}]/u.test(value);
8
+ function fail(code) { throw new GoalStoreError(code); }
9
+ const freeze = (value) => { if (value && typeof value === 'object') {
10
+ for (const item of Object.values(value))
11
+ freeze(item);
12
+ Object.freeze(value);
13
+ } ; return value; };
14
+ const equal = (left, right) => JSON.stringify(left) === JSON.stringify(right);
15
+ const integer = (value) => Number.isSafeInteger(value) && value >= 0 && value <= max;
16
+ const time = (value) => Number.isSafeInteger(value) && value >= 0;
17
+ function scopeInput(value) {
18
+ if (!value || typeof value !== 'object' || Object.keys(value).length !== 2 || !value.scope || typeof value.scope !== 'object' || !idPattern.test(value.goalId ?? ''))
19
+ fail('invalid-input');
20
+ const scope = value.scope;
21
+ if (Object.keys(scope).length !== 5 || ![scope.principalId, scope.principalRecordId, scope.workspace, scope.preset].every(item => typeof item === 'string' && item.length > 0 && item.length <= 4096)
22
+ || !scope.workspace.startsWith('/') || !Number.isSafeInteger(scope.principalVersion) || scope.principalVersion < 1 || scope.principalVersion > max)
23
+ fail('invalid-input');
24
+ return freeze({ scope: { principalId: scope.principalId, principalRecordId: scope.principalRecordId, principalVersion: scope.principalVersion, workspace: scope.workspace, preset: scope.preset }, goalId: value.goalId });
25
+ }
26
+ function limitsInput(value) {
27
+ if (!value || typeof value !== 'object')
28
+ fail('invalid-input');
29
+ const mode = value.mode ?? 'tokens';
30
+ const inputRoutes = value.routes ?? [];
31
+ if (![6, 8].includes(Object.keys(value).length) || !['tokens', 'calls'].includes(mode) || !Array.isArray(inputRoutes)
32
+ || !integer(value.modelCalls) || !integer(value.toolCalls) || !(value.costUsdMicros === null || integer(value.costUsdMicros)) || !time(value.expiresAt))
33
+ fail('invalid-input');
34
+ const routes = inputRoutes.map(route => {
35
+ if (!route || typeof route !== 'object' || Object.keys(route).length !== 2 || ![route.provider, route.model].every(routeText))
36
+ fail('invalid-input');
37
+ return { provider: route.provider, model: route.model };
38
+ });
39
+ if (new Set(routes.map(route => JSON.stringify([route.provider, route.model]))).size !== routes.length)
40
+ fail('invalid-input');
41
+ if (mode === 'tokens') {
42
+ if (!integer(value.inputTokens) || !integer(value.outputTokens))
43
+ fail('invalid-input');
44
+ }
45
+ else if (value.inputTokens !== null || value.outputTokens !== null || value.costUsdMicros !== null || routes.length === 0)
46
+ fail('invalid-input');
47
+ return freeze({ mode, routes, modelCalls: value.modelCalls, toolCalls: value.toolCalls, inputTokens: value.inputTokens, outputTokens: value.outputTokens, costUsdMicros: value.costUsdMicros, expiresAt: value.expiresAt });
48
+ }
49
+ function requestInput(value) {
50
+ if (!value || typeof value !== 'object' || Object.keys(value).length !== 5 || !idPattern.test(value.id ?? '') || !idPattern.test(value.runId ?? '') || !integer(value.inputTokens) || !integer(value.outputTokens) || !(value.costUsdMicros === null || integer(value.costUsdMicros)))
51
+ fail('invalid-input');
52
+ return freeze({ id: value.id, runId: value.runId, inputTokens: value.inputTokens, outputTokens: value.outputTokens, costUsdMicros: value.costUsdMicros });
53
+ }
54
+ function actualInput(value) {
55
+ if (!value || typeof value !== 'object' || Object.keys(value).length !== 3 || !integer(value.inputTokens) || !integer(value.outputTokens) || !(value.costUsdMicros === null || integer(value.costUsdMicros)))
56
+ fail('invalid-input');
57
+ return freeze({ inputTokens: value.inputTokens, outputTokens: value.outputTokens, costUsdMicros: value.costUsdMicros });
58
+ }
59
+ function rowReservation(row) {
60
+ if (!idPattern.test(row.id) || !idPattern.test(row.run_id) || !integer(row.input_tokens_reserved) || !integer(row.output_tokens_reserved) || !(row.cost_usd_micros_reserved === null || integer(row.cost_usd_micros_reserved)) || !time(row.reserved_at))
61
+ fail('schema');
62
+ if (row.state === 'held' && row.input_tokens_actual === null && row.output_tokens_actual === null && row.cost_usd_micros_actual === null && row.settled_at === null)
63
+ return freeze({ id: row.id, runId: row.run_id, inputTokens: row.input_tokens_reserved, outputTokens: row.output_tokens_reserved, costUsdMicros: row.cost_usd_micros_reserved, state: 'held', reservedAt: row.reserved_at });
64
+ if (row.state === 'settled' && integer(row.input_tokens_actual) && integer(row.output_tokens_actual) && time(row.settled_at) && row.settled_at >= row.reserved_at
65
+ && row.input_tokens_actual <= row.input_tokens_reserved && row.output_tokens_actual <= row.output_tokens_reserved
66
+ && ((row.cost_usd_micros_reserved === null && row.cost_usd_micros_actual === null) || (integer(row.cost_usd_micros_reserved) && integer(row.cost_usd_micros_actual) && row.cost_usd_micros_actual <= row.cost_usd_micros_reserved)))
67
+ return freeze({ id: row.id, runId: row.run_id, inputTokens: row.input_tokens_actual, outputTokens: row.output_tokens_actual, costUsdMicros: row.cost_usd_micros_actual, state: 'settled', reservedAt: row.reserved_at, settledAt: row.settled_at });
68
+ fail('schema');
69
+ }
70
+ /** Private durable budget ledger. Held reservations deliberately survive restart. */
71
+ export class GoalBudgetStore {
72
+ #database;
73
+ constructor(path) {
74
+ if (path !== ':memory:')
75
+ prepareGoalStoreDatabaseFile(path);
76
+ this.#database = new DatabaseSync(path, { enableForeignKeyConstraints: true });
77
+ try {
78
+ this.#database.exec('PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 250; PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;');
79
+ const version = this.#database.prepare('PRAGMA user_version').get().user_version;
80
+ const tables = this.#database.prepare("SELECT name FROM sqlite_schema WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name").all().map(row => row.name);
81
+ if (version === 0 && tables.length === 0)
82
+ this.#database.exec(`BEGIN IMMEDIATE;
83
+ CREATE TABLE goal_budget_limits (scope_json TEXT NOT NULL, goal_id TEXT NOT NULL, mode TEXT NOT NULL CHECK(mode IN ('tokens','calls')), routes_json TEXT NOT NULL, model_calls INTEGER NOT NULL, tool_calls INTEGER NOT NULL, input_tokens INTEGER, output_tokens INTEGER, cost_usd_micros INTEGER, expires_at INTEGER NOT NULL, PRIMARY KEY(scope_json, goal_id)) STRICT, WITHOUT ROWID;
84
+ CREATE TABLE goal_budget_reservations (id TEXT PRIMARY KEY, scope_json TEXT NOT NULL, goal_id TEXT NOT NULL, run_id TEXT NOT NULL, input_tokens_reserved INTEGER NOT NULL, output_tokens_reserved INTEGER NOT NULL, cost_usd_micros_reserved INTEGER, state TEXT NOT NULL CHECK(state IN ('held','settled')), reserved_at INTEGER NOT NULL, input_tokens_actual INTEGER, output_tokens_actual INTEGER, cost_usd_micros_actual INTEGER, settled_at INTEGER, FOREIGN KEY(scope_json, goal_id) REFERENCES goal_budget_limits(scope_json, goal_id)) STRICT;
85
+ CREATE TABLE goal_budget_tools (id TEXT PRIMARY KEY, scope_json TEXT NOT NULL, goal_id TEXT NOT NULL, consumed_at INTEGER NOT NULL, FOREIGN KEY(scope_json, goal_id) REFERENCES goal_budget_limits(scope_json, goal_id)) STRICT;
86
+ CREATE TABLE goal_budget_request_ids (id TEXT PRIMARY KEY, kind TEXT NOT NULL CHECK(kind IN ('reserve','tool'))) STRICT;
87
+ CREATE INDEX goal_budget_reservations_scope_goal ON goal_budget_reservations(scope_json, goal_id);
88
+ CREATE INDEX goal_budget_tools_scope_goal ON goal_budget_tools(scope_json, goal_id);
89
+ PRAGMA user_version = 2; COMMIT;`);
90
+ else if (version === 1 && equal(tables, ['goal_budget_limits', 'goal_budget_request_ids', 'goal_budget_reservations', 'goal_budget_tools']))
91
+ this.#database.exec(`BEGIN IMMEDIATE;
92
+ ALTER TABLE goal_budget_limits ADD COLUMN mode TEXT NOT NULL DEFAULT 'tokens';
93
+ ALTER TABLE goal_budget_limits ADD COLUMN routes_json TEXT NOT NULL DEFAULT '[]';
94
+ PRAGMA user_version = 2; COMMIT;`);
95
+ else if (version !== 2 || !equal(tables, ['goal_budget_limits', 'goal_budget_request_ids', 'goal_budget_reservations', 'goal_budget_tools']))
96
+ fail('schema');
97
+ this.#validate();
98
+ if (path !== ':memory:')
99
+ prepareGoalStoreDatabaseFile(path);
100
+ }
101
+ catch (error) {
102
+ this.#database.close();
103
+ throw error;
104
+ }
105
+ }
106
+ #key(binding) { const result = scopeInput(binding); return [result, acceptanceCanonicalJson(result.scope)]; }
107
+ #limit(key, goalId) { return this.#database.prepare('SELECT mode, routes_json, model_calls, tool_calls, input_tokens, output_tokens, cost_usd_micros, expires_at FROM goal_budget_limits WHERE scope_json = ? AND goal_id = ?').get(key, goalId); }
108
+ #limits(row) {
109
+ let routes;
110
+ try {
111
+ routes = JSON.parse(row.routes_json);
112
+ }
113
+ catch {
114
+ fail('schema');
115
+ }
116
+ return limitsInput({ mode: row.mode, routes: routes, modelCalls: row.model_calls, toolCalls: row.tool_calls, inputTokens: row.mode === 'calls' ? null : row.input_tokens, outputTokens: row.mode === 'calls' ? null : row.output_tokens, costUsdMicros: row.cost_usd_micros, expiresAt: row.expires_at });
117
+ }
118
+ #snapshot(key, goalId) {
119
+ const limits = this.#limit(key, goalId);
120
+ if (!limits)
121
+ fail('not-found');
122
+ const parsed = this.#limits(limits);
123
+ const count = this.#database.prepare("SELECT COUNT(*) AS model_calls, COALESCE(SUM(CASE WHEN state = 'held' THEN 1 ELSE 0 END), 0) AS held_calls, COALESCE(SUM(CASE WHEN state = 'held' THEN input_tokens_reserved ELSE input_tokens_actual END), 0) AS input_tokens, COALESCE(SUM(CASE WHEN state = 'held' THEN output_tokens_reserved ELSE output_tokens_actual END), 0) AS output_tokens, COALESCE(SUM(CASE WHEN state = 'held' THEN COALESCE(cost_usd_micros_reserved, 0) ELSE COALESCE(cost_usd_micros_actual, 0) END), 0) AS cost_usd_micros FROM goal_budget_reservations WHERE scope_json = ? AND goal_id = ?").get(key, goalId);
124
+ const tool = this.#database.prepare('SELECT COUNT(*) AS tool_calls FROM goal_budget_tools WHERE scope_json = ? AND goal_id = ?').get(key, goalId);
125
+ if (![count.model_calls, count.held_calls, count.input_tokens, count.output_tokens, count.cost_usd_micros, tool.tool_calls].every(integer))
126
+ fail('schema');
127
+ return freeze({ limits: parsed, modelCalls: count.model_calls, toolCalls: tool.tool_calls, inputTokens: parsed.mode === 'calls' ? null : count.input_tokens, outputTokens: parsed.mode === 'calls' ? null : count.output_tokens, costUsdMicros: parsed.mode === 'calls' || parsed.costUsdMicros === null ? null : count.cost_usd_micros, heldCalls: count.held_calls });
128
+ }
129
+ #validate() {
130
+ const expected = { goal_budget_limits: ['scope_json', 'goal_id', 'mode', 'routes_json', 'model_calls', 'tool_calls', 'input_tokens', 'output_tokens', 'cost_usd_micros', 'expires_at'], goal_budget_reservations: ['id', 'scope_json', 'goal_id', 'run_id', 'input_tokens_reserved', 'output_tokens_reserved', 'cost_usd_micros_reserved', 'state', 'reserved_at', 'input_tokens_actual', 'output_tokens_actual', 'cost_usd_micros_actual', 'settled_at'], goal_budget_tools: ['id', 'scope_json', 'goal_id', 'consumed_at'], goal_budget_request_ids: ['id', 'kind'] };
131
+ for (const [table, columns] of Object.entries(expected)) {
132
+ const actual = this.#database.prepare(`PRAGMA table_info(${table})`).all().map(row => row.name);
133
+ const schema = this.#database.prepare("SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = ?").get(table);
134
+ const legacyMigratedLimits = table === 'goal_budget_limits' && equal(actual, ['scope_json', 'goal_id', 'model_calls', 'tool_calls', 'input_tokens', 'output_tokens', 'cost_usd_micros', 'expires_at', 'mode', 'routes_json']);
135
+ if (!schema || (!equal(actual, columns) && !legacyMigratedLimits) || !/\bSTRICT\b/u.test(schema.sql))
136
+ fail('schema');
137
+ }
138
+ const limitSql = this.#database.prepare("SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = 'goal_budget_limits'").get().sql;
139
+ if (!/WITHOUT\s+ROWID/iu.test(limitSql) || !/PRIMARY\s+KEY\s*\(\s*scope_json\s*,\s*goal_id\s*\)/iu.test(limitSql))
140
+ fail('schema');
141
+ for (const table of ['goal_budget_reservations', 'goal_budget_tools', 'goal_budget_request_ids']) {
142
+ const primary = this.#database.prepare(`PRAGMA table_info(${table})`).all().filter(row => row.pk === 1).map(row => row.name);
143
+ if (!equal(primary, ['id']))
144
+ fail('schema');
145
+ }
146
+ const reservationSql = this.#database.prepare("SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = 'goal_budget_reservations'").get().sql;
147
+ const requestSql = this.#database.prepare("SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = 'goal_budget_request_ids'").get().sql;
148
+ if (!/CHECK\s*\(\s*state\s+IN\s*\(\s*'held'\s*,\s*'settled'\s*\)\s*\)/iu.test(reservationSql)
149
+ || !/CHECK\s*\(\s*kind\s+IN\s*\(\s*'reserve'\s*,\s*'tool'\s*\)\s*\)/iu.test(requestSql))
150
+ fail('schema');
151
+ const reservationsForeignKeys = this.#database.prepare('PRAGMA foreign_key_list(goal_budget_reservations)').all();
152
+ const toolsForeignKeys = this.#database.prepare('PRAGMA foreign_key_list(goal_budget_tools)').all();
153
+ if (!reservationsForeignKeys.some(row => row.table === 'goal_budget_limits' && row.from === 'scope_json' && row.to === 'scope_json')
154
+ || !reservationsForeignKeys.some(row => row.table === 'goal_budget_limits' && row.from === 'goal_id' && row.to === 'goal_id')
155
+ || !toolsForeignKeys.some(row => row.table === 'goal_budget_limits' && row.from === 'scope_json' && row.to === 'scope_json')
156
+ || !toolsForeignKeys.some(row => row.table === 'goal_budget_limits' && row.from === 'goal_id' && row.to === 'goal_id'))
157
+ fail('schema');
158
+ const indexes = this.#database.prepare("SELECT name FROM sqlite_schema WHERE type = 'index' AND name IN ('goal_budget_reservations_scope_goal', 'goal_budget_tools_scope_goal') ORDER BY name").all().map(row => row.name);
159
+ if (!equal(indexes, ['goal_budget_reservations_scope_goal', 'goal_budget_tools_scope_goal']))
160
+ fail('schema');
161
+ const check = this.#database.prepare('PRAGMA quick_check').get();
162
+ if (check.quick_check !== 'ok' || this.#database.prepare('PRAGMA foreign_key_check').all().length !== 0)
163
+ fail('schema');
164
+ const limitRows = this.#database.prepare('SELECT scope_json, goal_id FROM goal_budget_limits').all();
165
+ const configured = new Map();
166
+ for (const row of limitRows) {
167
+ let scope;
168
+ try {
169
+ scope = JSON.parse(row.scope_json);
170
+ }
171
+ catch {
172
+ fail('schema');
173
+ }
174
+ const binding = scopeInput({ scope: scope, goalId: row.goal_id });
175
+ if (acceptanceCanonicalJson(binding.scope) !== row.scope_json)
176
+ fail('schema');
177
+ configured.set(`${row.scope_json}\u0000${row.goal_id}`, this.#limits(this.#limit(row.scope_json, row.goal_id)));
178
+ }
179
+ const ids = this.#database.prepare("SELECT id, kind FROM goal_budget_request_ids").all();
180
+ for (const item of ids) {
181
+ const source = item.kind === 'reserve' ? 'goal_budget_reservations' : item.kind === 'tool' ? 'goal_budget_tools' : undefined;
182
+ if (!source || !idPattern.test(item.id))
183
+ fail('schema');
184
+ const count = this.#database.prepare(`SELECT COUNT(*) AS count FROM ${source} WHERE id = ?`).get(item.id).count;
185
+ if (count !== 1)
186
+ fail('schema');
187
+ }
188
+ for (const row of this.#database.prepare('SELECT * FROM goal_budget_reservations').all()) {
189
+ rowReservation(row);
190
+ const limits = configured.get(`${row.scope_json}\u0000${row.goal_id}`);
191
+ const request = this.#database.prepare("SELECT COUNT(*) AS count FROM goal_budget_request_ids WHERE id = ? AND kind = 'reserve'").get(row.id).count;
192
+ if (!limits || request !== 1 || row.reserved_at >= limits.expiresAt || (limits.costUsdMicros !== null && row.cost_usd_micros_reserved === null))
193
+ fail('schema');
194
+ }
195
+ for (const row of this.#database.prepare('SELECT id, scope_json, goal_id, consumed_at FROM goal_budget_tools').all()) {
196
+ const limits = configured.get(`${row.scope_json}\u0000${row.goal_id}`);
197
+ const request = this.#database.prepare("SELECT COUNT(*) AS count FROM goal_budget_request_ids WHERE id = ? AND kind = 'tool'").get(row.id).count;
198
+ if (!limits || !idPattern.test(row.id) || !time(row.consumed_at) || row.consumed_at >= limits.expiresAt || request !== 1)
199
+ fail('schema');
200
+ }
201
+ for (const row of limitRows) {
202
+ const snapshot = this.#snapshot(row.scope_json, row.goal_id);
203
+ if (snapshot.modelCalls > snapshot.limits.modelCalls || snapshot.toolCalls > snapshot.limits.toolCalls
204
+ || (snapshot.limits.mode === 'tokens' && (snapshot.inputTokens > snapshot.limits.inputTokens || snapshot.outputTokens > snapshot.limits.outputTokens || (snapshot.limits.costUsdMicros !== null && snapshot.costUsdMicros > snapshot.limits.costUsdMicros))))
205
+ fail('schema');
206
+ }
207
+ }
208
+ configure(binding, limits) {
209
+ const [input, key] = this.#key(binding);
210
+ const value = limitsInput(limits);
211
+ const existing = this.#limit(key, input.goalId);
212
+ if (existing) {
213
+ if (!equal(this.#limits(existing), value))
214
+ fail('conflict');
215
+ return this.#snapshot(key, input.goalId);
216
+ }
217
+ const calls = value.mode === 'calls';
218
+ // v1 migration cannot relax the old NOT NULL token columns. Zero is a private
219
+ // sentinel only for calls mode; #limits always projects it back to unknown/null.
220
+ try {
221
+ this.#database.prepare('INSERT INTO goal_budget_limits(scope_json, goal_id, mode, routes_json, model_calls, tool_calls, input_tokens, output_tokens, cost_usd_micros, expires_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)').run(key, input.goalId, value.mode ?? 'tokens', acceptanceCanonicalJson(value.routes ?? []), value.modelCalls, value.toolCalls, calls ? 0 : value.inputTokens, calls ? 0 : value.outputTokens, value.costUsdMicros, value.expiresAt);
222
+ }
223
+ catch {
224
+ fail('conflict');
225
+ }
226
+ return this.#snapshot(key, input.goalId);
227
+ }
228
+ /** Exact run attribution, including conservative held reservations. */
229
+ runUsage(binding, runId) {
230
+ const [input, key] = this.#key(binding);
231
+ if (!idPattern.test(runId))
232
+ fail('invalid-input');
233
+ const limits = this.#limit(key, input.goalId);
234
+ if (!limits)
235
+ fail('not-found');
236
+ const row = this.#database.prepare(`SELECT COUNT(*) AS calls,
237
+ COALESCE(SUM(CASE WHEN state = 'held' THEN 1 ELSE 0 END), 0) AS held,
238
+ COALESCE(SUM(CASE WHEN state = 'held' THEN input_tokens_reserved ELSE input_tokens_actual END), 0) AS input,
239
+ COALESCE(SUM(CASE WHEN state = 'held' THEN output_tokens_reserved ELSE output_tokens_actual END), 0) AS output,
240
+ COALESCE(SUM(CASE WHEN state = 'held' THEN cost_usd_micros_reserved ELSE cost_usd_micros_actual END), 0) AS cost
241
+ FROM goal_budget_reservations WHERE scope_json = ? AND goal_id = ? AND run_id = ?`).get(key, input.goalId, runId);
242
+ const parsed = this.#limits(limits);
243
+ return freeze({ modelCalls: row.calls, heldCalls: row.held, inputTokens: parsed.mode === 'calls' ? null : row.input, outputTokens: parsed.mode === 'calls' ? null : row.output,
244
+ costUsdMicros: parsed.mode === 'calls' || limits.cost_usd_micros === null ? null : row.cost });
245
+ }
246
+ /** Read-only candidate view. It never inserts limits, requests, or reservations. */
247
+ preview(binding, limits) {
248
+ const [input, key] = this.#key(binding);
249
+ const candidate = limitsInput(limits);
250
+ const existing = this.#limit(key, input.goalId);
251
+ if (existing === undefined)
252
+ return freeze({ limits: candidate, modelCalls: 0, toolCalls: 0, inputTokens: candidate.mode === 'calls' ? null : 0, outputTokens: candidate.mode === 'calls' ? null : 0, costUsdMicros: candidate.mode === 'calls' || candidate.costUsdMicros === null ? null : 0, heldCalls: 0 });
253
+ if (!equal(this.#limits(existing), candidate))
254
+ fail('conflict');
255
+ return this.#snapshot(key, input.goalId);
256
+ }
257
+ reserve(binding, request, now) {
258
+ const [input, key] = this.#key(binding);
259
+ const value = requestInput(request);
260
+ if (!time(now))
261
+ fail('invalid-input');
262
+ this.#database.exec('BEGIN IMMEDIATE;');
263
+ try {
264
+ const snapshot = this.#snapshot(key, input.goalId);
265
+ if (now >= snapshot.limits.expiresAt
266
+ || (snapshot.limits.costUsdMicros !== null && value.costUsdMicros === null)
267
+ || snapshot.modelCalls + 1 > snapshot.limits.modelCalls
268
+ || (snapshot.limits.mode === 'tokens' && (snapshot.inputTokens + value.inputTokens > snapshot.limits.inputTokens
269
+ || snapshot.outputTokens + value.outputTokens > snapshot.limits.outputTokens
270
+ || (snapshot.limits.costUsdMicros !== null && snapshot.costUsdMicros + value.costUsdMicros > snapshot.limits.costUsdMicros))))
271
+ fail('conflict');
272
+ this.#database.prepare("INSERT INTO goal_budget_request_ids(id, kind) VALUES (?, 'reserve')").run(value.id);
273
+ this.#database.prepare("INSERT INTO goal_budget_reservations(id, scope_json, goal_id, run_id, input_tokens_reserved, output_tokens_reserved, cost_usd_micros_reserved, state, reserved_at) VALUES (?, ?, ?, ?, ?, ?, ?, 'held', ?)")
274
+ .run(value.id, key, input.goalId, value.runId, value.inputTokens, value.outputTokens, value.costUsdMicros, now);
275
+ this.#database.exec('COMMIT;');
276
+ }
277
+ catch (error) {
278
+ try {
279
+ this.#database.exec('ROLLBACK;');
280
+ }
281
+ catch { }
282
+ if (error instanceof GoalStoreError)
283
+ throw error;
284
+ fail('conflict');
285
+ }
286
+ return this.#reservation(value.id);
287
+ }
288
+ #reservation(id) { const row = this.#database.prepare('SELECT * FROM goal_budget_reservations WHERE id = ?').get(id); return row === undefined ? undefined : rowReservation(row); }
289
+ settle(id, actual, now) {
290
+ if (!idPattern.test(id) || !time(now))
291
+ fail('invalid-input');
292
+ const value = actualInput(actual);
293
+ const found = this.#reservation(id);
294
+ if (!found)
295
+ fail('not-found');
296
+ if (found.state === 'settled') {
297
+ if (equal({ inputTokens: found.inputTokens, outputTokens: found.outputTokens, costUsdMicros: found.costUsdMicros }, value))
298
+ return found;
299
+ fail('conflict');
300
+ }
301
+ if (value.inputTokens > found.inputTokens || value.outputTokens > found.outputTokens || !((found.costUsdMicros === null && value.costUsdMicros === null) || (found.costUsdMicros !== null && value.costUsdMicros !== null && value.costUsdMicros <= found.costUsdMicros)))
302
+ fail('invalid-input');
303
+ if (now < found.reservedAt)
304
+ fail('invalid-input');
305
+ try {
306
+ const result = this.#database.prepare("UPDATE goal_budget_reservations SET state = 'settled', input_tokens_actual = ?, output_tokens_actual = ?, cost_usd_micros_actual = ?, settled_at = ? WHERE id = ? AND state = 'held'")
307
+ .run(value.inputTokens, value.outputTokens, value.costUsdMicros, now, id);
308
+ if (Number(result.changes) !== 1)
309
+ fail('conflict');
310
+ }
311
+ catch (error) {
312
+ if (error instanceof GoalStoreError)
313
+ throw error;
314
+ fail('conflict');
315
+ }
316
+ return this.#reservation(id);
317
+ }
318
+ consumeTool(binding, id, now) {
319
+ const [input, key] = this.#key(binding);
320
+ if (!idPattern.test(id) || !time(now))
321
+ fail('invalid-input');
322
+ this.#database.exec('BEGIN IMMEDIATE;');
323
+ try {
324
+ const snapshot = this.#snapshot(key, input.goalId);
325
+ if (now >= snapshot.limits.expiresAt || snapshot.toolCalls + 1 > snapshot.limits.toolCalls)
326
+ fail('conflict');
327
+ this.#database.prepare("INSERT INTO goal_budget_request_ids(id, kind) VALUES (?, 'tool')").run(id);
328
+ this.#database.prepare('INSERT INTO goal_budget_tools(id, scope_json, goal_id, consumed_at) VALUES (?, ?, ?, ?)').run(id, key, input.goalId, now);
329
+ this.#database.exec('COMMIT;');
330
+ }
331
+ catch (error) {
332
+ try {
333
+ this.#database.exec('ROLLBACK;');
334
+ }
335
+ catch { }
336
+ if (error instanceof GoalStoreError)
337
+ throw error;
338
+ fail('conflict');
339
+ }
340
+ return this.#snapshot(key, input.goalId);
341
+ }
342
+ snapshot(binding) { const [input, key] = this.#key(binding); return this.#snapshot(key, input.goalId); }
343
+ close() { this.#database.close(); }
344
+ }
345
+ //# sourceMappingURL=budget-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-store.js","sourceRoot":"","sources":["../src/budget-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { Agent } from '@deepseek-ai/dsh-agent';
3
+ import type { GenerateOptions } from '@deepseek-ai/dsh-llm';
4
+ import type { GoalBudgetRoute } from './budget-store.js';
5
+ import type { GoalExecutionRun, GoalRecord } from './types.js';
6
+ export type GoalBudgetDelegateResolver = (agent: Agent) => {
7
+ parent: Agent;
8
+ runId: string;
9
+ signal: AbortSignal;
10
+ provider: string;
11
+ model: string;
12
+ accountingRunId: string;
13
+ } | undefined;
14
+ export interface GoalTokenBudgetConfig {
15
+ mode?: 'tokens';
16
+ modelCalls: number;
17
+ toolCalls: number;
18
+ inputTokens: number;
19
+ outputTokens: number;
20
+ costUsdMicros?: number;
21
+ durationMs: number;
22
+ maxOutputTokensPerCall: number;
23
+ }
24
+ export interface GoalCallsBudgetConfig {
25
+ mode: 'calls';
26
+ modelCalls: number;
27
+ toolCalls: number;
28
+ durationMs: number;
29
+ maxOutputTokensPerCall: number;
30
+ /** Exact host routes allowed to run without a trustworthy input-token bound. */
31
+ routes: readonly GoalBudgetRoute[];
32
+ }
33
+ export type GoalBudgetConfig = GoalTokenBudgetConfig | GoalCallsBudgetConfig;
34
+ /** Host-only metering declaration for one exact route. Never supplied by a model tool. */
35
+ export interface GoalBudgetMeter {
36
+ id: string;
37
+ provider: string;
38
+ model: string;
39
+ inputTokenUpperBound(options: GenerateOptions): number | Promise<number>;
40
+ /** Conservative rates must cover every input/cache and output/reasoning billing class. */
41
+ inputUsdMicrosPerMillionTokens: number | null;
42
+ outputUsdMicrosPerMillionTokens: number | null;
43
+ }
44
+ export type GoalBudgetFailure = Readonly<{
45
+ stage: 'admission' | 'request-limit' | 'meter' | 'reserve' | 'stream' | 'usage' | 'settlement';
46
+ dispatched: boolean;
47
+ }>;
48
+ export declare function validateGoalBudgetConfig(input: GoalBudgetConfig): Readonly<GoalBudgetConfig>;
49
+ /** Durable reservations span all native rounds of a business goal, including edits and resumes. */
50
+ export declare class GoalBudgetRuntime {
51
+ #private;
52
+ private readonly ctx;
53
+ readonly config: Readonly<GoalBudgetConfig>;
54
+ private readonly current;
55
+ constructor(ctx: Context, path: string, config: Readonly<GoalBudgetConfig>, current: (agent: Agent) => {
56
+ record: GoalRecord;
57
+ run: GoalExecutionRun;
58
+ signal: AbortSignal;
59
+ } | undefined);
60
+ /** Host-only resolver for our fixed no-tools native strategy children. */
61
+ registerDelegateResolver(resolve: GoalBudgetDelegateResolver): () => void;
62
+ hasMeter: (route: {
63
+ provider?: string;
64
+ model?: string;
65
+ }) => boolean;
66
+ register: (input: GoalBudgetMeter) => (() => void);
67
+ inspect: (record: GoalRecord) => import("./budget-store.js").GoalBudgetSnapshot;
68
+ runUsage: (record: GoalRecord, runId: string) => Readonly<import("./budget-store.js").GoalBudgetRunUsage>;
69
+ lastFailure: (agent: Agent) => GoalBudgetFailure | undefined;
70
+ /** Candidate read path for Policy predicates; it never configures or consumes a budget. */
71
+ preview: (record: GoalRecord) => import("./budget-store.js").GoalBudgetSnapshot;
72
+ health: () => {
73
+ enabled: boolean;
74
+ registeredMeters: number;
75
+ activeCalls: number;
76
+ };
77
+ }
78
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}