@qvac/harness 0.0.0 → 0.1.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.
- package/LICENSE.md +198 -0
- package/NOTICE.md +13 -0
- package/README.md +68 -0
- package/SECURITY.md +6 -0
- package/dist/harness.bundle +48339 -0
- package/dist/harness.cjs +18 -0
- package/dist/harness.d.ts +8 -0
- package/dist/prebuilds-manifest.json +379 -0
- package/dist-lib/index.d.ts +240 -0
- package/dist-lib/index.js +1063 -0
- package/dist-lib/lib/audio-transcode-bare.d.ts +2 -0
- package/dist-lib/lib/audio-transcode-bare.js +145 -0
- package/dist-lib/lib/audio-transcode-node.d.ts +2 -0
- package/dist-lib/lib/audio-transcode-node.js +6 -0
- package/dist-lib/lib/capabilities/audio-resample.d.ts +14 -0
- package/dist-lib/lib/capabilities/audio-resample.js +72 -0
- package/dist-lib/lib/capabilities/completion.d.ts +288 -0
- package/dist-lib/lib/capabilities/completion.js +1077 -0
- package/dist-lib/lib/capabilities/download.d.ts +46 -0
- package/dist-lib/lib/capabilities/download.js +124 -0
- package/dist-lib/lib/capabilities/embed.d.ts +20 -0
- package/dist-lib/lib/capabilities/embed.js +13 -0
- package/dist-lib/lib/capabilities/kv-cache.d.ts +13 -0
- package/dist-lib/lib/capabilities/kv-cache.js +21 -0
- package/dist-lib/lib/capabilities/prompt-prefix.d.ts +6 -0
- package/dist-lib/lib/capabilities/prompt-prefix.js +10 -0
- package/dist-lib/lib/capabilities/speech-lexicon.d.ts +5 -0
- package/dist-lib/lib/capabilities/speech-lexicon.js +32 -0
- package/dist-lib/lib/capabilities/speech-text.d.ts +6 -0
- package/dist-lib/lib/capabilities/speech-text.js +79 -0
- package/dist-lib/lib/capabilities/tool-names.d.ts +3 -0
- package/dist-lib/lib/capabilities/tool-names.js +3 -0
- package/dist-lib/lib/capabilities/tool-selection.d.ts +43 -0
- package/dist-lib/lib/capabilities/tool-selection.js +60 -0
- package/dist-lib/lib/capabilities/tool-turns.d.ts +9 -0
- package/dist-lib/lib/capabilities/tool-turns.js +101 -0
- package/dist-lib/lib/capabilities/usage-breakdown.d.ts +27 -0
- package/dist-lib/lib/capabilities/usage-breakdown.js +44 -0
- package/dist-lib/lib/capabilities/vision-history.d.ts +3 -0
- package/dist-lib/lib/capabilities/vision-history.js +21 -0
- package/dist-lib/lib/capabilities/voice.d.ts +78 -0
- package/dist-lib/lib/capabilities/voice.js +189 -0
- package/dist-lib/lib/connect.d.ts +76 -0
- package/dist-lib/lib/connect.js +789 -0
- package/dist-lib/lib/context-window.d.ts +7 -0
- package/dist-lib/lib/context-window.js +90 -0
- package/dist-lib/lib/contract-types.d.ts +210 -0
- package/dist-lib/lib/contract-types.js +1 -0
- package/dist-lib/lib/diagram-repair.d.ts +21 -0
- package/dist-lib/lib/diagram-repair.js +58 -0
- package/dist-lib/lib/dns-lookup.d.ts +1 -0
- package/dist-lib/lib/dns-lookup.js +13 -0
- package/dist-lib/lib/error-fields.d.ts +2 -0
- package/dist-lib/lib/error-fields.js +8 -0
- package/dist-lib/lib/fetch-node.d.ts +1 -0
- package/dist-lib/lib/fetch-node.js +1 -0
- package/dist-lib/lib/hardware/capability-probe.d.ts +9 -0
- package/dist-lib/lib/hardware/capability-probe.js +99 -0
- package/dist-lib/lib/hardware/gpu-classify.d.ts +2 -0
- package/dist-lib/lib/hardware/gpu-classify.js +32 -0
- package/dist-lib/lib/hardware/gpu-probe-addon.d.ts +2 -0
- package/dist-lib/lib/hardware/gpu-probe-addon.js +42 -0
- package/dist-lib/lib/hardware/gpu-stats.bare.d.ts +1 -0
- package/dist-lib/lib/hardware/gpu-stats.bare.js +24 -0
- package/dist-lib/lib/hardware/gpu-stats.stub.d.ts +1 -0
- package/dist-lib/lib/hardware/gpu-stats.stub.js +3 -0
- package/dist-lib/lib/hardware/memory-budget.d.ts +8 -0
- package/dist-lib/lib/hardware/memory-budget.js +1 -0
- package/dist-lib/lib/hardware/parsers.d.ts +7 -0
- package/dist-lib/lib/hardware/parsers.js +41 -0
- package/dist-lib/lib/headers-bare.d.ts +1 -0
- package/dist-lib/lib/headers-bare.js +1 -0
- package/dist-lib/lib/headers-node.d.ts +4 -0
- package/dist-lib/lib/headers-node.js +1 -0
- package/dist-lib/lib/helpers/buffer-burst.d.ts +1 -0
- package/dist-lib/lib/helpers/buffer-burst.js +20 -0
- package/dist-lib/lib/helpers/control-tokens.d.ts +7 -0
- package/dist-lib/lib/helpers/control-tokens.js +32 -0
- package/dist-lib/lib/helpers/join-guard.d.ts +6 -0
- package/dist-lib/lib/helpers/join-guard.js +46 -0
- package/dist-lib/lib/helpers/markup-stream-filter.d.ts +5 -0
- package/dist-lib/lib/helpers/markup-stream-filter.js +75 -0
- package/dist-lib/lib/helpers/race-abort.d.ts +5 -0
- package/dist-lib/lib/helpers/race-abort.js +18 -0
- package/dist-lib/lib/helpers/retry-memo.d.ts +5 -0
- package/dist-lib/lib/helpers/retry-memo.js +12 -0
- package/dist-lib/lib/helpers/run-outcome.d.ts +33 -0
- package/dist-lib/lib/helpers/run-outcome.js +204 -0
- package/dist-lib/lib/helpers/spawn-path.d.ts +5 -0
- package/dist-lib/lib/helpers/spawn-path.js +57 -0
- package/dist-lib/lib/helpers/text-coalescer.d.ts +15 -0
- package/dist-lib/lib/helpers/text-coalescer.js +34 -0
- package/dist-lib/lib/helpers/thinking.d.ts +8 -0
- package/dist-lib/lib/helpers/thinking.js +95 -0
- package/dist-lib/lib/helpers/tool-call-markup.d.ts +20 -0
- package/dist-lib/lib/helpers/tool-call-markup.js +201 -0
- package/dist-lib/lib/helpers/tool-intent.d.ts +7 -0
- package/dist-lib/lib/helpers/tool-intent.js +21 -0
- package/dist-lib/lib/helpers/tool-label.d.ts +8 -0
- package/dist-lib/lib/helpers/tool-label.js +131 -0
- package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +5 -0
- package/dist-lib/lib/hooks/built-in/arg-repair.js +88 -0
- package/dist-lib/lib/hooks/built-in/egress.d.ts +5 -0
- package/dist-lib/lib/hooks/built-in/egress.js +29 -0
- package/dist-lib/lib/hooks/built-in/index.d.ts +3 -0
- package/dist-lib/lib/hooks/built-in/index.js +3 -0
- package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +10 -0
- package/dist-lib/lib/hooks/built-in/skill-catalog.js +17 -0
- package/dist-lib/lib/hooks/pipeline.d.ts +20 -0
- package/dist-lib/lib/hooks/pipeline.js +49 -0
- package/dist-lib/lib/hooks/registry.d.ts +2 -0
- package/dist-lib/lib/hooks/registry.js +6 -0
- package/dist-lib/lib/hooks/run.d.ts +5 -0
- package/dist-lib/lib/hooks/run.js +83 -0
- package/dist-lib/lib/hooks/types.d.ts +57 -0
- package/dist-lib/lib/hooks/types.js +1 -0
- package/dist-lib/lib/log.d.ts +5 -0
- package/dist-lib/lib/log.js +37 -0
- package/dist-lib/lib/model-download-progress.d.ts +22 -0
- package/dist-lib/lib/model-download-progress.js +95 -0
- package/dist-lib/lib/models/context.d.ts +5 -0
- package/dist-lib/lib/models/context.js +12 -0
- package/dist-lib/lib/models/embed-config.d.ts +14 -0
- package/dist-lib/lib/models/embed-config.js +31 -0
- package/dist-lib/lib/models/gpu-selection.d.ts +3 -0
- package/dist-lib/lib/models/gpu-selection.js +26 -0
- package/dist-lib/lib/models/kv-cache.d.ts +4 -0
- package/dist-lib/lib/models/kv-cache.js +6 -0
- package/dist-lib/lib/models/llm-presets.d.ts +10 -0
- package/dist-lib/lib/models/llm-presets.js +58 -0
- package/dist-lib/lib/models/model-catalog-constants.d.ts +29 -0
- package/dist-lib/lib/models/model-catalog-constants.js +103 -0
- package/dist-lib/lib/models/model-catalog.d.ts +125 -0
- package/dist-lib/lib/models/model-catalog.js +371 -0
- package/dist-lib/lib/models/model-delete.d.ts +18 -0
- package/dist-lib/lib/models/model-delete.js +47 -0
- package/dist-lib/lib/models/model-handle.d.ts +18 -0
- package/dist-lib/lib/models/model-handle.js +33 -0
- package/dist-lib/lib/models/model-list.d.ts +42 -0
- package/dist-lib/lib/models/model-list.js +123 -0
- package/dist-lib/lib/models/model-pool.d.ts +116 -0
- package/dist-lib/lib/models/model-pool.js +356 -0
- package/dist-lib/lib/models/model-source.d.ts +6 -0
- package/dist-lib/lib/models/model-source.js +21 -0
- package/dist-lib/lib/models/music-catalog.d.ts +12 -0
- package/dist-lib/lib/models/music-catalog.js +26 -0
- package/dist-lib/lib/models/opencl-cache.d.ts +5 -0
- package/dist-lib/lib/models/opencl-cache.js +50 -0
- package/dist-lib/lib/models/sdk-faults.d.ts +21 -0
- package/dist-lib/lib/models/sdk-faults.js +66 -0
- package/dist-lib/lib/models/tool-dialect.d.ts +2 -0
- package/dist-lib/lib/models/tool-dialect.js +19 -0
- package/dist-lib/lib/models/tts-model-default.d.ts +3 -0
- package/dist-lib/lib/models/tts-model-default.js +13 -0
- package/dist-lib/lib/no-redirect-fetch-bare.d.ts +15 -0
- package/dist-lib/lib/no-redirect-fetch-bare.js +59 -0
- package/dist-lib/lib/no-redirect-fetch-impl.d.ts +39 -0
- package/dist-lib/lib/no-redirect-fetch-impl.js +80 -0
- package/dist-lib/lib/no-redirect-fetch-node.d.ts +4 -0
- package/dist-lib/lib/no-redirect-fetch-node.js +52 -0
- package/dist-lib/lib/prompt.d.ts +22 -0
- package/dist-lib/lib/prompt.js +77 -0
- package/dist-lib/lib/queue.d.ts +9 -0
- package/dist-lib/lib/queue.js +48 -0
- package/dist-lib/lib/resolution-detector.d.ts +5 -0
- package/dist-lib/lib/resolution-detector.js +100 -0
- package/dist-lib/lib/rpc-session.d.ts +8 -0
- package/dist-lib/lib/rpc-session.js +20 -0
- package/dist-lib/lib/sdk-config-loader.node.d.ts +1 -0
- package/dist-lib/lib/sdk-config-loader.node.js +1 -0
- package/dist-lib/lib/sdk-loader.d.ts +30 -0
- package/dist-lib/lib/sdk-loader.js +53 -0
- package/dist-lib/lib/sdk-storage.d.ts +8 -0
- package/dist-lib/lib/sdk-storage.js +24 -0
- package/dist-lib/lib/serve.d.ts +3 -0
- package/dist-lib/lib/serve.js +612 -0
- package/dist-lib/lib/spawn.d.ts +62 -0
- package/dist-lib/lib/spawn.js +71 -0
- package/dist-lib/lib/staging.d.ts +4 -0
- package/dist-lib/lib/staging.js +28 -0
- package/dist-lib/lib/storage.d.ts +18 -0
- package/dist-lib/lib/storage.js +26 -0
- package/dist-lib/lib/tmp-path.d.ts +7 -0
- package/dist-lib/lib/tmp-path.js +17 -0
- package/dist-lib/lib/tool-call-display.d.ts +21 -0
- package/dist-lib/lib/tool-call-display.js +1 -0
- package/dist-lib/lib/tools/catalog.d.ts +13 -0
- package/dist-lib/lib/tools/catalog.js +13 -0
- package/dist-lib/lib/tools/create-documents.d.ts +3 -0
- package/dist-lib/lib/tools/create-documents.js +87 -0
- package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
- package/dist-lib/lib/tools/edit-documents.js +122 -0
- package/dist-lib/lib/tools/edit-image.d.ts +25 -0
- package/dist-lib/lib/tools/edit-image.js +271 -0
- package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
- package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
- package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
- package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
- package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
- package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
- package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
- package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
- package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
- package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
- package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
- package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
- package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
- package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
- package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
- package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
- package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
- package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
- package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
- package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
- package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
- package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
- package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
- package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
- package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
- package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
- package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
- package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
- package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
- package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
- package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
- package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
- package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
- package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
- package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
- package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
- package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
- package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
- package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
- package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
- package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
- package/dist-lib/lib/tools/exec/runner.js +87 -0
- package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
- package/dist-lib/lib/tools/exec/scope.js +97 -0
- package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
- package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
- package/dist-lib/lib/tools/exec.d.ts +29 -0
- package/dist-lib/lib/tools/exec.js +459 -0
- package/dist-lib/lib/tools/file-glob.d.ts +15 -0
- package/dist-lib/lib/tools/file-glob.js +112 -0
- package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
- package/dist-lib/lib/tools/fs/drive.js +1 -0
- package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
- package/dist-lib/lib/tools/fs/glob.js +34 -0
- package/dist-lib/lib/tools/fs/local.d.ts +2 -0
- package/dist-lib/lib/tools/fs/local.js +29 -0
- package/dist-lib/lib/tools/fs/read.d.ts +2 -0
- package/dist-lib/lib/tools/fs/read.js +17 -0
- package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
- package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
- package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
- package/dist-lib/lib/tools/fs/remote.js +131 -0
- package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
- package/dist-lib/lib/tools/fs/scope.js +130 -0
- package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
- package/dist-lib/lib/tools/fs/walk.js +38 -0
- package/dist-lib/lib/tools/fs/write.d.ts +4 -0
- package/dist-lib/lib/tools/fs/write.js +5 -0
- package/dist-lib/lib/tools/generate-image.d.ts +111 -0
- package/dist-lib/lib/tools/generate-image.js +369 -0
- package/dist-lib/lib/tools/generate-music.d.ts +124 -0
- package/dist-lib/lib/tools/generate-music.js +522 -0
- package/dist-lib/lib/tools/grep.d.ts +5 -0
- package/dist-lib/lib/tools/grep.js +158 -0
- package/dist-lib/lib/tools/http-methods.d.ts +1 -0
- package/dist-lib/lib/tools/http-methods.js +1 -0
- package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
- package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
- package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
- package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
- package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
- package/dist-lib/lib/tools/http-request/utils.js +84 -0
- package/dist-lib/lib/tools/http-request.d.ts +20 -0
- package/dist-lib/lib/tools/http-request.js +177 -0
- package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
- package/dist-lib/lib/tools/mcp/utils.js +172 -0
- package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
- package/dist-lib/lib/tools/mcp-call.js +155 -0
- package/dist-lib/lib/tools/model-args.d.ts +1 -0
- package/dist-lib/lib/tools/model-args.js +4 -0
- package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
- package/dist-lib/lib/tools/operations/builders.js +179 -0
- package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
- package/dist-lib/lib/tools/operations/compile.js +92 -0
- package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
- package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
- package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
- package/dist-lib/lib/tools/operations/manifest.js +50 -0
- package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
- package/dist-lib/lib/tools/outbound-guard.js +127 -0
- package/dist-lib/lib/tools/private-ip.d.ts +4 -0
- package/dist-lib/lib/tools/private-ip.js +126 -0
- package/dist-lib/lib/tools/rag-search.d.ts +2 -0
- package/dist-lib/lib/tools/rag-search.js +98 -0
- package/dist-lib/lib/tools/read-files.d.ts +5 -0
- package/dist-lib/lib/tools/read-files.js +153 -0
- package/dist-lib/lib/tools/skill.d.ts +10 -0
- package/dist-lib/lib/tools/skill.js +123 -0
- package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
- package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
- package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
- package/dist-lib/lib/tools/skills/bin-check.js +56 -0
- package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
- package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
- package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
- package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
- package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
- package/dist-lib/lib/tools/skills/catalog.js +203 -0
- package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
- package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
- package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
- package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
- package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
- package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
- package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
- package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
- package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
- package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
- package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
- package/dist-lib/lib/tools/skills/credential-check.js +94 -0
- package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
- package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
- package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
- package/dist-lib/lib/tools/skills/credential-health.js +51 -0
- package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
- package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
- package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
- package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
- package/dist-lib/lib/tools/skills/index.d.ts +5 -0
- package/dist-lib/lib/tools/skills/index.js +5 -0
- package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
- package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
- package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
- package/dist-lib/lib/tools/skills/manifest.js +1 -0
- package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
- package/dist-lib/lib/tools/skills/mention-name.js +4 -0
- package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
- package/dist-lib/lib/tools/skills/mention.js +42 -0
- package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
- package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
- package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
- package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
- package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
- package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
- package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
- package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
- package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
- package/dist-lib/lib/tools/skills/scope-key.js +7 -0
- package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
- package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
- package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
- package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
- package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
- package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
- package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
- package/dist-lib/lib/tools/skills/skill-state.js +117 -0
- package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
- package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
- package/dist-lib/lib/tools/toolsets.d.ts +8 -0
- package/dist-lib/lib/tools/toolsets.js +20 -0
- package/dist-lib/lib/tools/url-guard.d.ts +8 -0
- package/dist-lib/lib/tools/url-guard.js +40 -0
- package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
- package/dist-lib/lib/tools/web-fetch.js +302 -0
- package/dist-lib/lib/tools/web-search.d.ts +6 -0
- package/dist-lib/lib/tools/web-search.js +55 -0
- package/dist-lib/lib/transport.d.ts +12 -0
- package/dist-lib/lib/transport.js +59 -0
- package/dist-lib/lib/user-agent.d.ts +1 -0
- package/dist-lib/lib/user-agent.js +1 -0
- package/dist-lib/lib/validating-lookup.d.ts +17 -0
- package/dist-lib/lib/validating-lookup.js +25 -0
- package/dist-lib/lib/wav-encode.d.ts +5 -0
- package/dist-lib/lib/wav-encode.js +24 -0
- package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
- package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
- package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
- package/dist-lib/lib/web-fetch/extract.js +65 -0
- package/dist-lib/lib/web-fetch/images.d.ts +3 -0
- package/dist-lib/lib/web-fetch/images.js +43 -0
- package/dist-lib/lib/web-fetch/video.d.ts +5 -0
- package/dist-lib/lib/web-fetch/video.js +42 -0
- package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
- package/dist-lib/lib/web-search/engine-registry.js +17 -0
- package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/aol.js +81 -0
- package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/bing.js +111 -0
- package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/brave.js +59 -0
- package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
- package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/google.js +92 -0
- package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
- package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
- package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
- package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
- package/dist-lib/lib/web-search/fetch-html.js +97 -0
- package/dist-lib/lib/web-search/format-results.d.ts +3 -0
- package/dist-lib/lib/web-search/format-results.js +14 -0
- package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
- package/dist-lib/lib/web-search/html-helpers.js +24 -0
- package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
- package/dist-lib/lib/web-search/merge-results.js +53 -0
- package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
- package/dist-lib/lib/web-search/orchestrator.js +50 -0
- package/dist-lib/lib/web-search/types.d.ts +34 -0
- package/dist-lib/lib/web-search/types.js +1 -0
- package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
- package/dist-lib/lib/web-search/url-helpers.js +11 -0
- package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
- package/dist-lib/lib/web-search/url-normalize.js +25 -0
- package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
- package/dist-lib/lib/web-search/user-agents.js +3 -0
- package/dist-lib/lib/wire.d.ts +50 -0
- package/dist-lib/lib/wire.js +145 -0
- package/dist-lib/schema/baseline.d.ts +8 -0
- package/dist-lib/schema/baseline.js +35 -0
- package/dist-lib/schema/build.d.ts +1 -0
- package/dist-lib/schema/build.js +39 -0
- package/dist-lib/schema/generate.d.ts +20 -0
- package/dist-lib/schema/generate.js +149 -0
- package/dist-lib/schema/harness.d.ts +2 -0
- package/dist-lib/schema/harness.js +745 -0
- package/dist-lib/schema/release-tags.d.ts +5 -0
- package/dist-lib/schema/release-tags.js +58 -0
- package/dist-lib/spec/bind.d.ts +2 -0
- package/dist-lib/spec/bind.js +124 -0
- package/dist-lib/spec/calls.d.ts +3 -0
- package/dist-lib/spec/calls.js +41 -0
- package/dist-lib/spec/hrpc/hrpc.json +356 -0
- package/dist-lib/spec/hrpc/index.d.ts +3 -0
- package/dist-lib/spec/hrpc/index.js +463 -0
- package/dist-lib/spec/hrpc/messages.d.ts +4 -0
- package/dist-lib/spec/hrpc/messages.js +3102 -0
- package/dist-lib/spec/hyperschema/index.js +3102 -0
- package/dist-lib/spec/hyperschema/schema.json +2290 -0
- package/dist-lib/spec/hyperschema/types.d.ts +554 -0
- package/dist-lib/spec/index.d.ts +8 -0
- package/dist-lib/spec/index.js +1 -0
- package/package.json +418 -1
- package/wheels/cffi-2.0.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
- package/wheels/cryptography-47.0.0-cp314-abi3-pyemscripten_2026_0_wasm32.whl +0 -0
- package/wheels/defusedxml-0.7.1-py2.py3-none-any.whl +0 -0
- package/wheels/et_xmlfile-2.0.0-py3-none-any.whl +0 -0
- package/wheels/fonttools-4.62.1-py3-none-any.whl +0 -0
- package/wheels/fpdf2-2.8.8-py3-none-any.whl +0 -0
- package/wheels/lxml-6.0.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
- package/wheels/manifest.json +155 -0
- package/wheels/micropip-0.11.1-py3-none-any.whl +0 -0
- package/wheels/openpyxl-3.1.5-py2.py3-none-any.whl +0 -0
- package/wheels/pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
- package/wheels/pycparser-3.0-py3-none-any.whl +0 -0
- package/wheels/pypdf-6.15.0-py3-none-any.whl +0 -0
- package/wheels/python_docx-1.2.0-py3-none-any.whl +0 -0
- package/wheels/python_pptx-1.0.2-py3-none-any.whl +0 -0
- package/wheels/six-1.17.0-py2.py3-none-any.whl +0 -0
- package/wheels/typing_extensions-4.15.0-py3-none-any.whl +0 -0
- package/wheels/xlsxwriter-3.2.9-py3-none-any.whl +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
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";
|
|
5
|
+
export function harnessChild(entry, opts) {
|
|
6
|
+
if (opts.logger)
|
|
7
|
+
setHarnessLog(true);
|
|
8
|
+
const { runner, skillsDir, wheelsDir, sdkStorage, embedDevice, embedGpuLayers, embedBatchSize, imageModel, imageClamps, musicModel, musicClamps, llm, onIpc, logger = null, ...spec } = opts;
|
|
9
|
+
const embedConfig = createEmbedConfig({
|
|
10
|
+
device: embedDevice,
|
|
11
|
+
gpuLayers: embedGpuLayers,
|
|
12
|
+
batchSize: embedBatchSize
|
|
13
|
+
});
|
|
14
|
+
return stowChild(entry, {
|
|
15
|
+
...spec,
|
|
16
|
+
runner,
|
|
17
|
+
args: [
|
|
18
|
+
skillsDir ?? '',
|
|
19
|
+
sdkStorage ? JSON.stringify(sdkStorage) : '',
|
|
20
|
+
JSON.stringify(embedConfig),
|
|
21
|
+
imageModel ? JSON.stringify(imageModel) : '',
|
|
22
|
+
imageClamps ? JSON.stringify(imageClamps) : '',
|
|
23
|
+
logger ? '1' : '',
|
|
24
|
+
llm ? JSON.stringify(llm) : '',
|
|
25
|
+
musicModel ? JSON.stringify(musicModel) : '',
|
|
26
|
+
musicClamps ? JSON.stringify(musicClamps) : '',
|
|
27
|
+
wheelsDir ?? ''
|
|
28
|
+
],
|
|
29
|
+
logger,
|
|
30
|
+
create: (ipc) => {
|
|
31
|
+
onIpc?.(ipc);
|
|
32
|
+
return connectHarness(() => ipc);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function spawnHarness(opts) {
|
|
37
|
+
const logger = opts.logger ?? null;
|
|
38
|
+
if (logger)
|
|
39
|
+
setHarnessLog(true);
|
|
40
|
+
const embedConfig = createEmbedConfig({
|
|
41
|
+
device: opts.embedDevice,
|
|
42
|
+
gpuLayers: opts.embedGpuLayers,
|
|
43
|
+
batchSize: opts.embedBatchSize
|
|
44
|
+
});
|
|
45
|
+
return connectHarness(async () => {
|
|
46
|
+
const { default: Sidecar } = await import('bare-sidecar');
|
|
47
|
+
const { wrap } = (await import('bare-stow/host'));
|
|
48
|
+
const sidecar = new Sidecar(opts.entry, [
|
|
49
|
+
opts.skillsDir ?? '',
|
|
50
|
+
JSON.stringify(opts.sdkStorage),
|
|
51
|
+
JSON.stringify(embedConfig),
|
|
52
|
+
opts.imageModel ? JSON.stringify(opts.imageModel) : '',
|
|
53
|
+
opts.imageClamps ? JSON.stringify(opts.imageClamps) : '',
|
|
54
|
+
logger ? '1' : '',
|
|
55
|
+
opts.llm ? JSON.stringify(opts.llm) : '',
|
|
56
|
+
opts.musicModel ? JSON.stringify(opts.musicModel) : '',
|
|
57
|
+
opts.musicClamps ? JSON.stringify(opts.musicClamps) : '',
|
|
58
|
+
opts.wheelsDir ?? ''
|
|
59
|
+
]);
|
|
60
|
+
sidecar.stdout.on('data', (data) => logger?.info('harness', data.toString().trimEnd()));
|
|
61
|
+
sidecar.stderr.on('data', (data) => logger?.warn('harness', data.toString().trimEnd()));
|
|
62
|
+
const ipc = wrap(sidecar);
|
|
63
|
+
const died = new Promise((resolve) => {
|
|
64
|
+
sidecar.once('exit', (code) => resolve(`harness exited (${code}) before ready`));
|
|
65
|
+
});
|
|
66
|
+
const failure = await Promise.race([ipc.ready.then(() => null), died]);
|
|
67
|
+
if (failure)
|
|
68
|
+
throw new Error(failure);
|
|
69
|
+
return ipc;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { userTmpPath } from "./tmp-path.js";
|
|
4
|
+
export const STAGING_DIR = userTmpPath('qvac-harness-staging');
|
|
5
|
+
export const STAGING_MAX_AGE_MS = 60 * 60 * 1000;
|
|
6
|
+
const noop = () => { };
|
|
7
|
+
export async function stageFile(prefix, bytes) {
|
|
8
|
+
await fs.promises.mkdir(STAGING_DIR, { recursive: true, mode: 0o700 });
|
|
9
|
+
const unique = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
10
|
+
const file = path.join(STAGING_DIR, `${prefix}-${unique}`);
|
|
11
|
+
await fs.promises.writeFile(file, bytes, { mode: 0o600 });
|
|
12
|
+
return file;
|
|
13
|
+
}
|
|
14
|
+
export function sweepStaging(now = Date.now()) {
|
|
15
|
+
fs.promises.readdir(STAGING_DIR).then((names) => {
|
|
16
|
+
for (const name of names) {
|
|
17
|
+
const file = path.join(STAGING_DIR, name);
|
|
18
|
+
fs.promises
|
|
19
|
+
.stat(file)
|
|
20
|
+
.then((stat) => {
|
|
21
|
+
if (now - stat.mtimeMs > STAGING_MAX_AGE_MS) {
|
|
22
|
+
return fs.promises.unlink(file).catch(noop);
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
.catch(noop);
|
|
26
|
+
}
|
|
27
|
+
}, noop);
|
|
28
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const MODEL_CACHE_PATH_ENV = "QVAC_MODEL_CACHE_PATH";
|
|
2
|
+
export declare const SDK_HOME_ENV = "SNAP_USER_COMMON";
|
|
3
|
+
export type ReleaseChannel = 'prod' | 'staging' | 'dev';
|
|
4
|
+
export interface StorageOverrides {
|
|
5
|
+
readonly root?: string | null;
|
|
6
|
+
readonly models?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface SdkStorage {
|
|
9
|
+
readonly home: string;
|
|
10
|
+
readonly models: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AssistantStorage {
|
|
13
|
+
readonly root: string;
|
|
14
|
+
readonly assistant: string;
|
|
15
|
+
readonly sdk: SdkStorage;
|
|
16
|
+
}
|
|
17
|
+
export declare function releaseChannel(environment: string): ReleaseChannel;
|
|
18
|
+
export declare function resolveStorage(channel: ReleaseChannel, overrides?: StorageOverrides, env?: Readonly<Record<string, string | undefined>>): AssistantStorage;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import process from 'process';
|
|
4
|
+
import { persistent } from 'bare-storage';
|
|
5
|
+
export const MODEL_CACHE_PATH_ENV = 'QVAC_MODEL_CACHE_PATH';
|
|
6
|
+
export const SDK_HOME_ENV = 'SNAP_USER_COMMON';
|
|
7
|
+
export function releaseChannel(environment) {
|
|
8
|
+
if (environment === 'production' || environment === 'prod')
|
|
9
|
+
return 'prod';
|
|
10
|
+
if (environment === 'staging')
|
|
11
|
+
return 'staging';
|
|
12
|
+
return 'dev';
|
|
13
|
+
}
|
|
14
|
+
export function resolveStorage(channel, overrides = {}, env = process.env) {
|
|
15
|
+
const snapCommon = env[SDK_HOME_ENV];
|
|
16
|
+
const root = overrides.root ?? join(snapCommon ?? persistent(), 'qvac', channel);
|
|
17
|
+
const canonicalSdkHome = snapCommon ?? env['HOME'] ?? env['USERPROFILE'] ?? homedir();
|
|
18
|
+
return {
|
|
19
|
+
root,
|
|
20
|
+
assistant: join(root, 'assistant'),
|
|
21
|
+
sdk: {
|
|
22
|
+
home: join(root, 'sdk-home'),
|
|
23
|
+
models: overrides.models ?? join(canonicalSdkHome, '.qvac', 'models')
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export function userTmpPath(name, opts = {}) {
|
|
4
|
+
const readOwner = opts.readOwner ?? (() => os.userInfo());
|
|
5
|
+
return path.join(os.tmpdir(), taggedName(name, readOwner));
|
|
6
|
+
}
|
|
7
|
+
function taggedName(name, readOwner) {
|
|
8
|
+
let owner;
|
|
9
|
+
try {
|
|
10
|
+
const { uid, username } = readOwner();
|
|
11
|
+
owner = uid >= 0 ? `u${uid}` : username.replace(/[^A-Za-z0-9_-]/g, '');
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return name;
|
|
15
|
+
}
|
|
16
|
+
return owner ? `${name}-${owner}` : name;
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ToolCallDisplay = {
|
|
2
|
+
readonly label: string;
|
|
3
|
+
readonly description?: string;
|
|
4
|
+
readonly iconEmoji?: string;
|
|
5
|
+
};
|
|
6
|
+
export type ToolExecutionOutcome = {
|
|
7
|
+
readonly kind: 'success';
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'error';
|
|
10
|
+
readonly message?: string;
|
|
11
|
+
readonly error?: unknown;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'denied';
|
|
14
|
+
readonly reason?: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'blocked';
|
|
17
|
+
readonly reason?: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'guidance';
|
|
20
|
+
readonly message: string;
|
|
21
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ToolDefinition } from '../capabilities/completion.ts';
|
|
2
|
+
import type { Toolset } from './toolsets.ts';
|
|
3
|
+
export interface ToolCatalogEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
skillGated: boolean;
|
|
7
|
+
scopeRequired: boolean;
|
|
8
|
+
rootsRequired: boolean;
|
|
9
|
+
writeRootsRequired: boolean;
|
|
10
|
+
toolset: Toolset | null;
|
|
11
|
+
promptChars: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function toolCatalog(tools: ReadonlyArray<ToolDefinition>): ToolCatalogEntry[];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { toSdkTool } from "../capabilities/completion.js";
|
|
2
|
+
export function toolCatalog(tools) {
|
|
3
|
+
return tools.map((tool) => ({
|
|
4
|
+
name: tool.name,
|
|
5
|
+
description: tool.description,
|
|
6
|
+
skillGated: tool.skillGated === true,
|
|
7
|
+
scopeRequired: false,
|
|
8
|
+
rootsRequired: tool.rootsRequired === true,
|
|
9
|
+
writeRootsRequired: tool.writeRootsRequired === true,
|
|
10
|
+
toolset: tool.toolset,
|
|
11
|
+
promptChars: JSON.stringify(toSdkTool(tool)).length
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { canonicalDenyRoots, defaultRealpath, resolveKey } from "./fs/scope.js";
|
|
2
|
+
import { writeText } from "./fs/write.js";
|
|
3
|
+
function documentRequests(raw) {
|
|
4
|
+
if (!Array.isArray(raw) || raw.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
const documents = [];
|
|
7
|
+
for (const entry of raw) {
|
|
8
|
+
const record = entry;
|
|
9
|
+
if (typeof record?.path !== 'string' || !record.path.trim())
|
|
10
|
+
return null;
|
|
11
|
+
if (typeof record.content !== 'string')
|
|
12
|
+
return null;
|
|
13
|
+
documents.push({ path: record.path, content: record.content });
|
|
14
|
+
}
|
|
15
|
+
return documents;
|
|
16
|
+
}
|
|
17
|
+
export function createCreateDocumentsTool({ realpath = defaultRealpath, deniedRoots } = {}) {
|
|
18
|
+
return {
|
|
19
|
+
name: 'create_documents',
|
|
20
|
+
toolset: 'files',
|
|
21
|
+
description: 'Create new files inside the granted directories. Parent directories are ' +
|
|
22
|
+
'created as needed. Fails per file if the file already exists — use ' +
|
|
23
|
+
'edit_documents to change existing files.',
|
|
24
|
+
parameters: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
documents: {
|
|
28
|
+
type: 'array',
|
|
29
|
+
description: 'Files to create',
|
|
30
|
+
items: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
path: { type: 'string', description: 'File path' },
|
|
34
|
+
content: { type: 'string', description: 'Full file content' }
|
|
35
|
+
},
|
|
36
|
+
required: ['path', 'content']
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
required: ['documents']
|
|
41
|
+
},
|
|
42
|
+
effect: () => 'read',
|
|
43
|
+
writeRootsRequired: true,
|
|
44
|
+
validate(rawArgs) {
|
|
45
|
+
return documentRequests(rawArgs.documents)
|
|
46
|
+
? null
|
|
47
|
+
: 'documents must be a non-empty array of { path, content }';
|
|
48
|
+
},
|
|
49
|
+
resource(args) {
|
|
50
|
+
const documents = documentRequests(args.documents);
|
|
51
|
+
if (!documents)
|
|
52
|
+
return null;
|
|
53
|
+
const bytes = documents.reduce((sum, doc) => sum + doc.content.length, 0);
|
|
54
|
+
const first = documents[0];
|
|
55
|
+
const suffix = documents.length > 1 ? ` (+${documents.length - 1} more)` : '';
|
|
56
|
+
return { kind: 'file', label: `create ${first.path}${suffix}, ${bytes} chars` };
|
|
57
|
+
},
|
|
58
|
+
async execute(rawArgs, ctx) {
|
|
59
|
+
const roots = ctx?.fsWriteRoots ?? [];
|
|
60
|
+
const documents = documentRequests(rawArgs.documents);
|
|
61
|
+
if (!documents)
|
|
62
|
+
return { error: 'documents must be a non-empty array of { path, content }' };
|
|
63
|
+
const created = [];
|
|
64
|
+
const failed = [];
|
|
65
|
+
const deny = await canonicalDenyRoots(deniedRoots, realpath);
|
|
66
|
+
for (const doc of documents) {
|
|
67
|
+
const resolved = await resolveKey(doc.path, roots, realpath, deny);
|
|
68
|
+
if ('error' in resolved) {
|
|
69
|
+
failed.push({ path: doc.path, error: resolved.error });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
if ((await resolved.root.drive.entry(resolved.key)) !== null) {
|
|
74
|
+
failed.push({ path: doc.path, error: 'file already exists' });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
await writeText(resolved.root.drive, resolved.key, doc.content);
|
|
78
|
+
created.push(doc.path);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
failed.push({ path: doc.path, error: err.message });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { created, ...(failed.length ? { failed } : {}) };
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import b4a from 'b4a';
|
|
2
|
+
import { canonicalDenyRoots, defaultRealpath, resolveKey } from "./fs/scope.js";
|
|
3
|
+
import { writeText } from "./fs/write.js";
|
|
4
|
+
function editRequests(raw) {
|
|
5
|
+
if (!Array.isArray(raw) || raw.length === 0)
|
|
6
|
+
return null;
|
|
7
|
+
const edits = [];
|
|
8
|
+
for (const entry of raw) {
|
|
9
|
+
const record = entry;
|
|
10
|
+
if (typeof record?.path !== 'string' || !record.path.trim())
|
|
11
|
+
return null;
|
|
12
|
+
if (typeof record.search !== 'string' || record.search.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
if (typeof record.replace !== 'string')
|
|
15
|
+
return null;
|
|
16
|
+
edits.push({ path: record.path, search: record.search, replace: record.replace });
|
|
17
|
+
}
|
|
18
|
+
return edits;
|
|
19
|
+
}
|
|
20
|
+
function applyEdits(content, edits) {
|
|
21
|
+
let next = content;
|
|
22
|
+
for (const edit of edits) {
|
|
23
|
+
const first = next.indexOf(edit.search);
|
|
24
|
+
if (first === -1)
|
|
25
|
+
return { error: 'search text not found' };
|
|
26
|
+
if (next.indexOf(edit.search, first + edit.search.length) !== -1) {
|
|
27
|
+
return { error: 'search text is ambiguous (matches more than once)' };
|
|
28
|
+
}
|
|
29
|
+
next = next.slice(0, first) + edit.replace + next.slice(first + edit.search.length);
|
|
30
|
+
}
|
|
31
|
+
return next;
|
|
32
|
+
}
|
|
33
|
+
export function createEditDocumentsTool({ realpath = defaultRealpath, deniedRoots } = {}) {
|
|
34
|
+
return {
|
|
35
|
+
name: 'edit_documents',
|
|
36
|
+
toolset: 'files',
|
|
37
|
+
description: 'Edit existing files inside the granted directories via search/replace. ' +
|
|
38
|
+
'Each search string must match exactly once in its file; include enough ' +
|
|
39
|
+
'surrounding context to make it unique. Edits to one file apply together.',
|
|
40
|
+
parameters: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
edits: {
|
|
44
|
+
type: 'array',
|
|
45
|
+
description: 'Search/replace edits',
|
|
46
|
+
items: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
path: { type: 'string', description: 'File path' },
|
|
50
|
+
search: { type: 'string', description: 'Exact text to find (must match once)' },
|
|
51
|
+
replace: { type: 'string', description: 'Replacement text' }
|
|
52
|
+
},
|
|
53
|
+
required: ['path', 'search', 'replace']
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
required: ['edits']
|
|
58
|
+
},
|
|
59
|
+
effect: () => 'write',
|
|
60
|
+
autoApprove: false,
|
|
61
|
+
writeRootsRequired: true,
|
|
62
|
+
validate(rawArgs) {
|
|
63
|
+
return editRequests(rawArgs.edits)
|
|
64
|
+
? null
|
|
65
|
+
: 'edits must be a non-empty array of { path, search, replace }';
|
|
66
|
+
},
|
|
67
|
+
resource(args) {
|
|
68
|
+
const edits = editRequests(args.edits);
|
|
69
|
+
if (!edits)
|
|
70
|
+
return null;
|
|
71
|
+
const paths = [...new Set(edits.map((edit) => edit.path))];
|
|
72
|
+
const label = paths.slice(0, 3).join(', ');
|
|
73
|
+
return {
|
|
74
|
+
kind: 'file',
|
|
75
|
+
label: `edit ${paths.length > 3 ? `${label} (+${paths.length - 3} more)` : label} (${edits.length} edit${edits.length > 1 ? 's' : ''})`
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
async execute(rawArgs, ctx) {
|
|
79
|
+
const roots = ctx?.fsWriteRoots ?? [];
|
|
80
|
+
const edits = editRequests(rawArgs.edits);
|
|
81
|
+
if (!edits)
|
|
82
|
+
return { error: 'edits must be a non-empty array of { path, search, replace }' };
|
|
83
|
+
const byPath = new Map();
|
|
84
|
+
for (const edit of edits) {
|
|
85
|
+
const list = byPath.get(edit.path) ?? [];
|
|
86
|
+
list.push(edit);
|
|
87
|
+
byPath.set(edit.path, list);
|
|
88
|
+
}
|
|
89
|
+
const edited = [];
|
|
90
|
+
const failed = [];
|
|
91
|
+
const deny = await canonicalDenyRoots(deniedRoots, realpath);
|
|
92
|
+
for (const [file, fileEdits] of byPath) {
|
|
93
|
+
const resolved = await resolveKey(file, roots, realpath, deny);
|
|
94
|
+
if ('error' in resolved) {
|
|
95
|
+
failed.push({ path: file, error: resolved.error });
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const entry = await resolved.root.drive.entry(resolved.key);
|
|
100
|
+
const blob = entry === null ? null : await resolved.root.drive.get(resolved.key);
|
|
101
|
+
if (entry === null || blob === null) {
|
|
102
|
+
failed.push({ path: file, error: `no such file: ${file}` });
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const next = applyEdits(b4a.toString(blob, 'utf8'), fileEdits);
|
|
106
|
+
if (typeof next === 'object') {
|
|
107
|
+
failed.push({ path: file, error: next.error });
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
await writeText(resolved.root.drive, resolved.key, next, {
|
|
111
|
+
executable: entry.value.executable
|
|
112
|
+
});
|
|
113
|
+
edited.push(file);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
failed.push({ path: file, error: err.message });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { edited, ...(failed.length ? { failed } : {}) };
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../capabilities/completion.ts';
|
|
2
|
+
import type { ImageClamps } from '../models/model-catalog.ts';
|
|
3
|
+
import { type DiffusionRuntime } from './generate-image.ts';
|
|
4
|
+
interface Rgba {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
data: Buffer;
|
|
8
|
+
frames?: Rgba[];
|
|
9
|
+
}
|
|
10
|
+
interface Media {
|
|
11
|
+
image: {
|
|
12
|
+
decode(input: Buffer, opts?: {
|
|
13
|
+
maxFrames?: number;
|
|
14
|
+
}): Promise<Rgba>;
|
|
15
|
+
encode(rgba: Rgba, opts: {
|
|
16
|
+
mimetype: string;
|
|
17
|
+
}): Promise<Uint8Array>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface EditImageDeps {
|
|
21
|
+
loadMedia?: () => Promise<Media | null>;
|
|
22
|
+
resample?: (rgba: Rgba, width: number, height: number) => Rgba | Promise<Rgba>;
|
|
23
|
+
}
|
|
24
|
+
export declare function createEditImageTool(runtime: DiffusionRuntime, { loadMedia, resample }?: EditImageDeps, clamps?: ImageClamps): ToolDefinition;
|
|
25
|
+
export {};
|