@the-librarian/cli 1.0.0-rc.3 → 1.0.0-rc.30

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.
Files changed (83) hide show
  1. package/LICENSE +201 -0
  2. package/dist/bin.js +0 -0
  3. package/dist/commands/install.d.ts +6 -0
  4. package/dist/commands/install.d.ts.map +1 -1
  5. package/dist/commands/install.js +54 -2
  6. package/dist/commands/install.js.map +1 -1
  7. package/dist/harnesses/codex.d.ts +13 -0
  8. package/dist/harnesses/codex.d.ts.map +1 -1
  9. package/dist/harnesses/codex.js +217 -26
  10. package/dist/harnesses/codex.js.map +1 -1
  11. package/dist/harnesses/hermes.d.ts +1 -1
  12. package/dist/harnesses/hermes.d.ts.map +1 -1
  13. package/dist/harnesses/hermes.js +7 -3
  14. package/dist/harnesses/hermes.js.map +1 -1
  15. package/dist/harnesses/opencode.d.ts +12 -0
  16. package/dist/harnesses/opencode.d.ts.map +1 -1
  17. package/dist/harnesses/opencode.js +125 -4
  18. package/dist/harnesses/opencode.js.map +1 -1
  19. package/dist/paths.d.ts +16 -0
  20. package/dist/paths.d.ts.map +1 -1
  21. package/dist/paths.js +22 -0
  22. package/dist/paths.js.map +1 -1
  23. package/dist/prompt.d.ts +7 -0
  24. package/dist/prompt.d.ts.map +1 -1
  25. package/dist/prompt.js +79 -29
  26. package/dist/prompt.js.map +1 -1
  27. package/dist/runtime.d.ts +20 -0
  28. package/dist/runtime.d.ts.map +1 -1
  29. package/dist/runtime.js +252 -7
  30. package/dist/runtime.js.map +1 -1
  31. package/dist/server/admin.d.ts +31 -0
  32. package/dist/server/admin.d.ts.map +1 -0
  33. package/dist/server/admin.js +131 -0
  34. package/dist/server/admin.js.map +1 -0
  35. package/dist/server/autoupdate.d.ts +184 -0
  36. package/dist/server/autoupdate.d.ts.map +1 -0
  37. package/dist/server/autoupdate.js +794 -0
  38. package/dist/server/autoupdate.js.map +1 -0
  39. package/dist/server/boot.d.ts +51 -0
  40. package/dist/server/boot.d.ts.map +1 -0
  41. package/dist/server/boot.js +233 -0
  42. package/dist/server/boot.js.map +1 -0
  43. package/dist/server/deploy-state.d.ts +33 -0
  44. package/dist/server/deploy-state.d.ts.map +1 -0
  45. package/dist/server/deploy-state.js +79 -0
  46. package/dist/server/deploy-state.js.map +1 -0
  47. package/dist/server/docker.d.ts +53 -0
  48. package/dist/server/docker.d.ts.map +1 -0
  49. package/dist/server/docker.js +166 -0
  50. package/dist/server/docker.js.map +1 -0
  51. package/dist/server/down.d.ts +19 -0
  52. package/dist/server/down.d.ts.map +1 -0
  53. package/dist/server/down.js +62 -0
  54. package/dist/server/down.js.map +1 -0
  55. package/dist/server/index.d.ts +8 -0
  56. package/dist/server/index.d.ts.map +1 -0
  57. package/dist/server/index.js +50 -0
  58. package/dist/server/index.js.map +1 -0
  59. package/dist/server/logs.d.ts +50 -0
  60. package/dist/server/logs.d.ts.map +1 -0
  61. package/dist/server/logs.js +162 -0
  62. package/dist/server/logs.js.map +1 -0
  63. package/dist/server/preflight.d.ts +24 -0
  64. package/dist/server/preflight.d.ts.map +1 -0
  65. package/dist/server/preflight.js +58 -0
  66. package/dist/server/preflight.js.map +1 -0
  67. package/dist/server/redact.d.ts +2 -0
  68. package/dist/server/redact.d.ts.map +1 -0
  69. package/dist/server/redact.js +26 -0
  70. package/dist/server/redact.js.map +1 -0
  71. package/dist/server/status.d.ts +20 -0
  72. package/dist/server/status.d.ts.map +1 -0
  73. package/dist/server/status.js +103 -0
  74. package/dist/server/status.js.map +1 -0
  75. package/dist/server/up.d.ts +226 -0
  76. package/dist/server/up.d.ts.map +1 -0
  77. package/dist/server/up.js +723 -0
  78. package/dist/server/up.js.map +1 -0
  79. package/dist/server/update.d.ts +35 -0
  80. package/dist/server/update.d.ts.map +1 -0
  81. package/dist/server/update.js +308 -0
  82. package/dist/server/update.js.map +1 -0
  83. package/package.json +10 -11
