@zhin.js/agent 0.1.28 → 0.1.30
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 +1 -1
- 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/ai-event-bus.d.ts.map +1 -1
- package/lib/ai-event-bus.js +19 -12
- package/lib/ai-event-bus.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 +2 -6
- package/lib/bootstrap.d.ts.map +1 -1
- package/lib/bootstrap.js +5 -38
- 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 +9 -9
- 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/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/common-adapter-tools.d.ts.map +1 -1
- package/lib/common-adapter-tools.js +1 -1
- package/lib/common-adapter-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 +11 -0
- package/lib/config/normalize-ai-config.d.ts.map +1 -0
- package/lib/config/normalize-ai-config.js +55 -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 +46 -0
- package/lib/config/provider-instance.js.map +1 -0
- package/lib/config/types.d.ts +35 -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 +35 -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.map +1 -1
- package/lib/deferred-worker-runner.js +0 -1
- 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/discovery/tools.d.ts +1 -1
- package/lib/discovery/tools.d.ts.map +1 -1
- package/lib/discovery/tools.js +7 -7
- package/lib/discovery/tools.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 -6
- 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 +7 -0
- package/lib/init/activate-ai-database-storage.d.ts.map +1 -0
- package/lib/init/activate-ai-database-storage.js +28 -0
- package/lib/init/activate-ai-database-storage.js.map +1 -0
- package/lib/init/create-zhin-agent.d.ts.map +1 -1
- package/lib/init/create-zhin-agent.js +179 -67
- 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 +165 -24
- 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 +3 -5
- package/lib/init/register-db-models.js.map +1 -1
- package/lib/init/register-db-upgrade.d.ts +1 -4
- package/lib/init/register-db-upgrade.d.ts.map +1 -1
- package/lib/init/register-db-upgrade.js +25 -41
- 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 +3 -2
- package/lib/init/register-management-tools.d.ts.map +1 -1
- package/lib/init/register-management-tools.js +43 -14
- 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 +0 -1
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +5 -4
- 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 +23 -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/monitoring/metrics.d.ts +4 -0
- package/lib/monitoring/metrics.d.ts.map +1 -1
- package/lib/monitoring/metrics.js +20 -0
- package/lib/monitoring/metrics.js.map +1 -1
- package/lib/orchestrator/agent-dispatcher.d.ts +14 -2
- package/lib/orchestrator/agent-dispatcher.d.ts.map +1 -1
- package/lib/orchestrator/agent-dispatcher.js +58 -3
- package/lib/orchestrator/agent-dispatcher.js.map +1 -1
- package/lib/orchestrator/index.d.ts +1 -1
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +1 -1
- package/lib/orchestrator/index.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-registry.d.ts +3 -3
- package/lib/orchestrator/tool-registry.d.ts.map +1 -1
- package/lib/orchestrator/tool-registry.js +9 -9
- package/lib/orchestrator/tool-registry.js.map +1 -1
- package/lib/orchestrator/tool-selection.d.ts +2 -7
- package/lib/orchestrator/tool-selection.d.ts.map +1 -1
- package/lib/orchestrator/tool-selection.js +8 -44
- package/lib/orchestrator/tool-selection.js.map +1 -1
- package/lib/orchestrator/types.d.ts +4 -24
- package/lib/orchestrator/types.d.ts.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/anomaly-detection.d.ts +2 -0
- package/lib/security/anomaly-detection.d.ts.map +1 -1
- package/lib/security/anomaly-detection.js +10 -4
- package/lib/security/anomaly-detection.js.map +1 -1
- package/lib/security/budget-limiter.d.ts +2 -0
- package/lib/security/budget-limiter.d.ts.map +1 -1
- package/lib/security/budget-limiter.js +13 -1
- package/lib/security/budget-limiter.js.map +1 -1
- package/lib/security/dangerous-tool-policy.d.ts.map +1 -1
- package/lib/security/dangerous-tool-policy.js +56 -19
- package/lib/security/dangerous-tool-policy.js.map +1 -1
- package/lib/security/exec-policy.js +4 -4
- package/lib/security/exec-policy.js.map +1 -1
- 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/security/file-role-policy.d.ts +11 -20
- package/lib/security/file-role-policy.d.ts.map +1 -1
- package/lib/security/file-role-policy.js +24 -26
- package/lib/security/file-role-policy.js.map +1 -1
- package/lib/security/network-policy.d.ts +2 -0
- package/lib/security/network-policy.d.ts.map +1 -1
- package/lib/security/network-policy.js +11 -1
- package/lib/security/network-policy.js.map +1 -1
- package/lib/security/owner-approve-always-store.d.ts +2 -1
- package/lib/security/owner-approve-always-store.d.ts.map +1 -1
- package/lib/security/owner-approve-always-store.js +32 -30
- package/lib/security/owner-approve-always-store.js.map +1 -1
- package/lib/service.d.ts +13 -3
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +45 -37
- 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 +114 -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 +173 -48
- 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/builtin-tools.d.ts +2 -2
- package/lib/zhin-agent/builtin-tools.d.ts.map +1 -1
- package/lib/zhin-agent/builtin-tools.js +33 -46
- package/lib/zhin-agent/builtin-tools.js.map +1 -1
- package/lib/zhin-agent/config.d.ts +15 -13
- package/lib/zhin-agent/config.d.ts.map +1 -1
- package/lib/zhin-agent/config.js +16 -13
- package/lib/zhin-agent/config.js.map +1 -1
- 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 +29 -5
- package/lib/zhin-agent/index.d.ts.map +1 -1
- package/lib/zhin-agent/index.js +110 -9
- package/lib/zhin-agent/index.js.map +1 -1
- package/lib/zhin-agent/llm-runner.d.ts +3 -1
- package/lib/zhin-agent/llm-runner.d.ts.map +1 -1
- package/lib/zhin-agent/llm-runner.js +78 -0
- package/lib/zhin-agent/llm-runner.js.map +1 -1
- package/lib/zhin-agent/prompt-assembly.d.ts.map +1 -1
- package/lib/zhin-agent/prompt-assembly.js +4 -9
- package/lib/zhin-agent/prompt-assembly.js.map +1 -1
- package/lib/zhin-agent/prompt.d.ts +8 -3
- package/lib/zhin-agent/prompt.d.ts.map +1 -1
- package/lib/zhin-agent/prompt.js +239 -150
- package/lib/zhin-agent/prompt.js.map +1 -1
- package/lib/zhin-agent/session-io.d.ts +17 -7
- package/lib/zhin-agent/session-io.d.ts.map +1 -1
- package/lib/zhin-agent/session-io.js +62 -11
- package/lib/zhin-agent/session-io.js.map +1 -1
- package/lib/zhin-agent/task-continuation.d.ts.map +1 -1
- package/lib/zhin-agent/task-continuation.js +8 -2
- package/lib/zhin-agent/task-continuation.js.map +1 -1
- package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
- package/lib/zhin-agent/tool-calls-user-format.js +5 -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 +18 -9
- 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 -6
- 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-pipeline.d.ts.map +1 -1
- package/lib/zhin-agent/turn-pipeline.js +135 -47
- 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 +12 -3
- 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 +4 -4
- package/lib/init/register-message-recorder.d.ts +0 -3
- package/lib/init/register-message-recorder.d.ts.map +0 -1
- package/lib/init/register-message-recorder.js +0 -27
- package/lib/init/register-message-recorder.js.map +0 -1
package/README.md
CHANGED
|
@@ -148,7 +148,7 @@ ai:
|
|
|
148
148
|
框架已提供 **SubagentManager**:主 ZhinAgent 通过工具 `spawn_task` 把复杂/耗时任务派给**后台子 Agent** 异步执行,子 Agent 默认仅用受限工具集(文件、Shell、网络搜索等),完成后通过回调把结果发回主会话。
|
|
149
149
|
|
|
150
150
|
- 主对话不阻塞,用户可继续聊天。
|
|
151
|
-
- 子 Agent 由 `ZhinAgent.initSubagentManager(createTools)` 在 init
|
|
151
|
+
- 子 Agent 由 `ZhinAgent.initSubagentManager(createTools)` 在 init 时挂好;`spawn_task` 为主编排序列化常驻工具(见 `orchestratorTools` / `DEFAULT_ORCHESTRATOR_TOOLS`)。
|
|
152
152
|
- 用户说「后台帮我整理这份文档」时,主 Agent 可调用 `spawn_task({ task: '...', label: '...' })`,子任务在后台跑完后再通知用户。
|
|
153
153
|
|
|
154
154
|
无需额外配置即可使用;若需放宽子 Agent 的工具范围,使用 `ai.agent.subagentTools` 显式追加白名单(不会自动继承主会话全部 skill/tool)。
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-event-bus.d.ts","sourceRoot":"","sources":["../src/ai-event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-event-bus.d.ts","sourceRoot":"","sources":["../src/ai-event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAEnD,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,cAAc;IAChE,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,uBAAwB,SAAQ,MAAM,CAAC,cAAc;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAwBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,EACvC,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAAC,cAAc,CAmCvB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,IAAI,mBAAmB,CAEpG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,IAAI,uBAAuB,CAK5G;AAWD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAEvG;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI,CAE3G;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,IAAI,GAAG,MAAM,IAAI,CAEnH"}
|
package/lib/ai-event-bus.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
+
import { resolveIMSessionIdFromToolContext } from '@zhin.js/ai';
|
|
1
2
|
function resolveSessionId(event) {
|
|
2
3
|
if (event.sessionId)
|
|
3
4
|
return event.sessionId;
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
const scope = (typeof event.context.scope === 'string'
|
|
6
|
+
? event.context.scope
|
|
7
|
+
: 'private');
|
|
8
|
+
return resolveIMSessionIdFromToolContext({
|
|
9
|
+
platform: typeof event.context.platform === 'string' ? event.context.platform : 'system',
|
|
10
|
+
botId: typeof event.context.botId === 'string' ? event.context.botId : 'default',
|
|
11
|
+
scope,
|
|
12
|
+
sceneId: typeof event.context.sceneId === 'string'
|
|
13
|
+
? event.context.sceneId
|
|
14
|
+
: typeof event.context.channelId === 'string'
|
|
15
|
+
? event.context.channelId
|
|
16
|
+
: undefined,
|
|
17
|
+
senderId: typeof event.context.senderId === 'string'
|
|
18
|
+
? event.context.senderId
|
|
19
|
+
: typeof event.context.from === 'string'
|
|
20
|
+
? event.context.from
|
|
21
|
+
: undefined,
|
|
22
|
+
});
|
|
16
23
|
}
|
|
17
24
|
export function createAIHookBusPayload(event, source, agentId) {
|
|
18
25
|
return {
|
package/lib/ai-event-bus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-event-bus.js","sourceRoot":"","sources":["../src/ai-event-bus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-event-bus.js","sourceRoot":"","sources":["../src/ai-event-bus.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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assistant Event Ingress — 外部事件入队并触发 Job 执行(M2)
|
|
3
|
+
*/
|
|
4
|
+
import { Logger } from '@zhin.js/core';
|
|
5
|
+
import { formatCompact } from '@zhin.js/logger';
|
|
6
|
+
import { resolveAssistantEventsConfig } from './config.js';
|
|
7
|
+
const logger = new Logger(null, 'assistant-event-ingress');
|
|
8
|
+
export class AssistantEventIngress {
|
|
9
|
+
store;
|
|
10
|
+
engine;
|
|
11
|
+
eventsCfg;
|
|
12
|
+
rateBuckets = new Map();
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.store = options.store;
|
|
15
|
+
this.engine = options.engine;
|
|
16
|
+
this.eventsCfg = resolveAssistantEventsConfig(options.eventsConfig);
|
|
17
|
+
}
|
|
18
|
+
isEnabled() {
|
|
19
|
+
return this.eventsCfg.enabled;
|
|
20
|
+
}
|
|
21
|
+
checkRateLimit(source) {
|
|
22
|
+
const limit = this.eventsCfg.rateLimitPerMinute;
|
|
23
|
+
if (limit <= 0)
|
|
24
|
+
return true;
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
const bucket = this.rateBuckets.get(source);
|
|
27
|
+
if (!bucket || now - bucket.windowStart >= 60_000) {
|
|
28
|
+
this.rateBuckets.set(source, { windowStart: now, count: 1 });
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (bucket.count >= limit)
|
|
32
|
+
return false;
|
|
33
|
+
bucket.count += 1;
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
validateSource(source) {
|
|
37
|
+
const allowed = this.eventsCfg.allowedSources;
|
|
38
|
+
if (!allowed || allowed.length === 0)
|
|
39
|
+
return null;
|
|
40
|
+
if (!allowed.includes(source)) {
|
|
41
|
+
return `source "${source}" not in allowedSources`;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
validateRequest(body) {
|
|
46
|
+
if (!body || typeof body !== 'object') {
|
|
47
|
+
return { ok: false, error: 'body must be a JSON object' };
|
|
48
|
+
}
|
|
49
|
+
const raw = body;
|
|
50
|
+
const source = typeof raw.source === 'string' ? raw.source.trim() : '';
|
|
51
|
+
if (!source)
|
|
52
|
+
return { ok: false, error: 'source is required' };
|
|
53
|
+
const jobId = typeof raw.jobId === 'string' ? raw.jobId.trim() : undefined;
|
|
54
|
+
const action = raw.action;
|
|
55
|
+
const hasAction = action && typeof action === 'object' && action.kind === 'agent'
|
|
56
|
+
&& typeof action.prompt === 'string' && action.prompt.trim().length > 0;
|
|
57
|
+
if (!jobId && !hasAction) {
|
|
58
|
+
return { ok: false, error: 'jobId or action.kind=agent with prompt is required' };
|
|
59
|
+
}
|
|
60
|
+
if (jobId && hasAction) {
|
|
61
|
+
return { ok: false, error: 'jobId and action are mutually exclusive' };
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
ok: true,
|
|
65
|
+
data: {
|
|
66
|
+
eventId: typeof raw.eventId === 'string' ? raw.eventId.trim() : undefined,
|
|
67
|
+
source,
|
|
68
|
+
type: typeof raw.type === 'string' ? raw.type : undefined,
|
|
69
|
+
payload: raw.payload,
|
|
70
|
+
jobId,
|
|
71
|
+
action: hasAction ? action : undefined,
|
|
72
|
+
notify: raw.notify,
|
|
73
|
+
label: typeof raw.label === 'string' ? raw.label : undefined,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async handle(body) {
|
|
78
|
+
if (!this.isEnabled()) {
|
|
79
|
+
return { ok: false, status: 'error', error: 'assistant.events is disabled' };
|
|
80
|
+
}
|
|
81
|
+
const parsed = this.validateRequest(body);
|
|
82
|
+
if (!parsed.ok) {
|
|
83
|
+
return { ok: false, status: 'error', error: parsed.error };
|
|
84
|
+
}
|
|
85
|
+
const req = parsed.data;
|
|
86
|
+
const sourceErr = this.validateSource(req.source);
|
|
87
|
+
if (sourceErr) {
|
|
88
|
+
return { ok: false, status: 'error', error: sourceErr };
|
|
89
|
+
}
|
|
90
|
+
if (!this.checkRateLimit(req.source)) {
|
|
91
|
+
return { ok: false, status: 'error', error: 'rate limit exceeded' };
|
|
92
|
+
}
|
|
93
|
+
if (req.eventId) {
|
|
94
|
+
const existing = await this.store.findEventJobByEventId(req.eventId);
|
|
95
|
+
if (existing) {
|
|
96
|
+
logger.debug(formatCompact({ op: 'event_deduped', eventId: req.eventId, jobId: existing.id }));
|
|
97
|
+
return { ok: true, jobId: existing.id, status: 'deduped', deduped: true };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
if (req.jobId) {
|
|
102
|
+
const job = await this.store.getJob(req.jobId);
|
|
103
|
+
if (!job) {
|
|
104
|
+
return { ok: false, status: 'error', error: `job not found: ${req.jobId}` };
|
|
105
|
+
}
|
|
106
|
+
void this.engine.runJobNow(req.jobId);
|
|
107
|
+
logger.info(formatCompact({ op: 'event_trigger', jobId: req.jobId, source: req.source }));
|
|
108
|
+
return { ok: true, jobId: req.jobId, status: 'queued' };
|
|
109
|
+
}
|
|
110
|
+
const jobId = `event_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
111
|
+
await this.store.createEventJob({
|
|
112
|
+
id: jobId,
|
|
113
|
+
label: req.label || `event:${req.source}`,
|
|
114
|
+
action: req.action,
|
|
115
|
+
notify: req.notify,
|
|
116
|
+
source: req.source,
|
|
117
|
+
eventType: req.type,
|
|
118
|
+
eventId: req.eventId,
|
|
119
|
+
payload: req.payload,
|
|
120
|
+
});
|
|
121
|
+
void this.engine.runJobNow(jobId);
|
|
122
|
+
logger.info(formatCompact({ op: 'event_enqueue', jobId, source: req.source, type: req.type }));
|
|
123
|
+
return { ok: true, jobId, status: 'queued' };
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
const error = e?.message || String(e);
|
|
127
|
+
logger.warn(formatCompact({ op: 'event_error', error }));
|
|
128
|
+
return { ok: false, status: 'error', error };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=event-ingress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-ingress.js","sourceRoot":"","sources":["../../src/assistant/event-ingress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assistant Event Ingress — 请求/响应类型(M2)
|
|
3
|
+
*/
|
|
4
|
+
import type { JobAction, JobNotify } from './types.js';
|
|
5
|
+
export interface AssistantEventRequest {
|
|
6
|
+
/** 幂等键;同 eventId 已存在则跳过重复执行 */
|
|
7
|
+
eventId?: string;
|
|
8
|
+
/** 事件来源,如 homeassistant / script */
|
|
9
|
+
source: string;
|
|
10
|
+
/** 事件类型,如 state_changed */
|
|
11
|
+
type?: string;
|
|
12
|
+
payload?: unknown;
|
|
13
|
+
/** 触发已注册的 Job(cron / event 等) */
|
|
14
|
+
jobId?: string;
|
|
15
|
+
/** 一次性内联 Agent 任务(与 jobId 二选一) */
|
|
16
|
+
action?: JobAction;
|
|
17
|
+
notify?: JobNotify;
|
|
18
|
+
label?: string;
|
|
19
|
+
}
|
|
20
|
+
export type AssistantEventStatus = 'queued' | 'running' | 'deduped' | 'error';
|
|
21
|
+
export interface AssistantEventResult {
|
|
22
|
+
ok: boolean;
|
|
23
|
+
jobId?: string;
|
|
24
|
+
status: AssistantEventStatus;
|
|
25
|
+
deduped?: boolean;
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../src/assistant/event-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-types.js","sourceRoot":"","sources":["../../src/assistant/event-types.ts"],"names":[],"mappings":""}
|