@qvac/harness 0.2.6 → 0.2.8

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 (174) hide show
  1. package/.claude/skills/gh-stack/SKILL.md +24 -24
  2. package/.claude/skills/gh-stack/references/commands.md +2 -2
  3. package/.claude/skills/js-house-style/SKILL.md +89 -68
  4. package/.claude/skills/kvcache/SKILL.md +7 -7
  5. package/.claude/skills/pr-create/SKILL.md +58 -15
  6. package/.claude/skills/pr-review/SKILL.md +307 -41
  7. package/CLAUDE.md +3 -0
  8. package/README.md +26 -4
  9. package/dist/harness.bundle +12 -10
  10. package/dist-lib/index.js +58 -58
  11. package/dist-lib/lib/audio-transcode-bare.js +2 -2
  12. package/dist-lib/lib/capabilities/completion.js +30 -30
  13. package/dist-lib/lib/capabilities/download.js +2 -2
  14. package/dist-lib/lib/capabilities/speech-text.js +1 -1
  15. package/dist-lib/lib/capabilities/tool-prompt-log.js +1 -1
  16. package/dist-lib/lib/capabilities/tool-selection.js +2 -2
  17. package/dist-lib/lib/capabilities/tool-turns.js +1 -1
  18. package/dist-lib/lib/capabilities/usage-breakdown.js +1 -1
  19. package/dist-lib/lib/capabilities/voice.js +3 -3
  20. package/dist-lib/lib/connect.js +11 -11
  21. package/dist-lib/lib/context-window.js +1 -1
  22. package/dist-lib/lib/docx/index.d.ts +5 -0
  23. package/dist-lib/lib/docx/index.js +49 -0
  24. package/dist-lib/lib/hardware/capability-probe.js +3 -3
  25. package/dist-lib/lib/hardware/gpu-probe-addon.js +2 -2
  26. package/dist-lib/lib/hardware/gpu-probe-entry.js +1 -1
  27. package/dist-lib/lib/helpers/markup-stream-filter.js +1 -1
  28. package/dist-lib/lib/helpers/run-outcome.js +1 -1
  29. package/dist-lib/lib/helpers/spawn-path.d.ts +1 -1
  30. package/dist-lib/lib/helpers/thinking.js +2 -2
  31. package/dist-lib/lib/helpers/tool-intent.js +1 -1
  32. package/dist-lib/lib/helpers/tool-label.js +3 -3
  33. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +1 -1
  34. package/dist-lib/lib/hooks/built-in/arg-repair.js +1 -1
  35. package/dist-lib/lib/hooks/built-in/egress.d.ts +1 -1
  36. package/dist-lib/lib/hooks/built-in/egress.js +2 -2
  37. package/dist-lib/lib/hooks/built-in/index.js +3 -3
  38. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +1 -1
  39. package/dist-lib/lib/hooks/pipeline.js +4 -4
  40. package/dist-lib/lib/hooks/registry.js +1 -1
  41. package/dist-lib/lib/hooks/run.js +1 -1
  42. package/dist-lib/lib/models/model-catalog.js +4 -4
  43. package/dist-lib/lib/models/model-delete.js +1 -1
  44. package/dist-lib/lib/models/model-handle.js +1 -1
  45. package/dist-lib/lib/models/model-list.js +1 -1
  46. package/dist-lib/lib/models/model-pool.js +8 -8
  47. package/dist-lib/lib/models/model-source.js +1 -1
  48. package/dist-lib/lib/models/music-catalog.d.ts +1 -1
  49. package/dist-lib/lib/no-redirect-fetch-bare.js +3 -3
  50. package/dist-lib/lib/no-redirect-fetch-impl.js +1 -1
  51. package/dist-lib/lib/no-redirect-fetch-node.js +2 -2
  52. package/dist-lib/lib/resolution-detector.js +1 -1
  53. package/dist-lib/lib/sdk-loader.js +2 -2
  54. package/dist-lib/lib/sdk-storage.js +1 -1
  55. package/dist-lib/lib/serve.js +10 -10
  56. package/dist-lib/lib/spawn.js +3 -3
  57. package/dist-lib/lib/staging.js +1 -1
  58. package/dist-lib/lib/tools/catalog.js +1 -1
  59. package/dist-lib/lib/tools/create-documents.js +2 -2
  60. package/dist-lib/lib/tools/edit-documents.js +2 -2
  61. package/dist-lib/lib/tools/edit-image.js +2 -2
  62. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +2 -2
  63. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +1 -1
  64. package/dist-lib/lib/tools/exec/adapters/python/loader.js +1 -1
  65. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +2 -2
  66. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +8 -6
  67. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +3 -3
  68. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +5 -5
  69. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +3 -2
  70. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +4 -4
  71. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +4 -4
  72. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +1 -1
  73. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +2 -2
  74. package/dist-lib/lib/tools/exec/obsidian/cli.js +4 -4
  75. package/dist-lib/lib/tools/exec/obsidian/command.js +1 -1
  76. package/dist-lib/lib/tools/exec/obsidian/route.js +7 -7
  77. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +2 -2
  78. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +6 -6
  79. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +2 -2
  80. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +1 -1
  81. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +2 -2
  82. package/dist-lib/lib/tools/exec/runner.js +1 -1
  83. package/dist-lib/lib/tools/exec.js +13 -13
  84. package/dist-lib/lib/tools/file-glob.js +3 -3
  85. package/dist-lib/lib/tools/fs/local.js +1 -1
  86. package/dist-lib/lib/tools/fs/remote.js +1 -1
  87. package/dist-lib/lib/tools/fs/walk.js +2 -2
  88. package/dist-lib/lib/tools/generate-image.js +4 -4
  89. package/dist-lib/lib/tools/generate-music.js +6 -6
  90. package/dist-lib/lib/tools/grep.js +6 -6
  91. package/dist-lib/lib/tools/http-request/truncate-response.js +1 -1
  92. package/dist-lib/lib/tools/http-request.js +9 -9
  93. package/dist-lib/lib/tools/mcp/utils.js +1 -1
  94. package/dist-lib/lib/tools/mcp-call.js +8 -8
  95. package/dist-lib/lib/tools/operations/builders.d.ts +1 -1
  96. package/dist-lib/lib/tools/operations/builders.js +1 -1
  97. package/dist-lib/lib/tools/operations/compile.js +1 -1
  98. package/dist-lib/lib/tools/operations/manifest.d.ts +16 -16
  99. package/dist-lib/lib/tools/operations/manifest.js +1 -1
  100. package/dist-lib/lib/tools/outbound-guard.js +1 -1
  101. package/dist-lib/lib/tools/rag-search.js +1 -1
  102. package/dist-lib/lib/tools/read-files.js +3 -3
  103. package/dist-lib/lib/tools/skill.js +8 -8
  104. package/dist-lib/lib/tools/skills/auth-resolver.js +2 -2
  105. package/dist-lib/lib/tools/skills/bin-check.js +1 -1
  106. package/dist-lib/lib/tools/skills/bundled-dir.js +2 -2
  107. package/dist-lib/lib/tools/skills/catalog.js +10 -10
  108. package/dist-lib/lib/tools/skills/cli-schema-check.js +1 -1
  109. package/dist-lib/lib/tools/skills/cli-schema-load.js +1 -1
  110. package/dist-lib/lib/tools/skills/cli-schema.js +4 -4
  111. package/dist-lib/lib/tools/skills/credential-check.js +3 -3
  112. package/dist-lib/lib/tools/skills/credential-grants.js +1 -1
  113. package/dist-lib/lib/tools/skills/credential-health.js +2 -2
  114. package/dist-lib/lib/tools/skills/frontmatter-parser.js +1 -1
  115. package/dist-lib/lib/tools/skills/index.js +5 -5
  116. package/dist-lib/lib/tools/skills/mention.js +1 -1
  117. package/dist-lib/lib/tools/skills/overlay-crud.js +1 -1
  118. package/dist-lib/lib/tools/skills/setup-routes.js +1 -1
  119. package/dist-lib/lib/tools/skills/skill-settings.js +1 -1
  120. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +8 -8
  121. package/dist-lib/lib/tools/skills/skill-state.js +9 -9
  122. package/dist-lib/lib/tools/toolsets.d.ts +1 -1
  123. package/dist-lib/lib/tools/url-guard.js +2 -2
  124. package/dist-lib/lib/tools/weather-lookup/place.d.ts +11 -0
  125. package/dist-lib/lib/tools/weather-lookup/place.js +152 -0
  126. package/dist-lib/lib/tools/weather-lookup/report.d.ts +37 -0
  127. package/dist-lib/lib/tools/weather-lookup/report.js +56 -0
  128. package/dist-lib/lib/tools/weather-lookup.d.ts +8 -0
  129. package/dist-lib/lib/tools/weather-lookup.js +110 -0
  130. package/dist-lib/lib/tools/web-fetch.js +10 -10
  131. package/dist-lib/lib/tools/web-search.js +2 -2
  132. package/dist-lib/lib/transport.js +1 -1
  133. package/dist-lib/lib/validating-lookup.js +1 -1
  134. package/dist-lib/lib/web-fetch/embedded-state.js +1 -1
  135. package/dist-lib/lib/web-fetch/extract.js +1 -1
  136. package/dist-lib/lib/web-fetch/images.js +1 -1
  137. package/dist-lib/lib/web-fetch/video.js +1 -1
  138. package/dist-lib/lib/web-search/engine-registry.js +7 -7
  139. package/dist-lib/lib/web-search/engines/aol.js +3 -3
  140. package/dist-lib/lib/web-search/engines/bing.js +4 -4
  141. package/dist-lib/lib/web-search/engines/brave.js +2 -2
  142. package/dist-lib/lib/web-search/engines/duckduckgo.js +3 -3
  143. package/dist-lib/lib/web-search/engines/google.js +4 -4
  144. package/dist-lib/lib/web-search/engines/wikipedia.js +2 -2
  145. package/dist-lib/lib/web-search/engines/yahoo.js +3 -3
  146. package/dist-lib/lib/web-search/fetch-html.js +1 -1
  147. package/dist-lib/lib/web-search/merge-results.js +1 -1
  148. package/dist-lib/lib/web-search/orchestrator.js +3 -3
  149. package/dist-lib/schema/baseline.js +1 -1
  150. package/dist-lib/schema/build.js +3 -3
  151. package/dist-lib/schema/release-tags.d.ts +2 -1
  152. package/dist-lib/schema/release-tags.js +9 -7
  153. package/docs/decisions/2026-05-29-kvcache-tool-turns.md +75 -0
  154. package/docs/decisions/2026-06-02-kvcache-tool-turns-reenabled.md +127 -0
  155. package/docs/decisions/2026-06-23-android-cpu-llm-defaults.md +126 -0
  156. package/docs/decisions/2026-07-29-assistant-owned-storage-layout.md +88 -0
  157. package/docs/decisions/2026-08-04-sidecar-orphan-reaping.md +79 -0
  158. package/docs/decisions/2026-08-11-pyodide-worker-thread.md +68 -0
  159. package/docs/decisions/2026-08-17-harness-hook-pipeline.md +84 -0
  160. package/docs/decisions/2026-08-17-harness-outbound-egress-guard.md +176 -0
  161. package/docs/decisions/2026-08-20-chat-prompt-prefix-is-stable.md +95 -0
  162. package/docs/decisions/2026-08-20-kvcache-static-placement.md +109 -0
  163. package/docs/decisions/2026-08-21-vendored-python-wheels.md +85 -0
  164. package/docs/decisions/2026-08-26-exec-is-not-gated-by-skills.md +64 -0
  165. package/docs/decisions/2026-08-27-writable-skills-overlay.md +56 -0
  166. package/docs/decisions/2026-09-01-skill-operation-manifests.md +53 -0
  167. package/docs/decisions/2026-09-01-usage-breakdown-is-measured.md +78 -0
  168. package/docs/decisions/2026-09-03-usage-breakdown-reported-by-the-harness.md +136 -0
  169. package/docs/decisions/2026-09-10-skill-wording-is-measured-offline.md +63 -0
  170. package/docs/decisions/2026-09-16-a-lookup-reports-the-place-it-resolved.md +70 -0
  171. package/docs/decisions/INDEX.md +40 -0
  172. package/docs/decisions/TEMPLATE.md +32 -0
  173. package/package.json +21 -4
  174. package/worker/harness-sidecar.mjs +2 -0
