@caupulican/pi-adaptative 0.85.0 → 0.85.4
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/CHANGELOG.md +54 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/arithmetic.py +364 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +2 -1
- package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +16 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +137 -14
- package/dist/bundled-resources/runtimes/pi-shell-engine/nodes.py +23 -2
- package/dist/bundled-resources/runtimes/pi-shell-engine/parser.py +134 -6
- package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +25 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +6 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -87
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js +3 -0
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +2 -0
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +4 -3
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +4 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +2 -0
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +12 -7
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +55 -19
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/bedrock-scope.d.ts +26 -0
- package/dist/core/bedrock-scope.d.ts.map +1 -0
- package/dist/core/bedrock-scope.js +178 -0
- package/dist/core/bedrock-scope.js.map +1 -0
- package/dist/core/compaction-controller.d.ts +2 -0
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +35 -13
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +6 -0
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +3 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/failure-corpus.d.ts +26 -1
- package/dist/core/failure-corpus.d.ts.map +1 -1
- package/dist/core/failure-corpus.js +17 -0
- package/dist/core/failure-corpus.js.map +1 -1
- package/dist/core/foreground-recovery-controller.d.ts +25 -2
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
- package/dist/core/foreground-recovery-controller.js +111 -2
- package/dist/core/foreground-recovery-controller.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +27 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -0
- package/dist/core/foreground-terminal-handoff-controller.js +56 -0
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -0
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +5 -0
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.d.ts +3 -0
- package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js +28 -7
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
- package/dist/core/human-input-controller.d.ts +9 -0
- package/dist/core/human-input-controller.d.ts.map +1 -1
- package/dist/core/human-input-controller.js +60 -5
- package/dist/core/human-input-controller.js.map +1 -1
- package/dist/core/human-input.d.ts +12 -0
- package/dist/core/human-input.d.ts.map +1 -1
- package/dist/core/human-input.js +59 -12
- package/dist/core/human-input.js.map +1 -1
- package/dist/core/local-runtime-controller.d.ts.map +1 -1
- package/dist/core/local-runtime-controller.js +15 -9
- package/dist/core/local-runtime-controller.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts +1 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +252 -125
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/model-capability.d.ts +15 -1
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +24 -1
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +18 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +6 -6
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +5 -5
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts +3 -2
- package/dist/core/model-tool-protocol.d.ts.map +1 -1
- package/dist/core/model-tool-protocol.js +5 -1
- package/dist/core/model-tool-protocol.js.map +1 -1
- package/dist/core/models/context-sizing.d.ts +1 -0
- package/dist/core/models/context-sizing.d.ts.map +1 -1
- package/dist/core/models/context-sizing.js +4 -1
- package/dist/core/models/context-sizing.js.map +1 -1
- package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
- package/dist/core/models/default-model-suggestions.js +20 -10
- package/dist/core/models/default-model-suggestions.js.map +1 -1
- package/dist/core/models/llamacpp-runtime.d.ts +32 -11
- package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
- package/dist/core/models/llamacpp-runtime.js +79 -28
- package/dist/core/models/llamacpp-runtime.js.map +1 -1
- package/dist/core/models/local-execution-planner.d.ts +24 -0
- package/dist/core/models/local-execution-planner.d.ts.map +1 -0
- package/dist/core/models/local-execution-planner.js +119 -0
- package/dist/core/models/local-execution-planner.js.map +1 -0
- package/dist/core/models/local-inference-profile.d.ts +34 -0
- package/dist/core/models/local-inference-profile.d.ts.map +1 -0
- package/dist/core/models/local-inference-profile.js +74 -0
- package/dist/core/models/local-inference-profile.js.map +1 -0
- package/dist/core/models/local-runtime.d.ts +23 -4
- package/dist/core/models/local-runtime.d.ts.map +1 -1
- package/dist/core/models/local-runtime.js +11 -8
- package/dist/core/models/local-runtime.js.map +1 -1
- package/dist/core/models/managed-ollama-model.d.ts +26 -0
- package/dist/core/models/managed-ollama-model.d.ts.map +1 -0
- package/dist/core/models/managed-ollama-model.js +59 -0
- package/dist/core/models/managed-ollama-model.js.map +1 -0
- package/dist/core/models/model-ref.js +11 -11
- package/dist/core/models/model-ref.js.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts +10 -20
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.js +11 -31
- package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
- package/dist/core/models/prism-llamacpp-server-probe.d.ts +10 -0
- package/dist/core/models/prism-llamacpp-server-probe.d.ts.map +1 -0
- package/dist/core/models/prism-llamacpp-server-probe.js +36 -0
- package/dist/core/models/prism-llamacpp-server-probe.js.map +1 -0
- package/dist/core/models/runtime-arbiter.d.ts +3 -0
- package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
- package/dist/core/models/runtime-arbiter.js +2 -1
- package/dist/core/models/runtime-arbiter.js.map +1 -1
- package/dist/core/models/runtime-process.d.ts +7 -1
- package/dist/core/models/runtime-process.d.ts.map +1 -1
- package/dist/core/models/runtime-process.js +4 -2
- package/dist/core/models/runtime-process.js.map +1 -1
- package/dist/core/process-matrix/runtime.js +43 -11
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +14 -5
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +18 -6
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +5 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +37 -4
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/scout-controller.d.ts +3 -2
- package/dist/core/scout-controller.d.ts.map +1 -1
- package/dist/core/scout-controller.js +1 -0
- package/dist/core/scout-controller.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +10 -8
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +59 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +5 -2
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +22 -10
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts +3 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +181 -55
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-protocol-controller.d.ts.map +1 -1
- package/dist/core/tool-protocol-controller.js +5 -3
- package/dist/core/tool-protocol-controller.js.map +1 -1
- package/dist/core/tool-recovery-log-records.d.ts +33 -1
- package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
- package/dist/core/tool-recovery-log-records.js +59 -12
- package/dist/core/tool-recovery-log-records.js.map +1 -1
- package/dist/core/tool-recovery-logger.d.ts +12 -1
- package/dist/core/tool-recovery-logger.d.ts.map +1 -1
- package/dist/core/tool-recovery-logger.js +24 -1
- package/dist/core/tool-recovery-logger.js.map +1 -1
- package/dist/core/tool-repair-health.d.ts.map +1 -1
- package/dist/core/tool-repair-health.js +6 -0
- package/dist/core/tool-repair-health.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +2 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +9 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +5 -8
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +88 -55
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-intent.d.ts +42 -15
- package/dist/core/tools/file-mutation-intent.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-intent.js +271 -77
- package/dist/core/tools/file-mutation-intent.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +2 -6
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +2 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +2 -6
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/managed-search-tool.d.ts +8 -0
- package/dist/core/tools/managed-search-tool.d.ts.map +1 -0
- package/dist/core/tools/managed-search-tool.js +10 -0
- package/dist/core/tools/managed-search-tool.js.map +1 -0
- package/dist/core/tools/shell-command-parser.d.ts +4 -3
- package/dist/core/tools/shell-command-parser.d.ts.map +1 -1
- package/dist/core/tools/shell-command-parser.js +32 -7
- package/dist/core/tools/shell-command-parser.js.map +1 -1
- package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
- package/dist/core/tools/shell-contract-router.js +23 -1
- package/dist/core/tools/shell-contract-router.js.map +1 -1
- package/dist/core/tools/windows-shell-engine.js +1 -1
- package/dist/core/tools/windows-shell-engine.js.map +1 -1
- package/dist/core/tools/write.d.ts +5 -10
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +92 -73
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.d.ts +6 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +59 -12
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
- package/dist/modes/interactive/local-model-commands.js +51 -8
- package/dist/modes/interactive/local-model-commands.js.map +1 -1
- package/dist/utils/paths.js +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +18 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +73 -43
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/models.md +1 -1
- package/docs/providers.md +34 -10
- package/docs/settings.md +1 -1
- package/docs/tool-boundary-performance-roadmap-2026-08-02.md +21 -18
- package/docs/tool-repair.md +3 -3
- package/docs/windows.md +7 -5
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/prompt-customizer.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/ssh.ts +17 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +240 -260
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-model-suggestions.js","sourceRoot":"","sources":["../../../src/core/models/default-model-suggestions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FitnessRole } from \"../../modes/interactive/components/fitness-role-selector.ts\";\n\n/**\n * Curated local-model suggestions: a starting roster validated during pi-adaptative's own\n * small-model research so a user does not have to know WHICH model fits WHICH role. Each entry is\n * an install ref (accepted by /models add) plus the role it was validated for and whether it can use\n * tools. Native tool-calling remains preferred when it works; text-protocol models are listed only\n * when their runtime is pi-managed and the fitness/probe path can calibrate that fallback.\n *\n * Honesty: these are SUGGESTIONS, not guarantees. Fitness is a property of the model AND the host\n * hardware, so no per-model score is baked in here — `/models add` auto-probes on the actual\n * machine, and the roster only encodes what role each model was SHAPED for. `assignRole` is the\n * /fitness role the suggestion maps to (undefined = no single-setting slot yet; use it as a\n * research/worker lane model).\n */\n\nexport interface ModelSuggestion {\n\t/** Display name in the suggestions list. */\n\tname: string;\n\t/** Ref accepted by /models add and the source normalizer. */\n\tpullRef: string;\n\t/** Role this model was validated/shaped for. */\n\trole: string;\n\t/** True if the model can use tools after host-local probing/calibration (required for executor). */\n\ttoolCalling: boolean;\n\t/** The /fitness assignment target this suggestion maps to, when there is a single-setting slot. */\n\tassignRole?: FitnessRole;\n\t/** One-line rationale from the validation work; never a fabricated numeric score. */\n\trationale: string;\n\t/** Optional caveat (quant selection, RAM needs). */\n\tnote?: string;\n}\n\nexport const DEFAULT_MODEL_SUGGESTIONS: readonly ModelSuggestion[] = [\n\t{\n\t\tname: \"qwen3:1.7b\",\n\t\tpullRef: \"qwen3:1.7b\",\n\t\trole: \"Toolkit executor / reflex muscle\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"executor\",\n\t\trationale:\n\t\t\t\"Validated as the executor: reliable native tool-calling and low latency, so direct toolkit commands run without retries.\",\n\t},\n\t{\n\t\tname: \"qwen3:0.6b\",\n\t\tpullRef: \"qwen3:0.6b\",\n\t\trole: \"Minimal executor (fastest)\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"executor\",\n\t\trationale:\n\t\t\t\"Fastest local option; on harder requests it can narrate without executing, so prefer it only when speed dominates and requests are simple.\",\n\t},\n\t{\n\t\tname: \"MiniCPM5-1B (full-base)\",\n\t\tpullRef: \"hf.co/openbmb/MiniCPM5-1B\",\n\t\trole: \"Full-base Transformers executor / tiny local muscle\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"executor\",\n\t\trationale:\n\t\t\t\"Full-base Hugging Face MiniCPM5-1B target: pi installs an isolated Transformers runtime and probes native tool-calling first, then calibrates the text protocol only if native tool calls do not work.\",\n\t\tnote: \"Not GGUF/quantized: weights and Python deps land under pi-owned runtime/cache directories, separate from Ollama and system Python.\",\n\t},\n\t{\n\t\tname: \"FastContext-1.0-4B\",\n\t\tpullRef: \"hf.co/KikoCis/FastContext-1.0-4B-longctx-imatrix-GGUF:fastcontext4b.Q4_K_M.imx.gguf\",\n\t\trole: \"Repository scout (context_scout)\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"scout\",\n\t\trationale:\n\t\t\t\"The model the context_scout lane is built around (Plan 9): 4B Qwen3, 256K context, trained for read-only repo exploration returning file:line citations. /fitness must pass the tool-calls + research lanes before assignment.\",\n\t\tnote: \"Q4 ≈ 2.5 GB; ~5-6 GB peak with 32-64K KV. Qwen3 template caveat: if tool calls fail the probe, use the Modelfile recipe in docs/scout.md.\",\n\t},\n\t{\n\t\tname: \"Ornith-1.0-9B\",\n\t\tpullRef: \"hf.co/deepreinforce-ai/Ornith-1.0-9B-GGUF:Q4_K_M\",\n\t\trole: \"Agentic-coding worker / router cheap tier\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"router-cheap\",\n\t\trationale:\n\t\t\t\"External candidate (not from pi's own validation research): MIT, Qwen 3.5 base, RL-trained for agentic coding with native tool-calling — the strongest local worker SHAPE in the roster. /fitness on your hardware is the validator.\",\n\t\tnote: \"Q4_K_M ≈ 5.6 GB weights, ~7-8 GB peak with KV — on a 10 GB box run it as the ONLY local model. Qwen 3.5 arch: confirm pi's pinned Ollama supports it and probe tool-calls with /fitness before assigning (template derives from the GGUF). Larger boxes: consider router-medium after a passed worker lane.\",\n\t},\n\t{\n\t\tname: \"Bonsai-4B (GGUF Q1_0)\",\n\t\tpullRef: \"hf.co/prism-ml/Bonsai-4B-gguf:Q1_0\",\n\t\trole: \"Context curator / reflex brain / lighter lane analyst\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"curator\",\n\t\trationale:\n\t\t\t\"Lighter Bonsai lane model for context curation and structured local analysis; the exact Q1_0 artifact keeps /models suggest one-step.\",\n\t\tnote: \"Recommended when Bonsai-8B is too heavy. Pi pulls this exact GGUF through managed Ollama, probes /fitness on the host, then offers the curator role.\",\n\t},\n\t{\n\t\tname: \"Bonsai-27B (1-bit + vision)\",\n\t\tpullRef: \"hf.co/prism-ml/Bonsai-27B-gguf:Q1_0\",\n\t\trole: \"Context curator / reflex brain / vision-capable lane analyst\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"curator\",\n\t\trationale:\n\t\t\t\"External 1-bit 27B, binary weights, 262K-class context, vision via mmproj; served by pi through prism-ml's llama.cpp build (stock llama.cpp/Ollama cannot serve these weights). /fitness on your hardware is the validator — never pre-claim tool-calling.\",\n\t\tnote: \"~3.8 GB weights + 629 MB vision projector + a one-time llama-server runtime download; CPU-served on GPU-less hosts. Pi installs the pinned prism llama.cpp runtime, downloads both files, starts llama-server, and registers the model in one step. Provider-recommended sampling is temp 0.7 / top-p 0.95 / top-k 20; models.json has no per-model default-sampling field yet, so pi cannot wire this — set it per-request/session if your workflow needs it.\",\n\t},\n\t{\n\t\tname: \"Ternary-Bonsai-1.7B\",\n\t\tpullRef: \"hf.co/prism-ml/Ternary-Bonsai-1.7B-gguf\",\n\t\trole: \"Search scout (heavy-lifter)\",\n\t\ttoolCalling: false,\n\t\trationale:\n\t\t\t\"Ternary weights, very fast; strong at structured search plans. No tool-calling template — use it as a research/worker lane model, never an executor.\",\n\t\tnote: \"Pick a GGUF quant the runtime accepts (e.g. :Q8_0). The ternary Q2_0 build needs prism-ml's patched llama.cpp.\",\n\t},\n\t{\n\t\tname: \"Ternary-Bonsai-4B\",\n\t\tpullRef: \"hf.co/prism-ml/Ternary-Bonsai-4B-gguf\",\n\t\trole: \"Context curator / reflex brain / lane analyst\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"curator\",\n\t\trationale:\n\t\t\t\"Validated as the 'brain': strict-JSON interpretation and faithful digests. Drives context curation and the toolkit reflex interpreter. Not a tool-caller.\",\n\t\tnote: \"Pick a GGUF quant the runtime accepts (e.g. :Q8_0).\",\n\t},\n\t{\n\t\tname: \"Ternary-Bonsai-8B\",\n\t\tpullRef: \"hf.co/prism-ml/Ternary-Bonsai-8B-gguf\",\n\t\trole: \"Routing judge (larger machines)\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"judge\",\n\t\trationale:\n\t\t\t\"A judge candidate for machines with more headroom — too slow on ~16GB-class hardware in this research, kept for a bigger box.\",\n\t\tnote: \"Heavy: confirm tok/s with /fitness before committing. Ternary quant may need prism-ml's patched llama.cpp.\",\n\t},\n\t{\n\t\tname: \"needle (function-call tester, 26M)\",\n\t\tpullRef: \"hf.co/Cactus-Compute/needle\",\n\t\trole: \"Standalone function-call test bench (not a chat/lane model)\",\n\t\ttoolCalling: false,\n\t\trationale:\n\t\t\t\"NOT a pi chat model, executor, or lane model — needle is a 26M-parameter single-shot function-call SPECIALIST invoked one query at a time through its own `needle run` CLI, useful only as a standalone bench for probing tool-call behavior in isolation. No OpenAI-compatible endpoint, no chat lanes, no models.json registration, and no /fitness probe: use /models needle <query> [tools-json] to test it directly instead.\",\n\t\tnote: \"Upstream weights (needle.pkl) are pickle-only — arbitrary code execution on load by construction, not something pi's pinned-sha256 verification makes safe in the abstract, only tamper-evident.\",\n\t},\n];\n\n/** Bounded plain-text roster for `/models suggest` and the empty-store hint. */\nexport function formatModelSuggestions(suggestions: readonly ModelSuggestion[] = DEFAULT_MODEL_SUGGESTIONS): string[] {\n\tconst lines = [\n\t\t\"Suggested local models (validated roles from pi's own small-model research; probe on YOUR hardware with /fitness):\",\n\t];\n\tfor (const suggestion of suggestions) {\n\t\tlines.push(\n\t\t\t` - ${suggestion.name} → ${suggestion.role}${suggestion.toolCalling ? \"\" : \" [no tool-calling]\"}`,\n\t\t\t` /models add ${suggestion.pullRef}`,\n\t\t\t` ${suggestion.rationale}`,\n\t\t);\n\t\tif (suggestion.note) lines.push(` note: ${suggestion.note}`);\n\t}\n\tlines.push(\"Add one with /models add <ref> — pi pulls it, probes it, and offers a role in one step.\");\n\treturn lines;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"default-model-suggestions.js","sourceRoot":"","sources":["../../../src/core/models/default-model-suggestions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAiCjE,MAAM,CAAC,MAAM,yBAAyB,GAA+B;IACpE;QACC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,kCAAkC;QACxC,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,UAAU;QACtB,SAAS,EACR,0HAA0H;KAC3H;IACD;QACC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,UAAU;QACtB,SAAS,EACR,4IAA4I;KAC7I;IACD;QACC,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,qDAAqD;QAC3D,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,UAAU;QACtB,SAAS,EACR,wMAAwM;QACzM,IAAI,EAAE,oIAAoI;KAC1I;IACD;QACC,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,qFAAqF;QAC9F,IAAI,EAAE,kCAAkC;QACxC,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,OAAO;QACnB,SAAS,EACR,gOAAgO;QACjO,IAAI,EAAE,2IAA2I;KACjJ;IACD;QACC,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,oBAAoB;QAC7B,IAAI,EAAE,2CAA2C;QACjD,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,cAAc;QAC1B,SAAS,EACR,sOAAsO;QACvO,IAAI,EAAE,6QAA6Q;KACnR;IACD;QACC,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,4CAA4C;QAClD,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,cAAc;QAC1B,SAAS,EACR,kPAAkP;QACnP,IAAI,EAAE,+MAA+M;KACrN;IACD;QACC,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,uDAAuD;QAC7D,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,SAAS;QACrB,SAAS,EACR,uIAAuI;QACxI,IAAI,EAAE,gLAAgL;KACtL;IACD;QACC,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EAAE,8DAA8D;QACpE,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,SAAS;QACrB,SAAS,EACR,uQAAuQ;QACxQ,IAAI,EAAE,gcAAgc;KACtc;IACD;QACC,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,8CAA8C;QACvD,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,KAAK;QAClB,SAAS,EACR,sJAAsJ;QACvJ,IAAI,EAAE,yIAAyI;KAC/I;IACD;QACC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,4CAA4C;QACrD,IAAI,EAAE,+CAA+C;QACrD,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,SAAS;QACrB,SAAS,EACR,2JAA2J;QAC5J,IAAI,EAAE,yFAAyF;KAC/F;IACD;QACC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,4CAA4C;QACrD,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,OAAO;QACnB,SAAS,EACR,+HAA+H;QAChI,IAAI,EAAE,wHAAwH;KAC9H;IACD;QACC,IAAI,EAAE,oCAAoC;QAC1C,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,6DAA6D;QACnE,WAAW,EAAE,KAAK;QAClB,SAAS,EACR,maAAma;QACpa,IAAI,EAAE,kMAAkM;KACxM;CACD,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,WAAW,GAA+B,yBAAyB;IACzG,MAAM,KAAK,GAAG;QACb,oHAAoH;KACpH,CAAC;IACF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CACT,OAAO,UAAU,CAAC,IAAI,MAAM,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAClG,qBAAqB,UAAU,CAAC,OAAO,EAAE,EACzC,SAAS,UAAU,CAAC,SAAS,EAAE,CAC/B,CAAC;QACF,IAAI,UAAU,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IACtG,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import type { FitnessRole } from \"../../modes/interactive/components/fitness-role-selector.ts\";\nimport { ORNITH_9B_OLLAMA_REF } from \"./managed-ollama-model.ts\";\n\n/**\n * Curated local-model suggestions: a starting roster validated during pi-adaptative's own\n * small-model research so a user does not have to know WHICH model fits WHICH role. Each entry is\n * an install ref (accepted by /models add) plus the role it was validated for and whether it can use\n * tools. Native tool-calling remains preferred when it works; text-protocol models are listed only\n * when their runtime is pi-managed and the fitness/probe path can calibrate that fallback.\n *\n * Honesty: these are SUGGESTIONS, not guarantees. Fitness is a property of the model AND the host\n * hardware, so no per-model score is baked in here — `/models add` auto-probes on the actual\n * machine, and the roster only encodes what role each model was SHAPED for. `assignRole` is the\n * /fitness role the suggestion maps to (undefined = no single-setting slot yet; use it as a\n * research/worker lane model).\n */\n\nexport interface ModelSuggestion {\n\t/** Display name in the suggestions list. */\n\tname: string;\n\t/** Ref accepted by /models add and the source normalizer. */\n\tpullRef: string;\n\t/** Role this model was validated/shaped for. */\n\trole: string;\n\t/** True if the model can use tools after host-local probing/calibration (required for executor). */\n\ttoolCalling: boolean;\n\t/** The /fitness assignment target this suggestion maps to, when there is a single-setting slot. */\n\tassignRole?: FitnessRole;\n\t/** One-line rationale from the validation work; never a fabricated numeric score. */\n\trationale: string;\n\t/** Optional caveat (quant selection, RAM needs). */\n\tnote?: string;\n}\n\nexport const DEFAULT_MODEL_SUGGESTIONS: readonly ModelSuggestion[] = [\n\t{\n\t\tname: \"qwen3:1.7b\",\n\t\tpullRef: \"qwen3:1.7b\",\n\t\trole: \"Toolkit executor / reflex muscle\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"executor\",\n\t\trationale:\n\t\t\t\"Validated as the executor: reliable native tool-calling and low latency, so direct toolkit commands run without retries.\",\n\t},\n\t{\n\t\tname: \"qwen3:0.6b\",\n\t\tpullRef: \"qwen3:0.6b\",\n\t\trole: \"Minimal executor (fastest)\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"executor\",\n\t\trationale:\n\t\t\t\"Fastest local option; on harder requests it can narrate without executing, so prefer it only when speed dominates and requests are simple.\",\n\t},\n\t{\n\t\tname: \"MiniCPM5-1B (full-base)\",\n\t\tpullRef: \"hf.co/openbmb/MiniCPM5-1B\",\n\t\trole: \"Full-base Transformers executor / tiny local muscle\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"executor\",\n\t\trationale:\n\t\t\t\"Full-base Hugging Face MiniCPM5-1B target: pi installs an isolated Transformers runtime and probes native tool-calling first, then calibrates the text protocol only if native tool calls do not work.\",\n\t\tnote: \"Not GGUF/quantized: weights and Python deps land under pi-owned runtime/cache directories, separate from Ollama and system Python.\",\n\t},\n\t{\n\t\tname: \"FastContext-1.0-4B\",\n\t\tpullRef: \"hf.co/KikoCis/FastContext-1.0-4B-longctx-imatrix-GGUF:fastcontext4b.Q4_K_M.imx.gguf\",\n\t\trole: \"Repository scout (context_scout)\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"scout\",\n\t\trationale:\n\t\t\t\"The model the context_scout lane is built around (Plan 9): 4B Qwen3, 256K context, trained for read-only repo exploration returning file:line citations. /fitness must pass the tool-calls + research lanes before assignment.\",\n\t\tnote: \"Q4 ≈ 2.5 GB; ~5-6 GB peak with 32-64K KV. Qwen3 template caveat: if tool calls fail the probe, use the Modelfile recipe in docs/scout.md.\",\n\t},\n\t{\n\t\tname: \"Ornith-1.0-9B\",\n\t\tpullRef: ORNITH_9B_OLLAMA_REF,\n\t\trole: \"Agentic-coding worker / router cheap tier\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"router-cheap\",\n\t\trationale:\n\t\t\t\"External candidate (not from pi's own validation research): MIT, Qwen 3.5 base, RL-trained for agentic coding with native tool-calling — the strongest local worker SHAPE in the roster. /fitness on your hardware is the validator.\",\n\t\tnote: \"Q4_K_M ≈ 5.6 GB weights, ~7-8 GB peak with KV — on a 10 GB box run it as the ONLY local model. Pi creates a managed Qwen 3.5 renderer/parser profile with the model's recommended sampling before probing. Larger boxes: consider router-medium after a passed worker lane.\",\n\t},\n\t{\n\t\tname: \"LFM2.5-8B-A1B\",\n\t\tpullRef: \"lfm2.5:8b-a1b-q4_K_M\",\n\t\trole: \"Native-tool MoE worker / router cheap tier\",\n\t\ttoolCalling: true,\n\t\tassignRole: \"router-cheap\",\n\t\trationale:\n\t\t\t\"Liquid AI's sparse MoE candidate is designed for agentic workflows. Pi probes native tool-calling first and only calibrates the phone protocol after native failure; /fitness must pass the task-scale tool lane on this host before assignment.\",\n\t\tnote: \"Q4_K_M ≈ 5.2 GB, 8.3B total / 1.5B active parameters, with a 128K-class model context. On a 10 GB host run it as the only large local resident; Pi still applies its bounded host profile and context budget.\",\n\t},\n\t{\n\t\tname: \"Bonsai-4B (GGUF Q1_0)\",\n\t\tpullRef: \"hf.co/prism-ml/Bonsai-4B-gguf:Q1_0\",\n\t\trole: \"Context curator / reflex brain / lighter lane analyst\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"curator\",\n\t\trationale:\n\t\t\t\"Lighter Bonsai lane model for context curation and structured local analysis; the exact Q1_0 artifact keeps /models suggest one-step.\",\n\t\tnote: \"Recommended when Bonsai-8B is too heavy. Pi serves the exact Q1_0 GGUF through its bounded Prism llama.cpp adapter, probes /fitness on the host, then offers the curator role.\",\n\t},\n\t{\n\t\tname: \"Bonsai-27B (1-bit + vision)\",\n\t\tpullRef: \"hf.co/prism-ml/Bonsai-27B-gguf:Q1_0\",\n\t\trole: \"Context curator / reflex brain / vision-capable lane analyst\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"curator\",\n\t\trationale:\n\t\t\t\"External 1-bit 27B, binary weights, 262K-class context, vision via mmproj; served through Pi's pinned Prism llama.cpp adapter so runtime, artifact, and projector stay one validated unit. /fitness on your hardware is the validator — never pre-claim tool-calling.\",\n\t\tnote: \"~3.8 GB weights + 629 MB vision projector + a one-time llama-server runtime download; CPU-served on GPU-less hosts. Pi installs the pinned prism llama.cpp runtime, downloads both files, starts llama-server, and registers the model in one step. Provider-recommended sampling is temp 0.7 / top-p 0.95 / top-k 20; models.json has no per-model default-sampling field yet, so pi cannot wire this — set it per-request/session if your workflow needs it.\",\n\t},\n\t{\n\t\tname: \"Ternary-Bonsai-1.7B\",\n\t\tpullRef: \"hf.co/prism-ml/Ternary-Bonsai-1.7B-gguf:Q2_0\",\n\t\trole: \"Search scout (heavy-lifter)\",\n\t\ttoolCalling: false,\n\t\trationale:\n\t\t\t\"Ternary weights, very fast; strong at structured search plans. No tool-calling template — use it as a research/worker lane model, never an executor.\",\n\t\tnote: \"Pi pins the provider's group-128 Q2_0 artifact and its matched Prism llama.cpp runtime; no ambiguous quant selection is left to Ollama.\",\n\t},\n\t{\n\t\tname: \"Ternary-Bonsai-4B\",\n\t\tpullRef: \"hf.co/prism-ml/Ternary-Bonsai-4B-gguf:Q2_0\",\n\t\trole: \"Context curator / reflex brain / lane analyst\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"curator\",\n\t\trationale:\n\t\t\t\"Validated as the 'brain': strict-JSON interpretation and faithful digests. Drives context curation and the toolkit reflex interpreter. Not a tool-caller.\",\n\t\tnote: \"Pi pins the provider's group-128 Q2_0 artifact and its matched Prism llama.cpp runtime.\",\n\t},\n\t{\n\t\tname: \"Ternary-Bonsai-8B\",\n\t\tpullRef: \"hf.co/prism-ml/Ternary-Bonsai-8B-gguf:Q2_0\",\n\t\trole: \"Routing judge (larger machines)\",\n\t\ttoolCalling: false,\n\t\tassignRole: \"judge\",\n\t\trationale:\n\t\t\t\"A judge candidate for machines with more headroom — too slow on ~16GB-class hardware in this research, kept for a bigger box.\",\n\t\tnote: \"Heavy: confirm tok/s with /fitness before assigning it. Pi pins the Q2_0 artifact and matched Prism llama.cpp runtime.\",\n\t},\n\t{\n\t\tname: \"needle (function-call tester, 26M)\",\n\t\tpullRef: \"hf.co/Cactus-Compute/needle\",\n\t\trole: \"Standalone function-call test bench (not a chat/lane model)\",\n\t\ttoolCalling: false,\n\t\trationale:\n\t\t\t\"NOT a pi chat model, executor, or lane model — needle is a 26M-parameter single-shot function-call SPECIALIST invoked one query at a time through its own `needle run` CLI, useful only as a standalone bench for probing tool-call behavior in isolation. No OpenAI-compatible endpoint, no chat lanes, no models.json registration, and no /fitness probe: use /models needle <query> [tools-json] to test it directly instead.\",\n\t\tnote: \"Upstream weights (needle.pkl) are pickle-only — arbitrary code execution on load by construction, not something pi's pinned-sha256 verification makes safe in the abstract, only tamper-evident.\",\n\t},\n];\n\n/** Bounded plain-text roster for `/models suggest` and the empty-store hint. */\nexport function formatModelSuggestions(suggestions: readonly ModelSuggestion[] = DEFAULT_MODEL_SUGGESTIONS): string[] {\n\tconst lines = [\n\t\t\"Suggested local models (validated roles from pi's own small-model research; probe on YOUR hardware with /fitness):\",\n\t];\n\tfor (const suggestion of suggestions) {\n\t\tlines.push(\n\t\t\t` - ${suggestion.name} → ${suggestion.role}${suggestion.toolCalling ? \"\" : \" [no tool-calling]\"}`,\n\t\t\t` /models add ${suggestion.pullRef}`,\n\t\t\t` ${suggestion.rationale}`,\n\t\t);\n\t\tif (suggestion.note) lines.push(` note: ${suggestion.note}`);\n\t}\n\tlines.push(\"Add one with /models add <ref> — pi pulls it, probes it, and offers a role in one step.\");\n\treturn lines;\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Readable } from "node:stream";
|
|
2
|
+
import { type LocalInferenceProfileMode } from "./local-inference-profile.ts";
|
|
2
3
|
import { type ManagedRuntimeSpawn } from "./runtime-process.ts";
|
|
3
4
|
/**
|
|
4
|
-
* Managed runtime for
|
|
5
|
-
* llama.cpp
|
|
6
|
-
*
|
|
7
|
-
* downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable
|
|
5
|
+
* Managed runtime for Pi's curated Prism 1-bit and ternary GGUF models. Q1_0 is available in
|
|
6
|
+
* upstream llama.cpp, while the selected group-128 Q2_0 artifacts and paired DSpark acceleration
|
|
7
|
+
* still require Prism's validated build. This module therefore owns the pinned runtime install,
|
|
8
|
+
* GGUF downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable
|
|
8
9
|
* seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),
|
|
9
10
|
* detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies
|
|
10
11
|
* instead of silent fallbacks.
|
|
@@ -28,23 +29,38 @@ export interface PrismModelDescriptor {
|
|
|
28
29
|
file: string;
|
|
29
30
|
mmprojFile?: string;
|
|
30
31
|
displayName: string;
|
|
32
|
+
architecture: "dense";
|
|
33
|
+
runtime: "prism-llamacpp";
|
|
34
|
+
family: "bonsai" | "ternary-bonsai";
|
|
35
|
+
parameterScale: "1.7B" | "4B" | "8B" | "27B";
|
|
36
|
+
weightFormat: "q1_0" | "q2_0";
|
|
37
|
+
matchedDrafter?: {
|
|
38
|
+
kind: "dspark";
|
|
39
|
+
file: string;
|
|
40
|
+
draftMax: 4;
|
|
41
|
+
minimumContext: 16_384;
|
|
42
|
+
validatedBackend: "cuda";
|
|
43
|
+
};
|
|
31
44
|
}
|
|
32
|
-
/** Curated
|
|
45
|
+
/** Curated 27B descriptor shared by the full local execution catalog. */
|
|
33
46
|
export declare const BONSAI_27B: PrismModelDescriptor;
|
|
34
47
|
export type PrismBackend = "cpu" | "cuda";
|
|
35
48
|
export type PrismAssetKind = "tar-gz" | "zip";
|
|
36
|
-
export interface
|
|
49
|
+
export interface PrismArchiveAsset {
|
|
37
50
|
name: string;
|
|
38
51
|
kind: PrismAssetKind;
|
|
52
|
+
}
|
|
53
|
+
export interface PrismLlamaAsset extends PrismArchiveAsset {
|
|
39
54
|
backend: PrismBackend;
|
|
55
|
+
companionAssets?: readonly PrismArchiveAsset[];
|
|
40
56
|
}
|
|
41
57
|
/**
|
|
42
58
|
* Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for
|
|
43
59
|
* {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.
|
|
44
|
-
* CPU asset by default;
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
60
|
+
* CPU asset by default; CUDA 12.4 is selected for x64 Linux or Windows with an NVIDIA GPU. The
|
|
61
|
+
* pinned Windows build is incomplete without its matching `cudart-*` archive, so the resolver
|
|
62
|
+
* returns both as one mandatory installation plan. Pure and exported so it's independently
|
|
63
|
+
* testable.
|
|
48
64
|
*/
|
|
49
65
|
export declare function resolvePrismLlamaAsset(plat: string, architecture: string, hasNvidiaGpu: boolean): PrismLlamaAsset | undefined;
|
|
50
66
|
export interface PrismDetectResult {
|
|
@@ -81,6 +97,9 @@ export interface PrismLlamaCppDeps {
|
|
|
81
97
|
hasNvidiaGpu?: () => boolean;
|
|
82
98
|
platform?: () => string;
|
|
83
99
|
arch?: () => string;
|
|
100
|
+
/** Host capacity probes used once to derive the bounded local inference profile. */
|
|
101
|
+
totalMemoryBytes?: () => number;
|
|
102
|
+
logicalCpuCount?: () => number;
|
|
84
103
|
/** Runs the extraction step for a downloaded archive. Injectable so installManaged's
|
|
85
104
|
* download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults
|
|
86
105
|
* to the real spawn-based extractor. */
|
|
@@ -102,9 +121,11 @@ export declare class PrismLlamaCppRuntime {
|
|
|
102
121
|
private readonly _extractArchiveFn;
|
|
103
122
|
private readonly _healthPollAttempts;
|
|
104
123
|
private readonly _healthPollIntervalMs;
|
|
124
|
+
private readonly _profile;
|
|
105
125
|
private _child;
|
|
106
126
|
constructor(args: {
|
|
107
127
|
agentDir: string;
|
|
128
|
+
profileMode?: LocalInferenceProfileMode;
|
|
108
129
|
deps?: PrismLlamaCppDeps;
|
|
109
130
|
});
|
|
110
131
|
runtimeDir(): string;
|
|
@@ -144,7 +165,6 @@ export declare class PrismLlamaCppRuntime {
|
|
|
144
165
|
repo: string;
|
|
145
166
|
file: string;
|
|
146
167
|
}, onProgress?: (status: string) => void): Promise<PrismDownloadResult>;
|
|
147
|
-
private _healthUp;
|
|
148
168
|
/**
|
|
149
169
|
* Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without
|
|
150
170
|
* calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed
|
|
@@ -152,6 +172,7 @@ export declare class PrismLlamaCppRuntime {
|
|
|
152
172
|
*/
|
|
153
173
|
serve(args: {
|
|
154
174
|
modelPath: string;
|
|
175
|
+
modelAlias: string;
|
|
155
176
|
mmprojPath?: string;
|
|
156
177
|
port: number;
|
|
157
178
|
numCtx: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llamacpp-runtime.d.ts","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5C,OAAO,EAIN,KAAK,mBAAmB,EAOxB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;AAEnE,eAAO,MAAM,gCAAgC,+DAA+D,CAAC;AAE7G,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"llamacpp-runtime.d.ts","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,14 @@ import { pipeline } from "node:stream/promises";
|
|
|
5
5
|
import { spawnProcess, waitForChildProcessWithTermination } from "../../utils/child-process.js";
|
|
6
6
|
import { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from "../../utils/shell.js";
|
|
7
7
|
import { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from "../agent-paths.js";
|
|
8
|
+
import { deriveHostLocalInferenceProfile, } from "./local-inference-profile.js";
|
|
9
|
+
import { probePrismLlamaCppServer } from "./prism-llamacpp-server-probe.js";
|
|
8
10
|
import { extractZipArchive, fetchRuntimeDownload, installRuntimeArchive, removePartialDownload, requireRuntimeStdin, resolveRuntimeLifecycleDependencies, runtimeCommandAvailable, tryFileSizeBytes, writeRuntimeDownload, } from "./runtime-process.js";
|
|
9
11
|
/**
|
|
10
|
-
* Managed runtime for
|
|
11
|
-
* llama.cpp
|
|
12
|
-
*
|
|
13
|
-
* downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable
|
|
12
|
+
* Managed runtime for Pi's curated Prism 1-bit and ternary GGUF models. Q1_0 is available in
|
|
13
|
+
* upstream llama.cpp, while the selected group-128 Q2_0 artifacts and paired DSpark acceleration
|
|
14
|
+
* still require Prism's validated build. This module therefore owns the pinned runtime install,
|
|
15
|
+
* GGUF downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable
|
|
14
16
|
* seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),
|
|
15
17
|
* detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies
|
|
16
18
|
* instead of silent fallbacks.
|
|
@@ -29,12 +31,24 @@ import { extractZipArchive, fetchRuntimeDownload, installRuntimeArchive, removeP
|
|
|
29
31
|
*/
|
|
30
32
|
export const PRISM_LLAMACPP_PINNED_RELEASE = "prism-b9594-38c66ad";
|
|
31
33
|
export const PRISM_LLAMACPP_RELEASES_BASE_URL = "https://github.com/PrismML-Eng/llama.cpp/releases/download";
|
|
32
|
-
/** Curated
|
|
34
|
+
/** Curated 27B descriptor shared by the full local execution catalog. */
|
|
33
35
|
export const BONSAI_27B = {
|
|
34
36
|
repo: "prism-ml/Bonsai-27B-gguf",
|
|
35
37
|
file: "Bonsai-27B-Q1_0.gguf",
|
|
36
38
|
mmprojFile: "Bonsai-27B-mmproj-Q8_0.gguf",
|
|
37
39
|
displayName: "Bonsai-27B (1-bit Q1_0 + vision)",
|
|
40
|
+
architecture: "dense",
|
|
41
|
+
runtime: "prism-llamacpp",
|
|
42
|
+
family: "bonsai",
|
|
43
|
+
parameterScale: "27B",
|
|
44
|
+
weightFormat: "q1_0",
|
|
45
|
+
matchedDrafter: {
|
|
46
|
+
kind: "dspark",
|
|
47
|
+
file: "Bonsai-27B-dspark-Q4_1.gguf",
|
|
48
|
+
draftMax: 4,
|
|
49
|
+
minimumContext: 16_384,
|
|
50
|
+
validatedBackend: "cuda",
|
|
51
|
+
},
|
|
38
52
|
};
|
|
39
53
|
// Verbatim asset names from the pinned release (see PRISM_LLAMACPP_PINNED_RELEASE doc comment) —
|
|
40
54
|
// hardcoded rather than templated from the tag because the provider's naming isn't fully
|
|
@@ -47,13 +61,15 @@ const MACOS_ARM64_ASSET = "llama-prism-b9594-38c66ad-bin-macos-arm64.tar.gz";
|
|
|
47
61
|
const MACOS_X64_ASSET = "llama-prism-b9594-38c66ad-bin-macos-x64.tar.gz";
|
|
48
62
|
const WIN_X64_CPU_ASSET = "llama-bin-win-cpu-x64.zip";
|
|
49
63
|
const WIN_ARM64_CPU_ASSET = "llama-bin-win-cpu-arm64.zip";
|
|
64
|
+
const WIN_X64_CUDA_ASSET = "llama-prism-b1-38c66ad-bin-win-cuda-12.4-x64.zip";
|
|
65
|
+
const WIN_X64_CUDA_COMPANION_ASSET = "cudart-llama-bin-win-cuda-12.4-x64.zip";
|
|
50
66
|
/**
|
|
51
67
|
* Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for
|
|
52
68
|
* {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.
|
|
53
|
-
* CPU asset by default;
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
69
|
+
* CPU asset by default; CUDA 12.4 is selected for x64 Linux or Windows with an NVIDIA GPU. The
|
|
70
|
+
* pinned Windows build is incomplete without its matching `cudart-*` archive, so the resolver
|
|
71
|
+
* returns both as one mandatory installation plan. Pure and exported so it's independently
|
|
72
|
+
* testable.
|
|
57
73
|
*/
|
|
58
74
|
export function resolvePrismLlamaAsset(plat, architecture, hasNvidiaGpu) {
|
|
59
75
|
if (plat === "linux") {
|
|
@@ -74,8 +90,16 @@ export function resolvePrismLlamaAsset(plat, architecture, hasNvidiaGpu) {
|
|
|
74
90
|
return undefined;
|
|
75
91
|
}
|
|
76
92
|
if (plat === "win32") {
|
|
77
|
-
if (architecture === "x64")
|
|
78
|
-
return
|
|
93
|
+
if (architecture === "x64") {
|
|
94
|
+
return hasNvidiaGpu
|
|
95
|
+
? {
|
|
96
|
+
name: WIN_X64_CUDA_ASSET,
|
|
97
|
+
kind: "zip",
|
|
98
|
+
backend: "cuda",
|
|
99
|
+
companionAssets: [{ name: WIN_X64_CUDA_COMPANION_ASSET, kind: "zip" }],
|
|
100
|
+
}
|
|
101
|
+
: { name: WIN_X64_CPU_ASSET, kind: "zip", backend: "cpu" };
|
|
102
|
+
}
|
|
79
103
|
if (architecture === "arm64")
|
|
80
104
|
return { name: WIN_ARM64_CPU_ASSET, kind: "zip", backend: "cpu" };
|
|
81
105
|
return undefined;
|
|
@@ -94,6 +118,9 @@ function parseContentLength(header) {
|
|
|
94
118
|
const value = Number(header);
|
|
95
119
|
return Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
96
120
|
}
|
|
121
|
+
function modelIdentityConflictError(servedModelIds) {
|
|
122
|
+
return `model-identity-conflict:${servedModelIds.join(",") || "unknown"}`;
|
|
123
|
+
}
|
|
97
124
|
export class PrismLlamaCppRuntime {
|
|
98
125
|
constructor(args) {
|
|
99
126
|
this._agentDir = args.agentDir;
|
|
@@ -102,6 +129,7 @@ export class PrismLlamaCppRuntime {
|
|
|
102
129
|
this._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand("nvidia-smi"));
|
|
103
130
|
this._platform = args.deps?.platform ?? osPlatform;
|
|
104
131
|
this._arch = args.deps?.arch ?? osArch;
|
|
132
|
+
this._profile = deriveHostLocalInferenceProfile(args.profileMode ?? "balanced", args.deps);
|
|
105
133
|
this._extractArchiveFn =
|
|
106
134
|
args.deps?.extractArchive ?? ((input, destDir, kind) => this._extractArchive(input, destDir, kind));
|
|
107
135
|
this._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;
|
|
@@ -186,10 +214,13 @@ export class PrismLlamaCppRuntime {
|
|
|
186
214
|
const asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());
|
|
187
215
|
if (!asset)
|
|
188
216
|
return { ok: false, error: "unsupported-platform" };
|
|
189
|
-
const
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
217
|
+
const archives = [asset, ...(asset.companionAssets ?? [])];
|
|
218
|
+
for (const archive of archives) {
|
|
219
|
+
const downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${archive.name}`;
|
|
220
|
+
const extracted = await this._installArchive(downloadUrl, archive, onProgress);
|
|
221
|
+
if (!extracted.ok)
|
|
222
|
+
return extracted;
|
|
223
|
+
}
|
|
193
224
|
onProgress?.("Locating llama-server binary…");
|
|
194
225
|
const destDir = this.runtimeDir();
|
|
195
226
|
const binaryRelPath = this._findBinaryRelPath(destDir);
|
|
@@ -297,17 +328,6 @@ export class PrismLlamaCppRuntime {
|
|
|
297
328
|
onProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);
|
|
298
329
|
return { ok: true, path: destPath };
|
|
299
330
|
}
|
|
300
|
-
async _healthUp(baseUrl) {
|
|
301
|
-
try {
|
|
302
|
-
const response = await this._fetch(`${baseUrl}/health`, {
|
|
303
|
-
signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),
|
|
304
|
-
});
|
|
305
|
-
return response.ok;
|
|
306
|
-
}
|
|
307
|
-
catch {
|
|
308
|
-
return false;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
331
|
/**
|
|
312
332
|
* Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without
|
|
313
333
|
* calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed
|
|
@@ -321,9 +341,19 @@ export class PrismLlamaCppRuntime {
|
|
|
321
341
|
if (!this._exists(binaryPath))
|
|
322
342
|
return { ok: false, error: "binary-missing" };
|
|
323
343
|
const baseUrl = `http://127.0.0.1:${args.port}`;
|
|
344
|
+
const existing = await probePrismLlamaCppServer(baseUrl, args.modelAlias, this._fetch, HEALTH_CHECK_TIMEOUT_MS);
|
|
345
|
+
if (existing.status === "matching")
|
|
346
|
+
return { ok: true, baseUrl };
|
|
347
|
+
if (existing.status === "conflict" && !this._child) {
|
|
348
|
+
return { ok: false, error: modelIdentityConflictError(existing.servedModelIds) };
|
|
349
|
+
}
|
|
350
|
+
if (this._child)
|
|
351
|
+
this.stop();
|
|
324
352
|
const argv = [
|
|
325
353
|
"-m",
|
|
326
354
|
args.modelPath,
|
|
355
|
+
"--alias",
|
|
356
|
+
args.modelAlias,
|
|
327
357
|
...(args.mmprojPath ? ["--mmproj", args.mmprojPath] : []),
|
|
328
358
|
"--host",
|
|
329
359
|
"127.0.0.1",
|
|
@@ -331,6 +361,20 @@ export class PrismLlamaCppRuntime {
|
|
|
331
361
|
String(args.port),
|
|
332
362
|
"-c",
|
|
333
363
|
String(args.numCtx),
|
|
364
|
+
"--cache-ram",
|
|
365
|
+
String(this._profile.promptCacheMiB),
|
|
366
|
+
"-np",
|
|
367
|
+
String(this._profile.parallelRequests),
|
|
368
|
+
"-fa",
|
|
369
|
+
this._profile.flashAttention ? "on" : "off",
|
|
370
|
+
"-ctk",
|
|
371
|
+
this._profile.kvCacheType,
|
|
372
|
+
"-ctv",
|
|
373
|
+
this._profile.kvCacheType,
|
|
374
|
+
"-t",
|
|
375
|
+
String(this._profile.generationThreads),
|
|
376
|
+
"-tb",
|
|
377
|
+
String(this._profile.batchThreads),
|
|
334
378
|
...(manifest.backend === "cuda" ? ["-ngl", "99"] : []),
|
|
335
379
|
];
|
|
336
380
|
const child = this._spawn(binaryPath, argv, {
|
|
@@ -342,12 +386,19 @@ export class PrismLlamaCppRuntime {
|
|
|
342
386
|
trackDetachedChildPid(child.pid);
|
|
343
387
|
child.unref?.();
|
|
344
388
|
child.on("exit", () => {
|
|
345
|
-
this._child
|
|
389
|
+
if (this._child === child) {
|
|
390
|
+
this._child = undefined;
|
|
391
|
+
}
|
|
346
392
|
});
|
|
347
393
|
this._child = child;
|
|
348
394
|
for (let attempt = 0; attempt < this._healthPollAttempts; attempt++) {
|
|
349
|
-
|
|
395
|
+
const probe = await probePrismLlamaCppServer(baseUrl, args.modelAlias, this._fetch, HEALTH_CHECK_TIMEOUT_MS);
|
|
396
|
+
if (probe.status === "matching")
|
|
350
397
|
return { ok: true, baseUrl };
|
|
398
|
+
if (probe.status === "conflict") {
|
|
399
|
+
this.stop();
|
|
400
|
+
return { ok: false, error: modelIdentityConflictError(probe.servedModelIds) };
|
|
401
|
+
}
|
|
351
402
|
await this._sleep(this._healthPollIntervalMs);
|
|
352
403
|
}
|
|
353
404
|
this.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llamacpp-runtime.js","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport { type Dirent, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { arch as osArch, platform as osPlatform } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from \"../../utils/shell.ts\";\nimport { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from \"../agent-paths.ts\";\nimport {\n\textractZipArchive,\n\tfetchRuntimeDownload,\n\tinstallRuntimeArchive,\n\ttype ManagedRuntimeSpawn,\n\tremovePartialDownload,\n\trequireRuntimeStdin,\n\tresolveRuntimeLifecycleDependencies,\n\truntimeCommandAvailable,\n\ttryFileSizeBytes,\n\twriteRuntimeDownload,\n} from \"./runtime-process.ts\";\n\n/**\n * Managed runtime for prism-ml 1-bit GGUF models (Bonsai-27B first). The provider requires their\n * llama.cpp fork (Q1_0_g128 hybrid-attention kernels) — stock llama.cpp/Ollama cannot serve these\n * weights — so this module owns runtime install (prebuilt release download+extract), GGUF\n * downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable\n * seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),\n * detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies\n * instead of silent fallbacks.\n *\n * The fork publishes precompiled per-platform archives on GitHub Releases (no local build): pin a\n * release tag, download the matching asset, extract it, and locate the `llama-server` binary once\n * at install time (release archive layouts vary — bin/ vs build/bin/ at the top level — so this is\n * a deterministic one-time scan, not a fallback). The found relative path and backend (cpu/cuda)\n * are persisted to a manifest so later `detect()`/`serve()` calls never need to re-scan.\n */\n\n/**\n * Pinned Prism ML llama.cpp fork release — verified via\n * `GET https://api.github.com/repos/PrismML-Eng/llama.cpp/releases/tags/prism-b9594-38c66ad` on\n * 2026-07-18 (release exists, all assets referenced below are present on it). Bump here (and\n * re-verify with the same API call) when the provider ships new kernels.\n */\nexport const PRISM_LLAMACPP_PINNED_RELEASE = \"prism-b9594-38c66ad\";\n\nexport const PRISM_LLAMACPP_RELEASES_BASE_URL = \"https://github.com/PrismML-Eng/llama.cpp/releases/download\";\n\nexport interface PrismModelDescriptor {\n\trepo: string;\n\tfile: string;\n\tmmprojFile?: string;\n\tdisplayName: string;\n}\n\n/** Curated first-model descriptor; the `/models add` wiring task consumes this. */\nexport const BONSAI_27B: PrismModelDescriptor = {\n\trepo: \"prism-ml/Bonsai-27B-gguf\",\n\tfile: \"Bonsai-27B-Q1_0.gguf\",\n\tmmprojFile: \"Bonsai-27B-mmproj-Q8_0.gguf\",\n\tdisplayName: \"Bonsai-27B (1-bit Q1_0 + vision)\",\n};\n\nexport type PrismBackend = \"cpu\" | \"cuda\";\nexport type PrismAssetKind = \"tar-gz\" | \"zip\";\n\nexport interface PrismLlamaAsset {\n\tname: string;\n\tkind: PrismAssetKind;\n\tbackend: PrismBackend;\n}\n\n// Verbatim asset names from the pinned release (see PRISM_LLAMACPP_PINNED_RELEASE doc comment) —\n// hardcoded rather than templated from the tag because the provider's naming isn't fully\n// consistent across platforms (Windows CPU assets drop the tag/commit segment entirely; the\n// Windows CUDA asset uses a different build-number segment, \"b1\" not \"b9594\").\nconst LINUX_X64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-x64.tar.gz\";\nconst LINUX_ARM64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-arm64.tar.gz\";\nconst LINUX_X64_CUDA_ASSET = \"llama-prism-b9594-38c66ad-bin-linux-cuda-12.4-x64.tar.gz\";\nconst MACOS_ARM64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-arm64.tar.gz\";\nconst MACOS_X64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-x64.tar.gz\";\nconst WIN_X64_CPU_ASSET = \"llama-bin-win-cpu-x64.zip\";\nconst WIN_ARM64_CPU_ASSET = \"llama-bin-win-cpu-arm64.zip\";\n\n/**\n * Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for\n * {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.\n * CPU asset by default; the CUDA 12.4 variant is only offered for linux x64 with an NVIDIA GPU\n * present (a 12.8 variant also exists upstream but has no wired caller yet). Windows CUDA needs a\n * companion `cudart-*` archive and is out of scope for v1 — Windows always resolves to the CPU zip\n * regardless of `hasNvidiaGpu`. Pure and exported so it's independently testable.\n */\nexport function resolvePrismLlamaAsset(\n\tplat: string,\n\tarchitecture: string,\n\thasNvidiaGpu: boolean,\n): PrismLlamaAsset | undefined {\n\tif (plat === \"linux\") {\n\t\tif (architecture === \"x64\") {\n\t\t\treturn hasNvidiaGpu\n\t\t\t\t? { name: LINUX_X64_CUDA_ASSET, kind: \"tar-gz\", backend: \"cuda\" }\n\t\t\t\t: { name: LINUX_X64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\t}\n\t\tif (architecture === \"arm64\") return { name: LINUX_ARM64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"darwin\") {\n\t\tif (architecture === \"arm64\") return { name: MACOS_ARM64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\tif (architecture === \"x64\") return { name: MACOS_X64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"win32\") {\n\t\tif (architecture === \"x64\") return { name: WIN_X64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\tif (architecture === \"arm64\") return { name: WIN_ARM64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\treturn undefined;\n}\n\nexport interface PrismDetectResult {\n\truntimeInstalled: boolean;\n\tbinaryPath?: string;\n\trelease?: string;\n}\n\nexport interface PrismDownloadResult {\n\tok: boolean;\n\tpath?: string;\n\tskipped?: boolean;\n\terror?: string;\n}\n\nexport type PrismServeResult = { ok: true; baseUrl: string } | { ok: false; error: string };\n\ninterface PrismInstallManifest {\n\trelease: string;\n\tbinaryRelPath: string;\n\tbackend: PrismBackend;\n}\n\ntype PrismExtractArchiveFn = (\n\tinput: Readable,\n\tdestDir: string,\n\tkind: PrismAssetKind,\n) => Promise<{ ok: boolean; error?: string }>;\n\nexport interface PrismLlamaCppDeps {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: ManagedRuntimeSpawn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n\t/** Whether a named command exists on PATH (nvidia-smi, tar — for zip extraction on Windows). */\n\thasCommand?: (command: string) => boolean;\n\t/** Decided once at install time and persisted as `backend` — serve() reads the persisted value\n\t * so `-ngl 99` reflects what was actually installed, not the host's current GPU state. */\n\thasNvidiaGpu?: () => boolean;\n\tplatform?: () => string;\n\tarch?: () => string;\n\t/** Runs the extraction step for a downloaded archive. Injectable so installManaged's\n\t * download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults\n\t * to the real spawn-based extractor. */\n\textractArchive?: PrismExtractArchiveFn;\n\t/** Health-poll bounds for serve(); default ~120s (240 * 500ms), both overridable for tests. */\n\thealthPollAttempts?: number;\n\thealthPollIntervalMs?: number;\n}\n\nconst EXTRACTION_TIMEOUT_MS = 10 * 60_000;\nconst COMMAND_KILL_GRACE_MS = 2_000;\nconst DEFAULT_HEALTH_POLL_ATTEMPTS = 240;\nconst DEFAULT_HEALTH_POLL_INTERVAL_MS = 500;\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000;\nconst HEAD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction parseContentLength(header: string | null): number | undefined {\n\tif (!header) return undefined;\n\tconst value = Number(header);\n\treturn Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nexport class PrismLlamaCppRuntime {\n\tprivate readonly _agentDir: string;\n\tprivate readonly _fetch: typeof fetch;\n\tprivate readonly _spawn: ManagedRuntimeSpawn;\n\tprivate readonly _exists: (path: string) => boolean;\n\tprivate readonly _sleep: (ms: number) => Promise<void>;\n\tprivate readonly _hasCommand: (command: string) => boolean;\n\tprivate readonly _hasNvidiaGpu: () => boolean;\n\tprivate readonly _platform: () => string;\n\tprivate readonly _arch: () => string;\n\tprivate readonly _extractArchiveFn: PrismExtractArchiveFn;\n\tprivate readonly _healthPollAttempts: number;\n\tprivate readonly _healthPollIntervalMs: number;\n\tprivate _child: Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\"> | undefined;\n\n\tconstructor(args: { agentDir: string; deps?: PrismLlamaCppDeps }) {\n\t\tthis._agentDir = args.agentDir;\n\t\t[this._fetch, this._spawn, this._exists, this._sleep] = resolveRuntimeLifecycleDependencies(args.deps);\n\t\tthis._hasCommand = args.deps?.hasCommand ?? runtimeCommandAvailable;\n\t\tthis._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand(\"nvidia-smi\"));\n\t\tthis._platform = args.deps?.platform ?? osPlatform;\n\t\tthis._arch = args.deps?.arch ?? osArch;\n\t\tthis._extractArchiveFn =\n\t\t\targs.deps?.extractArchive ?? ((input, destDir, kind) => this._extractArchive(input, destDir, kind));\n\t\tthis._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;\n\t\tthis._healthPollIntervalMs = args.deps?.healthPollIntervalMs ?? DEFAULT_HEALTH_POLL_INTERVAL_MS;\n\t}\n\n\truntimeDir(): string {\n\t\treturn agentRuntimesDir(\"prism-llamacpp\", this._agentDir);\n\t}\n\n\tmodelsDir(): string {\n\t\treturn agentModelsDir(\"llamacpp\", this._agentDir);\n\t}\n\n\tprivate _binaryName(): string {\n\t\treturn this._platform() === \"win32\" ? \"llama-server.exe\" : \"llama-server\";\n\t}\n\n\tprivate _manifestPath(): string {\n\t\treturn join(this.runtimeDir(), \"install.json\");\n\t}\n\n\tprivate _readManifest(): PrismInstallManifest | undefined {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(this._manifestPath(), \"utf8\")) as {\n\t\t\t\trelease?: unknown;\n\t\t\t\tbinaryRelPath?: unknown;\n\t\t\t\tbackend?: unknown;\n\t\t\t};\n\t\t\tif (\n\t\t\t\ttypeof parsed.release === \"string\" &&\n\t\t\t\ttypeof parsed.binaryRelPath === \"string\" &&\n\t\t\t\t(parsed.backend === \"cpu\" || parsed.backend === \"cuda\")\n\t\t\t) {\n\t\t\t\treturn { release: parsed.release, binaryRelPath: parsed.binaryRelPath, backend: parsed.backend };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _writeManifest(manifest: PrismInstallManifest): void {\n\t\twriteFileSync(this._manifestPath(), JSON.stringify(manifest, null, \"\\t\"));\n\t}\n\n\tasync detect(): Promise<PrismDetectResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { runtimeInstalled: false };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tconst runtimeInstalled = this._exists(binaryPath);\n\t\treturn {\n\t\t\truntimeInstalled,\n\t\t\tbinaryPath: runtimeInstalled ? binaryPath : undefined,\n\t\t\trelease: manifest.release,\n\t\t};\n\t}\n\n\t/** One-time recursive scan for the `llama-server` binary inside a freshly extracted release\n\t * archive — layouts vary (bin/ vs build/bin/ at the top level) across platforms/backends, so\n\t * this locates it deterministically instead of assuming a fixed path, then the result is\n\t * persisted so later calls never need to re-scan. */\n\tprivate _findBinaryRelPath(root: string): string | undefined {\n\t\tconst targetName = this._binaryName();\n\t\tconst stack: string[] = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst dir = stack.pop();\n\t\t\tif (dir === undefined) continue;\n\t\t\tlet entries: Dirent[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst full = join(dir, entry.name);\n\t\t\t\tif (entry.isDirectory()) stack.push(full);\n\t\t\t\telse if (entry.isFile() && entry.name === targetName) return relative(root, full);\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Download the pinned release asset for this host and extract it (consent-gated by the caller,\n\t * same contract as OllamaRuntime#installManaged — this method only does the mechanical\n\t * download+extract+locate and reports the outcome honestly). No compiler toolchain required:\n\t * the fork ships prebuilt binaries.\n\t */\n\tasync installManaged(onProgress?: (status: string) => void): Promise<{ ok: boolean; error?: string }> {\n\t\tconst asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());\n\t\tif (!asset) return { ok: false, error: \"unsupported-platform\" };\n\n\t\tconst downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${asset.name}`;\n\t\tconst extracted = await this._installArchive(downloadUrl, asset, onProgress);\n\t\tif (!extracted.ok) return extracted;\n\n\t\tonProgress?.(\"Locating llama-server binary…\");\n\t\tconst destDir = this.runtimeDir();\n\t\tconst binaryRelPath = this._findBinaryRelPath(destDir);\n\t\tif (!binaryRelPath) {\n\t\t\treturn { ok: false, error: \"binary-missing: no llama-server binary found in the extracted archive\" };\n\t\t}\n\n\t\tthis._writeManifest({ release: PRISM_LLAMACPP_PINNED_RELEASE, binaryRelPath, backend: asset.backend });\n\t\tonProgress?.(\"Prism llama.cpp runtime installed.\");\n\t\treturn { ok: true };\n\t}\n\n\tprivate _installArchive(\n\t\tdownloadUrl: string,\n\t\tasset: PrismLlamaAsset,\n\t\tonProgress?: (status: string) => void,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\treturn installRuntimeArchive(\n\t\t\tthis._fetch,\n\t\t\tdownloadUrl,\n\t\t\tthis.runtimeDir(),\n\t\t\tasset,\n\t\t\tthis._extractArchiveFn,\n\t\t\tonProgress,\n\t\t);\n\t}\n\n\tprivate async _extractArchive(\n\t\tinput: Readable,\n\t\tdestDir: string,\n\t\tkind: PrismAssetKind,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\ttry {\n\t\t\treturn kind === \"zip\" ? await this._extractZip(input, destDir) : await this._extractTarGz(input, destDir);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `extract-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t}\n\n\tprivate async _extractTarGz(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\tconst tarProc = spawnProcess(\"tar\", [\"-xzf\", \"-\", \"-C\", destDir], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t});\n\t\tconst terminationController = new AbortController();\n\t\tconst processWait = waitForChildProcessWithTermination(tarProc, {\n\t\t\tsignal: terminationController.signal,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t\ttry {\n\t\t\tawait pipeline(input, requireRuntimeStdin(tarProc, \"tar\"));\n\t\t} catch (error) {\n\t\t\tterminationController.abort();\n\t\t\tawait processWait.catch(() => {});\n\t\t\tthrow error;\n\t\t}\n\t\tconst terminal = await processWait;\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: tar extraction timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t: `extract-fail: tar exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractZip(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\treturn extractZipArchive({\n\t\t\tinput,\n\t\t\tdestDir,\n\t\t\ttempPrefix: \"prism-llamacpp-download\",\n\t\t\tplatform: this._platform,\n\t\t\thasCommand: this._hasCommand,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t}\n\n\tprivate async _remoteContentLength(url: string): Promise<number | undefined> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(url, {\n\t\t\t\tmethod: \"HEAD\",\n\t\t\t\tsignal: AbortSignal.timeout(HEAD_REQUEST_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok ? parseContentLength(response.headers.get(\"content-length\")) : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download\n\t * when the local file already matches the remote size; verifies size when the response reports\n\t * `content-length` and deletes the partial file on any failure or mismatch — never leaves a\n\t * corrupt/truncated weight file behind for a later load to silently misread.\n\t */\n\tasync downloadModel(\n\t\targs: { repo: string; file: string },\n\t\tonProgress?: (status: string) => void,\n\t): Promise<PrismDownloadResult> {\n\t\tconst destPath = join(this.modelsDir(), args.repo, args.file);\n\t\tconst url = `https://huggingface.co/${args.repo}/resolve/main/${args.file}`;\n\t\tmkdirSync(dirname(destPath), { recursive: true });\n\n\t\tif (this._exists(destPath)) {\n\t\t\tconst remoteSize = await this._remoteContentLength(url);\n\t\t\tif (remoteSize !== undefined && remoteSize === tryFileSizeBytes(destPath)) {\n\t\t\t\tonProgress?.(`${args.file} already downloaded (${remoteSize} bytes) — skipping.`);\n\t\t\t\treturn { ok: true, path: destPath, skipped: true };\n\t\t\t}\n\t\t}\n\n\t\tonProgress?.(`Downloading ${args.file} from ${args.repo}…`);\n\t\tconst download = await fetchRuntimeDownload(this._fetch, url);\n\t\tif (!download.ok) return download;\n\n\t\tconst expectedBytes = parseContentLength(download.response.headers.get(\"content-length\"));\n\t\tconst written = await writeRuntimeDownload(download.body as unknown as Readable, destPath);\n\t\tif (!written.ok) return written;\n\n\t\tconst actualBytes = tryFileSizeBytes(destPath);\n\t\tif (expectedBytes !== undefined && actualBytes !== expectedBytes) {\n\t\t\tremovePartialDownload(destPath);\n\t\t\treturn { ok: false, error: `size-mismatch: expected ${expectedBytes} bytes, got ${actualBytes ?? 0}` };\n\t\t}\n\n\t\tonProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);\n\t\treturn { ok: true, path: destPath };\n\t}\n\n\tprivate async _healthUp(baseUrl: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(`${baseUrl}/health`, {\n\t\t\t\tsignal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without\n\t * calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed\n\t * asset's persisted `backend` is `\"cuda\"`, not from the host's current GPU state.\n\t */\n\tasync serve(args: {\n\t\tmodelPath: string;\n\t\tmmprojPath?: string;\n\t\tport: number;\n\t\tnumCtx: number;\n\t}): Promise<PrismServeResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { ok: false, error: \"binary-missing\" };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tif (!this._exists(binaryPath)) return { ok: false, error: \"binary-missing\" };\n\n\t\tconst baseUrl = `http://127.0.0.1:${args.port}`;\n\t\tconst argv = [\n\t\t\t\"-m\",\n\t\t\targs.modelPath,\n\t\t\t...(args.mmprojPath ? [\"--mmproj\", args.mmprojPath] : []),\n\t\t\t\"--host\",\n\t\t\t\"127.0.0.1\",\n\t\t\t\"--port\",\n\t\t\tString(args.port),\n\t\t\t\"-c\",\n\t\t\tString(args.numCtx),\n\t\t\t...(manifest.backend === \"cuda\" ? [\"-ngl\", \"99\"] : []),\n\t\t];\n\n\t\tconst child = this._spawn(binaryPath, argv, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\tchild.unref?.();\n\t\tchild.on(\"exit\", () => {\n\t\t\tthis._child = undefined;\n\t\t});\n\t\tthis._child = child;\n\n\t\tfor (let attempt = 0; attempt < this._healthPollAttempts; attempt++) {\n\t\t\tif (await this._healthUp(baseUrl)) return { ok: true, baseUrl };\n\t\t\tawait this._sleep(this._healthPollIntervalMs);\n\t\t}\n\t\tthis.stop();\n\t\treturn { ok: false, error: \"health-timeout\" };\n\t}\n\n\tstop(): { stopped: boolean } {\n\t\tconst child = this._child;\n\t\tif (!child) return { stopped: false };\n\t\tthis._child = undefined;\n\t\tif (child.pid) {\n\t\t\tuntrackDetachedChildPid(child.pid);\n\t\t\tkillProcessTree(child.pid);\n\t\t}\n\t\treturn { stopped: true };\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this._child !== undefined;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"llamacpp-runtime.js","sourceRoot":"","sources":["../../../src/core/models/llamacpp-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport { type Dirent, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { arch as osArch, platform as osPlatform } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { killProcessTree, trackDetachedChildPid, untrackDetachedChildPid } from \"../../utils/shell.ts\";\nimport { modelsDir as agentModelsDir, runtimesDir as agentRuntimesDir } from \"../agent-paths.ts\";\nimport {\n\tderiveHostLocalInferenceProfile,\n\ttype LocalInferenceProfile,\n\ttype LocalInferenceProfileMode,\n} from \"./local-inference-profile.ts\";\nimport { probePrismLlamaCppServer } from \"./prism-llamacpp-server-probe.ts\";\nimport {\n\textractZipArchive,\n\tfetchRuntimeDownload,\n\tinstallRuntimeArchive,\n\ttype ManagedRuntimeSpawn,\n\tremovePartialDownload,\n\trequireRuntimeStdin,\n\tresolveRuntimeLifecycleDependencies,\n\truntimeCommandAvailable,\n\ttryFileSizeBytes,\n\twriteRuntimeDownload,\n} from \"./runtime-process.ts\";\n\n/**\n * Managed runtime for Pi's curated Prism 1-bit and ternary GGUF models. Q1_0 is available in\n * upstream llama.cpp, while the selected group-128 Q2_0 artifacts and paired DSpark acceleration\n * still require Prism's validated build. This module therefore owns the pinned runtime install,\n * GGUF downloads, and llama-server lifecycle. Mirrors local-runtime.ts's OllamaRuntime: injectable\n * seams for fetch/spawn/exists, pi-owned directories under agentDir (runtimes/, models/),\n * detached+tracked child processes, onProgress as best-effort UI feedback, honest error taxonomies\n * instead of silent fallbacks.\n *\n * The fork publishes precompiled per-platform archives on GitHub Releases (no local build): pin a\n * release tag, download the matching asset, extract it, and locate the `llama-server` binary once\n * at install time (release archive layouts vary — bin/ vs build/bin/ at the top level — so this is\n * a deterministic one-time scan, not a fallback). The found relative path and backend (cpu/cuda)\n * are persisted to a manifest so later `detect()`/`serve()` calls never need to re-scan.\n */\n\n/**\n * Pinned Prism ML llama.cpp fork release — verified via\n * `GET https://api.github.com/repos/PrismML-Eng/llama.cpp/releases/tags/prism-b9594-38c66ad` on\n * 2026-07-18 (release exists, all assets referenced below are present on it). Bump here (and\n * re-verify with the same API call) when the provider ships new kernels.\n */\nexport const PRISM_LLAMACPP_PINNED_RELEASE = \"prism-b9594-38c66ad\";\n\nexport const PRISM_LLAMACPP_RELEASES_BASE_URL = \"https://github.com/PrismML-Eng/llama.cpp/releases/download\";\n\nexport interface PrismModelDescriptor {\n\trepo: string;\n\tfile: string;\n\tmmprojFile?: string;\n\tdisplayName: string;\n\tarchitecture: \"dense\";\n\truntime: \"prism-llamacpp\";\n\tfamily: \"bonsai\" | \"ternary-bonsai\";\n\tparameterScale: \"1.7B\" | \"4B\" | \"8B\" | \"27B\";\n\tweightFormat: \"q1_0\" | \"q2_0\";\n\tmatchedDrafter?: {\n\t\tkind: \"dspark\";\n\t\tfile: string;\n\t\tdraftMax: 4;\n\t\tminimumContext: 16_384;\n\t\tvalidatedBackend: \"cuda\";\n\t};\n}\n\n/** Curated 27B descriptor shared by the full local execution catalog. */\nexport const BONSAI_27B: PrismModelDescriptor = {\n\trepo: \"prism-ml/Bonsai-27B-gguf\",\n\tfile: \"Bonsai-27B-Q1_0.gguf\",\n\tmmprojFile: \"Bonsai-27B-mmproj-Q8_0.gguf\",\n\tdisplayName: \"Bonsai-27B (1-bit Q1_0 + vision)\",\n\tarchitecture: \"dense\",\n\truntime: \"prism-llamacpp\",\n\tfamily: \"bonsai\",\n\tparameterScale: \"27B\",\n\tweightFormat: \"q1_0\",\n\tmatchedDrafter: {\n\t\tkind: \"dspark\",\n\t\tfile: \"Bonsai-27B-dspark-Q4_1.gguf\",\n\t\tdraftMax: 4,\n\t\tminimumContext: 16_384,\n\t\tvalidatedBackend: \"cuda\",\n\t},\n};\n\nexport type PrismBackend = \"cpu\" | \"cuda\";\nexport type PrismAssetKind = \"tar-gz\" | \"zip\";\n\nexport interface PrismArchiveAsset {\n\tname: string;\n\tkind: PrismAssetKind;\n}\n\nexport interface PrismLlamaAsset extends PrismArchiveAsset {\n\tbackend: PrismBackend;\n\tcompanionAssets?: readonly PrismArchiveAsset[];\n}\n\n// Verbatim asset names from the pinned release (see PRISM_LLAMACPP_PINNED_RELEASE doc comment) —\n// hardcoded rather than templated from the tag because the provider's naming isn't fully\n// consistent across platforms (Windows CPU assets drop the tag/commit segment entirely; the\n// Windows CUDA asset uses a different build-number segment, \"b1\" not \"b9594\").\nconst LINUX_X64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-x64.tar.gz\";\nconst LINUX_ARM64_CPU_ASSET = \"llama-prism-b9594-38c66ad-bin-ubuntu-arm64.tar.gz\";\nconst LINUX_X64_CUDA_ASSET = \"llama-prism-b9594-38c66ad-bin-linux-cuda-12.4-x64.tar.gz\";\nconst MACOS_ARM64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-arm64.tar.gz\";\nconst MACOS_X64_ASSET = \"llama-prism-b9594-38c66ad-bin-macos-x64.tar.gz\";\nconst WIN_X64_CPU_ASSET = \"llama-bin-win-cpu-x64.zip\";\nconst WIN_ARM64_CPU_ASSET = \"llama-bin-win-cpu-arm64.zip\";\nconst WIN_X64_CUDA_ASSET = \"llama-prism-b1-38c66ad-bin-win-cuda-12.4-x64.zip\";\nconst WIN_X64_CUDA_COMPANION_ASSET = \"cudart-llama-bin-win-cuda-12.4-x64.zip\";\n\n/**\n * Maps a platform/arch/GPU triple to the exact Prism llama.cpp release asset for\n * {@link PRISM_LLAMACPP_PINNED_RELEASE} — verified against the real GitHub release, not guessed.\n * CPU asset by default; CUDA 12.4 is selected for x64 Linux or Windows with an NVIDIA GPU. The\n * pinned Windows build is incomplete without its matching `cudart-*` archive, so the resolver\n * returns both as one mandatory installation plan. Pure and exported so it's independently\n * testable.\n */\nexport function resolvePrismLlamaAsset(\n\tplat: string,\n\tarchitecture: string,\n\thasNvidiaGpu: boolean,\n): PrismLlamaAsset | undefined {\n\tif (plat === \"linux\") {\n\t\tif (architecture === \"x64\") {\n\t\t\treturn hasNvidiaGpu\n\t\t\t\t? { name: LINUX_X64_CUDA_ASSET, kind: \"tar-gz\", backend: \"cuda\" }\n\t\t\t\t: { name: LINUX_X64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\t}\n\t\tif (architecture === \"arm64\") return { name: LINUX_ARM64_CPU_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"darwin\") {\n\t\tif (architecture === \"arm64\") return { name: MACOS_ARM64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\tif (architecture === \"x64\") return { name: MACOS_X64_ASSET, kind: \"tar-gz\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\tif (plat === \"win32\") {\n\t\tif (architecture === \"x64\") {\n\t\t\treturn hasNvidiaGpu\n\t\t\t\t? {\n\t\t\t\t\t\tname: WIN_X64_CUDA_ASSET,\n\t\t\t\t\t\tkind: \"zip\",\n\t\t\t\t\t\tbackend: \"cuda\",\n\t\t\t\t\t\tcompanionAssets: [{ name: WIN_X64_CUDA_COMPANION_ASSET, kind: \"zip\" }],\n\t\t\t\t\t}\n\t\t\t\t: { name: WIN_X64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\t}\n\t\tif (architecture === \"arm64\") return { name: WIN_ARM64_CPU_ASSET, kind: \"zip\", backend: \"cpu\" };\n\t\treturn undefined;\n\t}\n\treturn undefined;\n}\n\nexport interface PrismDetectResult {\n\truntimeInstalled: boolean;\n\tbinaryPath?: string;\n\trelease?: string;\n}\n\nexport interface PrismDownloadResult {\n\tok: boolean;\n\tpath?: string;\n\tskipped?: boolean;\n\terror?: string;\n}\n\nexport type PrismServeResult = { ok: true; baseUrl: string } | { ok: false; error: string };\n\ninterface PrismInstallManifest {\n\trelease: string;\n\tbinaryRelPath: string;\n\tbackend: PrismBackend;\n}\n\ntype PrismExtractArchiveFn = (\n\tinput: Readable,\n\tdestDir: string,\n\tkind: PrismAssetKind,\n) => Promise<{ ok: boolean; error?: string }>;\n\nexport interface PrismLlamaCppDeps {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: ManagedRuntimeSpawn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n\t/** Whether a named command exists on PATH (nvidia-smi, tar — for zip extraction on Windows). */\n\thasCommand?: (command: string) => boolean;\n\t/** Decided once at install time and persisted as `backend` — serve() reads the persisted value\n\t * so `-ngl 99` reflects what was actually installed, not the host's current GPU state. */\n\thasNvidiaGpu?: () => boolean;\n\tplatform?: () => string;\n\tarch?: () => string;\n\t/** Host capacity probes used once to derive the bounded local inference profile. */\n\ttotalMemoryBytes?: () => number;\n\tlogicalCpuCount?: () => number;\n\t/** Runs the extraction step for a downloaded archive. Injectable so installManaged's\n\t * download->extract->scan orchestration is testable without a real tar/unzip pipeline; defaults\n\t * to the real spawn-based extractor. */\n\textractArchive?: PrismExtractArchiveFn;\n\t/** Health-poll bounds for serve(); default ~120s (240 * 500ms), both overridable for tests. */\n\thealthPollAttempts?: number;\n\thealthPollIntervalMs?: number;\n}\n\nconst EXTRACTION_TIMEOUT_MS = 10 * 60_000;\nconst COMMAND_KILL_GRACE_MS = 2_000;\nconst DEFAULT_HEALTH_POLL_ATTEMPTS = 240;\nconst DEFAULT_HEALTH_POLL_INTERVAL_MS = 500;\nconst HEALTH_CHECK_TIMEOUT_MS = 2_000;\nconst HEAD_REQUEST_TIMEOUT_MS = 10_000;\n\nfunction parseContentLength(header: string | null): number | undefined {\n\tif (!header) return undefined;\n\tconst value = Number(header);\n\treturn Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n\nfunction modelIdentityConflictError(servedModelIds: readonly string[]): string {\n\treturn `model-identity-conflict:${servedModelIds.join(\",\") || \"unknown\"}`;\n}\n\nexport class PrismLlamaCppRuntime {\n\tprivate readonly _agentDir: string;\n\tprivate readonly _fetch: typeof fetch;\n\tprivate readonly _spawn: ManagedRuntimeSpawn;\n\tprivate readonly _exists: (path: string) => boolean;\n\tprivate readonly _sleep: (ms: number) => Promise<void>;\n\tprivate readonly _hasCommand: (command: string) => boolean;\n\tprivate readonly _hasNvidiaGpu: () => boolean;\n\tprivate readonly _platform: () => string;\n\tprivate readonly _arch: () => string;\n\tprivate readonly _extractArchiveFn: PrismExtractArchiveFn;\n\tprivate readonly _healthPollAttempts: number;\n\tprivate readonly _healthPollIntervalMs: number;\n\tprivate readonly _profile: LocalInferenceProfile;\n\tprivate _child: Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\"> | undefined;\n\n\tconstructor(args: {\n\t\tagentDir: string;\n\t\tprofileMode?: LocalInferenceProfileMode;\n\t\tdeps?: PrismLlamaCppDeps;\n\t}) {\n\t\tthis._agentDir = args.agentDir;\n\t\t[this._fetch, this._spawn, this._exists, this._sleep] = resolveRuntimeLifecycleDependencies(args.deps);\n\t\tthis._hasCommand = args.deps?.hasCommand ?? runtimeCommandAvailable;\n\t\tthis._hasNvidiaGpu = args.deps?.hasNvidiaGpu ?? (() => this._hasCommand(\"nvidia-smi\"));\n\t\tthis._platform = args.deps?.platform ?? osPlatform;\n\t\tthis._arch = args.deps?.arch ?? osArch;\n\t\tthis._profile = deriveHostLocalInferenceProfile(args.profileMode ?? \"balanced\", args.deps);\n\t\tthis._extractArchiveFn =\n\t\t\targs.deps?.extractArchive ?? ((input, destDir, kind) => this._extractArchive(input, destDir, kind));\n\t\tthis._healthPollAttempts = args.deps?.healthPollAttempts ?? DEFAULT_HEALTH_POLL_ATTEMPTS;\n\t\tthis._healthPollIntervalMs = args.deps?.healthPollIntervalMs ?? DEFAULT_HEALTH_POLL_INTERVAL_MS;\n\t}\n\n\truntimeDir(): string {\n\t\treturn agentRuntimesDir(\"prism-llamacpp\", this._agentDir);\n\t}\n\n\tmodelsDir(): string {\n\t\treturn agentModelsDir(\"llamacpp\", this._agentDir);\n\t}\n\n\tprivate _binaryName(): string {\n\t\treturn this._platform() === \"win32\" ? \"llama-server.exe\" : \"llama-server\";\n\t}\n\n\tprivate _manifestPath(): string {\n\t\treturn join(this.runtimeDir(), \"install.json\");\n\t}\n\n\tprivate _readManifest(): PrismInstallManifest | undefined {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(this._manifestPath(), \"utf8\")) as {\n\t\t\t\trelease?: unknown;\n\t\t\t\tbinaryRelPath?: unknown;\n\t\t\t\tbackend?: unknown;\n\t\t\t};\n\t\t\tif (\n\t\t\t\ttypeof parsed.release === \"string\" &&\n\t\t\t\ttypeof parsed.binaryRelPath === \"string\" &&\n\t\t\t\t(parsed.backend === \"cpu\" || parsed.backend === \"cuda\")\n\t\t\t) {\n\t\t\t\treturn { release: parsed.release, binaryRelPath: parsed.binaryRelPath, backend: parsed.backend };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _writeManifest(manifest: PrismInstallManifest): void {\n\t\twriteFileSync(this._manifestPath(), JSON.stringify(manifest, null, \"\\t\"));\n\t}\n\n\tasync detect(): Promise<PrismDetectResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { runtimeInstalled: false };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tconst runtimeInstalled = this._exists(binaryPath);\n\t\treturn {\n\t\t\truntimeInstalled,\n\t\t\tbinaryPath: runtimeInstalled ? binaryPath : undefined,\n\t\t\trelease: manifest.release,\n\t\t};\n\t}\n\n\t/** One-time recursive scan for the `llama-server` binary inside a freshly extracted release\n\t * archive — layouts vary (bin/ vs build/bin/ at the top level) across platforms/backends, so\n\t * this locates it deterministically instead of assuming a fixed path, then the result is\n\t * persisted so later calls never need to re-scan. */\n\tprivate _findBinaryRelPath(root: string): string | undefined {\n\t\tconst targetName = this._binaryName();\n\t\tconst stack: string[] = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst dir = stack.pop();\n\t\t\tif (dir === undefined) continue;\n\t\t\tlet entries: Dirent[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst full = join(dir, entry.name);\n\t\t\t\tif (entry.isDirectory()) stack.push(full);\n\t\t\t\telse if (entry.isFile() && entry.name === targetName) return relative(root, full);\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Download the pinned release asset for this host and extract it (consent-gated by the caller,\n\t * same contract as OllamaRuntime#installManaged — this method only does the mechanical\n\t * download+extract+locate and reports the outcome honestly). No compiler toolchain required:\n\t * the fork ships prebuilt binaries.\n\t */\n\tasync installManaged(onProgress?: (status: string) => void): Promise<{ ok: boolean; error?: string }> {\n\t\tconst asset = resolvePrismLlamaAsset(this._platform(), this._arch(), this._hasNvidiaGpu());\n\t\tif (!asset) return { ok: false, error: \"unsupported-platform\" };\n\n\t\tconst archives: readonly PrismArchiveAsset[] = [asset, ...(asset.companionAssets ?? [])];\n\t\tfor (const archive of archives) {\n\t\t\tconst downloadUrl = `${PRISM_LLAMACPP_RELEASES_BASE_URL}/${PRISM_LLAMACPP_PINNED_RELEASE}/${archive.name}`;\n\t\t\tconst extracted = await this._installArchive(downloadUrl, archive, onProgress);\n\t\t\tif (!extracted.ok) return extracted;\n\t\t}\n\n\t\tonProgress?.(\"Locating llama-server binary…\");\n\t\tconst destDir = this.runtimeDir();\n\t\tconst binaryRelPath = this._findBinaryRelPath(destDir);\n\t\tif (!binaryRelPath) {\n\t\t\treturn { ok: false, error: \"binary-missing: no llama-server binary found in the extracted archive\" };\n\t\t}\n\n\t\tthis._writeManifest({ release: PRISM_LLAMACPP_PINNED_RELEASE, binaryRelPath, backend: asset.backend });\n\t\tonProgress?.(\"Prism llama.cpp runtime installed.\");\n\t\treturn { ok: true };\n\t}\n\n\tprivate _installArchive(\n\t\tdownloadUrl: string,\n\t\tasset: PrismArchiveAsset,\n\t\tonProgress?: (status: string) => void,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\treturn installRuntimeArchive(\n\t\t\tthis._fetch,\n\t\t\tdownloadUrl,\n\t\t\tthis.runtimeDir(),\n\t\t\tasset,\n\t\t\tthis._extractArchiveFn,\n\t\t\tonProgress,\n\t\t);\n\t}\n\n\tprivate async _extractArchive(\n\t\tinput: Readable,\n\t\tdestDir: string,\n\t\tkind: PrismAssetKind,\n\t): Promise<{ ok: boolean; error?: string }> {\n\t\ttry {\n\t\t\treturn kind === \"zip\" ? await this._extractZip(input, destDir) : await this._extractTarGz(input, destDir);\n\t\t} catch (error) {\n\t\t\treturn { ok: false, error: `extract-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t\t}\n\t}\n\n\tprivate async _extractTarGz(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\tconst tarProc = spawnProcess(\"tar\", [\"-xzf\", \"-\", \"-C\", destDir], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"ignore\", \"ignore\"],\n\t\t});\n\t\tconst terminationController = new AbortController();\n\t\tconst processWait = waitForChildProcessWithTermination(tarProc, {\n\t\t\tsignal: terminationController.signal,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t\ttry {\n\t\t\tawait pipeline(input, requireRuntimeStdin(tarProc, \"tar\"));\n\t\t} catch (error) {\n\t\t\tterminationController.abort();\n\t\t\tawait processWait.catch(() => {});\n\t\t\tthrow error;\n\t\t}\n\t\tconst terminal = await processWait;\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: tar extraction timed out after ${EXTRACTION_TIMEOUT_MS}ms`\n\t\t\t\t\t\t: `extract-fail: tar exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t}\n\n\tprivate async _extractZip(input: Readable, destDir: string): Promise<{ ok: boolean; error?: string }> {\n\t\treturn extractZipArchive({\n\t\t\tinput,\n\t\t\tdestDir,\n\t\t\ttempPrefix: \"prism-llamacpp-download\",\n\t\t\tplatform: this._platform,\n\t\t\thasCommand: this._hasCommand,\n\t\t\ttimeoutMs: EXTRACTION_TIMEOUT_MS,\n\t\t\tkillGraceMs: COMMAND_KILL_GRACE_MS,\n\t\t});\n\t}\n\n\tprivate async _remoteContentLength(url: string): Promise<number | undefined> {\n\t\ttry {\n\t\t\tconst response = await this._fetch(url, {\n\t\t\t\tmethod: \"HEAD\",\n\t\t\t\tsignal: AbortSignal.timeout(HEAD_REQUEST_TIMEOUT_MS),\n\t\t\t});\n\t\t\treturn response.ok ? parseContentLength(response.headers.get(\"content-length\")) : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Stream a GGUF (or mmproj) file from Hugging Face into pi's owned models dir. Skips a re-download\n\t * when the local file already matches the remote size; verifies size when the response reports\n\t * `content-length` and deletes the partial file on any failure or mismatch — never leaves a\n\t * corrupt/truncated weight file behind for a later load to silently misread.\n\t */\n\tasync downloadModel(\n\t\targs: { repo: string; file: string },\n\t\tonProgress?: (status: string) => void,\n\t): Promise<PrismDownloadResult> {\n\t\tconst destPath = join(this.modelsDir(), args.repo, args.file);\n\t\tconst url = `https://huggingface.co/${args.repo}/resolve/main/${args.file}`;\n\t\tmkdirSync(dirname(destPath), { recursive: true });\n\n\t\tif (this._exists(destPath)) {\n\t\t\tconst remoteSize = await this._remoteContentLength(url);\n\t\t\tif (remoteSize !== undefined && remoteSize === tryFileSizeBytes(destPath)) {\n\t\t\t\tonProgress?.(`${args.file} already downloaded (${remoteSize} bytes) — skipping.`);\n\t\t\t\treturn { ok: true, path: destPath, skipped: true };\n\t\t\t}\n\t\t}\n\n\t\tonProgress?.(`Downloading ${args.file} from ${args.repo}…`);\n\t\tconst download = await fetchRuntimeDownload(this._fetch, url);\n\t\tif (!download.ok) return download;\n\n\t\tconst expectedBytes = parseContentLength(download.response.headers.get(\"content-length\"));\n\t\tconst written = await writeRuntimeDownload(download.body as unknown as Readable, destPath);\n\t\tif (!written.ok) return written;\n\n\t\tconst actualBytes = tryFileSizeBytes(destPath);\n\t\tif (expectedBytes !== undefined && actualBytes !== expectedBytes) {\n\t\t\tremovePartialDownload(destPath);\n\t\t\treturn { ok: false, error: `size-mismatch: expected ${expectedBytes} bytes, got ${actualBytes ?? 0}` };\n\t\t}\n\n\t\tonProgress?.(`${args.file} downloaded (${actualBytes ?? 0} bytes).`);\n\t\treturn { ok: true, path: destPath };\n\t}\n\n\t/**\n\t * Spawn `llama-server` detached+tracked (killed on parent shutdown even if pi crashes without\n\t * calling stop()) and poll `/health` until ready. `-ngl 99` is only added when the installed\n\t * asset's persisted `backend` is `\"cuda\"`, not from the host's current GPU state.\n\t */\n\tasync serve(args: {\n\t\tmodelPath: string;\n\t\tmodelAlias: string;\n\t\tmmprojPath?: string;\n\t\tport: number;\n\t\tnumCtx: number;\n\t}): Promise<PrismServeResult> {\n\t\tconst manifest = this._readManifest();\n\t\tif (!manifest) return { ok: false, error: \"binary-missing\" };\n\t\tconst binaryPath = join(this.runtimeDir(), manifest.binaryRelPath);\n\t\tif (!this._exists(binaryPath)) return { ok: false, error: \"binary-missing\" };\n\n\t\tconst baseUrl = `http://127.0.0.1:${args.port}`;\n\t\tconst existing = await probePrismLlamaCppServer(baseUrl, args.modelAlias, this._fetch, HEALTH_CHECK_TIMEOUT_MS);\n\t\tif (existing.status === \"matching\") return { ok: true, baseUrl };\n\t\tif (existing.status === \"conflict\" && !this._child) {\n\t\t\treturn { ok: false, error: modelIdentityConflictError(existing.servedModelIds) };\n\t\t}\n\t\tif (this._child) this.stop();\n\t\tconst argv = [\n\t\t\t\"-m\",\n\t\t\targs.modelPath,\n\t\t\t\"--alias\",\n\t\t\targs.modelAlias,\n\t\t\t...(args.mmprojPath ? [\"--mmproj\", args.mmprojPath] : []),\n\t\t\t\"--host\",\n\t\t\t\"127.0.0.1\",\n\t\t\t\"--port\",\n\t\t\tString(args.port),\n\t\t\t\"-c\",\n\t\t\tString(args.numCtx),\n\t\t\t\"--cache-ram\",\n\t\t\tString(this._profile.promptCacheMiB),\n\t\t\t\"-np\",\n\t\t\tString(this._profile.parallelRequests),\n\t\t\t\"-fa\",\n\t\t\tthis._profile.flashAttention ? \"on\" : \"off\",\n\t\t\t\"-ctk\",\n\t\t\tthis._profile.kvCacheType,\n\t\t\t\"-ctv\",\n\t\t\tthis._profile.kvCacheType,\n\t\t\t\"-t\",\n\t\t\tString(this._profile.generationThreads),\n\t\t\t\"-tb\",\n\t\t\tString(this._profile.batchThreads),\n\t\t\t...(manifest.backend === \"cuda\" ? [\"-ngl\", \"99\"] : []),\n\t\t];\n\n\t\tconst child = this._spawn(binaryPath, argv, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: process.env,\n\t\t});\n\t\tif (child.pid) trackDetachedChildPid(child.pid);\n\t\tchild.unref?.();\n\t\tchild.on(\"exit\", () => {\n\t\t\tif (this._child === child) {\n\t\t\t\tthis._child = undefined;\n\t\t\t}\n\t\t});\n\t\tthis._child = child;\n\n\t\tfor (let attempt = 0; attempt < this._healthPollAttempts; attempt++) {\n\t\t\tconst probe = await probePrismLlamaCppServer(baseUrl, args.modelAlias, this._fetch, HEALTH_CHECK_TIMEOUT_MS);\n\t\t\tif (probe.status === \"matching\") return { ok: true, baseUrl };\n\t\t\tif (probe.status === \"conflict\") {\n\t\t\t\tthis.stop();\n\t\t\t\treturn { ok: false, error: modelIdentityConflictError(probe.servedModelIds) };\n\t\t\t}\n\t\t\tawait this._sleep(this._healthPollIntervalMs);\n\t\t}\n\t\tthis.stop();\n\t\treturn { ok: false, error: \"health-timeout\" };\n\t}\n\n\tstop(): { stopped: boolean } {\n\t\tconst child = this._child;\n\t\tif (!child) return { stopped: false };\n\t\tthis._child = undefined;\n\t\tif (child.pid) {\n\t\t\tuntrackDetachedChildPid(child.pid);\n\t\t\tkillProcessTree(child.pid);\n\t\t}\n\t\treturn { stopped: true };\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this._child !== undefined;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type PrismBackend, type PrismModelDescriptor } from "./llamacpp-runtime.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The complete model set Pi may manage through its pinned Prism llama.cpp adapter. Unknown models
|
|
4
|
+
* never enter this path. Every descriptor pins the exact GGUF artifact so user-provided quant
|
|
5
|
+
* suffixes cannot silently select a different format or runtime.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PRISM_LLAMACPP_DESCRIPTORS: Readonly<Record<string, PrismModelDescriptor>>;
|
|
8
|
+
export declare function resolvePrismLocalModelDescriptor(modelId: string): PrismModelDescriptor | undefined;
|
|
9
|
+
export type PrismSpeculationPlan = {
|
|
10
|
+
enabled: true;
|
|
11
|
+
kind: "dspark";
|
|
12
|
+
drafterFile: string;
|
|
13
|
+
draftMax: 4;
|
|
14
|
+
minimumContext: 16_384;
|
|
15
|
+
} | {
|
|
16
|
+
enabled: false;
|
|
17
|
+
reason: "not-requested" | "model-has-no-matched-drafter" | "backend-not-validated";
|
|
18
|
+
};
|
|
19
|
+
/** MTP is deliberately absent: Bonsai acceleration uses only the model's exact paired drafter. */
|
|
20
|
+
export declare function planPrismSpeculation(descriptor: PrismModelDescriptor, args: {
|
|
21
|
+
requested: boolean;
|
|
22
|
+
backend: PrismBackend;
|
|
23
|
+
}): PrismSpeculationPlan;
|
|
24
|
+
//# sourceMappingURL=local-execution-planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-execution-planner.d.ts","sourceRoot":"","sources":["../../../src/core/models/local-execution-planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA2FjG;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CASpF,CAAC;AAMH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAElG;AAED,MAAM,MAAM,oBAAoB,GAC7B;IACA,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACtB,GACD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,8BAA8B,GAAG,uBAAuB,CAAA;CAAE,CAAC;AAE1G,kGAAkG;AAClG,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,oBAAoB,EAChC,IAAI,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACjD,oBAAoB,CAatB"}
|