@qvac/harness 0.7.1 → 1.0.0-rc.1

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 (201) hide show
  1. package/README.md +224 -0
  2. package/dist-lib/index.d.ts +55 -3
  3. package/dist-lib/index.js +721 -236
  4. package/dist-lib/lib/capabilities/completion-engine/abort-polyfill.d.ts +1 -0
  5. package/dist-lib/lib/capabilities/completion-engine/abort-polyfill.js +10 -0
  6. package/dist-lib/lib/capabilities/completion-engine/actors/answering.d.ts +3 -0
  7. package/dist-lib/lib/capabilities/completion-engine/actors/answering.js +17 -0
  8. package/dist-lib/lib/capabilities/completion-engine/actors/approval.d.ts +4 -0
  9. package/dist-lib/lib/capabilities/completion-engine/actors/approval.js +29 -0
  10. package/dist-lib/lib/capabilities/completion-engine/actors/direct-search.d.ts +4 -0
  11. package/dist-lib/lib/capabilities/completion-engine/actors/direct-search.js +73 -0
  12. package/dist-lib/lib/capabilities/completion-engine/actors/execute.d.ts +41 -0
  13. package/dist-lib/lib/capabilities/completion-engine/actors/execute.js +49 -0
  14. package/dist-lib/lib/capabilities/completion-engine/actors/executing.d.ts +3 -0
  15. package/dist-lib/lib/capabilities/completion-engine/actors/executing.js +102 -0
  16. package/dist-lib/lib/capabilities/completion-engine/actors/execution-plan.d.ts +47 -0
  17. package/dist-lib/lib/capabilities/completion-engine/actors/execution-plan.js +87 -0
  18. package/dist-lib/lib/capabilities/completion-engine/actors/finishing.d.ts +2 -0
  19. package/dist-lib/lib/capabilities/completion-engine/actors/finishing.js +32 -0
  20. package/dist-lib/lib/capabilities/completion-engine/actors/inspect-preload.d.ts +3 -0
  21. package/dist-lib/lib/capabilities/completion-engine/actors/inspect-preload.js +75 -0
  22. package/dist-lib/lib/capabilities/completion-engine/actors/inspecting.d.ts +3 -0
  23. package/dist-lib/lib/capabilities/completion-engine/actors/inspecting.js +152 -0
  24. package/dist-lib/lib/capabilities/completion-engine/actors/loading-skill.d.ts +3 -0
  25. package/dist-lib/lib/capabilities/completion-engine/actors/loading-skill.js +94 -0
  26. package/dist-lib/lib/capabilities/completion-engine/actors/preload-failure.d.ts +9 -0
  27. package/dist-lib/lib/capabilities/completion-engine/actors/preload-failure.js +11 -0
  28. package/dist-lib/lib/capabilities/completion-engine/actors/preloading.d.ts +3 -0
  29. package/dist-lib/lib/capabilities/completion-engine/actors/preloading.js +114 -0
  30. package/dist-lib/lib/capabilities/completion-engine/actors/preparing.d.ts +3 -0
  31. package/dist-lib/lib/capabilities/completion-engine/actors/preparing.js +198 -0
  32. package/dist-lib/lib/capabilities/completion-engine/actors/rejecting.d.ts +3 -0
  33. package/dist-lib/lib/capabilities/completion-engine/actors/rejecting.js +71 -0
  34. package/dist-lib/lib/capabilities/completion-engine/actors/rejection.d.ts +18 -0
  35. package/dist-lib/lib/capabilities/completion-engine/actors/rejection.js +70 -0
  36. package/dist-lib/lib/capabilities/completion-engine/actors/resolving.d.ts +3 -0
  37. package/dist-lib/lib/capabilities/completion-engine/actors/resolving.js +60 -0
  38. package/dist-lib/lib/capabilities/completion-engine/actors/stream.d.ts +21 -0
  39. package/dist-lib/lib/capabilities/completion-engine/actors/stream.js +48 -0
  40. package/dist-lib/lib/capabilities/completion-engine/actors/streaming.d.ts +3 -0
  41. package/dist-lib/lib/capabilities/completion-engine/actors/streaming.js +156 -0
  42. package/dist-lib/lib/capabilities/completion-engine/actors/wrap-up.d.ts +7 -0
  43. package/dist-lib/lib/capabilities/completion-engine/actors/wrap-up.js +61 -0
  44. package/dist-lib/lib/capabilities/completion-engine/driver.d.ts +25 -0
  45. package/dist-lib/lib/capabilities/completion-engine/driver.js +553 -0
  46. package/dist-lib/lib/capabilities/completion-engine/durable.d.ts +61 -0
  47. package/dist-lib/lib/capabilities/completion-engine/durable.js +150 -0
  48. package/dist-lib/lib/capabilities/completion-engine/operations.d.ts +6 -0
  49. package/dist-lib/lib/capabilities/completion-engine/operations.js +239 -0
  50. package/dist-lib/lib/capabilities/completion-engine/ports.d.ts +3 -0
  51. package/dist-lib/lib/capabilities/completion-engine/ports.js +267 -0
  52. package/dist-lib/lib/capabilities/completion-engine/session.d.ts +76 -0
  53. package/dist-lib/lib/capabilities/completion-engine/session.js +70 -0
  54. package/dist-lib/lib/capabilities/completion-loop/index.d.ts +80 -0
  55. package/dist-lib/lib/capabilities/completion-loop/index.js +158 -0
  56. package/dist-lib/lib/capabilities/completion-loop/metrics.d.ts +5 -0
  57. package/dist-lib/lib/capabilities/completion-loop/metrics.js +29 -0
  58. package/dist-lib/lib/capabilities/completion-loop/round.d.ts +33 -0
  59. package/dist-lib/lib/capabilities/completion-loop/round.js +353 -0
  60. package/dist-lib/lib/capabilities/completion-loop/tool-execution.d.ts +60 -0
  61. package/dist-lib/lib/capabilities/completion-loop/tool-execution.js +270 -0
  62. package/dist-lib/lib/capabilities/completion-loop/turns.d.ts +23 -0
  63. package/dist-lib/lib/capabilities/completion-loop/turns.js +112 -0
  64. package/dist-lib/lib/capabilities/completion-runtime.d.ts +46 -0
  65. package/dist-lib/lib/capabilities/completion-runtime.js +74 -0
  66. package/dist-lib/lib/capabilities/completion.d.ts +18 -335
  67. package/dist-lib/lib/capabilities/completion.js +20 -1301
  68. package/dist-lib/lib/capabilities/download.d.ts +1 -1
  69. package/dist-lib/lib/capabilities/download.js +7 -2
  70. package/dist-lib/lib/capabilities/invoke.js +5 -3
  71. package/dist-lib/lib/capabilities/tool-plan.d.ts +35 -0
  72. package/dist-lib/lib/capabilities/tool-plan.js +66 -0
  73. package/dist-lib/lib/capabilities/tool-turns.d.ts +11 -2
  74. package/dist-lib/lib/capabilities/tool-turns.js +30 -2
  75. package/dist-lib/lib/capabilities/types.d.ts +287 -0
  76. package/dist-lib/lib/capabilities/types.js +1 -0
  77. package/dist-lib/lib/completion-lifecycle.d.ts +14 -0
  78. package/dist-lib/lib/completion-lifecycle.js +126 -0
  79. package/dist-lib/lib/connect.d.ts +10 -3
  80. package/dist-lib/lib/connect.js +329 -23
  81. package/dist-lib/lib/contract-types.d.ts +19 -2
  82. package/dist-lib/lib/harness-lifecycle.d.ts +66 -0
  83. package/dist-lib/lib/harness-lifecycle.js +129 -0
  84. package/dist-lib/lib/helpers/detach-json.d.ts +1 -0
  85. package/dist-lib/lib/helpers/detach-json.js +146 -0
  86. package/dist-lib/lib/helpers/markup-scanner.d.ts +26 -0
  87. package/dist-lib/lib/helpers/markup-scanner.js +156 -0
  88. package/dist-lib/lib/helpers/markup-stream-filter.js +138 -35
  89. package/dist-lib/lib/helpers/race-abort.d.ts +9 -4
  90. package/dist-lib/lib/helpers/race-abort.js +2 -7
  91. package/dist-lib/lib/helpers/recovery-required.d.ts +1 -0
  92. package/dist-lib/lib/helpers/recovery-required.js +1 -0
  93. package/dist-lib/lib/helpers/run-outcome.d.ts +10 -2
  94. package/dist-lib/lib/helpers/run-outcome.js +8 -5
  95. package/dist-lib/lib/helpers/tool-call-markup.d.ts +2 -0
  96. package/dist-lib/lib/helpers/tool-call-markup.js +197 -82
  97. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +1 -0
  98. package/dist-lib/lib/hooks/built-in/arg-repair.js +1 -0
  99. package/dist-lib/lib/hooks/built-in/egress.d.ts +1 -0
  100. package/dist-lib/lib/hooks/built-in/egress.js +2 -1
  101. package/dist-lib/lib/hooks/built-in/sandbox.d.ts +1 -0
  102. package/dist-lib/lib/hooks/built-in/sandbox.js +6 -1
  103. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +1 -0
  104. package/dist-lib/lib/hooks/built-in/skill-catalog.js +2 -1
  105. package/dist-lib/lib/hooks/pipeline.d.ts +4 -1
  106. package/dist-lib/lib/hooks/pipeline.js +24 -2
  107. package/dist-lib/lib/hooks/run.d.ts +2 -1
  108. package/dist-lib/lib/hooks/run.js +19 -7
  109. package/dist-lib/lib/hooks/types.d.ts +17 -6
  110. package/dist-lib/lib/machine/completion/actions/approval.d.ts +3 -0
  111. package/dist-lib/lib/machine/completion/actions/approval.js +16 -0
  112. package/dist-lib/lib/machine/completion/actions/completion.d.ts +23 -0
  113. package/dist-lib/lib/machine/completion/actions/completion.js +142 -0
  114. package/dist-lib/lib/machine/completion/actions/skills.d.ts +9 -0
  115. package/dist-lib/lib/machine/completion/actions/skills.js +83 -0
  116. package/dist-lib/lib/machine/completion/actions/tools.d.ts +16 -0
  117. package/dist-lib/lib/machine/completion/actions/tools.js +173 -0
  118. package/dist-lib/lib/machine/completion/context.d.ts +9 -0
  119. package/dist-lib/lib/machine/completion/context.js +44 -0
  120. package/dist-lib/lib/machine/completion/contract.d.ts +6 -0
  121. package/dist-lib/lib/machine/completion/contract.js +1 -0
  122. package/dist-lib/lib/machine/completion/guards/retry.d.ts +9 -0
  123. package/dist-lib/lib/machine/completion/guards/retry.js +25 -0
  124. package/dist-lib/lib/machine/completion/implementations.d.ts +81 -0
  125. package/dist-lib/lib/machine/completion/implementations.js +152 -0
  126. package/dist-lib/lib/machine/completion/machine.d.ts +375 -0
  127. package/dist-lib/lib/machine/completion/machine.js +511 -0
  128. package/dist-lib/lib/machine/completion/ports.d.ts +65 -0
  129. package/dist-lib/lib/machine/completion/ports.js +224 -0
  130. package/dist-lib/lib/machine/completion/rules.d.ts +39 -0
  131. package/dist-lib/lib/machine/completion/rules.js +115 -0
  132. package/dist-lib/lib/machine/completion/types.d.ts +493 -0
  133. package/dist-lib/lib/machine/completion/types.js +1 -0
  134. package/dist-lib/lib/machine/engine.d.ts +93 -0
  135. package/dist-lib/lib/machine/engine.js +483 -0
  136. package/dist-lib/lib/machine/errors.d.ts +44 -0
  137. package/dist-lib/lib/machine/errors.js +373 -0
  138. package/dist-lib/lib/machine/guards.d.ts +2 -0
  139. package/dist-lib/lib/machine/guards.js +6 -0
  140. package/dist-lib/lib/machine/index.d.ts +20 -0
  141. package/dist-lib/lib/machine/index.js +11 -0
  142. package/dist-lib/lib/machine/replay-output.d.ts +24 -0
  143. package/dist-lib/lib/machine/replay-output.js +50 -0
  144. package/dist-lib/lib/machine/stable-stringify.d.ts +1 -0
  145. package/dist-lib/lib/machine/stable-stringify.js +11 -0
  146. package/dist-lib/lib/models/model-pool.d.ts +14 -6
  147. package/dist-lib/lib/models/model-pool.js +95 -30
  148. package/dist-lib/lib/run-log/history-codec.d.ts +23 -0
  149. package/dist-lib/lib/run-log/history-codec.js +973 -0
  150. package/dist-lib/lib/run-log/patch.d.ts +6 -0
  151. package/dist-lib/lib/run-log/patch.js +93 -0
  152. package/dist-lib/lib/run-log/persisted-actor.d.ts +18 -0
  153. package/dist-lib/lib/run-log/persisted-actor.js +218 -0
  154. package/dist-lib/lib/run-log/protocol-types.d.ts +153 -0
  155. package/dist-lib/lib/run-log/protocol-types.js +1 -0
  156. package/dist-lib/lib/run-log/protocol.d.ts +27 -0
  157. package/dist-lib/lib/run-log/protocol.js +1056 -0
  158. package/dist-lib/lib/run-log/replay.d.ts +25 -0
  159. package/dist-lib/lib/run-log/replay.js +129 -0
  160. package/dist-lib/lib/run-log/run-journal.d.ts +125 -0
  161. package/dist-lib/lib/run-log/run-journal.js +783 -0
  162. package/dist-lib/lib/run-log-inspect.d.ts +25 -0
  163. package/dist-lib/lib/run-log-inspect.js +627 -0
  164. package/dist-lib/lib/run-log-protocol.d.ts +2 -0
  165. package/dist-lib/lib/run-log-protocol.js +1 -0
  166. package/dist-lib/lib/run-log-redact.d.ts +27 -0
  167. package/dist-lib/lib/run-log-redact.js +1107 -0
  168. package/dist-lib/lib/serve.js +307 -11
  169. package/dist-lib/lib/spawn.js +3 -2
  170. package/dist-lib/lib/tool-call-display.d.ts +1 -21
  171. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +2 -1
  172. package/dist-lib/lib/tools/exec.d.ts +2 -1
  173. package/dist-lib/lib/tools/exec.js +57 -2
  174. package/dist-lib/lib/tools/generate-image.js +1 -1
  175. package/dist-lib/lib/tools/generate-music.js +1 -1
  176. package/dist-lib/lib/tools/http-request.d.ts +2 -1
  177. package/dist-lib/lib/tools/http-request.js +2 -1
  178. package/dist-lib/lib/tools/mcp-call.js +8 -1
  179. package/dist-lib/lib/tools/operations/builders.d.ts +1 -0
  180. package/dist-lib/lib/tools/operations/builders.js +1 -0
  181. package/dist-lib/lib/tools/operations/compile.js +11 -1
  182. package/dist-lib/lib/tools/operations/manifest.js +1 -0
  183. package/dist-lib/lib/tools/outbound-guard.d.ts +8 -6
  184. package/dist-lib/lib/tools/outbound-guard.js +25 -8
  185. package/dist-lib/lib/tools/skills/catalog.d.ts +1 -0
  186. package/dist-lib/lib/tools/skills/catalog.js +35 -0
  187. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +1 -0
  188. package/dist-lib/lib/tools/skills/cli-schema.js +25 -0
  189. package/dist-lib/lib/wire.d.ts +5 -0
  190. package/dist-lib/lib/wire.js +128 -5
  191. package/dist-lib/schema/harness.js +20 -5
  192. package/dist-lib/spec/hrpc/messages.js +95 -15
  193. package/dist-lib/spec/hyperschema/index.js +95 -15
  194. package/dist-lib/spec/hyperschema/schema.json +69 -1
  195. package/dist-lib/spec/hyperschema/types.d.ts +10 -3
  196. package/package.json +20 -2
  197. package/patches/@qvac%2Finference@0.20.0.patch +67 -0
  198. package/patches/bare-stow@0.1.5.patch +68 -0
  199. package/patches/hypercore-blob-server@1.15.0.patch +15 -0
  200. package/patches/localwatch@1.4.3.patch +13 -0
  201. package/patches/pyodide@314.0.2.patch +144 -0
