@qduc/term2 0.33.0 → 0.35.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.
Files changed (228) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +39 -19
  3. package/dist/agent.js.map +1 -1
  4. package/dist/build-info.json +2 -2
  5. package/dist/cli.js +23 -3
  6. package/dist/cli.js.map +1 -1
  7. package/dist/completion-verification-admin.d.ts +2 -0
  8. package/dist/completion-verification-admin.d.ts.map +1 -0
  9. package/dist/completion-verification-admin.js +37 -0
  10. package/dist/completion-verification-admin.js.map +1 -0
  11. package/dist/components/input/MenuSurface.d.ts.map +1 -1
  12. package/dist/components/input/MenuSurface.js +12 -3
  13. package/dist/components/input/MenuSurface.js.map +1 -1
  14. package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
  15. package/dist/components/input/ModelMenuSession.js +15 -1
  16. package/dist/components/input/ModelMenuSession.js.map +1 -1
  17. package/dist/components/input/ProviderMenuSession.d.ts.map +1 -1
  18. package/dist/components/input/ProviderMenuSession.js +2 -2
  19. package/dist/components/input/ProviderMenuSession.js.map +1 -1
  20. package/dist/components/input/SettingsMenuSession.d.ts.map +1 -1
  21. package/dist/components/input/SettingsMenuSession.js +119 -82
  22. package/dist/components/input/SettingsMenuSession.js.map +1 -1
  23. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
  24. package/dist/components/input/SettingsValueMenuSession.js +18 -3
  25. package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
  26. package/dist/components/input/determine-active-menu.d.ts.map +1 -1
  27. package/dist/components/input/determine-active-menu.js +5 -1
  28. package/dist/components/input/determine-active-menu.js.map +1 -1
  29. package/dist/components/input/settings-intent-host.d.ts.map +1 -1
  30. package/dist/components/input/settings-intent-host.js +60 -4
  31. package/dist/components/input/settings-intent-host.js.map +1 -1
  32. package/dist/components/menu/ModelSelectionMenu.d.ts +4 -0
  33. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  34. package/dist/components/menu/ModelSelectionMenu.js +3 -2
  35. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  36. package/dist/components/menu/ProviderSelectionMenu.d.ts +1 -0
  37. package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
  38. package/dist/components/menu/ProviderSelectionMenu.js +21 -9
  39. package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
  40. package/dist/components/menu/SettingsSelectionMenu.d.ts +3 -0
  41. package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
  42. package/dist/components/menu/SettingsSelectionMenu.js +78 -47
  43. package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
  44. package/dist/components/menu/SettingsValueSelectionMenu.d.ts +2 -0
  45. package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
  46. package/dist/components/menu/SettingsValueSelectionMenu.js +17 -12
  47. package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
  48. package/dist/components/menu/settings-value-formatter.d.ts +8 -3
  49. package/dist/components/menu/settings-value-formatter.d.ts.map +1 -1
  50. package/dist/components/menu/settings-value-formatter.js +55 -32
  51. package/dist/components/menu/settings-value-formatter.js.map +1 -1
  52. package/dist/components/message/command-message-helpers.d.ts +5 -5
  53. package/dist/contracts/run-termination.d.ts +3 -1
  54. package/dist/contracts/run-termination.d.ts.map +1 -1
  55. package/dist/hooks/settings-completion-config.d.ts +28 -12
  56. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  57. package/dist/hooks/settings-completion-config.js +74 -76
  58. package/dist/hooks/settings-completion-config.js.map +1 -1
  59. package/dist/hooks/settings-completion-logic.d.ts +10 -1
  60. package/dist/hooks/settings-completion-logic.d.ts.map +1 -1
  61. package/dist/hooks/settings-completion-logic.js +80 -49
  62. package/dist/hooks/settings-completion-logic.js.map +1 -1
  63. package/dist/hooks/use-profile-selection.d.ts.map +1 -1
  64. package/dist/hooks/use-profile-selection.js +1 -0
  65. package/dist/hooks/use-profile-selection.js.map +1 -1
  66. package/dist/hooks/use-provider-selection.d.ts +6 -0
  67. package/dist/hooks/use-provider-selection.d.ts.map +1 -1
  68. package/dist/hooks/use-provider-selection.js +69 -10
  69. package/dist/hooks/use-provider-selection.js.map +1 -1
  70. package/dist/hooks/use-settings-completion.d.ts +14 -0
  71. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  72. package/dist/hooks/use-settings-completion.js +54 -6
  73. package/dist/hooks/use-settings-completion.js.map +1 -1
  74. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  75. package/dist/hooks/use-settings-value-completion.js +15 -4
  76. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  77. package/dist/lib/agent-client.d.ts.map +1 -1
  78. package/dist/lib/agent-client.js +32 -1
  79. package/dist/lib/agent-client.js.map +1 -1
  80. package/dist/non-interactive.d.ts +3 -1
  81. package/dist/non-interactive.d.ts.map +1 -1
  82. package/dist/non-interactive.js +18 -4
  83. package/dist/non-interactive.js.map +1 -1
  84. package/dist/prompts/bare.md +7 -0
  85. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  86. package/dist/prompts/prompt-constructor.js +7 -0
  87. package/dist/prompts/prompt-constructor.js.map +1 -1
  88. package/dist/prompts/prompt-constructor.ts +7 -0
  89. package/dist/prompts/shell-auto-approval.d.ts +2 -2
  90. package/dist/prompts/shell-auto-approval.d.ts.map +1 -1
  91. package/dist/prompts/shell-auto-approval.js +4 -3
  92. package/dist/prompts/shell-auto-approval.js.map +1 -1
  93. package/dist/prompts/shell-auto-approval.ts +4 -3
  94. package/dist/providers/grok.provider.d.ts +13 -3
  95. package/dist/providers/grok.provider.d.ts.map +1 -1
  96. package/dist/providers/grok.provider.js +82 -6
  97. package/dist/providers/grok.provider.js.map +1 -1
  98. package/dist/providers/model-catalog/catalog.generated.d.ts +347 -351
  99. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
  100. package/dist/providers/model-catalog/catalog.generated.js +362 -357
  101. package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
  102. package/dist/providers/openai-compatible-models.d.ts +9 -1
  103. package/dist/providers/openai-compatible-models.d.ts.map +1 -1
  104. package/dist/providers/openai-compatible-models.js +10 -2
  105. package/dist/providers/openai-compatible-models.js.map +1 -1
  106. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  107. package/dist/providers/openai-compatible.provider.js +9 -0
  108. package/dist/providers/openai-compatible.provider.js.map +1 -1
  109. package/dist/providers/orcarouter-models.d.ts.map +1 -1
  110. package/dist/providers/orcarouter-models.js +5 -1
  111. package/dist/providers/orcarouter-models.js.map +1 -1
  112. package/dist/providers/provider-presets.d.ts +37 -0
  113. package/dist/providers/provider-presets.d.ts.map +1 -0
  114. package/dist/providers/provider-presets.js +33 -0
  115. package/dist/providers/provider-presets.js.map +1 -0
  116. package/dist/providers/provider-presets.json +201 -0
  117. package/dist/providers/provider-service.d.ts +3 -2
  118. package/dist/providers/provider-service.d.ts.map +1 -1
  119. package/dist/providers/provider-service.js +4 -20
  120. package/dist/providers/provider-service.js.map +1 -1
  121. package/dist/services/agent-runtime/application-run-loop.d.ts +5 -1
  122. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  123. package/dist/services/agent-runtime/application-run-loop.js +63 -6
  124. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  125. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  126. package/dist/services/approval/shell-auto-approval-evaluator.js +8 -2
  127. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  128. package/dist/services/assembly/feature-selection.d.ts +48 -0
  129. package/dist/services/assembly/feature-selection.d.ts.map +1 -0
  130. package/dist/services/assembly/feature-selection.js +12 -0
  131. package/dist/services/assembly/feature-selection.js.map +1 -0
  132. package/dist/services/completion-verification/contracts.d.ts +151 -0
  133. package/dist/services/completion-verification/contracts.d.ts.map +1 -0
  134. package/dist/services/completion-verification/contracts.js +84 -0
  135. package/dist/services/completion-verification/contracts.js.map +1 -0
  136. package/dist/services/completion-verification/gate.d.ts +9 -0
  137. package/dist/services/completion-verification/gate.d.ts.map +1 -0
  138. package/dist/services/completion-verification/gate.js +60 -0
  139. package/dist/services/completion-verification/gate.js.map +1 -0
  140. package/dist/services/completion-verification/goal-stop-policy.d.ts +11 -0
  141. package/dist/services/completion-verification/goal-stop-policy.d.ts.map +1 -0
  142. package/dist/services/completion-verification/goal-stop-policy.js +63 -0
  143. package/dist/services/completion-verification/goal-stop-policy.js.map +1 -0
  144. package/dist/services/completion-verification/orchestrator.d.ts +26 -0
  145. package/dist/services/completion-verification/orchestrator.d.ts.map +1 -0
  146. package/dist/services/completion-verification/orchestrator.js +275 -0
  147. package/dist/services/completion-verification/orchestrator.js.map +1 -0
  148. package/dist/services/completion-verification/root-boundary.d.ts +21 -0
  149. package/dist/services/completion-verification/root-boundary.d.ts.map +1 -0
  150. package/dist/services/completion-verification/root-boundary.js +130 -0
  151. package/dist/services/completion-verification/root-boundary.js.map +1 -0
  152. package/dist/services/completion-verification/store.d.ts +13 -0
  153. package/dist/services/completion-verification/store.d.ts.map +1 -0
  154. package/dist/services/completion-verification/store.js +69 -0
  155. package/dist/services/completion-verification/store.js.map +1 -0
  156. package/dist/services/completion-verification/verifier.d.ts +11 -0
  157. package/dist/services/completion-verification/verifier.d.ts.map +1 -0
  158. package/dist/services/completion-verification/verifier.js +173 -0
  159. package/dist/services/completion-verification/verifier.js.map +1 -0
  160. package/dist/services/completion-verification/workspace.d.ts +17 -0
  161. package/dist/services/completion-verification/workspace.d.ts.map +1 -0
  162. package/dist/services/completion-verification/workspace.js +183 -0
  163. package/dist/services/completion-verification/workspace.js.map +1 -0
  164. package/dist/services/conversation/durable-goal-stop-check.js +1 -1
  165. package/dist/services/conversation/durable-goal-stop-check.js.map +1 -1
  166. package/dist/services/conversation/durable-goal.d.ts.map +1 -1
  167. package/dist/services/conversation/durable-goal.js +1 -1
  168. package/dist/services/conversation/durable-goal.js.map +1 -1
  169. package/dist/services/logging/conversation-log-events.d.ts +2 -0
  170. package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
  171. package/dist/services/logging/conversation-log-events.js.map +1 -1
  172. package/dist/services/models/model-resolution.d.ts +2 -0
  173. package/dist/services/models/model-resolution.d.ts.map +1 -1
  174. package/dist/services/models/model-resolution.js +13 -0
  175. package/dist/services/models/model-resolution.js.map +1 -1
  176. package/dist/services/profiles/active-profile.d.ts +6 -0
  177. package/dist/services/profiles/active-profile.d.ts.map +1 -1
  178. package/dist/services/profiles/active-profile.js +9 -0
  179. package/dist/services/profiles/active-profile.js.map +1 -1
  180. package/dist/services/profiles/labels.d.ts.map +1 -1
  181. package/dist/services/profiles/labels.js +2 -0
  182. package/dist/services/profiles/labels.js.map +1 -1
  183. package/dist/services/profiles/legacy-adapter.d.ts.map +1 -1
  184. package/dist/services/profiles/legacy-adapter.js +1 -0
  185. package/dist/services/profiles/legacy-adapter.js.map +1 -1
  186. package/dist/services/profiles/registry.d.ts.map +1 -1
  187. package/dist/services/profiles/registry.js +15 -0
  188. package/dist/services/profiles/registry.js.map +1 -1
  189. package/dist/services/settings/settings-env.d.ts +5 -0
  190. package/dist/services/settings/settings-env.d.ts.map +1 -1
  191. package/dist/services/settings/settings-env.js +22 -0
  192. package/dist/services/settings/settings-env.js.map +1 -1
  193. package/dist/services/settings/settings-merger.d.ts.map +1 -1
  194. package/dist/services/settings/settings-merger.js +2 -0
  195. package/dist/services/settings/settings-merger.js.map +1 -1
  196. package/dist/services/settings/settings-schema.d.ts +22 -0
  197. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  198. package/dist/services/settings/settings-schema.js +37 -0
  199. package/dist/services/settings/settings-schema.js.map +1 -1
  200. package/dist/services/settings/settings-service.d.ts +6 -0
  201. package/dist/services/settings/settings-service.d.ts.map +1 -1
  202. package/dist/services/settings/settings-service.js +21 -9
  203. package/dist/services/settings/settings-service.js.map +1 -1
  204. package/dist/services/settings/settings-sources.d.ts +6 -0
  205. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  206. package/dist/services/settings/settings-sources.js +4 -0
  207. package/dist/services/settings/settings-sources.js.map +1 -1
  208. package/dist/services/settings/settings-ui-metadata.d.ts +21 -0
  209. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
  210. package/dist/services/settings/settings-ui-metadata.js +203 -23
  211. package/dist/services/settings/settings-ui-metadata.js.map +1 -1
  212. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +1 -0
  213. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  214. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +4 -0
  215. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  216. package/dist/services/subagents/tool-policy.d.ts.map +1 -1
  217. package/dist/services/subagents/tool-policy.js +15 -9
  218. package/dist/services/subagents/tool-policy.js.map +1 -1
  219. package/dist/tools/agent/goal-check.js +2 -2
  220. package/dist/tools/agent/goal-check.js.map +1 -1
  221. package/dist/tools/agent/list-models.d.ts +71 -0
  222. package/dist/tools/agent/list-models.d.ts.map +1 -0
  223. package/dist/tools/agent/list-models.js +175 -0
  224. package/dist/tools/agent/list-models.js.map +1 -0
  225. package/dist/utils/value-suggestions.d.ts.map +1 -1
  226. package/dist/utils/value-suggestions.js +14 -11
  227. package/dist/utils/value-suggestions.js.map +1 -1
  228. package/package.json +2 -2
