agent-nuvira 2.7.2 → 3.0.0
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/dist/agents/agents/writer-tool-calling.d.ts +14 -0
- package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
- package/dist/agents/agents/writer-tool-calling.js +20 -0
- package/dist/agents/agents/writer-tool-calling.js.map +1 -1
- package/dist/agents/agents/writer.d.ts.map +1 -1
- package/dist/agents/agents/writer.js +15 -4
- package/dist/agents/agents/writer.js.map +1 -1
- package/dist/agents/edit-module.d.ts +7 -0
- package/dist/agents/edit-module.d.ts.map +1 -1
- package/dist/agents/edit-module.js +21 -6
- package/dist/agents/edit-module.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +40 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +116 -27
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/tool-calling-agent.d.ts +19 -0
- package/dist/agents/tool-calling-agent.d.ts.map +1 -1
- package/dist/agents/tool-calling-agent.js +42 -2
- package/dist/agents/tool-calling-agent.js.map +1 -1
- package/dist/auth-api.d.ts +2 -0
- package/dist/auth-api.d.ts.map +1 -0
- package/dist/auth-api.js +61 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/auth.test.d.ts +1 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +3 -0
- package/dist/auth.test.js.map +1 -0
- package/dist/cli/chat.d.ts +66 -1
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +323 -77
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts +6 -0
- package/dist/cli/cli-program.d.ts.map +1 -0
- package/dist/cli/cli-program.js +222 -0
- package/dist/cli/cli-program.js.map +1 -0
- package/dist/cli/edit.d.ts.map +1 -1
- package/dist/cli/edit.js +18 -3
- package/dist/cli/edit.js.map +1 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +29 -5
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/failover-runner.d.ts +13 -0
- package/dist/cli/failover-runner.d.ts.map +1 -1
- package/dist/cli/failover-runner.js +11 -0
- package/dist/cli/failover-runner.js.map +1 -1
- package/dist/cli/gateway.d.ts +16 -0
- package/dist/cli/gateway.d.ts.map +1 -1
- package/dist/cli/gateway.js +108 -2
- package/dist/cli/gateway.js.map +1 -1
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +296 -20
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +20 -6
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/process-control.d.ts +10 -0
- package/dist/cli/process-control.d.ts.map +1 -1
- package/dist/cli/process-control.js +73 -7
- package/dist/cli/process-control.js.map +1 -1
- package/dist/cli/router.d.ts +16 -5
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +31 -206
- package/dist/cli/router.js.map +1 -1
- package/dist/config/paths.d.ts +23 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +30 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/provider-env.d.ts +37 -0
- package/dist/config/provider-env.d.ts.map +1 -0
- package/dist/config/provider-env.js +86 -0
- package/dist/config/provider-env.js.map +1 -0
- package/dist/context/history.d.ts.map +1 -1
- package/dist/context/history.js +24 -8
- package/dist/context/history.js.map +1 -1
- package/dist/context/session-recall.d.ts +30 -0
- package/dist/context/session-recall.d.ts.map +1 -1
- package/dist/context/session-recall.js +61 -0
- package/dist/context/session-recall.js.map +1 -1
- package/dist/file.js +0 -1
- package/dist/file.js.map +1 -1
- package/dist/gateway/adapters.d.ts +10 -0
- package/dist/gateway/adapters.d.ts.map +1 -1
- package/dist/gateway/adapters.js +4 -1
- package/dist/gateway/adapters.js.map +1 -1
- package/dist/gateway/dedup.d.ts +105 -0
- package/dist/gateway/dedup.d.ts.map +1 -0
- package/dist/gateway/dedup.js +160 -0
- package/dist/gateway/dedup.js.map +1 -0
- package/dist/gateway/heartbeat.d.ts +99 -0
- package/dist/gateway/heartbeat.d.ts.map +1 -0
- package/dist/gateway/heartbeat.js +122 -0
- package/dist/gateway/heartbeat.js.map +1 -0
- package/dist/gateway/inbox.d.ts +14 -1
- package/dist/gateway/inbox.d.ts.map +1 -1
- package/dist/gateway/inbox.js.map +1 -1
- package/dist/gateway/platform-config.d.ts +5 -0
- package/dist/gateway/platform-config.d.ts.map +1 -1
- package/dist/gateway/platform-config.js +8 -13
- package/dist/gateway/platform-config.js.map +1 -1
- package/dist/gateway/registry.d.ts +65 -0
- package/dist/gateway/registry.d.ts.map +1 -1
- package/dist/gateway/registry.js +307 -32
- package/dist/gateway/registry.js.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.js +64 -1
- package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
- package/dist/gateway/whatsapp/bridge.d.ts +4 -2
- package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/bridge.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inference/factory.d.ts +16 -0
- package/dist/inference/factory.d.ts.map +1 -1
- package/dist/inference/factory.js +42 -0
- package/dist/inference/factory.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +3 -0
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/interface.d.ts +12 -0
- package/dist/inference/interface.d.ts.map +1 -1
- package/dist/inference/local-adapter.d.ts +2 -0
- package/dist/inference/local-adapter.d.ts.map +1 -1
- package/dist/inference/local-adapter.js +36 -5
- package/dist/inference/local-adapter.js.map +1 -1
- package/dist/inference/model-catalog.d.ts +8 -0
- package/dist/inference/model-catalog.d.ts.map +1 -1
- package/dist/inference/model-catalog.js +40 -0
- package/dist/inference/model-catalog.js.map +1 -1
- package/dist/inference/model-probe.d.ts +7 -0
- package/dist/inference/model-probe.d.ts.map +1 -1
- package/dist/inference/model-probe.js +25 -7
- package/dist/inference/model-probe.js.map +1 -1
- package/dist/inference/native-tools.d.ts +8 -0
- package/dist/inference/native-tools.d.ts.map +1 -1
- package/dist/inference/native-tools.js +14 -3
- package/dist/inference/native-tools.js.map +1 -1
- package/dist/inference/tool-call-utils.d.ts +66 -7
- package/dist/inference/tool-call-utils.d.ts.map +1 -1
- package/dist/inference/tool-call-utils.js +134 -13
- package/dist/inference/tool-call-utils.js.map +1 -1
- package/dist/learning/auto-router.d.ts +21 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +282 -21
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/context-budget.d.ts +133 -0
- package/dist/learning/context-budget.d.ts.map +1 -0
- package/dist/learning/context-budget.js +196 -0
- package/dist/learning/context-budget.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -1
- package/dist/learning/cost-tracker.js +20 -8
- package/dist/learning/cost-tracker.js.map +1 -1
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +6 -2
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/failure-bookkeeping.d.ts +41 -0
- package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
- package/dist/learning/failure-bookkeeping.js +122 -4
- package/dist/learning/failure-bookkeeping.js.map +1 -1
- package/dist/learning/feedback.d.ts.map +1 -1
- package/dist/learning/feedback.js +19 -8
- package/dist/learning/feedback.js.map +1 -1
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +5 -11
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-harness.d.ts +76 -0
- package/dist/learning/model-harness.d.ts.map +1 -0
- package/dist/learning/model-harness.js +119 -0
- package/dist/learning/model-harness.js.map +1 -0
- package/dist/learning/model-registry.d.ts +29 -0
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +129 -3
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/model-scoring.d.ts.map +1 -1
- package/dist/learning/model-scoring.js +6 -1
- package/dist/learning/model-scoring.js.map +1 -1
- package/dist/learning/model-selection.d.ts +15 -0
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +40 -1
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/provider-fallback.d.ts +12 -0
- package/dist/learning/provider-fallback.d.ts.map +1 -1
- package/dist/learning/provider-fallback.js +84 -0
- package/dist/learning/provider-fallback.js.map +1 -1
- package/dist/learning/provider-revival.d.ts +106 -0
- package/dist/learning/provider-revival.d.ts.map +1 -0
- package/dist/learning/provider-revival.js +154 -0
- package/dist/learning/provider-revival.js.map +1 -0
- package/dist/learning/quota-ledger.d.ts +64 -3
- package/dist/learning/quota-ledger.d.ts.map +1 -1
- package/dist/learning/quota-ledger.js +122 -9
- package/dist/learning/quota-ledger.js.map +1 -1
- package/dist/learning/resilient-call.d.ts +98 -0
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +252 -46
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/nlu/conversation-gate.d.ts +37 -0
- package/dist/nlu/conversation-gate.d.ts.map +1 -1
- package/dist/nlu/conversation-gate.js +49 -0
- package/dist/nlu/conversation-gate.js.map +1 -1
- package/dist/nlu/schema.d.ts +4 -4
- package/dist/observability/dag-bridge.d.ts +69 -0
- package/dist/observability/dag-bridge.d.ts.map +1 -0
- package/dist/observability/dag-bridge.js +56 -0
- package/dist/observability/dag-bridge.js.map +1 -0
- package/dist/observability/event-bus.d.ts +5 -10
- package/dist/observability/event-bus.d.ts.map +1 -1
- package/dist/observability/event-bus.js +10 -42
- package/dist/observability/event-bus.js.map +1 -1
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +41 -36
- package/dist/routes/auth.js.map +1 -0
- package/dist/skills/execution-audit.d.ts.map +1 -1
- package/dist/skills/execution-audit.js +17 -5
- package/dist/skills/execution-audit.js.map +1 -1
- package/dist/skills/sandbox-executor.d.ts +12 -1
- package/dist/skills/sandbox-executor.d.ts.map +1 -1
- package/dist/skills/sandbox-executor.js +28 -6
- package/dist/skills/sandbox-executor.js.map +1 -1
- package/dist/skills/secret-capture.d.ts +45 -1
- package/dist/skills/secret-capture.d.ts.map +1 -1
- package/dist/skills/secret-capture.js +82 -19
- package/dist/skills/secret-capture.js.map +1 -1
- package/dist/skills/skill-env-inventory.d.ts +79 -0
- package/dist/skills/skill-env-inventory.d.ts.map +1 -0
- package/dist/skills/skill-env-inventory.js +167 -0
- package/dist/skills/skill-env-inventory.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +2 -0
- package/dist/skills/skill-executor.d.ts.map +1 -1
- package/dist/skills/skill-executor.js +19 -24
- package/dist/skills/skill-executor.js.map +1 -1
- package/dist/tools/ask-user.d.ts +14 -1
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +25 -1
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/followup-utils.d.ts +64 -0
- package/dist/tools/followup-utils.d.ts.map +1 -0
- package/dist/tools/followup-utils.js +158 -0
- package/dist/tools/followup-utils.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +35 -0
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +76 -0
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/pipeline-tool.d.ts.map +1 -1
- package/dist/tools/pipeline-tool.js +8 -3
- package/dist/tools/pipeline-tool.js.map +1 -1
- package/dist/tools/registry.d.ts +25 -12
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +31 -6
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/skill-tool.d.ts.map +1 -1
- package/dist/tools/skill-tool.js +52 -5
- package/dist/tools/skill-tool.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +63 -1
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +305 -66
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/toolsets.d.ts +19 -3
- package/dist/tools/toolsets.d.ts.map +1 -1
- package/dist/tools/toolsets.js +21 -5
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +9 -13
- package/dist/utils/env.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +13 -1
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +16 -2
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/hub-data.d.ts +2 -0
- package/dist/web-dashboard/hub-data.d.ts.map +1 -1
- package/dist/web-dashboard/hub-data.js +4 -0
- package/dist/web-dashboard/hub-data.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +6 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +196 -3
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +31 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/package.json +11 -1
- package/src/web-dashboard/public/assets/index-56yPnN_m.js +207 -0
- package/src/web-dashboard/public/assets/index-56yPnN_m.js.map +1 -0
- package/src/web-dashboard/public/assets/{index-C507EUWf.css → index-Cyd6tIew.css} +1 -1
- package/src/web-dashboard/public/index.html +2 -2
- package/dist/example.d.ts +0 -1
- package/dist/example.d.ts.map +0 -1
- package/dist/example.js +0 -3
- package/dist/example.js.map +0 -1
- package/dist/fresh.d.ts +0 -2
- package/dist/fresh.d.ts.map +0 -1
- package/dist/fresh.js +0 -2
- package/dist/fresh.js.map +0 -1
- package/dist/mcp/mcp-dashboard-oauth.d.ts +0 -94
- package/dist/mcp/mcp-dashboard-oauth.d.ts.map +0 -1
- package/dist/mcp/mcp-dashboard-oauth.js +0 -140
- package/dist/mcp/mcp-dashboard-oauth.js.map +0 -1
- package/dist/memory/background-sync.d.ts +0 -107
- package/dist/memory/background-sync.d.ts.map +0 -1
- package/dist/memory/background-sync.js +0 -242
- package/dist/memory/background-sync.js.map +0 -1
- package/dist/memory/cross-session.d.ts +0 -68
- package/dist/memory/cross-session.d.ts.map +0 -1
- package/dist/memory/cross-session.js +0 -153
- package/dist/memory/cross-session.js.map +0 -1
- package/dist/memory/drift-detector.d.ts +0 -76
- package/dist/memory/drift-detector.d.ts.map +0 -1
- package/dist/memory/drift-detector.js +0 -216
- package/dist/memory/drift-detector.js.map +0 -1
- package/dist/memory/enhanced-manager.d.ts +0 -105
- package/dist/memory/enhanced-manager.d.ts.map +0 -1
- package/dist/memory/enhanced-manager.js +0 -280
- package/dist/memory/enhanced-manager.js.map +0 -1
- package/dist/memory/session-extraction.d.ts +0 -93
- package/dist/memory/session-extraction.d.ts.map +0 -1
- package/dist/memory/session-extraction.js +0 -290
- package/dist/memory/session-extraction.js.map +0 -1
- package/dist/memory/sqlite-store.d.ts +0 -208
- package/dist/memory/sqlite-store.d.ts.map +0 -1
- package/dist/memory/sqlite-store.js +0 -556
- package/dist/memory/sqlite-store.js.map +0 -1
- package/dist/skills/daytona-executor.d.ts +0 -78
- package/dist/skills/daytona-executor.d.ts.map +0 -1
- package/dist/skills/daytona-executor.js +0 -256
- package/dist/skills/daytona-executor.js.map +0 -1
- package/dist/skills/modal-executor.d.ts +0 -81
- package/dist/skills/modal-executor.d.ts.map +0 -1
- package/dist/skills/modal-executor.js +0 -285
- package/dist/skills/modal-executor.js.map +0 -1
- package/dist/sync/inventory.d.ts +0 -1
- package/dist/sync/inventory.d.ts.map +0 -1
- package/dist/sync/inventory.js +0 -3
- package/dist/sync/inventory.js.map +0 -1
- package/dist/sync/validate.d.ts +0 -1
- package/dist/sync/validate.d.ts.map +0 -1
- package/dist/sync/validate.js +0 -3
- package/dist/sync/validate.js.map +0 -1
- package/dist/test.d.ts +0 -2
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -3
- package/dist/test.js.map +0 -1
- package/dist/tools/browser-tool.d.ts +0 -206
- package/dist/tools/browser-tool.d.ts.map +0 -1
- package/dist/tools/browser-tool.js +0 -726
- package/dist/tools/browser-tool.js.map +0 -1
- package/dist/tools/delegate-tool.d.ts +0 -109
- package/dist/tools/delegate-tool.d.ts.map +0 -1
- package/dist/tools/delegate-tool.js +0 -185
- package/dist/tools/delegate-tool.js.map +0 -1
- package/dist/tools/delegation-state.d.ts +0 -87
- package/dist/tools/delegation-state.d.ts.map +0 -1
- package/dist/tools/delegation-state.js +0 -278
- package/dist/tools/delegation-state.js.map +0 -1
- package/dist/tools/desktop-ui.d.ts +0 -148
- package/dist/tools/desktop-ui.d.ts.map +0 -1
- package/dist/tools/desktop-ui.js +0 -486
- package/dist/tools/desktop-ui.js.map +0 -1
- package/dist/tools/image-video-tool.d.ts +0 -88
- package/dist/tools/image-video-tool.d.ts.map +0 -1
- package/dist/tools/image-video-tool.js +0 -276
- package/dist/tools/image-video-tool.js.map +0 -1
- package/dist/tools/kanban-cron-tools.d.ts +0 -92
- package/dist/tools/kanban-cron-tools.d.ts.map +0 -1
- package/dist/tools/kanban-cron-tools.js +0 -197
- package/dist/tools/kanban-cron-tools.js.map +0 -1
- package/dist/tools/messaging-tool.d.ts +0 -127
- package/dist/tools/messaging-tool.d.ts.map +0 -1
- package/dist/tools/messaging-tool.js +0 -314
- package/dist/tools/messaging-tool.js.map +0 -1
- package/dist/tools/modality/generic-caller.d.ts +0 -43
- package/dist/tools/modality/generic-caller.d.ts.map +0 -1
- package/dist/tools/modality/generic-caller.js +0 -254
- package/dist/tools/modality/generic-caller.js.map +0 -1
- package/dist/tools/modality/modality-catalog.d.ts +0 -134
- package/dist/tools/modality/modality-catalog.d.ts.map +0 -1
- package/dist/tools/modality/modality-catalog.js +0 -445
- package/dist/tools/modality/modality-catalog.js.map +0 -1
- package/dist/tools/modality/tool-router.d.ts +0 -81
- package/dist/tools/modality/tool-router.d.ts.map +0 -1
- package/dist/tools/modality/tool-router.js +0 -84
- package/dist/tools/modality/tool-router.js.map +0 -1
- package/dist/tools/security-tools.d.ts +0 -107
- package/dist/tools/security-tools.d.ts.map +0 -1
- package/dist/tools/security-tools.js +0 -264
- package/dist/tools/security-tools.js.map +0 -1
- package/dist/tools/ssh-tool.d.ts +0 -130
- package/dist/tools/ssh-tool.d.ts.map +0 -1
- package/dist/tools/ssh-tool.js +0 -328
- package/dist/tools/ssh-tool.js.map +0 -1
- package/dist/tools/tts-tool.d.ts +0 -91
- package/dist/tools/tts-tool.d.ts.map +0 -1
- package/dist/tools/tts-tool.js +0 -406
- package/dist/tools/tts-tool.js.map +0 -1
- package/dist/utils/shell-detection.d.ts +0 -124
- package/dist/utils/shell-detection.d.ts.map +0 -1
- package/dist/utils/shell-detection.js +0 -305
- package/dist/utils/shell-detection.js.map +0 -1
- package/dist/utils/windows-paths.d.ts +0 -185
- package/dist/utils/windows-paths.d.ts.map +0 -1
- package/dist/utils/windows-paths.js +0 -472
- package/dist/utils/windows-paths.js.map +0 -1
- package/src/web-dashboard/public/assets/index-C4frng1Q.js +0 -207
- package/src/web-dashboard/public/assets/index-C4frng1Q.js.map +0 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway liveness heartbeat (`src/gateway/heartbeat.ts`).
|
|
3
|
+
*
|
|
4
|
+
* The gateway is a FOREGROUND process. When it dies — laptop slept, terminal
|
|
5
|
+
* closed, the harness killed the process group — nothing else notices: the
|
|
6
|
+
* adapters stop receiving, `gateway status` still lists every platform as
|
|
7
|
+
* "configured ✅" (that only reflects env vars), and senders keep messaging a
|
|
8
|
+
* bridge nobody is listening to. Observed live: no gateway process existed at
|
|
9
|
+
* all while the dashboard happily reported the channels as set up.
|
|
10
|
+
*
|
|
11
|
+
* This module makes that state VISIBLE and, with `--supervise`, self-healing:
|
|
12
|
+
*
|
|
13
|
+
* - the running gateway writes `~/.nuvira/gateway/heartbeat.json` every
|
|
14
|
+
* `HEARTBEAT_INTERVAL_MS` with its pid, uptime, adapter health and the
|
|
15
|
+
* supervisor's pid;
|
|
16
|
+
* - `gateway status` reads it and reports `running` / `stale` / `down` — so the
|
|
17
|
+
* answer to "is my gateway up?" is never a guess;
|
|
18
|
+
* - the heartbeat is the supervisor's liveness signal too (a supervisor that
|
|
19
|
+
* sees a stale child can restart it).
|
|
20
|
+
*
|
|
21
|
+
* Writes are best-effort: a failure to record liveness must never take the
|
|
22
|
+
* gateway down with it.
|
|
23
|
+
*/
|
|
24
|
+
/** How often the running gateway writes a beat (ms). */
|
|
25
|
+
export declare const HEARTBEAT_INTERVAL_MS = 15000;
|
|
26
|
+
/**
|
|
27
|
+
* A beat older than this means the process is gone (3 missed beats). Chosen
|
|
28
|
+
* comfortably above the interval so a slow tick never reads as a death.
|
|
29
|
+
*/
|
|
30
|
+
export declare const HEARTBEAT_STALE_AFTER_MS: number;
|
|
31
|
+
/** Health of one adapter as reported in a beat. */
|
|
32
|
+
export interface AdapterHealth {
|
|
33
|
+
platform: string;
|
|
34
|
+
configured: boolean;
|
|
35
|
+
/** Whether `start()` succeeded (and has not been declared dead since). */
|
|
36
|
+
started: boolean;
|
|
37
|
+
/** Restart attempts made so far this run. */
|
|
38
|
+
restarts: number;
|
|
39
|
+
/** Last failure message, when the adapter is not started. */
|
|
40
|
+
lastError?: string;
|
|
41
|
+
}
|
|
42
|
+
/** The on-disk beat. */
|
|
43
|
+
export interface HeartbeatFile {
|
|
44
|
+
version: 1;
|
|
45
|
+
/** The gateway process's pid. */
|
|
46
|
+
pid: number;
|
|
47
|
+
/** Epoch ms the gateway started. */
|
|
48
|
+
startedAt: number;
|
|
49
|
+
/** Epoch ms of this beat (the liveness timestamp). */
|
|
50
|
+
at: number;
|
|
51
|
+
/** How many beats have been written this run. */
|
|
52
|
+
beats: number;
|
|
53
|
+
/** True when a `gateway start --supervise` parent owns this process. */
|
|
54
|
+
supervised: boolean;
|
|
55
|
+
/** The supervisor's pid, when supervised. */
|
|
56
|
+
supervisorPid?: number;
|
|
57
|
+
/** Adapter health at beat time. */
|
|
58
|
+
adapters: AdapterHealth[];
|
|
59
|
+
}
|
|
60
|
+
/** Liveness verdict for `gateway status`. */
|
|
61
|
+
export type GatewayLiveness = 'running' | 'stale' | 'down';
|
|
62
|
+
/** The verdict + the beat behind it. */
|
|
63
|
+
export interface HeartbeatStatus {
|
|
64
|
+
state: GatewayLiveness;
|
|
65
|
+
/** Age of the last beat in ms (Infinity-ish large when there is no beat). */
|
|
66
|
+
ageMs: number;
|
|
67
|
+
beat: HeartbeatFile | null;
|
|
68
|
+
/** The heartbeat file path (always reported so an operator can inspect it). */
|
|
69
|
+
path: string;
|
|
70
|
+
}
|
|
71
|
+
/** Read/write the gateway heartbeat file. */
|
|
72
|
+
export declare class GatewayHeartbeat {
|
|
73
|
+
private file;
|
|
74
|
+
constructor(configDir?: string);
|
|
75
|
+
/** Absolute path of the heartbeat file. */
|
|
76
|
+
get beatPath(): string;
|
|
77
|
+
/** The last beat, or null when there is none / it is unreadable. */
|
|
78
|
+
read(): HeartbeatFile | null;
|
|
79
|
+
/**
|
|
80
|
+
* Classify liveness. `running` only when a beat exists AND is fresh — a
|
|
81
|
+
* beat file left behind by a crashed process must read as `down`, never as
|
|
82
|
+
* "configured and fine" (that was the silent failure).
|
|
83
|
+
*/
|
|
84
|
+
status(now?: number): HeartbeatStatus;
|
|
85
|
+
/** Write a beat. Never throws (liveness bookkeeping must not kill the gateway). */
|
|
86
|
+
beat(input: {
|
|
87
|
+
pid?: number;
|
|
88
|
+
startedAt: number;
|
|
89
|
+
beats: number;
|
|
90
|
+
supervised: boolean;
|
|
91
|
+
supervisorPid?: number;
|
|
92
|
+
adapters: AdapterHealth[];
|
|
93
|
+
}): HeartbeatFile | null;
|
|
94
|
+
/** Remove the beat on a clean shutdown (so `status` says "down", not "stale"). */
|
|
95
|
+
clear(): void;
|
|
96
|
+
}
|
|
97
|
+
/** Human-readable age ("3s", "4m", "2h 7m"). */
|
|
98
|
+
export declare function formatDuration(ms: number): string;
|
|
99
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/gateway/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAA4B,CAAC;AAElE,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAwB;AACxB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,6CAA6C;AAC7C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAS;gBAET,SAAS,CAAC,EAAE,MAAM;IAI9B,2CAA2C;IAC3C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oEAAoE;IACpE,IAAI,IAAI,aAAa,GAAG,IAAI;IAW5B;;;;OAIG;IACH,MAAM,CAAC,GAAG,SAAa,GAAG,eAAe;IAYzC,mFAAmF;IACnF,IAAI,CAAC,KAAK,EAAE;QACV,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;KAC3B,GAAG,aAAa,GAAG,IAAI;IAoBxB,kFAAkF;IAClF,KAAK,IAAI,IAAI;CAOd;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASjD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway liveness heartbeat (`src/gateway/heartbeat.ts`).
|
|
3
|
+
*
|
|
4
|
+
* The gateway is a FOREGROUND process. When it dies — laptop slept, terminal
|
|
5
|
+
* closed, the harness killed the process group — nothing else notices: the
|
|
6
|
+
* adapters stop receiving, `gateway status` still lists every platform as
|
|
7
|
+
* "configured ✅" (that only reflects env vars), and senders keep messaging a
|
|
8
|
+
* bridge nobody is listening to. Observed live: no gateway process existed at
|
|
9
|
+
* all while the dashboard happily reported the channels as set up.
|
|
10
|
+
*
|
|
11
|
+
* This module makes that state VISIBLE and, with `--supervise`, self-healing:
|
|
12
|
+
*
|
|
13
|
+
* - the running gateway writes `~/.nuvira/gateway/heartbeat.json` every
|
|
14
|
+
* `HEARTBEAT_INTERVAL_MS` with its pid, uptime, adapter health and the
|
|
15
|
+
* supervisor's pid;
|
|
16
|
+
* - `gateway status` reads it and reports `running` / `stale` / `down` — so the
|
|
17
|
+
* answer to "is my gateway up?" is never a guess;
|
|
18
|
+
* - the heartbeat is the supervisor's liveness signal too (a supervisor that
|
|
19
|
+
* sees a stale child can restart it).
|
|
20
|
+
*
|
|
21
|
+
* Writes are best-effort: a failure to record liveness must never take the
|
|
22
|
+
* gateway down with it.
|
|
23
|
+
*/
|
|
24
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
25
|
+
import { dirname, join } from 'node:path';
|
|
26
|
+
import { resolveBuffConfigDir } from '../config/paths.js';
|
|
27
|
+
/** How often the running gateway writes a beat (ms). */
|
|
28
|
+
export const HEARTBEAT_INTERVAL_MS = 15_000;
|
|
29
|
+
/**
|
|
30
|
+
* A beat older than this means the process is gone (3 missed beats). Chosen
|
|
31
|
+
* comfortably above the interval so a slow tick never reads as a death.
|
|
32
|
+
*/
|
|
33
|
+
export const HEARTBEAT_STALE_AFTER_MS = 3 * HEARTBEAT_INTERVAL_MS;
|
|
34
|
+
/** Read/write the gateway heartbeat file. */
|
|
35
|
+
export class GatewayHeartbeat {
|
|
36
|
+
file;
|
|
37
|
+
constructor(configDir) {
|
|
38
|
+
this.file = join(resolveBuffConfigDir(configDir), 'gateway', 'heartbeat.json');
|
|
39
|
+
}
|
|
40
|
+
/** Absolute path of the heartbeat file. */
|
|
41
|
+
get beatPath() {
|
|
42
|
+
return this.file;
|
|
43
|
+
}
|
|
44
|
+
/** The last beat, or null when there is none / it is unreadable. */
|
|
45
|
+
read() {
|
|
46
|
+
try {
|
|
47
|
+
if (!existsSync(this.file))
|
|
48
|
+
return null;
|
|
49
|
+
const parsed = JSON.parse(readFileSync(this.file, 'utf-8'));
|
|
50
|
+
if (!parsed || typeof parsed.at !== 'number' || typeof parsed.pid !== 'number')
|
|
51
|
+
return null;
|
|
52
|
+
return parsed;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Classify liveness. `running` only when a beat exists AND is fresh — a
|
|
60
|
+
* beat file left behind by a crashed process must read as `down`, never as
|
|
61
|
+
* "configured and fine" (that was the silent failure).
|
|
62
|
+
*/
|
|
63
|
+
status(now = Date.now()) {
|
|
64
|
+
const beat = this.read();
|
|
65
|
+
if (!beat)
|
|
66
|
+
return { state: 'down', ageMs: Number.POSITIVE_INFINITY, beat: null, path: this.file };
|
|
67
|
+
const ageMs = Math.max(0, now - beat.at);
|
|
68
|
+
return {
|
|
69
|
+
state: ageMs <= HEARTBEAT_STALE_AFTER_MS ? 'running' : 'stale',
|
|
70
|
+
ageMs,
|
|
71
|
+
beat,
|
|
72
|
+
path: this.file,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Write a beat. Never throws (liveness bookkeeping must not kill the gateway). */
|
|
76
|
+
beat(input) {
|
|
77
|
+
const record = {
|
|
78
|
+
version: 1,
|
|
79
|
+
pid: input.pid ?? process.pid,
|
|
80
|
+
startedAt: input.startedAt,
|
|
81
|
+
at: Date.now(),
|
|
82
|
+
beats: input.beats,
|
|
83
|
+
supervised: input.supervised,
|
|
84
|
+
supervisorPid: input.supervisorPid,
|
|
85
|
+
adapters: input.adapters,
|
|
86
|
+
};
|
|
87
|
+
try {
|
|
88
|
+
mkdirSync(dirname(this.file), { recursive: true });
|
|
89
|
+
writeFileSync(this.file, JSON.stringify(record, null, 2), 'utf-8');
|
|
90
|
+
return record;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Remove the beat on a clean shutdown (so `status` says "down", not "stale"). */
|
|
97
|
+
clear() {
|
|
98
|
+
try {
|
|
99
|
+
if (existsSync(this.file))
|
|
100
|
+
unlinkSync(this.file);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
/* best-effort */
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Human-readable age ("3s", "4m", "2h 7m"). */
|
|
108
|
+
export function formatDuration(ms) {
|
|
109
|
+
if (!Number.isFinite(ms))
|
|
110
|
+
return 'never';
|
|
111
|
+
const s = Math.floor(ms / 1000);
|
|
112
|
+
if (s < 60)
|
|
113
|
+
return `${s}s`;
|
|
114
|
+
const m = Math.floor(s / 60);
|
|
115
|
+
if (m < 60)
|
|
116
|
+
return `${m}m ${s % 60}s`;
|
|
117
|
+
const h = Math.floor(m / 60);
|
|
118
|
+
if (h < 24)
|
|
119
|
+
return `${h}h ${m % 60}m`;
|
|
120
|
+
return `${Math.floor(h / 24)}d ${h % 24}h`;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/gateway/heartbeat.ts"],"names":[],"mappings":"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"}
|
package/dist/gateway/inbox.d.ts
CHANGED
|
@@ -9,7 +9,13 @@
|
|
|
9
9
|
* the delivery ledger.
|
|
10
10
|
*/
|
|
11
11
|
/** How an inbound message was handled by the registry. */
|
|
12
|
-
export type InboundDisposition = 'pipeline' | 'chat' | 'help' | 'refused' | 'error'
|
|
12
|
+
export type InboundDisposition = 'pipeline' | 'chat' | 'help' | 'refused' | 'error'
|
|
13
|
+
/**
|
|
14
|
+
* A re-delivery of a message already handled (bridge reconnect, offline
|
|
15
|
+
* backfill, webhook retry). Recorded for visibility, but NOT processed and
|
|
16
|
+
* NOT answered — the sender already has the answer.
|
|
17
|
+
*/
|
|
18
|
+
| 'duplicate';
|
|
13
19
|
/** One inbound message recorded by the gateway. */
|
|
14
20
|
export interface InboxEntry {
|
|
15
21
|
id: string;
|
|
@@ -24,6 +30,13 @@ export interface InboxEntry {
|
|
|
24
30
|
isGroup?: boolean;
|
|
25
31
|
/** What the gateway did with it. */
|
|
26
32
|
handled: InboundDisposition;
|
|
33
|
+
/**
|
|
34
|
+
* Present on a `duplicate` entry: the id/fingerprint it collided with, so an
|
|
35
|
+
* operator can see WHY it was dropped rather than guessing.
|
|
36
|
+
*/
|
|
37
|
+
dedupKey?: string;
|
|
38
|
+
/** For a `duplicate`: how many times this identity has now been seen. */
|
|
39
|
+
dedupCount?: number;
|
|
27
40
|
/** The reply text sent back (when any). */
|
|
28
41
|
reply?: string;
|
|
29
42
|
/** When the message was received (epoch ms). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO;AACT;;;;GAIG;GACD,WAAW,CAAC;AAEhB,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,QAA0B,CAAC;AAE1D,oCAAoC;AACpC,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,SAAS,CAAC,EAAE,MAAM;IAI9B,wCAAwC;IACxC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,qDAAqD;IACrD,IAAI,IAAI,UAAU,EAAE;IAUpB,OAAO,CAAC,KAAK;IASb,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,UAAU;CAQzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/gateway/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AA2C1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1D,oCAAoC;AACpC,MAAM,OAAO,WAAW;IACd,IAAI,CAAS;IAErB,YAAY,SAAkB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,qDAAqD;IACrD,IAAI;QACF,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAA+B,CAAC;YAC1F,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAqB;QACjC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAoC;QACzC,MAAM,KAAK,GAAe,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,uEAAuE;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,kBAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -24,6 +24,11 @@ export interface PlatformEnvVarMeta {
|
|
|
24
24
|
export declare function platformEnvVarMeta(platform: Platform): PlatformEnvVarMeta[];
|
|
25
25
|
/** Platforms manageable through the config surface (excludes whatsapp/mock). */
|
|
26
26
|
export declare function configurablePlatforms(): Platform[];
|
|
27
|
+
/**
|
|
28
|
+
* The `.env` that holds platform credentials. Delegates to the shared resolver
|
|
29
|
+
* so writes land in the ACTIVE config dir (`NUVIRA_CONFIG_DIR` aware) and never
|
|
30
|
+
* mutate the real profile's credential file from an isolated process.
|
|
31
|
+
*/
|
|
27
32
|
export declare function envFilePath(): string;
|
|
28
33
|
export interface EnvVarState {
|
|
29
34
|
varName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE3F,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,MAAM,EAAE,OAAO,CAAC;CACjB;AAkCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,EAAE,CAM3E;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,QAAQ,EAAE,CAIlD;AAID;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAIxD;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,oBAAoB,CAW7E;AAkCD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,GAAE,MAAM,EAAO,GACrB;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAmCxC;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,IAAI,CAO/F;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
|
|
@@ -13,9 +13,7 @@
|
|
|
13
13
|
* pair` / the WhatsApp panel — not an env token.
|
|
14
14
|
*/
|
|
15
15
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
16
|
-
import {
|
|
17
|
-
import { join } from 'node:path';
|
|
18
|
-
import { homedir } from 'node:os';
|
|
16
|
+
import { resolveNuviraEnvFile } from '../config/paths.js';
|
|
19
17
|
import { PLATFORM_ENV_VARS, PLATFORM_LABELS } from './channel-directory.js';
|
|
20
18
|
const SECRET_HINT = /TOKEN|PASSWORD|PASS|SECRET|KEY|AUTH|CRED/i;
|
|
21
19
|
const PROMPTS = {
|
|
@@ -58,17 +56,14 @@ export function platformEnvVarMeta(platform) {
|
|
|
58
56
|
export function configurablePlatforms() {
|
|
59
57
|
return Object.keys(PLATFORM_ENV_VARS).filter((p) => p !== 'whatsapp' && p !== 'mock');
|
|
60
58
|
}
|
|
61
|
-
// ───
|
|
59
|
+
// ─── Credential .env read/write (line-preserving merge) ──────────────────────
|
|
60
|
+
/**
|
|
61
|
+
* The `.env` that holds platform credentials. Delegates to the shared resolver
|
|
62
|
+
* so writes land in the ACTIVE config dir (`NUVIRA_CONFIG_DIR` aware) and never
|
|
63
|
+
* mutate the real profile's credential file from an isolated process.
|
|
64
|
+
*/
|
|
62
65
|
export function envFilePath() {
|
|
63
|
-
|
|
64
|
-
return process.env.NUVIRA_ENV_FILE;
|
|
65
|
-
const override = envBuff('ENV_FILE');
|
|
66
|
-
if (override && override.trim().length > 0)
|
|
67
|
-
return override;
|
|
68
|
-
const nuviraEnv = join(homedir(), '.nuvira', '.env');
|
|
69
|
-
if (existsSync(nuviraEnv))
|
|
70
|
-
return nuviraEnv;
|
|
71
|
-
return join(resolveNuviraHome(), '.env');
|
|
66
|
+
return resolveNuviraEnvFile();
|
|
72
67
|
}
|
|
73
68
|
/** Per-var current state — env file first, then process.env (file wins like loadEnv). */
|
|
74
69
|
export function envVarState(varName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,
|
|
1
|
+
{"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../src/gateway/platform-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,8 @@ import { ChannelDirectory, type ChannelRef, type PolicyMap } from './channel-dir
|
|
|
20
20
|
import type { ChannelAdapter, InboundMessage, MediaPayload } from './adapters.js';
|
|
21
21
|
import { DeliveryLedger } from './delivery.js';
|
|
22
22
|
import { InboxLedger } from './inbox.js';
|
|
23
|
+
import { InboundDedupLedger } from './dedup.js';
|
|
24
|
+
import { GatewayHeartbeat } from './heartbeat.js';
|
|
23
25
|
/**
|
|
24
26
|
* Strip leaked internal reasoning, planning blocks, and meta-commentary from
|
|
25
27
|
* a gateway chat response. The model sometimes emits its chain-of-thought
|
|
@@ -115,6 +117,18 @@ export declare class GatewayRegistry {
|
|
|
115
117
|
readonly delivery: DeliveryLedger;
|
|
116
118
|
/** P2 — inbound message inbox (who messaged the bot, what happened). */
|
|
117
119
|
readonly inbox: InboxLedger;
|
|
120
|
+
/**
|
|
121
|
+
* Idempotency ledger: a message delivered twice (bridge reconnect, offline
|
|
122
|
+
* backfill, webhook retry) is handled once. Without it, one WhatsApp ask
|
|
123
|
+
* became 20+ identical model turns — see dedup.ts.
|
|
124
|
+
*/
|
|
125
|
+
readonly dedup: InboundDedupLedger;
|
|
126
|
+
/**
|
|
127
|
+
* Liveness beat — so a gateway that is DOWN is visibly down instead of
|
|
128
|
+
* "configured ✅ but nobody home". Read by `gateway status` and the
|
|
129
|
+
* supervisor.
|
|
130
|
+
*/
|
|
131
|
+
readonly heartbeat: GatewayHeartbeat;
|
|
118
132
|
private adapters;
|
|
119
133
|
private configManager;
|
|
120
134
|
private options;
|
|
@@ -134,10 +148,27 @@ export declare class GatewayRegistry {
|
|
|
134
148
|
* double-count would prematurely fail entries). */
|
|
135
149
|
private drainChain;
|
|
136
150
|
private started;
|
|
151
|
+
/** Epoch ms of start() — the uptime reported in the heartbeat. */
|
|
152
|
+
private startedAt;
|
|
153
|
+
/** Beats written this run (monotonic; a stalled count means a stalled loop). */
|
|
154
|
+
private beatCount;
|
|
155
|
+
/** Per-adapter health, published in every beat. */
|
|
156
|
+
private adapterHealth;
|
|
157
|
+
/** Earliest epoch-ms at which a not-yet-started adapter may be retried. */
|
|
158
|
+
private adapterRetryAt;
|
|
159
|
+
/** The heartbeat + watchdog tick. */
|
|
160
|
+
private livenessTimer;
|
|
137
161
|
private chatEngine;
|
|
138
162
|
/** Per-contact conversation history for gateway chat (WhatsApp/Telegram/etc.).
|
|
139
163
|
* Disk-backed via GatewayChatStore so history survives gateway restarts. */
|
|
140
164
|
private chatStore;
|
|
165
|
+
/**
|
|
166
|
+
* P5 — the followups last offered to each contact (`platform:channelId`).
|
|
167
|
+
* A messaging-app sender has no clickable chips: they REPLY with one of the
|
|
168
|
+
* rendered lines, so this is the only way to know the message is a follow-up
|
|
169
|
+
* to the previous answer rather than a brand-new independent request.
|
|
170
|
+
*/
|
|
171
|
+
private lastFollowupsByContact;
|
|
141
172
|
private onTypingCallback;
|
|
142
173
|
constructor(options?: GatewayRegistryOptions, configManager?: ConfigManager);
|
|
143
174
|
/**
|
|
@@ -211,6 +242,24 @@ export declare class GatewayRegistry {
|
|
|
211
242
|
setOnTyping(callback: GatewayRegistryOptions['onTyping']): void;
|
|
212
243
|
/** Write/delete typing.json for cross-process communication with dashboard. */
|
|
213
244
|
private writeTypingFile;
|
|
245
|
+
/**
|
|
246
|
+
* Sender-facing line when the chat engine produced no answer. Contains NO
|
|
247
|
+
* internal routing detail (intent, confidence, provider/model) and does not
|
|
248
|
+
* claim "no model" when one is in fact configured — `generationFailed`
|
|
249
|
+
* covers ALL hard provider failures (missing key, 401, rate limit, network,
|
|
250
|
+
* every failover candidate down), so the two cases are reported separately.
|
|
251
|
+
*/
|
|
252
|
+
private generationFailureLine;
|
|
253
|
+
/**
|
|
254
|
+
* True when the user actually has a model to call: a provider holding real
|
|
255
|
+
* credentials, or a keyless/local runner with a CONCRETE model pin.
|
|
256
|
+
*
|
|
257
|
+
* The default config ships `nim/gemini/openrouter/groq/bedrock` with no keys
|
|
258
|
+
* and `local: { runner: 'ollama', model: 'default' }` — none of that counts
|
|
259
|
+
* as configured. A `'default'` local model is a sentinel, not a model. Only
|
|
260
|
+
* used to choose the sender-facing failure wording — never to block a call.
|
|
261
|
+
*/
|
|
262
|
+
private hasConfiguredModel;
|
|
214
263
|
private runInboundChat;
|
|
215
264
|
/** Allow-list check: no allowIds configured = everyone; else exact platform:channelId. */
|
|
216
265
|
private isAllowed;
|
|
@@ -224,6 +273,22 @@ export declare class GatewayRegistry {
|
|
|
224
273
|
* display name.
|
|
225
274
|
*/
|
|
226
275
|
private learnTelegramChatId;
|
|
276
|
+
/**
|
|
277
|
+
* Start ONE adapter and record its health. Never throws: a platform that
|
|
278
|
+
* fails to start must not take the gateway down with it.
|
|
279
|
+
*/
|
|
280
|
+
private startAdapter;
|
|
281
|
+
/** Max restart attempts per adapter per run — beyond this, stop the churn. */
|
|
282
|
+
private static readonly ADAPTER_MAX_RESTARTS;
|
|
283
|
+
/** Exponential backoff between adapter restart attempts (5s → 120s). */
|
|
284
|
+
private scheduleAdapterRetry;
|
|
285
|
+
/**
|
|
286
|
+
* The liveness tick: retry dead adapters, then write a beat. Runs on the
|
|
287
|
+
* same interval for both, so a stalled process is visible as a stalled beat.
|
|
288
|
+
*/
|
|
289
|
+
private startLiveness;
|
|
290
|
+
/** Retry every configured adapter that is not currently started. */
|
|
291
|
+
private retryPendingAdapters;
|
|
227
292
|
/** Stop adapters + unsubscribe + stop the delivery drain. Idempotent. */
|
|
228
293
|
stop(): Promise<void>;
|
|
229
294
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/gateway/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/gateway/registry.ts"],"names":[],"mappings":"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"}
|