@0xmaxma/claude-gateway 1.8.14 → 2.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/README.md +28 -1613
- package/config.template.json +7 -1
- package/dist/agent/runner.d.ts +377 -0
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +680 -24
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/skill-learning/index.d.ts +6 -4
- package/dist/agent/skill-learning/index.d.ts.map +1 -1
- package/dist/agent/skill-learning/index.js +3 -3
- package/dist/agent/skill-learning/index.js.map +1 -1
- package/dist/agent/skill-learning/notifier.d.ts +3 -4
- package/dist/agent/skill-learning/notifier.d.ts.map +1 -1
- package/dist/agent/skill-learning/notifier.js +15 -13
- package/dist/agent/skill-learning/notifier.js.map +1 -1
- package/dist/agent/skill-learning/reviewer.d.ts.map +1 -1
- package/dist/agent/skill-learning/reviewer.js +3 -1
- package/dist/agent/skill-learning/reviewer.js.map +1 -1
- package/dist/api/connectors-router.d.ts.map +1 -1
- package/dist/api/connectors-router.js +110 -4
- package/dist/api/connectors-router.js.map +1 -1
- package/dist/api/gateway-router.d.ts +1 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +13 -1
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/line-webhook-router.d.ts +2 -2
- package/dist/api/line-webhook-router.d.ts.map +1 -1
- package/dist/api/line-webhook-router.js +264 -230
- package/dist/api/line-webhook-router.js.map +1 -1
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +135 -10
- package/dist/api/router.js.map +1 -1
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +29 -10
- package/dist/api/share-router.js.map +1 -1
- package/dist/api/slack-client.d.ts +2 -0
- package/dist/api/slack-client.d.ts.map +1 -1
- package/dist/api/slack-client.js +6 -2
- package/dist/api/slack-client.js.map +1 -1
- package/dist/api/slack-webhook-router.d.ts +3 -0
- package/dist/api/slack-webhook-router.d.ts.map +1 -1
- package/dist/api/slack-webhook-router.js +226 -131
- package/dist/api/slack-webhook-router.js.map +1 -1
- package/dist/api/voice-router.d.ts +21 -0
- package/dist/api/voice-router.d.ts.map +1 -0
- package/dist/api/voice-router.js +372 -0
- package/dist/api/voice-router.js.map +1 -0
- package/dist/api/voice-settings-router.d.ts +5 -0
- package/dist/api/voice-settings-router.d.ts.map +1 -0
- package/dist/api/voice-settings-router.js +318 -0
- package/dist/api/voice-settings-router.js.map +1 -0
- package/dist/apps/agent-container-migration.d.ts +11 -0
- package/dist/apps/agent-container-migration.d.ts.map +1 -0
- package/dist/apps/agent-container-migration.js +85 -0
- package/dist/apps/agent-container-migration.js.map +1 -0
- package/dist/apps/installer.d.ts +1 -1
- package/dist/apps/installer.d.ts.map +1 -1
- package/dist/apps/installer.js +2 -1
- package/dist/apps/installer.js.map +1 -1
- package/dist/cli/commands/tasks.d.ts +5 -0
- package/dist/cli/commands/tasks.d.ts.map +1 -0
- package/dist/cli/commands/tasks.js +92 -0
- package/dist/cli/commands/tasks.js.map +1 -0
- package/dist/cli/http-client.d.ts +2 -0
- package/dist/cli/http-client.d.ts.map +1 -1
- package/dist/cli/http-client.js +8 -3
- package/dist/cli/http-client.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config-write-lock.d.ts +2 -0
- package/dist/config/config-write-lock.d.ts.map +1 -1
- package/dist/config/config-write-lock.js +5 -0
- package/dist/config/config-write-lock.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +87 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/config/migrator.d.ts.map +1 -1
- package/dist/config/migrator.js +12 -1
- package/dist/config/migrator.js.map +1 -1
- package/dist/config/watcher.d.ts.map +1 -1
- package/dist/config/watcher.js +6 -0
- package/dist/config/watcher.js.map +1 -1
- package/dist/connectors/resolve.d.ts.map +1 -1
- package/dist/connectors/resolve.js +3 -1
- package/dist/connectors/resolve.js.map +1 -1
- package/dist/connectors/types.d.ts +8 -0
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/cron/manager.d.ts.map +1 -1
- package/dist/cron/manager.js +21 -2
- package/dist/cron/manager.js.map +1 -1
- package/dist/discord/receiver.d.ts +2 -1
- package/dist/discord/receiver.d.ts.map +1 -1
- package/dist/discord/receiver.js +5 -1
- package/dist/discord/receiver.js.map +1 -1
- package/dist/history/db.d.ts +3 -0
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +21 -1
- package/dist/history/db.js.map +1 -1
- package/dist/history/types.d.ts +2 -0
- package/dist/history/types.d.ts.map +1 -1
- package/dist/index.js +48 -9
- package/dist/index.js.map +1 -1
- package/dist/orchestration/bounded-queue.d.ts +15 -0
- package/dist/orchestration/bounded-queue.d.ts.map +1 -0
- package/dist/orchestration/bounded-queue.js +58 -0
- package/dist/orchestration/bounded-queue.js.map +1 -0
- package/dist/orchestration/bridge.d.ts +55 -0
- package/dist/orchestration/bridge.d.ts.map +1 -0
- package/dist/orchestration/bridge.js +234 -0
- package/dist/orchestration/bridge.js.map +1 -0
- package/dist/orchestration/browser-routing.d.ts +7 -0
- package/dist/orchestration/browser-routing.d.ts.map +1 -0
- package/dist/orchestration/browser-routing.js +22 -0
- package/dist/orchestration/browser-routing.js.map +1 -0
- package/dist/orchestration/capabilities.d.ts +49 -0
- package/dist/orchestration/capabilities.d.ts.map +1 -0
- package/dist/orchestration/capabilities.js +417 -0
- package/dist/orchestration/capabilities.js.map +1 -0
- package/dist/orchestration/capacity.d.ts +14 -0
- package/dist/orchestration/capacity.d.ts.map +1 -0
- package/dist/orchestration/capacity.js +52 -0
- package/dist/orchestration/capacity.js.map +1 -0
- package/dist/orchestration/channel-activity.d.ts +21 -0
- package/dist/orchestration/channel-activity.d.ts.map +1 -0
- package/dist/orchestration/channel-activity.js +72 -0
- package/dist/orchestration/channel-activity.js.map +1 -0
- package/dist/orchestration/channel-controls.d.ts +32 -0
- package/dist/orchestration/channel-controls.d.ts.map +1 -0
- package/dist/orchestration/channel-controls.js +105 -0
- package/dist/orchestration/channel-controls.js.map +1 -0
- package/dist/orchestration/channel-input-media.d.ts +11 -0
- package/dist/orchestration/channel-input-media.d.ts.map +1 -0
- package/dist/orchestration/channel-input-media.js +54 -0
- package/dist/orchestration/channel-input-media.js.map +1 -0
- package/dist/orchestration/channel-media.d.ts +4 -0
- package/dist/orchestration/channel-media.d.ts.map +1 -0
- package/dist/orchestration/channel-media.js +70 -0
- package/dist/orchestration/channel-media.js.map +1 -0
- package/dist/orchestration/channel-speech.d.ts +7 -0
- package/dist/orchestration/channel-speech.d.ts.map +1 -0
- package/dist/orchestration/channel-speech.js +65 -0
- package/dist/orchestration/channel-speech.js.map +1 -0
- package/dist/orchestration/cli-skills.d.ts +12 -0
- package/dist/orchestration/cli-skills.d.ts.map +1 -0
- package/dist/orchestration/cli-skills.js +132 -0
- package/dist/orchestration/cli-skills.js.map +1 -0
- package/dist/orchestration/config.d.ts +256 -0
- package/dist/orchestration/config.d.ts.map +1 -0
- package/dist/orchestration/config.js +110 -0
- package/dist/orchestration/config.js.map +1 -0
- package/dist/orchestration/container.d.ts +21 -0
- package/dist/orchestration/container.d.ts.map +1 -0
- package/dist/orchestration/container.js +195 -0
- package/dist/orchestration/container.js.map +1 -0
- package/dist/orchestration/control-delivery.d.ts +5 -0
- package/dist/orchestration/control-delivery.d.ts.map +1 -0
- package/dist/orchestration/control-delivery.js +50 -0
- package/dist/orchestration/control-delivery.js.map +1 -0
- package/dist/orchestration/conversation-intake.d.ts +32 -0
- package/dist/orchestration/conversation-intake.d.ts.map +1 -0
- package/dist/orchestration/conversation-intake.js +92 -0
- package/dist/orchestration/conversation-intake.js.map +1 -0
- package/dist/orchestration/decisions.d.ts +27 -0
- package/dist/orchestration/decisions.d.ts.map +1 -0
- package/dist/orchestration/decisions.js +148 -0
- package/dist/orchestration/decisions.js.map +1 -0
- package/dist/orchestration/delivery.d.ts +30 -0
- package/dist/orchestration/delivery.d.ts.map +1 -0
- package/dist/orchestration/delivery.js +219 -0
- package/dist/orchestration/delivery.js.map +1 -0
- package/dist/orchestration/display-stream.d.ts +4 -0
- package/dist/orchestration/display-stream.d.ts.map +1 -0
- package/dist/orchestration/display-stream.js +77 -0
- package/dist/orchestration/display-stream.js.map +1 -0
- package/dist/orchestration/events.d.ts +30 -0
- package/dist/orchestration/events.d.ts.map +1 -0
- package/dist/orchestration/events.js +65 -0
- package/dist/orchestration/events.js.map +1 -0
- package/dist/orchestration/execution-observation.d.ts +38 -0
- package/dist/orchestration/execution-observation.d.ts.map +1 -0
- package/dist/orchestration/execution-observation.js +25 -0
- package/dist/orchestration/execution-observation.js.map +1 -0
- package/dist/orchestration/file-delivery.d.ts +16 -0
- package/dist/orchestration/file-delivery.d.ts.map +1 -0
- package/dist/orchestration/file-delivery.js +139 -0
- package/dist/orchestration/file-delivery.js.map +1 -0
- package/dist/orchestration/gateway-config.d.ts +17 -0
- package/dist/orchestration/gateway-config.d.ts.map +1 -0
- package/dist/orchestration/gateway-config.js +128 -0
- package/dist/orchestration/gateway-config.js.map +1 -0
- package/dist/orchestration/history.d.ts +13 -0
- package/dist/orchestration/history.d.ts.map +1 -0
- package/dist/orchestration/history.js +48 -0
- package/dist/orchestration/history.js.map +1 -0
- package/dist/orchestration/identity.d.ts +6 -0
- package/dist/orchestration/identity.d.ts.map +1 -0
- package/dist/orchestration/identity.js +13 -0
- package/dist/orchestration/identity.js.map +1 -0
- package/dist/orchestration/inference-errors.d.ts +3 -0
- package/dist/orchestration/inference-errors.d.ts.map +1 -0
- package/dist/orchestration/inference-errors.js +16 -0
- package/dist/orchestration/inference-errors.js.map +1 -0
- package/dist/orchestration/input-images.d.ts +12 -0
- package/dist/orchestration/input-images.d.ts.map +1 -0
- package/dist/orchestration/input-images.js +66 -0
- package/dist/orchestration/input-images.js.map +1 -0
- package/dist/orchestration/instance-lock.d.ts +5 -0
- package/dist/orchestration/instance-lock.d.ts.map +1 -0
- package/dist/orchestration/instance-lock.js +33 -0
- package/dist/orchestration/instance-lock.js.map +1 -0
- package/dist/orchestration/line-loading.d.ts +21 -0
- package/dist/orchestration/line-loading.d.ts.map +1 -0
- package/dist/orchestration/line-loading.js +89 -0
- package/dist/orchestration/line-loading.js.map +1 -0
- package/dist/orchestration/media.d.ts +3 -0
- package/dist/orchestration/media.d.ts.map +1 -0
- package/dist/orchestration/media.js +46 -0
- package/dist/orchestration/media.js.map +1 -0
- package/dist/orchestration/migrations/schema.d.ts +3 -0
- package/dist/orchestration/migrations/schema.d.ts.map +1 -0
- package/dist/orchestration/migrations/schema.js +80 -0
- package/dist/orchestration/migrations/schema.js.map +1 -0
- package/dist/orchestration/notification-mailbox.d.ts +5 -0
- package/dist/orchestration/notification-mailbox.d.ts.map +1 -0
- package/dist/orchestration/notification-mailbox.js +29 -0
- package/dist/orchestration/notification-mailbox.js.map +1 -0
- package/dist/orchestration/process-activity.d.ts +23 -0
- package/dist/orchestration/process-activity.d.ts.map +1 -0
- package/dist/orchestration/process-activity.js +95 -0
- package/dist/orchestration/process-activity.js.map +1 -0
- package/dist/orchestration/process-supervisor.d.ts +15 -0
- package/dist/orchestration/process-supervisor.d.ts.map +1 -0
- package/dist/orchestration/process-supervisor.js +92 -0
- package/dist/orchestration/process-supervisor.js.map +1 -0
- package/dist/orchestration/process-turn.d.ts +35 -0
- package/dist/orchestration/process-turn.d.ts.map +1 -0
- package/dist/orchestration/process-turn.js +246 -0
- package/dist/orchestration/process-turn.js.map +1 -0
- package/dist/orchestration/progress-review.d.ts +28 -0
- package/dist/orchestration/progress-review.d.ts.map +1 -0
- package/dist/orchestration/progress-review.js +48 -0
- package/dist/orchestration/progress-review.js.map +1 -0
- package/dist/orchestration/recovery.d.ts +8 -0
- package/dist/orchestration/recovery.d.ts.map +1 -0
- package/dist/orchestration/recovery.js +35 -0
- package/dist/orchestration/recovery.js.map +1 -0
- package/dist/orchestration/reply-context.d.ts +7 -0
- package/dist/orchestration/reply-context.d.ts.map +1 -0
- package/dist/orchestration/reply-context.js +54 -0
- package/dist/orchestration/reply-context.js.map +1 -0
- package/dist/orchestration/runtime.d.ts +232 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +962 -0
- package/dist/orchestration/runtime.js.map +1 -0
- package/dist/orchestration/skills.d.ts +17 -0
- package/dist/orchestration/skills.d.ts.map +1 -0
- package/dist/orchestration/skills.js +32 -0
- package/dist/orchestration/skills.js.map +1 -0
- package/dist/orchestration/source-policy.d.ts +6 -0
- package/dist/orchestration/source-policy.d.ts.map +1 -0
- package/dist/orchestration/source-policy.js +16 -0
- package/dist/orchestration/source-policy.js.map +1 -0
- package/dist/orchestration/speech.d.ts +24 -0
- package/dist/orchestration/speech.d.ts.map +1 -0
- package/dist/orchestration/speech.js +61 -0
- package/dist/orchestration/speech.js.map +1 -0
- package/dist/orchestration/stop-controls.d.ts +30 -0
- package/dist/orchestration/stop-controls.d.ts.map +1 -0
- package/dist/orchestration/stop-controls.js +79 -0
- package/dist/orchestration/stop-controls.js.map +1 -0
- package/dist/orchestration/store.d.ts +86 -0
- package/dist/orchestration/store.d.ts.map +1 -0
- package/dist/orchestration/store.js +275 -0
- package/dist/orchestration/store.js.map +1 -0
- package/dist/orchestration/task-controls.d.ts +130 -0
- package/dist/orchestration/task-controls.d.ts.map +1 -0
- package/dist/orchestration/task-controls.js +55 -0
- package/dist/orchestration/task-controls.js.map +1 -0
- package/dist/orchestration/task-files.d.ts +29 -0
- package/dist/orchestration/task-files.d.ts.map +1 -0
- package/dist/orchestration/task-files.js +200 -0
- package/dist/orchestration/task-files.js.map +1 -0
- package/dist/orchestration/task-report.d.ts +7 -0
- package/dist/orchestration/task-report.d.ts.map +1 -0
- package/dist/orchestration/task-report.js +33 -0
- package/dist/orchestration/task-report.js.map +1 -0
- package/dist/orchestration/tasks/checkpoint-hook.d.ts +19 -0
- package/dist/orchestration/tasks/checkpoint-hook.d.ts.map +1 -0
- package/dist/orchestration/tasks/checkpoint-hook.js +49 -0
- package/dist/orchestration/tasks/checkpoint-hook.js.map +1 -0
- package/dist/orchestration/tasks/cleanup.d.ts +18 -0
- package/dist/orchestration/tasks/cleanup.d.ts.map +1 -0
- package/dist/orchestration/tasks/cleanup.js +113 -0
- package/dist/orchestration/tasks/cleanup.js.map +1 -0
- package/dist/orchestration/tasks/driver.d.ts +23 -0
- package/dist/orchestration/tasks/driver.d.ts.map +1 -0
- package/dist/orchestration/tasks/driver.js +209 -0
- package/dist/orchestration/tasks/driver.js.map +1 -0
- package/dist/orchestration/tasks/failure.d.ts +5 -0
- package/dist/orchestration/tasks/failure.d.ts.map +1 -0
- package/dist/orchestration/tasks/failure.js +17 -0
- package/dist/orchestration/tasks/failure.js.map +1 -0
- package/dist/orchestration/tasks/pool.d.ts +18 -0
- package/dist/orchestration/tasks/pool.d.ts.map +1 -0
- package/dist/orchestration/tasks/pool.js +73 -0
- package/dist/orchestration/tasks/pool.js.map +1 -0
- package/dist/orchestration/tasks/scheduler.d.ts +38 -0
- package/dist/orchestration/tasks/scheduler.d.ts.map +1 -0
- package/dist/orchestration/tasks/scheduler.js +160 -0
- package/dist/orchestration/tasks/scheduler.js.map +1 -0
- package/dist/orchestration/tasks/service.d.ts +109 -0
- package/dist/orchestration/tasks/service.d.ts.map +1 -0
- package/dist/orchestration/tasks/service.js +697 -0
- package/dist/orchestration/tasks/service.js.map +1 -0
- package/dist/orchestration/tasks/shared-workspace.d.ts +25 -0
- package/dist/orchestration/tasks/shared-workspace.d.ts.map +1 -0
- package/dist/orchestration/tasks/shared-workspace.js +162 -0
- package/dist/orchestration/tasks/shared-workspace.js.map +1 -0
- package/dist/orchestration/tasks/task-directive.d.ts +6 -0
- package/dist/orchestration/tasks/task-directive.d.ts.map +1 -0
- package/dist/orchestration/tasks/task-directive.js +41 -0
- package/dist/orchestration/tasks/task-directive.js.map +1 -0
- package/dist/orchestration/tasks/timing.d.ts +15 -0
- package/dist/orchestration/tasks/timing.d.ts.map +1 -0
- package/dist/orchestration/tasks/timing.js +48 -0
- package/dist/orchestration/tasks/timing.js.map +1 -0
- package/dist/orchestration/tasks/tool-repetition.d.ts +3 -0
- package/dist/orchestration/tasks/tool-repetition.d.ts.map +1 -0
- package/dist/orchestration/tasks/tool-repetition.js +30 -0
- package/dist/orchestration/tasks/tool-repetition.js.map +1 -0
- package/dist/orchestration/tasks/workspace.d.ts +24 -0
- package/dist/orchestration/tasks/workspace.d.ts.map +1 -0
- package/dist/orchestration/tasks/workspace.js +147 -0
- package/dist/orchestration/tasks/workspace.js.map +1 -0
- package/dist/orchestration/telegram-speech.d.ts +17 -0
- package/dist/orchestration/telegram-speech.d.ts.map +1 -0
- package/dist/orchestration/telegram-speech.js +55 -0
- package/dist/orchestration/telegram-speech.js.map +1 -0
- package/dist/orchestration/telegram-tool-status.d.ts +23 -0
- package/dist/orchestration/telegram-tool-status.d.ts.map +1 -0
- package/dist/orchestration/telegram-tool-status.js +207 -0
- package/dist/orchestration/telegram-tool-status.js.map +1 -0
- package/dist/orchestration/telegram-voices.d.ts +42 -0
- package/dist/orchestration/telegram-voices.d.ts.map +1 -0
- package/dist/orchestration/telegram-voices.js +70 -0
- package/dist/orchestration/telegram-voices.js.map +1 -0
- package/dist/orchestration/tool-activity.d.ts +10 -0
- package/dist/orchestration/tool-activity.d.ts.map +1 -0
- package/dist/orchestration/tool-activity.js +38 -0
- package/dist/orchestration/tool-activity.js.map +1 -0
- package/dist/orchestration/types.d.ts +177 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +13 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/orchestration/voice-reply-policy.d.ts +8 -0
- package/dist/orchestration/voice-reply-policy.d.ts.map +1 -0
- package/dist/orchestration/voice-reply-policy.js +46 -0
- package/dist/orchestration/voice-reply-policy.js.map +1 -0
- package/dist/orchestration/worker-shares.d.ts +8 -0
- package/dist/orchestration/worker-shares.d.ts.map +1 -0
- package/dist/orchestration/worker-shares.js +59 -0
- package/dist/orchestration/worker-shares.js.map +1 -0
- package/dist/orchestration/workflow.d.ts +121 -0
- package/dist/orchestration/workflow.d.ts.map +1 -0
- package/dist/orchestration/workflow.js +69 -0
- package/dist/orchestration/workflow.js.map +1 -0
- package/dist/session/input-image.d.ts +10 -0
- package/dist/session/input-image.d.ts.map +1 -0
- package/dist/session/input-image.js +3 -0
- package/dist/session/input-image.js.map +1 -0
- package/dist/session/process.d.ts +15 -3
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +143 -35
- package/dist/session/process.js.map +1 -1
- package/dist/session/runtime-profile.d.ts +36 -0
- package/dist/session/runtime-profile.d.ts.map +1 -0
- package/dist/session/runtime-profile.js +63 -0
- package/dist/session/runtime-profile.js.map +1 -0
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +23 -1
- package/dist/session/store.js.map +1 -1
- package/dist/share/share-store.d.ts +3 -1
- package/dist/share/share-store.d.ts.map +1 -1
- package/dist/share/share-store.js +13 -2
- package/dist/share/share-store.js.map +1 -1
- package/dist/shared/line-request-order.d.ts +2 -0
- package/dist/shared/line-request-order.d.ts.map +1 -0
- package/dist/shared/line-request-order.js +16 -0
- package/dist/shared/line-request-order.js.map +1 -0
- package/dist/shared/task-elapsed.d.ts +3 -0
- package/dist/shared/task-elapsed.d.ts.map +1 -0
- package/dist/shared/task-elapsed.js +12 -0
- package/dist/shared/task-elapsed.js.map +1 -0
- package/dist/shared/task-updated-time.d.ts +3 -0
- package/dist/shared/task-updated-time.d.ts.map +1 -0
- package/dist/shared/task-updated-time.js +15 -0
- package/dist/shared/task-updated-time.js.map +1 -0
- package/dist/skills/loader.d.ts +2 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/telegram/chunks.d.ts +19 -0
- package/dist/telegram/chunks.d.ts.map +1 -0
- package/dist/telegram/chunks.js +129 -0
- package/dist/telegram/chunks.js.map +1 -0
- package/dist/telegram/markdown.d.ts.map +1 -1
- package/dist/telegram/markdown.js +18 -3
- package/dist/telegram/markdown.js.map +1 -1
- package/dist/telegram/receiver.d.ts +2 -1
- package/dist/telegram/receiver.d.ts.map +1 -1
- package/dist/telegram/receiver.js +6 -1
- package/dist/telegram/receiver.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +31 -5
- package/dist/ui/web-ui.js.map +1 -1
- package/dist/voice/diagnostics.d.ts +29 -0
- package/dist/voice/diagnostics.d.ts.map +1 -0
- package/dist/voice/diagnostics.js +37 -0
- package/dist/voice/diagnostics.js.map +1 -0
- package/dist/voice/errors.d.ts +19 -0
- package/dist/voice/errors.d.ts.map +1 -0
- package/dist/voice/errors.js +133 -0
- package/dist/voice/errors.js.map +1 -0
- package/dist/voice/line-audio.d.ts +4 -0
- package/dist/voice/line-audio.d.ts.map +1 -0
- package/dist/voice/line-audio.js +27 -0
- package/dist/voice/line-audio.js.map +1 -0
- package/dist/voice/managed-quota.d.ts +5 -0
- package/dist/voice/managed-quota.d.ts.map +1 -0
- package/dist/voice/managed-quota.js +35 -0
- package/dist/voice/managed-quota.js.map +1 -0
- package/dist/voice/mp3.d.ts +3 -0
- package/dist/voice/mp3.d.ts.map +1 -0
- package/dist/voice/mp3.js +30 -0
- package/dist/voice/mp3.js.map +1 -0
- package/dist/voice/notes.d.ts +9 -0
- package/dist/voice/notes.d.ts.map +1 -0
- package/dist/voice/notes.js +68 -0
- package/dist/voice/notes.js.map +1 -0
- package/dist/voice/playback.d.ts +22 -0
- package/dist/voice/playback.d.ts.map +1 -0
- package/dist/voice/playback.js +52 -0
- package/dist/voice/playback.js.map +1 -0
- package/dist/voice/preview.d.ts +6 -0
- package/dist/voice/preview.d.ts.map +1 -0
- package/dist/voice/preview.js +44 -0
- package/dist/voice/preview.js.map +1 -0
- package/dist/voice/protocol.d.ts +10 -0
- package/dist/voice/protocol.d.ts.map +1 -0
- package/dist/voice/protocol.js +30 -0
- package/dist/voice/protocol.js.map +1 -0
- package/dist/voice/providers/cartesia-tts.d.ts +26 -0
- package/dist/voice/providers/cartesia-tts.d.ts.map +1 -0
- package/dist/voice/providers/cartesia-tts.js +95 -0
- package/dist/voice/providers/cartesia-tts.js.map +1 -0
- package/dist/voice/providers/deepgram-stt.d.ts +20 -0
- package/dist/voice/providers/deepgram-stt.d.ts.map +1 -0
- package/dist/voice/providers/deepgram-stt.js +66 -0
- package/dist/voice/providers/deepgram-stt.js.map +1 -0
- package/dist/voice/providers/elevenlabs-stt.d.ts +20 -0
- package/dist/voice/providers/elevenlabs-stt.d.ts.map +1 -0
- package/dist/voice/providers/elevenlabs-stt.js +92 -0
- package/dist/voice/providers/elevenlabs-stt.js.map +1 -0
- package/dist/voice/providers/elevenlabs-tts.d.ts +26 -0
- package/dist/voice/providers/elevenlabs-tts.d.ts.map +1 -0
- package/dist/voice/providers/elevenlabs-tts.js +82 -0
- package/dist/voice/providers/elevenlabs-tts.js.map +1 -0
- package/dist/voice/providers/encoded-audio-tts.d.ts +21 -0
- package/dist/voice/providers/encoded-audio-tts.d.ts.map +1 -0
- package/dist/voice/providers/encoded-audio-tts.js +175 -0
- package/dist/voice/providers/encoded-audio-tts.js.map +1 -0
- package/dist/voice/providers/fake.d.ts +39 -0
- package/dist/voice/providers/fake.d.ts.map +1 -0
- package/dist/voice/providers/fake.js +41 -0
- package/dist/voice/providers/fake.js.map +1 -0
- package/dist/voice/providers/gemini-live-stt.d.ts +21 -0
- package/dist/voice/providers/gemini-live-stt.d.ts.map +1 -0
- package/dist/voice/providers/gemini-live-stt.js +158 -0
- package/dist/voice/providers/gemini-live-stt.js.map +1 -0
- package/dist/voice/providers/gemini.d.ts +60 -0
- package/dist/voice/providers/gemini.d.ts.map +1 -0
- package/dist/voice/providers/gemini.js +124 -0
- package/dist/voice/providers/gemini.js.map +1 -0
- package/dist/voice/providers/model-ref.d.ts +9 -0
- package/dist/voice/providers/model-ref.d.ts.map +1 -0
- package/dist/voice/providers/model-ref.js +31 -0
- package/dist/voice/providers/model-ref.js.map +1 -0
- package/dist/voice/providers/openrouter.d.ts +39 -0
- package/dist/voice/providers/openrouter.d.ts.map +1 -0
- package/dist/voice/providers/openrouter.js +154 -0
- package/dist/voice/providers/openrouter.js.map +1 -0
- package/dist/voice/providers/paxalabs-stt.d.ts +12 -0
- package/dist/voice/providers/paxalabs-stt.d.ts.map +1 -0
- package/dist/voice/providers/paxalabs-stt.js +41 -0
- package/dist/voice/providers/paxalabs-stt.js.map +1 -0
- package/dist/voice/providers/paxalabs-tts.d.ts +23 -0
- package/dist/voice/providers/paxalabs-tts.d.ts.map +1 -0
- package/dist/voice/providers/paxalabs-tts.js +80 -0
- package/dist/voice/providers/paxalabs-tts.js.map +1 -0
- package/dist/voice/providers/recorded-stt.d.ts +34 -0
- package/dist/voice/providers/recorded-stt.d.ts.map +1 -0
- package/dist/voice/providers/recorded-stt.js +59 -0
- package/dist/voice/providers/recorded-stt.js.map +1 -0
- package/dist/voice/providers/registry.d.ts +10 -0
- package/dist/voice/providers/registry.d.ts.map +1 -0
- package/dist/voice/providers/registry.js +77 -0
- package/dist/voice/providers/registry.js.map +1 -0
- package/dist/voice/providers/socket.d.ts +10 -0
- package/dist/voice/providers/socket.d.ts.map +1 -0
- package/dist/voice/providers/socket.js +91 -0
- package/dist/voice/providers/socket.js.map +1 -0
- package/dist/voice/providers/upstream.d.ts +9 -0
- package/dist/voice/providers/upstream.d.ts.map +1 -0
- package/dist/voice/providers/upstream.js +51 -0
- package/dist/voice/providers/upstream.js.map +1 -0
- package/dist/voice/providers/voice-catalog.d.ts +17 -0
- package/dist/voice/providers/voice-catalog.d.ts.map +1 -0
- package/dist/voice/providers/voice-catalog.js +167 -0
- package/dist/voice/providers/voice-catalog.js.map +1 -0
- package/dist/voice/queue.d.ts +2 -0
- package/dist/voice/queue.d.ts.map +1 -0
- package/dist/voice/queue.js +6 -0
- package/dist/voice/queue.js.map +1 -0
- package/dist/voice/session.d.ts +86 -0
- package/dist/voice/session.d.ts.map +1 -0
- package/dist/voice/session.js +464 -0
- package/dist/voice/session.js.map +1 -0
- package/dist/voice/turn-manager.d.ts +27 -0
- package/dist/voice/turn-manager.d.ts.map +1 -0
- package/dist/voice/turn-manager.js +75 -0
- package/dist/voice/turn-manager.js.map +1 -0
- package/dist/voice/types.d.ts +78 -0
- package/dist/voice/types.d.ts.map +1 -0
- package/dist/voice/types.js +18 -0
- package/dist/voice/types.js.map +1 -0
- package/dist/voice/wav.d.ts +2 -0
- package/dist/voice/wav.d.ts.map +1 -0
- package/dist/voice/wav.js +21 -0
- package/dist/voice/wav.js.map +1 -0
- package/dist/wechat/ilink-client.d.ts +13 -0
- package/dist/wechat/ilink-client.d.ts.map +1 -1
- package/dist/wechat/ilink-client.js +19 -0
- package/dist/wechat/ilink-client.js.map +1 -1
- package/dist/whatsapp/manager.d.ts.map +1 -1
- package/dist/whatsapp/manager.js +51 -1
- package/dist/whatsapp/manager.js.map +1 -1
- package/mcp/capability-catalog.ts +206 -0
- package/mcp/modules.ts +56 -0
- package/mcp/server.ts +18 -37
- package/mcp/tools/browser/module.ts +1 -1
- package/mcp/tools/browser/skills/open-browser/SKILL.md +5 -3
- package/mcp/tools/discord/commands.ts +17 -1
- package/mcp/tools/discord/inbound.ts +11 -0
- package/mcp/tools/discord/module.ts +42 -2
- package/mcp/tools/discord/receiver-server.ts +10 -0
- package/mcp/tools/discord/types.ts +4 -1
- package/mcp/tools/image/module.ts +3 -1
- package/mcp/tools/receiver-spool.test.ts +28 -0
- package/mcp/tools/receiver-spool.ts +56 -0
- package/mcp/tools/share-file/module.ts +9 -1
- package/mcp/tools/shared/share-client.ts +19 -0
- package/mcp/tools/tasks/module.ts +35 -0
- package/mcp/tools/telegram/media-group.ts +21 -0
- package/mcp/tools/telegram/receiver-server.ts +232 -11
- package/mcp/tools/telegram/selection-confirmation.ts +20 -0
- package/mcp/tools/telegram/task-browser.ts +117 -0
- package/mcp/tools/telegram/task-detail.ts +36 -0
- package/mcp/tools/telegram/task-elapsed.ts +1 -0
- package/mcp/tools/telegram/typing.ts +6 -116
- package/mcp/tools/video/module.ts +1 -1
- package/mcp/types.ts +5 -0
- package/package.json +2 -1
- package/resource/claude_gateway.jpeg +0 -0
- package/scripts/orchestration/bench-store.cjs +30 -0
- package/scripts/orchestration/inspect.cjs +16 -0
- package/scripts/orchestration/probe-profile.cjs +67 -0
- package/scripts/orchestration/reconcile.cjs +21 -0
- package/scripts/orchestration/smoke-elevenlabs.cjs +90 -0
- package/scripts/orchestration/smoke-media.cjs +70 -0
- package/scripts/orchestration/smoke-text.cjs +101 -0
- package/scripts/orchestration/smoke-vision.cjs +49 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentConfig } from '../types';
|
|
2
|
+
import { OrchestrationStore } from './store';
|
|
3
|
+
/** LINE clears loading on every outbound message, including task acknowledgements.
|
|
4
|
+
* Renew from durable work state, not the lifetime of the ingress HTTP request. */
|
|
5
|
+
export declare class LineLoading {
|
|
6
|
+
private readonly store;
|
|
7
|
+
private readonly agent;
|
|
8
|
+
private readonly enabled;
|
|
9
|
+
private readonly request;
|
|
10
|
+
private timer?;
|
|
11
|
+
private readonly abort;
|
|
12
|
+
private readonly pulses;
|
|
13
|
+
private readonly pending;
|
|
14
|
+
private closed;
|
|
15
|
+
constructor(store: OrchestrationStore, agent: () => AgentConfig, enabled: () => boolean, request?: typeof fetch);
|
|
16
|
+
start(): void;
|
|
17
|
+
tick(): Promise<void>;
|
|
18
|
+
private busy;
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=line-loading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-loading.d.ts","sourceRoot":"","sources":["../../src/orchestration/line-loading.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;kFACkF;AAClF,qBAAa,WAAW;IAOV,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAsB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAiB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPnE,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsD;IAC7E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,kBAAkB,EAAmB,KAAK,EAAE,MAAM,WAAW,EAC9E,OAAO,EAAE,MAAM,OAAO,EAAmB,OAAO,GAAE,OAAO,KAAa;IAEzF,KAAK,IAAI,IAAI;IAMP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC3B,OAAO,CAAC,IAAI;IAQZ,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LineLoading = void 0;
|
|
4
|
+
const line_request_order_1 = require("../shared/line-request-order");
|
|
5
|
+
/** LINE clears loading on every outbound message, including task acknowledgements.
|
|
6
|
+
* Renew from durable work state, not the lifetime of the ingress HTTP request. */
|
|
7
|
+
class LineLoading {
|
|
8
|
+
constructor(store, agent, enabled, request = fetch) {
|
|
9
|
+
this.store = store;
|
|
10
|
+
this.agent = agent;
|
|
11
|
+
this.enabled = enabled;
|
|
12
|
+
this.request = request;
|
|
13
|
+
this.abort = new AbortController();
|
|
14
|
+
this.pulses = new Map();
|
|
15
|
+
this.pending = new Set();
|
|
16
|
+
this.closed = false;
|
|
17
|
+
}
|
|
18
|
+
start() {
|
|
19
|
+
if (this.timer || this.closed)
|
|
20
|
+
return;
|
|
21
|
+
this.timer = setInterval(() => { void this.tick().catch(() => { }); }, 1000);
|
|
22
|
+
this.timer.unref();
|
|
23
|
+
}
|
|
24
|
+
async tick() {
|
|
25
|
+
if (this.closed)
|
|
26
|
+
return;
|
|
27
|
+
const token = this.agent().line?.channelAccessToken;
|
|
28
|
+
if (!this.enabled() || !token) {
|
|
29
|
+
this.pulses.clear();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// User IDs start with U; LINE does not support this API for groups or rooms.
|
|
33
|
+
// Waiting for user input / reconciliation is not active work.
|
|
34
|
+
const chats = this.store.all(`SELECT c.chat_id,
|
|
35
|
+
COALESCE((SELECT MAX(d.rowid) FROM deliveries d JOIN conversation_bindings b ON b.id=d.binding_id
|
|
36
|
+
WHERE b.channel='line' AND b.chat_id=c.chat_id AND d.state='delivered'),0) AS receipt
|
|
37
|
+
FROM conversations c WHERE c.source='line' AND c.chat_id GLOB 'U*' AND (
|
|
38
|
+
EXISTS (SELECT 1 FROM conversation_inputs i WHERE i.conversation_id=c.id AND i.status IN ('accepted','assigned')) OR
|
|
39
|
+
EXISTS (SELECT 1 FROM conversation_decisions d WHERE d.conversation_id=c.id AND d.state IN ('running','interrupting')) OR
|
|
40
|
+
EXISTS (SELECT 1 FROM tasks t WHERE t.conversation_id=c.id AND t.state IN ('queued','starting','running','interrupting','cancel_requested'))
|
|
41
|
+
) GROUP BY c.chat_id`);
|
|
42
|
+
const busy = new Set(chats.map(row => String(row.chat_id)));
|
|
43
|
+
for (const chat of this.pulses.keys())
|
|
44
|
+
if (!busy.has(chat))
|
|
45
|
+
this.pulses.delete(chat);
|
|
46
|
+
await Promise.all(chats.map(async (row) => {
|
|
47
|
+
const chat = String(row.chat_id), receipt = Number(row.receipt), now = Date.now();
|
|
48
|
+
const previous = this.pulses.get(chat);
|
|
49
|
+
if (this.pending.has(chat) || (previous && now - previous.at < 4000 && previous.receipt === receipt))
|
|
50
|
+
return;
|
|
51
|
+
this.pulses.set(chat, { at: now, receipt });
|
|
52
|
+
this.pending.add(chat);
|
|
53
|
+
try {
|
|
54
|
+
// Five-second expiry bounds a stale indicator if a request races the final
|
|
55
|
+
// reply or work fails without a reply. LINE offers no explicit stop API.
|
|
56
|
+
await (0, line_request_order_1.orderLineRequest)(this.agent().id, chat, async () => {
|
|
57
|
+
// A final reply may have finished while this renewal was queued.
|
|
58
|
+
if (this.closed || !this.enabled() || !this.busy(chat))
|
|
59
|
+
return;
|
|
60
|
+
await this.request('https://api.line.me/v2/bot/chat/loading/start', {
|
|
61
|
+
method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
|
|
62
|
+
body: JSON.stringify({ chatId: chat, loadingSeconds: 5 }),
|
|
63
|
+
signal: AbortSignal.any([this.abort.signal, AbortSignal.timeout(3000)]),
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch { /* Best effort; never fail or delay inference/delivery. Retry on the next renewal. */ }
|
|
68
|
+
finally {
|
|
69
|
+
this.pending.delete(chat);
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
busy(chat) {
|
|
74
|
+
return !!this.store.get(`SELECT c.id FROM conversations c WHERE c.source='line' AND c.chat_id=? AND (
|
|
75
|
+
EXISTS (SELECT 1 FROM conversation_inputs i WHERE i.conversation_id=c.id AND i.status IN ('accepted','assigned')) OR
|
|
76
|
+
EXISTS (SELECT 1 FROM conversation_decisions d WHERE d.conversation_id=c.id AND d.state IN ('running','interrupting')) OR
|
|
77
|
+
EXISTS (SELECT 1 FROM tasks t WHERE t.conversation_id=c.id AND t.state IN ('queued','starting','running','interrupting','cancel_requested'))
|
|
78
|
+
) LIMIT 1`, chat);
|
|
79
|
+
}
|
|
80
|
+
close() {
|
|
81
|
+
this.closed = true;
|
|
82
|
+
if (this.timer)
|
|
83
|
+
clearInterval(this.timer);
|
|
84
|
+
this.abort.abort();
|
|
85
|
+
this.pulses.clear();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.LineLoading = LineLoading;
|
|
89
|
+
//# sourceMappingURL=line-loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-loading.js","sourceRoot":"","sources":["../../src/orchestration/line-loading.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/orchestration/media.ts"],"names":[],"mappings":"AAMA,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBpH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ingestOrchestrationMedia = ingestOrchestrationMedia;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const media_store_1 = require("../history/media-store");
|
|
9
|
+
/** Content-addressed ingestion keeps provider retries bound to the same bytes. */
|
|
10
|
+
function ingestOrchestrationMedia(agentsRoot, agentId, chatId, source) {
|
|
11
|
+
if ((0, fs_1.statSync)(source).size > 50 * 1024 * 1024)
|
|
12
|
+
throw new types_1.OrchestrationError('ATTACHMENT_TOO_LARGE');
|
|
13
|
+
const bytes = (0, fs_1.readFileSync)(source);
|
|
14
|
+
if (bytes.length > 50 * 1024 * 1024)
|
|
15
|
+
throw new types_1.OrchestrationError('ATTACHMENT_TOO_LARGE');
|
|
16
|
+
const digest = (0, crypto_1.createHash)('sha256').update(bytes).digest('hex');
|
|
17
|
+
const suffix = (0, path_1.extname)(source).slice(0, 12).replace(/[^a-zA-Z0-9.]/g, '');
|
|
18
|
+
const relative = (0, path_1.join)('media', chatId, `orchestration-${digest}${suffix}`);
|
|
19
|
+
const destination = media_store_1.MediaStore.resolvePath(agentsRoot, agentId, relative);
|
|
20
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(destination, '..'), { recursive: true, mode: 0o700 });
|
|
21
|
+
try {
|
|
22
|
+
const file = (0, fs_1.openSync)(destination, 'wx', 0o600);
|
|
23
|
+
try {
|
|
24
|
+
(0, fs_1.writeFileSync)(file, bytes);
|
|
25
|
+
(0, fs_1.fsyncSync)(file);
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
(0, fs_1.closeSync)(file);
|
|
29
|
+
}
|
|
30
|
+
const directory = (0, fs_1.openSync)((0, path_1.join)(destination, '..'), 'r');
|
|
31
|
+
try {
|
|
32
|
+
(0, fs_1.fsyncSync)(directory);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
(0, fs_1.closeSync)(directory);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.code !== 'EEXIST')
|
|
40
|
+
throw error;
|
|
41
|
+
if ((0, crypto_1.createHash)('sha256').update((0, fs_1.readFileSync)(destination)).digest('hex') !== digest)
|
|
42
|
+
throw new types_1.OrchestrationError('ATTACHMENT_RECONCILIATION_REQUIRED');
|
|
43
|
+
}
|
|
44
|
+
return relative;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/orchestration/media.ts"],"names":[],"mappings":";;AAOA,4DAmBC;AA1BD,mCAAoC;AACpC,2BAAsG;AACtG,+BAAqC;AACrC,mCAA6C;AAC7C,wDAAoD;AAEpD,kFAAkF;AAClF,SAAgB,wBAAwB,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAc,EAAE,MAAc;IAC1G,IAAI,IAAA,aAAQ,EAAC,MAAM,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;QAAE,MAAM,IAAI,0BAAkB,CAAC,sBAAsB,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG,IAAA,iBAAY,EAAC,MAAM,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;QAAE,MAAM,IAAI,0BAAkB,CAAC,sBAAsB,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,wBAAU,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,aAAQ,EAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC;YAAC,IAAA,kBAAa,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAC,IAAA,cAAS,EAAC,IAAI,CAAC,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,IAAA,cAAS,EAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QACjF,MAAM,SAAS,GAAG,IAAA,aAAQ,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC;YAAC,IAAA,cAAS,EAAC,SAAS,CAAC,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,IAAA,cAAS,EAAC,SAAS,CAAC,CAAC;QAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QACpE,IAAI,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAA,iBAAY,EAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM;YAAE,MAAM,IAAI,0BAAkB,CAAC,oCAAoC,CAAC,CAAC;IAC1J,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Additive sidecar only. Canonical conversation history stays in the existing stores. */
|
|
2
|
+
export declare const ORCHESTRATION_SCHEMA_V1 = "\nCREATE TABLE IF NOT EXISTS orchestration_schema_migrations(version INTEGER PRIMARY KEY, applied_at INTEGER NOT NULL);\nCREATE TABLE conversations(\n id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, agent_session_id TEXT NOT NULL,\n source TEXT NOT NULL, account_id TEXT NOT NULL, chat_id TEXT NOT NULL, thread_key TEXT NOT NULL,\n owner_principal_id TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'active', stream_id TEXT NOT NULL UNIQUE,\n last_event_seq INTEGER NOT NULL DEFAULT 0, last_input_seq INTEGER NOT NULL DEFAULT 0,\n epoch INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL,\n UNIQUE(agent_id,source,account_id,chat_id,thread_key,agent_session_id));\nCREATE TABLE conversation_members(conversation_id TEXT NOT NULL REFERENCES conversations(id), principal_id TEXT NOT NULL,\n role TEXT NOT NULL, PRIMARY KEY(conversation_id,principal_id));\nCREATE TABLE conversation_bindings(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n channel TEXT NOT NULL, account_id TEXT NOT NULL, chat_id TEXT NOT NULL, thread_key TEXT NOT NULL,\n reply_policy TEXT NOT NULL, capabilities_json TEXT NOT NULL,\n UNIQUE(conversation_id,channel,account_id,chat_id,thread_key));\nCREATE TABLE conversation_inputs(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n input_seq INTEGER NOT NULL, principal_id TEXT NOT NULL, binding_id TEXT NOT NULL REFERENCES conversation_bindings(id),\n modality TEXT NOT NULL, text TEXT NOT NULL, attachment_refs_json TEXT NOT NULL, request_id TEXT,\n store_user_message INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'accepted', created_at INTEGER NOT NULL, ingress_json TEXT NOT NULL DEFAULT '{}',\n UNIQUE(conversation_id,input_seq));\nCREATE INDEX pending_inputs ON conversation_inputs(conversation_id,status,input_seq);\nCREATE TABLE ingress_receipts(ingress_key TEXT PRIMARY KEY, payload_hash TEXT NOT NULL,\n input_id TEXT NOT NULL REFERENCES conversation_inputs(id), conversation_id TEXT NOT NULL REFERENCES conversations(id), accepted_at INTEGER NOT NULL);\nCREATE TABLE conversation_decisions(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n epoch INTEGER NOT NULL, kind TEXT NOT NULL, request_id TEXT, state TEXT NOT NULL, session_id TEXT NOT NULL,\n input_ids_json TEXT NOT NULL, notification_ids_json TEXT NOT NULL, started_at INTEGER NOT NULL, ended_at INTEGER);\nCREATE UNIQUE INDEX one_active_decision ON conversation_decisions(conversation_id) WHERE state IN ('running','interrupting');\nCREATE TABLE assistant_responses(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n decision_id TEXT NOT NULL REFERENCES conversation_decisions(id), request_id TEXT, state TEXT NOT NULL,\n generated_text TEXT NOT NULL, created_at INTEGER NOT NULL, completed_at INTEGER);\nCREATE TABLE tasks(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n state TEXT NOT NULL, state_version INTEGER NOT NULL, revision INTEGER NOT NULL,\n active_attempt_id TEXT, snapshot_json TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);\nCREATE INDEX task_queue ON tasks(state,created_at);\nCREATE INDEX conversation_tasks ON tasks(conversation_id,state);\nCREATE TABLE task_revisions(task_id TEXT NOT NULL REFERENCES tasks(id), revision INTEGER NOT NULL,\n payload_json TEXT NOT NULL, PRIMARY KEY(task_id,revision));\nCREATE TABLE task_attempts(id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), generation INTEGER NOT NULL,\n revision INTEGER NOT NULL, state TEXT NOT NULL, payload_json TEXT NOT NULL, UNIQUE(task_id,generation));\nCREATE UNIQUE INDEX one_active_attempt ON task_attempts(task_id) WHERE state IN ('starting','running','unknown');\nCREATE TABLE task_commands(action_id TEXT PRIMARY KEY, task_id TEXT REFERENCES tasks(id),\n conversation_id TEXT NOT NULL REFERENCES conversations(id), principal_id TEXT NOT NULL,\n decision_id TEXT, command_type TEXT NOT NULL, payload_hash TEXT NOT NULL, receipt_json TEXT NOT NULL, created_at INTEGER NOT NULL);\nCREATE TABLE conversation_events(conversation_id TEXT NOT NULL REFERENCES conversations(id), seq INTEGER NOT NULL,\n event_id TEXT NOT NULL UNIQUE, type TEXT NOT NULL, payload_json TEXT NOT NULL, occurred_at INTEGER NOT NULL,\n PRIMARY KEY(conversation_id,seq));\nCREATE TABLE worker_events(attempt_id TEXT NOT NULL REFERENCES task_attempts(id), local_seq INTEGER NOT NULL,\n type TEXT NOT NULL, payload_json TEXT NOT NULL, occurred_at INTEGER NOT NULL, PRIMARY KEY(attempt_id,local_seq));\nCREATE TABLE outbox(id TEXT PRIMARY KEY, kind TEXT NOT NULL, dedup_key TEXT NOT NULL UNIQUE,\n payload_json TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'pending', attempt_count INTEGER NOT NULL DEFAULT 0,\n available_at INTEGER NOT NULL, lease_owner TEXT, lease_expires_at INTEGER, last_error TEXT, created_at INTEGER NOT NULL);\nCREATE INDEX pending_outbox ON outbox(state,available_at);\nCREATE TABLE deliveries(id TEXT PRIMARY KEY, response_id TEXT REFERENCES assistant_responses(id), event_id TEXT,\n binding_id TEXT NOT NULL REFERENCES conversation_bindings(id), modality TEXT NOT NULL, state TEXT NOT NULL,\n provider_message_id TEXT, delivered_text TEXT, audio_progress_json TEXT, updated_at INTEGER NOT NULL);\nCREATE TABLE task_resources(id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), workspace_id TEXT NOT NULL,\n mode TEXT NOT NULL, base_commit TEXT, worktree_path TEXT, context_snapshot_ref TEXT, lock_key TEXT,\n lifecycle_state TEXT NOT NULL, cleanup_after INTEGER);\nCREATE UNIQUE INDEX resource_lock ON task_resources(lock_key) WHERE lock_key IS NOT NULL AND lifecycle_state = 'active';\nCREATE TABLE notifications(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n task_id TEXT NOT NULL REFERENCES tasks(id), task_state_version INTEGER NOT NULL,\n originating_binding_id TEXT NOT NULL REFERENCES conversation_bindings(id), status TEXT NOT NULL DEFAULT 'pending',\n decision_id TEXT, UNIQUE(task_id,task_state_version));\nCREATE TABLE history_operations(operation_id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),\n input_id TEXT REFERENCES conversation_inputs(id), response_id TEXT REFERENCES assistant_responses(id),\n intended_action TEXT NOT NULL, canonical_message_ref TEXT, state TEXT NOT NULL, updated_at INTEGER NOT NULL);\nCREATE TABLE runtime_sessions(id TEXT PRIMARY KEY, role TEXT NOT NULL, conversation_id TEXT REFERENCES conversations(id),\n task_id TEXT REFERENCES tasks(id), attempt_id TEXT REFERENCES task_attempts(id), backend TEXT NOT NULL,\n generation INTEGER NOT NULL, lifecycle_state TEXT NOT NULL, last_seen_at INTEGER NOT NULL);\nCREATE TABLE task_files(id TEXT PRIMARY KEY,task_id TEXT NOT NULL REFERENCES tasks(id),attempt_id TEXT NOT NULL,\n action_id TEXT NOT NULL,path TEXT NOT NULL,name TEXT NOT NULL,kind TEXT NOT NULL,caption TEXT NOT NULL,response_id TEXT,\n created_at INTEGER NOT NULL,args_hash TEXT NOT NULL,UNIQUE(attempt_id,action_id));\nCREATE TABLE response_speech(response_id TEXT PRIMARY KEY REFERENCES assistant_responses(id),text TEXT NOT NULL);\nCREATE TABLE voice_note_transcripts(input_id TEXT PRIMARY KEY REFERENCES conversation_inputs(id),state TEXT NOT NULL,text TEXT,error_code TEXT);\n";
|
|
3
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/orchestration/migrations/schema.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,ypOA0EnC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ORCHESTRATION_SCHEMA_V1 = void 0;
|
|
4
|
+
/** Additive sidecar only. Canonical conversation history stays in the existing stores. */
|
|
5
|
+
exports.ORCHESTRATION_SCHEMA_V1 = `
|
|
6
|
+
CREATE TABLE IF NOT EXISTS orchestration_schema_migrations(version INTEGER PRIMARY KEY, applied_at INTEGER NOT NULL);
|
|
7
|
+
CREATE TABLE conversations(
|
|
8
|
+
id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, agent_session_id TEXT NOT NULL,
|
|
9
|
+
source TEXT NOT NULL, account_id TEXT NOT NULL, chat_id TEXT NOT NULL, thread_key TEXT NOT NULL,
|
|
10
|
+
owner_principal_id TEXT NOT NULL, status TEXT NOT NULL DEFAULT 'active', stream_id TEXT NOT NULL UNIQUE,
|
|
11
|
+
last_event_seq INTEGER NOT NULL DEFAULT 0, last_input_seq INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
epoch INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL,
|
|
13
|
+
UNIQUE(agent_id,source,account_id,chat_id,thread_key,agent_session_id));
|
|
14
|
+
CREATE TABLE conversation_members(conversation_id TEXT NOT NULL REFERENCES conversations(id), principal_id TEXT NOT NULL,
|
|
15
|
+
role TEXT NOT NULL, PRIMARY KEY(conversation_id,principal_id));
|
|
16
|
+
CREATE TABLE conversation_bindings(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
17
|
+
channel TEXT NOT NULL, account_id TEXT NOT NULL, chat_id TEXT NOT NULL, thread_key TEXT NOT NULL,
|
|
18
|
+
reply_policy TEXT NOT NULL, capabilities_json TEXT NOT NULL,
|
|
19
|
+
UNIQUE(conversation_id,channel,account_id,chat_id,thread_key));
|
|
20
|
+
CREATE TABLE conversation_inputs(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
21
|
+
input_seq INTEGER NOT NULL, principal_id TEXT NOT NULL, binding_id TEXT NOT NULL REFERENCES conversation_bindings(id),
|
|
22
|
+
modality TEXT NOT NULL, text TEXT NOT NULL, attachment_refs_json TEXT NOT NULL, request_id TEXT,
|
|
23
|
+
store_user_message INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'accepted', created_at INTEGER NOT NULL, ingress_json TEXT NOT NULL DEFAULT '{}',
|
|
24
|
+
UNIQUE(conversation_id,input_seq));
|
|
25
|
+
CREATE INDEX pending_inputs ON conversation_inputs(conversation_id,status,input_seq);
|
|
26
|
+
CREATE TABLE ingress_receipts(ingress_key TEXT PRIMARY KEY, payload_hash TEXT NOT NULL,
|
|
27
|
+
input_id TEXT NOT NULL REFERENCES conversation_inputs(id), conversation_id TEXT NOT NULL REFERENCES conversations(id), accepted_at INTEGER NOT NULL);
|
|
28
|
+
CREATE TABLE conversation_decisions(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
29
|
+
epoch INTEGER NOT NULL, kind TEXT NOT NULL, request_id TEXT, state TEXT NOT NULL, session_id TEXT NOT NULL,
|
|
30
|
+
input_ids_json TEXT NOT NULL, notification_ids_json TEXT NOT NULL, started_at INTEGER NOT NULL, ended_at INTEGER);
|
|
31
|
+
CREATE UNIQUE INDEX one_active_decision ON conversation_decisions(conversation_id) WHERE state IN ('running','interrupting');
|
|
32
|
+
CREATE TABLE assistant_responses(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
33
|
+
decision_id TEXT NOT NULL REFERENCES conversation_decisions(id), request_id TEXT, state TEXT NOT NULL,
|
|
34
|
+
generated_text TEXT NOT NULL, created_at INTEGER NOT NULL, completed_at INTEGER);
|
|
35
|
+
CREATE TABLE tasks(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
36
|
+
state TEXT NOT NULL, state_version INTEGER NOT NULL, revision INTEGER NOT NULL,
|
|
37
|
+
active_attempt_id TEXT, snapshot_json TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);
|
|
38
|
+
CREATE INDEX task_queue ON tasks(state,created_at);
|
|
39
|
+
CREATE INDEX conversation_tasks ON tasks(conversation_id,state);
|
|
40
|
+
CREATE TABLE task_revisions(task_id TEXT NOT NULL REFERENCES tasks(id), revision INTEGER NOT NULL,
|
|
41
|
+
payload_json TEXT NOT NULL, PRIMARY KEY(task_id,revision));
|
|
42
|
+
CREATE TABLE task_attempts(id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), generation INTEGER NOT NULL,
|
|
43
|
+
revision INTEGER NOT NULL, state TEXT NOT NULL, payload_json TEXT NOT NULL, UNIQUE(task_id,generation));
|
|
44
|
+
CREATE UNIQUE INDEX one_active_attempt ON task_attempts(task_id) WHERE state IN ('starting','running','unknown');
|
|
45
|
+
CREATE TABLE task_commands(action_id TEXT PRIMARY KEY, task_id TEXT REFERENCES tasks(id),
|
|
46
|
+
conversation_id TEXT NOT NULL REFERENCES conversations(id), principal_id TEXT NOT NULL,
|
|
47
|
+
decision_id TEXT, command_type TEXT NOT NULL, payload_hash TEXT NOT NULL, receipt_json TEXT NOT NULL, created_at INTEGER NOT NULL);
|
|
48
|
+
CREATE TABLE conversation_events(conversation_id TEXT NOT NULL REFERENCES conversations(id), seq INTEGER NOT NULL,
|
|
49
|
+
event_id TEXT NOT NULL UNIQUE, type TEXT NOT NULL, payload_json TEXT NOT NULL, occurred_at INTEGER NOT NULL,
|
|
50
|
+
PRIMARY KEY(conversation_id,seq));
|
|
51
|
+
CREATE TABLE worker_events(attempt_id TEXT NOT NULL REFERENCES task_attempts(id), local_seq INTEGER NOT NULL,
|
|
52
|
+
type TEXT NOT NULL, payload_json TEXT NOT NULL, occurred_at INTEGER NOT NULL, PRIMARY KEY(attempt_id,local_seq));
|
|
53
|
+
CREATE TABLE outbox(id TEXT PRIMARY KEY, kind TEXT NOT NULL, dedup_key TEXT NOT NULL UNIQUE,
|
|
54
|
+
payload_json TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'pending', attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
55
|
+
available_at INTEGER NOT NULL, lease_owner TEXT, lease_expires_at INTEGER, last_error TEXT, created_at INTEGER NOT NULL);
|
|
56
|
+
CREATE INDEX pending_outbox ON outbox(state,available_at);
|
|
57
|
+
CREATE TABLE deliveries(id TEXT PRIMARY KEY, response_id TEXT REFERENCES assistant_responses(id), event_id TEXT,
|
|
58
|
+
binding_id TEXT NOT NULL REFERENCES conversation_bindings(id), modality TEXT NOT NULL, state TEXT NOT NULL,
|
|
59
|
+
provider_message_id TEXT, delivered_text TEXT, audio_progress_json TEXT, updated_at INTEGER NOT NULL);
|
|
60
|
+
CREATE TABLE task_resources(id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id), workspace_id TEXT NOT NULL,
|
|
61
|
+
mode TEXT NOT NULL, base_commit TEXT, worktree_path TEXT, context_snapshot_ref TEXT, lock_key TEXT,
|
|
62
|
+
lifecycle_state TEXT NOT NULL, cleanup_after INTEGER);
|
|
63
|
+
CREATE UNIQUE INDEX resource_lock ON task_resources(lock_key) WHERE lock_key IS NOT NULL AND lifecycle_state = 'active';
|
|
64
|
+
CREATE TABLE notifications(id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
65
|
+
task_id TEXT NOT NULL REFERENCES tasks(id), task_state_version INTEGER NOT NULL,
|
|
66
|
+
originating_binding_id TEXT NOT NULL REFERENCES conversation_bindings(id), status TEXT NOT NULL DEFAULT 'pending',
|
|
67
|
+
decision_id TEXT, UNIQUE(task_id,task_state_version));
|
|
68
|
+
CREATE TABLE history_operations(operation_id TEXT PRIMARY KEY, conversation_id TEXT NOT NULL REFERENCES conversations(id),
|
|
69
|
+
input_id TEXT REFERENCES conversation_inputs(id), response_id TEXT REFERENCES assistant_responses(id),
|
|
70
|
+
intended_action TEXT NOT NULL, canonical_message_ref TEXT, state TEXT NOT NULL, updated_at INTEGER NOT NULL);
|
|
71
|
+
CREATE TABLE runtime_sessions(id TEXT PRIMARY KEY, role TEXT NOT NULL, conversation_id TEXT REFERENCES conversations(id),
|
|
72
|
+
task_id TEXT REFERENCES tasks(id), attempt_id TEXT REFERENCES task_attempts(id), backend TEXT NOT NULL,
|
|
73
|
+
generation INTEGER NOT NULL, lifecycle_state TEXT NOT NULL, last_seen_at INTEGER NOT NULL);
|
|
74
|
+
CREATE TABLE task_files(id TEXT PRIMARY KEY,task_id TEXT NOT NULL REFERENCES tasks(id),attempt_id TEXT NOT NULL,
|
|
75
|
+
action_id TEXT NOT NULL,path TEXT NOT NULL,name TEXT NOT NULL,kind TEXT NOT NULL,caption TEXT NOT NULL,response_id TEXT,
|
|
76
|
+
created_at INTEGER NOT NULL,args_hash TEXT NOT NULL,UNIQUE(attempt_id,action_id));
|
|
77
|
+
CREATE TABLE response_speech(response_id TEXT PRIMARY KEY REFERENCES assistant_responses(id),text TEXT NOT NULL);
|
|
78
|
+
CREATE TABLE voice_note_transcripts(input_id TEXT PRIMARY KEY REFERENCES conversation_inputs(id),state TEXT NOT NULL,text TEXT,error_code TEXT);
|
|
79
|
+
`;
|
|
80
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/orchestration/migrations/schema.ts"],"names":[],"mappings":";;;AAAA,0FAA0F;AAC7E,QAAA,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0EtC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { OrchestrationStore } from './store';
|
|
2
|
+
/** Retry reports, never task execution. Decisions/inputs retain the retry clock
|
|
3
|
+
* across restarts, including failed reports written before this implementation. */
|
|
4
|
+
export declare function pendingReports(store: OrchestrationStore, activeSessions: string[], scheduled: string[], automatic: boolean, now?: number): import("./store").Row[];
|
|
5
|
+
//# sourceMappingURL=notification-mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-mailbox.d.ts","sourceRoot":"","sources":["../../src/orchestration/notification-mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;mFACmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,SAAa,2BAuB5I"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pendingReports = pendingReports;
|
|
4
|
+
/** Retry reports, never task execution. Decisions/inputs retain the retry clock
|
|
5
|
+
* across restarts, including failed reports written before this implementation. */
|
|
6
|
+
function pendingReports(store, activeSessions, scheduled, automatic, now = Date.now()) {
|
|
7
|
+
return store.all(`WITH candidates AS (
|
|
8
|
+
SELECT n.id notification_id,c.*,i.id previous_input_id,i.input_seq previous_seq,
|
|
9
|
+
d.state decision_state,d.ended_at,
|
|
10
|
+
(SELECT COUNT(*) FROM conversation_decisions x WHERE x.conversation_id=c.id AND x.state='failed'
|
|
11
|
+
AND EXISTS(SELECT 1 FROM json_each(x.notification_ids_json) WHERE value=n.id)) attempts
|
|
12
|
+
FROM notifications n JOIN conversations c ON c.id=n.conversation_id
|
|
13
|
+
LEFT JOIN conversation_inputs i ON i.id=(SELECT x.id FROM conversation_inputs x
|
|
14
|
+
WHERE x.conversation_id=c.id AND (json_extract(x.ingress_json,'$.ingressKey')='notification:'||n.id
|
|
15
|
+
OR json_extract(x.ingress_json,'$.ingressKey') LIKE 'notification:'||n.id||':retry:%') ORDER BY x.input_seq DESC LIMIT 1)
|
|
16
|
+
LEFT JOIN conversation_decisions d ON d.id=(SELECT d2.id FROM conversation_decisions d2
|
|
17
|
+
WHERE d2.conversation_id=c.id AND EXISTS(SELECT 1 FROM json_each(d2.notification_ids_json) WHERE value=n.id)
|
|
18
|
+
ORDER BY d2.epoch DESC LIMIT 1)
|
|
19
|
+
WHERE n.status='pending'
|
|
20
|
+
AND c.agent_session_id NOT IN (SELECT value FROM json_each(?))
|
|
21
|
+
AND (? OR c.id IN (SELECT value FROM json_each(?)) OR EXISTS (SELECT 1 FROM tasks monitored WHERE monitored.id=n.task_id AND monitored.state='running' AND json_extract(monitored.snapshot_json,'$.supervision.id') IS NOT NULL AND monitored.state_version=n.task_state_version))
|
|
22
|
+
AND NOT EXISTS(SELECT 1 FROM conversation_inputs queued WHERE queued.conversation_id=c.id AND queued.status IN ('accepted','assigned'))
|
|
23
|
+
), eligible AS (
|
|
24
|
+
SELECT *,ROW_NUMBER() OVER (PARTITION BY id ORDER BY notification_id) position FROM candidates
|
|
25
|
+
WHERE decision_state IS NULL OR decision_state='completed' OR (decision_state='failed'
|
|
26
|
+
AND ended_at+MIN(300000,5000*(1 << MIN(6,attempts-1)))<=?)
|
|
27
|
+
) SELECT * FROM eligible WHERE position=1 ORDER BY notification_id LIMIT 20`, JSON.stringify(activeSessions), automatic ? 1 : 0, JSON.stringify(scheduled), now);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=notification-mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-mailbox.js","sourceRoot":"","sources":["../../src/orchestration/notification-mailbox.ts"],"names":[],"mappings":";;AAIA,wCAuBC;AAzBD;mFACmF;AACnF,SAAgB,cAAc,CAAC,KAAyB,EAAE,cAAwB,EAAE,SAAmB,EAAE,SAAkB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3I,OAAO,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;8EAoB2D,EAC5E,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ProcessSample {
|
|
2
|
+
observedAt: number;
|
|
3
|
+
available: boolean;
|
|
4
|
+
processCount?: number;
|
|
5
|
+
cpuTicksDelta?: number;
|
|
6
|
+
childCpuTicksDelta?: number;
|
|
7
|
+
readBytesDelta?: number;
|
|
8
|
+
writeBytesDelta?: number;
|
|
9
|
+
membershipChanged?: boolean;
|
|
10
|
+
ioAvailable?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Read counters only, never argv/env/output. A process identity is PID + start time.
|
|
13
|
+
* Descendants in new process groups are included while still linked to the root.
|
|
14
|
+
* Detached/reparented children outside the original group cannot be proven here. */
|
|
15
|
+
export declare class ProcessActivitySampler {
|
|
16
|
+
private readonly pid;
|
|
17
|
+
private readonly enabled;
|
|
18
|
+
private rootStart?;
|
|
19
|
+
private previous?;
|
|
20
|
+
constructor(pid: () => number | undefined, enabled?: boolean);
|
|
21
|
+
sample(): Promise<ProcessSample>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=process-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-activity.d.ts","sourceRoot":"","sources":["../../src/orchestration/process-activity.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAGD;;oFAEoF;AACpF,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAA4B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpF,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAsB;gBACV,GAAG,EAAE,MAAM,MAAM,GAAG,SAAS,EAAmB,OAAO,UAAO;IACrF,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;CAyDvC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProcessActivitySampler = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
/** Read counters only, never argv/env/output. A process identity is PID + start time.
|
|
6
|
+
* Descendants in new process groups are included while still linked to the root.
|
|
7
|
+
* Detached/reparented children outside the original group cannot be proven here. */
|
|
8
|
+
class ProcessActivitySampler {
|
|
9
|
+
constructor(pid, enabled = true) {
|
|
10
|
+
this.pid = pid;
|
|
11
|
+
this.enabled = enabled;
|
|
12
|
+
}
|
|
13
|
+
async sample() {
|
|
14
|
+
const unavailable = { observedAt: Date.now(), available: false };
|
|
15
|
+
const pid = this.pid();
|
|
16
|
+
if (!this.enabled || process.platform !== 'linux' || !pid || pid <= 0)
|
|
17
|
+
return unavailable;
|
|
18
|
+
try {
|
|
19
|
+
const members = new Map();
|
|
20
|
+
const entries = await (0, promises_1.readdir)('/proc');
|
|
21
|
+
// Sequential stat reads bound open files and memory on busy shared hosts.
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (!/^\d+$/.test(entry))
|
|
24
|
+
continue;
|
|
25
|
+
try {
|
|
26
|
+
const stat = await (0, promises_1.readFile)(`/proc/${entry}/stat`, 'utf8');
|
|
27
|
+
const f = stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/);
|
|
28
|
+
members.set(Number(entry), { pid: Number(entry), parent: Number(f[1]), group: Number(f[2]), state: f[0], start: f[19], cpu: Number(f[11]) + Number(f[12]) });
|
|
29
|
+
}
|
|
30
|
+
catch { /* Processes may exit while being sampled. */ }
|
|
31
|
+
}
|
|
32
|
+
const root = members.get(pid);
|
|
33
|
+
if (!root || ['Z', 'X'].includes(root.state) || (this.rootStart && this.rootStart !== root.start))
|
|
34
|
+
return unavailable;
|
|
35
|
+
this.rootStart = root.start;
|
|
36
|
+
const owned = new Set([pid]);
|
|
37
|
+
let changed = true;
|
|
38
|
+
while (changed) {
|
|
39
|
+
changed = false;
|
|
40
|
+
for (const m of members.values())
|
|
41
|
+
if (!owned.has(m.pid) && (owned.has(m.parent) || (root.group === pid && m.group === pid))) {
|
|
42
|
+
owned.add(m.pid);
|
|
43
|
+
changed = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const current = new Map();
|
|
47
|
+
for (const id of owned) {
|
|
48
|
+
const m = members.get(id);
|
|
49
|
+
if (['Z', 'X'].includes(m.state))
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
const io = await (0, promises_1.readFile)(`/proc/${id}/io`, 'utf8');
|
|
53
|
+
// Logical I/O includes pipes/cache, so piped test output is visible.
|
|
54
|
+
m.read = Number(/^rchar:\s+(\d+)/m.exec(io)?.[1]);
|
|
55
|
+
m.write = Number(/^wchar:\s+(\d+)/m.exec(io)?.[1]);
|
|
56
|
+
}
|
|
57
|
+
catch { /* CPU/membership remain usable without I/O permission. */ }
|
|
58
|
+
try {
|
|
59
|
+
const stat = await (0, promises_1.readFile)(`/proc/${id}/stat`, 'utf8');
|
|
60
|
+
if (stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/)[19] !== m.start)
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
current.set(`${id}:${m.start}`, m);
|
|
67
|
+
}
|
|
68
|
+
const result = { observedAt: Date.now(), available: true, processCount: current.size, ioAvailable: [...current.values()].every(m => Number.isFinite(m.read) && Number.isFinite(m.write)) };
|
|
69
|
+
if (this.previous) {
|
|
70
|
+
result.childCpuTicksDelta = 0;
|
|
71
|
+
result.cpuTicksDelta = 0;
|
|
72
|
+
result.readBytesDelta = 0;
|
|
73
|
+
result.writeBytesDelta = 0;
|
|
74
|
+
result.membershipChanged = current.size !== this.previous.size || [...current.keys()].some(k => !this.previous.has(k));
|
|
75
|
+
for (const [key, m] of current) {
|
|
76
|
+
const prior = this.previous.get(key);
|
|
77
|
+
result.cpuTicksDelta += Math.max(0, m.cpu - (prior?.cpu ?? 0));
|
|
78
|
+
if (m.pid !== pid)
|
|
79
|
+
result.childCpuTicksDelta += Math.max(0, m.cpu - (prior?.cpu ?? 0));
|
|
80
|
+
if (Number.isFinite(m.read) && (!prior || Number.isFinite(prior.read)))
|
|
81
|
+
result.readBytesDelta += Math.max(0, m.read - (prior?.read ?? 0));
|
|
82
|
+
if (Number.isFinite(m.write) && (!prior || Number.isFinite(prior.write)))
|
|
83
|
+
result.writeBytesDelta += Math.max(0, m.write - (prior?.write ?? 0));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.previous = current;
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return unavailable;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.ProcessActivitySampler = ProcessActivitySampler;
|
|
95
|
+
//# sourceMappingURL=process-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-activity.js","sourceRoot":"","sources":["../../src/orchestration/process-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Linux process-group evidence ignores exited zombies. Escaped/detached
|
|
2
|
+
* process groups are outside this proof and must be reconciled separately. */
|
|
3
|
+
export declare function liveGroupMembers(group: number): number[] | undefined;
|
|
4
|
+
export declare function stopProcessGroup(group: number): Promise<boolean>;
|
|
5
|
+
/** Kernel identity prevents signalling an unrelated process after PID reuse. */
|
|
6
|
+
export declare function processFingerprint(pid: number): {
|
|
7
|
+
bootId: string;
|
|
8
|
+
startTicks: string;
|
|
9
|
+
} | undefined;
|
|
10
|
+
export declare function cleanupPersistedProcess(identity?: {
|
|
11
|
+
pid: number;
|
|
12
|
+
bootId?: string;
|
|
13
|
+
startTicks?: string;
|
|
14
|
+
}): Promise<boolean>;
|
|
15
|
+
//# sourceMappingURL=process-supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-supervisor.d.ts","sourceRoot":"","sources":["../../src/orchestration/process-supervisor.ts"],"names":[],"mappings":"AAEA;8EAC8E;AAC9E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAcpE;AACD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAatE;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAQlG;AACD,wBAAsB,uBAAuB,CAAC,QAAQ,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhI"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.liveGroupMembers = liveGroupMembers;
|
|
4
|
+
exports.stopProcessGroup = stopProcessGroup;
|
|
5
|
+
exports.processFingerprint = processFingerprint;
|
|
6
|
+
exports.cleanupPersistedProcess = cleanupPersistedProcess;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
/** Linux process-group evidence ignores exited zombies. Escaped/detached
|
|
9
|
+
* process groups are outside this proof and must be reconciled separately. */
|
|
10
|
+
function liveGroupMembers(group) {
|
|
11
|
+
if (process.platform !== 'linux' || !Number.isSafeInteger(group) || group <= 0)
|
|
12
|
+
return undefined;
|
|
13
|
+
const members = [];
|
|
14
|
+
try {
|
|
15
|
+
for (const entry of (0, fs_1.readdirSync)('/proc')) {
|
|
16
|
+
if (!/^\d+$/.test(entry))
|
|
17
|
+
continue;
|
|
18
|
+
try {
|
|
19
|
+
const stat = (0, fs_1.readFileSync)(`/proc/${entry}/stat`, 'utf8');
|
|
20
|
+
const fields = stat.slice(stat.lastIndexOf(')') + 2).split(' ');
|
|
21
|
+
if (Number(fields[2]) === group && fields[0] !== 'Z' && fields[0] !== 'X')
|
|
22
|
+
members.push(Number(entry));
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code !== 'ENOENT' && error.code !== 'ESRCH')
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return members;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function stopProcessGroup(group) {
|
|
36
|
+
if (process.platform !== 'linux' || !Number.isSafeInteger(group) || group <= 0)
|
|
37
|
+
return false;
|
|
38
|
+
try {
|
|
39
|
+
process.kill(-group, 'SIGTERM');
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error.code !== 'ESRCH')
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const deadline = Date.now() + 2000;
|
|
46
|
+
while (Date.now() < deadline) {
|
|
47
|
+
const members = liveGroupMembers(group);
|
|
48
|
+
if (!members)
|
|
49
|
+
return false;
|
|
50
|
+
if (!members.length)
|
|
51
|
+
return true;
|
|
52
|
+
await new Promise(resolve => setTimeout(resolve, 25));
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
process.kill(-group, 'SIGKILL');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error.code !== 'ESRCH')
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
62
|
+
return liveGroupMembers(group)?.length === 0;
|
|
63
|
+
}
|
|
64
|
+
/** Kernel identity prevents signalling an unrelated process after PID reuse. */
|
|
65
|
+
function processFingerprint(pid) {
|
|
66
|
+
if (process.platform !== 'linux' || !Number.isSafeInteger(pid) || pid <= 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
try {
|
|
69
|
+
const stat = (0, fs_1.readFileSync)(`/proc/${pid}/stat`, 'utf8');
|
|
70
|
+
const fields = stat.slice(stat.lastIndexOf(')') + 2).split(' ');
|
|
71
|
+
if (Number(fields[2]) !== pid)
|
|
72
|
+
return undefined;
|
|
73
|
+
return { bootId: (0, fs_1.readFileSync)('/proc/sys/kernel/random/boot_id', 'utf8').trim(), startTicks: fields[19] };
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function cleanupPersistedProcess(identity) {
|
|
80
|
+
if (!identity || !Number.isSafeInteger(identity.pid) || identity.pid <= 0)
|
|
81
|
+
return false;
|
|
82
|
+
const members = liveGroupMembers(identity.pid);
|
|
83
|
+
if (!members)
|
|
84
|
+
return false;
|
|
85
|
+
if (!members.length)
|
|
86
|
+
return true;
|
|
87
|
+
const current = processFingerprint(identity.pid);
|
|
88
|
+
if (!current || !identity.bootId || !identity.startTicks || current.bootId !== identity.bootId || current.startTicks !== identity.startTicks)
|
|
89
|
+
return false;
|
|
90
|
+
return stopProcessGroup(identity.pid);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=process-supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-supervisor.js","sourceRoot":"","sources":["../../src/orchestration/process-supervisor.ts"],"names":[],"mappings":"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"}
|