aicodeman 1.43.0 → 1.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/cli-agent.d.ts +3 -3
- package/dist/cli-agent.d.ts.map +1 -1
- package/dist/cli-agent.js +8 -6
- package/dist/cli-agent.js.map +1 -1
- package/dist/config/cli-registry/stock.d.ts.map +1 -1
- package/dist/config/cli-registry/stock.js +8 -3
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +2 -2
- package/dist/config/map-limits.d.ts +13 -1
- package/dist/config/map-limits.d.ts.map +1 -1
- package/dist/config/map-limits.js +28 -1
- package/dist/config/map-limits.js.map +1 -1
- package/dist/config-backup.d.ts +279 -0
- package/dist/config-backup.d.ts.map +1 -0
- package/dist/config-backup.js +794 -0
- package/dist/config-backup.js.map +1 -0
- package/dist/cron/cron-service.d.ts +5 -5
- package/dist/cron/cron-service.js +6 -6
- package/dist/cron/cron-service.js.map +1 -1
- package/dist/custom-model-hosts.d.ts +16 -0
- package/dist/custom-model-hosts.d.ts.map +1 -1
- package/dist/custom-model-hosts.js.map +1 -1
- package/dist/hooks-config.d.ts +15 -0
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +35 -0
- package/dist/hooks-config.js.map +1 -1
- package/dist/intent-store.d.ts +2 -0
- package/dist/intent-store.d.ts.map +1 -1
- package/dist/intent-store.js +9 -0
- package/dist/intent-store.js.map +1 -1
- package/dist/mux-interface.d.ts +21 -4
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/prompt-cache-keepwarm.d.ts +193 -0
- package/dist/prompt-cache-keepwarm.d.ts.map +1 -0
- package/dist/prompt-cache-keepwarm.js +359 -0
- package/dist/prompt-cache-keepwarm.js.map +1 -0
- package/dist/respawn-controller.d.ts.map +1 -1
- package/dist/respawn-controller.js +6 -5
- package/dist/respawn-controller.js.map +1 -1
- package/dist/session-auto-ops.d.ts.map +1 -1
- package/dist/session-auto-ops.js +6 -1
- package/dist/session-auto-ops.js.map +1 -1
- package/dist/session-cli-registry-bridge.d.ts +13 -0
- package/dist/session-cli-registry-bridge.d.ts.map +1 -1
- package/dist/session-cli-registry-bridge.js +20 -3
- package/dist/session-cli-registry-bridge.js.map +1 -1
- package/dist/session-submit-verifier.d.ts +19 -0
- package/dist/session-submit-verifier.d.ts.map +1 -1
- package/dist/session-submit-verifier.js +88 -0
- package/dist/session-submit-verifier.js.map +1 -1
- package/dist/session.d.ts +61 -5
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +112 -7
- package/dist/session.js.map +1 -1
- package/dist/state-store.d.ts +10 -0
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +35 -0
- package/dist/state-store.js.map +1 -1
- package/dist/tab-layout-service.d.ts +33 -0
- package/dist/tab-layout-service.d.ts.map +1 -1
- package/dist/tab-layout-service.js +75 -3
- package/dist/tab-layout-service.js.map +1 -1
- package/dist/tmux-manager.d.ts +50 -8
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +146 -30
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-prefix-table.d.ts +54 -0
- package/dist/tmux-prefix-table.d.ts.map +1 -0
- package/dist/tmux-prefix-table.js +137 -0
- package/dist/tmux-prefix-table.js.map +1 -0
- package/dist/tui/tui-app.d.ts +9 -1
- package/dist/tui/tui-app.d.ts.map +1 -1
- package/dist/tui/tui-app.js +21 -8
- package/dist/tui/tui-app.js.map +1 -1
- package/dist/tui/tui-client.d.ts +3 -2
- package/dist/tui/tui-client.d.ts.map +1 -1
- package/dist/tui/tui-client.js +3 -2
- package/dist/tui/tui-client.js.map +1 -1
- package/dist/types/app-state.d.ts +6 -0
- package/dist/types/app-state.d.ts.map +1 -1
- package/dist/types/app-state.js.map +1 -1
- package/dist/types/session.d.ts +40 -1
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/usage-telemetry.d.ts +15 -0
- package/dist/usage-telemetry.d.ts.map +1 -1
- package/dist/usage-telemetry.js +45 -2
- package/dist/usage-telemetry.js.map +1 -1
- package/dist/utils/copilot-plan-usage.d.ts +46 -0
- package/dist/utils/copilot-plan-usage.d.ts.map +1 -0
- package/dist/utils/copilot-plan-usage.js +95 -0
- package/dist/utils/copilot-plan-usage.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/single-line.d.ts +22 -0
- package/dist/utils/single-line.d.ts.map +1 -0
- package/dist/utils/single-line.js +30 -0
- package/dist/utils/single-line.js.map +1 -0
- package/dist/web/approval-inbox.d.ts +6 -0
- package/dist/web/approval-inbox.d.ts.map +1 -1
- package/dist/web/approval-inbox.js +2 -2
- package/dist/web/approval-inbox.js.map +1 -1
- package/dist/web/plan-usage-latest.d.ts +2 -1
- package/dist/web/plan-usage-latest.d.ts.map +1 -1
- package/dist/web/plan-usage-latest.js +12 -2
- package/dist/web/plan-usage-latest.js.map +1 -1
- package/dist/web/ports/index.d.ts +1 -0
- package/dist/web/ports/index.d.ts.map +1 -1
- package/dist/web/ports/keep-warm-port.d.ts +9 -0
- package/dist/web/ports/keep-warm-port.d.ts.map +1 -0
- package/dist/web/ports/keep-warm-port.js +6 -0
- package/dist/web/ports/keep-warm-port.js.map +1 -0
- package/dist/web/ports/session-port.d.ts +3 -1
- package/dist/web/ports/session-port.d.ts.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.9314ee60.js +43 -0
- package/dist/web/public/app.9314ee60.js.br +0 -0
- package/dist/web/public/app.9314ee60.js.gz +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.e5e588db.js → constants.4866ecc3.js} +49 -1
- package/dist/web/public/constants.4866ecc3.js.br +0 -0
- package/dist/web/public/constants.4866ecc3.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/host-wake-ui.js.gz +0 -0
- package/dist/web/public/i18n.22ca902b.js +2 -0
- package/dist/web/public/i18n.22ca902b.js.br +0 -0
- package/dist/web/public/i18n.22ca902b.js.gz +0 -0
- package/dist/web/public/image-input.941386e7.js.gz +0 -0
- package/dist/web/public/index.html +99 -14
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
- package/dist/web/public/{keyboard-accessory.c283e827.js → keyboard-accessory.4e8b20ac.js} +23 -5
- package/dist/web/public/keyboard-accessory.4e8b20ac.js.br +0 -0
- package/dist/web/public/keyboard-accessory.4e8b20ac.js.gz +0 -0
- package/dist/web/public/{mobile-handlers.0ef9c311.js → mobile-handlers.44adaa07.js} +48 -16
- package/dist/web/public/mobile-handlers.44adaa07.js.br +0 -0
- package/dist/web/public/mobile-handlers.44adaa07.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.12fb18de.css +1 -0
- package/dist/web/public/mobile.12fb18de.css.br +0 -0
- package/dist/web/public/mobile.12fb18de.css.gz +0 -0
- package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.b7bfb9da.js → panels-ui.cbb24ba1.js} +65 -65
- package/dist/web/public/panels-ui.cbb24ba1.js.br +0 -0
- package/dist/web/public/panels-ui.cbb24ba1.js.gz +0 -0
- package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
- package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/reboot-restore-ui.js.gz +0 -0
- package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/{session-ui.be076c88.js → session-ui.9c1f009b.js} +7 -3
- package/dist/web/public/session-ui.9c1f009b.js.br +0 -0
- package/dist/web/public/session-ui.9c1f009b.js.gz +0 -0
- package/dist/web/public/settings-ui.fea9ddae.js +106 -0
- package/dist/web/public/settings-ui.fea9ddae.js.br +0 -0
- package/dist/web/public/settings-ui.fea9ddae.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.e096fcd6.css +1 -0
- package/dist/web/public/styles.e096fcd6.css.br +0 -0
- package/dist/web/public/styles.e096fcd6.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +2 -2
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
- package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js +41 -22
- package/dist/web/public/terminal-tile.js.br +0 -0
- package/dist/web/public/terminal-tile.js.gz +0 -0
- package/dist/web/public/terminal-ui.68dbd352.js +2 -0
- package/dist/web/public/terminal-ui.68dbd352.js.br +0 -0
- package/dist/web/public/terminal-ui.68dbd352.js.gz +0 -0
- package/dist/web/public/tile-grid.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
- package/dist/web/public/vendor/fflate.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/public/whats-new.json +9 -9
- package/dist/web/routes/admin-routes.d.ts +2 -1
- package/dist/web/routes/admin-routes.d.ts.map +1 -1
- package/dist/web/routes/admin-routes.js +3 -0
- package/dist/web/routes/admin-routes.js.map +1 -1
- package/dist/web/routes/case-routes.d.ts +2 -2
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +81 -3
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/config-backup-routes.d.ts +54 -0
- package/dist/web/routes/config-backup-routes.d.ts.map +1 -0
- package/dist/web/routes/config-backup-routes.js +268 -0
- package/dist/web/routes/config-backup-routes.js.map +1 -0
- package/dist/web/routes/custom-model-routes.d.ts +17 -1
- package/dist/web/routes/custom-model-routes.d.ts.map +1 -1
- package/dist/web/routes/custom-model-routes.js +118 -13
- package/dist/web/routes/custom-model-routes.js.map +1 -1
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
- package/dist/web/routes/hook-event-routes.js +26 -5
- package/dist/web/routes/hook-event-routes.js.map +1 -1
- package/dist/web/routes/index.d.ts +1 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +1 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/ralph-routes.js +2 -2
- package/dist/web/routes/ralph-routes.js.map +1 -1
- package/dist/web/routes/reboot-restore-routes.d.ts.map +1 -1
- package/dist/web/routes/reboot-restore-routes.js +2 -0
- package/dist/web/routes/reboot-restore-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +2 -2
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +86 -15
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/status-telemetry-routes.d.ts +2 -2
- package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
- package/dist/web/routes/status-telemetry-routes.js +8 -4
- package/dist/web/routes/status-telemetry-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts +2 -2
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +7 -0
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/routes/webview-routes.d.ts.map +1 -1
- package/dist/web/routes/webview-routes.js +1 -0
- package/dist/web/routes/webview-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +19 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +31 -2
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +12 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +116 -5
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-listener-wiring.d.ts +6 -0
- package/dist/web/session-listener-wiring.d.ts.map +1 -1
- package/dist/web/session-listener-wiring.js +10 -3
- package/dist/web/session-listener-wiring.js.map +1 -1
- package/dist/web/sse-events.d.ts +5 -2
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +5 -2
- package/dist/web/sse-events.js.map +1 -1
- package/dist/web/webview-proxy.d.ts +8 -3
- package/dist/web/webview-proxy.d.ts.map +1 -1
- package/dist/web/webview-proxy.js +23 -5
- package/dist/web/webview-proxy.js.map +1 -1
- package/package.json +1 -1
- package/skills/codeman/SKILL.md +20 -9
- package/skills/codeman/preamble.sh +12 -2
- package/skills/codeman/reference/endpoints.md +8 -7
- package/skills/codeman/reference/recipes.md +1 -1
- package/skills/codeman/reference/verbs.md +21 -13
- package/dist/web/public/app.ae50029a.js +0 -43
- package/dist/web/public/app.ae50029a.js.br +0 -0
- package/dist/web/public/app.ae50029a.js.gz +0 -0
- package/dist/web/public/constants.e5e588db.js.br +0 -0
- package/dist/web/public/constants.e5e588db.js.gz +0 -0
- package/dist/web/public/i18n.8f291f06.js +0 -2
- package/dist/web/public/i18n.8f291f06.js.br +0 -0
- package/dist/web/public/i18n.8f291f06.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.c283e827.js.br +0 -0
- package/dist/web/public/keyboard-accessory.c283e827.js.gz +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.br +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
- package/dist/web/public/mobile.13514863.css +0 -1
- package/dist/web/public/mobile.13514863.css.br +0 -0
- package/dist/web/public/mobile.13514863.css.gz +0 -0
- package/dist/web/public/panels-ui.b7bfb9da.js.br +0 -0
- package/dist/web/public/panels-ui.b7bfb9da.js.gz +0 -0
- package/dist/web/public/session-ui.be076c88.js.br +0 -0
- package/dist/web/public/session-ui.be076c88.js.gz +0 -0
- package/dist/web/public/settings-ui.fc4cc50a.js +0 -97
- package/dist/web/public/settings-ui.fc4cc50a.js.br +0 -0
- package/dist/web/public/settings-ui.fc4cc50a.js.gz +0 -0
- package/dist/web/public/styles.dcfa907f.css +0 -1
- package/dist/web/public/styles.dcfa907f.css.br +0 -0
- package/dist/web/public/styles.dcfa907f.css.gz +0 -0
- package/dist/web/public/terminal-ui.ae01a7d1.js +0 -2
- package/dist/web/public/terminal-ui.ae01a7d1.js.br +0 -0
- package/dist/web/public/terminal-ui.ae01a7d1.js.gz +0 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Config backups: timestamped snapshots of the files that hold what a user has
|
|
3
|
+
* customized, kept in a default-but-configurable folder with configurable retention.
|
|
4
|
+
*
|
|
5
|
+
* Why it exists: those files are plain JSON in the data dir, rewritten by the server, the Settings UI,
|
|
6
|
+
* the CLI and (once, by a mis-configured test run) by things that should never touch them, and there
|
|
7
|
+
* was no copy to go back to. A snapshot is taken at startup and whenever the tracked files' content
|
|
8
|
+
* changes, so the history is one entry per actual change rather than one per timer tick.
|
|
9
|
+
*
|
|
10
|
+
* Safety rules the code enforces rather than documents:
|
|
11
|
+
* - The tracked file list is a fixed allowlist, never "everything in the data dir".
|
|
12
|
+
* - Retention only ever deletes folders this module made (name pattern AND a parseable manifest), so
|
|
13
|
+
* pointing the backup folder at a directory that holds other things cannot delete them.
|
|
14
|
+
* - The newest snapshot is never pruned, whatever the retention numbers say.
|
|
15
|
+
* - A snapshot is built in a temp folder and renamed into place, so a crash leaves no half snapshot.
|
|
16
|
+
* - Restore verifies each file against the manifest's SHA-256 and takes a `pre-restore` snapshot first.
|
|
17
|
+
* - Snapshot folders are 0700 and their files 0600: some tracked files carry credentials.
|
|
18
|
+
*
|
|
19
|
+
* Pure of the server: every function takes the directories it works in.
|
|
20
|
+
*
|
|
21
|
+
* @module config-backup
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The files (relative to the data dir) a snapshot holds: what a user configured, not what the server
|
|
25
|
+
* regenerates (session state, logs, the hook secret, docker seeds, caches).
|
|
26
|
+
*
|
|
27
|
+
* ⚠️ Not tracked: `state.json`. It also holds cron jobs and respawn presets, but it is rewritten with
|
|
28
|
+
* every session event, so tracking it would make a snapshot per event and bury the real changes.
|
|
29
|
+
*
|
|
30
|
+
* ⚠️ `.env`, `users.json`, `custom-model-hosts.json` and `push-keys.json` carry credentials or keys.
|
|
31
|
+
* They are already in the data dir with the same permissions; a snapshot folder is 0700 with 0600
|
|
32
|
+
* files, so the default location widens nothing. A custom location is the user's own choice.
|
|
33
|
+
*/
|
|
34
|
+
export declare const CONFIG_BACKUP_FILES: readonly ["settings.json", "clis.json", "custom-model-hosts.json", "webhook.json", "intents.json", "linked-cases.json", "remote-hosts.json", "remote-cases.json", "docker-hosts.json", "docker-cases.json", "webviews.json", "push-keys.json", "users.json", ".env"];
|
|
35
|
+
export declare const CONFIG_BACKUP_DEFAULTS: {
|
|
36
|
+
readonly enabled: true;
|
|
37
|
+
readonly keepCount: 20;
|
|
38
|
+
readonly keepDays: 30;
|
|
39
|
+
};
|
|
40
|
+
/** 1 would delete the state before every change, so a bad write could never be undone. */
|
|
41
|
+
export declare const CONFIG_BACKUP_MIN_KEEP_COUNT = 2;
|
|
42
|
+
export declare const CONFIG_BACKUP_MAX_KEEP_COUNT = 500;
|
|
43
|
+
export declare const CONFIG_BACKUP_MAX_KEEP_DAYS = 3650;
|
|
44
|
+
export interface ConfigBackupSettings {
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
/** Absolute folder, or null for the default (`<data dir>/backups/config`). */
|
|
47
|
+
dir: string | null;
|
|
48
|
+
/** Keep at most this many snapshots (newest first). 2–500. */
|
|
49
|
+
keepCount: number;
|
|
50
|
+
/** Also drop snapshots older than this many days; 0 = no age limit. */
|
|
51
|
+
keepDays: number;
|
|
52
|
+
}
|
|
53
|
+
export interface ConfigBackupFile {
|
|
54
|
+
name: string;
|
|
55
|
+
bytes: number;
|
|
56
|
+
sha256: string;
|
|
57
|
+
}
|
|
58
|
+
export interface ConfigBackupManifest {
|
|
59
|
+
id: string;
|
|
60
|
+
createdAt: number;
|
|
61
|
+
reason: string;
|
|
62
|
+
appVersion: string;
|
|
63
|
+
/** Digest of the set of files, so an unchanged state is not snapshotted twice. */
|
|
64
|
+
hash: string;
|
|
65
|
+
/** Id of the data dir that made it (see {@link configBackupOrigin}), so instances sharing one folder keep to their own snapshots. */
|
|
66
|
+
origin?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The retention in force when it was made. If `settings.json` later fails to parse or is reset,
|
|
69
|
+
* the next pass prunes with these instead of the defaults, so one bad write cannot shorten a
|
|
70
|
+
* history the user asked to keep.
|
|
71
|
+
*/
|
|
72
|
+
keepCount?: number;
|
|
73
|
+
keepDays?: number;
|
|
74
|
+
files: ConfigBackupFile[];
|
|
75
|
+
}
|
|
76
|
+
export interface ConfigBackupSummary {
|
|
77
|
+
id: string;
|
|
78
|
+
createdAt: number;
|
|
79
|
+
reason: string;
|
|
80
|
+
appVersion: string;
|
|
81
|
+
files: Array<{
|
|
82
|
+
name: string;
|
|
83
|
+
bytes: number;
|
|
84
|
+
}>;
|
|
85
|
+
bytes: number;
|
|
86
|
+
}
|
|
87
|
+
/** `~`-expand and require an absolute path; anything else means "use the default". */
|
|
88
|
+
export declare function normalizeBackupDir(raw: unknown, home?: string): string | null;
|
|
89
|
+
/** Read the four `configBackup*` settings out of a settings.json object, clamped and defaulted. */
|
|
90
|
+
export declare function readConfigBackupSettings(raw: Record<string, unknown> | null | undefined): ConfigBackupSettings;
|
|
91
|
+
export declare function defaultConfigBackupDir(dataDir: string): string;
|
|
92
|
+
/**
|
|
93
|
+
* The folder snapshots go to: the configured one, or the default. A custom folder that IS the data dir
|
|
94
|
+
* falls back to the default, because snapshot folders and the live files must not share a directory.
|
|
95
|
+
*/
|
|
96
|
+
export declare function resolveConfigBackupDir(settings: ConfigBackupSettings, dataDir: string): string;
|
|
97
|
+
/**
|
|
98
|
+
* Who owns a snapshot: a random id made once and kept in the data dir. A hostname would not do (a
|
|
99
|
+
* Docker container gets a new one on every recreate, which orphaned every earlier snapshot), nor
|
|
100
|
+
* would the path alone (two machines can share a `$HOME` path). It is a file of its own, not the
|
|
101
|
+
* hook secret, and is not tracked or restored. If it cannot be written the id is not persisted, so
|
|
102
|
+
* snapshots made meanwhile are not listed later; the data dir being unwritable breaks far more.
|
|
103
|
+
*/
|
|
104
|
+
export declare function configBackupOrigin(dataDir: string): string;
|
|
105
|
+
/** The id already made for this data dir, or null. Read-only: listing must not write a file. */
|
|
106
|
+
export declare function readConfigBackupOrigin(dataDir: string): string | null;
|
|
107
|
+
/**
|
|
108
|
+
* Snapshots this module made in `dir`, newest first. Foreign folders and files are ignored, and so
|
|
109
|
+
* are other instances' snapshots when `origin` is given (see {@link configBackupOrigin}).
|
|
110
|
+
*/
|
|
111
|
+
export declare function listConfigBackups(dir: string, origin?: string): ConfigBackupSummary[];
|
|
112
|
+
export type ConfigBackupResult = {
|
|
113
|
+
status: 'created';
|
|
114
|
+
id: string;
|
|
115
|
+
files: number;
|
|
116
|
+
bytes: number;
|
|
117
|
+
} | {
|
|
118
|
+
status: 'unchanged';
|
|
119
|
+
id: string;
|
|
120
|
+
} | {
|
|
121
|
+
status: 'empty';
|
|
122
|
+
};
|
|
123
|
+
export interface CreateConfigBackupOptions {
|
|
124
|
+
dataDir: string;
|
|
125
|
+
backupDir: string;
|
|
126
|
+
reason: string;
|
|
127
|
+
appVersion?: string;
|
|
128
|
+
/** Snapshot even if nothing changed (a manual request, a pre-restore safety copy). */
|
|
129
|
+
force?: boolean;
|
|
130
|
+
/** Recorded in the manifest, see {@link ConfigBackupManifest.keepCount}. */
|
|
131
|
+
keepCount?: number;
|
|
132
|
+
keepDays?: number;
|
|
133
|
+
now?: number;
|
|
134
|
+
}
|
|
135
|
+
/** Snapshot the tracked files that exist, unless the latest snapshot already holds exactly this state. */
|
|
136
|
+
export declare function createConfigBackup(opts: CreateConfigBackupOptions): ConfigBackupResult;
|
|
137
|
+
/** Remove `.tmp-cfg-*` build folders a crashed snapshot left behind (older than an hour, so a live one on a shared folder is safe). */
|
|
138
|
+
export declare function sweepConfigBackupTemps(dir: string, now?: number): void;
|
|
139
|
+
/**
|
|
140
|
+
* The retention recorded in this instance's newest snapshot, or null when it recorded none. `listed`
|
|
141
|
+
* is this instance's manifests in `dir`, newest first, when the caller already read them.
|
|
142
|
+
*/
|
|
143
|
+
export declare function latestBackupRetention(dir: string, origin: string, listed?: readonly ConfigBackupManifest[]): {
|
|
144
|
+
keepCount: number;
|
|
145
|
+
keepDays: number;
|
|
146
|
+
} | null;
|
|
147
|
+
/**
|
|
148
|
+
* The settings in effect, with each retention key that `raw` (the parsed settings.json) lacks, as
|
|
149
|
+
* after a reset, taken from what the newest backup recorded in `dir` instead of the defaults. It
|
|
150
|
+
* looks at the retention keys only (not the folder), so re-entering a custom folder after a reset
|
|
151
|
+
* finds that folder's own manifests. One place for the timer pass and for what the GET route
|
|
152
|
+
* reports, so they cannot disagree.
|
|
153
|
+
*/
|
|
154
|
+
export declare function withRecordedRetention(settings: ConfigBackupSettings, raw: Record<string, unknown>, dir: string, origin: string | null, listed?: readonly ConfigBackupManifest[]): ConfigBackupSettings;
|
|
155
|
+
export interface PruneOptions {
|
|
156
|
+
keepCount: number;
|
|
157
|
+
keepDays: number;
|
|
158
|
+
/** Only this instance's snapshots are pruned; omitted = every snapshot in the folder. */
|
|
159
|
+
origin?: string;
|
|
160
|
+
now?: number;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Apply retention: keep the newest `keepCount`, and (when `keepDays` > 0) drop anything older than
|
|
164
|
+
* that. The newest snapshot always survives. Returns the ids removed.
|
|
165
|
+
*/
|
|
166
|
+
export declare function pruneConfigBackups(dir: string, opts: PruneOptions): string[];
|
|
167
|
+
export interface ConfigBackupPassOptions {
|
|
168
|
+
dataDir: string;
|
|
169
|
+
backupDir: string;
|
|
170
|
+
reason: string;
|
|
171
|
+
appVersion?: string;
|
|
172
|
+
/** Snapshot even if nothing changed (Back up now). */
|
|
173
|
+
force?: boolean;
|
|
174
|
+
/** As read from settings.json ({@link readConfigBackupSettings}), before the recorded-retention fallback. */
|
|
175
|
+
settings: ConfigBackupSettings;
|
|
176
|
+
/** The parsed settings.json (`{}` when it did not parse): the fallback tells an absent key from a set one. */
|
|
177
|
+
raw: Record<string, unknown>;
|
|
178
|
+
/** False when settings.json did not parse: the pass still snapshots, but deletes nothing on its say-so. */
|
|
179
|
+
prune: boolean;
|
|
180
|
+
now?: number;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* One pass of the timer or of Back up now: sweep stale temp folders, snapshot when the state changed,
|
|
184
|
+
* apply retention. The folder is read and each manifest parsed ONCE, and that listing feeds the
|
|
185
|
+
* recorded-retention fallback, the change check and the prune. It used to be listed for each of the
|
|
186
|
+
* three, which on a network folder is every manifest read three times every five minutes.
|
|
187
|
+
*/
|
|
188
|
+
export declare function runConfigBackupPass(opts: ConfigBackupPassOptions): {
|
|
189
|
+
result: ConfigBackupResult;
|
|
190
|
+
removed: string[];
|
|
191
|
+
};
|
|
192
|
+
export declare class ConfigBackupNotFoundError extends Error {
|
|
193
|
+
}
|
|
194
|
+
export declare class ConfigBackupCorruptError extends Error {
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* A restore that wrote some files and could not write others (a full disk, a directory where a file
|
|
198
|
+
* should be). Every file passed verification first, so the ones written are the backup's: the caller
|
|
199
|
+
* still has to reload what they feed and tell the user which files are which.
|
|
200
|
+
*/
|
|
201
|
+
export declare class ConfigBackupPartialRestoreError extends Error {
|
|
202
|
+
readonly restored: string[];
|
|
203
|
+
readonly failed: Array<{
|
|
204
|
+
name: string;
|
|
205
|
+
error: string;
|
|
206
|
+
}>;
|
|
207
|
+
readonly untouched: string[];
|
|
208
|
+
readonly safetySnapshot: string | null;
|
|
209
|
+
constructor(restored: string[], failed: Array<{
|
|
210
|
+
name: string;
|
|
211
|
+
error: string;
|
|
212
|
+
}>, untouched: string[], safetySnapshot: string | null);
|
|
213
|
+
}
|
|
214
|
+
export interface RestoreResult {
|
|
215
|
+
restored: string[];
|
|
216
|
+
/** Tracked files present now that the snapshot did not hold; a restore leaves them as they are. */
|
|
217
|
+
untouched: string[];
|
|
218
|
+
/**
|
|
219
|
+
* The snapshot holding the live files as they were before the restore: the `pre-restore` copy, or the
|
|
220
|
+
* newest backup when it already held exactly that state. Null only when no tracked file existed.
|
|
221
|
+
*/
|
|
222
|
+
safetySnapshot: string | null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Put a snapshot's files back into the data dir. Every file is checked against the manifest's digest
|
|
226
|
+
* BEFORE anything is written, a `pre-restore` snapshot of the live files is taken first (unless the
|
|
227
|
+
* newest backup already holds that state, which is then reported instead), and each file is replaced
|
|
228
|
+
* atomically (temp + rename) with mode 0600. A file that cannot be written does not stop the others;
|
|
229
|
+
* it throws {@link ConfigBackupPartialRestoreError} at the end, naming both lists.
|
|
230
|
+
*/
|
|
231
|
+
export declare function restoreConfigBackup(opts: {
|
|
232
|
+
dataDir: string;
|
|
233
|
+
backupDir: string;
|
|
234
|
+
id: string;
|
|
235
|
+
appVersion?: string;
|
|
236
|
+
now?: number;
|
|
237
|
+
/** Override the probe of whether the backup folder keeps file modes (tests; a mode-less filesystem). */
|
|
238
|
+
keepsModes?: boolean;
|
|
239
|
+
}): RestoreResult;
|
|
240
|
+
/** The live files in the data dir, as a side of a diff. */
|
|
241
|
+
export declare const CONFIG_DIFF_CURRENT = "current";
|
|
242
|
+
export interface ConfigDiffChange {
|
|
243
|
+
/** Dotted path inside the file (`a.b[0].c`), or the variable name for `.env`. */
|
|
244
|
+
path: string;
|
|
245
|
+
kind: 'added' | 'removed' | 'changed';
|
|
246
|
+
/** JSON text of the value; absent when it did not exist on that side or `redacted` is set. */
|
|
247
|
+
before?: string;
|
|
248
|
+
after?: string;
|
|
249
|
+
/** The value is a credential, so only the fact that it differs is reported. */
|
|
250
|
+
redacted?: boolean;
|
|
251
|
+
}
|
|
252
|
+
export interface ConfigDiffFile {
|
|
253
|
+
name: string;
|
|
254
|
+
/** `added` = only in `to`, `removed` = only in `from`. */
|
|
255
|
+
status: 'added' | 'removed' | 'changed' | 'unchanged';
|
|
256
|
+
changes: ConfigDiffChange[];
|
|
257
|
+
/** More changes than `MAX_DIFF_CHANGES`; the rest are not listed. */
|
|
258
|
+
truncated: boolean;
|
|
259
|
+
/** `keys` = per-key changes; `bytes` = the file is not JSON/env, so only "differs" is known. */
|
|
260
|
+
detail: 'keys' | 'bytes';
|
|
261
|
+
}
|
|
262
|
+
export interface ConfigDiff {
|
|
263
|
+
from: string;
|
|
264
|
+
to: string;
|
|
265
|
+
files: ConfigDiffFile[];
|
|
266
|
+
/** Files whose status is not `unchanged`. */
|
|
267
|
+
changed: number;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* What differs between two states of the tracked files; a state is a snapshot id or `current`
|
|
271
|
+
* (the live files). Never returns the value of a credential: see REDACT_ALL_FILES and SECRET_KEY_RE.
|
|
272
|
+
*/
|
|
273
|
+
export declare function diffConfigBackups(opts: {
|
|
274
|
+
dataDir: string;
|
|
275
|
+
backupDir: string;
|
|
276
|
+
from: string;
|
|
277
|
+
to: string;
|
|
278
|
+
}): ConfigDiff;
|
|
279
|
+
//# sourceMappingURL=config-backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-backup.d.ts","sourceRoot":"","sources":["../src/config-backup.ts"],"names":[],"mappings":"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"}
|