@@ -0,0 +1,76 @@
1
+ import type { Tool as SdkTool } from '@qvac/sdk';
2
+ import { HookPipeline } from '../../hooks/pipeline.ts';
3
+ import type { HarnessHook } from '../../hooks/types.ts';
4
+ import type { LlmGenerationParams } from '../../models/llm-presets.ts';
5
+ import type { CliValidator } from '../../tools/skills/cli-schema.ts';
6
+ import type { DriveRoot } from '../../tools/fs/scope.ts';
7
+ import type { SkillActivation } from '../tool-selection.ts';
8
+ import { type RunOutcomeTracker } from '../../helpers/run-outcome.ts';
9
+ import type { CompletionEvent, CompletionSdk, RunBackendUse, RunBudget, ToolDefinition } from '../completion.ts';
10
+ import type { CompletionArgs, CompletionSkillEntry, ToolContextFactory } from '../completion-loop/index.ts';
11
+ import type { PromptUsageChars } from '../usage-breakdown.ts';
12
+ import { type InvokeTracker, type CompletionActorOutput, type CompletionMachineContext as CompletionContext } from '../../machine/index.ts';
13
+ import type { EngineOperationPort } from '../../machine/index.ts';
14
+ export type RuntimeBinding = 'approve' | 'attach' | 'fetchAttachment' | 'ragSearch' | 'askUser';
15
+ export interface Session extends InvokeTracker {
16
+ bindings: RuntimeBinding[];
17
+ runId: string;
18
+ pipeline: HookPipeline;
19
+ enabled: ToolDefinition[];
20
+ sdkTools: SdkTool[] | undefined;
21
+ grantedOps: Map<string, CliValidator[]>;
22
+ behaviorDigest: string;
23
+ activation: SkillActivation;
24
+ inContextSkills: CompletionSkillEntry[];
25
+ loadedThisTurn: Set<string>;
26
+ loadedFilesThisTurn: Set<string>;
27
+ loadedSkillFiles: Map<string, Set<string>>;
28
+ nudgedSkills: Set<string>;
29
+ backends: RunBackendUse[];
30
+ landed: string[];
31
+ runOutcomes: RunOutcomeTracker;
32
+ callKey(name: string, args: Record<string, unknown>): string;
33
+ skillIcon: string | null;
34
+ writableRoots: DriveRoot[];
35
+ runBudget: RunBudget;
36
+ toolContext: ToolContextFactory;
37
+ turnImages: {
38
+ path: string;
39
+ }[];
40
+ generationParams: LlmGenerationParams | undefined;
41
+ runStarted: boolean;
42
+ promptParts: PromptUsageChars | null;
43
+ startedAt: number;
44
+ now: () => number;
45
+ reselectTools: ((loadedSkills: ReadonlySet<string>) => string | null) | null;
46
+ }
47
+ export interface CompletionDeps {
48
+ sdk?: CompletionSdk;
49
+ args: CompletionArgs;
50
+ session: Session;
51
+ operations: EngineOperationPort;
52
+ commitFacts?: () => void;
53
+ commitSettledFacts?: (operationId: string) => void;
54
+ }
55
+ export interface CompletionActorInput {
56
+ input: CompletionDeps;
57
+ context: CompletionContext;
58
+ signal: CompletionInvocationSignal;
59
+ reconstruct?: boolean;
60
+ emit(event: CompletionEvent): void;
61
+ }
62
+ export interface CompletionInvocationSignal {
63
+ readonly aborted: boolean;
64
+ addEventListener(type: 'abort', listener: () => void): void;
65
+ removeEventListener(type: 'abort', listener: () => void): void;
66
+ }
67
+ export type CompletionActor<Output = CompletionActorOutput> = (input: CompletionActorInput) => Promise<Output>;
68
+ export interface CreateSessionOptions {
69
+ runId: string;
70
+ invokes?: InvokeTracker;
71
+ now?: () => number;
72
+ requestDigestKey?: Uint8Array;
73
+ digestRunId?: string;
74
+ hooks?: readonly HarnessHook[];
75
+ }
76
+ export declare function createSession(args: CompletionArgs, options: CreateSessionOptions): Session;
@@ -0,0 +1,70 @@
1
+ import { HookPipeline } from '../../hooks/pipeline.js';
2
+ import { createRunOutcomeTracker } from '../../helpers/run-outcome.js';
3
+ import { createRunBudget, runToolContext } from '../completion-loop/index.js';
4
+ import { createHash, createHmac, randomBytes } from 'crypto';
5
+ import { createInvokeTracker, stableStringify } from '../../machine/index.js';
6
+ export function createSession(args, options) {
7
+ const { runId, invokes = createInvokeTracker(), now = () => Date.now(), requestDigestKey, digestRunId, hooks } = options;
8
+ const runBudget = createRunBudget(now());
9
+ const runOutcomes = createRunOutcomeTracker();
10
+ const callKeySecret = requestDigestKey
11
+ ? createHmac('sha256', requestDigestKey)
12
+ .update('qvac:completion:call-key:v1\0')
13
+ .update(digestRunId ?? runId)
14
+ .digest()
15
+ : randomBytes(32);
16
+ return {
17
+ bindings: ['approve', 'attach', 'fetchAttachment', 'ragSearch', 'askUser'].filter((name) => typeof args[name] === 'function'),
18
+ runId,
19
+ pipeline: new HookPipeline(hooks),
20
+ enabled: [],
21
+ sdkTools: undefined,
22
+ grantedOps: new Map(),
23
+ behaviorDigest: createHash('sha256')
24
+ .update(stableStringify((args.tools ?? [])
25
+ .map((tool) => ({
26
+ name: tool.name,
27
+ policyVersion: tool.policyVersion ?? null,
28
+ effect: String(tool.effect),
29
+ validate: String(tool.validate),
30
+ resource: String(tool.resource),
31
+ landedWrite: String(tool.landedWrite),
32
+ execute: String(tool.execute)
33
+ }))
34
+ .sort((left, right) => left.name.localeCompare(right.name))))
35
+ .digest('hex'),
36
+ activation: {
37
+ skillsSelected: false,
38
+ enabledSkills: [],
39
+ mention: null,
40
+ loadedSkills: new Set()
41
+ },
42
+ inContextSkills: [],
43
+ loadedThisTurn: new Set(),
44
+ loadedFilesThisTurn: new Set(),
45
+ loadedSkillFiles: new Map(),
46
+ nudgedSkills: new Set(),
47
+ backends: [],
48
+ landed: runOutcomes.confirmedWrites,
49
+ runOutcomes,
50
+ callKey(name, callArgs) {
51
+ const payload = stableStringify({ name, args: callArgs });
52
+ return `call:${createHmac('sha256', callKeySecret)
53
+ .update('qvac:completion:call:v1\0')
54
+ .update(payload)
55
+ .digest('hex')}`;
56
+ },
57
+ skillIcon: null,
58
+ reselectTools: null,
59
+ writableRoots: [],
60
+ runBudget,
61
+ toolContext: runToolContext(args, runBudget),
62
+ turnImages: [],
63
+ generationParams: undefined,
64
+ runStarted: false,
65
+ promptParts: null,
66
+ startedAt: now(),
67
+ now,
68
+ ...invokes
69
+ };
70
+ }
@@ -0,0 +1,80 @@
1
+ import type { Tool as SdkTool } from '@qvac/sdk';
2
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
3
+ import type { LlmGenerationParams } from '../../models/llm-presets.ts';
4
+ import type { DriveRoot } from '../../tools/fs/scope.ts';
5
+ import type { SkillCatalogEntry } from '../../tools/skills/catalog.ts';
6
+ import type { RecoveryResolution } from '../../machine/index.ts';
7
+ import { type SkillState } from '../../tools/skills/skill-state-constants.ts';
8
+ import { enabledTools } from '../tool-selection.ts';
9
+ import type { ToolCallDisplay } from '../../tool-call-display.ts';
10
+ import type { Agent, CompletionEvent, ApproveFn, AskUserFn, AttachFn, FetchAttachmentFn, ImageSettings, Message, ProgressFn, RagSearchFn, ResponseFormat, RunBudget, RoundModelLease, ToolDefinition, ToolExecuteContext } from '../types.ts';
11
+ export { isSelected, skillsAreSelected } from '../tool-selection.ts';
12
+ export { enabledTools };
13
+ export { loadedSkillsFrom, skillLoadedTurn } from '../tool-turns.ts';
14
+ export { SKILL_TOOL_NAME, WEB_SEARCH_TOOL_NAME } from '../tool-names.ts';
15
+ export { foldMetrics, metricsEvent, type MetricsState } from './metrics.ts';
16
+ export { CONTEXT_OVERFLOW_MESSAGE, runRecoveredRound, type RecoveredRound, type RoundArgs } from './round.ts';
17
+ export { callSucceeded, executeCall, MAX_BLOCKED_REPEATS, settledFailure, toolCallKey, inspectToolPolicy, readyPreflightFromFacts, preflightToolCall, resolveToolCalls, type ResolvedCall, type ToolPreflight } from './tool-execution.ts';
18
+ export { assistantToolTurn, annotateCompletionHistoryLastUserTime, directToolHistory, explicitWebSearchQuery, lastUserContent, lastUserImages, preloadLastUser, sanitizeTurn, trustedSourcesFrom } from './turns.ts';
19
+ export declare function imageSettingsFrom(agent?: Agent): ImageSettings | undefined;
20
+ export interface CompletionArgs {
21
+ runId?: string;
22
+ resume?: boolean;
23
+ recovery?: RecoveryResolution[];
24
+ lockOwner?: object;
25
+ modelId: string;
26
+ acquireRound?: (signal?: BareAbortSignal) => Promise<RoundModelLease>;
27
+ model?: string;
28
+ agent?: Agent;
29
+ ctxSize?: number;
30
+ cacheKey?: string;
31
+ thinkingDefault?: string;
32
+ generationParams?: LlmGenerationParams;
33
+ responseFormat?: ResponseFormat;
34
+ messages: Message[];
35
+ requestMessages?: Message[];
36
+ tools?: ToolDefinition[];
37
+ skillCatalog?: readonly CompletionSkillEntry[];
38
+ approve?: ApproveFn;
39
+ attach?: AttachFn;
40
+ fetchAttachment?: FetchAttachmentFn;
41
+ ragSearch?: RagSearchFn;
42
+ progress?: ProgressFn;
43
+ askUser?: AskUserFn;
44
+ signal?: BareAbortSignal;
45
+ toolConfigs?: Record<string, Record<string, unknown>>;
46
+ fsRoots?: readonly DriveRoot[];
47
+ fsWriteRoots?: readonly DriveRoot[];
48
+ captureInferenceCalls?: boolean;
49
+ }
50
+ export { MAX_CAPPED_ROUNDS, MAX_MUTE_ROUNDS, MAX_TOOL_ROUNDS } from '../../machine/index.ts';
51
+ export declare const MAX_WEB_SEARCHES_PER_TURN = 3;
52
+ export declare const WEB_SEARCH_LIMIT_MESSAGE: string;
53
+ export declare function toSdkTool(tool: ToolDefinition): SdkTool;
54
+ export declare function labelOf(name: string, args: Record<string, unknown>, emoji: string | null): ToolCallDisplay;
55
+ export declare function skillEmojiFrom(catalog: readonly CompletionSkillEntry[], name: string): string | null;
56
+ export type CompletionSkillEntry = SkillCatalogEntry & {
57
+ readonly status?: SkillState;
58
+ };
59
+ export declare function skillInContext(entry: CompletionSkillEntry): boolean;
60
+ export declare function unreadySkillState(name: string, catalog: readonly CompletionSkillEntry[]): SkillState | null;
61
+ export declare function reportUnnamedWrites(said: string, landed: ReadonlyArray<string>): Generator<CompletionEvent>;
62
+ export declare function reportLandedWrites(landed: ReadonlyArray<string>): Generator<CompletionEvent>;
63
+ export declare function createRunBudget(startedAt: number): RunBudget;
64
+ export type ToolContextFactory = (turnImages?: {
65
+ path: string;
66
+ }[], ctxSize?: number, signal?: BareAbortSignal) => ToolExecuteContext;
67
+ export declare function runToolContext(args: Pick<CompletionArgs, 'agent' | 'attach' | 'fetchAttachment' | 'ragSearch' | 'progress' | 'askUser' | 'signal' | 'fsRoots' | 'fsWriteRoots'>, runBudget: RunBudget): ToolContextFactory;
68
+ export interface ToolSelectionInputs {
69
+ responseFormat: boolean;
70
+ tools: readonly ToolDefinition[];
71
+ toolsSelected: boolean;
72
+ allowlist: ReadonlyArray<string>;
73
+ activeSkills: readonly CompletionSkillEntry[];
74
+ loadedSkills: ReadonlySet<string>;
75
+ grantedNames: ReadonlySet<string>;
76
+ grantedOwners: ReadonlyMap<string, ReadonlySet<string>>;
77
+ hasRoots: boolean;
78
+ hasWriteRoots: boolean;
79
+ }
80
+ export declare function selectEnabledTools(inputs: ToolSelectionInputs): ToolDefinition[];
@@ -0,0 +1,158 @@
1
+ import process from 'process';
2
+ import { isAvailableState } from '../../tools/skills/skill-state-constants.js';
3
+ import { unnamedWrites, writeReport } from '../../helpers/run-outcome.js';
4
+ import { INTENT_PARAM, INTENT_PARAM_DESCRIPTION } from '../../helpers/tool-intent.js';
5
+ import { fallbackToolLabel } from '../../helpers/tool-label.js';
6
+ import { collectToolGrants, enabledTools } from '../tool-selection.js';
7
+ export { isSelected, skillsAreSelected } from '../tool-selection.js';
8
+ export { enabledTools };
9
+ export { loadedSkillsFrom, skillLoadedTurn } from '../tool-turns.js';
10
+ export { SKILL_TOOL_NAME, WEB_SEARCH_TOOL_NAME } from '../tool-names.js';
11
+ export { foldMetrics, metricsEvent } from './metrics.js';
12
+ export { CONTEXT_OVERFLOW_MESSAGE, runRecoveredRound } from './round.js';
13
+ export { callSucceeded, executeCall, MAX_BLOCKED_REPEATS, settledFailure, toolCallKey, inspectToolPolicy, readyPreflightFromFacts, preflightToolCall, resolveToolCalls } from './tool-execution.js';
14
+ export { assistantToolTurn, annotateCompletionHistoryLastUserTime, directToolHistory, explicitWebSearchQuery, lastUserContent, lastUserImages, preloadLastUser, sanitizeTurn, trustedSourcesFrom } from './turns.js';
15
+ export function imageSettingsFrom(agent) {
16
+ if (!agent) {
17
+ return undefined;
18
+ }
19
+ const settings = {};
20
+ if (agent.imageModelChoice) {
21
+ settings.modelChoice = agent.imageModelChoice;
22
+ }
23
+ if (agent.imageSteps) {
24
+ settings.steps = agent.imageSteps;
25
+ }
26
+ if (agent.imageWidth) {
27
+ settings.width = agent.imageWidth;
28
+ }
29
+ if (agent.imageHeight) {
30
+ settings.height = agent.imageHeight;
31
+ }
32
+ return Object.keys(settings).length ? settings : undefined;
33
+ }
34
+ export { MAX_CAPPED_ROUNDS, MAX_MUTE_ROUNDS, MAX_TOOL_ROUNDS } from '../../machine/index.js';
35
+ export const MAX_WEB_SEARCHES_PER_TURN = 3;
36
+ export const WEB_SEARCH_LIMIT_MESSAGE = 'Web search limit reached for this question. Answer now from the results already gathered. ' +
37
+ 'If something was not found, say so plainly and mention the most relevant sources. ' +
38
+ 'Do not call web_search again.';
39
+ function intentParameters(tool, params) {
40
+ if (tool.autoApprove === true || INTENT_PARAM in params.properties) {
41
+ return params;
42
+ }
43
+ return {
44
+ ...params,
45
+ properties: {
46
+ [INTENT_PARAM]: { type: 'string', description: INTENT_PARAM_DESCRIPTION },
47
+ ...params.properties
48
+ },
49
+ required: [INTENT_PARAM, ...(params.required ?? [])]
50
+ };
51
+ }
52
+ function sdkParameterSchema(schema) {
53
+ const { sensitive: _sensitive, properties, items, ...rest } = schema;
54
+ return {
55
+ ...rest,
56
+ properties: properties
57
+ ? Object.fromEntries(Object.entries(properties).map(([key, value]) => [key, sdkParameterSchema(value)]))
58
+ : undefined,
59
+ items: items ? sdkParameterSchema(items) : undefined
60
+ };
61
+ }
62
+ function sdkParameters(parameters) {
63
+ return {
64
+ ...parameters,
65
+ properties: Object.fromEntries(Object.entries(parameters.properties).map(([key, value]) => [key, sdkParameterSchema(value)]))
66
+ };
67
+ }
68
+ export function toSdkTool(tool) {
69
+ return {
70
+ type: 'function',
71
+ name: tool.name,
72
+ description: tool.prompt?.description ?? tool.description,
73
+ parameters: sdkParameters(intentParameters(tool, tool.prompt?.parameters ?? tool.parameters))
74
+ };
75
+ }
76
+ export function labelOf(name, args, emoji) {
77
+ const display = { label: fallbackToolLabel(name, args) };
78
+ return emoji ? { ...display, iconEmoji: emoji } : display;
79
+ }
80
+ export function skillEmojiFrom(catalog, name) {
81
+ return catalog.find((entry) => entry.name === name)?.emoji ?? null;
82
+ }
83
+ export function skillInContext(entry) {
84
+ return entry.status === undefined || isAvailableState(entry.status);
85
+ }
86
+ export function unreadySkillState(name, catalog) {
87
+ const status = catalog.find((entry) => entry.name === name)?.status;
88
+ return status !== undefined && !isAvailableState(status) ? status : null;
89
+ }
90
+ export function* reportUnnamedWrites(said, landed) {
91
+ const unreported = writeReport(unnamedWrites(said, landed));
92
+ if (unreported) {
93
+ yield { type: 'content', text: unreported };
94
+ }
95
+ }
96
+ export function* reportLandedWrites(landed) {
97
+ const written = writeReport(landed);
98
+ if (written) {
99
+ yield { type: 'content', text: written };
100
+ }
101
+ }
102
+ const RUN_WALL_CLOCK_BUDGET_MS = 30 * 60_000;
103
+ export function createRunBudget(startedAt) {
104
+ const override = Number(process.env.QVAC_RUN_BUDGET_MS);
105
+ const duration = Number.isFinite(override) && override > 0 ? override : RUN_WALL_CLOCK_BUDGET_MS;
106
+ return { deadlineMs: startedAt + duration, outputBytesUsed: 0 };
107
+ }
108
+ export function runToolContext(args, runBudget) {
109
+ const { agent, attach, fetchAttachment, ragSearch, progress, askUser, signal } = args;
110
+ const image = imageSettingsFrom(agent);
111
+ return (turnImages = [], ctxSize, invocationSignal) => {
112
+ const context = {
113
+ agentId: agent?.id ?? null,
114
+ ctxSize,
115
+ fsRoots: args.fsRoots ?? [],
116
+ fsWriteRoots: args.fsWriteRoots ?? [],
117
+ runBudget,
118
+ signal: invocationSignal ?? signal
119
+ };
120
+ if (image) {
121
+ context.image = image;
122
+ }
123
+ if (turnImages.length) {
124
+ context.turnImages = turnImages;
125
+ }
126
+ if (attach) {
127
+ context.attach = attach;
128
+ }
129
+ if (fetchAttachment) {
130
+ context.fetchAttachment = fetchAttachment;
131
+ }
132
+ if (ragSearch) {
133
+ context.ragSearch = ragSearch;
134
+ }
135
+ if (progress) {
136
+ context.progress = progress;
137
+ }
138
+ if (askUser) {
139
+ context.askUser = askUser;
140
+ }
141
+ return context;
142
+ };
143
+ }
144
+ export function selectEnabledTools(inputs) {
145
+ if (inputs.responseFormat)
146
+ return [];
147
+ const loaded = inputs.activeSkills.filter((skill) => inputs.loadedSkills.has(skill.name));
148
+ return enabledTools(inputs.tools, {
149
+ toolsSelected: inputs.toolsSelected,
150
+ allowlist: inputs.allowlist,
151
+ grantedNames: inputs.grantedNames,
152
+ grantedOwners: inputs.grantedOwners,
153
+ loadedGrantedNames: collectToolGrants(loaded).grantedNames,
154
+ hasRoots: inputs.hasRoots,
155
+ hasWriteRoots: inputs.hasWriteRoots,
156
+ hasActiveSkills: inputs.activeSkills.length > 0
157
+ });
158
+ }
@@ -0,0 +1,5 @@
1
+ import type { MetricsState } from '../../machine/index.ts';
2
+ import type { MetricsEvent } from '../completion.ts';
3
+ import type { UsageBreakdown } from '../usage-breakdown.ts';
4
+ export { foldMetrics, type MetricsState } from '../../machine/index.ts';
5
+ export declare function metricsEvent(state: MetricsState, usage?: UsageBreakdown | null): MetricsEvent | null;
@@ -0,0 +1,29 @@
1
+ export { foldMetrics } from '../../machine/index.js';
2
+ export function metricsEvent(state, usage) {
3
+ if (!state.tokens) {
4
+ return null;
5
+ }
6
+ const event = {
7
+ type: 'metrics',
8
+ totalTokens: state.tokens,
9
+ durationMs: Math.round(state.durationMs),
10
+ timeToFirstToken: state.ttft,
11
+ promptTokensPerSecond: state.promptTokensPerSecond,
12
+ tokensPerSecond: state.durationMs > 0 ? (state.timedTokens / state.durationMs) * 1000 : undefined,
13
+ promptTokens: state.promptTokens,
14
+ cacheTokens: state.cacheTokens
15
+ };
16
+ if (state.ctxSize) {
17
+ event.ctxSize = state.ctxSize;
18
+ }
19
+ if (state.backends?.length) {
20
+ event.backends = state.backends;
21
+ }
22
+ if (usage) {
23
+ event.usage = usage;
24
+ }
25
+ if (state.stopReason) {
26
+ event.stopReason = state.stopReason;
27
+ }
28
+ return event;
29
+ }
@@ -0,0 +1,33 @@
1
+ import type { CompletionFinal, Tool as SdkTool, ToolDialect } from '@qvac/sdk';
2
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
3
+ import { type TextEvent } from '../../helpers/thinking.ts';
4
+ import type { LlmGenerationParams } from '../../models/llm-presets.ts';
5
+ import type { CompletionSdk, InferenceCallEvent, InferenceSentEvent, ResponseFormat, RoundModelLease } from '../completion.ts';
6
+ import type { CompletionHistoryEntry, FailureResultValue } from '../../machine/index.ts';
7
+ export declare const CONTEXT_OVERFLOW_MESSAGE = "This message is too large for the model context window.";
8
+ export interface RecoveredRound {
9
+ contentText: string;
10
+ final: CompletionFinal;
11
+ history: CompletionHistoryEntry[];
12
+ cacheable: boolean;
13
+ unproven: string | null;
14
+ replay: string | null;
15
+ }
16
+ export interface RoundArgs {
17
+ modelId: string;
18
+ acquireRound?: ((signal?: BareAbortSignal) => Promise<RoundModelLease>) | undefined;
19
+ history: CompletionHistoryEntry[];
20
+ failureResults: Readonly<Record<string, FailureResultValue>>;
21
+ tools?: SdkTool[] | undefined;
22
+ generationParams?: LlmGenerationParams | undefined;
23
+ responseFormat?: ResponseFormat | undefined;
24
+ toolDialect?: ToolDialect | undefined;
25
+ cacheKey?: string | undefined;
26
+ signal?: BareAbortSignal | undefined;
27
+ round: number;
28
+ promptPrefix: string;
29
+ capture: boolean;
30
+ }
31
+ type RoundEvent = TextEvent | InferenceCallEvent | InferenceSentEvent;
32
+ export declare function runRecoveredRound(sdk: CompletionSdk | undefined, args: RoundArgs): AsyncGenerator<RoundEvent, RecoveredRound>;
33
+ export {};