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
|
@@ -1,64 +1,60 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vision Tools —
|
|
2
|
+
* Vision Tools — image analysis backed by a REAL engine, or a typed refusal.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* What is real here, and what is not:
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
6
|
+
* - `analyze` reports the image's actual format and pixel dimensions (parsed from
|
|
7
|
+
* the PNG/JPEG/GIF/BMP headers) and, when a vision backend is configured,
|
|
8
|
+
* a genuine description from it.
|
|
9
|
+
* - `ocr` transcribes an image through the configured vision model
|
|
10
|
+
* (`./modality/vision.js` — a local Ollama vision model such as llava /
|
|
11
|
+
* llama3.2-vision, or Gemini when a key is set). A vision-model transcription
|
|
12
|
+
* is not a confidence-scored OCR engine, so the result says which engine ran
|
|
13
|
+
* and never invents a `confidence` number.
|
|
14
|
+
* - `detect-elements`, `find-element` and `compare` have **no backend** and refuse
|
|
15
|
+
* with `not_configured`. They previously returned `[]` / `{similarity: 0}` —
|
|
16
|
+
* empty-but-valid payloads that read as "ran, found nothing", which is the same
|
|
17
|
+
* class of defect as the `read_extract` PDF stub.
|
|
18
|
+
*
|
|
19
|
+
* The registry's `vision` tool ("analyze images, extract text via OCR, detect UI
|
|
20
|
+
* elements") pointed at this file while `describe_image` pointed at the real
|
|
21
|
+
* engine — two tools for one capability, one of them a stub. See
|
|
22
|
+
* TOOL_TRUTHFULNESS_TRACKER.md finding #6.
|
|
11
23
|
*/
|
|
24
|
+
import { type VisionOptions } from './modality/vision.js';
|
|
25
|
+
import { type ToolRefusalCode } from './tool-refusal.js';
|
|
12
26
|
export interface ImageAnalysis {
|
|
13
27
|
/** Image path */
|
|
14
28
|
path: string;
|
|
15
|
-
/**
|
|
29
|
+
/** Real pixel dimensions, or {0,0} when the header could not be parsed */
|
|
16
30
|
dimensions: {
|
|
17
31
|
width: number;
|
|
18
32
|
height: number;
|
|
19
33
|
};
|
|
20
34
|
/** Image format */
|
|
21
35
|
format: string;
|
|
22
|
-
/**
|
|
23
|
-
elements: DetectedElement[];
|
|
24
|
-
/** OCR text */
|
|
25
|
-
ocrText?: string;
|
|
26
|
-
/** Description */
|
|
36
|
+
/** Description text — from the vision backend when one is configured, else the metadata line */
|
|
27
37
|
description: string;
|
|
28
38
|
/** Tags */
|
|
29
39
|
tags: string[];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
height: number;
|
|
40
|
-
};
|
|
41
|
-
/** Element text */
|
|
42
|
-
text?: string;
|
|
43
|
-
/** Confidence score */
|
|
44
|
-
confidence: number;
|
|
40
|
+
/** Whether the analysis ran (a failed read is `ok: false`, never an empty success) */
|
|
41
|
+
ok: boolean;
|
|
42
|
+
/** Which engine produced `description` */
|
|
43
|
+
via?: 'vision-model' | 'metadata';
|
|
44
|
+
/** Explains what was NOT done, when a capability is missing */
|
|
45
|
+
note?: string;
|
|
46
|
+
code?: ToolRefusalCode;
|
|
47
|
+
alternatives?: string[];
|
|
48
|
+
error?: string;
|
|
45
49
|
}
|
|
46
50
|
export interface OCRResult {
|
|
47
|
-
/** Extracted text */
|
|
48
51
|
text: string;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
x: number;
|
|
56
|
-
y: number;
|
|
57
|
-
width: number;
|
|
58
|
-
height: number;
|
|
59
|
-
};
|
|
60
|
-
confidence: number;
|
|
61
|
-
}>;
|
|
52
|
+
ok: boolean;
|
|
53
|
+
/** The engine that produced the text — absent when nothing ran */
|
|
54
|
+
via?: 'vision-model';
|
|
55
|
+
code?: ToolRefusalCode;
|
|
56
|
+
alternatives?: string[];
|
|
57
|
+
error?: string;
|
|
62
58
|
}
|
|
63
59
|
export interface UIElement {
|
|
64
60
|
/** Element type */
|
|
@@ -77,65 +73,74 @@ export interface UIElement {
|
|
|
77
73
|
/** Is interactive */
|
|
78
74
|
interactive: boolean;
|
|
79
75
|
}
|
|
76
|
+
export interface DetectElementsResult {
|
|
77
|
+
ok: boolean;
|
|
78
|
+
elements: UIElement[];
|
|
79
|
+
code?: ToolRefusalCode;
|
|
80
|
+
alternatives?: string[];
|
|
81
|
+
error?: string;
|
|
82
|
+
}
|
|
83
|
+
export interface CompareResult {
|
|
84
|
+
ok: boolean;
|
|
85
|
+
similarity?: number;
|
|
86
|
+
differences?: Array<{
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
width: number;
|
|
90
|
+
height: number;
|
|
91
|
+
}>;
|
|
92
|
+
code?: ToolRefusalCode;
|
|
93
|
+
alternatives?: string[];
|
|
94
|
+
error?: string;
|
|
95
|
+
}
|
|
80
96
|
export declare class VisionAnalyzer {
|
|
81
97
|
/**
|
|
82
|
-
* Analyze an image
|
|
98
|
+
* Analyze an image: real format + dimensions always, plus a real description
|
|
99
|
+
* when a vision backend is available.
|
|
83
100
|
*/
|
|
84
|
-
analyze(imagePath: string): Promise<ImageAnalysis>;
|
|
101
|
+
analyze(imagePath: string, opts?: VisionOptions): Promise<ImageAnalysis>;
|
|
85
102
|
/**
|
|
86
|
-
*
|
|
103
|
+
* Transcribe the text in an image through the configured vision model.
|
|
104
|
+
*
|
|
105
|
+
* Refuses when no backend is configured — it never returns an empty string as
|
|
106
|
+
* if the image simply contained no text.
|
|
87
107
|
*/
|
|
88
|
-
ocr(imagePath: string): Promise<OCRResult>;
|
|
108
|
+
ocr(imagePath: string, opts?: VisionOptions): Promise<OCRResult>;
|
|
89
109
|
/**
|
|
90
110
|
* Detect UI elements in a screenshot.
|
|
111
|
+
*
|
|
112
|
+
* There is no detector backend (no ML model, no DOM access from a raster image),
|
|
113
|
+
* so this refuses rather than returning an empty element list.
|
|
91
114
|
*/
|
|
92
|
-
detectUIElements(imagePath: string): Promise<
|
|
115
|
+
detectUIElements(imagePath: string): Promise<DetectElementsResult>;
|
|
93
116
|
/**
|
|
94
117
|
* Compare two images.
|
|
118
|
+
*
|
|
119
|
+
* No pixel-diff or embedding backend is wired up, so this refuses. It used to
|
|
120
|
+
* return `{ similarity: 0, differences: [] }`, which reads as "identical images
|
|
121
|
+
* with no differences" — the opposite of what it knew.
|
|
95
122
|
*/
|
|
96
|
-
compare(imagePath1: string, imagePath2: string): Promise<
|
|
97
|
-
similarity: number;
|
|
98
|
-
differences: Array<{
|
|
99
|
-
x: number;
|
|
100
|
-
y: number;
|
|
101
|
-
width: number;
|
|
102
|
-
height: number;
|
|
103
|
-
}>;
|
|
104
|
-
}>;
|
|
123
|
+
compare(imagePath1: string, imagePath2: string): Promise<CompareResult>;
|
|
105
124
|
/**
|
|
106
|
-
* Extract text from a screenshot
|
|
125
|
+
* Extract text from a screenshot (thin alias over `ocr`, kept for callers that
|
|
126
|
+
* expect a bare string). A refusal yields an empty string — prefer `ocr` when
|
|
127
|
+
* you need to tell "no text in the image" apart from "no backend configured".
|
|
107
128
|
*/
|
|
108
|
-
extractText(imagePath: string): Promise<string>;
|
|
129
|
+
extractText(imagePath: string, opts?: VisionOptions): Promise<string>;
|
|
109
130
|
/**
|
|
110
|
-
* Find element
|
|
131
|
+
* Find an element whose text matches. Refuses for the same reason as
|
|
132
|
+
* `detectUIElements` — there is no detector to search.
|
|
111
133
|
*/
|
|
112
134
|
findElementByText(imagePath: string, text: string): Promise<UIElement | null>;
|
|
113
135
|
/**
|
|
114
|
-
* Get image dimensions (
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
export declare class ScreenshotAnalyzer {
|
|
119
|
-
private analyzer;
|
|
120
|
-
constructor();
|
|
121
|
-
/**
|
|
122
|
-
* Analyze a browser screenshot.
|
|
136
|
+
* Get image dimensions from the format header (PNG / JPEG / GIF / BMP).
|
|
137
|
+
* Returns {0,0} when the header is not one of those — an unknown size, never a
|
|
138
|
+
* guessed one.
|
|
123
139
|
*/
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}>;
|
|
129
|
-
/**
|
|
130
|
-
* Find clickable elements.
|
|
131
|
-
*/
|
|
132
|
-
findClickableElements(screenshotPath: string): Promise<UIElement[]>;
|
|
133
|
-
/**
|
|
134
|
-
* Generate automation instructions.
|
|
135
|
-
*/
|
|
136
|
-
generateAutomationInstructions(screenshotPath: string, goal: string): Promise<string[]>;
|
|
137
|
-
private inferLayout;
|
|
140
|
+
getImageDimensions(buffer: Buffer, format: string): {
|
|
141
|
+
width: number;
|
|
142
|
+
height: number;
|
|
143
|
+
};
|
|
138
144
|
}
|
|
139
145
|
export declare function getVisionAnalyzer(): VisionAnalyzer;
|
|
140
|
-
export declare function getScreenshotAnalyzer(): ScreenshotAnalyzer;
|
|
141
146
|
//# sourceMappingURL=vision-tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision-tools.d.ts","sourceRoot":"","sources":["../../src/tools/vision-tools.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vision-tools.d.ts","sourceRoot":"","sources":["../../src/tools/vision-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vision Tools —
|
|
2
|
+
* Vision Tools — image analysis backed by a REAL engine, or a typed refusal.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* What is real here, and what is not:
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
6
|
+
* - `analyze` reports the image's actual format and pixel dimensions (parsed from
|
|
7
|
+
* the PNG/JPEG/GIF/BMP headers) and, when a vision backend is configured,
|
|
8
|
+
* a genuine description from it.
|
|
9
|
+
* - `ocr` transcribes an image through the configured vision model
|
|
10
|
+
* (`./modality/vision.js` — a local Ollama vision model such as llava /
|
|
11
|
+
* llama3.2-vision, or Gemini when a key is set). A vision-model transcription
|
|
12
|
+
* is not a confidence-scored OCR engine, so the result says which engine ran
|
|
13
|
+
* and never invents a `confidence` number.
|
|
14
|
+
* - `detect-elements`, `find-element` and `compare` have **no backend** and refuse
|
|
15
|
+
* with `not_configured`. They previously returned `[]` / `{similarity: 0}` —
|
|
16
|
+
* empty-but-valid payloads that read as "ran, found nothing", which is the same
|
|
17
|
+
* class of defect as the `read_extract` PDF stub.
|
|
18
|
+
*
|
|
19
|
+
* The registry's `vision` tool ("analyze images, extract text via OCR, detect UI
|
|
20
|
+
* elements") pointed at this file while `describe_image` pointed at the real
|
|
21
|
+
* engine — two tools for one capability, one of them a stub. See
|
|
22
|
+
* TOOL_TRUTHFULNESS_TRACKER.md finding #6.
|
|
11
23
|
*/
|
|
12
24
|
import { readFile } from 'node:fs/promises';
|
|
13
25
|
import { extname } from 'node:path';
|
|
26
|
+
import { describeImage, isVisionAvailable } from './modality/vision.js';
|
|
27
|
+
import { refuse } from './tool-refusal.js';
|
|
28
|
+
/**
|
|
29
|
+
* Render a `ToolRefusal` into this module's result shape — the message field here
|
|
30
|
+
* is named `error` rather than `reason`, so the mapping is explicit instead of
|
|
31
|
+
* spreading `refuse()` output and ending up with an undeclared `reason` key.
|
|
32
|
+
*/
|
|
33
|
+
function asVisionRefusal(r) {
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
code: r.code,
|
|
37
|
+
error: r.reason,
|
|
38
|
+
...(r.alternatives ? { alternatives: r.alternatives } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Prompt used for OCR-via-vision-model. Asks for the text ONLY, no commentary. */
|
|
42
|
+
const OCR_PROMPT = 'Transcribe ALL visible text in this image exactly as it appears, preserving line breaks and any table '
|
|
43
|
+
+ 'rows/columns. Output only the transcription, with no preamble and no commentary.';
|
|
44
|
+
/** What a user can do when no vision backend is configured. */
|
|
45
|
+
const VISION_SETUP_ALTERNATIVES = [
|
|
46
|
+
'Configure a vision backend: a local Ollama vision model (llava / llama3.2-vision) or a Gemini API key',
|
|
47
|
+
'Ask the user to paste the text instead',
|
|
48
|
+
];
|
|
14
49
|
// ─── Vision Analyzer ──────────────────────────────────────────────────────
|
|
15
50
|
export class VisionAnalyzer {
|
|
16
51
|
/**
|
|
17
|
-
* Analyze an image
|
|
52
|
+
* Analyze an image: real format + dimensions always, plus a real description
|
|
53
|
+
* when a vision backend is available.
|
|
18
54
|
*/
|
|
19
|
-
async analyze(imagePath) {
|
|
55
|
+
async analyze(imagePath, opts = {}) {
|
|
20
56
|
const ext = extname(imagePath).toLowerCase();
|
|
21
57
|
const content = await readFile(imagePath).catch(() => null);
|
|
22
58
|
if (!content) {
|
|
@@ -24,63 +60,128 @@ export class VisionAnalyzer {
|
|
|
24
60
|
path: imagePath,
|
|
25
61
|
dimensions: { width: 0, height: 0 },
|
|
26
62
|
format: ext.slice(1) || 'unknown',
|
|
27
|
-
|
|
28
|
-
description: 'Failed to read image',
|
|
63
|
+
description: `Could not read the image at ${imagePath}.`,
|
|
29
64
|
tags: [],
|
|
65
|
+
ok: false,
|
|
66
|
+
code: 'no_data',
|
|
67
|
+
error: `Could not read image: ${imagePath}`,
|
|
68
|
+
alternatives: ['Check the path and that the file is a readable image'],
|
|
30
69
|
};
|
|
31
70
|
}
|
|
32
|
-
// Basic image info
|
|
33
71
|
const format = ext.slice(1) || 'unknown';
|
|
34
72
|
const dimensions = this.getImageDimensions(content, format);
|
|
73
|
+
const metadataLine = `Image: ${format.toUpperCase()} (${dimensions.width}x${dimensions.height})`;
|
|
74
|
+
// Prefer a real description when a backend exists; otherwise report honestly
|
|
75
|
+
// that only the metadata was read.
|
|
76
|
+
if (await isVisionAvailable(opts)) {
|
|
77
|
+
const described = await describeImage(imagePath, undefined, opts);
|
|
78
|
+
if (described.ok && described.description) {
|
|
79
|
+
return {
|
|
80
|
+
path: imagePath,
|
|
81
|
+
dimensions,
|
|
82
|
+
format,
|
|
83
|
+
description: described.description,
|
|
84
|
+
tags: [format],
|
|
85
|
+
ok: true,
|
|
86
|
+
via: 'vision-model',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
path: imagePath,
|
|
91
|
+
dimensions,
|
|
92
|
+
format,
|
|
93
|
+
description: metadataLine,
|
|
94
|
+
tags: [format],
|
|
95
|
+
ok: true,
|
|
96
|
+
via: 'metadata',
|
|
97
|
+
note: `The vision backend was configured but failed (${described.error ?? 'unknown error'}), so only image metadata was read.`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
35
100
|
return {
|
|
36
101
|
path: imagePath,
|
|
37
102
|
dimensions,
|
|
38
103
|
format,
|
|
39
|
-
|
|
40
|
-
description: `Image: ${format.toUpperCase()} (${dimensions.width}x${dimensions.height})`,
|
|
104
|
+
description: metadataLine,
|
|
41
105
|
tags: [format],
|
|
106
|
+
ok: true,
|
|
107
|
+
via: 'metadata',
|
|
108
|
+
note: 'No vision backend is configured, so only image metadata was read — no description of the contents.',
|
|
109
|
+
alternatives: VISION_SETUP_ALTERNATIVES,
|
|
42
110
|
};
|
|
43
111
|
}
|
|
44
112
|
/**
|
|
45
|
-
*
|
|
113
|
+
* Transcribe the text in an image through the configured vision model.
|
|
114
|
+
*
|
|
115
|
+
* Refuses when no backend is configured — it never returns an empty string as
|
|
116
|
+
* if the image simply contained no text.
|
|
46
117
|
*/
|
|
47
|
-
async ocr(imagePath) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
118
|
+
async ocr(imagePath, opts = {}) {
|
|
119
|
+
if (!(await isVisionAvailable(opts))) {
|
|
120
|
+
return {
|
|
121
|
+
text: '',
|
|
122
|
+
...asVisionRefusal(refuse('not_configured', 'No vision backend is configured (a local Ollama vision model such as llava/llama3.2-vision, or a Gemini API key), so no text could be read from the image.', VISION_SETUP_ALTERNATIVES)),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const described = await describeImage(imagePath, OCR_PROMPT, opts);
|
|
126
|
+
if (!described.ok || described.description === undefined) {
|
|
127
|
+
return {
|
|
128
|
+
text: '',
|
|
129
|
+
...asVisionRefusal(refuse('unavailable', `The vision backend could not read ${imagePath}: ${described.error ?? 'no output'}`, ['Retry once — a local vision model can time out on a large image'])),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return { text: described.description.trim(), ok: true, via: 'vision-model' };
|
|
54
133
|
}
|
|
55
134
|
/**
|
|
56
135
|
* Detect UI elements in a screenshot.
|
|
136
|
+
*
|
|
137
|
+
* There is no detector backend (no ML model, no DOM access from a raster image),
|
|
138
|
+
* so this refuses rather than returning an empty element list.
|
|
57
139
|
*/
|
|
58
140
|
async detectUIElements(imagePath) {
|
|
59
|
-
|
|
60
|
-
|
|
141
|
+
return {
|
|
142
|
+
elements: [],
|
|
143
|
+
...asVisionRefusal(refuse('not_configured', `UI-element detection has no backend — it needs a DOM or an ML detector, and neither is wired up, so no elements were detected in ${imagePath}.`, [
|
|
144
|
+
'Use the browser tools (browser / browser_supervisor) to query the live DOM instead of a screenshot',
|
|
145
|
+
'Use describe_image to get a prose description of the screenshot',
|
|
146
|
+
])),
|
|
147
|
+
};
|
|
61
148
|
}
|
|
62
149
|
/**
|
|
63
150
|
* Compare two images.
|
|
151
|
+
*
|
|
152
|
+
* No pixel-diff or embedding backend is wired up, so this refuses. It used to
|
|
153
|
+
* return `{ similarity: 0, differences: [] }`, which reads as "identical images
|
|
154
|
+
* with no differences" — the opposite of what it knew.
|
|
64
155
|
*/
|
|
65
156
|
async compare(imagePath1, imagePath2) {
|
|
66
|
-
return
|
|
157
|
+
return asVisionRefusal(refuse('not_configured', `Image comparison has no backend, so ${imagePath1} and ${imagePath2} were NOT compared.`, [
|
|
158
|
+
'Describe both images with describe_image and compare the descriptions',
|
|
159
|
+
'Compare the files byte-wise if you only need to know whether they differ',
|
|
160
|
+
]));
|
|
67
161
|
}
|
|
68
162
|
/**
|
|
69
|
-
* Extract text from a screenshot
|
|
163
|
+
* Extract text from a screenshot (thin alias over `ocr`, kept for callers that
|
|
164
|
+
* expect a bare string). A refusal yields an empty string — prefer `ocr` when
|
|
165
|
+
* you need to tell "no text in the image" apart from "no backend configured".
|
|
70
166
|
*/
|
|
71
|
-
async extractText(imagePath) {
|
|
72
|
-
const result = await this.ocr(imagePath);
|
|
167
|
+
async extractText(imagePath, opts = {}) {
|
|
168
|
+
const result = await this.ocr(imagePath, opts);
|
|
73
169
|
return result.text;
|
|
74
170
|
}
|
|
75
171
|
/**
|
|
76
|
-
* Find element
|
|
172
|
+
* Find an element whose text matches. Refuses for the same reason as
|
|
173
|
+
* `detectUIElements` — there is no detector to search.
|
|
77
174
|
*/
|
|
78
175
|
async findElementByText(imagePath, text) {
|
|
79
|
-
const
|
|
80
|
-
|
|
176
|
+
const result = await this.detectUIElements(imagePath);
|
|
177
|
+
if (!result.ok)
|
|
178
|
+
return null;
|
|
179
|
+
return result.elements.find((e) => e.text?.toLowerCase().includes(text.toLowerCase())) || null;
|
|
81
180
|
}
|
|
82
181
|
/**
|
|
83
|
-
* Get image dimensions (
|
|
182
|
+
* Get image dimensions from the format header (PNG / JPEG / GIF / BMP).
|
|
183
|
+
* Returns {0,0} when the header is not one of those — an unknown size, never a
|
|
184
|
+
* guessed one.
|
|
84
185
|
*/
|
|
85
186
|
getImageDimensions(buffer, format) {
|
|
86
187
|
// PNG header
|
|
@@ -89,7 +190,7 @@ export class VisionAnalyzer {
|
|
|
89
190
|
const height = buffer.readUInt32BE(20);
|
|
90
191
|
return { width, height };
|
|
91
192
|
}
|
|
92
|
-
// JPEG header (
|
|
193
|
+
// JPEG header (search the SOF marker)
|
|
93
194
|
if (format === 'jpeg' || format === 'jpg') {
|
|
94
195
|
let offset = 2;
|
|
95
196
|
while (offset < buffer.length - 1) {
|
|
@@ -123,81 +224,11 @@ export class VisionAnalyzer {
|
|
|
123
224
|
return { width: 0, height: 0 };
|
|
124
225
|
}
|
|
125
226
|
}
|
|
126
|
-
// ─── Screenshot Analyzer ──────────────────────────────────────────────────
|
|
127
|
-
export class ScreenshotAnalyzer {
|
|
128
|
-
analyzer;
|
|
129
|
-
constructor() {
|
|
130
|
-
this.analyzer = new VisionAnalyzer();
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Analyze a browser screenshot.
|
|
134
|
-
*/
|
|
135
|
-
async analyzeBrowserScreenshot(screenshotPath) {
|
|
136
|
-
const elements = await this.analyzer.detectUIElements(screenshotPath);
|
|
137
|
-
const text = await this.analyzer.extractText(screenshotPath);
|
|
138
|
-
return {
|
|
139
|
-
elements,
|
|
140
|
-
text,
|
|
141
|
-
layout: this.inferLayout(elements),
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Find clickable elements.
|
|
146
|
-
*/
|
|
147
|
-
async findClickableElements(screenshotPath) {
|
|
148
|
-
const elements = await this.analyzer.detectUIElements(screenshotPath);
|
|
149
|
-
return elements.filter((e) => e.interactive);
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Generate automation instructions.
|
|
153
|
-
*/
|
|
154
|
-
async generateAutomationInstructions(screenshotPath, goal) {
|
|
155
|
-
const elements = await this.analyzer.detectUIElements(screenshotPath);
|
|
156
|
-
const instructions = [];
|
|
157
|
-
// Simple heuristic-based instruction generation
|
|
158
|
-
const buttons = elements.filter((e) => e.type === 'button');
|
|
159
|
-
const inputs = elements.filter((e) => e.type === 'input');
|
|
160
|
-
const links = elements.filter((e) => e.type === 'link');
|
|
161
|
-
if (goal.toLowerCase().includes('click')) {
|
|
162
|
-
for (const btn of buttons) {
|
|
163
|
-
if (btn.text)
|
|
164
|
-
instructions.push(`Click button "${btn.text}"`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (goal.toLowerCase().includes('type') || goal.toLowerCase().includes('enter')) {
|
|
168
|
-
for (const input of inputs) {
|
|
169
|
-
instructions.push(`Type in ${input.text || 'input field'}`);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
if (goal.toLowerCase().includes('navigate')) {
|
|
173
|
-
for (const link of links) {
|
|
174
|
-
if (link.text)
|
|
175
|
-
instructions.push(`Click link "${link.text}"`);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return instructions;
|
|
179
|
-
}
|
|
180
|
-
inferLayout(elements) {
|
|
181
|
-
if (elements.length === 0)
|
|
182
|
-
return 'empty';
|
|
183
|
-
if (elements.length > 20)
|
|
184
|
-
return 'dense';
|
|
185
|
-
if (elements.some((e) => e.type === 'container'))
|
|
186
|
-
return 'structured';
|
|
187
|
-
return 'simple';
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
227
|
// ─── Singletons ───────────────────────────────────────────────────────────
|
|
191
228
|
let _visionAnalyzer = null;
|
|
192
|
-
let _screenshotAnalyzer = null;
|
|
193
229
|
export function getVisionAnalyzer() {
|
|
194
230
|
if (!_visionAnalyzer)
|
|
195
231
|
_visionAnalyzer = new VisionAnalyzer();
|
|
196
232
|
return _visionAnalyzer;
|
|
197
233
|
}
|
|
198
|
-
export function getScreenshotAnalyzer() {
|
|
199
|
-
if (!_screenshotAnalyzer)
|
|
200
|
-
_screenshotAnalyzer = new ScreenshotAnalyzer();
|
|
201
|
-
return _screenshotAnalyzer;
|
|
202
|
-
}
|
|
203
234
|
//# sourceMappingURL=vision-tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision-tools.js","sourceRoot":"","sources":["../../src/tools/vision-tools.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vision-tools.js","sourceRoot":"","sources":["../../src/tools/vision-tools.ts"],"names":[],"mappings":"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"}
|