@@ -1,13 +1,13 @@
1
1
  import process from 'process';
2
- import { transferProgress } from "../model-download-progress.js";
2
+ import { transferProgress } from '../model-download-progress.js';
3
3
  import ResourcePuddle from 'resource-puddle';
4
- import { ModelHandle } from "./model-handle.js";
5
- import { defaultContextSize } from "./context.js";
6
- import { adrenoSafeKvCache } from "./kv-cache.js";
7
- import { DEFAULT_EMBED_BATCH_SIZE } from "./embed-config.js";
8
- import { hlog } from "../log.js";
9
- import { RUNAWAY_STOP_SEQUENCES } from "../helpers/control-tokens.js";
10
- import { resolveModelSrc } from "./model-source.js";
4
+ import { ModelHandle } from './model-handle.js';
5
+ import { defaultContextSize } from './context.js';
6
+ import { adrenoSafeKvCache } from './kv-cache.js';
7
+ import { DEFAULT_EMBED_BATCH_SIZE } from './embed-config.js';
8
+ import { hlog } from '../log.js';
9
+ import { RUNAWAY_STOP_SEQUENCES } from '../helpers/control-tokens.js';
10
+ import { resolveModelSrc } from './model-source.js';
11
11
  export function createLoadTracker() {
12
12
  const inflight = new Set();
13
13
  let draining = null;
@@ -1,4 +1,4 @@
1
- import { audioGenModelByName, curatedModelAsset, customModelSrc } from "./model-catalog.js";
1
+ import { audioGenModelByName, curatedModelAsset, customModelSrc } from './model-catalog.js';
2
2
  export async function resolveModelSrc(sdk, model, addon = 'llm') {
3
3
  if (/^(\/|~|\.|file:|https?:|registry:|pear:|hyper:)/.test(model))
4
4
  return model;
@@ -1,4 +1,4 @@
1
- export declare const MUSIC_MODEL_CHOICES: readonly ["turbo", "turbo-hq", "sft"];
1
+ export declare const MUSIC_MODEL_CHOICES: readonly ['turbo', 'turbo-hq', 'sft'];
2
2
  export type MusicModelChoice = (typeof MUSIC_MODEL_CHOICES)[number];
3
3
  export declare const GENERATE_MUSIC_TOOL = "generate_music";
4
4
  export declare const DEFAULT_MUSIC_MODEL_CHOICE: MusicModelChoice;
@@ -1,9 +1,9 @@
1
1
  import http, { Agent as HttpAgent } from 'bare-http1';
2
2
  import https, { Agent as HttpsAgent } from 'bare-https';
3
3
  import * as bareDns from 'bare-dns';
4
- import { isPrivateOrBlocked } from "./tools/private-ip.js";
5
- import { makeValidatingLookup } from "./validating-lookup.js";
6
- import { runNoRedirectFetch } from "./no-redirect-fetch-impl.js";
4
+ import { isPrivateOrBlocked } from './tools/private-ip.js';
5
+ import { makeValidatingLookup } from './validating-lookup.js';
6
+ import { runNoRedirectFetch } from './no-redirect-fetch-impl.js';
7
7
  export class BlockedHostError extends Error {
8
8
  code = 'EBLOCKEDHOST';
9
9
  constructor(host) {
@@ -1,5 +1,5 @@
1
1
  import b4a from 'b4a';
2
- import { DEFAULT_USER_AGENT } from "./user-agent.js";
2
+ import { DEFAULT_USER_AGENT } from './user-agent.js';
3
3
  const UA_SNIFFING_HOSTS = new Set(['wttr.in']);
4
4
  export function runNoRedirectFetch(request, url, init = {}) {
5
5
  return new Promise((resolve, reject) => {
@@ -1,8 +1,8 @@
1
1
  import * as dns from 'node:dns';
2
2
  import * as http from 'node:http';
3
3
  import * as https from 'node:https';
4
- import { isPrivateOrBlocked } from "./tools/private-ip.js";
5
- import { runNoRedirectFetch } from "./no-redirect-fetch-impl.js";
4
+ import { isPrivateOrBlocked } from './tools/private-ip.js';
5
+ import { runNoRedirectFetch } from './no-redirect-fetch-impl.js';
6
6
  export default function noRedirectFetch(url, init = {}) {
7
7
  const request = (target, options, onresponse) => {
8
8
  const common = {
@@ -1,4 +1,4 @@
1
- import { hlog } from "./log.js";
1
+ import { hlog } from './log.js';
2
2
  function readValue(value, key) {
3
3
  if (value === null)
4
4
  return undefined;
@@ -1,5 +1,5 @@
1
- import { retryMemo } from "./helpers/retry-memo.js";
2
- import { hlog } from "./log.js";
1
+ import { retryMemo } from './helpers/retry-memo.js';
2
+ import { hlog } from './log.js';
3
3
  const defaultImports = {
4
4
  sdk: () => import('#sdk'),
5
5
  plugins: () => import('@qvac/sdk/plugins'),
@@ -3,7 +3,7 @@ import { join } from 'path';
3
3
  import process from 'process';
4
4
  import { isBareKit } from 'which-runtime';
5
5
  import { installSdkConfigLoader } from '#sdk-config-loader';
6
- import { SDK_HOME_ENV } from "./storage.js";
6
+ import { SDK_HOME_ENV } from './storage.js';
7
7
  export const SDK_CONFIG_PATH_ENV = 'QVAC_CONFIG_PATH';
8
8
  export const OPENCL_CACHE_DIR_ENV = 'QVAC_OPENCL_CACHE_DIR';
9
9
  export function configureSdkStorage(storage, channels = {}) {
@@ -1,18 +1,18 @@
1
1
  import { AbortController } from 'bare-abort-controller';
2
2
  import fs from 'fs';
3
- import { settleOnClose } from "./rpc-session.js";
3
+ import { settleOnClose } from './rpc-session.js';
4
4
  import { pipeline, Readable } from 'streamx';
5
5
  import { bindApi } from '../spec/bind.js';
6
6
  import HRPC from '../spec/hrpc/index.js';
7
- import { unsupportedKvCacheDeletion } from "./capabilities/kv-cache.js";
8
- import { errorMessage } from "./error-fields.js";
9
- import { hlog } from "./log.js";
10
- import { pushQueue } from "./queue.js";
11
- import { TextCoalescer } from "./helpers/text-coalescer.js";
12
- import { prepareOpenclCache } from "./models/opencl-cache.js";
13
- import { stageFile, sweepStaging } from "./staging.js";
14
- import { readSetup } from "./tools/skills/manifest-parse.js";
15
- import { packVectors, toDownloadWire, toWire } from "./wire.js";
7
+ import { unsupportedKvCacheDeletion } from './capabilities/kv-cache.js';
8
+ import { errorMessage } from './error-fields.js';
9
+ import { hlog } from './log.js';
10
+ import { pushQueue } from './queue.js';
11
+ import { TextCoalescer } from './helpers/text-coalescer.js';
12
+ import { prepareOpenclCache } from './models/opencl-cache.js';
13
+ import { stageFile, sweepStaging } from './staging.js';
14
+ import { readSetup } from './tools/skills/manifest-parse.js';
15
+ import { packVectors, toDownloadWire, toWire } from './wire.js';
16
16
  const MODEL_STATUSES = new Set([
17
17
  'loading',
18
18
  'downloading',
@@ -1,7 +1,7 @@
1
1
  import stowChild, {} from 'bare-supervisor/stow';
2
- import { connectHarness } from "./connect.js";
3
- import { setHarnessLog } from "./log.js";
4
- import { createEmbedConfig } from "./models/embed-config.js";
2
+ import { connectHarness } from './connect.js';
3
+ import { setHarnessLog } from './log.js';
4
+ import { createEmbedConfig } from './models/embed-config.js';
5
5
  export function harnessChild(entry, opts) {
6
6
  if (opts.logger)
7
7
  setHarnessLog(true);
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { userTmpPath } from "./tmp-path.js";
3
+ import { userTmpPath } from './tmp-path.js';
4
4
  export const STAGING_DIR = userTmpPath('qvac-harness-staging');
5
5
  export const STAGING_MAX_AGE_MS = 60 * 60 * 1000;
6
6
  const noop = () => { };
@@ -1,4 +1,4 @@
1
- import { toSdkTool } from "../capabilities/completion.js";
1
+ import { toSdkTool } from '../capabilities/completion.js';
2
2
  export function toolCatalog(tools) {
3
3
  return tools.map((tool) => ({
4
4
  name: tool.name,
@@ -1,5 +1,5 @@
1
- import { canonicalDenyRoots, defaultRealpath, resolveKey } from "./fs/scope.js";
2
- import { writeText } from "./fs/write.js";
1
+ import { canonicalDenyRoots, defaultRealpath, resolveKey } from './fs/scope.js';
2
+ import { writeText } from './fs/write.js';
3
3
  function documentRequests(raw) {
4
4
  if (!Array.isArray(raw) || raw.length === 0)
5
5
  return null;
@@ -1,6 +1,6 @@
1
1
  import b4a from 'b4a';
2
- import { canonicalDenyRoots, defaultRealpath, resolveKey } from "./fs/scope.js";
3
- import { writeText } from "./fs/write.js";
2
+ import { canonicalDenyRoots, defaultRealpath, resolveKey } from './fs/scope.js';
3
+ import { writeText } from './fs/write.js';
4
4
  function editRequests(raw) {
5
5
  if (!Array.isArray(raw) || raw.length === 0)
6
6
  return null;
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { AbortedError } from "../helpers/race-abort.js";
4
- import { BUSY_ERROR, DIM_STEP, effectiveSteps, generationPercentTick, IMAGE_LOAD_STALL_ERROR, normalizeClamps, parseCommonArgs, runDiffusion } from "./generate-image.js";
3
+ import { AbortedError } from '../helpers/race-abort.js';
4
+ import { BUSY_ERROR, DIM_STEP, effectiveSteps, generationPercentTick, IMAGE_LOAD_STALL_ERROR, normalizeClamps, parseCommonArgs, runDiffusion } from './generate-image.js';
5
5
  const DEFAULT_STRENGTH = 0.7;
6
6
  const FLUX2_GUIDANCE = 3.5;
7
7
  const FLUX2_CFG_SCALE = 1;
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { hlog } from "../../../../log.js";
4
- import { checkOutputBytes, MAX_INPUT_TOTAL_BYTES, RUN_OUTPUT_BUDGET_BYTES } from "./output-policy.js";
3
+ import { hlog } from '../../../../log.js';
4
+ import { checkOutputBytes, MAX_INPUT_TOTAL_BYTES, RUN_OUTPUT_BUDGET_BYTES } from './output-policy.js';
5
5
  const STAGE_TIMEOUT_MS = 60_000;
6
6
  const STAGE_TIMEOUT_MESSAGE = `staging attachments timed out after ${STAGE_TIMEOUT_MS}ms`;
7
7
  const OVER_BUDGET_ERROR = 'inputs exceed maximum total size';
@@ -1,4 +1,4 @@
1
- import { IMAGE_INPUT, OFFICE_READ, PDF_READ, isEscaped, parseInputs, parseOutputs, parsePackages, stripCommentsAndDocstrings, unwrapPythonSource } from "./python-adapter.js";
1
+ import { IMAGE_INPUT, OFFICE_READ, PDF_READ, isEscaped, parseInputs, parseOutputs, parsePackages, stripCommentsAndDocstrings, unwrapPythonSource } from './python-adapter.js';
2
2
  const ARTIFACT_OUTPUT = /\.(docx|xlsx|pptx|pdf)$/i;
3
3
  const CREATE_PACKAGES = new Map([
4
4
  ['python-docx', '1.2.0'],
@@ -9,7 +9,7 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
9
9
  import b4a from 'b4a';
10
10
  import { constants as fsConstants } from 'fs';
11
11
  import process from 'process';
12
- import { seedPackageCache } from "./wheels.js";
12
+ import { seedPackageCache } from './wheels.js';
13
13
  class B4aTextDecoder {
14
14
  encoding;
15
15
  constructor(label = 'utf-8') {
@@ -1,5 +1,5 @@
1
- import { hlog } from "../../../../log.js";
2
- import { MAX_OUTPUT_FILE_BYTES, MAX_OUTPUT_TOTAL_BYTES } from "./output-policy.js";
1
+ import { hlog } from '../../../../log.js';
2
+ import { MAX_OUTPUT_FILE_BYTES, MAX_OUTPUT_TOTAL_BYTES } from './output-policy.js';
3
3
  let runCounter = 0;
4
4
  function filePath(dir, name) {
5
5
  return `${dir}/${name}`;
@@ -1,11 +1,11 @@
1
1
  import process from 'process';
2
2
  import ScopeLock from 'scope-lock';
3
- import { AbortedError, raceAbort } from "../../../../helpers/race-abort.js";
4
- import { hlog } from "../../../../log.js";
5
- import { MAX_OUTPUT_CHARS } from "../../runner.js";
6
- import { defaultLoad, pyodideLoadOptions } from "./loader.js";
7
- import { isPyodideFatal, performRun } from "./run-session.js";
8
- import { runPythonInWorker } from "./worker/client.js";
3
+ import { AbortedError, raceAbort } from '../../../../helpers/race-abort.js';
4
+ import { hlog } from '../../../../log.js';
5
+ import { MAX_OUTPUT_CHARS } from '../../runner.js';
6
+ import { defaultLoad, pyodideLoadOptions } from './loader.js';
7
+ import { isPyodideFatal, performRun } from './run-session.js';
8
+ import { runPythonInWorker } from './worker/client.js';
9
9
  export { pyodideLoadOptions };
10
10
  const DEFAULT_TIMEOUT_MS = 120_000;
11
11
  const PACKAGE_INSTALL_TIMEOUT_MS = 300_000;
@@ -99,6 +99,8 @@ export async function runPython(code, options = {}) {
99
99
  }
100
100
  await runLock.lock();
101
101
  try {
102
+ if (options.signal?.aborted)
103
+ throw new AbortedError();
102
104
  return await runPythonInWorker(spec, { timeoutMs, signal: options.signal });
103
105
  }
104
106
  finally {
@@ -1,7 +1,7 @@
1
1
  import b4a from 'b4a';
2
- import { attachOutputs, stageInputs } from "./attachments.js";
3
- import { checkFileName, checkOutputName, MAX_INPUTS, MAX_OUTPUTS } from "./output-policy.js";
4
- import { runPython } from "./pyodide.js";
2
+ import { attachOutputs, stageInputs } from './attachments.js';
3
+ import { checkFileName, checkOutputName, MAX_INPUTS, MAX_OUTPUTS } from './output-policy.js';
4
+ import { runPython } from './pyodide.js';
5
5
  export function isPythonLanguage(language) {
6
6
  return typeof language === 'string' && language.trim().toLowerCase() === 'python';
7
7
  }
@@ -1,8 +1,8 @@
1
- import { AbortedError } from "../../../../helpers/race-abort.js";
2
- import { hlog } from "../../../../log.js";
3
- import { TRUNCATED_OUTPUT_SUFFIX } from "../../runner.js";
4
- import { collectOutputs, openScratch, stageInputFiles } from "./memfs.js";
5
- import { planVendoredInstall, stageVendoredWheels } from "./wheels.js";
1
+ import { AbortedError } from '../../../../helpers/race-abort.js';
2
+ import { hlog } from '../../../../log.js';
3
+ import { TRUNCATED_OUTPUT_SUFFIX } from '../../runner.js';
4
+ import { collectOutputs, openScratch, stageInputFiles } from './memfs.js';
5
+ import { planVendoredInstall, stageVendoredWheels } from './wheels.js';
6
6
  export function cap(text, limit) {
7
7
  if (text.length <= limit)
8
8
  return text;
@@ -2,7 +2,7 @@ import fs from 'fs';
2
2
  import process from 'process';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { z } from 'zod';
5
- import { hlog } from "../../../../log.js";
5
+ import { hlog } from '../../../../log.js';
6
6
  const ManifestSchema = z.object({
7
7
  pyodide: z.string(),
8
8
  packages: z.record(z.string(), z.object({
@@ -17,7 +17,8 @@ export function wheelsDir() {
17
17
  const fromHost = process.env.QVAC_PYTHON_WHEELS_DIR;
18
18
  if (fromHost)
19
19
  return fromHost;
20
- const source = new URL('../../../../../wheels', import.meta.url);
20
+ const root = new URL('../../../../../', import.meta.url);
21
+ const source = new URL(root.pathname.endsWith('/dist-lib/') ? '../wheels' : 'wheels', root);
21
22
  if (source.href.includes('.bundle/'))
22
23
  return undefined;
23
24
  return fileURLToPath(source.href);
@@ -1,9 +1,9 @@
1
1
  import { spawnPythonWorker } from '#pyodide-worker-spawn';
2
2
  import process from 'process';
3
3
  import { fileURLToPath } from 'url';
4
- import { AbortedError, raceAbort } from "../../../../../helpers/race-abort.js";
5
- import { harnessLogEnabled, hlog } from "../../../../../log.js";
6
- import { asWorkerMessage, fromWireResult } from "./protocol.js";
4
+ import { AbortedError, raceAbort } from '../../../../../helpers/race-abort.js';
5
+ import { harnessLogEnabled, hlog } from '../../../../../log.js';
6
+ import { asWorkerMessage, fromWireResult } from './protocol.js';
7
7
  const SIGINT = 2;
8
8
  function interruptGraceMs() {
9
9
  const ms = Number(process.env.QVAC_PYODIDE_INTERRUPT_GRACE_MS);
@@ -13,7 +13,7 @@ const SHUTDOWN_GRACE_MS = 3_000;
13
13
  let active = null;
14
14
  function workerEntry() {
15
15
  return (process.env.QVAC_PYODIDE_WORKER_ENTRY ??
16
- fileURLToPath(new URL('./entry.ts', import.meta.url).href));
16
+ fileURLToPath(new URL(import.meta.url.endsWith('.ts') ? './entry.ts' : './entry.js', import.meta.url).href));
17
17
  }
18
18
  async function readMessage(link) {
19
19
  for (;;) {
@@ -7,10 +7,10 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
7
7
  return path;
8
8
  };
9
9
  import process from 'process';
10
- import { setHarnessLog, setHarnessLogSink } from "../../../../../log.js";
11
- import { defaultLoad } from "../loader.js";
12
- import { performRun } from "../run-session.js";
13
- import { asHostMessage, toWireResult } from "./protocol.js";
10
+ import { setHarnessLog, setHarnessLogSink } from '../../../../../log.js';
11
+ import { defaultLoad } from '../loader.js';
12
+ import { performRun } from '../run-session.js';
13
+ import { asHostMessage, toWireResult } from './protocol.js';
14
14
  function narrowThreadData(data) {
15
15
  if (typeof data === 'object' && data !== null && 'sab' in data && 'handle' in data) {
16
16
  const sab = data.sab;
@@ -1,4 +1,4 @@
1
- import { runCommand } from "../../runner.js";
1
+ import { runCommand } from '../../runner.js';
2
2
  export function createShellAdapter(options) {
3
3
  return {
4
4
  resolve(args) {
@@ -1,8 +1,8 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import process from 'process';
4
- import { execEnv } from "../../../helpers/spawn-path.js";
5
- import { expandObsidianPath, firstExistingPath, OBSIDIAN_BIN_CANDIDATES } from "../../skills/obsidian-readiness.js";
4
+ import { execEnv } from '../../../helpers/spawn-path.js';
5
+ import { expandObsidianPath, firstExistingPath, OBSIDIAN_BIN_CANDIDATES } from '../../skills/obsidian-readiness.js';
6
6
  const RUNNING_CHECK_MS = 3_000;
7
7
  export function runningCheckCommand(os) {
8
8
  if (os === 'win32') {
@@ -1,7 +1,7 @@
1
- import { appendOutput, capOutput, createCapturedOutput, MAX_OUTPUT_CHARS } from "../runner.js";
2
- import { isObsidianRunning, launchObsidianApp, obsidianPathEnv } from "./cli-process.js";
3
- import { OBSIDIAN_CLI_FAILURE_GUIDANCE } from "./guidance.js";
4
- import { cleanObsidianOutput } from "./output.js";
1
+ import { appendOutput, capOutput, createCapturedOutput, MAX_OUTPUT_CHARS } from '../runner.js';
2
+ import { isObsidianRunning, launchObsidianApp, obsidianPathEnv } from './cli-process.js';
3
+ import { OBSIDIAN_CLI_FAILURE_GUIDANCE } from './guidance.js';
4
+ import { cleanObsidianOutput } from './output.js';
5
5
  const READY_WAIT_MS = 5_000;
6
6
  const COMMAND_MS = 15_000;
7
7
  const OUTPUT_QUIET_MS = 700;
@@ -1,4 +1,4 @@
1
- import { shellArgv } from "../shell-argv.js";
1
+ import { shellArgv } from '../shell-argv.js';
2
2
  const OBSIDIAN_BIN = /^obsidian(?:\.exe|\.com)?$/i;
3
3
  const OBSIDIAN_PREFIX = /^obsidian(?:\.exe|\.com)?(?:\s|$)/i;
4
4
  export function parseObsidianCommand(command) {
@@ -1,11 +1,11 @@
1
1
  import process from 'process';
2
- import { credentialRecord } from "../../skills/auth-resolver.js";
3
- import { isObsidianVaultPath, isSandboxedWorkbenchInstall, OBSIDIAN_VAULT_PATH_CREDENTIAL_KEY } from "../../skills/obsidian-readiness.js";
4
- import { capOutput, MAX_OUTPUT_CHARS } from "../runner.js";
5
- import { runObsidianCli } from "./cli.js";
6
- import { normalizeObsidianCommand, parseObsidianCommand } from "./command.js";
7
- import { OBSIDIAN_DESKTOP_AGENT_REQUIRED, OBSIDIAN_NO_SHELL_FALLBACK, OBSIDIAN_VAULT_SETUP_REQUIRED } from "./guidance.js";
8
- import { executeVaultFsAction } from "./vault-fs.js";
2
+ import { credentialRecord } from '../../skills/auth-resolver.js';
3
+ import { isObsidianVaultPath, isSandboxedWorkbenchInstall, OBSIDIAN_VAULT_PATH_CREDENTIAL_KEY } from '../../skills/obsidian-readiness.js';
4
+ import { capOutput, MAX_OUTPUT_CHARS } from '../runner.js';
5
+ import { runObsidianCli } from './cli.js';
6
+ import { normalizeObsidianCommand, parseObsidianCommand } from './command.js';
7
+ import { OBSIDIAN_DESKTOP_AGENT_REQUIRED, OBSIDIAN_NO_SHELL_FALLBACK, OBSIDIAN_VAULT_SETUP_REQUIRED } from './guidance.js';
8
+ import { executeVaultFsAction } from './vault-fs.js';
9
9
  const DESKTOP_PLATFORMS = new Set(['darwin', 'linux', 'win32']);
10
10
  function limitResult(result, maxOutputChars) {
11
11
  return {
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { markdownFileName } from "./note-name.js";
4
- import { ensureWithinRoot, getArg, getContentArg, writeNewFileText } from "./vault-paths.js";
3
+ import { markdownFileName } from './note-name.js';
4
+ import { ensureWithinRoot, getArg, getContentArg, writeNewFileText } from './vault-paths.js';
5
5
  function markdownPath(vaultPath, target) {
6
6
  const notePath = target.endsWith('.md') ? target : `${target}.md`;
7
7
  return ensureWithinRoot(vaultPath, notePath);
@@ -1,9 +1,9 @@
1
- import { handleCreate } from "./vault-create.js";
2
- import { todayStamp } from "./vault-paths.js";
3
- import { handleDailyRead, handleFiles, handleFolders, handleOutline, handleProperties, handleRead, handleSearch, handleTags, handleVault, handleVaults, handleWordcount } from "./vault-read.js";
4
- import { handleAppend, handleDailyAppend, handleDelete, handleMove, handlePrepend, handlePropertySet, handleRename } from "./vault-write.js";
5
- export { parseObsidianCommand, normalizeObsidianCommand } from "./command.js";
6
- export { ensureWithinRoot } from "./vault-paths.js";
1
+ import { handleCreate } from './vault-create.js';
2
+ import { todayStamp } from './vault-paths.js';
3
+ import { handleDailyRead, handleFiles, handleFolders, handleOutline, handleProperties, handleRead, handleSearch, handleTags, handleVault, handleVaults, handleWordcount } from './vault-read.js';
4
+ import { handleAppend, handleDailyAppend, handleDelete, handleMove, handlePrepend, handlePropertySet, handleRename } from './vault-write.js';
5
+ export { parseObsidianCommand, normalizeObsidianCommand } from './command.js';
6
+ export { ensureWithinRoot } from './vault-paths.js';
7
7
  export function executeVaultFsAction(vaultPath, action, args) {
8
8
  switch (action) {
9
9
  case 'vault':
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { ensureWithinRoot, isSymlink, writeNewFileText } from "./safe-path.js";
4
- export { ensureWithinRoot, writeNewFileText } from "./safe-path.js";
3
+ import { ensureWithinRoot, isSymlink, writeNewFileText } from './safe-path.js';
4
+ export { ensureWithinRoot, writeNewFileText } from './safe-path.js';
5
5
  export const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
6
6
  export function resolveNotePath(vaultPath, args) {
7
7
  const fileArg = args.find((a) => a.startsWith('file='));
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { dailyCandidates, ensureWithinRoot, FRONTMATTER_RE, getArg, listFolders, listMarkdownFiles, parseFrontmatter, readFileText, resolveNotePath, todayStamp } from "./vault-paths.js";
3
+ import { dailyCandidates, ensureWithinRoot, FRONTMATTER_RE, getArg, listFolders, listMarkdownFiles, parseFrontmatter, readFileText, resolveNotePath, todayStamp } from './vault-paths.js';
4
4
  export function handleVault(vaultPath) {
5
5
  return JSON.stringify({ name: path.basename(vaultPath), path: vaultPath });
6
6
  }
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { markdownFileName } from "./note-name.js";
4
- import { appendToFile, dailyCandidates, ensureWithinRoot, FRONTMATTER_RE, getArg, getContentArg, moveFile, readFileSnapshot, resolveNotePath, todayStamp, updateFileText, writeIfUnchanged } from "./vault-paths.js";
3
+ import { markdownFileName } from './note-name.js';
4
+ import { appendToFile, dailyCandidates, ensureWithinRoot, FRONTMATTER_RE, getArg, getContentArg, moveFile, readFileSnapshot, resolveNotePath, todayStamp, updateFileText, writeIfUnchanged } from './vault-paths.js';
5
5
  export function handleAppend(vaultPath, args) {
6
6
  const notePath = resolveNotePath(vaultPath, args);
7
7
  if (!notePath || !fs.existsSync(notePath)) {
@@ -1,5 +1,5 @@
1
1
  import process from 'process';
2
- import { AbortedError } from "../../helpers/race-abort.js";
2
+ import { AbortedError } from '../../helpers/race-abort.js';
3
3
  const DEFAULT_TIMEOUT_MS = 120_000;
4
4
  export const MAX_OUTPUT_CHARS = 8_192;
5
5
  export const MAX_OUTPUT_CHARS_LIMIT = 65_536;
@@ -1,18 +1,18 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import { AbortedError } from "../helpers/race-abort.js";
4
- import { spawnEnv } from "../helpers/spawn-path.js";
5
- import { checkPdfBuildSource, checkBareLengthArgs, checkPptxBuildSource, checkPythonSource, checkUnstagedRead, createPythonAdapter, isPythonLanguage, looksLikePythonSource, parseInputs, parseOutputs, parsePackages, parseWorkdir, runsThroughPyodide, unwrapPythonSource } from "./exec/adapters/python/python-adapter.js";
6
- import { pythonCreateEffect } from "./exec/adapters/python/create-effect.js";
7
- import { createShellAdapter } from "./exec/adapters/shell/shell-adapter.js";
8
- import { routeObsidianCommand } from "./exec/obsidian/route.js";
9
- import { MAX_OUTPUT_CHARS_LIMIT } from "./exec/runner.js";
10
- import { bareBin, firstCommandToken, sanitizeCommand } from "./exec/scope.js";
11
- import { shellArgv } from "./exec/shell-argv.js";
12
- import { canonicalDenyRoots, defaultRealpath, hostPath, resolveKey } from "./fs/scope.js";
13
- import { unquoteArg } from "./model-args.js";
14
- import { settingsEnv } from "./skills/skill-settings.js";
15
- import { checkCliOps } from "./skills/cli-schema.js";
3
+ import { AbortedError } from '../helpers/race-abort.js';
4
+ import { spawnEnv } from '../helpers/spawn-path.js';
5
+ import { checkPdfBuildSource, checkBareLengthArgs, checkPptxBuildSource, checkPythonSource, checkUnstagedRead, createPythonAdapter, isPythonLanguage, looksLikePythonSource, parseInputs, parseOutputs, parsePackages, parseWorkdir, runsThroughPyodide, unwrapPythonSource } from './exec/adapters/python/python-adapter.js';
6
+ import { pythonCreateEffect } from './exec/adapters/python/create-effect.js';
7
+ import { createShellAdapter } from './exec/adapters/shell/shell-adapter.js';
8
+ import { routeObsidianCommand } from './exec/obsidian/route.js';
9
+ import { MAX_OUTPUT_CHARS_LIMIT } from './exec/runner.js';
10
+ import { bareBin, firstCommandToken, sanitizeCommand } from './exec/scope.js';
11
+ import { shellArgv } from './exec/shell-argv.js';
12
+ import { canonicalDenyRoots, defaultRealpath, hostPath, resolveKey } from './fs/scope.js';
13
+ import { unquoteArg } from './model-args.js';
14
+ import { settingsEnv } from './skills/skill-settings.js';
15
+ import { checkCliOps } from './skills/cli-schema.js';
16
16
  function parsePositiveInt(value, name, max) {
17
17
  if (value === undefined || value === null || value === '')
18
18
  return undefined;
@@ -1,6 +1,6 @@
1
- import { compileGlob } from "./fs/glob.js";
2
- import { NO_DIRS_GRANTED, canonicalDenyRoots, defaultRealpath, isDeniedPath, resolveKey } from "./fs/scope.js";
3
- import { walkFiles } from "./fs/walk.js";
1
+ import { compileGlob } from './fs/glob.js';
2
+ import { NO_DIRS_GRANTED, canonicalDenyRoots, defaultRealpath, isDeniedPath, resolveKey } from './fs/scope.js';
3
+ import { walkFiles } from './fs/walk.js';
4
4
  export const DEFAULT_GLOB_MATCHES = 100;
5
5
  export const MAX_GLOB_MATCHES = 1000;
6
6
  export async function searchTargets(dir, roots, realpath, deny) {
@@ -1,6 +1,6 @@
1
1
  import path from 'path';
2
2
  import Localdrive from 'localdrive';
3
- import { defaultRealpath } from "./scope.js";
3
+ import { defaultRealpath } from './scope.js';
4
4
  function withSkipList(localdrive) {
5
5
  return {
6
6
  entry: localdrive.entry.bind(localdrive),
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { Writable } from 'streamx';
4
- import { STAGING_DIR } from "../../staging.js";
4
+ import { STAGING_DIR } from '../../staging.js';
5
5
  export const DRIVE_CALL_TIMEOUT_MS = 20_000;
6
6
  export const MAX_DRIVE_BYTES = 8 * 1024 * 1024;
7
7
  export const DRIVE_LIST_PAGE = 256;
@@ -1,5 +1,5 @@
1
- import { hlog } from "../../log.js";
2
- import { displayPath } from "./scope.js";
1
+ import { hlog } from '../../log.js';
2
+ import { displayPath } from './scope.js';
3
3
  export const WALK_SKIP_DIRS = new Set(['.git', 'node_modules']);
4
4
  export const MAX_WALK_ENTRIES = 10_000;
5
5
  export const MAX_WALK_MS = 30_000;
@@ -1,8 +1,8 @@
1
1
  import ScopeLock from 'scope-lock';
2
- import { AbortedError, raceAbort } from "../helpers/race-abort.js";
3
- import { DIFFUSION_CATALOG, imageModelFor } from "../models/model-catalog.js";
4
- import { createLoadTracker } from "../models/model-pool.js";
5
- import { resolveModelSrc } from "../models/model-source.js";
2
+ import { AbortedError, raceAbort } from '../helpers/race-abort.js';
3
+ import { DIFFUSION_CATALOG, imageModelFor } from '../models/model-catalog.js';
4
+ import { createLoadTracker } from '../models/model-pool.js';
5
+ import { resolveModelSrc } from '../models/model-source.js';
6
6
  export const MAX_DIM = 1024;
7
7
  export const DIM_STEP = 64;
8
8
  const DEFAULT_DIM = 512;
@@ -1,11 +1,11 @@
1
1
  import process from 'process';
2
2
  import ScopeLock from 'scope-lock';
3
- import { AbortedError, raceAbort } from "../helpers/race-abort.js";
4
- import { hdiag } from "../log.js";
5
- import { AUDIOGEN_CATALOG, musicChoiceForDit, musicDefaultSteps, musicModelSet } from "../models/model-catalog.js";
6
- import { GENERATE_MUSIC_TOOL } from "../models/music-catalog.js";
7
- import { createLoadTracker } from "../models/model-pool.js";
8
- import { resolveModelSrc } from "../models/model-source.js";
3
+ import { AbortedError, raceAbort } from '../helpers/race-abort.js';
4
+ import { hdiag } from '../log.js';
5
+ import { AUDIOGEN_CATALOG, musicChoiceForDit, musicDefaultSteps, musicModelSet } from '../models/model-catalog.js';
6
+ import { GENERATE_MUSIC_TOOL } from '../models/music-catalog.js';
7
+ import { createLoadTracker } from '../models/model-pool.js';
8
+ import { resolveModelSrc } from '../models/model-source.js';
9
9
  export const MAX_DURATION_SECONDS = 300;
10
10
  export const MIN_DURATION_SECONDS = 1;
11
11
  export const MAX_STEPS = 60;
@@ -1,9 +1,9 @@
1
- import { hlog } from "../log.js";
2
- import { searchTargets } from "./file-glob.js";
3
- import { readLines } from "./fs/read.js";
4
- import { isDriveReadTruncated } from "./fs/remote.js";
5
- import { canonicalDenyRoots, defaultRealpath, isDeniedPath } from "./fs/scope.js";
6
- import { walkFiles } from "./fs/walk.js";
1
+ import { hlog } from '../log.js';
2
+ import { searchTargets } from './file-glob.js';
3
+ import { readLines } from './fs/read.js';
4
+ import { isDriveReadTruncated } from './fs/remote.js';
5
+ import { canonicalDenyRoots, defaultRealpath, isDeniedPath } from './fs/scope.js';
6
+ import { walkFiles } from './fs/walk.js';
7
7
  export const DEFAULT_GREP_MATCHES = 200;
8
8
  export const MAX_GREP_MATCHES = 1000;
9
9
  const MAX_LINE_CHARS = 500;