@@ -0,0 +1,184 @@
1
+ declare const AUTOUPDATE_CADENCES: readonly ["daily", "weekly"];
2
+ type AutoUpdateCadence = (typeof AUTOUPDATE_CADENCES)[number];
3
+ /** The oneshot service unit that runs the `--run` wrapper (single instance per host). */
4
+ export declare const AUTOUPDATE_SERVICE_NAME = "the-librarian-autoupdate.service";
5
+ /** The timer unit that fires the oneshot service ~hourly. */
6
+ export declare const AUTOUPDATE_TIMER_NAME = "the-librarian-autoupdate.timer";
7
+ /** A stable marker that tags OUR crontab line, so we can find/replace/remove it idempotently. */
8
+ export declare const CRON_MARKER = "# the-librarian-autoupdate";
9
+ /**
10
+ * The substring every OUR systemd unit's `Description=` carries (both the service
11
+ * and the timer descriptions start with it). `uninstall` reads a unit file and
12
+ * confirms this marker BEFORE deleting it (FIX I2) — so a same-named unit a human
13
+ * authored is never `rm`'d out from under them.
14
+ */
15
+ export declare const UNIT_DESCRIPTION_MARKER = "The Librarian \u2014 auto-update";
16
+ /** The absolute path the oneshot service is installed at (system unit, via sudo). */
17
+ export declare function servicePath(): string;
18
+ /** The absolute path the timer is installed at (system unit, via sudo). */
19
+ export declare function timerPath(): string;
20
+ /** A teaching error from autoupdate ops; the runtime renders `.message` as one stderr line. */
21
+ export declare class AutoUpdateError extends Error {
22
+ constructor(message: string);
23
+ }
24
+ export interface AutoUpdateResult {
25
+ /** Human-readable report for stdout. */
26
+ output: string;
27
+ }
28
+ export interface AutoUpdateOptions {
29
+ /** Platform — gates the macOS deferral + systemd-vs-cron choice. Default `process.platform`. */
30
+ platform?: NodeJS.Platform | undefined;
31
+ /** Override home (tests). Threads into `server update`/`status`. */
32
+ home?: string | undefined;
33
+ /** Deploy dir override. Default: `~/.librarian/server`. Threads into update/status. */
34
+ dir?: string | undefined;
35
+ }
36
+ export interface EnableOptions extends AutoUpdateOptions {
37
+ /** Cadence to write into the running server. Default daily. Validated daily|weekly. */
38
+ cadence?: string | undefined;
39
+ }
40
+ export interface RunOptions extends AutoUpdateOptions {
41
+ /**
42
+ * Sink for the wrapper's one-line log entries (the timer's journal). Defaults
43
+ * to a `process.stderr` writer; tests inject a recorder. Every wrapper outcome
44
+ * (skip / update / failure) emits exactly one line here — and the wrapper never
45
+ * throws, so the timer's unit always exits 0.
46
+ */
47
+ log?: ((line: string) => void) | undefined;
48
+ /** Health-wait bound for the inner `server update` (small in tests). */
49
+ healthAttempts?: number | undefined;
50
+ /** Milliseconds between health polls for the inner update (0 in tests). */
51
+ healthIntervalMs?: number | undefined;
52
+ /** Injected current time for the due-check (tests). Default `new Date()`. */
53
+ now?: Date | undefined;
54
+ }
55
+ /** Inputs to the pure service generator (only the librarian path — NEVER a secret). */
56
+ export interface ServiceUnitInput {
57
+ /** Absolute path to the `librarian` binary the oneshot runs with `server autoupdate --run`. */
58
+ librarianPath: string;
59
+ }
60
+ /**
61
+ * Generate the oneshot service unit text. PURE + unit-tested. Contains NO secret —
62
+ * it runs `librarian server autoupdate --run`, which reads the settings from the
63
+ * running container itself (via `docker exec`), so nothing sensitive is written
64
+ * into this world-readable unit file. `Type=oneshot` because the wrapper runs to
65
+ * completion each fire (it is the timer's job to schedule, not the service's).
66
+ */
67
+ export declare function generateServiceUnit(input: ServiceUnitInput): string;
68
+ /**
69
+ * Generate the timer unit text. PURE + unit-tested. Fires the oneshot service
70
+ * roughly hourly (`OnCalendar=hourly`, with `Persistent=true` so a missed fire
71
+ * while the host was off runs at next boot). The FREQUENT fire is deliberate: the
72
+ * cadence (daily/weekly) is a due-check IN the wrapper, NOT the timer period — so
73
+ * the dashboard can change cadence (a setting) with no host action (spec §4). A
74
+ * randomized delay spreads load and avoids every host updating on the exact hour.
75
+ */
76
+ export declare function generateTimerUnit(): string;
77
+ /**
78
+ * The crontab line for the cron fallback (systemd absent). Fires the wrapper at
79
+ * minute 17 of every hour (off the top-of-hour to spread load), tagged with
80
+ * {@link CRON_MARKER} so it can be found/replaced/removed idempotently. NO secret
81
+ * — same reasoning as the systemd unit (the wrapper reads settings from the
82
+ * container at run time).
83
+ */
84
+ export declare function cronLine(librarianPath: string): string;
85
+ /** The one-line macOS-deferred notice (boot persistence + autoupdate are Linux-only for now). */
86
+ export declare const MACOS_NOTICE: string;
87
+ /** The configured auto-update state read from the running server. */
88
+ export interface RunningConfig {
89
+ enabled: boolean;
90
+ cadence: AutoUpdateCadence;
91
+ lastRunAt: string | null;
92
+ }
93
+ /**
94
+ * Read the auto-update config from the RUNNING server via `docker exec node -e`
95
+ * (the internal tRPC listener, loopback inside the container). Returns null when
96
+ * the container is down / the exec fails / the response is unusable — the caller
97
+ * treats null as "unreachable" and SKIPS (never auto-updates an unknown server).
98
+ * Never throws.
99
+ */
100
+ export declare function readRunningConfig(): Promise<RunningConfig | null>;
101
+ /**
102
+ * Write the auto-update config into the RUNNING server (so the dashboard reflects
103
+ * the CLI's enable/cadence) via `docker exec node -e` → internal tRPC `set`.
104
+ * Returns true on success, false when the container is down / the write failed.
105
+ * Never throws — a write failure during `enable` is surfaced as a non-fatal hint
106
+ * (the timer is still installed; the operator can toggle from the dashboard).
107
+ */
108
+ export declare function writeRunningConfig(input: {
109
+ enabled?: boolean;
110
+ cadence?: AutoUpdateCadence;
111
+ }): Promise<boolean>;
112
+ /**
113
+ * Stamp `last_run_at` to NOW in the running server (the internal tRPC `stampRun`)
114
+ * after a SUCCESSFUL auto-update, so the next due-check advances by one cadence
115
+ * window. Returns true on success, false when the (freshly recreated) container
116
+ * isn't reachable yet / the call failed — a failed stamp is non-fatal (the update
117
+ * itself succeeded; the worst case is one extra due-check next fire). Never throws.
118
+ */
119
+ export declare function stampRunInServer(): Promise<boolean>;
120
+ /**
121
+ * Install the host scheduler + write the enabled/cadence settings into the running
122
+ * server. On Linux with systemd: write the oneshot service + the .timer to
123
+ * `/etc/systemd/system`, `daemon-reload`, then `enable --now` the TIMER (the
124
+ * service is oneshot — only the timer is enabled). Idempotent: re-running rewrites
125
+ * the SAME unit paths and re-enables, never duplicating. Where systemd is absent:
126
+ * install an hourly cron line (idempotent via {@link CRON_MARKER}). On macOS: print
127
+ * the deferred notice and skip cleanly.
128
+ *
129
+ * The settings write (enabled=true + cadence) is best-effort: a down server is a
130
+ * non-fatal hint (the timer is installed; the operator toggles from the dashboard
131
+ * once the server is up). The timer is what makes auto-update actually happen.
132
+ */
133
+ export declare function enableAutoUpdate(options?: EnableOptions): Promise<AutoUpdateResult>;
134
+ /**
135
+ * Disable auto-update WITHOUT removing the timer (spec §3 SC2): flip
136
+ * `enabled=false` in the running server so the next `--run` no-ops, leaving the
137
+ * timer installed. Idempotent. A down server is a teaching error (we can't flip a
138
+ * setting on a server we can't reach) — the operator can also toggle it off from
139
+ * the dashboard.
140
+ */
141
+ export declare function disableAutoUpdate(options?: AutoUpdateOptions): Promise<AutoUpdateResult>;
142
+ /**
143
+ * Remove the host scheduler entirely (spec §3 SC2): on systemd, `disable --now`
144
+ * the timer (tolerating "not loaded"), remove BOTH unit files, then
145
+ * `daemon-reload`. Where systemd is absent, strip our tagged crontab line. Safe if
146
+ * already absent — idempotent, never a crash. Does NOT touch the server's
147
+ * `enabled` setting (the timer is gone, so it no longer matters; leaving the
148
+ * setting avoids a needless server round-trip on a down server). On macOS: notice.
149
+ */
150
+ export declare function uninstallAutoUpdate(options?: AutoUpdateOptions): Promise<AutoUpdateResult>;
151
+ /**
152
+ * Report the auto-update state (spec §3 SC3): is the timer/cron installed?, the
153
+ * server's enabled/cadence/last-run (read from the running server), and the
154
+ * up-to-date badge (reusing `server status`' deployed-vs-latest render). A down
155
+ * server degrades the server-side fields to "unknown (server unreachable)" but
156
+ * still reports the host-side timer state and exits 0.
157
+ */
158
+ export declare function autoUpdateStatus(options?: AutoUpdateOptions): Promise<AutoUpdateResult>;
159
+ /** The fixed lock path: `~/.librarian/server/.autoupdate.lock` (no root needed). */
160
+ export declare function autoUpdateLockPath(options: {
161
+ home?: string | undefined;
162
+ dir?: string | undefined;
163
+ }): string;
164
+ /**
165
+ * The wrapper the timer/cron fires (spec §3 SC4/SC7). Reads the auto-update
166
+ * settings from the RUNNING server, applies the due-check, and conditionally runs
167
+ * `server update`. FULLY FAIL-SOFT — it NEVER throws (the timer's unit always
168
+ * exits 0); every outcome is one log line:
169
+ *
170
+ * - Server UNREACHABLE → SKIP (never auto-update a server in an unknown state).
171
+ * - NOT (enabled && due) → SKIP (the no-op the disabled/not-due case wants).
172
+ * - enabled && due → run `server update`. On SUCCESS, stamp `last_run_at`
173
+ * (so the next due-check advances). On FAILURE (the update's own health-check
174
+ * rollback left the prior container running), log + do NOT stamp (so the next
175
+ * fire retries).
176
+ *
177
+ * The due-check is computed HOST-SIDE from the config the server returned (so the
178
+ * single source of truth — the core helper's logic — is mirrored here without a
179
+ * second round-trip): enabled AND the cadence has elapsed since `lastRunAt`
180
+ * (never-run → due).
181
+ */
182
+ export declare function runAutoUpdate(options?: RunOptions): Promise<AutoUpdateResult>;
183
+ export {};
184
+ //# sourceMappingURL=autoupdate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoupdate.d.ts","sourceRoot":"","sources":["../../src/server/autoupdate.ts"],"names":[],"mappings":"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"}