@zhin.js/agent 0.1.29 → 0.1.31
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 +48 -23
- package/lib/agent-prompt/resolver.d.ts.map +1 -1
- package/lib/agent-prompt/resolver.js +0 -1
- package/lib/agent-prompt/resolver.js.map +1 -1
- package/lib/assistant/config.d.ts +67 -0
- package/lib/assistant/config.d.ts.map +1 -0
- package/lib/assistant/config.js +47 -0
- package/lib/assistant/config.js.map +1 -0
- package/lib/assistant/domains/home-assistant.d.ts +37 -0
- package/lib/assistant/domains/home-assistant.d.ts.map +1 -0
- package/lib/assistant/domains/home-assistant.js +113 -0
- package/lib/assistant/domains/home-assistant.js.map +1 -0
- package/lib/assistant/event-ingress.d.ts +28 -0
- package/lib/assistant/event-ingress.d.ts.map +1 -0
- package/lib/assistant/event-ingress.js +132 -0
- package/lib/assistant/event-ingress.js.map +1 -0
- package/lib/assistant/event-types.d.ts +28 -0
- package/lib/assistant/event-types.d.ts.map +1 -0
- package/lib/assistant/event-types.js +2 -0
- package/lib/assistant/event-types.js.map +1 -0
- package/lib/assistant/home-config.d.ts +36 -0
- package/lib/assistant/home-config.d.ts.map +1 -0
- package/lib/assistant/home-config.js +21 -0
- package/lib/assistant/home-config.js.map +1 -0
- package/lib/assistant/home-mcp-bridge.d.ts +12 -0
- package/lib/assistant/home-mcp-bridge.d.ts.map +1 -0
- package/lib/assistant/home-mcp-bridge.js +26 -0
- package/lib/assistant/home-mcp-bridge.js.map +1 -0
- package/lib/assistant/home-policy.d.ts +16 -0
- package/lib/assistant/home-policy.d.ts.map +1 -0
- package/lib/assistant/home-policy.js +46 -0
- package/lib/assistant/home-policy.js.map +1 -0
- package/lib/assistant/home-tools.d.ts +15 -0
- package/lib/assistant/home-tools.d.ts.map +1 -0
- package/lib/assistant/home-tools.js +141 -0
- package/lib/assistant/home-tools.js.map +1 -0
- package/lib/assistant/index.d.ts +31 -0
- package/lib/assistant/index.d.ts.map +1 -0
- package/lib/assistant/index.js +18 -0
- package/lib/assistant/index.js.map +1 -0
- package/lib/assistant/job-engine.d.ts +40 -0
- package/lib/assistant/job-engine.d.ts.map +1 -0
- package/lib/assistant/job-engine.js +155 -0
- package/lib/assistant/job-engine.js.map +1 -0
- package/lib/assistant/job-scheduler.d.ts +6 -0
- package/lib/assistant/job-scheduler.d.ts.map +1 -0
- package/lib/assistant/job-scheduler.js +59 -0
- package/lib/assistant/job-scheduler.js.map +1 -0
- package/lib/assistant/job-store.d.ts +55 -0
- package/lib/assistant/job-store.d.ts.map +1 -0
- package/lib/assistant/job-store.js +280 -0
- package/lib/assistant/job-store.js.map +1 -0
- package/lib/assistant/job-worker.d.ts +20 -0
- package/lib/assistant/job-worker.d.ts.map +1 -0
- package/lib/assistant/job-worker.js +73 -0
- package/lib/assistant/job-worker.js.map +1 -0
- package/lib/assistant/legacy-convert.d.ts +48 -0
- package/lib/assistant/legacy-convert.d.ts.map +1 -0
- package/lib/assistant/legacy-convert.js +108 -0
- package/lib/assistant/legacy-convert.js.map +1 -0
- package/lib/assistant/notification-router.d.ts +34 -0
- package/lib/assistant/notification-router.d.ts.map +1 -0
- package/lib/assistant/notification-router.js +96 -0
- package/lib/assistant/notification-router.js.map +1 -0
- package/lib/assistant/profile-loader.d.ts +29 -0
- package/lib/assistant/profile-loader.d.ts.map +1 -0
- package/lib/assistant/profile-loader.js +168 -0
- package/lib/assistant/profile-loader.js.map +1 -0
- package/lib/assistant/profile-types.d.ts +56 -0
- package/lib/assistant/profile-types.d.ts.map +1 -0
- package/lib/assistant/profile-types.js +9 -0
- package/lib/assistant/profile-types.js.map +1 -0
- package/lib/assistant/runtime-registry.d.ts +20 -0
- package/lib/assistant/runtime-registry.d.ts.map +1 -0
- package/lib/assistant/runtime-registry.js +19 -0
- package/lib/assistant/runtime-registry.js.map +1 -0
- package/lib/assistant/types.d.ts +75 -0
- package/lib/assistant/types.d.ts.map +1 -0
- package/lib/assistant/types.js +6 -0
- package/lib/assistant/types.js.map +1 -0
- package/lib/bootstrap.d.ts +1 -5
- package/lib/bootstrap.d.ts.map +1 -1
- package/lib/bootstrap.js +1 -34
- package/lib/bootstrap.js.map +1 -1
- package/lib/builtin/analyze-media-tool.d.ts +13 -0
- package/lib/builtin/analyze-media-tool.d.ts.map +1 -0
- package/lib/builtin/analyze-media-tool.js +100 -0
- package/lib/builtin/analyze-media-tool.js.map +1 -0
- package/lib/builtin/ask-user-tool.d.ts +1 -1
- package/lib/builtin/ask-user-tool.d.ts.map +1 -1
- package/lib/builtin/ask-user-tool.js +1 -1
- package/lib/builtin/ask-user-tool.js.map +1 -1
- package/lib/builtin/edit-file-tool.d.ts.map +1 -1
- package/lib/builtin/edit-file-tool.js +5 -1
- package/lib/builtin/edit-file-tool.js.map +1 -1
- package/lib/builtin/generate-image-tool.d.ts +21 -0
- package/lib/builtin/generate-image-tool.d.ts.map +1 -0
- package/lib/builtin/generate-image-tool.js +138 -0
- package/lib/builtin/generate-image-tool.js.map +1 -0
- package/lib/builtin/read-file-tool.d.ts +1 -1
- package/lib/builtin/read-file-tool.d.ts.map +1 -1
- package/lib/builtin/read-file-tool.js +2 -7
- package/lib/builtin/read-file-tool.js.map +1 -1
- package/lib/builtin/run-deferred-task-tool.d.ts +1 -1
- package/lib/builtin/run-deferred-task-tool.d.ts.map +1 -1
- package/lib/builtin/run-deferred-task-tool.js +1 -1
- package/lib/builtin/run-deferred-task-tool.js.map +1 -1
- package/lib/builtin/spawn-task-tool.d.ts +1 -1
- package/lib/builtin/spawn-task-tool.d.ts.map +1 -1
- package/lib/builtin/spawn-task-tool.js +25 -4
- package/lib/builtin/spawn-task-tool.js.map +1 -1
- package/lib/builtin/write-file-tool.d.ts.map +1 -1
- package/lib/builtin/write-file-tool.js +6 -1
- package/lib/builtin/write-file-tool.js.map +1 -1
- package/lib/builtin-tools.d.ts.map +1 -1
- package/lib/builtin-tools.js +2 -0
- package/lib/builtin-tools.js.map +1 -1
- package/lib/config/agent-binding-registry.d.ts +14 -0
- package/lib/config/agent-binding-registry.d.ts.map +1 -0
- package/lib/config/agent-binding-registry.js +30 -0
- package/lib/config/agent-binding-registry.js.map +1 -0
- package/lib/config/agent-bindings.d.ts +4 -0
- package/lib/config/agent-bindings.d.ts.map +1 -0
- package/lib/config/agent-bindings.js +16 -0
- package/lib/config/agent-bindings.js.map +1 -0
- package/lib/config/normalize-ai-config.d.ts +15 -0
- package/lib/config/normalize-ai-config.d.ts.map +1 -0
- package/lib/config/normalize-ai-config.js +72 -0
- package/lib/config/normalize-ai-config.js.map +1 -0
- package/lib/config/provider-instance.d.ts +5 -0
- package/lib/config/provider-instance.d.ts.map +1 -0
- package/lib/config/provider-instance.js +65 -0
- package/lib/config/provider-instance.js.map +1 -0
- package/lib/config/types.d.ts +36 -0
- package/lib/config/types.d.ts.map +1 -0
- package/lib/config/types.js +2 -0
- package/lib/config/types.js.map +1 -0
- package/lib/config/validate-ai-config.d.ts +3 -0
- package/lib/config/validate-ai-config.d.ts.map +1 -0
- package/lib/config/validate-ai-config.js +40 -0
- package/lib/config/validate-ai-config.js.map +1 -0
- package/lib/cron-engine.d.ts +20 -18
- package/lib/cron-engine.d.ts.map +1 -1
- package/lib/cron-engine.js +42 -18
- package/lib/cron-engine.js.map +1 -1
- package/lib/deferred-worker-runner.d.ts +2 -0
- package/lib/deferred-worker-runner.d.ts.map +1 -1
- package/lib/deferred-worker-runner.js +17 -35
- package/lib/deferred-worker-runner.js.map +1 -1
- package/lib/discovery/agents.d.ts +2 -0
- package/lib/discovery/agents.d.ts.map +1 -1
- package/lib/discovery/agents.js +5 -0
- package/lib/discovery/agents.js.map +1 -1
- package/lib/hooks.d.ts +0 -1
- package/lib/hooks.d.ts.map +1 -1
- package/lib/hooks.js.map +1 -1
- package/lib/index.d.ts +14 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -3
- package/lib/index.js.map +1 -1
- package/lib/init/activate-ai-database-storage.d.ts +1 -1
- package/lib/init/activate-ai-database-storage.d.ts.map +1 -1
- package/lib/init/activate-ai-database-storage.js +16 -13
- package/lib/init/activate-ai-database-storage.js.map +1 -1
- package/lib/init/create-zhin-agent.d.ts.map +1 -1
- package/lib/init/create-zhin-agent.js +180 -69
- package/lib/init/create-zhin-agent.js.map +1 -1
- package/lib/init/introspection-commands-format.d.ts +40 -0
- package/lib/init/introspection-commands-format.d.ts.map +1 -0
- package/lib/init/introspection-commands-format.js +93 -0
- package/lib/init/introspection-commands-format.js.map +1 -0
- package/lib/init/message-media.d.ts.map +1 -1
- package/lib/init/message-media.js +12 -0
- package/lib/init/message-media.js.map +1 -1
- package/lib/init/output-renderer.d.ts +4 -0
- package/lib/init/output-renderer.d.ts.map +1 -1
- package/lib/init/output-renderer.js +6 -0
- package/lib/init/output-renderer.js.map +1 -1
- package/lib/init/register-ai-trigger.d.ts.map +1 -1
- package/lib/init/register-ai-trigger.js +155 -8
- package/lib/init/register-ai-trigger.js.map +1 -1
- package/lib/init/register-builtin-tools.d.ts.map +1 -1
- package/lib/init/register-builtin-tools.js +13 -3
- package/lib/init/register-builtin-tools.js.map +1 -1
- package/lib/init/register-db-models.d.ts.map +1 -1
- package/lib/init/register-db-models.js +7 -8
- package/lib/init/register-db-models.js.map +1 -1
- package/lib/init/register-db-upgrade.d.ts +1 -1
- package/lib/init/register-db-upgrade.js +2 -2
- package/lib/init/register-db-upgrade.js.map +1 -1
- package/lib/init/register-home-tools.d.ts +2 -0
- package/lib/init/register-home-tools.d.ts.map +1 -0
- package/lib/init/register-home-tools.js +51 -0
- package/lib/init/register-home-tools.js.map +1 -0
- package/lib/init/register-introspection-commands.d.ts +3 -0
- package/lib/init/register-introspection-commands.d.ts.map +1 -0
- package/lib/init/register-introspection-commands.js +97 -0
- package/lib/init/register-introspection-commands.js.map +1 -0
- package/lib/init/register-management-tools.d.ts +1 -1
- package/lib/init/register-management-tools.js +3 -3
- package/lib/init/register-management-tools.js.map +1 -1
- package/lib/init/register-mcp-memory-default.d.ts.map +1 -1
- package/lib/init/register-mcp-memory-default.js +1 -0
- package/lib/init/register-mcp-memory-default.js.map +1 -1
- package/lib/init/register-owner-approve-commands.d.ts.map +1 -1
- package/lib/init/register-owner-approve-commands.js +103 -111
- package/lib/init/register-owner-approve-commands.js.map +1 -1
- package/lib/init/register-typing-indicator.d.ts.map +1 -1
- package/lib/init/register-typing-indicator.js +111 -115
- package/lib/init/register-typing-indicator.js.map +1 -1
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +4 -0
- package/lib/init.js.map +1 -1
- package/lib/media/constants.d.ts +3 -0
- package/lib/media/constants.d.ts.map +1 -0
- package/lib/media/constants.js +3 -0
- package/lib/media/constants.js.map +1 -0
- package/lib/media/deliver-subagent-result.d.ts +15 -0
- package/lib/media/deliver-subagent-result.d.ts.map +1 -0
- package/lib/media/deliver-subagent-result.js +35 -0
- package/lib/media/deliver-subagent-result.js.map +1 -0
- package/lib/media/index.d.ts +14 -0
- package/lib/media/index.d.ts.map +1 -0
- package/lib/media/index.js +14 -0
- package/lib/media/index.js.map +1 -0
- package/lib/media/media-capabilities.d.ts +3 -0
- package/lib/media/media-capabilities.d.ts.map +1 -0
- package/lib/media/media-capabilities.js +15 -0
- package/lib/media/media-capabilities.js.map +1 -0
- package/lib/media/media-normalize.d.ts +10 -0
- package/lib/media/media-normalize.d.ts.map +1 -0
- package/lib/media/media-normalize.js +108 -0
- package/lib/media/media-normalize.js.map +1 -0
- package/lib/media/media-publisher.d.ts +8 -0
- package/lib/media/media-publisher.d.ts.map +1 -0
- package/lib/media/media-publisher.js +254 -0
- package/lib/media/media-publisher.js.map +1 -0
- package/lib/media/media-router.d.ts +7 -0
- package/lib/media/media-router.d.ts.map +1 -0
- package/lib/media/media-router.js +59 -0
- package/lib/media/media-router.js.map +1 -0
- package/lib/media/media-spool.d.ts +3 -0
- package/lib/media/media-spool.d.ts.map +1 -0
- package/lib/media/media-spool.js +25 -0
- package/lib/media/media-spool.js.map +1 -0
- package/lib/media/media-tool-bridge.d.ts +9 -0
- package/lib/media/media-tool-bridge.d.ts.map +1 -0
- package/lib/media/media-tool-bridge.js +61 -0
- package/lib/media/media-tool-bridge.js.map +1 -0
- package/lib/media/media-types.d.ts +50 -0
- package/lib/media/media-types.d.ts.map +1 -0
- package/lib/media/media-types.js +18 -0
- package/lib/media/media-types.js.map +1 -0
- package/lib/media/resolve-config.d.ts +3 -0
- package/lib/media/resolve-config.d.ts.map +1 -0
- package/lib/media/resolve-config.js +32 -0
- package/lib/media/resolve-config.js.map +1 -0
- package/lib/media/subagent-inbound.d.ts +20 -0
- package/lib/media/subagent-inbound.d.ts.map +1 -0
- package/lib/media/subagent-inbound.js +88 -0
- package/lib/media/subagent-inbound.js.map +1 -0
- package/lib/media/subagent-user-delivery.d.ts +16 -0
- package/lib/media/subagent-user-delivery.d.ts.map +1 -0
- package/lib/media/subagent-user-delivery.js +62 -0
- package/lib/media/subagent-user-delivery.js.map +1 -0
- package/lib/media/vision-capability.d.ts +5 -0
- package/lib/media/vision-capability.d.ts.map +1 -0
- package/lib/media/vision-capability.js +19 -0
- package/lib/media/vision-capability.js.map +1 -0
- package/lib/memory-layers.d.ts +57 -0
- package/lib/memory-layers.d.ts.map +1 -0
- package/lib/memory-layers.js +327 -0
- package/lib/memory-layers.js.map +1 -0
- package/lib/orchestrator/agent-dispatcher.d.ts.map +1 -1
- package/lib/orchestrator/agent-dispatcher.js +2 -0
- package/lib/orchestrator/agent-dispatcher.js.map +1 -1
- package/lib/orchestrator/mcp-lifecycle.d.ts +3 -0
- package/lib/orchestrator/mcp-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/mcp-lifecycle.js +34 -0
- package/lib/orchestrator/mcp-lifecycle.js.map +1 -1
- package/lib/orchestrator/resolve-subagent-tools.d.ts +20 -0
- package/lib/orchestrator/resolve-subagent-tools.d.ts.map +1 -0
- package/lib/orchestrator/resolve-subagent-tools.js +52 -0
- package/lib/orchestrator/resolve-subagent-tools.js.map +1 -0
- package/lib/orchestrator/task-queue.d.ts +4 -0
- package/lib/orchestrator/task-queue.d.ts.map +1 -1
- package/lib/orchestrator/task-queue.js +24 -0
- package/lib/orchestrator/task-queue.js.map +1 -1
- package/lib/orchestrator/tool-selection.d.ts +1 -1
- package/lib/orchestrator/tool-selection.d.ts.map +1 -1
- package/lib/orchestrator/tool-selection.js +2 -0
- package/lib/orchestrator/tool-selection.js.map +1 -1
- package/lib/routing/route-matcher.d.ts +12 -0
- package/lib/routing/route-matcher.d.ts.map +1 -0
- package/lib/routing/route-matcher.js +72 -0
- package/lib/routing/route-matcher.js.map +1 -0
- package/lib/routing/runtime-binding.d.ts +10 -0
- package/lib/routing/runtime-binding.d.ts.map +1 -0
- package/lib/routing/runtime-binding.js +6 -0
- package/lib/routing/runtime-binding.js.map +1 -0
- package/lib/routing/subagent-summarize.d.ts +6 -0
- package/lib/routing/subagent-summarize.d.ts.map +1 -0
- package/lib/routing/subagent-summarize.js +23 -0
- package/lib/routing/subagent-summarize.js.map +1 -0
- package/lib/security/file-policy.d.ts +7 -1
- package/lib/security/file-policy.d.ts.map +1 -1
- package/lib/security/file-policy.js +34 -1
- package/lib/security/file-policy.js.map +1 -1
- package/lib/service.d.ts +44 -25
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +93 -56
- package/lib/service.js.map +1 -1
- package/lib/subagent-ai-events.d.ts +30 -0
- package/lib/subagent-ai-events.d.ts.map +1 -0
- package/lib/subagent-ai-events.js +110 -0
- package/lib/subagent-ai-events.js.map +1 -0
- package/lib/subagent-goal-notify.d.ts +27 -6
- package/lib/subagent-goal-notify.d.ts.map +1 -1
- package/lib/subagent-goal-notify.js +46 -12
- package/lib/subagent-goal-notify.js.map +1 -1
- package/lib/subagent.d.ts +43 -3
- package/lib/subagent.d.ts.map +1 -1
- package/lib/subagent.js +191 -88
- package/lib/subagent.js.map +1 -1
- package/lib/task-executor.d.ts +10 -18
- package/lib/task-executor.d.ts.map +1 -1
- package/lib/task-executor.js +11 -34
- package/lib/task-executor.js.map +1 -1
- package/lib/typing-indicator/adapter-integration.d.ts.map +1 -1
- package/lib/typing-indicator/adapter-integration.js +2 -1
- package/lib/typing-indicator/adapter-integration.js.map +1 -1
- package/lib/typing-indicator/index.d.ts.map +1 -1
- package/lib/typing-indicator/index.js +18 -5
- package/lib/typing-indicator/index.js.map +1 -1
- package/lib/zhin-agent/agent-loop-standalone.d.ts +32 -0
- package/lib/zhin-agent/agent-loop-standalone.d.ts.map +1 -0
- package/lib/zhin-agent/agent-loop-standalone.js +144 -0
- package/lib/zhin-agent/agent-loop-standalone.js.map +1 -0
- package/lib/zhin-agent/agent-loop-turn.d.ts +51 -0
- package/lib/zhin-agent/agent-loop-turn.d.ts.map +1 -0
- package/lib/zhin-agent/agent-loop-turn.js +287 -0
- package/lib/zhin-agent/agent-loop-turn.js.map +1 -0
- package/lib/zhin-agent/builtin-tools.d.ts +3 -2
- package/lib/zhin-agent/builtin-tools.d.ts.map +1 -1
- package/lib/zhin-agent/builtin-tools.js +15 -16
- package/lib/zhin-agent/builtin-tools.js.map +1 -1
- package/lib/zhin-agent/config.d.ts +20 -14
- package/lib/zhin-agent/config.d.ts.map +1 -1
- package/lib/zhin-agent/config.js +19 -13
- package/lib/zhin-agent/config.js.map +1 -1
- package/lib/zhin-agent/deferred-delivery.d.ts +5 -0
- package/lib/zhin-agent/deferred-delivery.d.ts.map +1 -0
- package/lib/zhin-agent/deferred-delivery.js +29 -0
- package/lib/zhin-agent/deferred-delivery.js.map +1 -0
- package/lib/zhin-agent/event-emitter.d.ts.map +1 -1
- package/lib/zhin-agent/event-emitter.js +3 -2
- package/lib/zhin-agent/event-emitter.js.map +1 -1
- package/lib/zhin-agent/index.d.ts +50 -8
- package/lib/zhin-agent/index.d.ts.map +1 -1
- package/lib/zhin-agent/index.js +204 -17
- package/lib/zhin-agent/index.js.map +1 -1
- package/lib/zhin-agent/model-resolver.d.ts +0 -1
- package/lib/zhin-agent/model-resolver.d.ts.map +1 -1
- package/lib/zhin-agent/model-resolver.js.map +1 -1
- package/lib/zhin-agent/multimodal-message.d.ts +9 -0
- package/lib/zhin-agent/multimodal-message.d.ts.map +1 -0
- package/lib/zhin-agent/multimodal-message.js +69 -0
- package/lib/zhin-agent/multimodal-message.js.map +1 -0
- package/lib/zhin-agent/prompt-access.d.ts +4 -0
- package/lib/zhin-agent/prompt-access.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-access.js +7 -0
- package/lib/zhin-agent/prompt-access.js.map +1 -0
- package/lib/zhin-agent/prompt-assembly.d.ts.map +1 -1
- package/lib/zhin-agent/prompt-assembly.js +0 -2
- package/lib/zhin-agent/prompt-assembly.js.map +1 -1
- package/lib/zhin-agent/prompt-controller.d.ts +53 -0
- package/lib/zhin-agent/prompt-controller.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-controller.js +165 -0
- package/lib/zhin-agent/prompt-controller.js.map +1 -0
- package/lib/zhin-agent/prompt-input.d.ts +3 -0
- package/lib/zhin-agent/prompt-input.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-input.js +8 -0
- package/lib/zhin-agent/prompt-input.js.map +1 -0
- package/lib/zhin-agent/prompt.d.ts.map +1 -1
- package/lib/zhin-agent/prompt.js +49 -16
- package/lib/zhin-agent/prompt.js.map +1 -1
- package/lib/zhin-agent/session-io.d.ts +12 -7
- package/lib/zhin-agent/session-io.d.ts.map +1 -1
- package/lib/zhin-agent/session-io.js +18 -15
- package/lib/zhin-agent/session-io.js.map +1 -1
- package/lib/zhin-agent/session-message-queue.d.ts +20 -0
- package/lib/zhin-agent/session-message-queue.d.ts.map +1 -0
- package/lib/zhin-agent/session-message-queue.js +52 -0
- package/lib/zhin-agent/session-message-queue.js.map +1 -0
- package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
- package/lib/zhin-agent/tool-calls-user-format.js +8 -1
- package/lib/zhin-agent/tool-calls-user-format.js.map +1 -1
- package/lib/zhin-agent/tool-orchestration.d.ts.map +1 -1
- package/lib/zhin-agent/tool-orchestration.js +43 -10
- package/lib/zhin-agent/tool-orchestration.js.map +1 -1
- package/lib/zhin-agent/tool-runtime.d.ts +2 -4
- package/lib/zhin-agent/tool-runtime.d.ts.map +1 -1
- package/lib/zhin-agent/tool-runtime.js +4 -7
- package/lib/zhin-agent/tool-runtime.js.map +1 -1
- package/lib/zhin-agent/tool-search-orchestrator.d.ts +3 -0
- package/lib/zhin-agent/tool-search-orchestrator.d.ts.map +1 -1
- package/lib/zhin-agent/tool-search-orchestrator.js +8 -3
- package/lib/zhin-agent/tool-search-orchestrator.js.map +1 -1
- package/lib/zhin-agent/turn-context.d.ts +9 -0
- package/lib/zhin-agent/turn-context.d.ts.map +1 -0
- package/lib/zhin-agent/turn-context.js +12 -0
- package/lib/zhin-agent/turn-context.js.map +1 -0
- package/lib/zhin-agent/turn-pipeline.d.ts +5 -1
- package/lib/zhin-agent/turn-pipeline.d.ts.map +1 -1
- package/lib/zhin-agent/turn-pipeline.js +128 -401
- package/lib/zhin-agent/turn-pipeline.js.map +1 -1
- package/lib/zhin-agent/turn-tracker.d.ts +2 -0
- package/lib/zhin-agent/turn-tracker.d.ts.map +1 -1
- package/lib/zhin-agent/turn-tracker.js +11 -6
- package/lib/zhin-agent/turn-tracker.js.map +1 -1
- package/lib/zhin-agent/zhin-agent-private.d.ts +18 -5
- package/lib/zhin-agent/zhin-agent-private.d.ts.map +1 -1
- package/lib/zhin-agent/zhin-agent-private.js.map +1 -1
- package/package.json +3 -3
- package/lib/zhin-agent/llm-runner.d.ts +0 -16
- package/lib/zhin-agent/llm-runner.d.ts.map +0 -1
- package/lib/zhin-agent/llm-runner.js +0 -85
- package/lib/zhin-agent/llm-runner.js.map +0 -1
package/README.md
CHANGED
|
@@ -6,18 +6,18 @@ Zhin AI Agent 组合层:在 `@zhin.js/core` 的类型与 Provider 之上,提
|
|
|
6
6
|
|
|
7
7
|
## 功能特性
|
|
8
8
|
|
|
9
|
-
- 🤖 **
|
|
9
|
+
- 🤖 **agentLoop 统一路径**:ZhinAgent、Subagent、Deferred Worker、AIService 均经 `agentLoop`(legacy `Agent.run` 仅保留在 `@zhin.js/ai` 供单测)
|
|
10
10
|
- 📝 **会话管理**:`SessionManager`、内存/数据库会话、`SessionManager.generateId`
|
|
11
11
|
- 🧠 **ZhinAgent**:与 Zhin 消息流集成的智能体(SOUL/TOOLS/AGENTS、工具收集、执行策略)
|
|
12
|
-
- 🔍
|
|
13
|
-
- 🔄
|
|
12
|
+
- 🔍 **模型自动发现**:`ModelRegistry` 调用 `listModels()`(OpenAI 兼容 `/v1/models`、Ollama `/api/tags`);结果写入 `provider.models` 并供 `getModel()` 校验;yaml 显式 `models` 时以配置为准
|
|
13
|
+
- 🔄 **模型自动降级**:首选模型失败时按 `resolveModelCandidates` 候选链 fallback(文本 / 多模态 / standalone 均走 agentLoop)
|
|
14
14
|
- 🛡️ **6 层 Bash 安全**:`ExecPolicy` 纵深防御(危险黑名单、环境变量剥离、wrapper 剥离、复合命令拆分、只读放行、交互式审批)
|
|
15
15
|
- 📂 **文件访问安全**:`FilePolicy` 路径检查、设备路径拦截、命令读写分类
|
|
16
16
|
- 📋 **精简系统提示词**:`PromptBuilder` 组装 Context、Style、Tools、Safety,并按需注入 Platform、Skills、Memory、Bootstrap
|
|
17
17
|
- 🔌 **框架挂载**:`initAgentModule()` 注册 `ctx.ai`、`ctx.agent`、定时任务、DB 模型等
|
|
18
|
-
- 📦 **上下文与记忆**:`ContextManager`、`ConversationMemory`、`UserProfileStore`
|
|
18
|
+
- 📦 **上下文与记忆**:`ContextRepository`(`agent_messages`)、`AgentSessionStore`、`ImTranscriptStore`(`im_transcripts` + `chat_history`);辅助:`ContextManager`、`ConversationMemory`、`UserProfileStore`
|
|
19
19
|
- ⏰ **跟进与定时**:`FollowUpManager`、`PersistentCronEngine`、cron 工具
|
|
20
|
-
- 🔧 **内置工具**:bash、read_file、write_file、ask_user、web_search
|
|
20
|
+
- 🔧 **内置工具**:bash、read_file、write_file、ask_user、web_search、`chat_history`(按关键词/最近条数查 `im_transcripts`)等
|
|
21
21
|
- 📐 **会话压缩**:`compactSession`、token 估算、总结与裁剪
|
|
22
22
|
- 🪝 **Hook 系统**:`registerAIHook`、`triggerAIHook` 等
|
|
23
23
|
|
|
@@ -44,8 +44,6 @@ npm install zhin.js
|
|
|
44
44
|
import {
|
|
45
45
|
initAgentModule,
|
|
46
46
|
ZhinAgent,
|
|
47
|
-
Agent,
|
|
48
|
-
createAgent,
|
|
49
47
|
AIService,
|
|
50
48
|
SessionManager,
|
|
51
49
|
registerAIHook,
|
|
@@ -64,16 +62,19 @@ useContext('ai', async (ai) => {
|
|
|
64
62
|
仅在需要单独集成 Agent 能力时使用:
|
|
65
63
|
|
|
66
64
|
```javascript
|
|
67
|
-
import { initAgentModule,
|
|
65
|
+
import { initAgentModule, AIService } from '@zhin.js/agent'
|
|
68
66
|
import { OllamaProvider } from '@zhin.js/core'
|
|
69
67
|
|
|
70
|
-
// 初始化(需先有 DatabaseFeature 等)
|
|
71
68
|
initAgentModule()
|
|
72
69
|
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
70
|
+
// 程序化 Agent(agentLoop 隔离 context)
|
|
71
|
+
useContext('ai', async (ai) => {
|
|
72
|
+
const result = await ai.runAgent('你好', {
|
|
73
|
+
provider: 'ollama',
|
|
74
|
+
systemPrompt: '你是一个助手',
|
|
75
|
+
})
|
|
76
|
+
console.log(result.content)
|
|
77
|
+
})
|
|
77
78
|
```
|
|
78
79
|
|
|
79
80
|
## 核心导出
|
|
@@ -81,13 +82,13 @@ const result = await agent.run('你好')
|
|
|
81
82
|
| 类别 | 导出 |
|
|
82
83
|
|------|------|
|
|
83
84
|
| 初始化 | `initAgentModule` |
|
|
84
|
-
| Agent | `Agent
|
|
85
|
+
| Agent | `ServiceAgent`、`CreateServiceAgentOptions`(`AIService.createAgent`);legacy `Agent` / `createAgent` re-export 自 `@zhin.js/ai` |
|
|
85
86
|
| Model harness | `MODEL_HARNESS_DEFAULTS`, `resolveModelHarness`, `mergeModelHarnessValues` |
|
|
86
87
|
| 服务与会话 | `AIService`, `SessionManager`, `MemorySessionManager`, `DatabaseSessionManager`, `createMemorySessionManager`, `createDatabaseSessionManager` |
|
|
87
88
|
| ZhinAgent | `ZhinAgent`,以及 config / exec-policy / file-policy / tool-runtime / prompt / builtin-tools 等子模块 |
|
|
88
89
|
| 安全策略 | `checkExecPolicy`, `applyExecPolicyToTools`, `isDangerousCommand`, `stripEnvVarPrefix`, `stripSafeWrappers`, `splitCompoundCommand`, `extractCommandName`, `ExecPolicyResult`, `checkFileAccess`, `classifyBashCommand`, `isBlockedDevicePath` |
|
|
89
90
|
| 提示词构建 | `buildRichSystemPrompt`, `buildEnhancedPersona`, `buildUserMessageWithHistory`, `buildContextHint` |
|
|
90
|
-
| 上下文与记忆 | `
|
|
91
|
+
| 上下文与记忆 | `ContextRepository`, `AgentSessionStore`, `ImTranscriptStore`(经 ZhinAgent 注入);`ContextManager`, `ConversationMemory`, `UserProfileStore` |
|
|
91
92
|
| 跟进与定时 | `FollowUpManager`, `PersistentCronEngine`, `createCronTools`, `setCronManager`, `getCronManager` |
|
|
92
93
|
| 压缩与 Bootstrap | `compactSession`, `estimateTokens`, `loadBootstrapFiles`, `loadSoulPersona`, `loadToolsGuide`, `loadAgentsMemory` |
|
|
93
94
|
| Hook | `registerAIHook`, `unregisterAIHook`, `triggerAIHook`, `createAIHookEvent` |
|
|
@@ -118,7 +119,7 @@ declare module '@zhin.js/core' {
|
|
|
118
119
|
|
|
119
120
|
| Context | 用途 |
|
|
120
121
|
|---------|------|
|
|
121
|
-
| `ctx.ai` | 业务侧 AI 服务:会话、`createAgent`
|
|
122
|
+
| `ctx.ai` | 业务侧 AI 服务:会话、`createAgent`(→ `ServiceAgent`)/ `runAgent`、全局 ZhinAgent |
|
|
122
123
|
| `ctx.agent` | 扩展编排资源:`orchestrator.addTool`、`addSkill`、`addMcp` 等;内置注册走 `root.inject('agent')` |
|
|
123
124
|
|
|
124
125
|
主包 `zhin.js` 的 `Plugin.Contexts` 类型已包含上述两项。
|
|
@@ -148,30 +149,27 @@ ai:
|
|
|
148
149
|
框架已提供 **SubagentManager**:主 ZhinAgent 通过工具 `spawn_task` 把复杂/耗时任务派给**后台子 Agent** 异步执行,子 Agent 默认仅用受限工具集(文件、Shell、网络搜索等),完成后通过回调把结果发回主会话。
|
|
149
150
|
|
|
150
151
|
- 主对话不阻塞,用户可继续聊天。
|
|
151
|
-
- 子 Agent 由 `ZhinAgent.initSubagentManager(createTools)` 在 init
|
|
152
|
+
- 子 Agent 由 `ZhinAgent.initSubagentManager(createTools)` 在 init 时挂好;`spawn_task` 为主编排序列化常驻工具(见 `orchestratorTools` / `DEFAULT_ORCHESTRATOR_TOOLS`)。
|
|
152
153
|
- 用户说「后台帮我整理这份文档」时,主 Agent 可调用 `spawn_task({ task: '...', label: '...' })`,子任务在后台跑完后再通知用户。
|
|
153
154
|
|
|
154
155
|
无需额外配置即可使用;若需放宽子 Agent 的工具范围,使用 `ai.agent.subagentTools` 显式追加白名单(不会自动继承主会话全部 skill/tool)。
|
|
155
156
|
|
|
156
157
|
### 2. 用 AIService 创建多个不同配置的 Agent
|
|
157
158
|
|
|
158
|
-
`ctx.ai`(AIService)可以按需创建**多个互不共享状态的 Agent
|
|
159
|
+
`ctx.ai`(AIService)可以按需创建**多个互不共享状态的 Agent**(`ServiceAgent`),每个可指定不同 provider、model、systemPrompt、tools;底层均为 **`runAgentLoopStandaloneTurn`**:
|
|
159
160
|
|
|
160
161
|
```javascript
|
|
161
162
|
import { useContext } from 'zhin.js'
|
|
162
163
|
|
|
163
164
|
useContext('ai', async (ai) => {
|
|
164
|
-
// 专用「代码助手」Agent
|
|
165
165
|
const codeAgent = ai.createAgent({
|
|
166
166
|
provider: 'openai',
|
|
167
167
|
model: 'gpt-4o',
|
|
168
168
|
systemPrompt: '你只负责代码审查与建议,不闲聊。',
|
|
169
169
|
useBuiltinTools: true,
|
|
170
|
-
tools: [/* 可选:额外工具 */],
|
|
171
170
|
})
|
|
172
171
|
const codeResult = await codeAgent.run('审查这段 TypeScript 的类型安全')
|
|
173
172
|
|
|
174
|
-
// 专用「翻译」Agent,不用内置工具
|
|
175
173
|
const translateAgent = ai.createAgent({
|
|
176
174
|
provider: 'ollama',
|
|
177
175
|
model: 'qwen2.5',
|
|
@@ -201,7 +199,7 @@ useContext('ai', async (ai) => {
|
|
|
201
199
|
|
|
202
200
|
### 4. 多 Agent 协作/编排(由 zhin.js 层实现)
|
|
203
201
|
|
|
204
|
-
本包只提供基础能力:`
|
|
202
|
+
本包只提供基础能力:`ZhinAgent`、`ai.createAgent`(`ServiceAgent`)、`ai.runAgent` 等。**多 Agent 串联/并联编排**(例如 A 的输出作为 B 的输入、按条件路由到不同专业 Agent)在 **zhin.js 主包** `runPipeline` / `runParallel` / `route` 实现;插件侧通过 zhin.js 暴露的 API 使用即可。
|
|
205
203
|
|
|
206
204
|
## 工具命名策略
|
|
207
205
|
|
|
@@ -209,6 +207,33 @@ useContext('ai', async (ai) => {
|
|
|
209
207
|
- 非保留工具同名时采用 **后注册覆盖前注册**。
|
|
210
208
|
- 冲突统一以 warn 记录:包含 `name`、`source`、`action`(`ignored`/`overridden`)。
|
|
211
209
|
|
|
210
|
+
## Provider 与模型列表
|
|
211
|
+
|
|
212
|
+
`AIService` 构造时:
|
|
213
|
+
|
|
214
|
+
1. 按 `ai.providers.<别名>` 实例化 Provider(须配置 `api`,如 `openai-completions`)。
|
|
215
|
+
2. `registerLlmApiFromProviders`:**未写 `models` 的 provider** 在 ApiRegistry 注册为空白名单,由后台 `ModelRegistry.discover()` 填充 `provider.models`;**写了 `models`** 则用 yaml 白名单。
|
|
216
|
+
3. `createZhinAgent` 启动时 `loadCache()` 先恢复上次发现结果,再异步刷新 `/v1/models`。
|
|
217
|
+
|
|
218
|
+
`agents.<name>.model`(如 `mimo-v2.5-pro`)须在发现列表中,或在中转 API 的 `/v1/models` 响应里出现;无需为每个模型手写 yaml,除非要锁定白名单。
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
ai:
|
|
222
|
+
providers:
|
|
223
|
+
openai-main:
|
|
224
|
+
api: openai-completions
|
|
225
|
+
baseUrl: ${OPENAI_BASE_URL}
|
|
226
|
+
apiKey: ${OPENAI_API_KEY}
|
|
227
|
+
# models 省略 → 自动 GET /v1/models
|
|
228
|
+
cloudflare-flash:
|
|
229
|
+
api: cloudflare-workers-ai
|
|
230
|
+
models: ["@cf/zai-org/glm-4.7-flash"] # 显式列表
|
|
231
|
+
agents:
|
|
232
|
+
zhin:
|
|
233
|
+
provider: openai-main
|
|
234
|
+
model: mimo-v2.5-pro
|
|
235
|
+
```
|
|
236
|
+
|
|
212
237
|
## Model harness
|
|
213
238
|
|
|
214
239
|
按 provider / model 覆盖 Agent 循环默认参数(当前主要为 **`maxIterations`**)。
|
|
@@ -267,7 +292,7 @@ src/
|
|
|
267
292
|
│ ├── config.ts
|
|
268
293
|
│ ├── prompt.ts
|
|
269
294
|
│ ├── tool-runtime.ts # 运行时工具收集与执行路径规划
|
|
270
|
-
│ └──
|
|
295
|
+
│ └── builtin-tools.ts # chat_history(im_transcripts), user_profile, spawn_task
|
|
271
296
|
│
|
|
272
297
|
├── discovery/ # ★ 文件化资源发现
|
|
273
298
|
│ ├── index.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/agent-prompt/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAY/D,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,uBAAuB,CAAC;IAC7B,MAAM,CAAC,EAAE,IAAI,CACX,QAAQ,CAAC,eAAe,CAAC,EACzB,+BAA+B,GAAG,wBAAwB,CAC3D,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/agent-prompt/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAY/D,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,uBAAuB,CAAC;IAC7B,MAAM,CAAC,EAAE,IAAI,CACX,QAAQ,CAAC,eAAe,CAAC,EACzB,+BAA+B,GAAG,wBAAwB,CAC3D,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyC/B;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,uBAAuB,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,aAAa,EAAE,SAAS,EAAE,EAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,aAAa,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,aAAa,EAAE,SAAS,EAAE,GAC9I,OAAO,aAAa,EAAE,SAAS,EAAE,CAOnC;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,uBAAuB,EAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAUT"}
|
|
@@ -31,7 +31,6 @@ export async function resolveAgentPromptSections(options) {
|
|
|
31
31
|
const hookEvent = createAIHookEvent('agent', 'prompt', sessionId, {
|
|
32
32
|
slot: ctx.slot,
|
|
33
33
|
toolContext: ctx.toolContext,
|
|
34
|
-
toolSearch: ctx.toolSearch,
|
|
35
34
|
userMessagePreview: ctx.userMessagePreview,
|
|
36
35
|
deferred: ctx.deferred,
|
|
37
36
|
sections,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/agent-prompt/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAMvC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAkC;IAElC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG;QACb,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,6BAA6B;eACpD,cAAc,CAAC,6BAA6B;QACjD,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,sBAAsB;eAC3C,cAAc,CAAC,sBAAsB;KAC3C,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC;IAC1C,MAAM,WAAW,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,QAAQ,GAAyB,EAAE,CAAC;IAExC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,2BAA2B,GAAG,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;QAChE,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/agent-prompt/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assistant Runtime 配置(应用级,zhin.config.yml 顶层 assistant 块)
|
|
3
|
+
*/
|
|
4
|
+
import type { AssistantHomeConfig } from './home-config.js';
|
|
5
|
+
import type { JobNotify } from './types.js';
|
|
6
|
+
export interface AssistantDefaultsConfig {
|
|
7
|
+
/** 未显式指定 notify 时的默认投递目标(M3) */
|
|
8
|
+
notify?: JobNotify;
|
|
9
|
+
/** Job 失败时是否通知(默认 false) */
|
|
10
|
+
notifyOnFailure?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface AssistantEventsConfig {
|
|
13
|
+
/** 启用 POST /api/assistant/events(需 assistant.enabled) */
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* 可选专用 Bearer;未设时复用 http.token(路由仍在 /api 下受全局鉴权保护)。
|
|
17
|
+
*/
|
|
18
|
+
token?: string;
|
|
19
|
+
/** 允许的来源白名单;空数组表示不限制 */
|
|
20
|
+
allowedSources?: string[];
|
|
21
|
+
/** 每来源每分钟最大请求数(默认 60) */
|
|
22
|
+
rateLimitPerMinute?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface AssistantQueueConfig {
|
|
25
|
+
/** 启用 TaskQueue 执行 Job(默认 assistant.enabled 时为 true) */
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
maxConcurrency?: number;
|
|
28
|
+
maxRetries?: number;
|
|
29
|
+
defaultTimeoutMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface AssistantConfig {
|
|
32
|
+
/** 启用统一 JobStore(默认 false,Stable 行为不变) */
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
/** JobWorker → TaskQueue(重试 / 并发 / 死信) */
|
|
35
|
+
queue?: AssistantQueueConfig;
|
|
36
|
+
/**
|
|
37
|
+
* 写入 assistant-jobs.json 后是否双写 legacy cron-jobs.json(默认 false)。
|
|
38
|
+
* 迁移期可设 true 便于旧 CLI 只读 cron-jobs.json。
|
|
39
|
+
*/
|
|
40
|
+
legacyDualWrite?: boolean;
|
|
41
|
+
/** 自定义 JobStore 文件名(默认 assistant-jobs.json) */
|
|
42
|
+
jobsFile?: string;
|
|
43
|
+
defaults?: AssistantDefaultsConfig;
|
|
44
|
+
profile?: import('./profile-types.js').AssistantProfileConfig;
|
|
45
|
+
home?: AssistantHomeConfig;
|
|
46
|
+
events?: AssistantEventsConfig;
|
|
47
|
+
}
|
|
48
|
+
export declare const DEFAULT_ASSISTANT_CONFIG: Required<Pick<AssistantConfig, 'legacyDualWrite'>>;
|
|
49
|
+
export declare const DEFAULT_EVENTS_CONFIG: Required<Pick<AssistantEventsConfig, 'rateLimitPerMinute'>>;
|
|
50
|
+
export declare function resolveAssistantQueueConfig(raw?: AssistantQueueConfig, assistantEnabled?: boolean): AssistantQueueConfig & {
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
maxConcurrency: number;
|
|
53
|
+
maxRetries: number;
|
|
54
|
+
defaultTimeoutMs: number;
|
|
55
|
+
};
|
|
56
|
+
export declare function resolveAssistantConfig(raw?: AssistantConfig): AssistantConfig & {
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
};
|
|
59
|
+
export declare function resolveAssistantDefaultsConfig(raw?: AssistantDefaultsConfig): AssistantDefaultsConfig & {
|
|
60
|
+
notifyOnFailure: boolean;
|
|
61
|
+
};
|
|
62
|
+
export declare function resolveAssistantEventsConfig(raw?: AssistantEventsConfig): AssistantEventsConfig & {
|
|
63
|
+
enabled: boolean;
|
|
64
|
+
rateLimitPerMinute: number;
|
|
65
|
+
};
|
|
66
|
+
export declare function isAssistantEventsActive(assistant?: AssistantConfig): boolean;
|
|
67
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/assistant/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,4BAA4B;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yBAAyB;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,oBAAoB,EAAE,sBAAsB,CAAC;IAC9D,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAEvF,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAE7F,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,GAAG,CAAC,EAAE,oBAAoB,EAC1B,gBAAgB,UAAQ,GACvB,oBAAoB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAQnH;AAED,wBAAgB,sBAAsB,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAWpG;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,CAAC,EAAE,uBAAuB,GAC5B,uBAAuB,GAAG;IAAE,eAAe,EAAE,OAAO,CAAA;CAAE,CAKxD;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,CAAC,EAAE,qBAAqB,GAC1B,qBAAqB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAO1E;AAED,wBAAgB,uBAAuB,CACrC,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAIT"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const DEFAULT_ASSISTANT_CONFIG = {
|
|
2
|
+
legacyDualWrite: false,
|
|
3
|
+
};
|
|
4
|
+
export const DEFAULT_EVENTS_CONFIG = {
|
|
5
|
+
rateLimitPerMinute: 60,
|
|
6
|
+
};
|
|
7
|
+
export function resolveAssistantQueueConfig(raw, assistantEnabled = false) {
|
|
8
|
+
const enabled = raw?.enabled ?? assistantEnabled;
|
|
9
|
+
return {
|
|
10
|
+
enabled,
|
|
11
|
+
maxConcurrency: raw?.maxConcurrency ?? 3,
|
|
12
|
+
maxRetries: raw?.maxRetries ?? 2,
|
|
13
|
+
defaultTimeoutMs: raw?.defaultTimeoutMs ?? 120_000,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function resolveAssistantConfig(raw) {
|
|
17
|
+
return {
|
|
18
|
+
enabled: raw?.enabled === true,
|
|
19
|
+
legacyDualWrite: raw?.legacyDualWrite ?? DEFAULT_ASSISTANT_CONFIG.legacyDualWrite,
|
|
20
|
+
jobsFile: raw?.jobsFile,
|
|
21
|
+
queue: raw?.queue,
|
|
22
|
+
defaults: raw?.defaults,
|
|
23
|
+
profile: raw?.profile,
|
|
24
|
+
home: raw?.home,
|
|
25
|
+
events: raw?.events,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function resolveAssistantDefaultsConfig(raw) {
|
|
29
|
+
return {
|
|
30
|
+
notify: raw?.notify,
|
|
31
|
+
notifyOnFailure: raw?.notifyOnFailure === true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function resolveAssistantEventsConfig(raw) {
|
|
35
|
+
return {
|
|
36
|
+
enabled: raw?.enabled === true,
|
|
37
|
+
token: raw?.token,
|
|
38
|
+
allowedSources: raw?.allowedSources,
|
|
39
|
+
rateLimitPerMinute: raw?.rateLimitPerMinute ?? DEFAULT_EVENTS_CONFIG.rateLimitPerMinute,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function isAssistantEventsActive(assistant) {
|
|
43
|
+
const base = resolveAssistantConfig(assistant);
|
|
44
|
+
const events = resolveAssistantEventsConfig(base.events);
|
|
45
|
+
return base.enabled && events.enabled;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/assistant/config.ts"],"names":[],"mappings":"AAoDA,MAAM,CAAC,MAAM,wBAAwB,GAAuD;IAC1F,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAgE;IAChG,kBAAkB,EAAE,EAAE;CACvB,CAAC;AAEF,MAAM,UAAU,2BAA2B,CACzC,GAA0B,EAC1B,gBAAgB,GAAG,KAAK;IAExB,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,gBAAgB,CAAC;IACjD,OAAO;QACL,OAAO;QACP,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,CAAC;QACxC,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;QAChC,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,IAAI,OAAO;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAqB;IAC1D,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI;QAC9B,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,wBAAwB,CAAC,eAAe;QACjF,QAAQ,EAAE,GAAG,EAAE,QAAQ;QACvB,KAAK,EAAE,GAAG,EAAE,KAAK;QACjB,QAAQ,EAAE,GAAG,EAAE,QAAQ;QACvB,OAAO,EAAE,GAAG,EAAE,OAAO;QACrB,IAAI,EAAE,GAAG,EAAE,IAAI;QACf,MAAM,EAAE,GAAG,EAAE,MAAM;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,GAA6B;IAE7B,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,MAAM;QACnB,eAAe,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,GAA2B;IAE3B,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI;QAC9B,KAAK,EAAE,GAAG,EAAE,KAAK;QACjB,cAAc,EAAE,GAAG,EAAE,cAAc;QACnC,kBAAkB,EAAE,GAAG,EAAE,kBAAkB,IAAI,qBAAqB,CAAC,kBAAkB;KACxF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAA2B;IAE3B,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AssistantHomeConfig } from '../home-config.js';
|
|
2
|
+
export type HaFetch = (url: string, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export interface HaEntityState {
|
|
4
|
+
entityId: string;
|
|
5
|
+
state: string;
|
|
6
|
+
attributes: Record<string, unknown>;
|
|
7
|
+
lastChanged?: string;
|
|
8
|
+
lastUpdated?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseEntityDomain(entityId: string): string;
|
|
11
|
+
export declare class HomeAssistantService {
|
|
12
|
+
private cfg;
|
|
13
|
+
private fetchFn;
|
|
14
|
+
constructor(homeConfig: AssistantHomeConfig, fetchFn?: HaFetch);
|
|
15
|
+
listAliases(): Record<string, string>;
|
|
16
|
+
resolveAlias(alias: string): string;
|
|
17
|
+
private baseUrl;
|
|
18
|
+
private token;
|
|
19
|
+
private haRequest;
|
|
20
|
+
getState(alias: string): Promise<HaEntityState>;
|
|
21
|
+
resolveServiceForToggle(entityId: string, on: boolean): {
|
|
22
|
+
domain: string;
|
|
23
|
+
service: string;
|
|
24
|
+
};
|
|
25
|
+
callService(alias: string, service: string, data?: Record<string, unknown>): Promise<void>;
|
|
26
|
+
turnOn(alias: string): Promise<{
|
|
27
|
+
alias: string;
|
|
28
|
+
entityId: string;
|
|
29
|
+
service: string;
|
|
30
|
+
}>;
|
|
31
|
+
turnOff(alias: string): Promise<{
|
|
32
|
+
alias: string;
|
|
33
|
+
entityId: string;
|
|
34
|
+
service: string;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=home-assistant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home-assistant.d.ts","sourceRoot":"","sources":["../../../src/assistant/domains/home-assistant.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAK7D,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAYD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAgD;IAC3D,OAAO,CAAC,OAAO,CAAU;gBAEb,UAAU,EAAE,mBAAmB,EAAE,OAAO,GAAE,OAA2C;IAKjG,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IASnC,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;YAKC,SAAS;IAoBjB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAYrD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAUrF,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAUV,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAOpF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAM5F"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HomeAssistantService — 别名解析 + HA REST(M4)
|
|
3
|
+
*/
|
|
4
|
+
import { Logger } from '@zhin.js/core';
|
|
5
|
+
import { formatCompact } from '@zhin.js/logger';
|
|
6
|
+
import { resolveAssistantHomeConfig } from '../home-config.js';
|
|
7
|
+
const logger = new Logger(null, 'home-assistant');
|
|
8
|
+
const DOMAIN_SERVICE_MAP = {
|
|
9
|
+
light: { on: 'turn_on', off: 'turn_off' },
|
|
10
|
+
switch: { on: 'turn_on', off: 'turn_off' },
|
|
11
|
+
fan: { on: 'turn_on', off: 'turn_off' },
|
|
12
|
+
cover: { on: 'open_cover', off: 'close_cover' },
|
|
13
|
+
lock: { on: 'unlock', off: 'lock' },
|
|
14
|
+
climate: { on: 'turn_on', off: 'turn_off' },
|
|
15
|
+
media_player: { on: 'turn_on', off: 'turn_off' },
|
|
16
|
+
};
|
|
17
|
+
export function parseEntityDomain(entityId) {
|
|
18
|
+
const dot = entityId.indexOf('.');
|
|
19
|
+
return dot > 0 ? entityId.slice(0, dot) : entityId;
|
|
20
|
+
}
|
|
21
|
+
export class HomeAssistantService {
|
|
22
|
+
cfg;
|
|
23
|
+
fetchFn;
|
|
24
|
+
constructor(homeConfig, fetchFn = globalThis.fetch.bind(globalThis)) {
|
|
25
|
+
this.cfg = resolveAssistantHomeConfig(homeConfig);
|
|
26
|
+
this.fetchFn = fetchFn;
|
|
27
|
+
}
|
|
28
|
+
listAliases() {
|
|
29
|
+
return { ...this.cfg.aliases };
|
|
30
|
+
}
|
|
31
|
+
resolveAlias(alias) {
|
|
32
|
+
const key = alias.trim();
|
|
33
|
+
const entity = this.cfg.aliases?.[key];
|
|
34
|
+
if (!entity) {
|
|
35
|
+
throw new Error(`未知设备别名: ${alias}(可用: ${Object.keys(this.cfg.aliases ?? {}).join('、') || '无'})`);
|
|
36
|
+
}
|
|
37
|
+
return entity;
|
|
38
|
+
}
|
|
39
|
+
baseUrl() {
|
|
40
|
+
const url = this.cfg.restUrl?.replace(/\/$/, '');
|
|
41
|
+
if (!url)
|
|
42
|
+
throw new Error('assistant.home.restUrl 未配置');
|
|
43
|
+
return url;
|
|
44
|
+
}
|
|
45
|
+
token() {
|
|
46
|
+
if (!this.cfg.restToken)
|
|
47
|
+
throw new Error('assistant.home.restToken 未配置');
|
|
48
|
+
return this.cfg.restToken;
|
|
49
|
+
}
|
|
50
|
+
async haRequest(path, init) {
|
|
51
|
+
const url = `${this.baseUrl()}${path}`;
|
|
52
|
+
const res = await this.fetchFn(url, {
|
|
53
|
+
...init,
|
|
54
|
+
headers: {
|
|
55
|
+
Authorization: `Bearer ${this.token()}`,
|
|
56
|
+
'Content-Type': 'application/json',
|
|
57
|
+
...(init?.headers ?? {}),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
const body = await res.text().catch(() => '');
|
|
62
|
+
throw new Error(`HA API ${res.status}: ${body.slice(0, 200) || res.statusText}`);
|
|
63
|
+
}
|
|
64
|
+
if (res.status === 204)
|
|
65
|
+
return null;
|
|
66
|
+
const text = await res.text();
|
|
67
|
+
if (!text)
|
|
68
|
+
return null;
|
|
69
|
+
return JSON.parse(text);
|
|
70
|
+
}
|
|
71
|
+
async getState(alias) {
|
|
72
|
+
const entityId = this.resolveAlias(alias);
|
|
73
|
+
const raw = await this.haRequest(`/api/states/${encodeURIComponent(entityId)}`);
|
|
74
|
+
return {
|
|
75
|
+
entityId,
|
|
76
|
+
state: String(raw.state ?? 'unknown'),
|
|
77
|
+
attributes: raw.attributes ?? {},
|
|
78
|
+
lastChanged: raw.last_changed,
|
|
79
|
+
lastUpdated: raw.last_updated,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
resolveServiceForToggle(entityId, on) {
|
|
83
|
+
const domain = parseEntityDomain(entityId);
|
|
84
|
+
const mapped = DOMAIN_SERVICE_MAP[domain];
|
|
85
|
+
const service = on ? mapped?.on : mapped?.off;
|
|
86
|
+
if (!service) {
|
|
87
|
+
throw new Error(`不支持的控制类型: ${domain}(entity: ${entityId})`);
|
|
88
|
+
}
|
|
89
|
+
return { domain, service };
|
|
90
|
+
}
|
|
91
|
+
async callService(alias, service, data) {
|
|
92
|
+
const entityId = this.resolveAlias(alias);
|
|
93
|
+
const domain = parseEntityDomain(entityId);
|
|
94
|
+
await this.haRequest(`/api/services/${domain}/${service}`, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
body: JSON.stringify({ entity_id: entityId, ...data }),
|
|
97
|
+
});
|
|
98
|
+
logger.debug(formatCompact({ op: 'ha_service', alias, entityId, domain, service }));
|
|
99
|
+
}
|
|
100
|
+
async turnOn(alias) {
|
|
101
|
+
const entityId = this.resolveAlias(alias);
|
|
102
|
+
const { domain, service } = this.resolveServiceForToggle(entityId, true);
|
|
103
|
+
await this.callService(alias, service);
|
|
104
|
+
return { alias, entityId, service: `${domain}.${service}` };
|
|
105
|
+
}
|
|
106
|
+
async turnOff(alias) {
|
|
107
|
+
const entityId = this.resolveAlias(alias);
|
|
108
|
+
const { domain, service } = this.resolveServiceForToggle(entityId, false);
|
|
109
|
+
await this.callService(alias, service);
|
|
110
|
+
return { alias, entityId, service: `${domain}.${service}` };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=home-assistant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home-assistant.js","sourceRoot":"","sources":["../../../src/assistant/domains/home-assistant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AssistantEventsConfig } from './config.js';
|
|
2
|
+
import type { AssistantEventRequest, AssistantEventResult } from './event-types.js';
|
|
3
|
+
import type { AssistantJobEngine } from './job-engine.js';
|
|
4
|
+
import type { AssistantJobStore } from './job-store.js';
|
|
5
|
+
export interface AssistantEventIngressOptions {
|
|
6
|
+
store: AssistantJobStore;
|
|
7
|
+
engine: AssistantJobEngine;
|
|
8
|
+
eventsConfig?: AssistantEventsConfig;
|
|
9
|
+
}
|
|
10
|
+
export declare class AssistantEventIngress {
|
|
11
|
+
private store;
|
|
12
|
+
private engine;
|
|
13
|
+
private eventsCfg;
|
|
14
|
+
private rateBuckets;
|
|
15
|
+
constructor(options: AssistantEventIngressOptions);
|
|
16
|
+
isEnabled(): boolean;
|
|
17
|
+
checkRateLimit(source: string): boolean;
|
|
18
|
+
validateSource(source: string): string | null;
|
|
19
|
+
validateRequest(body: unknown): {
|
|
20
|
+
ok: true;
|
|
21
|
+
data: AssistantEventRequest;
|
|
22
|
+
} | {
|
|
23
|
+
ok: false;
|
|
24
|
+
error: string;
|
|
25
|
+
};
|
|
26
|
+
handle(body: unknown): Promise<AssistantEventResult>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-ingress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-ingress.d.ts","sourceRoot":"","sources":["../../src/assistant/event-ingress.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKxD,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAOD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,SAAS,CAAkD;IACnE,OAAO,CAAC,WAAW,CAAiC;gBAExC,OAAO,EAAE,4BAA4B;IAMjD,SAAS,IAAI,OAAO;IAIpB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAcvC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS7C,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,qBAAqB,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAmClG,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA2D3D"}
|