@@ -0,0 +1,275 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { DEFAULT_BUDGETS, POLICY_VERSION, budgetsSchema, decisionSchema, proposalSchema, reportSchema, } from './contracts.js';
3
+ import { mandatoryVerification } from './gate.js';
4
+ /** A deadline races even a broken adapter that ignores cancellation; late results have no write capability. */
5
+ async function bounded(operation, milliseconds, signal) {
6
+ const controller = new AbortController();
7
+ let timer;
8
+ let onAbort;
9
+ try {
10
+ return await Promise.race([
11
+ new Promise((_resolve, reject) => {
12
+ onAbort = () => {
13
+ controller.abort();
14
+ reject(new Error('Verification cancelled'));
15
+ };
16
+ signal?.addEventListener('abort', onAbort, { once: true });
17
+ timer = setTimeout(() => {
18
+ controller.abort();
19
+ reject(new Error('Verification deadline exceeded'));
20
+ }, milliseconds);
21
+ if (signal?.aborted)
22
+ onAbort();
23
+ }),
24
+ Promise.resolve().then(() => {
25
+ if (controller.signal.aborted)
26
+ throw new Error('Verification cancelled');
27
+ return operation(controller.signal);
28
+ }),
29
+ ]);
30
+ }
31
+ finally {
32
+ if (timer)
33
+ clearTimeout(timer);
34
+ if (onAbort)
35
+ signal?.removeEventListener('abort', onAbort);
36
+ }
37
+ }
38
+ export class CompletionVerificationOrchestrator {
39
+ store;
40
+ operations;
41
+ #owner = randomUUID();
42
+ #active = new Map();
43
+ #budgets;
44
+ constructor(store, operations, budgets = DEFAULT_BUDGETS) {
45
+ this.store = store;
46
+ this.operations = operations;
47
+ this.#budgets = budgetsSchema.parse(budgets);
48
+ }
49
+ configureNewTaskBudgets(budgets) {
50
+ this.#budgets = budgetsSchema.parse(budgets);
51
+ }
52
+ propose(raw, signal) {
53
+ const parsed = proposalSchema.safeParse(raw);
54
+ if (!parsed.success)
55
+ return Promise.resolve({ action: 'blocked', reason: 'Invalid completion proposal' });
56
+ const proposal = parsed.data;
57
+ // Duplicates in one owner share dispatch. Conflicting proposals never share a result.
58
+ const key = JSON.stringify(proposal);
59
+ const active = this.#active.get(key);
60
+ if (active)
61
+ return active;
62
+ const result = this.#run(proposal, signal)
63
+ .catch(() => {
64
+ this.#alert('Completion verification persistence or adapter failure');
65
+ return { action: 'blocked', reason: 'Completion verification failed; completion is not authorized' };
66
+ })
67
+ .finally(() => this.#active.delete(key));
68
+ this.#active.set(key, result);
69
+ return result;
70
+ }
71
+ #alert(message) {
72
+ try {
73
+ this.operations.alert?.(message);
74
+ }
75
+ catch {
76
+ /* Alerts cannot authorize completion. */
77
+ }
78
+ }
79
+ #persist(next, previous) {
80
+ if (!this.store.write(next, previous?.generation))
81
+ throw new Error('Stale verification transition');
82
+ try {
83
+ this.operations.observe?.(next);
84
+ }
85
+ catch {
86
+ this.#alert('Completion verification observability failed');
87
+ }
88
+ return next;
89
+ }
90
+ #settle(previous, update) {
91
+ return this.#persist({ ...previous, ...update, updatedAt: Date.now(), generation: previous.generation + 1 }, previous);
92
+ }
93
+ #blocked(previous, reason) {
94
+ const record = this.#settle(previous, { state: 'BLOCKED', reason });
95
+ return { action: 'blocked', reason, record };
96
+ }
97
+ async #revisionMatches(record, deadline, signal) {
98
+ if (signal?.aborted || Date.now() >= deadline)
99
+ return false;
100
+ try {
101
+ const revision = await bounded(() => this.operations.currentRevision(), Math.max(1, Math.min(10_000, deadline - Date.now())), signal);
102
+ return revision === record.revision && !signal?.aborted && Date.now() < deadline;
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ async #run(proposal, signal) {
109
+ const contract = createHash('sha256')
110
+ .update(JSON.stringify([proposal.goal, proposal.criteria, proposal.environment]))
111
+ .digest('hex');
112
+ const prior = this.store.read(proposal.taskId);
113
+ if (prior &&
114
+ (prior.contract !== contract ||
115
+ prior.state === 'COMPLETED' ||
116
+ prior.state === 'BLOCKED' ||
117
+ prior.state === 'ESCALATED')) {
118
+ if (prior.state === 'COMPLETED' &&
119
+ prior.contract === contract &&
120
+ prior.revision === proposal.revision &&
121
+ (await this.#revisionMatches(prior, Date.now() + 10_000, signal))) {
122
+ return { action: 'complete', record: prior };
123
+ }
124
+ return {
125
+ action: 'blocked',
126
+ reason: 'Task contract changed or task is terminal; explicit administrative recovery required',
127
+ record: prior,
128
+ };
129
+ }
130
+ if (prior?.state === 'VERIFICATION_PENDING') {
131
+ // Never redispatch an uncertain in-flight operation after restart. The lease remains authoritative.
132
+ if (prior.operationDeadline <= Date.now() || prior.owner !== this.#owner) {
133
+ return this.#blocked(prior, 'Unsettled verification after restart or lease expiration');
134
+ }
135
+ return { action: 'blocked', reason: 'Another completion attempt is pending', record: prior };
136
+ }
137
+ if (prior) {
138
+ if (prior.revision === proposal.revision)
139
+ return this.#blocked(prior, 'Repair made no repository progress');
140
+ if (prior.deadline <= Date.now() || prior.gates >= prior.budgets.maxGateAttempts) {
141
+ return this.#blocked(prior, 'Task deadline or gate budget exhausted');
142
+ }
143
+ }
144
+ const now = Date.now();
145
+ let record = this.#persist({
146
+ taskId: proposal.taskId,
147
+ contract,
148
+ revision: proposal.revision,
149
+ state: 'VERIFICATION_PENDING',
150
+ generation: prior ? prior.generation + 1 : 0,
151
+ owner: this.#owner,
152
+ attemptId: randomUUID(),
153
+ epoch: prior?.epoch ?? randomUUID(),
154
+ createdAt: prior?.createdAt ?? now,
155
+ updatedAt: now,
156
+ deadline: prior?.deadline ?? now + this.#budgets.taskTimeoutMs,
157
+ operationDeadline: Math.min(prior?.deadline ?? Infinity, now + (prior?.budgets.gateTimeoutMs ?? this.#budgets.gateTimeoutMs)),
158
+ repairs: prior?.repairs ?? 0,
159
+ gates: (prior?.gates ?? 0) + 1,
160
+ verifications: prior?.verifications ?? 0,
161
+ budgets: prior?.budgets ?? this.#budgets,
162
+ ...(prior?.report ? { report: prior.report } : {}),
163
+ reason: 'Completion proposed; gate dispatch reserved',
164
+ }, prior);
165
+ const gateStarted = performance.now();
166
+ let decision;
167
+ try {
168
+ decision = decisionSchema.parse(await bounded((operationSignal) => this.operations.gate(proposal, operationSignal), Math.max(1, record.operationDeadline - Date.now()), signal));
169
+ }
170
+ catch {
171
+ decision = {
172
+ action: 'independent_verify',
173
+ policyVersion: POLICY_VERSION,
174
+ reason: 'Gate failure; deterministic fallback',
175
+ };
176
+ }
177
+ if (signal?.aborted)
178
+ return this.#blocked(record, 'Verification cancelled');
179
+ decision = { ...decision, recommendedAction: decision.action };
180
+ if (mandatoryVerification(proposal))
181
+ decision = {
182
+ ...decision,
183
+ action: 'independent_verify',
184
+ reason: 'Mandatory verification policy override',
185
+ };
186
+ if (decision.action === 'quick_check' && !proposal.quickCheck)
187
+ decision = {
188
+ ...decision,
189
+ action: 'independent_verify',
190
+ reason: 'No applicable host-owned deterministic checker',
191
+ };
192
+ // Deterministic 5% skip audit; selected tasks are verified before completion.
193
+ if (decision.action === 'skip' &&
194
+ parseInt(createHash('sha256').update(proposal.taskId).digest('hex').slice(0, 8), 16) % 20 === 0) {
195
+ decision = { ...decision, action: 'independent_verify', auditedSkip: true, reason: 'Sampled skip audit' };
196
+ }
197
+ if (Date.now() >= record.deadline)
198
+ return this.#blocked(record, 'Task deadline exhausted');
199
+ record = this.#settle(record, {
200
+ decision,
201
+ gateLatencyMs: performance.now() - gateStarted,
202
+ reason: decision.reason,
203
+ });
204
+ if (decision.action === 'skip') {
205
+ record = this.#settle(record, { operationDeadline: Math.min(record.deadline, Date.now() + 10_000) });
206
+ if (!(await this.#revisionMatches(record, record.operationDeadline, signal))) {
207
+ return this.#blocked(record, 'Task changed or cancelled before completion');
208
+ }
209
+ record = this.#settle(record, {
210
+ state: 'COMPLETED',
211
+ reason: 'Policy-authorized completion without additional verification',
212
+ });
213
+ return { action: 'complete', record };
214
+ }
215
+ if (record.verifications >= record.budgets.maxVerifications)
216
+ return this.#blocked(record, 'Verification budget exhausted');
217
+ record = this.#settle(record, {
218
+ attemptId: randomUUID(),
219
+ verifications: record.verifications + 1,
220
+ operationDeadline: Math.min(record.deadline, Date.now() + record.budgets.operationTimeoutMs),
221
+ reason: 'Verification dispatch reserved',
222
+ });
223
+ // Deliberately exclude worker evidence, history, and subjective confidence.
224
+ const request = {
225
+ goal: proposal.goal,
226
+ criteria: proposal.criteria,
227
+ environment: proposal.environment,
228
+ revision: proposal.revision,
229
+ attemptId: record.attemptId,
230
+ };
231
+ const verificationStarted = performance.now();
232
+ let report;
233
+ try {
234
+ report = reportSchema.parse(await bounded((operationSignal) => decision.action === 'quick_check'
235
+ ? this.operations.quickCheck(proposal, request, operationSignal)
236
+ : this.operations.verify(request, operationSignal), Math.max(1, record.operationDeadline - Date.now()), signal));
237
+ }
238
+ catch {
239
+ record = this.#settle(record, { verificationLatencyMs: performance.now() - verificationStarted });
240
+ return this.#blocked(record, 'Verifier timeout, error, cancellation, or malformed result');
241
+ }
242
+ if (report.attemptId !== record.attemptId ||
243
+ report.revision !== proposal.revision ||
244
+ signal?.aborted ||
245
+ Date.now() >= record.operationDeadline ||
246
+ !(await this.#revisionMatches(record, Math.min(record.deadline, record.operationDeadline), signal))) {
247
+ return this.#blocked(record, 'Stale, late, conflicting, or cancelled verification result');
248
+ }
249
+ const previousReport = record.report;
250
+ record = this.#settle(record, {
251
+ report,
252
+ verificationLatencyMs: performance.now() - verificationStarted,
253
+ reason: `Verification outcome: ${report.outcome}`,
254
+ });
255
+ if (report.outcome === 'PASS') {
256
+ if (signal?.aborted || Date.now() >= Math.min(record.deadline, record.operationDeadline)) {
257
+ return this.#blocked(record, 'Deadline or cancellation reached before completion');
258
+ }
259
+ record = this.#settle(record, { state: 'COMPLETED', reason: `Completed through ${decision.action}` });
260
+ return { action: 'complete', record };
261
+ }
262
+ if (report.outcome !== 'FAIL')
263
+ return this.#blocked(record, `Verification ${report.outcome}; completion not established`);
264
+ if (record.repairs >= record.budgets.maxRepairs ||
265
+ record.verifications >= record.budgets.maxVerifications ||
266
+ Date.now() >= record.deadline ||
267
+ previousReport?.evidence === report.evidence) {
268
+ return this.#blocked(record, 'Repair budget, deadline, or repeated-failure limit reached');
269
+ }
270
+ // Consume the repair before returning its dispatch instruction. A crash never refunds it.
271
+ record = this.#settle(record, { state: 'REPAIR_REQUIRED', repairs: record.repairs + 1, reason: 'Repair reserved' });
272
+ return { action: 'repair', record };
273
+ }
274
+ }
275
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../source/services/completion-verification/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ProviderInputItem } from '../../contracts/provider-input.js';
2
+ import type { DurableGoal } from '../logging/conversation-log-events.js';
3
+ import type { ILoggingService, ISettingsService } from '../service-interfaces.js';
4
+ import type { ExecutionContext } from '../execution-context.js';
5
+ import type { ApplicationRunLoopDeps } from '../agent-runtime/application-run-loop.js';
6
+ import { type CompletionVerdict } from './contracts.js';
7
+ /** Root durable-goal adapter. The generic orchestrator has no dependency on conversational state. */
8
+ export declare class RootCompletionBoundary {
9
+ #private;
10
+ private deps;
11
+ constructor(deps: {
12
+ settings: ISettingsService;
13
+ logger: ILoggingService;
14
+ executionContext?: ExecutionContext;
15
+ resolveModel: ApplicationRunLoopDeps['resolveModel'];
16
+ model(): string;
17
+ });
18
+ verify(goal: DurableGoal, history: readonly ProviderInputItem[], signal?: AbortSignal): Promise<CompletionVerdict>;
19
+ dispose(): void;
20
+ }
21
+ //# sourceMappingURL=root-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-boundary.d.ts","sourceRoot":"","sources":["../../../source/services/completion-verification/root-boundary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAOzE,qGAAqG;AACrG,qBAAa,sBAAsB;;IAI/B,OAAO,CAAC,IAAI;IADd,YACU,IAAI,EAAE;QACZ,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,MAAM,EAAE,eAAe,CAAC;QACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,YAAY,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;QACrD,KAAK,IAAI,MAAM,CAAC;KACjB,EACC;IAqBE,MAAM,CACV,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAoG5B;IAED,OAAO,IAAI,IAAI,CAEd;CACF"}
@@ -0,0 +1,130 @@
1
+ import envPaths from 'env-paths';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { createOpenRouterDecisionClient } from '../decision-shadow/decision-client.js';
5
+ import { DEFAULT_BUDGETS } from './contracts.js';
6
+ import { createVerificationGate } from './gate.js';
7
+ import { CompletionVerificationOrchestrator } from './orchestrator.js';
8
+ import { VerificationStore } from './store.js';
9
+ import { UnsupportedWorkspaceError, snapshotWorkspace } from './workspace.js';
10
+ import { createIndependentVerifier, runQuickCheck } from './verifier.js';
11
+ /** Root durable-goal adapter. The generic orchestrator has no dependency on conversational state. */
12
+ export class RootCompletionBoundary {
13
+ deps;
14
+ #store;
15
+ #orchestrator;
16
+ constructor(deps) {
17
+ this.deps = deps;
18
+ }
19
+ #openStore() {
20
+ return (this.#store ??= new VerificationStore(path.join(envPaths('term2').data, 'completion-verification.sqlite')));
21
+ }
22
+ /**
23
+ * An unsupported workspace is an explicit outcome, not a generic failure: the user
24
+ * gets the reason and the operator gets an alert naming the task and the cause.
25
+ */
26
+ #unsupported(reason, message, goal, cwd, detail) {
27
+ this.deps.logger.error('Completion verification cannot inspect this workspace', {
28
+ eventType: 'completion_verification.operational_alert',
29
+ reason,
30
+ detail: detail ?? message,
31
+ environment: cwd,
32
+ taskId: createHash('sha256').update(`${cwd}\0${goal.id}`).digest('hex'),
33
+ });
34
+ return { action: 'blocked', reason: `Unsupported workspace: ${message}` };
35
+ }
36
+ async verify(goal, history, signal) {
37
+ const cwd = this.deps.executionContext?.getCwd() ?? process.cwd();
38
+ if (this.deps.executionContext?.isRemote())
39
+ return this.#unsupported('remote-workspace-unsupported', 'Remote workspace verification is unavailable', goal, cwd);
40
+ let snapshot;
41
+ try {
42
+ snapshot = await snapshotWorkspace(cwd);
43
+ }
44
+ catch (error) {
45
+ if (error instanceof UnsupportedWorkspaceError)
46
+ return this.#unsupported(error.reason, error.message, goal, cwd, error.detail);
47
+ throw error;
48
+ }
49
+ if (signal?.aborted)
50
+ return { action: 'blocked', reason: 'Completion verification cancelled' };
51
+ if (!this.#orchestrator) {
52
+ const settings = this.deps.settings;
53
+ this.#orchestrator = new CompletionVerificationOrchestrator(this.#openStore(), {
54
+ gate: createVerificationGate({
55
+ client: createOpenRouterDecisionClient({
56
+ resolveTransport: () => ({
57
+ apiKey: settings.get('agent.openrouter.apiKey') || process.env.OPENROUTER_API_KEY || '',
58
+ baseUrl: settings.get('agent.openrouter.baseUrl'),
59
+ }),
60
+ }),
61
+ model: () => settings.get('agent.decisionModel'),
62
+ }),
63
+ verify: createIndependentVerifier({
64
+ resolveModel: this.deps.resolveModel,
65
+ model: () => settings.get('verifier.model') || this.deps.model(),
66
+ }),
67
+ quickCheck: runQuickCheck,
68
+ currentRevision: async () => (await snapshotWorkspace(this.deps.executionContext?.getCwd() ?? process.cwd())).revision,
69
+ observe: (record) => this.deps.logger.info('Completion verification transition', {
70
+ eventType: 'completion_verification.transition',
71
+ taskId: record.taskId,
72
+ revision: record.revision,
73
+ state: record.state,
74
+ attemptId: record.attemptId,
75
+ generation: record.generation,
76
+ createdAt: record.createdAt,
77
+ updatedAt: record.updatedAt,
78
+ gateLatencyMs: record.gateLatencyMs,
79
+ verificationLatencyMs: record.verificationLatencyMs,
80
+ gate: record.decision,
81
+ outcome: record.report?.outcome,
82
+ reportAttemptId: record.report?.attemptId,
83
+ reportRevision: record.report?.revision,
84
+ reportCurrent: record.report?.attemptId === record.attemptId,
85
+ verifierVersion: record.report?.verifierVersion,
86
+ costUsdMicros: record.report?.costUsdMicros,
87
+ repairs: record.repairs,
88
+ gates: record.gates,
89
+ verifications: record.verifications,
90
+ deadline: record.deadline,
91
+ reason: record.reason,
92
+ }),
93
+ alert: (message) => this.deps.logger.error(message, { eventType: 'completion_verification.operational_alert' }),
94
+ }, { ...DEFAULT_BUDGETS, maxRepairs: settings.get('agent.verificationMaxRepairs') ?? 3 });
95
+ }
96
+ const call = [...history].reverse().find((item) => item.name === 'goal_check' && item.arguments !== undefined);
97
+ let evidence = 'Recorded worker completion claim';
98
+ if (call) {
99
+ try {
100
+ const args = typeof call.arguments === 'string' ? JSON.parse(call.arguments) : call.arguments;
101
+ if (typeof args?.evidence === 'string')
102
+ evidence = args.evidence;
103
+ }
104
+ catch {
105
+ /* Validated at the goal-stop seam; missing evidence falls back conservatively. */
106
+ }
107
+ }
108
+ const criteria = goal.successCriteria ?? '';
109
+ this.#orchestrator.configureNewTaskBudgets({
110
+ ...DEFAULT_BUDGETS,
111
+ maxRepairs: this.deps.settings.get('agent.verificationMaxRepairs') ?? 3,
112
+ });
113
+ return this.#orchestrator.propose({
114
+ ...snapshot,
115
+ taskId: createHash('sha256').update(`${snapshot.environment}\0${goal.id}`).digest('hex'),
116
+ goal: goal.outcome,
117
+ criteria,
118
+ evidence,
119
+ ...(criteria.trim() === 'git diff --check' &&
120
+ snapshot.classification === 'documentation' &&
121
+ snapshot.files.length > 0
122
+ ? { quickCheck: 'diff_whitespace' }
123
+ : {}),
124
+ }, signal);
125
+ }
126
+ dispose() {
127
+ this.#store?.close();
128
+ }
129
+ }
130
+ //# sourceMappingURL=root-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-boundary.js","sourceRoot":"","sources":["../../../source/services/completion-verification/root-boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type VerificationRecord } from './contracts.js';
2
+ /** One authoritative CAS row per task. All counters and dispatch leases commit together. */
3
+ export declare class VerificationStore {
4
+ #private;
5
+ constructor(filename: string);
6
+ read(taskId: string): VerificationRecord | undefined;
7
+ /** Undefined generation means insert only. Terminal rows cannot be changed through this API. */
8
+ write(record: VerificationRecord, expectedGeneration?: number): boolean;
9
+ /** Explicit administrative recovery; audit and removal are atomic. Never called by a worker. */
10
+ recover(taskId: string, operator: string, reason: string): void;
11
+ close(): void;
12
+ }
13
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../source/services/completion-verification/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,4FAA4F;AAC5F,qBAAa,iBAAiB;;IAG5B,YAAY,QAAQ,EAAE,MAAM,EAgB3B;IAED,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAKnD;IAED,gGAAgG;IAChG,KAAK,CAAC,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAoBtE;IAED,gGAAgG;IAChG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiB9D;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -0,0 +1,69 @@
1
+ import Database from 'better-sqlite3';
2
+ import { chmodSync, mkdirSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { recordSchema } from './contracts.js';
5
+ /** One authoritative CAS row per task. All counters and dispatch leases commit together. */
6
+ export class VerificationStore {
7
+ #db;
8
+ constructor(filename) {
9
+ mkdirSync(path.dirname(filename), { recursive: true, mode: 0o700 });
10
+ this.#db = new Database(filename);
11
+ chmodSync(filename, 0o600);
12
+ this.#db.pragma('busy_timeout = 5000');
13
+ this.#db.pragma('journal_mode = WAL');
14
+ this.#db.pragma('synchronous = FULL');
15
+ this.#db.exec(`
16
+ CREATE TABLE IF NOT EXISTS completion_verification (
17
+ task_id TEXT PRIMARY KEY, generation INTEGER NOT NULL, record TEXT NOT NULL
18
+ );
19
+ CREATE TABLE IF NOT EXISTS completion_verification_recovery (
20
+ id INTEGER PRIMARY KEY, task_id TEXT NOT NULL, operator TEXT NOT NULL,
21
+ reason TEXT NOT NULL, recorded_at INTEGER NOT NULL, previous_record TEXT NOT NULL
22
+ );
23
+ `);
24
+ }
25
+ read(taskId) {
26
+ const row = this.#db.prepare('SELECT record FROM completion_verification WHERE task_id = ?').get(taskId);
27
+ return row ? recordSchema.parse(JSON.parse(row.record)) : undefined;
28
+ }
29
+ /** Undefined generation means insert only. Terminal rows cannot be changed through this API. */
30
+ write(record, expectedGeneration) {
31
+ const value = recordSchema.parse(record);
32
+ if (expectedGeneration === undefined) {
33
+ return (this.#db
34
+ .prepare('INSERT OR IGNORE INTO completion_verification VALUES (?, ?, ?)')
35
+ .run(value.taskId, value.generation, JSON.stringify(value)).changes === 1);
36
+ }
37
+ if (value.generation !== expectedGeneration + 1)
38
+ throw new Error('Invalid verification generation');
39
+ return (this.#db
40
+ .prepare(`UPDATE completion_verification SET generation = ?, record = ?
41
+ WHERE task_id = ? AND generation = ?
42
+ AND json_extract(record, '$.epoch') = ?
43
+ AND json_extract(record, '$.state') IN ('VERIFICATION_PENDING', 'REPAIR_REQUIRED')`)
44
+ .run(value.generation, JSON.stringify(value), value.taskId, expectedGeneration, value.epoch).changes === 1);
45
+ }
46
+ /** Explicit administrative recovery; audit and removal are atomic. Never called by a worker. */
47
+ recover(taskId, operator, reason) {
48
+ if (!operator.trim() || !reason.trim())
49
+ throw new Error('Administrative recovery requires operator and reason');
50
+ this.#db
51
+ .transaction(() => {
52
+ const previous = this.read(taskId);
53
+ if (!previous)
54
+ throw new Error('Unknown verification task');
55
+ if (previous.state === 'VERIFICATION_PENDING' && previous.operationDeadline > Date.now())
56
+ throw new Error('Cannot recover an in-flight verification before its deadline');
57
+ this.#db
58
+ .prepare(`INSERT INTO completion_verification_recovery
59
+ (task_id, operator, reason, recorded_at, previous_record) VALUES (?, ?, ?, ?, ?)`)
60
+ .run(taskId, operator, reason, Date.now(), JSON.stringify(previous));
61
+ this.#db.prepare('DELETE FROM completion_verification WHERE task_id = ?').run(taskId);
62
+ })
63
+ .immediate();
64
+ }
65
+ close() {
66
+ this.#db.close();
67
+ }
68
+ }
69
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../source/services/completion-verification/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ApplicationRunLoopDeps } from '../agent-runtime/application-run-loop.js';
2
+ import { type VerificationRequest, type VerificationReport, type CompletionProposal } from './contracts.js';
3
+ export declare const VERIFIER_VERSION = "fresh-repository-verifier-v1";
4
+ /** Fresh run, literal instructions, a single original-goal message, no inherited history or memory. */
5
+ export declare function createIndependentVerifier(deps: {
6
+ resolveModel: ApplicationRunLoopDeps['resolveModel'];
7
+ model: () => string;
8
+ }): (request: VerificationRequest, signal: AbortSignal) => Promise<VerificationReport>;
9
+ /** The exact criterion is host-matched. No worker/model-generated command is ever executed. */
10
+ export declare function runQuickCheck(proposal: CompletionProposal, request: VerificationRequest, signal: AbortSignal): Promise<VerificationReport>;
11
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../source/services/completion-verification/verifier.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAE/D,uGAAuG;AACvG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,YAAY,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IACrD,KAAK,EAAE,MAAM,MAAM,CAAC;CACrB,aACwB,mBAAmB,UAAU,WAAW,KAAG,OAAO,CAAC,kBAAkB,CAAC,CAgH9F;AAkCD,+FAA+F;AAC/F,wBAAsB,aAAa,CACjC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,kBAAkB,CAAC,CA4B7B"}