openryoko 2026.10.8 → 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 +20 -0
- package/dist/src/cli/migrate.d.ts.map +1 -1
- package/dist/src/cli/migrate.js +365 -68
- 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 +19 -3
- package/dist/src/engines/claude-interactive.d.ts.map +1 -1
- package/dist/src/engines/claude-interactive.js +42 -17
- 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 +38 -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 +184 -160
- 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/onboarding-personalize.d.ts +2 -0
- package/dist/src/gateway/onboarding-personalize.d.ts.map +1 -1
- package/dist/src/gateway/onboarding-personalize.js +17 -1
- package/dist/src/gateway/onboarding-personalize.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 +82 -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.d.ts.map +1 -1
- package/dist/src/sessions/context.js +3 -4
- package/dist/src/sessions/context.js.map +1 -1
- 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 +3 -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-auto-memory.d.ts +33 -0
- package/dist/src/shared/claude-auto-memory.d.ts.map +1 -0
- package/dist/src/shared/claude-auto-memory.js +156 -0
- package/dist/src/shared/claude-auto-memory.js.map +1 -0
- 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 +75 -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/{08i7uo3uz6_fn.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/AGENTS.md +48 -308
- package/template/CLAUDE.md +4 -349
- package/template/bundled-skill-history.json +377 -0
- package/template/config.default.yaml +52 -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 +47 -0
- 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 +44 -0
- package/template/migrations/2026.10.9/files/docs/memory.md +47 -0
- package/template/migrations/2026.10.9/files/skills/migrate/SKILL.md +194 -0
- 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 +47 -14
- package/template/skills/onboarding/SKILL.md +3 -3
- 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/Oux0UBcCkbX5eOp9-vC4k/_buildManifest.js +0 -11
- package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_clientMiddlewareManifest.js +0 -1
- package/dist/web/_next/static/Oux0UBcCkbX5eOp9-vC4k/_ssgManifest.js +0 -1
- package/dist/web/_next/static/chunks/02h65sho8c14h.js +0 -1
- package/dist/web/_next/static/chunks/0ic18n-m7ixyw.css +0 -1
- package/dist/web/_next/static/chunks/19s8vn2kgy7q1.js +0 -1
- package/dist/web/_next/static/chunks/1_jm0szyu2the.js +0 -1
- package/dist/web/_next/static/chunks/1omdg4m5w9lgx.js +0 -1
- package/dist/web/_next/static/chunks/25nob1new8t4s.js +0 -79
- package/dist/web/_next/static/chunks/2iqxlc9wtxzm2.js +0 -1
- package/dist/web/_next/static/chunks/3_6klkygi417n.js +0 -1
- package/dist/web/_next/static/chunks/3alc-b00c58_3.css +0 -1
- /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_clientMiddlewareManifest.js +0 -0
- /package/dist/web/_next/static/{70PNIyOj8-2kywAG6J41- → ov0mWzyHx0B5oEnTHE_pa}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/backup/settings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAI1C,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,EAAE,aAA2F,CAAC;AAEjI,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,iBAAiB,CAAC,GAAG,aAAa,CAE7G;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAoCD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAqB5G"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const DEFAULT_ARCHIVE_RETENTION = 14;
|
|
4
|
+
/**
|
|
5
|
+
* A home's own files are small; one that has grown past this is carrying bulk
|
|
6
|
+
* (a dump in knowledge/, assets vendored into a skill) that fourteen daily
|
|
7
|
+
* copies would turn into gigabytes. Past the cap the archive is refused and
|
|
8
|
+
* reported rather than silently filling the disk it shares with the instance.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_MAX_ARCHIVE_MB = 512;
|
|
11
|
+
/**
|
|
12
|
+
* Files, directories and symlinks in one archive. An ordinary home holds a few
|
|
13
|
+
* thousand; this leaves it an order of magnitude to grow into, and still bounds
|
|
14
|
+
* what the gateway holds in memory while it archives one. Empty files and
|
|
15
|
+
* directories weigh nothing, so the size cap above never sees them.
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_MAX_ENTRIES = 50_000;
|
|
18
|
+
const MIB = 1024 * 1024;
|
|
19
|
+
/** The limits an archive is held to when nobody says otherwise. */
|
|
20
|
+
export const DEFAULT_ARCHIVE_LIMITS = { maxEntries: DEFAULT_MAX_ENTRIES, maxBytes: DEFAULT_MAX_ARCHIVE_MB * MIB };
|
|
21
|
+
/** The pair of limits every archive this instance writes or reads is held to. */
|
|
22
|
+
export function archiveLimits(settings) {
|
|
23
|
+
return { maxEntries: settings.maxEntries, maxBytes: settings.maxArchiveBytes };
|
|
24
|
+
}
|
|
25
|
+
export function defaultBackupDirectory(home) {
|
|
26
|
+
return path.join(home, "backups");
|
|
27
|
+
}
|
|
28
|
+
function expandTilde(value) {
|
|
29
|
+
if (value === "~")
|
|
30
|
+
return os.homedir();
|
|
31
|
+
return value.startsWith("~/") || value.startsWith(`~${path.sep}`) ? path.join(os.homedir(), value.slice(2)) : value;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The directory the config names, or null with a reason when it cannot be used.
|
|
35
|
+
* The home and its parents are refused: retention deletes by file name there,
|
|
36
|
+
* and a directory that contains the home is not a place to keep its backups.
|
|
37
|
+
*/
|
|
38
|
+
function resolveDirectory(value, home) {
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
return { directory: null };
|
|
41
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
42
|
+
return { directory: null, warning: "backup.directory must be a path; using the default" };
|
|
43
|
+
}
|
|
44
|
+
const resolvedHome = path.resolve(home);
|
|
45
|
+
const directory = path.resolve(resolvedHome, expandTilde(value.trim()));
|
|
46
|
+
const relative = path.relative(directory, resolvedHome);
|
|
47
|
+
const outside = relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative);
|
|
48
|
+
const containsHome = relative === "" || !outside;
|
|
49
|
+
if (containsHome) {
|
|
50
|
+
return { directory: null, warning: `backup.directory must not be the instance home or a directory above it (${directory}); using the default` };
|
|
51
|
+
}
|
|
52
|
+
return { directory };
|
|
53
|
+
}
|
|
54
|
+
function positive(value, fallback, label, integer, warnings) {
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
return fallback;
|
|
57
|
+
const valid = typeof value === "number" && Number.isFinite(value) && value > 0 && (!integer || Number.isInteger(value));
|
|
58
|
+
if (valid)
|
|
59
|
+
return value;
|
|
60
|
+
warnings.push(`${label} must be a positive ${integer ? "whole number" : "number"}; using ${fallback}`);
|
|
61
|
+
return fallback;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Turns the optional `backup` section into concrete settings.
|
|
65
|
+
*
|
|
66
|
+
* Never throws. An instance arrives here with whatever its config.yaml already
|
|
67
|
+
* says, and a value this cannot use falls back to the default with a warning
|
|
68
|
+
* instead of stopping the gateway from booting.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveBackupSettings(config, home) {
|
|
71
|
+
const section = typeof config === "object" && config !== null && !Array.isArray(config) ? config : {};
|
|
72
|
+
const warnings = [];
|
|
73
|
+
if (section.enabled !== undefined && typeof section.enabled !== "boolean") {
|
|
74
|
+
warnings.push("backup.enabled must be true or false; backups stay on");
|
|
75
|
+
}
|
|
76
|
+
const { directory, warning } = resolveDirectory(section.directory, home);
|
|
77
|
+
if (warning)
|
|
78
|
+
warnings.push(warning);
|
|
79
|
+
const fallbackDirectory = defaultBackupDirectory(path.resolve(home));
|
|
80
|
+
const resolvedDirectory = directory ?? fallbackDirectory;
|
|
81
|
+
return {
|
|
82
|
+
enabled: section.enabled !== false,
|
|
83
|
+
directory: resolvedDirectory,
|
|
84
|
+
defaultDirectory: resolvedDirectory === fallbackDirectory,
|
|
85
|
+
retention: positive(section.retention, DEFAULT_ARCHIVE_RETENTION, "backup.retention", true, warnings),
|
|
86
|
+
maxArchiveBytes: positive(section.maxArchiveMb, DEFAULT_MAX_ARCHIVE_MB, "backup.maxArchiveMb", false, warnings) * MIB,
|
|
87
|
+
maxEntries: positive(section.maxEntries, DEFAULT_MAX_ENTRIES, "backup.maxEntries", true, warnings),
|
|
88
|
+
warnings,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/backup/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type DiskSpaceStatus } from "../shared/storage-health.js";
|
|
2
|
+
/** How much is free where something is about to be written. The gateway's own probe, replaceable in tests. */
|
|
3
|
+
export type DiskSpaceProbe = (directory: string) => DiskSpaceStatus;
|
|
4
|
+
/**
|
|
5
|
+
* Why `bytes` more cannot be written under `directory`, or null when they fit.
|
|
6
|
+
*
|
|
7
|
+
* They fit when the disk would not be critically low once they are there - the
|
|
8
|
+
* same judgement the gateway makes before every write to its own database, put
|
|
9
|
+
* to the space that will be left rather than the space there is. Asking only
|
|
10
|
+
* "is it low now" lets a 400 MB copy start with 300 MiB free: it passes, runs
|
|
11
|
+
* out partway, and for as long as it runs the gateway refuses to create a
|
|
12
|
+
* session or store a message.
|
|
13
|
+
*
|
|
14
|
+
* `alreadyWritten` is what this same run has put there since the probe last
|
|
15
|
+
* looked. The probe caches for half a minute, so its answer does not know yet.
|
|
16
|
+
*/
|
|
17
|
+
export declare function insufficientSpace(directory: string, bytes: number, probe?: DiskSpaceProbe, alreadyWritten?: number): string | null;
|
|
18
|
+
/** The bytes a file occupies, or 0 when it is not there. */
|
|
19
|
+
export declare function fileBytes(file: string): number;
|
|
20
|
+
/** True when two paths are on the same filesystem, as far as can be told. Unknown counts as the same: the cautious answer. */
|
|
21
|
+
export declare function sameFilesystem(a: string, b: string): boolean;
|
|
22
|
+
//# sourceMappingURL=space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../../src/backup/space.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG1G,8GAA8G;AAC9G,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,eAAe,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,cAAmC,EAC1C,cAAc,SAAI,GACjB,MAAM,GAAG,IAAI,CASf;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,8HAA8H;AAC9H,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAM5D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { evaluateDiskSpace, getDiskSpaceStatus } from "../shared/storage-health.js";
|
|
3
|
+
import { formatBytes } from "./format.js";
|
|
4
|
+
/**
|
|
5
|
+
* Why `bytes` more cannot be written under `directory`, or null when they fit.
|
|
6
|
+
*
|
|
7
|
+
* They fit when the disk would not be critically low once they are there - the
|
|
8
|
+
* same judgement the gateway makes before every write to its own database, put
|
|
9
|
+
* to the space that will be left rather than the space there is. Asking only
|
|
10
|
+
* "is it low now" lets a 400 MB copy start with 300 MiB free: it passes, runs
|
|
11
|
+
* out partway, and for as long as it runs the gateway refuses to create a
|
|
12
|
+
* session or store a message.
|
|
13
|
+
*
|
|
14
|
+
* `alreadyWritten` is what this same run has put there since the probe last
|
|
15
|
+
* looked. The probe caches for half a minute, so its answer does not know yet.
|
|
16
|
+
*/
|
|
17
|
+
export function insufficientSpace(directory, bytes, probe = getDiskSpaceStatus, alreadyWritten = 0) {
|
|
18
|
+
const disk = probe(directory);
|
|
19
|
+
// Unknown free space has never stopped a write here, and should not start to.
|
|
20
|
+
if (disk.freeBytes === null || disk.totalBytes === null)
|
|
21
|
+
return null;
|
|
22
|
+
const free = Math.max(0, disk.freeBytes - alreadyWritten);
|
|
23
|
+
const left = Math.max(0, free - bytes);
|
|
24
|
+
if (evaluateDiskSpace({ bsize: 1, blocks: disk.totalBytes, bavail: left }).level !== "critical")
|
|
25
|
+
return null;
|
|
26
|
+
return `not enough free disk space: this needs about ${formatBytes(bytes)} and ${formatBytes(free)} is free in ${directory}, `
|
|
27
|
+
+ "which would leave the disk too low for the gateway to keep writing";
|
|
28
|
+
}
|
|
29
|
+
/** The bytes a file occupies, or 0 when it is not there. */
|
|
30
|
+
export function fileBytes(file) {
|
|
31
|
+
try {
|
|
32
|
+
return fs.statSync(file).size;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** True when two paths are on the same filesystem, as far as can be told. Unknown counts as the same: the cautious answer. */
|
|
39
|
+
export function sameFilesystem(a, b) {
|
|
40
|
+
try {
|
|
41
|
+
return fs.statSync(a).dev === fs.statSync(b).dev;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.js","sourceRoot":"","sources":["../../../src/backup/space.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAwB,MAAM,6BAA6B,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,KAAa,EACb,QAAwB,kBAAkB,EAC1C,cAAc,GAAG,CAAC;IAElB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;IACvC,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7G,OAAO,gDAAgD,WAAW,CAAC,KAAK,CAAC,QAAQ,WAAW,CAAC,IAAI,CAAC,eAAe,SAAS,IAAI;UAC1H,oEAAoE,CAAC;AAC3E,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,8HAA8H;AAC9H,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type BackupRunReport, type BackupTargetName } from "./run.js";
|
|
2
|
+
/** A target is due once its last success is this old. */
|
|
3
|
+
export declare const BACKUP_INTERVAL_MS: number;
|
|
4
|
+
/**
|
|
5
|
+
* A target that failed is tried again after this long, rather than on every
|
|
6
|
+
* check. That is for a failure that may have passed: a full disk, a database
|
|
7
|
+
* that could not be read. One that trying again cannot change waits a whole
|
|
8
|
+
* BACKUP_INTERVAL_MS, the next daily run, like a success would.
|
|
9
|
+
*/
|
|
10
|
+
export declare const RETRY_AFTER_FAILURE_MS: number;
|
|
11
|
+
export declare const BACKUP_STATE_FILE = "backup-state.json";
|
|
12
|
+
export interface TargetState {
|
|
13
|
+
lastAttemptAt?: string;
|
|
14
|
+
lastSuccessAt?: string;
|
|
15
|
+
/** Present while the latest attempt is a failure. */
|
|
16
|
+
lastError?: string;
|
|
17
|
+
/** Beside `lastError`, when that failure is one trying again cannot change. */
|
|
18
|
+
lastErrorPersistent?: true;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* When each target last ran, kept beside the backups. It is what lets "daily"
|
|
22
|
+
* survive a restart, and what lets a `ryoko backup run` from the CLI count
|
|
23
|
+
* towards the gateway's schedule.
|
|
24
|
+
*/
|
|
25
|
+
export interface BackupState {
|
|
26
|
+
version: 1;
|
|
27
|
+
targets: Partial<Record<BackupTargetName, TargetState>>;
|
|
28
|
+
}
|
|
29
|
+
/** Reads the state file. Anything unreadable or unexpected counts as no history, never as an error. */
|
|
30
|
+
export declare function readBackupState(directory: string): BackupState;
|
|
31
|
+
export declare function writeBackupState(directory: string, state: BackupState): void;
|
|
32
|
+
/**
|
|
33
|
+
* Folds a run into the state. Success is dated from the moment the run started,
|
|
34
|
+
* so the next one falls due a day after that and the schedule does not creep
|
|
35
|
+
* later by however long each backup takes.
|
|
36
|
+
*
|
|
37
|
+
* A withheld database is left out altogether. It was neither copied nor tried,
|
|
38
|
+
* and recording it like the skip it resembles would tell the gateway that its
|
|
39
|
+
* registry was backed up a moment ago by a command that never opened it.
|
|
40
|
+
*/
|
|
41
|
+
export declare function applyRunReport(state: BackupState, report: BackupRunReport): BackupState;
|
|
42
|
+
/** Per target, whichever side attempted most recently. */
|
|
43
|
+
export declare function mergeStates(a: BackupState, b: BackupState): BackupState;
|
|
44
|
+
/** The targets whose last success is a day old or never happened, minus the ones still waiting out a failure. */
|
|
45
|
+
export declare function dueTargets(state: BackupState, now: Date): BackupTargetName[];
|
|
46
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/backup/state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvF,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,QAAsB,CAAC;AACtD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AACrD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;CACzD;AAeD,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAe9D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAW5E;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAevF;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CASvE;AAUD,iHAAiH;AACjH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,GAAG,gBAAgB,EAAE,CAU5E"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { BACKUP_TARGETS } from "./run.js";
|
|
5
|
+
/** A target is due once its last success is this old. */
|
|
6
|
+
export const BACKUP_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
/**
|
|
8
|
+
* A target that failed is tried again after this long, rather than on every
|
|
9
|
+
* check. That is for a failure that may have passed: a full disk, a database
|
|
10
|
+
* that could not be read. One that trying again cannot change waits a whole
|
|
11
|
+
* BACKUP_INTERVAL_MS, the next daily run, like a success would.
|
|
12
|
+
*/
|
|
13
|
+
export const RETRY_AFTER_FAILURE_MS = 60 * 60 * 1000;
|
|
14
|
+
export const BACKUP_STATE_FILE = "backup-state.json";
|
|
15
|
+
const emptyState = () => ({ version: 1, targets: {} });
|
|
16
|
+
function parseTarget(value) {
|
|
17
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
18
|
+
return null;
|
|
19
|
+
const raw = value;
|
|
20
|
+
const target = {};
|
|
21
|
+
for (const key of ["lastAttemptAt", "lastSuccessAt", "lastError"]) {
|
|
22
|
+
if (typeof raw[key] === "string")
|
|
23
|
+
target[key] = raw[key];
|
|
24
|
+
}
|
|
25
|
+
if (target.lastError !== undefined && raw.lastErrorPersistent === true)
|
|
26
|
+
target.lastErrorPersistent = true;
|
|
27
|
+
return target;
|
|
28
|
+
}
|
|
29
|
+
/** Reads the state file. Anything unreadable or unexpected counts as no history, never as an error. */
|
|
30
|
+
export function readBackupState(directory) {
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = JSON.parse(fs.readFileSync(path.join(directory, BACKUP_STATE_FILE), "utf8"));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return emptyState();
|
|
37
|
+
}
|
|
38
|
+
const raw = parsed;
|
|
39
|
+
if (!raw || raw.version !== 1 || typeof raw.targets !== "object" || raw.targets === null || Array.isArray(raw.targets))
|
|
40
|
+
return emptyState();
|
|
41
|
+
const targets = {};
|
|
42
|
+
for (const name of BACKUP_TARGETS) {
|
|
43
|
+
const target = parseTarget(raw.targets[name]);
|
|
44
|
+
if (target)
|
|
45
|
+
targets[name] = target;
|
|
46
|
+
}
|
|
47
|
+
return { version: 1, targets };
|
|
48
|
+
}
|
|
49
|
+
export function writeBackupState(directory, state) {
|
|
50
|
+
const file = path.join(directory, BACKUP_STATE_FILE);
|
|
51
|
+
const temporary = `${file}.${process.pid}.${crypto.randomBytes(4).toString("hex")}.tmp`;
|
|
52
|
+
try {
|
|
53
|
+
// Created exclusively: something already sitting under this name is not written through.
|
|
54
|
+
fs.writeFileSync(temporary, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600, flag: "wx" });
|
|
55
|
+
fs.renameSync(temporary, file);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
fs.rmSync(temporary, { force: true });
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* When a target that did not fail was last really backed up.
|
|
64
|
+
*
|
|
65
|
+
* Normally that is this run. But a run that finds today's database copy already
|
|
66
|
+
* there has made nothing: the last success is the copy it found. Dating it
|
|
67
|
+
* from the run instead let a `ryoko backup run` late in the day push the next
|
|
68
|
+
* copy a full day past it - up to two days after the last one that was made.
|
|
69
|
+
* The record moves up to the existing copy if that is newer than what was
|
|
70
|
+
* known, and never past it.
|
|
71
|
+
*/
|
|
72
|
+
function lastSuccess(target, previous, startedAt) {
|
|
73
|
+
if (target.status !== "skipped" || !target.copiedAt)
|
|
74
|
+
return startedAt;
|
|
75
|
+
return previous?.lastSuccessAt && previous.lastSuccessAt > target.copiedAt ? previous.lastSuccessAt : target.copiedAt;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Folds a run into the state. Success is dated from the moment the run started,
|
|
79
|
+
* so the next one falls due a day after that and the schedule does not creep
|
|
80
|
+
* later by however long each backup takes.
|
|
81
|
+
*
|
|
82
|
+
* A withheld database is left out altogether. It was neither copied nor tried,
|
|
83
|
+
* and recording it like the skip it resembles would tell the gateway that its
|
|
84
|
+
* registry was backed up a moment ago by a command that never opened it.
|
|
85
|
+
*/
|
|
86
|
+
export function applyRunReport(state, report) {
|
|
87
|
+
const targets = { ...state.targets };
|
|
88
|
+
for (const target of report.targets) {
|
|
89
|
+
if (target.status === "withheld")
|
|
90
|
+
continue;
|
|
91
|
+
const previous = state.targets[target.name];
|
|
92
|
+
targets[target.name] = target.status === "failed"
|
|
93
|
+
? {
|
|
94
|
+
lastAttemptAt: report.startedAt,
|
|
95
|
+
...(previous?.lastSuccessAt ? { lastSuccessAt: previous.lastSuccessAt } : {}),
|
|
96
|
+
lastError: target.error ?? "failed",
|
|
97
|
+
...(target.persistent ? { lastErrorPersistent: true } : {}),
|
|
98
|
+
}
|
|
99
|
+
: { lastAttemptAt: report.startedAt, lastSuccessAt: lastSuccess(target, previous, report.startedAt) };
|
|
100
|
+
}
|
|
101
|
+
return { version: 1, targets };
|
|
102
|
+
}
|
|
103
|
+
/** Per target, whichever side attempted most recently. */
|
|
104
|
+
export function mergeStates(a, b) {
|
|
105
|
+
const targets = {};
|
|
106
|
+
for (const name of BACKUP_TARGETS) {
|
|
107
|
+
const left = a.targets[name];
|
|
108
|
+
const right = b.targets[name];
|
|
109
|
+
const chosen = !left ? right : !right ? left : (right.lastAttemptAt ?? "") > (left.lastAttemptAt ?? "") ? right : left;
|
|
110
|
+
if (chosen)
|
|
111
|
+
targets[name] = chosen;
|
|
112
|
+
}
|
|
113
|
+
return { version: 1, targets };
|
|
114
|
+
}
|
|
115
|
+
/** Milliseconds since `timestamp`, or null when it is missing, unreadable or still in the future. */
|
|
116
|
+
function elapsedSince(timestamp, now) {
|
|
117
|
+
if (!timestamp)
|
|
118
|
+
return null;
|
|
119
|
+
const elapsed = now.getTime() - Date.parse(timestamp);
|
|
120
|
+
// A time ahead of the clock says the clock moved, not that a backup is recent.
|
|
121
|
+
return Number.isFinite(elapsed) && elapsed >= 0 ? elapsed : null;
|
|
122
|
+
}
|
|
123
|
+
/** The targets whose last success is a day old or never happened, minus the ones still waiting out a failure. */
|
|
124
|
+
export function dueTargets(state, now) {
|
|
125
|
+
return BACKUP_TARGETS.filter((name) => {
|
|
126
|
+
const target = state.targets[name] ?? {};
|
|
127
|
+
const sinceSuccess = elapsedSince(target.lastSuccessAt, now);
|
|
128
|
+
if (sinceSuccess !== null && sinceSuccess < BACKUP_INTERVAL_MS)
|
|
129
|
+
return false;
|
|
130
|
+
if (target.lastError === undefined)
|
|
131
|
+
return true;
|
|
132
|
+
const sinceAttempt = elapsedSince(target.lastAttemptAt, now);
|
|
133
|
+
const wait = target.lastErrorPersistent ? BACKUP_INTERVAL_MS : RETRY_AFTER_FAILURE_MS;
|
|
134
|
+
return sinceAttempt === null || sinceAttempt >= wait;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/backup/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The subset of tar a home archive needs, read and written in-process.
|
|
3
|
+
*
|
|
4
|
+
* No external `tar` is spawned: the gateway runs in containers with a read-only
|
|
5
|
+
* root and whatever userland the image happens to ship, and a restore has to
|
|
6
|
+
* inspect every entry before a single byte is written - which a child process
|
|
7
|
+
* extracting on its own does not allow. The format stays plain ustar with pax
|
|
8
|
+
* records for long or non-ASCII names, so any system tar can still open an
|
|
9
|
+
* archive by hand.
|
|
10
|
+
*
|
|
11
|
+
* Only files, directories and symlinks exist here. Hard links, devices and the
|
|
12
|
+
* GNU extensions are refused on read rather than interpreted.
|
|
13
|
+
*/
|
|
14
|
+
export declare const TAR_BLOCK_BYTES = 512;
|
|
15
|
+
/** Two zero blocks close an archive. */
|
|
16
|
+
export declare const TAR_TRAILER: Buffer<ArrayBuffer>;
|
|
17
|
+
/**
|
|
18
|
+
* How much may follow the end-of-archive marker. Tar writers round an archive
|
|
19
|
+
* up to their record size with zeroes - ten kilobytes by default - and that is
|
|
20
|
+
* all that belongs there.
|
|
21
|
+
*/
|
|
22
|
+
export declare const MAX_TRAILING_PADDING_BYTES: number;
|
|
23
|
+
export type TarEntryType = "file" | "directory" | "symlink";
|
|
24
|
+
export interface TarEntry {
|
|
25
|
+
/** Slash-separated, relative, with no trailing slash. */
|
|
26
|
+
path: string;
|
|
27
|
+
type: TarEntryType;
|
|
28
|
+
mode: number;
|
|
29
|
+
/** Bytes of data that follow the header. Always 0 unless `type` is "file". */
|
|
30
|
+
size: number;
|
|
31
|
+
mtimeSeconds: number;
|
|
32
|
+
linkTarget?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Receives one entry's data. `end` runs once the last byte has been written. */
|
|
35
|
+
export interface TarEntrySink {
|
|
36
|
+
write(chunk: Buffer): void | Promise<void>;
|
|
37
|
+
end(): void | Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export interface TarHeaderFields {
|
|
40
|
+
name: string;
|
|
41
|
+
mode: number;
|
|
42
|
+
size: number;
|
|
43
|
+
mtimeSeconds: number;
|
|
44
|
+
typeflag: string;
|
|
45
|
+
linkname?: string;
|
|
46
|
+
}
|
|
47
|
+
/** One raw 512-byte ustar header. Exposed so tests can build entries the writer never would. */
|
|
48
|
+
export declare function encodeTarHeaderBlock(fields: TarHeaderFields): Buffer;
|
|
49
|
+
/** Zero bytes that bring `size` bytes of data up to the next block boundary. */
|
|
50
|
+
export declare function tarPadding(size: number): Buffer;
|
|
51
|
+
/** The header block(s) for one entry: a pax header first when ustar cannot hold it. */
|
|
52
|
+
export declare function encodeTarEntry(entry: TarEntry): Buffer;
|
|
53
|
+
/**
|
|
54
|
+
* Walks a tar stream entry by entry.
|
|
55
|
+
*
|
|
56
|
+
* `onEntry` decides what happens to each entry's data: return a sink to receive
|
|
57
|
+
* it, or nothing to have it skipped. A sound archive is read to its end - the
|
|
58
|
+
* caller's decompressor only verifies its checksum once it is drained - and
|
|
59
|
+
* anything other than padding after the end-of-archive marker is refused. So
|
|
60
|
+
* is padding that goes on: zeroes compress to nothing, and a stream of them
|
|
61
|
+
* after the marker would otherwise be read for as long as it lasted.
|
|
62
|
+
*/
|
|
63
|
+
export declare function readTar(source: AsyncIterable<Uint8Array>, onEntry: (entry: TarEntry) => TarEntrySink | undefined | void | Promise<TarEntrySink | undefined | void>): Promise<void>;
|
|
64
|
+
//# sourceMappingURL=tar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../../src/backup/tar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,wCAAwC;AACxC,eAAO,MAAM,WAAW,qBAAoC,CAAC;AAC7D;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAY,CAAC;AAcpD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAeD,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiBpE;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAuBD,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAwBtD;AAqHD;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EACjC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,YAAY,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC,GACvG,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|