@qvac/harness 0.2.7 → 0.2.9
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/dist/harness.bundle +70 -16
- package/dist/prebuilds-manifest.json +8 -0
- package/dist-lib/index.d.ts +2 -1
- package/dist-lib/index.js +60 -59
- package/dist-lib/lib/audio-transcode-bare.js +2 -2
- package/dist-lib/lib/capabilities/completion.d.ts +35 -2
- package/dist-lib/lib/capabilities/completion.js +114 -48
- package/dist-lib/lib/capabilities/download.js +2 -2
- package/dist-lib/lib/capabilities/speech-text.js +1 -1
- package/dist-lib/lib/capabilities/tool-prompt-log.js +1 -1
- package/dist-lib/lib/capabilities/tool-selection.js +2 -2
- package/dist-lib/lib/capabilities/tool-turns.js +1 -1
- package/dist-lib/lib/capabilities/usage-breakdown.js +1 -1
- package/dist-lib/lib/capabilities/voice.js +3 -3
- package/dist-lib/lib/connect.js +12 -11
- package/dist-lib/lib/context-window.js +1 -1
- package/dist-lib/lib/contract-types.d.ts +1 -0
- package/dist-lib/lib/docx/index.js +3 -3
- package/dist-lib/lib/hardware/capability-probe.js +3 -3
- package/dist-lib/lib/hardware/gpu-probe-addon.js +2 -2
- package/dist-lib/lib/hardware/gpu-probe-entry.js +1 -1
- package/dist-lib/lib/helpers/markup-stream-filter.js +1 -1
- package/dist-lib/lib/helpers/run-outcome.js +1 -1
- package/dist-lib/lib/helpers/spawn-path.d.ts +1 -1
- package/dist-lib/lib/helpers/thinking.js +2 -2
- package/dist-lib/lib/helpers/tool-intent.js +1 -1
- package/dist-lib/lib/helpers/tool-label.js +3 -3
- package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +1 -1
- package/dist-lib/lib/hooks/built-in/arg-repair.js +1 -1
- package/dist-lib/lib/hooks/built-in/egress.d.ts +1 -1
- package/dist-lib/lib/hooks/built-in/egress.js +2 -2
- package/dist-lib/lib/hooks/built-in/index.js +3 -3
- package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +1 -1
- package/dist-lib/lib/hooks/pipeline.js +4 -4
- package/dist-lib/lib/hooks/registry.js +1 -1
- package/dist-lib/lib/hooks/run.js +1 -1
- package/dist-lib/lib/models/model-catalog.js +4 -4
- package/dist-lib/lib/models/model-delete.js +1 -1
- package/dist-lib/lib/models/model-handle.js +1 -1
- package/dist-lib/lib/models/model-list.js +1 -1
- package/dist-lib/lib/models/model-pool.js +8 -8
- package/dist-lib/lib/models/model-source.js +1 -1
- package/dist-lib/lib/models/music-catalog.d.ts +1 -1
- package/dist-lib/lib/no-redirect-fetch-bare.js +3 -3
- package/dist-lib/lib/no-redirect-fetch-impl.js +1 -1
- package/dist-lib/lib/no-redirect-fetch-node.js +2 -2
- package/dist-lib/lib/resolution-detector.js +1 -1
- package/dist-lib/lib/sdk-loader.js +2 -2
- package/dist-lib/lib/sdk-storage.js +1 -1
- package/dist-lib/lib/serve.js +11 -10
- package/dist-lib/lib/spawn.js +3 -3
- package/dist-lib/lib/staging.js +1 -1
- package/dist-lib/lib/tools/catalog.js +1 -1
- package/dist-lib/lib/tools/create-documents.js +2 -2
- package/dist-lib/lib/tools/edit-documents.js +2 -2
- package/dist-lib/lib/tools/edit-image.js +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/attachments.js +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +1 -1
- package/dist-lib/lib/tools/exec/adapters/python/loader.js +1 -1
- package/dist-lib/lib/tools/exec/adapters/python/memfs.js +2 -2
- package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +6 -6
- package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +3 -3
- package/dist-lib/lib/tools/exec/adapters/python/run-session.js +5 -5
- package/dist-lib/lib/tools/exec/adapters/python/wheels.js +1 -1
- package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +3 -3
- package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +4 -4
- package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +1 -1
- package/dist-lib/lib/tools/exec/obsidian/cli-process.js +2 -2
- package/dist-lib/lib/tools/exec/obsidian/cli.js +4 -4
- package/dist-lib/lib/tools/exec/obsidian/command.js +1 -1
- package/dist-lib/lib/tools/exec/obsidian/route.js +7 -7
- package/dist-lib/lib/tools/exec/obsidian/vault-create.js +2 -2
- package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +6 -6
- package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +2 -2
- package/dist-lib/lib/tools/exec/obsidian/vault-read.js +1 -1
- package/dist-lib/lib/tools/exec/obsidian/vault-write.js +2 -2
- package/dist-lib/lib/tools/exec/runner.js +1 -1
- package/dist-lib/lib/tools/exec.js +13 -13
- package/dist-lib/lib/tools/file-glob.js +3 -3
- package/dist-lib/lib/tools/fs/local.js +1 -1
- package/dist-lib/lib/tools/fs/remote.js +1 -1
- package/dist-lib/lib/tools/fs/walk.js +2 -2
- package/dist-lib/lib/tools/generate-image.js +4 -4
- package/dist-lib/lib/tools/generate-music.js +6 -6
- package/dist-lib/lib/tools/grep.js +6 -6
- package/dist-lib/lib/tools/http-request/truncate-response.js +1 -1
- package/dist-lib/lib/tools/http-request.js +9 -9
- package/dist-lib/lib/tools/mcp/utils.js +1 -1
- package/dist-lib/lib/tools/mcp-call.js +8 -8
- package/dist-lib/lib/tools/operations/builders.d.ts +1 -1
- package/dist-lib/lib/tools/operations/builders.js +1 -1
- package/dist-lib/lib/tools/operations/compile.js +1 -1
- package/dist-lib/lib/tools/operations/manifest.d.ts +16 -16
- package/dist-lib/lib/tools/operations/manifest.js +1 -1
- package/dist-lib/lib/tools/outbound-guard.js +1 -1
- package/dist-lib/lib/tools/rag-search.js +1 -1
- package/dist-lib/lib/tools/read-files.js +3 -3
- package/dist-lib/lib/tools/skill.js +8 -8
- package/dist-lib/lib/tools/skills/auth-resolver.js +2 -2
- package/dist-lib/lib/tools/skills/bin-check.js +1 -1
- package/dist-lib/lib/tools/skills/bundled-dir.js +2 -2
- package/dist-lib/lib/tools/skills/catalog.js +10 -10
- package/dist-lib/lib/tools/skills/cli-schema-check.js +1 -1
- package/dist-lib/lib/tools/skills/cli-schema-load.js +1 -1
- package/dist-lib/lib/tools/skills/cli-schema.js +4 -4
- package/dist-lib/lib/tools/skills/credential-check.js +3 -3
- package/dist-lib/lib/tools/skills/credential-grants.js +1 -1
- package/dist-lib/lib/tools/skills/credential-health.js +2 -2
- package/dist-lib/lib/tools/skills/frontmatter-parser.js +1 -1
- package/dist-lib/lib/tools/skills/index.js +5 -5
- package/dist-lib/lib/tools/skills/mention.js +1 -1
- package/dist-lib/lib/tools/skills/overlay-crud.js +1 -1
- package/dist-lib/lib/tools/skills/setup-routes.js +1 -1
- package/dist-lib/lib/tools/skills/skill-settings.js +1 -1
- package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +8 -8
- package/dist-lib/lib/tools/skills/skill-state.js +9 -9
- package/dist-lib/lib/tools/toolsets.d.ts +1 -1
- package/dist-lib/lib/tools/url-guard.js +2 -2
- package/dist-lib/lib/tools/weather-lookup/place.d.ts +11 -0
- package/dist-lib/lib/tools/weather-lookup/place.js +152 -0
- package/dist-lib/lib/tools/weather-lookup/report.d.ts +37 -0
- package/dist-lib/lib/tools/weather-lookup/report.js +56 -0
- package/dist-lib/lib/tools/weather-lookup.d.ts +8 -0
- package/dist-lib/lib/tools/weather-lookup.js +110 -0
- package/dist-lib/lib/tools/web-fetch.js +10 -10
- package/dist-lib/lib/tools/web-search.js +2 -2
- package/dist-lib/lib/transport.js +1 -1
- package/dist-lib/lib/validating-lookup.js +1 -1
- package/dist-lib/lib/web-fetch/embedded-state.js +1 -1
- package/dist-lib/lib/web-fetch/extract.js +1 -1
- package/dist-lib/lib/web-fetch/images.js +1 -1
- package/dist-lib/lib/web-fetch/video.js +1 -1
- package/dist-lib/lib/web-search/engine-registry.js +7 -7
- package/dist-lib/lib/web-search/engines/aol.js +3 -3
- package/dist-lib/lib/web-search/engines/bing.js +4 -4
- package/dist-lib/lib/web-search/engines/brave.js +2 -2
- package/dist-lib/lib/web-search/engines/duckduckgo.js +3 -3
- package/dist-lib/lib/web-search/engines/google.js +4 -4
- package/dist-lib/lib/web-search/engines/wikipedia.js +2 -2
- package/dist-lib/lib/web-search/engines/yahoo.js +3 -3
- package/dist-lib/lib/web-search/fetch-html.js +1 -1
- package/dist-lib/lib/web-search/merge-results.js +1 -1
- package/dist-lib/lib/web-search/orchestrator.js +3 -3
- package/dist-lib/lib/wire.js +28 -0
- package/dist-lib/schema/baseline.js +1 -1
- package/dist-lib/schema/build.js +3 -3
- package/dist-lib/schema/harness.js +5 -2
- package/dist-lib/schema/release-tags.d.ts +2 -1
- package/dist-lib/schema/release-tags.js +9 -7
- package/dist-lib/spec/hrpc/messages.js +22 -7
- package/dist-lib/spec/hyperschema/index.js +22 -7
- package/dist-lib/spec/hyperschema/schema.json +14 -1
- package/dist-lib/spec/hyperschema/types.d.ts +3 -2
- package/package.json +21 -8
- package/worker/harness-sidecar.mjs +2 -0
- package/.claude/skills/asana/SKILL.md +0 -86
- package/.claude/skills/gh-stack/SKILL.md +0 -181
- package/.claude/skills/gh-stack/references/commands.md +0 -177
- package/.claude/skills/gh-stack/references/stack-design.md +0 -97
- package/.claude/skills/gh-stack/references/troubleshooting.md +0 -159
- package/.claude/skills/js-house-style/SKILL.md +0 -671
- package/.claude/skills/kvcache/SKILL.md +0 -171
- package/.claude/skills/pr-create/SKILL.md +0 -180
- package/.claude/skills/pr-review/SKILL.md +0 -217
- package/CLAUDE.md +0 -39
- package/docs/decisions/2026-05-29-kvcache-tool-turns.md +0 -75
- package/docs/decisions/2026-06-02-kvcache-tool-turns-reenabled.md +0 -127
- package/docs/decisions/2026-06-23-android-cpu-llm-defaults.md +0 -126
- package/docs/decisions/2026-07-29-assistant-owned-storage-layout.md +0 -88
- package/docs/decisions/2026-08-04-sidecar-orphan-reaping.md +0 -79
- package/docs/decisions/2026-08-11-pyodide-worker-thread.md +0 -68
- package/docs/decisions/2026-08-17-harness-hook-pipeline.md +0 -84
- package/docs/decisions/2026-08-17-harness-outbound-egress-guard.md +0 -176
- package/docs/decisions/2026-08-20-chat-prompt-prefix-is-stable.md +0 -95
- package/docs/decisions/2026-08-20-kvcache-static-placement.md +0 -109
- package/docs/decisions/2026-08-21-vendored-python-wheels.md +0 -85
- package/docs/decisions/2026-08-26-exec-is-not-gated-by-skills.md +0 -64
- package/docs/decisions/2026-08-27-writable-skills-overlay.md +0 -56
- package/docs/decisions/2026-09-01-skill-operation-manifests.md +0 -53
- package/docs/decisions/2026-09-01-usage-breakdown-is-measured.md +0 -78
- package/docs/decisions/2026-09-03-usage-breakdown-reported-by-the-harness.md +0 -136
- package/docs/decisions/INDEX.md +0 -38
- package/docs/decisions/TEMPLATE.md +0 -32
- package/docs/kvcache-reference.md +0 -655
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import process from 'process';
|
|
2
|
-
import { capabilityProfileToModelName } from
|
|
3
|
-
import { probeWithAddon } from
|
|
4
|
-
import { mobileBudget, parseNvidiaSmiOutput, parseRocmSmiOutput, parseWindowsRegistryOutput, sharedRamBudget } from
|
|
2
|
+
import { capabilityProfileToModelName } from '../models/model-catalog.js';
|
|
3
|
+
import { probeWithAddon } from './gpu-probe-addon.js';
|
|
4
|
+
import { mobileBudget, parseNvidiaSmiOutput, parseRocmSmiOutput, parseWindowsRegistryOutput, sharedRamBudget } from './parsers.js';
|
|
5
5
|
const GIB = 1024 * 1024 * 1024;
|
|
6
6
|
const WINDOWS_REGISTRY_QUERY = "(Get-ItemProperty 'HKLM:\\SYSTEM\\ControlSet001\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}\\0*' -Name 'HardwareInformation.qwMemorySize' -ErrorAction SilentlyContinue).'HardwareInformation.qwMemorySize' | Sort-Object -Descending | Select-Object -First 1";
|
|
7
7
|
const SYSFS_VRAM_PATHS = [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { classifyGpu } from
|
|
3
|
-
import { IGPU_LIE_THRESHOLD, sharedRamBudget } from
|
|
2
|
+
import { classifyGpu } from './gpu-classify.js';
|
|
3
|
+
import { IGPU_LIE_THRESHOLD, sharedRamBudget } from './parsers.js';
|
|
4
4
|
const GpuDeviceSchema = z.object({
|
|
5
5
|
name: z.string(),
|
|
6
6
|
videoMemoryBytes: z.number()
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { runGpuProbeIfRequested } from
|
|
1
|
+
import { runGpuProbeIfRequested } from './gpu-probe.js';
|
|
2
2
|
runGpuProbeIfRequested();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { firstMarker } from 'asenion/guards';
|
|
2
2
|
import { holdback } from 'asenion/scan';
|
|
3
|
-
import { createJoinGuard } from
|
|
3
|
+
import { createJoinGuard } from './join-guard.js';
|
|
4
4
|
const MARKUP_OPENERS = ['<tool_call>', '<function=', '<tool_response>'];
|
|
5
5
|
const MARKUP_CLOSERS = {
|
|
6
6
|
'<tool_call>': '</tool_call>',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TOOL_CONTINUATION_NUDGE } from
|
|
1
|
+
import { TOOL_CONTINUATION_NUDGE } from '../capabilities/tool-turns.js';
|
|
2
2
|
export const DEGENERATE_ANSWER_FALLBACK = "I couldn't complete that step and don't have a useful result to share.";
|
|
3
3
|
export const ROUND_CAP_ANSWER = "I ran out of steps before I could finish that. Ask me to continue and I'll pick up where I left off.";
|
|
4
4
|
export const SEARCH_CAPPED_ANSWER = "I searched the web but couldn't find the answer in the results I got.";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const HOMEBREW_BIN_DIRS: readonly string[];
|
|
2
2
|
export declare function withHomebrewPath(path: string | undefined, platformName: string): string | undefined;
|
|
3
|
-
export declare const EXEC_ENV_ALLOWLIST: readonly [
|
|
3
|
+
export declare const EXEC_ENV_ALLOWLIST: readonly ['PATH', 'HOME', 'TMPDIR', 'TMP', 'TEMP', 'LANG', 'LC_ALL', 'LC_CTYPE', 'TZ', 'USER', 'LOGNAME', 'HTTP_PROXY', 'http_proxy', 'HTTPS_PROXY', 'https_proxy', 'ALL_PROXY', 'all_proxy', 'NO_PROXY', 'no_proxy', 'SSL_CERT_FILE', 'SSL_CERT_DIR', 'CURL_CA_BUNDLE', 'REQUESTS_CA_BUNDLE', 'NODE_EXTRA_CA_CERTS'];
|
|
4
4
|
export declare function execEnv(env: Readonly<Record<string, string | undefined>>, platformName: string): Record<string, string>;
|
|
5
5
|
export declare function spawnEnv(env: Readonly<Record<string, string | undefined>>, platformName: string, overrides?: Readonly<Record<string, string>>): Record<string, string>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { firstMarker } from 'asenion/guards';
|
|
2
2
|
import { holdback } from 'asenion/scan';
|
|
3
|
-
import { STOP_MARKERS } from
|
|
4
|
-
import { createJoinGuard } from
|
|
3
|
+
import { STOP_MARKERS } from './control-tokens.js';
|
|
4
|
+
import { createJoinGuard } from './join-guard.js';
|
|
5
5
|
const OPEN_TAGS = ['<think>', '<thinking>'];
|
|
6
6
|
const CLOSE_TAGS = ['</think>', '</thinking>'];
|
|
7
7
|
const ALL_TAGS = [...OPEN_TAGS, ...CLOSE_TAGS];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { stripControlTokens } from
|
|
1
|
+
import { stripControlTokens } from './control-tokens.js';
|
|
2
2
|
export const INTENT_PARAM = 'intent';
|
|
3
3
|
export const INTENT_PARAM_DESCRIPTION = 'One short sentence, addressed to the user, saying plainly what this call will ' +
|
|
4
4
|
'do for them — the outcome, never the code. It is the only thing the approval ' +
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { unwrap } from 'asenion';
|
|
2
|
-
import { SKILL_TOOL_NAME } from
|
|
3
|
-
import { unquoteArg } from
|
|
4
|
-
import { stripControlTokens } from
|
|
2
|
+
import { SKILL_TOOL_NAME } from '../capabilities/tool-names.js';
|
|
3
|
+
import { unquoteArg } from '../tools/model-args.js';
|
|
4
|
+
import { stripControlTokens } from './control-tokens.js';
|
|
5
5
|
const MAX_LABEL_WORDS = 6;
|
|
6
6
|
const MAX_LABEL_LENGTH = 60;
|
|
7
7
|
const MAX_DESCRIPTION_LENGTH = 200;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { mcpTargetUrl } from
|
|
2
|
-
import { checkOutboundHost } from
|
|
1
|
+
import { mcpTargetUrl } from '../../tools/mcp-call.js';
|
|
2
|
+
import { checkOutboundHost } from '../../tools/url-guard.js';
|
|
3
3
|
export class EgressGuardHook {
|
|
4
4
|
phase = 'preToolCall';
|
|
5
5
|
run(ctx) {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { ArgRepairHook } from
|
|
2
|
-
export { EgressGuardHook } from
|
|
3
|
-
export { SkillCatalogGuardHook } from
|
|
1
|
+
export { ArgRepairHook } from './arg-repair.js';
|
|
2
|
+
export { EgressGuardHook } from './egress.js';
|
|
3
|
+
export { SkillCatalogGuardHook } from './skill-catalog.js';
|
|
@@ -2,7 +2,7 @@ import type { SkillCatalogEntry } from '../../tools/skills/catalog.ts';
|
|
|
2
2
|
import type { HarnessHook, HookContext, HookResult } from '../types.ts';
|
|
3
3
|
type SkillCatalogInput = readonly SkillCatalogEntry[] | (() => readonly SkillCatalogEntry[] | readonly string[]);
|
|
4
4
|
export declare class SkillCatalogGuardHook implements HarnessHook {
|
|
5
|
-
readonly phase:
|
|
5
|
+
readonly phase: 'preToolCall';
|
|
6
6
|
private readonly _catalog;
|
|
7
7
|
constructor(catalog?: SkillCatalogInput);
|
|
8
8
|
run(ctx: HookContext): HookResult;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { hlog } from
|
|
2
|
-
import { normalizeToolExecutionOutcome } from
|
|
3
|
-
import { harnessHooks } from
|
|
4
|
-
import { runHooks } from
|
|
1
|
+
import { hlog } from '../log.js';
|
|
2
|
+
import { normalizeToolExecutionOutcome } from '../helpers/run-outcome.js';
|
|
3
|
+
import { harnessHooks } from './registry.js';
|
|
4
|
+
import { runHooks } from './run.js';
|
|
5
5
|
export class HookPipeline {
|
|
6
6
|
_behaviorHooks;
|
|
7
7
|
constructor(hooks = harnessHooks) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AUDIOGEN_ACESTEP_5HZ_LM_0_6B_Q8_0, AUDIOGEN_ACESTEP_V15_SFT_Q8_0, AUDIOGEN_ACESTEP_V15_TURBO_Q4_K_M, AUDIOGEN_ACESTEP_V15_TURBO_Q8_0, AUDIOGEN_QWEN3_EMBEDDING_0_6B_Q8_0, AUDIOGEN_VAE_BF16, EMBEDDINGGEMMA_300M_Q4_0, FLUX_2_KLEIN_4B_Q4_0, FLUX_2_KLEIN_4B_VAE, HEALTHCARE_1_7B_MEDICAL_Q4_K_M, HEALTHCARE_4B_MEDICAL_Q4_K_M, MMPROJ_QWEN3_5_2B_MULTIMODAL_Q8_0, MMPROJ_QWEN3_5_4B_MULTIMODAL_Q8_0, MMPROJ_QWEN3_5_9B_MULTIMODAL_F16, MMPROJ_QWEN3_6_27B_MULTIMODAL_F16, MMPROJ_QWEN3_6_35B_A3B_MULTIMODAL_F16, MMPROJ_QWEN3_8_27B_MULTIMODAL_F16, QWEN3_5_2B_MULTIMODAL_Q4_K_M, QWEN3_5_4B_MULTIMODAL_Q4_K_M, QWEN3_5_9B_MULTIMODAL_Q4_K_M, PARAKEET_TDT_0_6B_V3_Q8_0, QWEN3_4B_Q4_K_M, QWEN3_6_27B_MULTIMODAL_Q4_K_XL, QWEN3_6_35B_A3B_MULTIMODAL_Q4_K_M, QWEN3_8_27B_MULTIMODAL_UD_Q4_K_XL, SD_V2_1_1B_Q8_0, SDXL_BASE_1_0_3B_Q4_0, TTS_MULTILINGUAL_SUPERTONIC3_Q4_0, TTS_MULTILINGUAL_SUPERTONIC3_Q8_0 } from '@qvac/sdk/models';
|
|
2
|
-
import { detectToolDialect } from
|
|
3
|
-
import { defaultTtsModelName } from
|
|
4
|
-
import { CAPABILITY_PROFILE_ORDER, QWEN_35_2B, QWEN_35_4B, QWEN_35_9B, QWEN_36_27B, QWEN_36_35B_A3B, QWEN_38_27B, MEDPSY_1_7B, MEDPSY_4B, isCapabilityProfile, meetsMinCapabilityProfile, modelNameToCapabilityProfile, capabilityProfileToModelName, isMultimodalLlm, AGENT_MODEL_NAMES, modelDisplayName, capabilityProfileModelLabel, DEFAULT_IMAGE_MODEL_CHOICE, IMAGE_CHOICE_CATALOG } from
|
|
2
|
+
import { detectToolDialect } from './tool-dialect.js';
|
|
3
|
+
import { defaultTtsModelName } from './tts-model-default.js';
|
|
4
|
+
import { CAPABILITY_PROFILE_ORDER, QWEN_35_2B, QWEN_35_4B, QWEN_35_9B, QWEN_36_27B, QWEN_36_35B_A3B, QWEN_38_27B, MEDPSY_1_7B, MEDPSY_4B, isCapabilityProfile, meetsMinCapabilityProfile, modelNameToCapabilityProfile, capabilityProfileToModelName, isMultimodalLlm, AGENT_MODEL_NAMES, modelDisplayName, capabilityProfileModelLabel, DEFAULT_IMAGE_MODEL_CHOICE, IMAGE_CHOICE_CATALOG } from './model-catalog-constants.js';
|
|
5
5
|
export { CAPABILITY_PROFILE_ORDER, QWEN_35_2B, QWEN_35_4B, QWEN_35_9B, QWEN_36_27B, QWEN_36_35B_A3B, QWEN_38_27B, MEDPSY_1_7B, MEDPSY_4B, isCapabilityProfile, meetsMinCapabilityProfile, modelNameToCapabilityProfile, capabilityProfileToModelName, isMultimodalLlm, AGENT_MODEL_NAMES, modelDisplayName, capabilityProfileModelLabel, DEFAULT_IMAGE_MODEL_CHOICE, IMAGE_CHOICE_CATALOG };
|
|
6
6
|
export const LLM_CATALOG = [
|
|
7
7
|
{
|
|
@@ -153,7 +153,7 @@ export function diffusionDownloadMetadata(model, addon) {
|
|
|
153
153
|
assetSizes
|
|
154
154
|
};
|
|
155
155
|
}
|
|
156
|
-
import { DEFAULT_MUSIC_MODEL_CHOICE } from
|
|
156
|
+
import { DEFAULT_MUSIC_MODEL_CHOICE } from './music-catalog.js';
|
|
157
157
|
export { DEFAULT_MUSIC_MODEL_CHOICE };
|
|
158
158
|
const MUSIC_GENERATION_SKILL = 'music-generation';
|
|
159
159
|
export const AUDIOGEN_CATALOG = [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
import { curatedListables, musicListables } from
|
|
2
|
+
import { curatedListables, musicListables } from './model-catalog.js';
|
|
3
3
|
export function summarizeDelete(result) {
|
|
4
4
|
return { name: result.name, removed: result.removed.length, freedBytes: result.freedBytes };
|
|
5
5
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { companionRegistryPaths, curatedListables, musicListables } from
|
|
1
|
+
import { companionRegistryPaths, curatedListables, musicListables } from './model-catalog.js';
|
|
2
2
|
export const MODEL_STATUS_TTL_MS = 30_000;
|
|
3
3
|
export function createModelStatusCache() {
|
|
4
4
|
return { entries: new Map(), epoch: 0 };
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import process from 'process';
|
|
2
|
-
import { transferProgress } from
|
|
2
|
+
import { transferProgress } from '../model-download-progress.js';
|
|
3
3
|
import ResourcePuddle from 'resource-puddle';
|
|
4
|
-
import { ModelHandle } from
|
|
5
|
-
import { defaultContextSize } from
|
|
6
|
-
import { adrenoSafeKvCache } from
|
|
7
|
-
import { DEFAULT_EMBED_BATCH_SIZE } from
|
|
8
|
-
import { hlog } from
|
|
9
|
-
import { RUNAWAY_STOP_SEQUENCES } from
|
|
10
|
-
import { resolveModelSrc } from
|
|
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
|
|
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 [
|
|
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
|
|
5
|
-
import { makeValidatingLookup } from
|
|
6
|
-
import { runNoRedirectFetch } from
|
|
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
|
|
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
|
|
5
|
-
import { runNoRedirectFetch } from
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import { retryMemo } from
|
|
2
|
-
import { hlog } from
|
|
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
|
|
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 = {}) {
|
package/dist-lib/lib/serve.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { AbortController } from 'bare-abort-controller';
|
|
2
2
|
import fs from 'fs';
|
|
3
|
-
import { settleOnClose } from
|
|
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
|
|
8
|
-
import { errorMessage } from
|
|
9
|
-
import { hlog } from
|
|
10
|
-
import { pushQueue } from
|
|
11
|
-
import { TextCoalescer } from
|
|
12
|
-
import { prepareOpenclCache } from
|
|
13
|
-
import { stageFile, sweepStaging } from
|
|
14
|
-
import { readSetup } from
|
|
15
|
-
import { packVectors, toDownloadWire, toWire } from
|
|
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',
|
|
@@ -414,6 +414,7 @@ function completion(harness) {
|
|
|
414
414
|
thinkingDefault: frame.thinkingDefault ?? undefined,
|
|
415
415
|
generationParams: frame.generationParams ?? undefined,
|
|
416
416
|
responseFormat: frame.responseFormat ?? undefined,
|
|
417
|
+
captureInferenceCalls: frame.captureInferenceCalls ?? undefined,
|
|
417
418
|
messages: (frame.messages ?? []).map(({ role, content, attachments }) => ({
|
|
418
419
|
role,
|
|
419
420
|
content,
|
package/dist-lib/lib/spawn.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import stowChild, {} from 'bare-supervisor/stow';
|
|
2
|
-
import { connectHarness } from
|
|
3
|
-
import { setHarnessLog } from
|
|
4
|
-
import { createEmbedConfig } from
|
|
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);
|
package/dist-lib/lib/staging.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import { userTmpPath } from
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import { canonicalDenyRoots, defaultRealpath, resolveKey } from
|
|
2
|
-
import { writeText } from
|
|
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
|
|
3
|
-
import { writeText } from
|
|
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
|
|
4
|
-
import { BUSY_ERROR, DIM_STEP, effectiveSteps, generationPercentTick, IMAGE_LOAD_STALL_ERROR, normalizeClamps, parseCommonArgs, runDiffusion } from
|
|
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
|
|
4
|
-
import { checkOutputBytes, MAX_INPUT_TOTAL_BYTES, RUN_OUTPUT_BUDGET_BYTES } from
|
|
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
|
|
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
|
|
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
|
|
2
|
-
import { MAX_OUTPUT_FILE_BYTES, MAX_OUTPUT_TOTAL_BYTES } from
|
|
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
|
|
4
|
-
import { hlog } from
|
|
5
|
-
import { MAX_OUTPUT_CHARS } from
|
|
6
|
-
import { defaultLoad, pyodideLoadOptions } from
|
|
7
|
-
import { isPyodideFatal, performRun } from
|
|
8
|
-
import { runPythonInWorker } from
|
|
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;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import b4a from 'b4a';
|
|
2
|
-
import { attachOutputs, stageInputs } from
|
|
3
|
-
import { checkFileName, checkOutputName, MAX_INPUTS, MAX_OUTPUTS } from
|
|
4
|
-
import { runPython } from
|
|
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
|
|
2
|
-
import { hlog } from
|
|
3
|
-
import { TRUNCATED_OUTPUT_SUFFIX } from
|
|
4
|
-
import { collectOutputs, openScratch, stageInputFiles } from
|
|
5
|
-
import { planVendoredInstall, stageVendoredWheels } from
|
|
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
|
|
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({
|
|
@@ -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
|
|
5
|
-
import { harnessLogEnabled, hlog } from
|
|
6
|
-
import { asWorkerMessage, fromWireResult } from
|
|
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);
|
|
@@ -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
|
|
11
|
-
import { defaultLoad } from
|
|
12
|
-
import { performRun } from
|
|
13
|
-
import { asHostMessage, toWireResult } from
|
|
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,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
|
|
5
|
-
import { expandObsidianPath, firstExistingPath, OBSIDIAN_BIN_CANDIDATES } from
|
|
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
|
|
2
|
-
import { isObsidianRunning, launchObsidianApp, obsidianPathEnv } from
|
|
3
|
-
import { OBSIDIAN_CLI_FAILURE_GUIDANCE } from
|
|
4
|
-
import { cleanObsidianOutput } from
|
|
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;
|