agent-nuvira 3.3.1 → 3.3.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/README.md +18 -13
- package/dist/agent-sdk/src/agent.d.ts +2 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -1
- package/dist/agent-sdk/src/define.d.ts +64 -0
- package/dist/agent-sdk/src/define.d.ts.map +1 -0
- package/dist/agent-sdk/src/define.js +76 -0
- package/dist/agent-sdk/src/define.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +9 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -1
- package/dist/agent-sdk/src/index.js +9 -0
- package/dist/agent-sdk/src/index.js.map +1 -1
- package/dist/agent-sdk/src/scaffold.d.ts +11 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -1
- package/dist/agent-sdk/src/scaffold.js +16 -6
- package/dist/agent-sdk/src/scaffold.js.map +1 -1
- package/dist/agents/agents/runner.d.ts +9 -0
- package/dist/agents/agents/runner.d.ts.map +1 -1
- package/dist/agents/agents/runner.js +34 -12
- package/dist/agents/agents/runner.js.map +1 -1
- package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
- package/dist/agents/agents/writer-tool-calling.js +7 -2
- package/dist/agents/agents/writer-tool-calling.js.map +1 -1
- package/dist/agents/agents/writer.d.ts.map +1 -1
- package/dist/agents/agents/writer.js +7 -1
- package/dist/agents/agents/writer.js.map +1 -1
- package/dist/agents/artifact-verification.d.ts +102 -0
- package/dist/agents/artifact-verification.d.ts.map +1 -0
- package/dist/agents/artifact-verification.js +216 -0
- package/dist/agents/artifact-verification.js.map +1 -0
- package/dist/agents/checkpoint-store.d.ts +73 -0
- package/dist/agents/checkpoint-store.d.ts.map +1 -1
- package/dist/agents/checkpoint-store.js +161 -0
- package/dist/agents/checkpoint-store.js.map +1 -1
- package/dist/agents/credential-store.d.ts +120 -0
- package/dist/agents/credential-store.d.ts.map +1 -1
- package/dist/agents/credential-store.js +358 -19
- package/dist/agents/credential-store.js.map +1 -1
- package/dist/agents/long-form-plan.d.ts.map +1 -1
- package/dist/agents/long-form-plan.js +2 -1
- package/dist/agents/long-form-plan.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +10 -1
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +239 -79
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/phase-engine.d.ts +61 -0
- package/dist/agents/phase-engine.d.ts.map +1 -1
- package/dist/agents/phase-engine.js +68 -2
- package/dist/agents/phase-engine.js.map +1 -1
- package/dist/agents/prompt-assembly.d.ts +11 -0
- package/dist/agents/prompt-assembly.d.ts.map +1 -1
- package/dist/agents/prompt-assembly.js +17 -0
- package/dist/agents/prompt-assembly.js.map +1 -1
- package/dist/agents/release-preflight.d.ts +121 -0
- package/dist/agents/release-preflight.d.ts.map +1 -0
- package/dist/agents/release-preflight.js +259 -0
- package/dist/agents/release-preflight.js.map +1 -0
- package/dist/agents/release-runner.d.ts +157 -0
- package/dist/agents/release-runner.d.ts.map +1 -0
- package/dist/agents/release-runner.js +719 -0
- package/dist/agents/release-runner.js.map +1 -0
- package/dist/agents/step-handoff.d.ts +190 -0
- package/dist/agents/step-handoff.d.ts.map +1 -0
- package/dist/agents/step-handoff.js +443 -0
- package/dist/agents/step-handoff.js.map +1 -0
- package/dist/cli/agent.d.ts +2 -2
- package/dist/cli/agent.js +10 -10
- package/dist/cli/benchmark.d.ts.map +1 -1
- package/dist/cli/benchmark.js +11 -4
- package/dist/cli/benchmark.js.map +1 -1
- package/dist/cli/chat.d.ts +94 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +379 -24
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +8 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +9 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/credentials.d.ts +28 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +213 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +3 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/edit.js +2 -2
- package/dist/cli/eval.d.ts +17 -0
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +105 -2
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/execute.d.ts +16 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +192 -22
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/failover-runner.d.ts.map +1 -1
- package/dist/cli/failover-runner.js +9 -3
- package/dist/cli/failover-runner.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +55 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +285 -19
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/model.d.ts.map +1 -1
- package/dist/cli/model.js +9 -8
- package/dist/cli/model.js.map +1 -1
- package/dist/cli/models.d.ts +1 -1
- package/dist/cli/models.js +4 -4
- package/dist/cli/nlu.d.ts.map +1 -1
- package/dist/cli/nlu.js +8 -2
- package/dist/cli/nlu.js.map +1 -1
- package/dist/cli/parity.d.ts +85 -0
- package/dist/cli/parity.d.ts.map +1 -0
- package/dist/cli/parity.js +506 -0
- package/dist/cli/parity.js.map +1 -0
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +2 -1
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/publish.d.ts +22 -0
- package/dist/cli/publish.d.ts.map +1 -1
- package/dist/cli/publish.js +109 -13
- package/dist/cli/publish.js.map +1 -1
- package/dist/cli/retrieval.d.ts.map +1 -1
- package/dist/cli/retrieval.js +5 -4
- package/dist/cli/retrieval.js.map +1 -1
- package/dist/cli/sdk.js +4 -4
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli/trace.d.ts.map +1 -1
- package/dist/cli/trace.js +2 -1
- package/dist/cli/trace.js.map +1 -1
- package/dist/cli/workflow.js +2 -2
- package/dist/cli/workflow.js.map +1 -1
- package/dist/config/live-credentials.d.ts +57 -0
- package/dist/config/live-credentials.d.ts.map +1 -0
- package/dist/config/live-credentials.js +126 -0
- package/dist/config/live-credentials.js.map +1 -0
- package/dist/config/paths.d.ts +18 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +25 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +44 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/federation/a2a-types.js +1 -1
- package/dist/federation/a2a-types.js.map +1 -1
- package/dist/findings/verdicts.d.ts +241 -0
- package/dist/findings/verdicts.d.ts.map +1 -0
- package/dist/findings/verdicts.js +284 -0
- package/dist/findings/verdicts.js.map +1 -0
- package/dist/gateway/adapters.d.ts +65 -0
- package/dist/gateway/adapters.d.ts.map +1 -1
- package/dist/gateway/adapters.js +216 -10
- package/dist/gateway/adapters.js.map +1 -1
- package/dist/gateway/channel-directory.d.ts +31 -0
- package/dist/gateway/channel-directory.d.ts.map +1 -1
- package/dist/gateway/channel-directory.js +40 -0
- package/dist/gateway/channel-directory.js.map +1 -1
- package/dist/gateway/gateway-log.d.ts +1 -1
- package/dist/gateway/gateway-log.d.ts.map +1 -1
- package/dist/gateway/gateway-log.js.map +1 -1
- package/dist/gateway/hooks.d.ts +87 -19
- package/dist/gateway/hooks.d.ts.map +1 -1
- package/dist/gateway/hooks.js +62 -23
- package/dist/gateway/hooks.js.map +1 -1
- package/dist/gateway/inbound-media.d.ts +147 -0
- package/dist/gateway/inbound-media.d.ts.map +1 -0
- package/dist/gateway/inbound-media.js +317 -0
- package/dist/gateway/inbound-media.js.map +1 -0
- package/dist/gateway/inbox.d.ts +8 -1
- package/dist/gateway/inbox.d.ts.map +1 -1
- package/dist/gateway/inbox.js.map +1 -1
- package/dist/gateway/platform-config.d.ts +14 -0
- package/dist/gateway/platform-config.d.ts.map +1 -1
- package/dist/gateway/platform-config.js +26 -8
- package/dist/gateway/platform-config.js.map +1 -1
- package/dist/gateway/realtime.d.ts +114 -0
- package/dist/gateway/realtime.d.ts.map +1 -0
- package/dist/gateway/realtime.js +402 -0
- package/dist/gateway/realtime.js.map +1 -0
- package/dist/gateway/registry.d.ts +31 -0
- package/dist/gateway/registry.d.ts.map +1 -1
- package/dist/gateway/registry.js +224 -4
- package/dist/gateway/registry.js.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.js +123 -4
- package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
- package/dist/gateway/whatsapp/bridge.d.ts +6 -2
- package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/bridge.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/inference/factory.d.ts +14 -0
- package/dist/inference/factory.d.ts.map +1 -1
- package/dist/inference/factory.js +17 -0
- package/dist/inference/factory.js.map +1 -1
- package/dist/inference/groq-adapter.d.ts +2 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -1
- package/dist/inference/groq-adapter.js +16 -6
- package/dist/inference/groq-adapter.js.map +1 -1
- package/dist/inference/model-validator.d.ts +6 -1
- package/dist/inference/model-validator.d.ts.map +1 -1
- package/dist/inference/model-validator.js +7 -2
- package/dist/inference/model-validator.js.map +1 -1
- package/dist/inference/route-resolver.d.ts +116 -0
- package/dist/inference/route-resolver.d.ts.map +1 -0
- package/dist/inference/route-resolver.js +159 -0
- package/dist/inference/route-resolver.js.map +1 -0
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +29 -0
- package/dist/inference/tools.js.map +1 -1
- package/dist/learning/autonomy-policy.d.ts +18 -0
- package/dist/learning/autonomy-policy.d.ts.map +1 -1
- package/dist/learning/autonomy-policy.js +35 -0
- package/dist/learning/autonomy-policy.js.map +1 -1
- package/dist/learning/benchmark.d.ts.map +1 -1
- package/dist/learning/benchmark.js +3 -2
- package/dist/learning/benchmark.js.map +1 -1
- package/dist/learning/continuation.d.ts.map +1 -1
- package/dist/learning/continuation.js +2 -1
- package/dist/learning/continuation.js.map +1 -1
- package/dist/learning/cost-tracker.d.ts.map +1 -1
- package/dist/learning/cost-tracker.js +2 -1
- package/dist/learning/cost-tracker.js.map +1 -1
- package/dist/learning/deferred-task.d.ts.map +1 -1
- package/dist/learning/deferred-task.js +13 -4
- package/dist/learning/deferred-task.js.map +1 -1
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +2 -1
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/long-form.d.ts.map +1 -1
- package/dist/learning/long-form.js +2 -1
- package/dist/learning/long-form.js.map +1 -1
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +2 -1
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/reasoning-cache.d.ts.map +1 -1
- package/dist/learning/reasoning-cache.js +2 -1
- package/dist/learning/reasoning-cache.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +38 -2
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +91 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +31 -18
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/retrieval.d.ts.map +1 -1
- package/dist/learning/retrieval.js +2 -1
- package/dist/learning/retrieval.js.map +1 -1
- package/dist/learning/seeded-benchmark.d.ts +160 -0
- package/dist/learning/seeded-benchmark.d.ts.map +1 -0
- package/dist/learning/seeded-benchmark.js +321 -0
- package/dist/learning/seeded-benchmark.js.map +1 -0
- package/dist/learning/seeded-bugs.d.ts +142 -0
- package/dist/learning/seeded-bugs.d.ts.map +1 -0
- package/dist/learning/seeded-bugs.js +535 -0
- package/dist/learning/seeded-bugs.js.map +1 -0
- package/dist/learning/skill-store.d.ts.map +1 -1
- package/dist/learning/skill-store.js +30 -9
- package/dist/learning/skill-store.js.map +1 -1
- package/dist/learning/step-checkpoint.d.ts +127 -0
- package/dist/learning/step-checkpoint.d.ts.map +1 -0
- package/dist/learning/step-checkpoint.js +244 -0
- package/dist/learning/step-checkpoint.js.map +1 -0
- package/dist/mcp/catalog.js +2 -3
- package/dist/mcp/catalog.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +5 -3
- package/dist/mcp/manager.js.map +1 -1
- package/dist/nlu/intent-confirm.d.ts +23 -1
- package/dist/nlu/intent-confirm.d.ts.map +1 -1
- package/dist/nlu/intent-confirm.js +85 -2
- package/dist/nlu/intent-confirm.js.map +1 -1
- package/dist/nlu/learnings.d.ts +7 -0
- package/dist/nlu/learnings.d.ts.map +1 -1
- package/dist/nlu/learnings.js +7 -0
- package/dist/nlu/learnings.js.map +1 -1
- package/dist/observability/debug-log.d.ts +250 -0
- package/dist/observability/debug-log.d.ts.map +1 -0
- package/dist/observability/debug-log.js +500 -0
- package/dist/observability/debug-log.js.map +1 -0
- package/dist/observability/event-bus.d.ts.map +1 -1
- package/dist/observability/event-bus.js +4 -1
- package/dist/observability/event-bus.js.map +1 -1
- package/dist/observability/otel.d.ts +278 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +590 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/parity/drivers.d.ts +99 -0
- package/dist/parity/drivers.d.ts.map +1 -0
- package/dist/parity/drivers.js +1362 -0
- package/dist/parity/drivers.js.map +1 -0
- package/dist/parity/graph.d.ts +73 -0
- package/dist/parity/graph.d.ts.map +1 -0
- package/dist/parity/graph.js +162 -0
- package/dist/parity/graph.js.map +1 -0
- package/dist/parity/matrix.d.ts +105 -0
- package/dist/parity/matrix.d.ts.map +1 -0
- package/dist/parity/matrix.js +352 -0
- package/dist/parity/matrix.js.map +1 -0
- package/dist/parity/observation.d.ts +444 -0
- package/dist/parity/observation.d.ts.map +1 -0
- package/dist/parity/observation.js +333 -0
- package/dist/parity/observation.js.map +1 -0
- package/dist/parity/scenarios.d.ts +229 -0
- package/dist/parity/scenarios.d.ts.map +1 -0
- package/dist/parity/scenarios.js +175 -0
- package/dist/parity/scenarios.js.map +1 -0
- package/dist/parity/surfaces.d.ts +122 -0
- package/dist/parity/surfaces.d.ts.map +1 -0
- package/dist/parity/surfaces.js +190 -0
- package/dist/parity/surfaces.js.map +1 -0
- package/dist/runtime/fault-injection.d.ts +173 -0
- package/dist/runtime/fault-injection.d.ts.map +1 -0
- package/dist/runtime/fault-injection.js +281 -0
- package/dist/runtime/fault-injection.js.map +1 -0
- package/dist/skills/secret-capture.d.ts.map +1 -1
- package/dist/skills/secret-capture.js +9 -4
- package/dist/skills/secret-capture.js.map +1 -1
- package/dist/tools/child-agent-entry.d.ts +23 -0
- package/dist/tools/child-agent-entry.d.ts.map +1 -0
- package/dist/tools/child-agent-entry.js +129 -0
- package/dist/tools/child-agent-entry.js.map +1 -0
- package/dist/tools/child-agent-runtime.d.ts +124 -0
- package/dist/tools/child-agent-runtime.d.ts.map +1 -0
- package/dist/tools/child-agent-runtime.js +704 -0
- package/dist/tools/child-agent-runtime.js.map +1 -0
- package/dist/tools/coding-tools.d.ts.map +1 -1
- package/dist/tools/coding-tools.js +82 -10
- package/dist/tools/coding-tools.js.map +1 -1
- package/dist/tools/credentials-tool.d.ts +24 -0
- package/dist/tools/credentials-tool.d.ts.map +1 -0
- package/dist/tools/credentials-tool.js +125 -0
- package/dist/tools/credentials-tool.js.map +1 -0
- package/dist/tools/delegation-system.d.ts +31 -0
- package/dist/tools/delegation-system.d.ts.map +1 -1
- package/dist/tools/delegation-system.js +70 -9
- package/dist/tools/delegation-system.js.map +1 -1
- package/dist/tools/extract/docx.d.ts +27 -0
- package/dist/tools/extract/docx.d.ts.map +1 -0
- package/dist/tools/extract/docx.js +48 -0
- package/dist/tools/extract/docx.js.map +1 -0
- package/dist/tools/extract/html-text.d.ts +27 -0
- package/dist/tools/extract/html-text.d.ts.map +1 -0
- package/dist/tools/extract/html-text.js +86 -0
- package/dist/tools/extract/html-text.js.map +1 -0
- package/dist/tools/extract/pdf-ocr.d.ts +58 -0
- package/dist/tools/extract/pdf-ocr.d.ts.map +1 -0
- package/dist/tools/extract/pdf-ocr.js +116 -0
- package/dist/tools/extract/pdf-ocr.js.map +1 -0
- package/dist/tools/extract/pdf.d.ts +65 -0
- package/dist/tools/extract/pdf.d.ts.map +1 -0
- package/dist/tools/extract/pdf.js +197 -0
- package/dist/tools/extract/pdf.js.map +1 -0
- package/dist/tools/extract/pptx.d.ts +32 -0
- package/dist/tools/extract/pptx.d.ts.map +1 -0
- package/dist/tools/extract/pptx.js +77 -0
- package/dist/tools/extract/pptx.js.map +1 -0
- package/dist/tools/extract/xlsx.d.ts +47 -0
- package/dist/tools/extract/xlsx.d.ts.map +1 -0
- package/dist/tools/extract/xlsx.js +111 -0
- package/dist/tools/extract/xlsx.js.map +1 -0
- package/dist/tools/finding-tool.d.ts +76 -0
- package/dist/tools/finding-tool.d.ts.map +1 -0
- package/dist/tools/finding-tool.js +125 -0
- package/dist/tools/finding-tool.js.map +1 -0
- package/dist/tools/git-tool.d.ts +25 -7
- package/dist/tools/git-tool.d.ts.map +1 -1
- package/dist/tools/git-tool.js +155 -15
- package/dist/tools/git-tool.js.map +1 -1
- package/dist/tools/loop-project-context.d.ts.map +1 -1
- package/dist/tools/loop-project-context.js +16 -0
- package/dist/tools/loop-project-context.js.map +1 -1
- package/dist/tools/loop-route-feed.d.ts +57 -0
- package/dist/tools/loop-route-feed.d.ts.map +1 -0
- package/dist/tools/loop-route-feed.js +101 -0
- package/dist/tools/loop-route-feed.js.map +1 -0
- package/dist/tools/messaging-tools.d.ts +41 -11
- package/dist/tools/messaging-tools.d.ts.map +1 -1
- package/dist/tools/messaging-tools.js +104 -55
- package/dist/tools/messaging-tools.js.map +1 -1
- package/dist/tools/neutts-synth.d.ts +27 -3
- package/dist/tools/neutts-synth.d.ts.map +1 -1
- package/dist/tools/neutts-synth.js +57 -13
- package/dist/tools/neutts-synth.js.map +1 -1
- package/dist/tools/pipeline-tool.d.ts +43 -1
- package/dist/tools/pipeline-tool.d.ts.map +1 -1
- package/dist/tools/pipeline-tool.js +21 -4
- package/dist/tools/pipeline-tool.js.map +1 -1
- package/dist/tools/publish-tool.d.ts.map +1 -1
- package/dist/tools/publish-tool.js +76 -10
- package/dist/tools/publish-tool.js.map +1 -1
- package/dist/tools/read-extract.d.ts +116 -45
- package/dist/tools/read-extract.d.ts.map +1 -1
- package/dist/tools/read-extract.js +494 -158
- package/dist/tools/read-extract.js.map +1 -1
- package/dist/tools/registry.d.ts +23 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +196 -29
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-terminal.d.ts +9 -0
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +80 -2
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/subagent-refusal.d.ts +15 -0
- package/dist/tools/subagent-refusal.d.ts.map +1 -0
- package/dist/tools/subagent-refusal.js +18 -0
- package/dist/tools/subagent-refusal.js.map +1 -0
- package/dist/tools/subagent-spawner.d.ts +122 -0
- package/dist/tools/subagent-spawner.d.ts.map +1 -1
- package/dist/tools/subagent-spawner.js +249 -28
- package/dist/tools/subagent-spawner.js.map +1 -1
- package/dist/tools/tool-hooks.d.ts +177 -0
- package/dist/tools/tool-hooks.d.ts.map +1 -0
- package/dist/tools/tool-hooks.js +427 -0
- package/dist/tools/tool-hooks.js.map +1 -0
- package/dist/tools/tool-loop.d.ts +94 -5
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +315 -9
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/tool-refusal.d.ts +68 -0
- package/dist/tools/tool-refusal.d.ts.map +1 -0
- package/dist/tools/tool-refusal.js +78 -0
- package/dist/tools/tool-refusal.js.map +1 -0
- package/dist/tools/toolsets.d.ts +8 -0
- package/dist/tools/toolsets.d.ts.map +1 -1
- package/dist/tools/toolsets.js +14 -4
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/tools/vision-tools.d.ts +88 -83
- package/dist/tools/vision-tools.d.ts.map +1 -1
- package/dist/tools/vision-tools.js +134 -103
- package/dist/tools/vision-tools.js.map +1 -1
- package/dist/tools/worktree.d.ts +210 -0
- package/dist/tools/worktree.d.ts.map +1 -0
- package/dist/tools/worktree.js +374 -0
- package/dist/tools/worktree.js.map +1 -0
- package/dist/utils/format.d.ts +3 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +32 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/web-dashboard/attachment-extract.d.ts +64 -0
- package/dist/web-dashboard/attachment-extract.d.ts.map +1 -0
- package/dist/web-dashboard/attachment-extract.js +154 -0
- package/dist/web-dashboard/attachment-extract.js.map +1 -0
- package/dist/web-dashboard/chat-console.d.ts +108 -1
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +36 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/hub-data.d.ts +37 -0
- package/dist/web-dashboard/hub-data.d.ts.map +1 -1
- package/dist/web-dashboard/hub-data.js +61 -1
- package/dist/web-dashboard/hub-data.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +14 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +247 -13
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +196 -48
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/workflow/registry.js +1 -1
- package/dist/workflow/registry.js.map +1 -1
- package/package.json +22 -6
- package/src/web-dashboard/public/assets/{index-Cyd6tIew.css → index-XJjj2cBX.css} +1 -1
- package/src/web-dashboard/public/assets/index-YWF9FpwQ.js +207 -0
- package/src/web-dashboard/public/assets/index-YWF9FpwQ.js.map +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/dist/tools/child-agent-worker.js +0 -212
- package/src/web-dashboard/public/assets/index-CjvoBhlz.js +0 -207
- package/src/web-dashboard/public/assets/index-CjvoBhlz.js.map +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The route feed — what the model is TOLD about the model that is serving it.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. The loop's system prompt describes the tool surface, the
|
|
5
|
+
* project, and the contract, and it says nothing about the route. So when a user
|
|
6
|
+
* asks "which model are you?" — or when the model narrates its own run — the only
|
|
7
|
+
* available answers are a guess, the user's config (`nuviraconfig.json`, which is
|
|
8
|
+
* what the ROUTER reads, not what answered), or a model name from its own
|
|
9
|
+
* training data. All three are fabrications. On this machine the config pins
|
|
10
|
+
* `providers.groq.model = openai/gpt-oss-120b` while a run can be served by a
|
|
11
|
+
* Gemini model, a repaired replacement, or a local model after a failover; a
|
|
12
|
+
* model that answers from config is simply wrong, and confidently so.
|
|
13
|
+
*
|
|
14
|
+
* The fix is the one this repo already applies to every other claim: state the
|
|
15
|
+
* fact that was measured, at the moment it was measured. The loop re-reads this
|
|
16
|
+
* feed BEFORE EVERY MODEL CALL, so a mid-turn failover cannot leave the model
|
|
17
|
+
* believing it is still something it stopped being three steps ago.
|
|
18
|
+
*
|
|
19
|
+
* The rules that make it honest rather than decorative:
|
|
20
|
+
* - It is generated from the resolver's own result, never from config.
|
|
21
|
+
* - Unknown stays unknown: an unresolved route says so and forbids inventing one.
|
|
22
|
+
* - A substitution is NAMED, in both directions, because "the router quietly ran
|
|
23
|
+
* you on something else" is the defect (see the route resolver).
|
|
24
|
+
* - It tells the model what to do with the fact (answer from this line; if a user
|
|
25
|
+
* asks, quote it), because a fact with no instruction is a fact the model
|
|
26
|
+
* paraphrases into something else.
|
|
27
|
+
*/
|
|
28
|
+
/** Marker that identifies the feed inside the thread (used to replace it). */
|
|
29
|
+
export const ROUTE_FEED_MARKER = 'ROUTE — what is actually serving this turn';
|
|
30
|
+
/** Sentinel model values that mean "nothing was resolved". */
|
|
31
|
+
const UNRESOLVED = new Set(['', 'default', 'auto', 'unknown', 'undefined']);
|
|
32
|
+
export function isUnresolvedModel(model) {
|
|
33
|
+
return !model || UNRESOLVED.has(model);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The thread frame.
|
|
37
|
+
*
|
|
38
|
+
* `requested`/`substituted` and `previous` are all optional because they are all
|
|
39
|
+
* facts that may not exist yet; the frame degrades to fewer true lines rather
|
|
40
|
+
* than filling gaps.
|
|
41
|
+
*/
|
|
42
|
+
export function routeFeedText(route) {
|
|
43
|
+
const lines = [ROUTE_FEED_MARKER + ' (measured by the resolver, not a guess):'];
|
|
44
|
+
lines.push(`- provider: ${route.providerType || 'unknown'}${route.providerName && route.providerName !== route.providerType ? ` (${route.providerName})` : ''}`);
|
|
45
|
+
if (isUnresolvedModel(route.model)) {
|
|
46
|
+
lines.push('- model: UNRESOLVED — the provider chooses at call time. You do NOT know which model is answering.');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
lines.push(`- model: ${route.model}`);
|
|
50
|
+
}
|
|
51
|
+
if (route.requested && route.substituted) {
|
|
52
|
+
lines.push(`- requested: ${route.requested} → NOT available on ${route.providerType}; the router substituted ${route.model}. Say it that way if it comes up.`);
|
|
53
|
+
}
|
|
54
|
+
else if (route.requested && !route.substituted) {
|
|
55
|
+
lines.push(`- requested: ${route.requested} (served as asked)`);
|
|
56
|
+
}
|
|
57
|
+
if (route.previous && route.previous.length > 0) {
|
|
58
|
+
lines.push(`- earlier in this turn: ${route.previous.join(', ')} (a failover moved the work; the newest line above is the truth)`);
|
|
59
|
+
}
|
|
60
|
+
lines.push('- If the user asks which model/provider you are, answer from THIS line. If it says UNRESOLVED, say the route is unresolved — do not name a model from memory, from the user\'s config, or from an earlier step, and do not claim a model you have not been told about.');
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Record a NEW serving route, carrying the ones it replaced (bounded).
|
|
65
|
+
*
|
|
66
|
+
* The history is what turns "you are on local/gemma4:e4b" into the honest
|
|
67
|
+
* "steps 1-3 were answered by groq/openai/gpt-oss-120b, then it failed over" — a
|
|
68
|
+
* model told only the current pair will happily describe the whole turn as
|
|
69
|
+
* having been run by it.
|
|
70
|
+
*/
|
|
71
|
+
export function noteServedRoute(previous, next) {
|
|
72
|
+
const history = [...(previous?.previous ?? [])];
|
|
73
|
+
if (previous && !isUnresolvedModel(previous.model)) {
|
|
74
|
+
const pair = `${previous.providerType}/${previous.model}`;
|
|
75
|
+
const current = `${next.providerType}/${next.model}`;
|
|
76
|
+
if (pair !== current && !history.includes(pair))
|
|
77
|
+
history.push(pair);
|
|
78
|
+
}
|
|
79
|
+
const bounded = history.slice(-MAX_ROUTE_HISTORY);
|
|
80
|
+
return bounded.length > 0 ? { ...next, previous: bounded } : next;
|
|
81
|
+
}
|
|
82
|
+
/** Cap on remembered serving pairs — enough for a turn's failovers, not a log. */
|
|
83
|
+
export const MAX_ROUTE_HISTORY = 4;
|
|
84
|
+
/**
|
|
85
|
+
* Identity of a feed, for change detection. Two feeds with the same fingerprint
|
|
86
|
+
* render the same text, so the loop can skip a rewrite instead of churning the
|
|
87
|
+
* thread on every step.
|
|
88
|
+
*/
|
|
89
|
+
export function routeFeedFingerprint(route) {
|
|
90
|
+
if (!route)
|
|
91
|
+
return '';
|
|
92
|
+
return [
|
|
93
|
+
route.providerType || '',
|
|
94
|
+
route.providerName || '',
|
|
95
|
+
route.model || '',
|
|
96
|
+
route.requested || '',
|
|
97
|
+
route.substituted ? '1' : '0',
|
|
98
|
+
(route.previous || []).join('>'),
|
|
99
|
+
].join('|');
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=loop-route-feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-route-feed.js","sourceRoot":"","sources":["../../src/tools/loop-route-feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,24 @@
|
|
|
4
4
|
* Hermes equivalent: send_message_tool.py + react_to_message_tool.py + feishu_doc_tool.py + feishu_drive_tool.py
|
|
5
5
|
*
|
|
6
6
|
* Provides:
|
|
7
|
-
* -
|
|
8
|
-
* - React to messages
|
|
7
|
+
* - Message history bookkeeping for outbound sends
|
|
9
8
|
* - Feishu document integration
|
|
10
9
|
* - Feishu drive integration
|
|
10
|
+
*
|
|
11
|
+
* DOES NOT PROVIDE: delivery to Discord / Slack / Telegram / WhatsApp / Feishu /
|
|
12
|
+
* webhooks. Every one of those senders used to answer
|
|
13
|
+
* `{ success: true, messageId: '<platform>_<timestamp>' }` without contacting
|
|
14
|
+
* anything, and `reactToMessage` answered `{ success: true }` unconditionally —
|
|
15
|
+
* so an agent could tell the user, honestly from its own point of view, that a
|
|
16
|
+
* message had been delivered to a third party when nothing left the machine.
|
|
17
|
+
* The real, authorization-gated sender is `gateway_send`
|
|
18
|
+
* (`src/tools/gateway-send.ts`); it is the tool whose result the honesty guard in
|
|
19
|
+
* `tool-loop.ts` trusts. These senders now refuse with `not_configured` and name
|
|
20
|
+
* it, so the model is steered to the path that can actually deliver.
|
|
21
|
+
*
|
|
22
|
+
* See TOOL_TRUTHFULNESS_TRACKER.md (findings #3 and #9).
|
|
11
23
|
*/
|
|
24
|
+
import { type ToolRefusalCode } from './tool-refusal.js';
|
|
12
25
|
export interface MessageTarget {
|
|
13
26
|
/** Platform */
|
|
14
27
|
platform: 'discord' | 'slack' | 'telegram' | 'whatsapp' | 'feishu' | 'webhook';
|
|
@@ -78,23 +91,40 @@ export interface FeishuDriveFile {
|
|
|
78
91
|
/** Updated at */
|
|
79
92
|
updatedAt: number;
|
|
80
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* The result of an outbound send. `success: false` carries a typed `code` and the
|
|
96
|
+
* alternatives a caller can take instead — never a synthetic `messageId`.
|
|
97
|
+
*/
|
|
98
|
+
export interface SendResult {
|
|
99
|
+
success: boolean;
|
|
100
|
+
/** Present ONLY when a platform adapter actually delivered the message. */
|
|
101
|
+
messageId?: string;
|
|
102
|
+
code?: ToolRefusalCode;
|
|
103
|
+
alternatives?: string[];
|
|
104
|
+
error?: string;
|
|
105
|
+
}
|
|
81
106
|
export declare class MessagingManager {
|
|
82
107
|
private messageHistory;
|
|
108
|
+
/**
|
|
109
|
+
* The one refusal every platform sender returns: this manager has no adapter.
|
|
110
|
+
* Kept in a single place so a future reader cannot re-introduce a per-platform
|
|
111
|
+
* fake success without deleting the shared reason that explains why.
|
|
112
|
+
*/
|
|
113
|
+
private notConfigured;
|
|
83
114
|
/**
|
|
84
115
|
* Send a message to a platform.
|
|
116
|
+
*
|
|
117
|
+
* Records the attempt in history ONLY when a platform adapter reported success,
|
|
118
|
+
* so `getHistory()` can never list a message that was never delivered.
|
|
85
119
|
*/
|
|
86
|
-
sendMessage(target: MessageTarget, options: SendMessageOptions): Promise<
|
|
87
|
-
success: boolean;
|
|
88
|
-
messageId?: string;
|
|
89
|
-
error?: string;
|
|
90
|
-
}>;
|
|
120
|
+
sendMessage(target: MessageTarget, options: SendMessageOptions): Promise<SendResult>;
|
|
91
121
|
/**
|
|
92
122
|
* React to a message.
|
|
123
|
+
*
|
|
124
|
+
* No adapter exists for reactions, so this refuses. It used to return
|
|
125
|
+
* `{ success: true }` and the registry turned that into the string 'Reacted'.
|
|
93
126
|
*/
|
|
94
|
-
reactToMessage(platform: string, channelId: string, messageId: string, emoji: string): Promise<
|
|
95
|
-
success: boolean;
|
|
96
|
-
error?: string;
|
|
97
|
-
}>;
|
|
127
|
+
reactToMessage(platform: string, channelId: string, messageId: string, emoji: string): Promise<SendResult>;
|
|
98
128
|
/**
|
|
99
129
|
* Get message history.
|
|
100
130
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messaging-tools.d.ts","sourceRoot":"","sources":["../../src/tools/messaging-tools.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"messaging-tools.d.ts","sourceRoot":"","sources":["../../src/tools/messaging-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,55 +4,107 @@
|
|
|
4
4
|
* Hermes equivalent: send_message_tool.py + react_to_message_tool.py + feishu_doc_tool.py + feishu_drive_tool.py
|
|
5
5
|
*
|
|
6
6
|
* Provides:
|
|
7
|
-
* -
|
|
8
|
-
* - React to messages
|
|
7
|
+
* - Message history bookkeeping for outbound sends
|
|
9
8
|
* - Feishu document integration
|
|
10
9
|
* - Feishu drive integration
|
|
10
|
+
*
|
|
11
|
+
* DOES NOT PROVIDE: delivery to Discord / Slack / Telegram / WhatsApp / Feishu /
|
|
12
|
+
* webhooks. Every one of those senders used to answer
|
|
13
|
+
* `{ success: true, messageId: '<platform>_<timestamp>' }` without contacting
|
|
14
|
+
* anything, and `reactToMessage` answered `{ success: true }` unconditionally —
|
|
15
|
+
* so an agent could tell the user, honestly from its own point of view, that a
|
|
16
|
+
* message had been delivered to a third party when nothing left the machine.
|
|
17
|
+
* The real, authorization-gated sender is `gateway_send`
|
|
18
|
+
* (`src/tools/gateway-send.ts`); it is the tool whose result the honesty guard in
|
|
19
|
+
* `tool-loop.ts` trusts. These senders now refuse with `not_configured` and name
|
|
20
|
+
* it, so the model is steered to the path that can actually deliver.
|
|
21
|
+
*
|
|
22
|
+
* See TOOL_TRUTHFULNESS_TRACKER.md (findings #3 and #9).
|
|
11
23
|
*/
|
|
12
24
|
import { logger } from '../utils/logger.js';
|
|
25
|
+
import { refusalFields } from './tool-refusal.js';
|
|
13
26
|
// ─── Messaging Manager ────────────────────────────────────────────────────
|
|
14
27
|
export class MessagingManager {
|
|
15
28
|
messageHistory = [];
|
|
29
|
+
/**
|
|
30
|
+
* The one refusal every platform sender returns: this manager has no adapter.
|
|
31
|
+
* Kept in a single place so a future reader cannot re-introduce a per-platform
|
|
32
|
+
* fake success without deleting the shared reason that explains why.
|
|
33
|
+
*/
|
|
34
|
+
notConfigured(platform, channelId) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: `No messaging adapter is configured for ${platform} (channel ${channelId}), so nothing was sent. ` +
|
|
38
|
+
'Use gateway_send — it delivers through the configured gateway and returns an explicit sent/refused result.',
|
|
39
|
+
...refusalFields('not_configured', [
|
|
40
|
+
'gateway_send — sends via the configured gateway (WhatsApp / Telegram / Slack / Discord by name or number)',
|
|
41
|
+
'nuvira gateway send <platform:channel> <message> — the CLI equivalent',
|
|
42
|
+
]),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
16
45
|
/**
|
|
17
46
|
* Send a message to a platform.
|
|
47
|
+
*
|
|
48
|
+
* Records the attempt in history ONLY when a platform adapter reported success,
|
|
49
|
+
* so `getHistory()` can never list a message that was never delivered.
|
|
18
50
|
*/
|
|
19
51
|
async sendMessage(target, options) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
let result;
|
|
53
|
+
switch (target.platform) {
|
|
54
|
+
case 'discord':
|
|
55
|
+
result = await this.sendDiscord(target, options);
|
|
56
|
+
break;
|
|
57
|
+
case 'slack':
|
|
58
|
+
result = await this.sendSlack(target, options);
|
|
59
|
+
break;
|
|
60
|
+
case 'telegram':
|
|
61
|
+
result = await this.sendTelegram(target, options);
|
|
62
|
+
break;
|
|
63
|
+
case 'whatsapp':
|
|
64
|
+
result = await this.sendWhatsApp(target, options);
|
|
65
|
+
break;
|
|
66
|
+
case 'feishu':
|
|
67
|
+
result = await this.sendFeishu(target, options);
|
|
68
|
+
break;
|
|
69
|
+
case 'webhook':
|
|
70
|
+
result = await this.sendWebhook(target, options);
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
result = {
|
|
74
|
+
success: false,
|
|
75
|
+
error: `Unsupported platform: ${target.platform}`,
|
|
76
|
+
...refusalFields('unsupported_format'),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (result.success) {
|
|
80
|
+
this.messageHistory.push({
|
|
81
|
+
platform: target.platform,
|
|
82
|
+
channelId: target.channelId,
|
|
83
|
+
content: options.content,
|
|
84
|
+
timestamp: Date.now(),
|
|
85
|
+
messageId: result.messageId,
|
|
86
|
+
});
|
|
44
87
|
}
|
|
45
|
-
|
|
46
|
-
|
|
88
|
+
else {
|
|
89
|
+
logger.warn(`Messaging: refused ${target.platform} send to ${target.channelId} — ${result.error}`);
|
|
47
90
|
}
|
|
91
|
+
return result;
|
|
48
92
|
}
|
|
49
93
|
/**
|
|
50
94
|
* React to a message.
|
|
95
|
+
*
|
|
96
|
+
* No adapter exists for reactions, so this refuses. It used to return
|
|
97
|
+
* `{ success: true }` and the registry turned that into the string 'Reacted'.
|
|
51
98
|
*/
|
|
52
99
|
async reactToMessage(platform, channelId, messageId, emoji) {
|
|
53
|
-
logger.
|
|
54
|
-
|
|
55
|
-
|
|
100
|
+
logger.warn(`Messaging: reaction not sent (no adapter) — ${emoji} on ${messageId} in ${platform}/${channelId}`);
|
|
101
|
+
return {
|
|
102
|
+
success: false,
|
|
103
|
+
error: `No messaging adapter is configured for ${platform}, so the reaction was NOT applied to ${messageId}.`,
|
|
104
|
+
...refusalFields('not_configured', [
|
|
105
|
+
'Report the reaction as not sent, or send the message text instead via gateway_send',
|
|
106
|
+
]),
|
|
107
|
+
};
|
|
56
108
|
}
|
|
57
109
|
/**
|
|
58
110
|
* Get message history.
|
|
@@ -66,30 +118,27 @@ export class MessagingManager {
|
|
|
66
118
|
return history.slice(-limit);
|
|
67
119
|
}
|
|
68
120
|
// ─── Platform Handlers ─────────────────────────────────────────────
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
async sendWhatsApp(target,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
async sendWebhook(target, options) {
|
|
91
|
-
logger.info(`Webhook: Sending message to ${target.channelId}`);
|
|
92
|
-
return { success: true, messageId: `webhook_${Date.now()}` };
|
|
121
|
+
//
|
|
122
|
+
// Each returns `notConfigured(...)`. The per-platform shape is kept so a real
|
|
123
|
+
// adapter can be dropped in per platform without touching the dispatcher; until
|
|
124
|
+
// one exists, the honest answer is the same for all six.
|
|
125
|
+
async sendDiscord(target, _options) {
|
|
126
|
+
return this.notConfigured('discord', target.channelId);
|
|
127
|
+
}
|
|
128
|
+
async sendSlack(target, _options) {
|
|
129
|
+
return this.notConfigured('slack', target.channelId);
|
|
130
|
+
}
|
|
131
|
+
async sendTelegram(target, _options) {
|
|
132
|
+
return this.notConfigured('telegram', target.channelId);
|
|
133
|
+
}
|
|
134
|
+
async sendWhatsApp(target, _options) {
|
|
135
|
+
return this.notConfigured('whatsapp', target.channelId);
|
|
136
|
+
}
|
|
137
|
+
async sendFeishu(target, _options) {
|
|
138
|
+
return this.notConfigured('feishu', target.channelId);
|
|
139
|
+
}
|
|
140
|
+
async sendWebhook(target, _options) {
|
|
141
|
+
return this.notConfigured('webhook', target.channelId);
|
|
93
142
|
}
|
|
94
143
|
}
|
|
95
144
|
// ─── Feishu Document Manager ──────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messaging-tools.js","sourceRoot":"","sources":["../../src/tools/messaging-tools.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"messaging-tools.js","sourceRoot":"","sources":["../../src/tools/messaging-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NeuTTS Synthesis —
|
|
2
|
+
* NeuTTS Synthesis — text-to-speech.
|
|
3
3
|
*
|
|
4
4
|
* Hermes equivalent: neutts_synth.py (110 lines)
|
|
5
5
|
*
|
|
6
6
|
* Provides:
|
|
7
|
-
* -
|
|
7
|
+
* - API-backed synthesis when NEUTTS_API_KEY (or an injected key) is set
|
|
8
8
|
* - Multiple voice options
|
|
9
|
-
* - SSML support
|
|
10
9
|
* - Audio file output
|
|
10
|
+
*
|
|
11
|
+
* WHEN NO BACKEND IS CONFIGURED it does NOT fall back to writing audio: the old
|
|
12
|
+
* fallback wrote a valid, silent WAV (44-byte header + a zeroed sample buffer) and
|
|
13
|
+
* returned it as a successful synthesis with duration/voice/text metadata. Anything
|
|
14
|
+
* downstream — a gateway that sends the file, an agent that reports "the audio is
|
|
15
|
+
* ready" — then acted on silence that looked like speech. Silence is now an
|
|
16
|
+
* explicit opt-in (BUFF_NEUTTS_ALLOW_SILENT) and never the default.
|
|
17
|
+
*
|
|
18
|
+
* See TOOL_TRUTHFULNESS_TRACKER.md finding #5.
|
|
19
|
+
*/
|
|
20
|
+
import { type ToolRefusal } from './tool-refusal.js';
|
|
21
|
+
/**
|
|
22
|
+
* Whether a silent placeholder WAV may stand in for speech. Opt-in only
|
|
23
|
+
* (`BUFF_NEUTTS_ALLOW_SILENT=1`) — the point of the refusal is that silence must
|
|
24
|
+
* never be mistaken for synthesis. Exported for tests.
|
|
11
25
|
*/
|
|
26
|
+
export declare function allowSilentFallback(): boolean;
|
|
12
27
|
export interface NeuTTSConfig {
|
|
13
28
|
/** API key for NeuTTS */
|
|
14
29
|
apiKey?: string;
|
|
@@ -23,6 +38,15 @@ export interface SynthesisResult {
|
|
|
23
38
|
durationMs: number;
|
|
24
39
|
voice: string;
|
|
25
40
|
text: string;
|
|
41
|
+
ok: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* True when the audio is a silent placeholder rather than synthesised speech.
|
|
44
|
+
* Only ever set behind the BUFF_NEUTTS_ALLOW_SILENT opt-in.
|
|
45
|
+
*/
|
|
46
|
+
silent?: boolean;
|
|
47
|
+
code?: ToolRefusal['code'];
|
|
48
|
+
alternatives?: string[];
|
|
49
|
+
error?: string;
|
|
26
50
|
}
|
|
27
51
|
export declare class NeuTTSSynthesizer {
|
|
28
52
|
private config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neutts-synth.d.ts","sourceRoot":"","sources":["../../src/tools/neutts-synth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"neutts-synth.d.ts","sourceRoot":"","sources":["../../src/tools/neutts-synth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAG7C;AAID,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,GAAE,YAAiB;IAQrC;;OAEG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAChF,OAAO,CAAC,eAAe,CAAC;IA2C3B;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;YACW,eAAe;IAyC7B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAmBnF;AAMD,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,iBAAiB,CAG7E;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -1,19 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NeuTTS Synthesis —
|
|
2
|
+
* NeuTTS Synthesis — text-to-speech.
|
|
3
3
|
*
|
|
4
4
|
* Hermes equivalent: neutts_synth.py (110 lines)
|
|
5
5
|
*
|
|
6
6
|
* Provides:
|
|
7
|
-
* -
|
|
7
|
+
* - API-backed synthesis when NEUTTS_API_KEY (or an injected key) is set
|
|
8
8
|
* - Multiple voice options
|
|
9
|
-
* - SSML support
|
|
10
9
|
* - Audio file output
|
|
10
|
+
*
|
|
11
|
+
* WHEN NO BACKEND IS CONFIGURED it does NOT fall back to writing audio: the old
|
|
12
|
+
* fallback wrote a valid, silent WAV (44-byte header + a zeroed sample buffer) and
|
|
13
|
+
* returned it as a successful synthesis with duration/voice/text metadata. Anything
|
|
14
|
+
* downstream — a gateway that sends the file, an agent that reports "the audio is
|
|
15
|
+
* ready" — then acted on silence that looked like speech. Silence is now an
|
|
16
|
+
* explicit opt-in (BUFF_NEUTTS_ALLOW_SILENT) and never the default.
|
|
17
|
+
*
|
|
18
|
+
* See TOOL_TRUTHFULNESS_TRACKER.md finding #5.
|
|
11
19
|
*/
|
|
12
20
|
import { randomUUID } from 'node:crypto';
|
|
13
21
|
import { writeFile } from 'node:fs/promises';
|
|
14
22
|
import { join } from 'node:path';
|
|
15
23
|
import { tmpdir } from 'node:os';
|
|
16
24
|
import { logger } from '../utils/logger.js';
|
|
25
|
+
import { envBuff } from '../config/paths.js';
|
|
26
|
+
import { refusalFields } from './tool-refusal.js';
|
|
27
|
+
/**
|
|
28
|
+
* Whether a silent placeholder WAV may stand in for speech. Opt-in only
|
|
29
|
+
* (`BUFF_NEUTTS_ALLOW_SILENT=1`) — the point of the refusal is that silence must
|
|
30
|
+
* never be mistaken for synthesis. Exported for tests.
|
|
31
|
+
*/
|
|
32
|
+
export function allowSilentFallback() {
|
|
33
|
+
const v = envBuff('NEUTTS_ALLOW_SILENT');
|
|
34
|
+
return v === '1' || v === 'true' || v === 'yes';
|
|
35
|
+
}
|
|
17
36
|
// ─── NeuTTS Synthesizer ──────────────────────────────────────────────────
|
|
18
37
|
export class NeuTTSSynthesizer {
|
|
19
38
|
config;
|
|
@@ -33,17 +52,40 @@ export class NeuTTSSynthesizer {
|
|
|
33
52
|
const voice = options.voice || this.config.defaultVoice;
|
|
34
53
|
const format = options.format || 'wav';
|
|
35
54
|
const audioPath = join(this.outputDir, `${id}.${format}`);
|
|
36
|
-
//
|
|
55
|
+
// 1. The real backend, when one is configured.
|
|
56
|
+
let failureReason = 'No NeuTTS API key is configured (NEUTTS_API_KEY).';
|
|
37
57
|
if (this.config.apiKey) {
|
|
38
58
|
try {
|
|
39
59
|
return await this.synthesizeViaAPI(text, voice, audioPath, options);
|
|
40
60
|
}
|
|
41
61
|
catch (err) {
|
|
42
|
-
|
|
62
|
+
failureReason = `NeuTTS API synthesis failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
63
|
+
logger.warn(`[neutts] ${failureReason}`);
|
|
43
64
|
}
|
|
44
65
|
}
|
|
45
|
-
//
|
|
46
|
-
|
|
66
|
+
// 2. No real audio. Write a silent placeholder ONLY when the operator asked for
|
|
67
|
+
// it — a silent WAV reported as a successful synthesis is a lie the caller
|
|
68
|
+
// cannot detect, so it is never the default.
|
|
69
|
+
if (allowSilentFallback()) {
|
|
70
|
+
logger.warn(`[neutts] writing SILENT placeholder audio (BUFF_NEUTTS_ALLOW_SILENT is set) — ${failureReason}`);
|
|
71
|
+
return this.synthesizeLocal(text, voice, audioPath, options);
|
|
72
|
+
}
|
|
73
|
+
// 3. Refuse: say what is missing and what to use instead.
|
|
74
|
+
const reason = `No speech was synthesised. ${failureReason}`;
|
|
75
|
+
logger.warn(`[neutts] synthesis refused — ${failureReason}`);
|
|
76
|
+
return {
|
|
77
|
+
id,
|
|
78
|
+
audioPath: '',
|
|
79
|
+
durationMs: 0,
|
|
80
|
+
voice,
|
|
81
|
+
text,
|
|
82
|
+
ok: false,
|
|
83
|
+
error: reason,
|
|
84
|
+
...refusalFields('not_configured', [
|
|
85
|
+
'Set NEUTTS_API_KEY to enable API-backed synthesis',
|
|
86
|
+
'Use the `speak` tool — it uses the configured local TTS backend (piper) when available',
|
|
87
|
+
]),
|
|
88
|
+
};
|
|
47
89
|
}
|
|
48
90
|
/**
|
|
49
91
|
* Synthesize via external API.
|
|
@@ -74,6 +116,7 @@ export class NeuTTSSynthesizer {
|
|
|
74
116
|
durationMs: Math.round((buffer.byteLength / (16000 * 2)) * 1000),
|
|
75
117
|
voice,
|
|
76
118
|
text,
|
|
119
|
+
ok: true,
|
|
77
120
|
};
|
|
78
121
|
}
|
|
79
122
|
/**
|
|
@@ -106,6 +149,9 @@ export class NeuTTSSynthesizer {
|
|
|
106
149
|
durationMs: Math.round(durationSec * 1000),
|
|
107
150
|
voice,
|
|
108
151
|
text,
|
|
152
|
+
ok: true,
|
|
153
|
+
// Flagged so a caller (or the user) can see the file is silence, not speech.
|
|
154
|
+
silent: true,
|
|
109
155
|
};
|
|
110
156
|
}
|
|
111
157
|
/**
|
|
@@ -125,12 +171,10 @@ export class NeuTTSSynthesizer {
|
|
|
125
171
|
// Ignore
|
|
126
172
|
}
|
|
127
173
|
}
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
{ id: 'male-1', name: 'Male 1', language: 'en-US' },
|
|
133
|
-
];
|
|
174
|
+
// No backend → no voices. This used to return three invented voice ids
|
|
175
|
+
// ('default', 'female-1', 'male-1') that no configured backend could honour, so
|
|
176
|
+
// a caller could pick one and only discover it was fictitious after synthesis.
|
|
177
|
+
return [];
|
|
134
178
|
}
|
|
135
179
|
}
|
|
136
180
|
// ─── Singleton ─────────────────────────────────────────────────────────────
|