openryoko 2026.10.9 → 2026.10.13
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/bin/jimmy.js +51 -1
- package/dist/bin/jimmy.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/src/backup/archive.d.ts +65 -0
- package/dist/src/backup/archive.d.ts.map +1 -0
- package/dist/src/backup/archive.js +214 -0
- package/dist/src/backup/archive.js.map +1 -0
- package/dist/src/backup/catalog.d.ts +64 -0
- package/dist/src/backup/catalog.d.ts.map +1 -0
- package/dist/src/backup/catalog.js +252 -0
- package/dist/src/backup/catalog.js.map +1 -0
- package/dist/src/backup/database-restore.d.ts +63 -0
- package/dist/src/backup/database-restore.d.ts.map +1 -0
- package/dist/src/backup/database-restore.js +236 -0
- package/dist/src/backup/database-restore.js.map +1 -0
- package/dist/src/backup/database-source.d.ts +70 -0
- package/dist/src/backup/database-source.d.ts.map +1 -0
- package/dist/src/backup/database-source.js +70 -0
- package/dist/src/backup/database-source.js.map +1 -0
- package/dist/src/backup/format.d.ts +4 -0
- package/dist/src/backup/format.d.ts.map +1 -0
- package/dist/src/backup/format.js +15 -0
- package/dist/src/backup/format.js.map +1 -0
- package/dist/src/backup/gateway-liveness.d.ts +44 -0
- package/dist/src/backup/gateway-liveness.d.ts.map +1 -0
- package/dist/src/backup/gateway-liveness.js +120 -0
- package/dist/src/backup/gateway-liveness.js.map +1 -0
- package/dist/src/backup/inspect.d.ts +45 -0
- package/dist/src/backup/inspect.d.ts.map +1 -0
- package/dist/src/backup/inspect.js +291 -0
- package/dist/src/backup/inspect.js.map +1 -0
- package/dist/src/backup/layout.d.ts +11 -0
- package/dist/src/backup/layout.d.ts.map +1 -0
- package/dist/src/backup/layout.js +16 -0
- package/dist/src/backup/layout.js.map +1 -0
- package/dist/src/backup/limits.d.ts +54 -0
- package/dist/src/backup/limits.d.ts.map +1 -0
- package/dist/src/backup/limits.js +59 -0
- package/dist/src/backup/limits.js.map +1 -0
- package/dist/src/backup/manifest.d.ts +45 -0
- package/dist/src/backup/manifest.d.ts.map +1 -0
- package/dist/src/backup/manifest.js +77 -0
- package/dist/src/backup/manifest.js.map +1 -0
- package/dist/src/backup/restore.d.ts +73 -0
- package/dist/src/backup/restore.d.ts.map +1 -0
- package/dist/src/backup/restore.js +685 -0
- package/dist/src/backup/restore.js.map +1 -0
- package/dist/src/backup/run.d.ts +76 -0
- package/dist/src/backup/run.d.ts.map +1 -0
- package/dist/src/backup/run.js +181 -0
- package/dist/src/backup/run.js.map +1 -0
- package/dist/src/backup/scheduler.d.ts +51 -0
- package/dist/src/backup/scheduler.d.ts.map +1 -0
- package/dist/src/backup/scheduler.js +198 -0
- package/dist/src/backup/scheduler.js.map +1 -0
- package/dist/src/backup/settings.d.ts +44 -0
- package/dist/src/backup/settings.d.ts.map +1 -0
- package/dist/src/backup/settings.js +91 -0
- package/dist/src/backup/settings.js.map +1 -0
- package/dist/src/backup/space.d.ts +22 -0
- package/dist/src/backup/space.d.ts.map +1 -0
- package/dist/src/backup/space.js +47 -0
- package/dist/src/backup/space.js.map +1 -0
- package/dist/src/backup/state.d.ts +46 -0
- package/dist/src/backup/state.d.ts.map +1 -0
- package/dist/src/backup/state.js +137 -0
- package/dist/src/backup/state.js.map +1 -0
- package/dist/src/backup/tar.d.ts +64 -0
- package/dist/src/backup/tar.d.ts.map +1 -0
- package/dist/src/backup/tar.js +274 -0
- package/dist/src/backup/tar.js.map +1 -0
- package/dist/src/backup/targets.d.ts +85 -0
- package/dist/src/backup/targets.d.ts.map +1 -0
- package/dist/src/backup/targets.js +104 -0
- package/dist/src/backup/targets.js.map +1 -0
- package/dist/src/backup/walk.d.ts +42 -0
- package/dist/src/backup/walk.d.ts.map +1 -0
- package/dist/src/backup/walk.js +324 -0
- package/dist/src/backup/walk.js.map +1 -0
- package/dist/src/cli/backup.d.ts +45 -0
- package/dist/src/cli/backup.d.ts.map +1 -0
- package/dist/src/cli/backup.js +344 -0
- package/dist/src/cli/backup.js.map +1 -0
- package/dist/src/cli/bundled-skills.d.ts +7 -1
- package/dist/src/cli/bundled-skills.d.ts.map +1 -1
- package/dist/src/cli/bundled-skills.js +12 -2
- package/dist/src/cli/bundled-skills.js.map +1 -1
- package/dist/src/cli/config-failure.d.ts +18 -0
- package/dist/src/cli/config-failure.d.ts.map +1 -0
- package/dist/src/cli/config-failure.js +39 -0
- package/dist/src/cli/config-failure.js.map +1 -0
- package/dist/src/cli/gateway-audit.d.ts +3 -0
- package/dist/src/cli/gateway-audit.d.ts.map +1 -1
- package/dist/src/cli/gateway-audit.js +61 -14
- package/dist/src/cli/gateway-audit.js.map +1 -1
- package/dist/src/cli/gateway-url-backup.d.ts +21 -0
- package/dist/src/cli/gateway-url-backup.d.ts.map +1 -0
- package/dist/src/cli/gateway-url-backup.js +87 -0
- package/dist/src/cli/gateway-url-backup.js.map +1 -0
- package/dist/src/cli/home-copy.d.ts +37 -0
- package/dist/src/cli/home-copy.d.ts.map +1 -0
- package/dist/src/cli/home-copy.js +155 -0
- package/dist/src/cli/home-copy.js.map +1 -0
- package/dist/src/cli/interactive-config.d.ts +5 -0
- package/dist/src/cli/interactive-config.d.ts.map +1 -1
- package/dist/src/cli/interactive-config.js +16 -7
- package/dist/src/cli/interactive-config.js.map +1 -1
- package/dist/src/cli/migrate.d.ts +16 -0
- package/dist/src/cli/migrate.d.ts.map +1 -1
- package/dist/src/cli/migrate.js +358 -69
- package/dist/src/cli/migrate.js.map +1 -1
- package/dist/src/cli/migration-declarations.d.ts +24 -0
- package/dist/src/cli/migration-declarations.d.ts.map +1 -0
- package/dist/src/cli/migration-declarations.js +54 -0
- package/dist/src/cli/migration-declarations.js.map +1 -0
- package/dist/src/cli/start.d.ts.map +1 -1
- package/dist/src/cli/start.js +40 -1
- package/dist/src/cli/start.js.map +1 -1
- package/dist/src/connectors/chunked-send.d.ts +27 -0
- package/dist/src/connectors/chunked-send.d.ts.map +1 -0
- package/dist/src/connectors/chunked-send.js +40 -0
- package/dist/src/connectors/chunked-send.js.map +1 -0
- package/dist/src/connectors/cron/index.d.ts +10 -0
- package/dist/src/connectors/cron/index.d.ts.map +1 -1
- package/dist/src/connectors/cron/index.js +26 -3
- package/dist/src/connectors/cron/index.js.map +1 -1
- package/dist/src/connectors/discord/attachments.d.ts +25 -0
- package/dist/src/connectors/discord/attachments.d.ts.map +1 -0
- package/dist/src/connectors/discord/attachments.js +33 -0
- package/dist/src/connectors/discord/attachments.js.map +1 -0
- package/dist/src/connectors/discord/format.d.ts +17 -1
- package/dist/src/connectors/discord/format.d.ts.map +1 -1
- package/dist/src/connectors/discord/format.js +36 -6
- package/dist/src/connectors/discord/format.js.map +1 -1
- package/dist/src/connectors/discord/index.d.ts +12 -0
- package/dist/src/connectors/discord/index.d.ts.map +1 -1
- package/dist/src/connectors/discord/index.js +47 -40
- package/dist/src/connectors/discord/index.js.map +1 -1
- package/dist/src/connectors/discord/remote.d.ts +45 -1
- package/dist/src/connectors/discord/remote.d.ts.map +1 -1
- package/dist/src/connectors/discord/remote.js +147 -22
- package/dist/src/connectors/discord/remote.js.map +1 -1
- package/dist/src/connectors/slack/attachments.d.ts +25 -0
- package/dist/src/connectors/slack/attachments.d.ts.map +1 -0
- package/dist/src/connectors/slack/attachments.js +32 -0
- package/dist/src/connectors/slack/attachments.js.map +1 -0
- package/dist/src/connectors/slack/auth-test-cache.d.ts +22 -0
- package/dist/src/connectors/slack/auth-test-cache.d.ts.map +1 -0
- package/dist/src/connectors/slack/auth-test-cache.js +34 -0
- package/dist/src/connectors/slack/auth-test-cache.js.map +1 -0
- package/dist/src/connectors/slack/format.d.ts +6 -1
- package/dist/src/connectors/slack/format.d.ts.map +1 -1
- package/dist/src/connectors/slack/format.js +65 -13
- package/dist/src/connectors/slack/format.js.map +1 -1
- package/dist/src/connectors/slack/index.d.ts +4 -0
- package/dist/src/connectors/slack/index.d.ts.map +1 -1
- package/dist/src/connectors/slack/index.js +64 -52
- package/dist/src/connectors/slack/index.js.map +1 -1
- package/dist/src/connectors/slack/provider-auth-blocks.d.ts +62 -0
- package/dist/src/connectors/slack/provider-auth-blocks.d.ts.map +1 -0
- package/dist/src/connectors/slack/provider-auth-blocks.js +204 -0
- package/dist/src/connectors/slack/provider-auth-blocks.js.map +1 -0
- package/dist/src/connectors/slack/provider-auth.d.ts +126 -0
- package/dist/src/connectors/slack/provider-auth.d.ts.map +1 -0
- package/dist/src/connectors/slack/provider-auth.js +357 -0
- package/dist/src/connectors/slack/provider-auth.js.map +1 -0
- package/dist/src/connectors/telegram/index.d.ts +5 -0
- package/dist/src/connectors/telegram/index.d.ts.map +1 -1
- package/dist/src/connectors/telegram/index.js +14 -22
- package/dist/src/connectors/telegram/index.js.map +1 -1
- package/dist/src/connectors/whatsapp/index.d.ts +3 -0
- package/dist/src/connectors/whatsapp/index.d.ts.map +1 -1
- package/dist/src/connectors/whatsapp/index.js +33 -14
- package/dist/src/connectors/whatsapp/index.js.map +1 -1
- package/dist/src/cron/alert-throttle.d.ts +28 -0
- package/dist/src/cron/alert-throttle.d.ts.map +1 -0
- package/dist/src/cron/alert-throttle.js +106 -0
- package/dist/src/cron/alert-throttle.js.map +1 -0
- package/dist/src/cron/jobs.d.ts +8 -0
- package/dist/src/cron/jobs.d.ts.map +1 -1
- package/dist/src/cron/jobs.js +27 -1
- package/dist/src/cron/jobs.js.map +1 -1
- package/dist/src/cron/run-outcome.d.ts +28 -0
- package/dist/src/cron/run-outcome.d.ts.map +1 -0
- package/dist/src/cron/run-outcome.js +66 -0
- package/dist/src/cron/run-outcome.js.map +1 -0
- package/dist/src/cron/runner.d.ts.map +1 -1
- package/dist/src/cron/runner.js +68 -5
- package/dist/src/cron/runner.js.map +1 -1
- package/dist/src/cron/scheduler.d.ts +8 -1
- package/dist/src/cron/scheduler.d.ts.map +1 -1
- package/dist/src/cron/scheduler.js +11 -4
- package/dist/src/cron/scheduler.js.map +1 -1
- package/dist/src/cron/waiting-fires.d.ts +18 -0
- package/dist/src/cron/waiting-fires.d.ts.map +1 -0
- package/dist/src/cron/waiting-fires.js +49 -0
- package/dist/src/cron/waiting-fires.js.map +1 -0
- package/dist/src/engines/claude-interactive.d.ts +15 -2
- package/dist/src/engines/claude-interactive.d.ts.map +1 -1
- package/dist/src/engines/claude-interactive.js +32 -11
- package/dist/src/engines/claude-interactive.js.map +1 -1
- package/dist/src/engines/claude.d.ts.map +1 -1
- package/dist/src/engines/claude.js +37 -5
- package/dist/src/engines/claude.js.map +1 -1
- package/dist/src/engines/codex.d.ts.map +1 -1
- package/dist/src/engines/codex.js +1 -0
- package/dist/src/engines/codex.js.map +1 -1
- package/dist/src/engines/gemini.d.ts.map +1 -1
- package/dist/src/engines/gemini.js +1 -0
- package/dist/src/engines/gemini.js.map +1 -1
- package/dist/src/gateway/api.d.ts.map +1 -1
- package/dist/src/gateway/api.js +182 -150
- package/dist/src/gateway/api.js.map +1 -1
- package/dist/src/gateway/config-redaction.d.ts +32 -0
- package/dist/src/gateway/config-redaction.d.ts.map +1 -0
- package/dist/src/gateway/config-redaction.js +139 -0
- package/dist/src/gateway/config-redaction.js.map +1 -0
- package/dist/src/gateway/config-revision.d.ts +46 -0
- package/dist/src/gateway/config-revision.d.ts.map +1 -0
- package/dist/src/gateway/config-revision.js +63 -0
- package/dist/src/gateway/config-revision.js.map +1 -0
- package/dist/src/gateway/connector-config.d.ts +21 -0
- package/dist/src/gateway/connector-config.d.ts.map +1 -0
- package/dist/src/gateway/connector-config.js +24 -0
- package/dist/src/gateway/connector-config.js.map +1 -0
- package/dist/src/gateway/daemon-entry.js +5 -0
- package/dist/src/gateway/daemon-entry.js.map +1 -1
- package/dist/src/gateway/engine-health-monitor.d.ts +67 -0
- package/dist/src/gateway/engine-health-monitor.d.ts.map +1 -0
- package/dist/src/gateway/engine-health-monitor.js +221 -0
- package/dist/src/gateway/engine-health-monitor.js.map +1 -0
- package/dist/src/gateway/files.d.ts +7 -1
- package/dist/src/gateway/files.d.ts.map +1 -1
- package/dist/src/gateway/files.js +110 -217
- package/dist/src/gateway/files.js.map +1 -1
- package/dist/src/gateway/portal-config.d.ts +17 -3
- package/dist/src/gateway/portal-config.d.ts.map +1 -1
- package/dist/src/gateway/portal-config.js +52 -3
- package/dist/src/gateway/portal-config.js.map +1 -1
- package/dist/src/gateway/request-origin.d.ts +9 -0
- package/dist/src/gateway/request-origin.d.ts.map +1 -1
- package/dist/src/gateway/request-origin.js +10 -0
- package/dist/src/gateway/request-origin.js.map +1 -1
- package/dist/src/gateway/server.d.ts.map +1 -1
- package/dist/src/gateway/server.js +76 -59
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/gateway/slack-connect-rollback.d.ts +23 -0
- package/dist/src/gateway/slack-connect-rollback.d.ts.map +1 -0
- package/dist/src/gateway/slack-connect-rollback.js +53 -0
- package/dist/src/gateway/slack-connect-rollback.js.map +1 -0
- package/dist/src/gateway/status-reconciler.d.ts +25 -7
- package/dist/src/gateway/status-reconciler.d.ts.map +1 -1
- package/dist/src/gateway/status-reconciler.js +86 -43
- package/dist/src/gateway/status-reconciler.js.map +1 -1
- package/dist/src/gateway/watcher.d.ts.map +1 -1
- package/dist/src/gateway/watcher.js +44 -3
- package/dist/src/gateway/watcher.js.map +1 -1
- package/dist/src/mcp/gateway-server.js +21 -3
- package/dist/src/mcp/gateway-server.js.map +1 -1
- package/dist/src/mcp/resolver.d.ts.map +1 -1
- package/dist/src/mcp/resolver.js +51 -1
- package/dist/src/mcp/resolver.js.map +1 -1
- package/dist/src/models/service.d.ts.map +1 -1
- package/dist/src/models/service.js +14 -8
- package/dist/src/models/service.js.map +1 -1
- package/dist/src/provider-auth/discovery.d.ts +16 -0
- package/dist/src/provider-auth/discovery.d.ts.map +1 -0
- package/dist/src/provider-auth/discovery.js +66 -0
- package/dist/src/provider-auth/discovery.js.map +1 -0
- package/dist/src/provider-auth/failure-notices.d.ts +29 -0
- package/dist/src/provider-auth/failure-notices.d.ts.map +1 -0
- package/dist/src/provider-auth/failure-notices.js +48 -0
- package/dist/src/provider-auth/failure-notices.js.map +1 -0
- package/dist/src/provider-auth/failure-signal.d.ts +22 -0
- package/dist/src/provider-auth/failure-signal.d.ts.map +1 -0
- package/dist/src/provider-auth/failure-signal.js +79 -0
- package/dist/src/provider-auth/failure-signal.js.map +1 -0
- package/dist/src/provider-auth/index.d.ts +26 -0
- package/dist/src/provider-auth/index.d.ts.map +1 -0
- package/dist/src/provider-auth/index.js +51 -0
- package/dist/src/provider-auth/index.js.map +1 -0
- package/dist/src/provider-auth/input.d.ts +44 -0
- package/dist/src/provider-auth/input.d.ts.map +1 -0
- package/dist/src/provider-auth/input.js +86 -0
- package/dist/src/provider-auth/input.js.map +1 -0
- package/dist/src/provider-auth/providers.d.ts +26 -0
- package/dist/src/provider-auth/providers.d.ts.map +1 -0
- package/dist/src/provider-auth/providers.js +86 -0
- package/dist/src/provider-auth/providers.js.map +1 -0
- package/dist/src/provider-auth/runtime.d.ts +21 -0
- package/dist/src/provider-auth/runtime.d.ts.map +1 -0
- package/dist/src/provider-auth/runtime.js +104 -0
- package/dist/src/provider-auth/runtime.js.map +1 -0
- package/dist/src/provider-auth/service.d.ts +70 -0
- package/dist/src/provider-auth/service.d.ts.map +1 -0
- package/dist/src/provider-auth/service.js +349 -0
- package/dist/src/provider-auth/service.js.map +1 -0
- package/dist/src/provider-auth/terminal.d.ts +21 -0
- package/dist/src/provider-auth/terminal.d.ts.map +1 -0
- package/dist/src/provider-auth/terminal.js +46 -0
- package/dist/src/provider-auth/terminal.js.map +1 -0
- package/dist/src/provider-auth/types.d.ts +123 -0
- package/dist/src/provider-auth/types.d.ts.map +1 -0
- package/dist/src/provider-auth/types.js +10 -0
- package/dist/src/provider-auth/types.js.map +1 -0
- package/dist/src/sessions/accounting.d.ts +3 -0
- package/dist/src/sessions/accounting.d.ts.map +1 -1
- package/dist/src/sessions/accounting.js +5 -0
- package/dist/src/sessions/accounting.js.map +1 -1
- package/dist/src/sessions/backup-integrity.d.ts +45 -0
- package/dist/src/sessions/backup-integrity.d.ts.map +1 -0
- package/dist/src/sessions/backup-integrity.js +122 -0
- package/dist/src/sessions/backup-integrity.js.map +1 -0
- package/dist/src/sessions/backup.d.ts +40 -2
- package/dist/src/sessions/backup.d.ts.map +1 -1
- package/dist/src/sessions/backup.js +88 -12
- package/dist/src/sessions/backup.js.map +1 -1
- package/dist/src/sessions/callbacks.d.ts +9 -0
- package/dist/src/sessions/callbacks.d.ts.map +1 -1
- package/dist/src/sessions/callbacks.js +55 -10
- package/dist/src/sessions/callbacks.js.map +1 -1
- package/dist/src/sessions/completion-batching.d.ts +82 -0
- package/dist/src/sessions/completion-batching.d.ts.map +1 -0
- package/dist/src/sessions/completion-batching.js +126 -0
- package/dist/src/sessions/completion-batching.js.map +1 -0
- package/dist/src/sessions/connector-command-guard.d.ts +66 -0
- package/dist/src/sessions/connector-command-guard.d.ts.map +1 -0
- package/dist/src/sessions/connector-command-guard.js +145 -0
- package/dist/src/sessions/connector-command-guard.js.map +1 -0
- package/dist/src/sessions/context.js +2 -2
- package/dist/src/sessions/engine-fallback.d.ts +43 -1
- package/dist/src/sessions/engine-fallback.d.ts.map +1 -1
- package/dist/src/sessions/engine-fallback.js +266 -15
- package/dist/src/sessions/engine-fallback.js.map +1 -1
- package/dist/src/sessions/engine-health-gate.d.ts +83 -0
- package/dist/src/sessions/engine-health-gate.d.ts.map +1 -0
- package/dist/src/sessions/engine-health-gate.js +186 -0
- package/dist/src/sessions/engine-health-gate.js.map +1 -0
- package/dist/src/sessions/engine-login.d.ts +58 -0
- package/dist/src/sessions/engine-login.d.ts.map +1 -0
- package/dist/src/sessions/engine-login.js +107 -0
- package/dist/src/sessions/engine-login.js.map +1 -0
- package/dist/src/sessions/fork.d.ts.map +1 -1
- package/dist/src/sessions/fork.js +2 -1
- package/dist/src/sessions/fork.js.map +1 -1
- package/dist/src/sessions/goal-execution.d.ts.map +1 -1
- package/dist/src/sessions/goal-execution.js +8 -1
- package/dist/src/sessions/goal-execution.js.map +1 -1
- package/dist/src/sessions/limit-failure-notice.d.ts +41 -0
- package/dist/src/sessions/limit-failure-notice.d.ts.map +1 -0
- package/dist/src/sessions/limit-failure-notice.js +87 -0
- package/dist/src/sessions/limit-failure-notice.js.map +1 -0
- package/dist/src/sessions/lost-turn.d.ts +39 -0
- package/dist/src/sessions/lost-turn.d.ts.map +1 -0
- package/dist/src/sessions/lost-turn.js +32 -0
- package/dist/src/sessions/lost-turn.js.map +1 -0
- package/dist/src/sessions/manager.d.ts.map +1 -1
- package/dist/src/sessions/manager.js +104 -47
- package/dist/src/sessions/manager.js.map +1 -1
- package/dist/src/sessions/new-session-engine.d.ts +42 -0
- package/dist/src/sessions/new-session-engine.d.ts.map +1 -0
- package/dist/src/sessions/new-session-engine.js +100 -0
- package/dist/src/sessions/new-session-engine.js.map +1 -0
- package/dist/src/sessions/origin-delivery.d.ts +50 -4
- package/dist/src/sessions/origin-delivery.d.ts.map +1 -1
- package/dist/src/sessions/origin-delivery.js +108 -9
- package/dist/src/sessions/origin-delivery.js.map +1 -1
- package/dist/src/sessions/queue.d.ts +14 -0
- package/dist/src/sessions/queue.d.ts.map +1 -1
- package/dist/src/sessions/queue.js +38 -2
- package/dist/src/sessions/queue.js.map +1 -1
- package/dist/src/sessions/registry.d.ts +4 -2
- package/dist/src/sessions/registry.d.ts.map +1 -1
- package/dist/src/sessions/registry.js +21 -4
- package/dist/src/sessions/registry.js.map +1 -1
- package/dist/src/sessions/reply-disposition.d.ts +8 -0
- package/dist/src/sessions/reply-disposition.d.ts.map +1 -1
- package/dist/src/sessions/reply-disposition.js +8 -0
- package/dist/src/sessions/reply-disposition.js.map +1 -1
- package/dist/src/sessions/restart-resume.d.ts +234 -0
- package/dist/src/sessions/restart-resume.d.ts.map +1 -0
- package/dist/src/sessions/restart-resume.js +596 -0
- package/dist/src/sessions/restart-resume.js.map +1 -0
- package/dist/src/sessions/speaker-prefix.d.ts.map +1 -1
- package/dist/src/sessions/speaker-prefix.js +3 -1
- package/dist/src/sessions/speaker-prefix.js.map +1 -1
- package/dist/src/sessions/turn-delivery.d.ts +26 -0
- package/dist/src/sessions/turn-delivery.d.ts.map +1 -0
- package/dist/src/sessions/turn-delivery.js +34 -0
- package/dist/src/sessions/turn-delivery.js.map +1 -0
- package/dist/src/sessions/unrequested-stop.d.ts +26 -0
- package/dist/src/sessions/unrequested-stop.d.ts.map +1 -0
- package/dist/src/sessions/unrequested-stop.js +19 -0
- package/dist/src/sessions/unrequested-stop.js.map +1 -0
- package/dist/src/sessions/usage-limit-wait.d.ts +14 -0
- package/dist/src/sessions/usage-limit-wait.d.ts.map +1 -0
- package/dist/src/sessions/usage-limit-wait.js +9 -0
- package/dist/src/sessions/usage-limit-wait.js.map +1 -0
- package/dist/src/shared/attachment-download.d.ts +41 -0
- package/dist/src/shared/attachment-download.d.ts.map +1 -0
- package/dist/src/shared/attachment-download.js +110 -0
- package/dist/src/shared/attachment-download.js.map +1 -0
- package/dist/src/shared/attachment-notice.d.ts +24 -0
- package/dist/src/shared/attachment-notice.d.ts.map +1 -0
- package/dist/src/shared/attachment-notice.js +37 -0
- package/dist/src/shared/attachment-notice.js.map +1 -0
- package/dist/src/shared/attachments.d.ts +65 -0
- package/dist/src/shared/attachments.d.ts.map +1 -0
- package/dist/src/shared/attachments.js +153 -0
- package/dist/src/shared/attachments.js.map +1 -0
- package/dist/src/shared/childEnv.d.ts +15 -0
- package/dist/src/shared/childEnv.d.ts.map +1 -1
- package/dist/src/shared/childEnv.js +15 -0
- package/dist/src/shared/childEnv.js.map +1 -1
- package/dist/src/shared/claude-limit-reset.d.ts +54 -0
- package/dist/src/shared/claude-limit-reset.d.ts.map +1 -0
- package/dist/src/shared/claude-limit-reset.js +99 -0
- package/dist/src/shared/claude-limit-reset.js.map +1 -0
- package/dist/src/shared/config-error.d.ts +21 -0
- package/dist/src/shared/config-error.d.ts.map +1 -0
- package/dist/src/shared/config-error.js +37 -0
- package/dist/src/shared/config-error.js.map +1 -0
- package/dist/src/shared/config-file.d.ts +57 -0
- package/dist/src/shared/config-file.d.ts.map +1 -0
- package/dist/src/shared/config-file.js +217 -0
- package/dist/src/shared/config-file.js.map +1 -0
- package/dist/src/shared/config-yaml-edit.d.ts +20 -0
- package/dist/src/shared/config-yaml-edit.d.ts.map +1 -0
- package/dist/src/shared/config-yaml-edit.js +468 -0
- package/dist/src/shared/config-yaml-edit.js.map +1 -0
- package/dist/src/shared/config.d.ts.map +1 -1
- package/dist/src/shared/config.js +12 -4
- package/dist/src/shared/config.js.map +1 -1
- package/dist/src/shared/engine-fallback.d.ts +22 -0
- package/dist/src/shared/engine-fallback.d.ts.map +1 -1
- package/dist/src/shared/engine-fallback.js +55 -4
- package/dist/src/shared/engine-fallback.js.map +1 -1
- package/dist/src/shared/engine-health.d.ts +16 -0
- package/dist/src/shared/engine-health.d.ts.map +1 -1
- package/dist/src/shared/engine-health.js +42 -0
- package/dist/src/shared/engine-health.js.map +1 -1
- package/dist/src/shared/list-alignment.d.ts +23 -0
- package/dist/src/shared/list-alignment.d.ts.map +1 -0
- package/dist/src/shared/list-alignment.js +61 -0
- package/dist/src/shared/list-alignment.js.map +1 -0
- package/dist/src/shared/logger.d.ts.map +1 -1
- package/dist/src/shared/logger.js +104 -33
- package/dist/src/shared/logger.js.map +1 -1
- package/dist/src/shared/map-limited.d.ts +11 -0
- package/dist/src/shared/map-limited.d.ts.map +1 -0
- package/dist/src/shared/map-limited.js +30 -0
- package/dist/src/shared/map-limited.js.map +1 -0
- package/dist/src/shared/oneShotCli.d.ts.map +1 -1
- package/dist/src/shared/oneShotCli.js +4 -2
- package/dist/src/shared/oneShotCli.js.map +1 -1
- package/dist/src/shared/partial-delivery.d.ts +24 -0
- package/dist/src/shared/partial-delivery.d.ts.map +1 -0
- package/dist/src/shared/partial-delivery.js +46 -0
- package/dist/src/shared/partial-delivery.js.map +1 -0
- package/dist/src/shared/process-safety-net.d.ts +44 -0
- package/dist/src/shared/process-safety-net.d.ts.map +1 -0
- package/dist/src/shared/process-safety-net.js +88 -0
- package/dist/src/shared/process-safety-net.js.map +1 -0
- package/dist/src/shared/rateLimit.d.ts +45 -2
- package/dist/src/shared/rateLimit.d.ts.map +1 -1
- package/dist/src/shared/rateLimit.js +64 -2
- package/dist/src/shared/rateLimit.js.map +1 -1
- package/dist/src/shared/redact.d.ts.map +1 -1
- package/dist/src/shared/redact.js +11 -1
- package/dist/src/shared/redact.js.map +1 -1
- package/dist/src/shared/safe-file-name.d.ts +9 -0
- package/dist/src/shared/safe-file-name.d.ts.map +1 -0
- package/dist/src/shared/safe-file-name.js +16 -0
- package/dist/src/shared/safe-file-name.js.map +1 -0
- package/dist/src/shared/terminal-safe-text.d.ts +2 -0
- package/dist/src/shared/terminal-safe-text.d.ts.map +1 -0
- package/dist/src/shared/terminal-safe-text.js +21 -0
- package/dist/src/shared/terminal-safe-text.js.map +1 -0
- package/dist/src/shared/types.d.ts +69 -4
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/skills-sync/apply.d.ts +21 -0
- package/dist/src/skills-sync/apply.d.ts.map +1 -0
- package/dist/src/skills-sync/apply.js +209 -0
- package/dist/src/skills-sync/apply.js.map +1 -0
- package/dist/src/skills-sync/backup-run.d.ts +47 -0
- package/dist/src/skills-sync/backup-run.d.ts.map +1 -0
- package/dist/src/skills-sync/backup-run.js +150 -0
- package/dist/src/skills-sync/backup-run.js.map +1 -0
- package/dist/src/skills-sync/bounded-read.d.ts +32 -0
- package/dist/src/skills-sync/bounded-read.d.ts.map +1 -0
- package/dist/src/skills-sync/bounded-read.js +104 -0
- package/dist/src/skills-sync/bounded-read.js.map +1 -0
- package/dist/src/skills-sync/bundled.d.ts +28 -0
- package/dist/src/skills-sync/bundled.d.ts.map +1 -0
- package/dist/src/skills-sync/bundled.js +84 -0
- package/dist/src/skills-sync/bundled.js.map +1 -0
- package/dist/src/skills-sync/fingerprint.d.ts +32 -0
- package/dist/src/skills-sync/fingerprint.d.ts.map +1 -0
- package/dist/src/skills-sync/fingerprint.js +58 -0
- package/dist/src/skills-sync/fingerprint.js.map +1 -0
- package/dist/src/skills-sync/history.d.ts +44 -0
- package/dist/src/skills-sync/history.d.ts.map +1 -0
- package/dist/src/skills-sync/history.js +115 -0
- package/dist/src/skills-sync/history.js.map +1 -0
- package/dist/src/skills-sync/home-skill.d.ts +28 -0
- package/dist/src/skills-sync/home-skill.d.ts.map +1 -0
- package/dist/src/skills-sync/home-skill.js +67 -0
- package/dist/src/skills-sync/home-skill.js.map +1 -0
- package/dist/src/skills-sync/instance.d.ts +26 -0
- package/dist/src/skills-sync/instance.d.ts.map +1 -0
- package/dist/src/skills-sync/instance.js +128 -0
- package/dist/src/skills-sync/instance.js.map +1 -0
- package/dist/src/skills-sync/names.d.ts +25 -0
- package/dist/src/skills-sync/names.d.ts.map +1 -0
- package/dist/src/skills-sync/names.js +56 -0
- package/dist/src/skills-sync/names.js.map +1 -0
- package/dist/src/skills-sync/plan.d.ts +58 -0
- package/dist/src/skills-sync/plan.d.ts.map +1 -0
- package/dist/src/skills-sync/plan.js +132 -0
- package/dist/src/skills-sync/plan.js.map +1 -0
- package/dist/src/skills-sync/receipt.d.ts +61 -0
- package/dist/src/skills-sync/receipt.d.ts.map +1 -0
- package/dist/src/skills-sync/receipt.js +149 -0
- package/dist/src/skills-sync/receipt.js.map +1 -0
- package/dist/src/skills-sync/staging.d.ts +21 -0
- package/dist/src/skills-sync/staging.d.ts.map +1 -0
- package/dist/src/skills-sync/staging.js +81 -0
- package/dist/src/skills-sync/staging.js.map +1 -0
- package/dist/src/skills-sync/sync.d.ts +37 -0
- package/dist/src/skills-sync/sync.d.ts.map +1 -0
- package/dist/src/skills-sync/sync.js +201 -0
- package/dist/src/skills-sync/sync.js.map +1 -0
- package/dist/src/skills-sync/types.d.ts +66 -0
- package/dist/src/skills-sync/types.d.ts.map +1 -0
- package/dist/src/skills-sync/types.js +2 -0
- package/dist/src/skills-sync/types.js.map +1 -0
- package/dist/src/stt/config.d.ts +5 -0
- package/dist/src/stt/config.d.ts.map +1 -0
- package/dist/src/stt/config.js +18 -0
- package/dist/src/stt/config.js.map +1 -0
- package/dist/src/updates/maintenance.d.ts.map +1 -1
- package/dist/src/updates/maintenance.js +24 -4
- package/dist/src/updates/maintenance.js.map +1 -1
- package/dist/src/workflows/repository-mutex.d.ts +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/__next.__PAGE__.txt +11 -11
- package/dist/web/__next._full.txt +12 -12
- package/dist/web/__next._tree.txt +2 -2
- package/dist/web/_next/static/chunks/{0g5c5ppr8zmup.js → 20v6mri7epga5.js} +1 -1
- package/dist/web/_next/static/chunks/2u0328ngpt-ek.js +1 -0
- package/dist/web/_next/static/chunks/3f9i3f9q6v6_j.css +1 -0
- package/dist/web/_next/static/chunks/{2iqxlc9wtxzm2.js → 3yy053rafgrzy.js} +1 -1
- package/dist/web/_not-found/__next._full.txt +10 -10
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +9 -9
- package/dist/web/_not-found/__next._tree.txt +2 -2
- package/dist/web/_not-found.html +1 -1
- package/dist/web/_not-found.txt +10 -10
- package/dist/web/chat/__next._full.txt +12 -12
- package/dist/web/chat/__next._tree.txt +2 -2
- package/dist/web/chat/__next.chat.__PAGE__.txt +11 -11
- package/dist/web/chat.html +1 -1
- package/dist/web/chat.txt +12 -12
- package/dist/web/cron/__next._full.txt +12 -12
- package/dist/web/cron/__next._tree.txt +2 -2
- package/dist/web/cron/__next.cron.__PAGE__.txt +11 -11
- package/dist/web/cron.html +1 -1
- package/dist/web/cron.txt +12 -12
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +12 -12
- package/dist/web/kanban/__next._full.txt +12 -12
- package/dist/web/kanban/__next._tree.txt +2 -2
- package/dist/web/kanban/__next.kanban.__PAGE__.txt +11 -11
- package/dist/web/kanban.html +1 -1
- package/dist/web/kanban.txt +12 -12
- package/dist/web/logs/__next._full.txt +12 -12
- package/dist/web/logs/__next._tree.txt +2 -2
- package/dist/web/logs/__next.logs.__PAGE__.txt +11 -11
- package/dist/web/logs.html +1 -1
- package/dist/web/logs.txt +12 -12
- package/dist/web/models/__next._full.txt +12 -12
- package/dist/web/models/__next._tree.txt +2 -2
- package/dist/web/models/__next.models.__PAGE__.txt +11 -11
- package/dist/web/models.html +1 -1
- package/dist/web/models.txt +12 -12
- package/dist/web/org/__next._full.txt +12 -12
- package/dist/web/org/__next._tree.txt +2 -2
- package/dist/web/org/__next.org.__PAGE__.txt +11 -11
- package/dist/web/org.html +1 -1
- package/dist/web/org.txt +12 -12
- package/dist/web/sessions/__next._full.txt +10 -10
- package/dist/web/sessions/__next._tree.txt +2 -2
- package/dist/web/sessions/__next.sessions.__PAGE__.txt +9 -9
- package/dist/web/sessions.html +1 -1
- package/dist/web/sessions.txt +10 -10
- package/dist/web/settings/__next._full.txt +12 -12
- package/dist/web/settings/__next._tree.txt +2 -2
- package/dist/web/settings/__next.settings.__PAGE__.txt +11 -11
- package/dist/web/settings.html +1 -1
- package/dist/web/settings.txt +12 -12
- package/dist/web/skills/__next._full.txt +12 -12
- package/dist/web/skills/__next._tree.txt +2 -2
- package/dist/web/skills/__next.skills.__PAGE__.txt +11 -11
- package/dist/web/skills.html +1 -1
- package/dist/web/skills.txt +12 -12
- package/package.json +2 -1
- package/template/bundled-skill-history.json +377 -0
- package/template/config.default.yaml +48 -3
- package/template/docs/architecture.md +41 -3
- package/template/docs/backup.md +142 -0
- package/template/docs/connectors.md +192 -16
- package/template/docs/cron.md +30 -11
- package/template/docs/memory.md +1 -1
- package/template/docs/overview.md +6 -2
- package/template/docs/self-modification.md +11 -10
- package/template/docs/skills.md +77 -4
- package/template/migrations/0.3.0/MIGRATION.md +6 -0
- package/template/migrations/0.7.3/MIGRATION.md +6 -0
- package/template/migrations/0.7.5/MIGRATION.md +1 -1
- package/template/migrations/0.9.0/MIGRATION.md +6 -0
- package/template/migrations/2026.10.13/MIGRATION.md +76 -0
- package/template/migrations/2026.10.13/files/docs/architecture.md +112 -0
- package/template/migrations/2026.10.13/files/docs/automations.md +110 -0
- package/template/migrations/2026.10.13/files/docs/backup.md +142 -0
- package/template/migrations/2026.10.13/files/docs/connectors.md +370 -0
- package/template/migrations/2026.10.13/files/docs/cron-commands.md +52 -0
- package/template/migrations/2026.10.13/files/docs/cron.md +178 -0
- package/template/migrations/2026.10.13/files/docs/mcp.md +108 -0
- package/template/migrations/2026.10.13/files/docs/memory.md +47 -0
- package/template/migrations/2026.10.13/files/docs/org.md +111 -0
- package/template/migrations/2026.10.13/files/docs/overview.md +44 -0
- package/template/migrations/2026.10.13/files/docs/self-modification.md +71 -0
- package/template/migrations/2026.10.13/files/docs/skills.md +140 -0
- package/template/migrations/2026.10.13/files/skills/cron-manager/SKILL.md +107 -0
- package/template/migrations/2026.10.13/files/skills/management/SKILL.md +227 -0
- package/template/migrations/2026.10.13/files/skills/migrate/SKILL.md +194 -0
- package/template/migrations/2026.10.13/files/skills/onboarding/SKILL.md +153 -0
- package/template/migrations/2026.10.13/files/skills/openryoko-config/SKILL.md +35 -0
- package/template/migrations/2026.10.13/files/skills/openryoko-config/references/engine-fallback.md +98 -0
- package/template/migrations/2026.10.13/files/skills/openryoko-config/references/jev.md +89 -0
- package/template/migrations/2026.10.13/files/skills/openryoko-config/references/maintenance.md +49 -0
- package/template/migrations/2026.10.13/files/skills/openryoko-config/references/platform.md +100 -0
- package/template/migrations/2026.10.13/files/skills/self-heal/SKILL.md +187 -0
- package/template/migrations/2026.10.9/MIGRATION.md +6 -0
- package/template/migrations/2026.10.9/files/docs/memory.md +1 -1
- package/template/migrations/2026.10.9/files/skills/migrate/SKILL.md +39 -5
- package/template/migrations/2026.5.7/MIGRATION.md +6 -0
- package/template/migrations/2026.8.28/MIGRATION.md +6 -0
- package/template/migrations/2026.9.11/MIGRATION.md +6 -0
- package/template/skills/cron-manager/SKILL.md +10 -0
- package/template/skills/management/SKILL.md +5 -4
- package/template/skills/migrate/SKILL.md +39 -5
- package/template/skills/onboarding/SKILL.md +2 -2
- package/template/skills/openryoko-config/SKILL.md +1 -1
- package/template/skills/openryoko-config/references/engine-fallback.md +16 -5
- package/template/skills/openryoko-config/references/platform.md +23 -4
- package/template/skills/self-heal/SKILL.md +117 -44
- package/dist/src/engines/mock.d.ts +0 -16
- package/dist/src/engines/mock.d.ts.map +0 -1
- package/dist/src/engines/mock.js +0 -47
- package/dist/src/engines/mock.js.map +0 -1
- package/dist/src/shared/test-support/posix-mode.d.ts +0 -17
- package/dist/src/shared/test-support/posix-mode.d.ts.map +0 -1
- package/dist/src/shared/test-support/posix-mode.js +0 -23
- package/dist/src/shared/test-support/posix-mode.js.map +0 -1
- package/dist/web/_next/static/chunks/0ic18n-m7ixyw.css +0 -1
- package/dist/web/_next/static/chunks/1_jm0szyu2the.js +0 -1
- /package/dist/web/_next/static/{peH9RGESLkxB7fw3Cq1GO → ov0mWzyHx0B5oEnTHE_pa}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{peH9RGESLkxB7fw3Cq1GO → ov0mWzyHx0B5oEnTHE_pa}/_clientMiddlewareManifest.js +0 -0
- /package/dist/web/_next/static/{peH9RGESLkxB7fw3Cq1GO → ov0mWzyHx0B5oEnTHE_pa}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import { logger } from "../shared/logger.js";
|
|
2
|
+
import { usageLimitOutlastsWait } from "../shared/rateLimit.js";
|
|
3
|
+
import { postSessionNotification } from "./callbacks.js";
|
|
4
|
+
import { hasUndeliveredReply, silentOriginAnswer } from "./origin-delivery.js";
|
|
5
|
+
import { getMessagePage, getSession, initDb, listSessions, updateSession } from "./registry.js";
|
|
6
|
+
import { usageLimitWaitResetsAt } from "./usage-limit-wait.js";
|
|
7
|
+
/** transportMeta key holding a session's {@link RestartResumeState}. */
|
|
8
|
+
export const RESTART_RESUME_META_KEY = "restartResume";
|
|
9
|
+
/**
|
|
10
|
+
* A restart can strand any number of conversations at once. Waking them all in
|
|
11
|
+
* the same tick spawns that many engine processes together — exactly when a
|
|
12
|
+
* rate-limited engine starts refusing — so one boot wakes a capped number,
|
|
13
|
+
* spaced apart. (Both values are upstream's.)
|
|
14
|
+
*/
|
|
15
|
+
export const MAX_RESTART_RESUMES = 10;
|
|
16
|
+
export const RESTART_RESUME_STAGGER_MS = 15_000;
|
|
17
|
+
/** An interruption older than this at boot is left for the operator. */
|
|
18
|
+
export const DEFAULT_RESUME_MAX_AGE_MINUTES = 120;
|
|
19
|
+
/** A session nudged less than this long ago is not nudged again — unless new
|
|
20
|
+
* work reached it since (see underLoopGuard). */
|
|
21
|
+
export const RESTART_NUDGE_COOLDOWN_MS = 30 * 60_000;
|
|
22
|
+
/** …and never more than this many times within the window. */
|
|
23
|
+
export const RESTART_NUDGE_WINDOW_LIMIT = 3;
|
|
24
|
+
export const RESTART_NUDGE_WINDOW_MS = 24 * 60 * 60_000;
|
|
25
|
+
/** A turn that was waiting for a usage limit is nudged this long after the
|
|
26
|
+
* reset it expected — the margin the wait itself left before retrying. */
|
|
27
|
+
export const RESTART_LIMIT_RESET_BUFFER_MS = 10_000;
|
|
28
|
+
/** Opening words of every nudge. Also how a nudge is recognised in the queue. */
|
|
29
|
+
export const RESTART_NUDGE_PREFIX = "[Gateway] Restart complete.";
|
|
30
|
+
function metaObject(meta) {
|
|
31
|
+
return meta && typeof meta === "object" && !Array.isArray(meta) ? { ...meta } : {};
|
|
32
|
+
}
|
|
33
|
+
const isInstant = (value) => typeof value === "string" && Number.isFinite(Date.parse(value));
|
|
34
|
+
export function readRestartResumeState(meta) {
|
|
35
|
+
const raw = metaObject(meta)[RESTART_RESUME_META_KEY];
|
|
36
|
+
const state = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
|
|
37
|
+
const marked = isInstant(state.interruptedAt);
|
|
38
|
+
const wait = state.limitWait && typeof state.limitWait === "object" && !Array.isArray(state.limitWait) ? state.limitWait : undefined;
|
|
39
|
+
return {
|
|
40
|
+
...(marked ? { interruptedAt: state.interruptedAt } : {}),
|
|
41
|
+
...(marked && state.replyRecorded === true ? { replyRecorded: true } : {}),
|
|
42
|
+
...(marked && wait ? { limitWait: isInstant(wait.resetsAt) ? { resetsAt: wait.resetsAt } : {} } : {}),
|
|
43
|
+
nudgedAt: Array.isArray(state.nudgedAt) ? state.nudgedAt.filter(isInstant) : [],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function withRestartResumeState(meta, state) {
|
|
47
|
+
const next = metaObject(meta);
|
|
48
|
+
const stored = {
|
|
49
|
+
...(state.interruptedAt ? { interruptedAt: state.interruptedAt } : {}),
|
|
50
|
+
...(state.interruptedAt && state.replyRecorded ? { replyRecorded: true } : {}),
|
|
51
|
+
...(state.interruptedAt && state.limitWait ? { limitWait: { ...state.limitWait } } : {}),
|
|
52
|
+
...(state.nudgedAt.length > 0 ? { nudgedAt: state.nudgedAt } : {}),
|
|
53
|
+
};
|
|
54
|
+
if (Object.keys(stored).length > 0)
|
|
55
|
+
next[RESTART_RESUME_META_KEY] = stored;
|
|
56
|
+
else
|
|
57
|
+
delete next[RESTART_RESUME_META_KEY];
|
|
58
|
+
return Object.keys(next).length > 0 ? next : null;
|
|
59
|
+
}
|
|
60
|
+
/** The transport meta to persist for a session a restart is cutting off now.
|
|
61
|
+
* A new interruption starts clean: only the nudge history carries over. */
|
|
62
|
+
export function withRestartInterruptedMark(meta, at, mark = {}) {
|
|
63
|
+
return withRestartResumeState(meta, {
|
|
64
|
+
interruptedAt: at,
|
|
65
|
+
...(mark.replyRecorded ? { replyRecorded: true } : {}),
|
|
66
|
+
...(mark.limitWait ? { limitWait: mark.limitWait } : {}),
|
|
67
|
+
nudgedAt: readRestartResumeState(meta).nudgedAt,
|
|
68
|
+
}) ?? {};
|
|
69
|
+
}
|
|
70
|
+
/** Take the pending mark off a session, optionally putting a nudge on record. */
|
|
71
|
+
function clearRestartInterruptedMark(sessionId, nudgedAt) {
|
|
72
|
+
const session = getSession(sessionId);
|
|
73
|
+
if (!session)
|
|
74
|
+
return;
|
|
75
|
+
const state = readRestartResumeState(session.transportMeta);
|
|
76
|
+
if (!state.interruptedAt && !nudgedAt)
|
|
77
|
+
return;
|
|
78
|
+
const history = nudgedAt
|
|
79
|
+
? [...state.nudgedAt, nudgedAt]
|
|
80
|
+
.filter((at) => Date.parse(nudgedAt) - Date.parse(at) < RESTART_NUDGE_WINDOW_MS)
|
|
81
|
+
.slice(-RESTART_NUDGE_WINDOW_LIMIT)
|
|
82
|
+
: state.nudgedAt;
|
|
83
|
+
updateSession(sessionId, { transportMeta: withRestartResumeState(session.transportMeta, { nudgedAt: history }) });
|
|
84
|
+
}
|
|
85
|
+
let shuttingDown = false;
|
|
86
|
+
/**
|
|
87
|
+
* First thing at shutdown, before anything is awaited. From here until the
|
|
88
|
+
* process is gone, an engine that stops was stopped by the shutdown — through
|
|
89
|
+
* kill(), or because a process supervisor signalled the whole control group
|
|
90
|
+
* and Claude's process got the SIGTERM before the gateway reached its own kill.
|
|
91
|
+
*/
|
|
92
|
+
export function beginGatewayShutdown() {
|
|
93
|
+
shuttingDown = true;
|
|
94
|
+
}
|
|
95
|
+
export function isGatewayShuttingDown() {
|
|
96
|
+
return shuttingDown;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A turn the shutdown cut off without going through kill() (see above). It may
|
|
100
|
+
* be over before interruptRunningSessionsForShutdown() looks, and a session
|
|
101
|
+
* that is no longer "running" then is not marked there — so the turn's own
|
|
102
|
+
* runner marks it, and the next boot resumes it like any other.
|
|
103
|
+
*/
|
|
104
|
+
export function markTurnCutOffByShutdown(sessionId, now = Date.now()) {
|
|
105
|
+
const session = getSession(sessionId);
|
|
106
|
+
if (!session || session.workflowProvenance || session.source === "cron")
|
|
107
|
+
return;
|
|
108
|
+
updateSession(sessionId, { transportMeta: withRestartInterruptedMark(session.transportMeta, new Date(now).toISOString()) });
|
|
109
|
+
}
|
|
110
|
+
const newestMessage = (sessionId) => getMessagePage(sessionId, { limit: 1 }).messages.at(-1);
|
|
111
|
+
/**
|
|
112
|
+
* True when a "running" session has already recorded the reply of its current
|
|
113
|
+
* turn. A connector turn records its reply, THEN delivers it, and only then
|
|
114
|
+
* leaves "running", so a restart can land in between. The work is done; what
|
|
115
|
+
* the mark cannot know yet is whether the delivery will come back before the
|
|
116
|
+
* process is gone (see the "answered" rule in skipReason).
|
|
117
|
+
*
|
|
118
|
+
* The newest transcript entry being the assistant's reply is the evidence,
|
|
119
|
+
* with one exception. A notification or web message is recorded when it is
|
|
120
|
+
* accepted, so when it waited behind a running turn, that turn's reply is the
|
|
121
|
+
* newer entry while the queued turn runs. A queue row that started running
|
|
122
|
+
* after the reply says so: the reply belongs to the turn before it.
|
|
123
|
+
*
|
|
124
|
+
* Nor is the record of an interrupted turn a reply (see below): a shutdown
|
|
125
|
+
* can land while the runner that wrote it is still winding down.
|
|
126
|
+
*/
|
|
127
|
+
function replyAlreadyRecorded(session, newest = newestMessage(session.id)) {
|
|
128
|
+
if (newest?.role !== "assistant")
|
|
129
|
+
return false;
|
|
130
|
+
// Not a reply: the connector runner records the engine's "Interrupted: …"
|
|
131
|
+
// text for a turn it settles as interrupted, and never delivers it.
|
|
132
|
+
if (/^Interrupted/i.test(newest.content))
|
|
133
|
+
return false;
|
|
134
|
+
const running = initDb().prepare("SELECT started_at AS startedAt FROM queue_items WHERE session_key = ? AND status = 'running' AND session_id = ? ORDER BY started_at DESC LIMIT 1").get(session.sessionKey, session.id);
|
|
135
|
+
return !(running?.startedAt && Date.parse(running.startedAt) >= newest.timestamp);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Sessions whose turn lives only in this process: mid-turn ("running"), or
|
|
139
|
+
* parked on a usage limit ("waiting") — that wait is a loop in the runner, not
|
|
140
|
+
* something the next process picks up. Left unmarked, a waiting session said
|
|
141
|
+
* "waiting" for good after a restart, with nothing waiting any more.
|
|
142
|
+
*/
|
|
143
|
+
function sessionsWithALiveTurn() {
|
|
144
|
+
return [...listSessions({ status: "running" }), ...listSessions({ status: "waiting" })];
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* What the mark records about the turn a restart is ending: that its reply was
|
|
148
|
+
* already written (see replyAlreadyRecorded), or that it was only waiting for
|
|
149
|
+
* a usage limit — and until when, read from the wait's own note. A wait that
|
|
150
|
+
* was marked once already has lost that note to the mark's lastError, so the
|
|
151
|
+
* reset is carried over from the mark (the dying wait's heartbeat can write
|
|
152
|
+
* "waiting" back over a shutdown's "interrupted").
|
|
153
|
+
*/
|
|
154
|
+
function markDetails(session, newest = newestMessage(session.id)) {
|
|
155
|
+
if (replyAlreadyRecorded(session, newest))
|
|
156
|
+
return { replyRecorded: true };
|
|
157
|
+
if (session.status !== "waiting")
|
|
158
|
+
return {};
|
|
159
|
+
const resetsAt = usageLimitWaitResetsAt(session) ?? readRestartResumeState(session.transportMeta).limitWait?.resetsAt;
|
|
160
|
+
return { limitWait: resetsAt ? { resetsAt } : {} };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Graceful shutdown, right before the engines are killed: every session whose
|
|
164
|
+
* turn lives in this process becomes "interrupted" (its engine session id is
|
|
165
|
+
* kept, so it can be resumed) and gets the mark the next boot reads — which
|
|
166
|
+
* also says whether the turn had already recorded its reply, or was only
|
|
167
|
+
* waiting for a usage limit. Returns how many were interrupted.
|
|
168
|
+
*
|
|
169
|
+
* Workflow attempts are skipped: recoverStaleWorkflowAttemptSessions(), which
|
|
170
|
+
* the caller runs first, stamps their `gateway-restart` receipt — a plain
|
|
171
|
+
* interrupt here would read as an operator stop on the next boot.
|
|
172
|
+
*/
|
|
173
|
+
export function interruptRunningSessionsForShutdown(now = Date.now()) {
|
|
174
|
+
shuttingDown = true;
|
|
175
|
+
const interruptedAt = new Date(now).toISOString();
|
|
176
|
+
let interrupted = 0;
|
|
177
|
+
for (const session of sessionsWithALiveTurn()) {
|
|
178
|
+
if (session.workflowProvenance?.kind === "phase")
|
|
179
|
+
continue;
|
|
180
|
+
updateSession(session.id, {
|
|
181
|
+
status: "interrupted",
|
|
182
|
+
lastActivity: interruptedAt,
|
|
183
|
+
lastError: session.status === "waiting"
|
|
184
|
+
? "Interrupted: gateway shut down while session was waiting for a usage limit"
|
|
185
|
+
: "Interrupted: gateway shutting down gracefully",
|
|
186
|
+
// The killed turn's completion overwrites the status; the mark is what the next boot reads.
|
|
187
|
+
transportMeta: withRestartInterruptedMark(session.transportMeta, interruptedAt, markDetails(session)),
|
|
188
|
+
});
|
|
189
|
+
logger.info(`Marked session ${session.id} as interrupted for resume`);
|
|
190
|
+
interrupted++;
|
|
191
|
+
}
|
|
192
|
+
return interrupted;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Boot step, BEFORE recoverStaleSessions() and recoverStaleQueueItems() — both
|
|
196
|
+
* erase what this reads.
|
|
197
|
+
*
|
|
198
|
+
* - A session still "running" — or still "waiting" for a usage limit — was
|
|
199
|
+
* never shut down cleanly (crash, SIGKILL, a shutdown that ran out of time).
|
|
200
|
+
* Its last sign of life — the heartbeat or the newest transcript entry,
|
|
201
|
+
* whichever is later — is the best estimate of when it was cut off.
|
|
202
|
+
* - A nudge turn that was itself in flight is cancelled instead of going back
|
|
203
|
+
* to pending: replaying it is how a turn that restarts the gateway would
|
|
204
|
+
* loop. The session is interrupted again and falls under the cooldown.
|
|
205
|
+
*/
|
|
206
|
+
export function prepareRestartResume(now = Date.now()) {
|
|
207
|
+
shuttingDown = false; // a process that is booting is not the one that was shutting down
|
|
208
|
+
const database = initDb();
|
|
209
|
+
return database.transaction(() => {
|
|
210
|
+
const cancelledNudges = database.prepare("UPDATE queue_items SET status = 'cancelled' WHERE status = 'running' AND substr(prompt, 1, ?) = ?").run(RESTART_NUDGE_PREFIX.length, RESTART_NUDGE_PREFIX).changes;
|
|
211
|
+
let marked = 0;
|
|
212
|
+
for (const session of sessionsWithALiveTurn()) {
|
|
213
|
+
// Workflow attempts have their own restart recovery; a cron run has no conversation to answer in.
|
|
214
|
+
if (session.workflowProvenance || session.source === "cron")
|
|
215
|
+
continue;
|
|
216
|
+
const newest = newestMessage(session.id);
|
|
217
|
+
const heartbeat = Date.parse(session.lastActivity);
|
|
218
|
+
const lastAlive = Math.max(Number.isFinite(heartbeat) ? heartbeat : 0, newest?.timestamp ?? 0);
|
|
219
|
+
const at = new Date(lastAlive > 0 ? Math.min(lastAlive, now) : now).toISOString();
|
|
220
|
+
updateSession(session.id, { transportMeta: withRestartInterruptedMark(session.transportMeta, at, markDetails(session, newest)) });
|
|
221
|
+
marked++;
|
|
222
|
+
}
|
|
223
|
+
return { marked, cancelledNudges };
|
|
224
|
+
}).immediate();
|
|
225
|
+
}
|
|
226
|
+
function listMarkedSessions() {
|
|
227
|
+
const rows = initDb().prepare("SELECT id FROM sessions WHERE transport_meta LIKE ?")
|
|
228
|
+
.all(`%"${RESTART_RESUME_META_KEY}"%`);
|
|
229
|
+
return rows
|
|
230
|
+
.map(({ id }) => getSession(id))
|
|
231
|
+
.filter((session) => !!session && !!readRestartResumeState(session.transportMeta).interruptedAt);
|
|
232
|
+
}
|
|
233
|
+
/** The user has said something in this session since `sinceMs`. */
|
|
234
|
+
function hasUserMessageAfter(sessionId, sinceMs) {
|
|
235
|
+
return !!initDb().prepare("SELECT 1 FROM messages WHERE session_id = ? AND role = 'user' AND timestamp > ? LIMIT 1").get(sessionId, sinceMs);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* A user message recorded since `sinceMs` that an assistant reply does
|
|
239
|
+
* (`answered`) or does not follow. Recording a message is the first thing a
|
|
240
|
+
* turn does, so a message with nothing behind it was only received: a process
|
|
241
|
+
* that is shutting down still starts the next queued turn, records its
|
|
242
|
+
* message, and can exit before the session is even "running" again.
|
|
243
|
+
*/
|
|
244
|
+
function hasUserMessageSince(sessionId, sinceMs, answered) {
|
|
245
|
+
return !!initDb().prepare(`
|
|
246
|
+
SELECT 1 FROM messages u
|
|
247
|
+
WHERE u.session_id = ? AND u.role = 'user' AND u.timestamp > ?
|
|
248
|
+
AND ${answered ? "" : "NOT "}EXISTS (
|
|
249
|
+
SELECT 1 FROM messages a
|
|
250
|
+
WHERE a.session_id = u.session_id AND a.role = 'assistant'
|
|
251
|
+
AND (a.timestamp > u.timestamp OR (a.timestamp = u.timestamp AND a.rowid > u.rowid))
|
|
252
|
+
)
|
|
253
|
+
LIMIT 1
|
|
254
|
+
`).get(sessionId, sinceMs);
|
|
255
|
+
}
|
|
256
|
+
/** New work reached the session after `sinceIso`: something the user said, or
|
|
257
|
+
* a turn queued for it (a web message, a child completion, a job wake-up).
|
|
258
|
+
* A restart nudge's own queue row is not new work. */
|
|
259
|
+
function hasNewInputSince(session, sinceIso) {
|
|
260
|
+
if (hasUserMessageAfter(session.id, Date.parse(sinceIso)))
|
|
261
|
+
return true;
|
|
262
|
+
return !!initDb().prepare("SELECT 1 FROM queue_items WHERE session_key = ? AND session_id = ? AND created_at > ? AND substr(prompt, 1, ?) <> ? LIMIT 1").get(session.sessionKey, session.id, sinceIso, RESTART_NUDGE_PREFIX.length, RESTART_NUDGE_PREFIX);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* The restart-loop guard. The daily cap is absolute. The cooldown is not: it
|
|
266
|
+
* exists for the nudge turn itself being cut off again — the signature of a
|
|
267
|
+
* turn that restarts the gateway. When new work reached the session after its
|
|
268
|
+
* last nudge, the turn that was cut off is a different one, and withholding
|
|
269
|
+
* its nudge would strand that work (child completions whose queue row the
|
|
270
|
+
* dying process closed have no other way back).
|
|
271
|
+
*/
|
|
272
|
+
function underLoopGuard(session, nudgedAt, now) {
|
|
273
|
+
const recent = nudgedAt.filter((at) => now - Date.parse(at) < RESTART_NUDGE_WINDOW_MS);
|
|
274
|
+
if (recent.length >= RESTART_NUDGE_WINDOW_LIMIT)
|
|
275
|
+
return true;
|
|
276
|
+
const last = recent.reduce((latest, at) => (!latest || Date.parse(at) > Date.parse(latest) ? at : latest), undefined);
|
|
277
|
+
if (!last || now - Date.parse(last) >= RESTART_NUDGE_COOLDOWN_MS)
|
|
278
|
+
return false;
|
|
279
|
+
return !hasNewInputSince(session, last);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* For a turn that had recorded its reply when the restart cut it off: is that
|
|
283
|
+
* reply still not known to have arrived?
|
|
284
|
+
*
|
|
285
|
+
* The turn's completion writes a final status only after the delivery has
|
|
286
|
+
* returned, so the interruption's own status still standing means the process
|
|
287
|
+
* was gone first. And a delivery that did return may have returned a failure —
|
|
288
|
+
* during a shutdown, typically because the connector had already been stopped —
|
|
289
|
+
* which the completion catches, records, and settles as an ordinary "idle".
|
|
290
|
+
*/
|
|
291
|
+
function replyDeliveryOpen(session) {
|
|
292
|
+
return session.status === "interrupted" || hasUndeliveredReply(session);
|
|
293
|
+
}
|
|
294
|
+
function isActive(session, isBusy) {
|
|
295
|
+
return session.status === "running" || session.status === "waiting" || isBusy?.(session) === true;
|
|
296
|
+
}
|
|
297
|
+
function skipReason(session, input) {
|
|
298
|
+
const state = readRestartResumeState(session.transportMeta);
|
|
299
|
+
const interruptedAt = Date.parse(state.interruptedAt ?? "");
|
|
300
|
+
if (session.workflowProvenance)
|
|
301
|
+
return "workflow"; // recoverStaleWorkflowAttemptSessions owns these
|
|
302
|
+
if (session.source === "cron")
|
|
303
|
+
return "cron"; // its connector lived for one run — nowhere to deliver
|
|
304
|
+
if (isActive(session, input.isBusy))
|
|
305
|
+
return "active"; // the queue replay, or a new message, is already driving it
|
|
306
|
+
// A mark can outlive its restart (the nudge could not be posted). Once the user has asked again
|
|
307
|
+
// and been answered, it is history. A later message that was merely recorded proves nothing.
|
|
308
|
+
if (hasUserMessageSince(session.id, interruptedAt, true))
|
|
309
|
+
return "moved-on";
|
|
310
|
+
// The turn had recorded its reply, and that reply went out. A later message nobody answered still needs a turn.
|
|
311
|
+
if (state.replyRecorded && !replyDeliveryOpen(session) && !hasUserMessageSince(session.id, interruptedAt, false))
|
|
312
|
+
return "answered";
|
|
313
|
+
// NaN unless the turn was waiting for a usage limit and its wait knew the reset.
|
|
314
|
+
const limitResetsAt = Date.parse(state.limitWait?.resetsAt ?? "");
|
|
315
|
+
// No turn is kept waiting for a reset that far off (a wait an older version started): nor is its nudge.
|
|
316
|
+
if (usageLimitOutlastsWait(limitResetsAt / 1000, input.now))
|
|
317
|
+
return "limit-too-far";
|
|
318
|
+
// A wait counts from the reset it was waiting for: until then nothing could have been done about it.
|
|
319
|
+
const since = Number.isFinite(limitResetsAt) ? Math.max(interruptedAt, limitResetsAt) : interruptedAt;
|
|
320
|
+
if (input.now - since > input.maxAgeMs)
|
|
321
|
+
return "too-old";
|
|
322
|
+
if (underLoopGuard(session, state.nudgedAt, input.now))
|
|
323
|
+
return "recently-nudged";
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Boot step, AFTER the queue replay: decide who gets a nudge. Everyone who
|
|
328
|
+
* does not has the mark taken off here, so it cannot resurface on a later
|
|
329
|
+
* restart the session had nothing to do with. A candidate keeps its mark until
|
|
330
|
+
* its nudge is accepted — a restart inside the stagger window loses nothing.
|
|
331
|
+
*/
|
|
332
|
+
export function selectRestartResumeCandidates(input) {
|
|
333
|
+
return initDb().transaction(() => {
|
|
334
|
+
const selection = { candidates: [], skipped: [] };
|
|
335
|
+
for (const session of listMarkedSessions()) {
|
|
336
|
+
const reason = skipReason(session, input);
|
|
337
|
+
if (!reason) {
|
|
338
|
+
selection.candidates.push(session);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
clearRestartInterruptedMark(session.id);
|
|
342
|
+
selection.skipped.push({ sessionId: session.id, reason });
|
|
343
|
+
}
|
|
344
|
+
return selection;
|
|
345
|
+
}).immediate();
|
|
346
|
+
}
|
|
347
|
+
function activityMillis(session) {
|
|
348
|
+
const parsed = Date.parse(session.lastActivity);
|
|
349
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* The earliest a session's nudge may go out. A turn that was waiting for a
|
|
353
|
+
* usage limit is not woken while that limit is known to be on: the engine
|
|
354
|
+
* would only refuse it again, and every restart during the limit would wake it
|
|
355
|
+
* to fail. It is woken a moment after the reset it was waiting for — which is
|
|
356
|
+
* when it was going to carry on anyway.
|
|
357
|
+
*/
|
|
358
|
+
function notBefore(session, now) {
|
|
359
|
+
const resetsAt = Date.parse(readRestartResumeState(session.transportMeta).limitWait?.resetsAt ?? "");
|
|
360
|
+
return Number.isFinite(resetsAt) ? Math.max(now, resetsAt + RESTART_LIMIT_RESET_BUFFER_MS) : now;
|
|
361
|
+
}
|
|
362
|
+
/** Order the interrupted sessions, most recent conversation first, and spread
|
|
363
|
+
* their wake-ups over the stagger window. */
|
|
364
|
+
export function planRestartResumes(input) {
|
|
365
|
+
const ordered = [...input.candidates].sort((a, b) => {
|
|
366
|
+
const activity = activityMillis(b) - activityMillis(a);
|
|
367
|
+
return activity !== 0 ? activity : a.id.localeCompare(b.id);
|
|
368
|
+
});
|
|
369
|
+
return {
|
|
370
|
+
resumes: ordered.slice(0, MAX_RESTART_RESUMES).map((session, index) => {
|
|
371
|
+
const start = notBefore(session, input.now);
|
|
372
|
+
return {
|
|
373
|
+
sessionId: session.id,
|
|
374
|
+
dueAt: start + index * RESTART_RESUME_STAGGER_MS,
|
|
375
|
+
...(start > input.now ? { heldForLimit: true } : {}),
|
|
376
|
+
};
|
|
377
|
+
}),
|
|
378
|
+
deferred: ordered.slice(MAX_RESTART_RESUMES).map((session) => session.id),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
const OWN_RESTART = "If you restarted or updated the gateway yourself (for example `ryoko update --restart`), that restart is this one and it is done. Do NOT trigger it again";
|
|
382
|
+
const transcriptOf = (session) => `GET /api/sessions/${session.id}?last=10`;
|
|
383
|
+
/**
|
|
384
|
+
* Close a "nothing is left to post" step with how to end the turn that way.
|
|
385
|
+
* The answer to a nudge is posted to the conversation the session came from,
|
|
386
|
+
* so "it had arrived" would be one more post in it. Where an answer that posts
|
|
387
|
+
* nothing exists, the session is handed it — on a line of its own, because it
|
|
388
|
+
* has to be reproduced exactly.
|
|
389
|
+
*/
|
|
390
|
+
function withEndingWithoutAPost(step, session) {
|
|
391
|
+
const silent = silentOriginAnswer(session);
|
|
392
|
+
if (!silent)
|
|
393
|
+
return [`${step} Whatever you answer is shown in this conversation, so keep it to one short line saying that nothing was left to send.`];
|
|
394
|
+
return [
|
|
395
|
+
`${step} Your answer to this message is posted to the conversation, and a line saying that it had arrived would be one more post there. To post nothing, end your answer with the line below — exactly as written, on a line of its own, outside any code block. Nothing of an answer that ends with it is posted (what you write above it stays in this session), so use it in that case only:`,
|
|
396
|
+
silent,
|
|
397
|
+
];
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* The turn was cut off mid-flight: its work has to be picked back up. So does
|
|
401
|
+
* the request of a turn that was parked waiting for a usage limit — the user
|
|
402
|
+
* was told it would carry on by itself, and the wait went with the process.
|
|
403
|
+
*/
|
|
404
|
+
function cutOffMessage(session, interruptedAt, unseenUserMessage, limitWait) {
|
|
405
|
+
const transcript = transcriptOf(session);
|
|
406
|
+
const alreadyDelivered = "5. Only if you find that your answer to that request had already been delivered and nothing is left to do: do not post it a second time.";
|
|
407
|
+
return [
|
|
408
|
+
limitWait
|
|
409
|
+
? `${RESTART_NUDGE_PREFIX} Your previous turn in this conversation was waiting for a usage limit to reset when the gateway restarted at ${interruptedAt}. The wait did not survive the restart, so the request it was for is still unanswered — not something the user did, and not a mistake in your work.`
|
|
410
|
+
: `${RESTART_NUDGE_PREFIX} Your previous turn in this conversation was cut off by a gateway restart at ${interruptedAt} — not by the user, and not by a mistake in your work.`,
|
|
411
|
+
"",
|
|
412
|
+
"Pick the request back up and finish it:",
|
|
413
|
+
"1. First re-check anything that was in flight (a command, a tool call, a delegated child, a detached job). Look at its actual state before you assume it finished or run it again.",
|
|
414
|
+
`2. ${OWN_RESTART} — confirm the result and report it.`,
|
|
415
|
+
unseenUserMessage
|
|
416
|
+
? `3. The user wrote again while the gateway was restarting, and that message never reached you. Read this session's latest messages before acting — ${transcript} — and deal with it in the same answer.`
|
|
417
|
+
: `3. Read this session's latest messages before acting: ${transcript}. They show the request if you have no memory of the interrupted turn, and whether the user wrote again while the gateway was restarting — a user message with no reply after it is still waiting for an answer, whether or not it ever reached you.`,
|
|
418
|
+
"4. Then answer in the original conversation as usual; it is still waiting on you.",
|
|
419
|
+
// A message known to be waiting has to be answered: ending without a post is not on offer.
|
|
420
|
+
...(unseenUserMessage ? [alreadyDelivered] : withEndingWithoutAPost(alreadyDelivered, session)),
|
|
421
|
+
].join("\n");
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* The turn had finished and recorded its reply; the reply is not known to have
|
|
425
|
+
* arrived. This says what the note of a failed delivery says
|
|
426
|
+
* (recordFailedOriginDelivery): none of the reply arrived, or only the
|
|
427
|
+
* beginning — look first, send what is missing, repeat nothing. When that note
|
|
428
|
+
* is in the transcript, the two must not pull in different directions.
|
|
429
|
+
*/
|
|
430
|
+
function openDeliveryMessage(session, interruptedAt, unseenUserMessage) {
|
|
431
|
+
const allThere = "4. If all of it is there, do not post it a second time.";
|
|
432
|
+
return [
|
|
433
|
+
`${RESTART_NUDGE_PREFIX} The gateway restarted at ${interruptedAt}, just as your last reply in this conversation was being delivered — not something the user did, and not a mistake in your work. That reply is saved in this session, but the conversation may have seen none of it, or only the beginning.`,
|
|
434
|
+
"",
|
|
435
|
+
unseenUserMessage
|
|
436
|
+
? "Your turn had finished, so there is no work to redo. What is open is the delivery, and a newer message:"
|
|
437
|
+
: "Your turn had finished, so there is no work to redo. Only the delivery is open:",
|
|
438
|
+
`1. Check the conversation itself (the thread or channel) for how much of that reply arrived. The reply as you wrote it is in this session: ${transcriptOf(session)}`,
|
|
439
|
+
"2. Send what is missing: your answer to this message is posted to the conversation. Do not repost a part that is already there.",
|
|
440
|
+
"3. If you cannot read the conversation, send the whole reply again, unchanged.",
|
|
441
|
+
...(unseenUserMessage
|
|
442
|
+
? [
|
|
443
|
+
allThere,
|
|
444
|
+
"5. The user also wrote again while the gateway was restarting, and that message never reached you. It is in the same transcript, with no reply after it — answer it in the same answer.",
|
|
445
|
+
`6. ${OWN_RESTART}.`,
|
|
446
|
+
]
|
|
447
|
+
: [...withEndingWithoutAPost(allThere, session), `5. ${OWN_RESTART}.`]),
|
|
448
|
+
].join("\n");
|
|
449
|
+
}
|
|
450
|
+
/** The turn had finished and its reply went out. All the restart left open is
|
|
451
|
+
* a message that arrived afterwards and never reached the engine. */
|
|
452
|
+
function newerMessageOnlyMessage(session, interruptedAt) {
|
|
453
|
+
return [
|
|
454
|
+
`${RESTART_NUDGE_PREFIX} The gateway restarted at ${interruptedAt} — not something the user did, and not a mistake in your work. Your last reply in this conversation had already been delivered: no turn of yours was cut off, and there is no work to redo.`,
|
|
455
|
+
"",
|
|
456
|
+
"What is still open is a newer message. The user wrote again while the gateway was restarting, and that message never reached you:",
|
|
457
|
+
`1. Read this session's latest messages: ${transcriptOf(session)}. The user message with no reply after it is the one that is waiting.`,
|
|
458
|
+
"2. Answer it in the original conversation as usual. Do not send your earlier reply again.",
|
|
459
|
+
`3. ${OWN_RESTART}.`,
|
|
460
|
+
].join("\n");
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* The wake-up itself. The session must know the break was the gateway's doing,
|
|
464
|
+
* re-check whatever was mid-flight instead of assuming it ran or running it
|
|
465
|
+
* again, and — if it caused the restart — not cause another. The interruption
|
|
466
|
+
* time makes the text unique per interruption: the notification route treats
|
|
467
|
+
* an identical persisted notification as a duplicate.
|
|
468
|
+
*
|
|
469
|
+
* It always sends the session to its transcript first. A message that waited
|
|
470
|
+
* in the queue is recorded when the dying process starts its turn, and may
|
|
471
|
+
* never reach the engine; when that turn got as far as "running", the boot
|
|
472
|
+
* stamps the session afresh and the unseen message cannot be told apart any
|
|
473
|
+
* more. The transcript shows it either way.
|
|
474
|
+
*
|
|
475
|
+
* A turn that had already recorded its reply gets a different message, because
|
|
476
|
+
* telling it that it was cut off mid-flight sends it after work that was never
|
|
477
|
+
* interrupted: there is nothing to pick back up — only a reply that may not
|
|
478
|
+
* have arrived, or, once that reply is known to have gone out, a newer message
|
|
479
|
+
* that nobody answered.
|
|
480
|
+
*/
|
|
481
|
+
export function restartResumeMessage(session, interruptedAt, situation = {}) {
|
|
482
|
+
const unseenUserMessage = situation.unseenUserMessage === true;
|
|
483
|
+
if (situation.reply === "delivered")
|
|
484
|
+
return newerMessageOnlyMessage(session, interruptedAt);
|
|
485
|
+
if (situation.reply === "undelivered")
|
|
486
|
+
return openDeliveryMessage(session, interruptedAt, unseenUserMessage);
|
|
487
|
+
return cutOffMessage(session, interruptedAt, unseenUserMessage, situation.limitWait === true);
|
|
488
|
+
}
|
|
489
|
+
function busyProbe(deps) {
|
|
490
|
+
const queue = deps.queue;
|
|
491
|
+
return (session) => !!queue && (queue.isRunning(session.sessionKey) || queue.getPendingCount(session.sessionKey) > 0);
|
|
492
|
+
}
|
|
493
|
+
function nudgeSituation(session, interruptedAt) {
|
|
494
|
+
const state = readRestartResumeState(session.transportMeta);
|
|
495
|
+
return {
|
|
496
|
+
unseenUserMessage: hasUserMessageSince(session.id, Date.parse(interruptedAt), false),
|
|
497
|
+
...(state.replyRecorded ? { reply: replyDeliveryOpen(session) ? "undelivered" : "delivered" } : {}),
|
|
498
|
+
...(state.limitWait ? { limitWait: true } : {}),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
/** Wake one session, unless something else got to it first. `shuttingDown`
|
|
502
|
+
* turns true once the boot step's nudges have been cancelled. */
|
|
503
|
+
async function sendRestartNudge(sessionId, plannedAt, deps, shuttingDown) {
|
|
504
|
+
const session = getSession(sessionId);
|
|
505
|
+
const interruptedAt = session ? readRestartResumeState(session.transportMeta).interruptedAt : undefined;
|
|
506
|
+
if (!session || !interruptedAt)
|
|
507
|
+
return; // deleted, or already handled
|
|
508
|
+
if (isActive(session, busyProbe(deps)) || Date.parse(session.lastActivity) > plannedAt) {
|
|
509
|
+
clearRestartInterruptedMark(sessionId);
|
|
510
|
+
logger.info(`[restart-resume] Session ${sessionId} is active again — no nudge needed`);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
try {
|
|
514
|
+
await (deps.post ?? postSessionNotification)(deps.port, sessionId, {
|
|
515
|
+
message: restartResumeMessage(session, interruptedAt, nudgeSituation(session, interruptedAt)),
|
|
516
|
+
dedupeKey: `restart-resume:${sessionId}:${interruptedAt}`,
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
// The mark stays: the next boot retries while the interruption is still recent.
|
|
521
|
+
logger.warn(`[restart-resume] Failed to nudge session ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
// Posted into a gateway that has since begun shutting down: the turn it
|
|
525
|
+
// started dies with the rest. Not on record, so the next boot may try again.
|
|
526
|
+
if (shuttingDown())
|
|
527
|
+
return;
|
|
528
|
+
clearRestartInterruptedMark(sessionId, new Date(deps.now?.() ?? Date.now()).toISOString());
|
|
529
|
+
logger.info(`Nudged interrupted session ${sessionId} (${session.connector ?? session.source}${session.employee ? `, ${session.employee}` : ""}) to continue after the restart`);
|
|
530
|
+
}
|
|
531
|
+
function scheduleTimer(run, delayMs) {
|
|
532
|
+
const timer = setTimeout(() => {
|
|
533
|
+
run().catch((err) => logger.warn(`[restart-resume] nudge failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
534
|
+
}, delayMs);
|
|
535
|
+
timer.unref?.();
|
|
536
|
+
return () => clearTimeout(timer);
|
|
537
|
+
}
|
|
538
|
+
function maxAgeMs(config) {
|
|
539
|
+
const minutes = config.sessions?.resumeInterruptedMaxAgeMinutes;
|
|
540
|
+
return (typeof minutes === "number" && Number.isFinite(minutes) && minutes > 0 ? minutes : DEFAULT_RESUME_MAX_AGE_MINUTES) * 60_000;
|
|
541
|
+
}
|
|
542
|
+
function describeSkipped(skipped) {
|
|
543
|
+
const counts = new Map();
|
|
544
|
+
for (const { reason } of skipped)
|
|
545
|
+
counts.set(reason, (counts.get(reason) ?? 0) + 1);
|
|
546
|
+
return [...counts].map(([reason, count]) => `${count} ${reason}`).join(", ");
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Boot step: tell every session this restart interrupted to carry on. Runs
|
|
550
|
+
* after the pending queue replay, so a session already back on the engine
|
|
551
|
+
* through its own queue row is skipped rather than resumed twice.
|
|
552
|
+
*
|
|
553
|
+
* The nudges go out over the stagger window, so the gateway can be shutting
|
|
554
|
+
* down again before the last one is due. A nudge accepted then starts a turn
|
|
555
|
+
* that is killed at once, yet stays on record as sent — the returned `cancel`
|
|
556
|
+
* stops the ones still waiting.
|
|
557
|
+
*/
|
|
558
|
+
export function resumeRestartInterruptedSessions(deps) {
|
|
559
|
+
const now = deps.now?.() ?? Date.now();
|
|
560
|
+
if (deps.config.sessions?.resumeInterruptedOnBoot === false) {
|
|
561
|
+
const left = listMarkedSessions();
|
|
562
|
+
for (const session of left)
|
|
563
|
+
clearRestartInterruptedMark(session.id);
|
|
564
|
+
if (left.length > 0) {
|
|
565
|
+
logger.info(`Restart resume is off (sessions.resumeInterruptedOnBoot: false) — left ${left.length} interrupted session(s) for the operator`);
|
|
566
|
+
}
|
|
567
|
+
return { planned: 0, heldForLimit: 0, deferred: 0, skipped: left.length, disabled: true, cancel: () => { } };
|
|
568
|
+
}
|
|
569
|
+
const selection = selectRestartResumeCandidates({ now, maxAgeMs: maxAgeMs(deps.config), isBusy: busyProbe(deps) });
|
|
570
|
+
const plan = planRestartResumes({ candidates: selection.candidates, now });
|
|
571
|
+
for (const sessionId of plan.deferred)
|
|
572
|
+
clearRestartInterruptedMark(sessionId);
|
|
573
|
+
const schedule = deps.schedule ?? scheduleTimer;
|
|
574
|
+
let cancelled = false;
|
|
575
|
+
const unschedule = [];
|
|
576
|
+
for (const resume of plan.resumes) {
|
|
577
|
+
const nudge = () => (cancelled ? Promise.resolve() : sendRestartNudge(resume.sessionId, now, deps, () => cancelled));
|
|
578
|
+
const undo = schedule(nudge, Math.max(0, resume.dueAt - now));
|
|
579
|
+
if (undo)
|
|
580
|
+
unschedule.push(undo);
|
|
581
|
+
}
|
|
582
|
+
const cancel = () => {
|
|
583
|
+
cancelled = true;
|
|
584
|
+
for (const undo of unschedule.splice(0))
|
|
585
|
+
undo();
|
|
586
|
+
};
|
|
587
|
+
const heldForLimit = plan.resumes.filter((resume) => resume.heldForLimit).length;
|
|
588
|
+
if (plan.resumes.length + plan.deferred.length + selection.skipped.length > 0) {
|
|
589
|
+
logger.info(`Restart resume: nudging ${plan.resumes.length} interrupted session(s)` +
|
|
590
|
+
(heldForLimit > 0 ? ` (${heldForLimit} of them once the usage limit they were waiting for has reset)` : "") +
|
|
591
|
+
(plan.deferred.length > 0 ? `, ${plan.deferred.length} over the cap of ${MAX_RESTART_RESUMES} left alone` : "") +
|
|
592
|
+
(selection.skipped.length > 0 ? `, skipped ${describeSkipped(selection.skipped)}` : ""));
|
|
593
|
+
}
|
|
594
|
+
return { planned: plan.resumes.length, heldForLimit, deferred: plan.deferred.length, skipped: selection.skipped.length, cancel };
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=restart-resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-resume.js","sourceRoot":"","sources":["../../../src/sessions/restart-resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"speaker-prefix.d.ts","sourceRoot":"","sources":["../../../src/sessions/speaker-prefix.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,GACtE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"speaker-prefix.d.ts","sourceRoot":"","sources":["../../../src/sessions/speaker-prefix.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,GACtE,MAAM,GAAG,IAAI,CAiCf"}
|