@raidiant/notifai 0.3.0 → 0.4.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 +20 -4
- package/dist/atomic-file.d.ts +4 -0
- package/dist/atomic-file.js +60 -10
- package/dist/atomic-file.js.map +1 -1
- package/dist/client.d.ts +25 -2
- package/dist/client.js +45 -1
- package/dist/client.js.map +1 -1
- package/dist/commands.d.ts +56 -7
- package/dist/commands.js +980 -318
- package/dist/commands.js.map +1 -1
- package/dist/config-schema.d.ts +1 -1
- package/dist/config-schema.js +46 -8
- package/dist/config-schema.js.map +1 -1
- package/dist/config.d.ts +38 -3
- package/dist/config.js +61 -14
- package/dist/config.js.map +1 -1
- package/dist/file-lock.d.ts +26 -0
- package/dist/file-lock.js +268 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/harnesses.d.ts +28 -0
- package/dist/harnesses.js +40 -0
- package/dist/harnesses.js.map +1 -0
- package/dist/hook-adapter.d.ts +27 -0
- package/dist/hook-adapter.js +188 -0
- package/dist/hook-adapter.js.map +1 -0
- package/dist/hook-input.d.ts +10 -0
- package/dist/hook-input.js +64 -0
- package/dist/hook-input.js.map +1 -0
- package/dist/hooks.d.ts +66 -10
- package/dist/hooks.js +751 -276
- package/dist/hooks.js.map +1 -1
- package/dist/install-hooks.d.ts +40 -16
- package/dist/install-hooks.js +217 -73
- package/dist/install-hooks.js.map +1 -1
- package/dist/interactive.d.ts +1 -1
- package/dist/interactive.js +3 -3
- package/dist/interactive.js.map +1 -1
- package/dist/logging.d.ts +142 -0
- package/dist/logging.js +533 -0
- package/dist/logging.js.map +1 -0
- package/dist/main.js +97 -36
- package/dist/main.js.map +1 -1
- package/dist/opencode-plugin.d.ts +7 -7
- package/dist/opencode-plugin.js +12 -13
- package/dist/opencode-plugin.js.map +1 -1
- package/dist/ui/config-view.js +3 -0
- package/dist/ui/config-view.js.map +1 -1
- package/dist/ui/theme.d.ts +1 -1
- package/package.json +3 -2
- package/src/atomic-file.ts +86 -7
- package/src/client.test.ts +12 -0
- package/src/client.ts +72 -4
- package/src/commands.test.ts +891 -43
- package/src/commands.ts +1133 -332
- package/src/config-schema.ts +51 -9
- package/src/config.test.ts +6 -5
- package/src/config.ts +85 -16
- package/src/file-lock-process-worker.test.ts +64 -0
- package/src/file-lock.test.ts +279 -0
- package/src/file-lock.ts +318 -0
- package/src/harnesses.test.ts +48 -0
- package/src/harnesses.ts +59 -0
- package/src/hook-adapter.test.ts +187 -0
- package/src/hook-adapter.ts +212 -0
- package/src/hook-input.test.ts +39 -0
- package/src/hook-input.ts +72 -0
- package/src/hooks.test.ts +1318 -240
- package/src/hooks.ts +1046 -296
- package/src/install-hooks.test.ts +90 -41
- package/src/install-hooks.ts +259 -74
- package/src/interactive.ts +3 -3
- package/src/logging-process-worker.test.ts +39 -0
- package/src/logging.test.ts +453 -0
- package/src/logging.ts +639 -0
- package/src/main.ts +113 -32
- package/src/opencode-plugin.ts +15 -16
- package/src/session-end-log-lock-worker.test.ts +35 -0
- package/src/skill.test.ts +11 -0
- package/src/ui/config-view.test.ts +4 -2
- package/src/ui/config-view.ts +3 -0
package/dist/config-schema.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* a list and not an essay.
|
|
18
18
|
*/
|
|
19
19
|
import { CLI_SOUNDS, INTERRUPTION_LEVELS } from '@raidiant/notifai-protocol';
|
|
20
|
-
import { configBounds } from './config.js';
|
|
20
|
+
import { LOG_LEVELS, configBounds } from './config.js';
|
|
21
21
|
export const CONFIG_GROUPS = [
|
|
22
22
|
{
|
|
23
23
|
id: 'questions',
|
|
@@ -34,6 +34,11 @@ export const CONFIG_GROUPS = [
|
|
|
34
34
|
title: 'This project',
|
|
35
35
|
blurb: 'How work in this directory identifies itself, and the house rules agents read before notifying.',
|
|
36
36
|
},
|
|
37
|
+
{
|
|
38
|
+
id: 'diagnostics',
|
|
39
|
+
title: 'Local logs',
|
|
40
|
+
blurb: 'What this machine records about its own activity, so an agent can find out afterwards what happened.',
|
|
41
|
+
},
|
|
37
42
|
{
|
|
38
43
|
id: 'connection',
|
|
39
44
|
title: 'Connection',
|
|
@@ -54,8 +59,8 @@ const INFO = {
|
|
|
54
59
|
group: 'questions',
|
|
55
60
|
kind: 'boolean',
|
|
56
61
|
summary: 'Whether sitting at this keyboard holds a question back',
|
|
57
|
-
detail: '
|
|
58
|
-
example: '
|
|
62
|
+
detail: 'Off (the default) means notify me even while I am using this machine. `ask_grace_seconds` still runs, so the terminal is offered the question first; I just do not need to walk away before it may leave. Turn this on when local keyboard or mouse activity should keep questions in the terminal.\n\nThis is separate from `ask_notifications`, which switches routing off altogether: wanting to be reached only while away is different from not wanting to be reached.',
|
|
63
|
+
example: 'false',
|
|
59
64
|
},
|
|
60
65
|
away_after_seconds: {
|
|
61
66
|
label: 'Away after',
|
|
@@ -71,9 +76,9 @@ const INFO = {
|
|
|
71
76
|
group: 'questions',
|
|
72
77
|
kind: 'integer',
|
|
73
78
|
unit: 's',
|
|
74
|
-
summary: '
|
|
75
|
-
detail: '
|
|
76
|
-
example: '
|
|
79
|
+
summary: 'Optional delay before a question may reach your devices',
|
|
80
|
+
detail: 'Zero (the default) sends the question to your devices as soon as the agent turn ends. Set a positive duration to offer the terminal an exclusive answer window first; the timer is measured from the moment the agent asked.\n\nA timer and nothing more. It is honoured whether or not presence is consulted at all, because how long to wait and whether anyone is watching are separate questions, and answering one should not answer the other.',
|
|
81
|
+
example: '0',
|
|
77
82
|
},
|
|
78
83
|
hook_reply_timeout_seconds: {
|
|
79
84
|
label: 'Hook wait for an answer',
|
|
@@ -81,8 +86,8 @@ const INFO = {
|
|
|
81
86
|
kind: 'integer',
|
|
82
87
|
unit: 's',
|
|
83
88
|
summary: 'How long the harness hook blocks waiting for your answer',
|
|
84
|
-
detail: 'After a question has gone out, the harness
|
|
85
|
-
example: '
|
|
89
|
+
detail: 'After a question has gone out, the harness continuation owner waits up to this long for your answer. The device reply window uses the same bound, so Notifai never accepts an answer after an agent with no dormant-session wake has already returned.\n\nThe ceiling exists because command-hook harnesses bound their Stop processes. Grace plus this value plus installer headroom stays inside that budget.',
|
|
90
|
+
example: '480',
|
|
86
91
|
},
|
|
87
92
|
sound: {
|
|
88
93
|
label: 'Sound',
|
|
@@ -168,6 +173,39 @@ const INFO = {
|
|
|
168
173
|
unsetMeans: 'agents fall back to their default judgement',
|
|
169
174
|
example: 'Only failures and completed deploys',
|
|
170
175
|
},
|
|
176
|
+
log_level: {
|
|
177
|
+
label: 'Log level',
|
|
178
|
+
group: 'diagnostics',
|
|
179
|
+
kind: 'enum',
|
|
180
|
+
choices: LOG_LEVELS,
|
|
181
|
+
choiceHints: {
|
|
182
|
+
off: 'record nothing',
|
|
183
|
+
error: 'only failures',
|
|
184
|
+
info: 'commands, notifications, and every question decision',
|
|
185
|
+
debug: 'adds config resolution and per-request detail',
|
|
186
|
+
},
|
|
187
|
+
summary: 'How much this machine records about what it did',
|
|
188
|
+
detail: 'Notifai keeps a local record of what it did — every command, every notification, and in particular every decision a harness hook made about whether a question could leave the terminal. Hooks run headless, so without this there is no account of them at all: `notifai logs` is how an agent finds out afterwards why a question never reached your phone.\n\nThe log never leaves this machine. It is not uploaded, and nothing sends it anywhere.\n\n`debug` also records which config layer won and the detail of each request, which is what to turn on when something is behaving in a way the ordinary log does not explain.',
|
|
189
|
+
example: 'info',
|
|
190
|
+
},
|
|
191
|
+
log_max_bytes: {
|
|
192
|
+
label: 'Log file size',
|
|
193
|
+
group: 'diagnostics',
|
|
194
|
+
kind: 'integer',
|
|
195
|
+
summary: 'How large the log grows before it is rotated',
|
|
196
|
+
detail: 'When the active log reaches this size it is renamed aside and a fresh one starts. Together with the number of files kept, this is the whole disk budget: nothing here grows without a ceiling.',
|
|
197
|
+
advanced: true,
|
|
198
|
+
example: '2000000',
|
|
199
|
+
},
|
|
200
|
+
log_max_files: {
|
|
201
|
+
label: 'Log files kept',
|
|
202
|
+
group: 'diagnostics',
|
|
203
|
+
kind: 'integer',
|
|
204
|
+
summary: 'How many rotated log files are kept before the oldest is deleted',
|
|
205
|
+
detail: 'Counts the active file. At the defaults — three files of two megabytes — the logs occupy about six megabytes, which is weeks of ordinary agent traffic.\n\nRaise it when you need to look further back than the log currently reaches; lower it to one to keep only the file being written.',
|
|
206
|
+
advanced: true,
|
|
207
|
+
example: '3',
|
|
208
|
+
},
|
|
171
209
|
base_url: {
|
|
172
210
|
label: 'Service URL',
|
|
173
211
|
group: 'connection',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -23,6 +23,13 @@ export interface ResolvedValue<T> {
|
|
|
23
23
|
}
|
|
24
24
|
type CliSound = (typeof CLI_SOUNDS)[number];
|
|
25
25
|
type CliInterruptionLevel = (typeof INTERRUPTION_LEVELS)[number];
|
|
26
|
+
/**
|
|
27
|
+
* How much the local log records. Defined here rather than in `logging.ts`
|
|
28
|
+
* because it is a configuration vocabulary first — `logging.ts` reads config,
|
|
29
|
+
* so the dependency has to point this way.
|
|
30
|
+
*/
|
|
31
|
+
export declare const LOG_LEVELS: readonly ["off", "error", "info", "debug"];
|
|
32
|
+
export type LogLevel = (typeof LOG_LEVELS)[number];
|
|
26
33
|
export interface CliConfig {
|
|
27
34
|
base_url: ResolvedValue<string>;
|
|
28
35
|
wait_seconds: ResolvedValue<number>;
|
|
@@ -65,8 +72,8 @@ export interface CliConfig {
|
|
|
65
72
|
away_after_seconds: ResolvedValue<number>;
|
|
66
73
|
/**
|
|
67
74
|
* How long a hook blocks waiting for a companion-device answer before falling through
|
|
68
|
-
* to the harness's own prompt.
|
|
69
|
-
*
|
|
75
|
+
* to the harness's own prompt. Runtime arbitration keeps the complete Stop
|
|
76
|
+
* invocation inside its fixed 480s owner budget and 540s adapter ceiling.
|
|
70
77
|
*/
|
|
71
78
|
hook_reply_timeout_seconds: ResolvedValue<number>;
|
|
72
79
|
/**
|
|
@@ -80,13 +87,41 @@ export interface CliConfig {
|
|
|
80
87
|
* questions, and answering one should not answer the other.
|
|
81
88
|
*/
|
|
82
89
|
ask_grace_seconds: ResolvedValue<number>;
|
|
90
|
+
/**
|
|
91
|
+
* How much of what this CLI does is recorded to the local log.
|
|
92
|
+
*
|
|
93
|
+
* The log exists for agents: a hook runs headless and its most consequential
|
|
94
|
+
* act is usually a decision to do nothing, which leaves no other trace. `off`
|
|
95
|
+
* disables the sink entirely; `debug` adds config resolution and request
|
|
96
|
+
* detail, which is verbose enough to want a reason.
|
|
97
|
+
*/
|
|
98
|
+
log_level: ResolvedValue<LogLevel>;
|
|
99
|
+
/**
|
|
100
|
+
* Bytes the active log file may reach before it is rotated. With
|
|
101
|
+
* `log_max_files` this is the whole disk budget — nothing here grows without
|
|
102
|
+
* a ceiling, because a log that fills a disk is a bug that outlives its
|
|
103
|
+
* usefulness.
|
|
104
|
+
*/
|
|
105
|
+
log_max_bytes: ResolvedValue<number>;
|
|
106
|
+
/** Log files kept in total, the active one included. */
|
|
107
|
+
log_max_files: ResolvedValue<number>;
|
|
83
108
|
}
|
|
84
|
-
export declare const CONFIG_KEYS: readonly ["base_url", "wait_seconds", "ttl_seconds", "collapse_key", "devices", "sound", "interruption_level", "project", "notify_criteria", "ask_notifications", "require_idle", "away_after_seconds", "hook_reply_timeout_seconds", "ask_grace_seconds"];
|
|
109
|
+
export declare const CONFIG_KEYS: readonly ["base_url", "wait_seconds", "ttl_seconds", "collapse_key", "devices", "sound", "interruption_level", "project", "notify_criteria", "ask_notifications", "require_idle", "away_after_seconds", "hook_reply_timeout_seconds", "ask_grace_seconds", "log_level", "log_max_bytes", "log_max_files"];
|
|
85
110
|
export type ConfigKey = (typeof CONFIG_KEYS)[number];
|
|
86
111
|
/** Keys whose TOML value must parse as a boolean; used by `config set`. */
|
|
87
112
|
export declare const BOOLEAN_CONFIG_KEYS: readonly ConfigKey[];
|
|
88
113
|
/** Keys whose TOML value must parse as an integer within its configured bounds. */
|
|
89
114
|
export declare const NUMERIC_CONFIG_KEYS: readonly ConfigKey[];
|
|
115
|
+
/**
|
|
116
|
+
* Keys whose value must be one of a fixed set.
|
|
117
|
+
*
|
|
118
|
+
* Config is readable from a repository, so an unrecognised value is untrusted
|
|
119
|
+
* input rather than a typo — `coerce` drops it and the layer below wins, which
|
|
120
|
+
* is the same discipline the numeric bounds follow.
|
|
121
|
+
*/
|
|
122
|
+
export declare const ENUM_CONFIG_VALUES: Partial<Record<ConfigKey, readonly string[]>>;
|
|
123
|
+
/** The shipped value beneath every user-controlled configuration layer. */
|
|
124
|
+
export declare function configDefaultValue(key: ConfigKey): unknown;
|
|
90
125
|
export declare function globalConfigDir(env?: NodeJS.ProcessEnv): string;
|
|
91
126
|
export declare function globalConfigPath(env?: NodeJS.ProcessEnv): string;
|
|
92
127
|
/**
|
package/dist/config.js
CHANGED
|
@@ -3,6 +3,13 @@ import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { parse as parseToml } from 'smol-toml';
|
|
6
|
+
import { HOOK_TIMING } from './harnesses.js';
|
|
7
|
+
/**
|
|
8
|
+
* How much the local log records. Defined here rather than in `logging.ts`
|
|
9
|
+
* because it is a configuration vocabulary first — `logging.ts` reads config,
|
|
10
|
+
* so the dependency has to point this way.
|
|
11
|
+
*/
|
|
12
|
+
export const LOG_LEVELS = ['off', 'error', 'info', 'debug'];
|
|
6
13
|
export const CONFIG_KEYS = [
|
|
7
14
|
'base_url',
|
|
8
15
|
'wait_seconds',
|
|
@@ -18,6 +25,9 @@ export const CONFIG_KEYS = [
|
|
|
18
25
|
'away_after_seconds',
|
|
19
26
|
'hook_reply_timeout_seconds',
|
|
20
27
|
'ask_grace_seconds',
|
|
28
|
+
'log_level',
|
|
29
|
+
'log_max_bytes',
|
|
30
|
+
'log_max_files',
|
|
21
31
|
];
|
|
22
32
|
/** Keys whose TOML value must parse as a boolean; used by `config set`. */
|
|
23
33
|
export const BOOLEAN_CONFIG_KEYS = [
|
|
@@ -31,7 +41,19 @@ export const NUMERIC_CONFIG_KEYS = [
|
|
|
31
41
|
'away_after_seconds',
|
|
32
42
|
'hook_reply_timeout_seconds',
|
|
33
43
|
'ask_grace_seconds',
|
|
44
|
+
'log_max_bytes',
|
|
45
|
+
'log_max_files',
|
|
34
46
|
];
|
|
47
|
+
/**
|
|
48
|
+
* Keys whose value must be one of a fixed set.
|
|
49
|
+
*
|
|
50
|
+
* Config is readable from a repository, so an unrecognised value is untrusted
|
|
51
|
+
* input rather than a typo — `coerce` drops it and the layer below wins, which
|
|
52
|
+
* is the same discipline the numeric bounds follow.
|
|
53
|
+
*/
|
|
54
|
+
export const ENUM_CONFIG_VALUES = {
|
|
55
|
+
log_level: LOG_LEVELS,
|
|
56
|
+
};
|
|
35
57
|
const DEFAULTS = {
|
|
36
58
|
base_url: 'https://notifai.fly.dev',
|
|
37
59
|
wait_seconds: 10,
|
|
@@ -45,16 +67,27 @@ const DEFAULTS = {
|
|
|
45
67
|
// Installing the hooks is the opt-in; these exist to switch the behaviour
|
|
46
68
|
// back off for a project or a session without uninstalling anything.
|
|
47
69
|
ask_notifications: true,
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
require_idle: true,
|
|
70
|
+
// Questions reach devices immediately by default. Both a terminal-first
|
|
71
|
+
// grace and presence gating remain independent opt-in controls.
|
|
72
|
+
require_idle: false,
|
|
52
73
|
away_after_seconds: 120,
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
74
|
+
// Runtime waits stay inside a 480s budget. Harnesses that require a declared
|
|
75
|
+
// Stop limit use a preference-stable 540s; Codex uses its host-owned Stop
|
|
76
|
+
// default. Neither definition changes when these preferences do.
|
|
77
|
+
hook_reply_timeout_seconds: 480,
|
|
78
|
+
ask_grace_seconds: 0,
|
|
79
|
+
// On by default: the log is the only account of what a headless hook did, and
|
|
80
|
+
// a diagnostic nobody switched on before the thing went wrong is not one.
|
|
81
|
+
log_level: 'info',
|
|
82
|
+
// 2 MB × 3 files caps the logs at roughly 6 MB, which is weeks of ordinary
|
|
83
|
+
// agent traffic and small enough that nobody has to think about it.
|
|
84
|
+
log_max_bytes: 2_000_000,
|
|
85
|
+
log_max_files: 3,
|
|
57
86
|
};
|
|
87
|
+
/** The shipped value beneath every user-controlled configuration layer. */
|
|
88
|
+
export function configDefaultValue(key) {
|
|
89
|
+
return DEFAULTS[key];
|
|
90
|
+
}
|
|
58
91
|
export function globalConfigDir(env = process.env) {
|
|
59
92
|
const xdg = env['XDG_CONFIG_HOME'];
|
|
60
93
|
const base = xdg && xdg !== '' ? xdg : path.join(os.homedir(), '.config');
|
|
@@ -138,17 +171,24 @@ export function findProjectLocalConfigPath(startDir) {
|
|
|
138
171
|
* Ranges every layer is clamped to. Config is readable from a repository, so an
|
|
139
172
|
* out-of-range value is attacker input, not a typo: `away_after_seconds = -1`
|
|
140
173
|
* would make a user who just typed count as absent, and an oversized reply
|
|
141
|
-
* timeout would
|
|
142
|
-
*
|
|
174
|
+
* timeout would exhaust the hook process budget and kill it after the user has
|
|
175
|
+
* already answered.
|
|
143
176
|
*/
|
|
144
177
|
const NUMERIC_BOUNDS = {
|
|
145
178
|
wait_seconds: { min: 0, max: 300 },
|
|
146
179
|
ttl_seconds: { min: 0, max: 7 * 24 * 3600 },
|
|
147
180
|
away_after_seconds: { min: 5, max: 24 * 3600 },
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
|
|
151
|
-
|
|
181
|
+
// The runtime clamps grace + reply work below the host process ceiling; this
|
|
182
|
+
// maximum is never copied into the installed definition.
|
|
183
|
+
// The wire protocol's minimum reply window is 60s; matching it prevents the
|
|
184
|
+
// server from accepting an answer after a shorter local wait has returned.
|
|
185
|
+
hook_reply_timeout_seconds: { min: 60, max: 540 },
|
|
186
|
+
ask_grace_seconds: { min: 0, max: HOOK_TIMING.maxGraceSeconds },
|
|
187
|
+
// The floor keeps rotation from thrashing (a file smaller than a handful of
|
|
188
|
+
// records would rotate on nearly every write); the ceiling is the point past
|
|
189
|
+
// which "local diagnostics" has become "a database on your disk".
|
|
190
|
+
log_max_bytes: { min: 64_000, max: 100_000_000 },
|
|
191
|
+
log_max_files: { min: 1, max: 20 },
|
|
152
192
|
};
|
|
153
193
|
/** Drops values a layer must not be trusted to supply, rather than throwing. */
|
|
154
194
|
function coerce(key, value) {
|
|
@@ -160,6 +200,10 @@ function coerce(key, value) {
|
|
|
160
200
|
}
|
|
161
201
|
if (BOOLEAN_CONFIG_KEYS.includes(key))
|
|
162
202
|
return typeof value === 'boolean' ? value : undefined;
|
|
203
|
+
const allowed = ENUM_CONFIG_VALUES[key];
|
|
204
|
+
if (allowed !== undefined) {
|
|
205
|
+
return typeof value === 'string' && allowed.includes(value) ? value : undefined;
|
|
206
|
+
}
|
|
163
207
|
return value;
|
|
164
208
|
}
|
|
165
209
|
export function configBounds(key) {
|
|
@@ -219,6 +263,9 @@ export function loadConfig(options) {
|
|
|
219
263
|
away_after_seconds: resolve('away_after_seconds'),
|
|
220
264
|
hook_reply_timeout_seconds: resolve('hook_reply_timeout_seconds'),
|
|
221
265
|
ask_grace_seconds: resolve('ask_grace_seconds'),
|
|
266
|
+
log_level: resolve('log_level'),
|
|
267
|
+
log_max_bytes: resolve('log_max_bytes'),
|
|
268
|
+
log_max_files: resolve('log_max_files'),
|
|
222
269
|
};
|
|
223
270
|
}
|
|
224
271
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAoC5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AAgFpE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,UAAU;IACV,cAAc;IACd,aAAa;IACb,cAAc;IACd,SAAS;IACT,OAAO;IACP,oBAAoB;IACpB,SAAS;IACT,iBAAiB;IACjB,mBAAmB;IACnB,cAAc;IACd,oBAAoB;IACpB,4BAA4B;IAC5B,mBAAmB;IACnB,WAAW;IACX,eAAe;IACf,eAAe;CACP,CAAA;AAGV,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,mBAAmB;IACnB,cAAc;CACf,CAAA;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,cAAc;IACd,aAAa;IACb,oBAAoB;IACpB,4BAA4B;IAC5B,mBAAmB;IACnB,eAAe;IACf,eAAe;CAChB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAkD;IAC/E,SAAS,EAAE,UAAU;CACtB,CAAA;AAED,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,yBAAyB;IACnC,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,IAAI;IAClB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,kBAAkB,EAAE,IAAI;IACxB,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,IAAI;IACrB,0EAA0E;IAC1E,qEAAqE;IACrE,iBAAiB,EAAE,IAAI;IACvB,wEAAwE;IACxE,gEAAgE;IAChE,YAAY,EAAE,KAAK;IACnB,kBAAkB,EAAE,GAAG;IACvB,6EAA6E;IAC7E,0EAA0E;IAC1E,iEAAiE;IACjE,0BAA0B,EAAE,GAAG;IAC/B,iBAAiB,EAAE,CAAC;IACpB,8EAA8E;IAC9E,0EAA0E;IAC1E,SAAS,EAAE,MAAM;IACjB,2EAA2E;IAC3E,oEAAoE;IACpE,aAAa,EAAE,SAAS;IACxB,aAAa,EAAE,CAAC;CACoB,CAAA;AAEtC,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,GAAc;IAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAA;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACjF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AACnC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;AAC5F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChF,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACvE,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAA;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW,EAAE,MAAyB,OAAO,CAAC,GAAG;IACzF,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACxF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,SAAS,eAAe,CAAC,QAAgB,EAAE,IAAY;IACrD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChC,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QAClD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC/B,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;AACjD,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,OAAO,eAAe,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,cAAc,GAA6D;IAC/E,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;IAClC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;IAC3C,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE;IAC9C,6EAA6E;IAC7E,yDAAyD;IACzD,4EAA4E;IAC5E,2EAA2E;IAC3E,0BAA0B,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;IACjD,iBAAiB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,eAAe,EAAE;IAC/D,4EAA4E;IAC5E,6EAA6E;IAC7E,kEAAkE;IAClE,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE;IAChD,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;CACnC,CAAA;AAED,gFAAgF;AAChF,SAAS,MAAM,CAAC,GAAc,EAAE,KAAc;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5F,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACjF,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAA4B,CAAA;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAYD,MAAM,UAAU,UAAU,CAAC,OAM1B;IACC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;IACjC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACxC,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAA;IACxD,MAAM,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC7D,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxE,MAAM,UAAU,GAAG,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAE1F,SAAS,OAAO,CAAsB,GAAM;QAC1C,MAAM,MAAM,GAA8B;YACxC,CAAE,KAAiC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;YACjD,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,WAAW,IAAI,EAAE,EAAE,CAAC;YAC3E,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,iBAAiB,gBAAgB,IAAI,EAAE,EAAE,CAAC;YAChG,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,WAAW,IAAI,EAAE,EAAE,CAAC;YAC3E,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,UAAU,EAAE,CAAC;SACzC,CAAA;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAQ;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAChC,IAAI,OAAO,KAAK,SAAS;gBAAE,SAAQ;YACnC,OAAO,EAAE,KAAK,EAAE,OAAgB,EAAE,MAAM,EAAE,CAAA;QAC5C,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC7D,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC;QAC7B,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC;QACrC,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC;QACnC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC;QAC3B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;QACvB,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,CAAC;QACjD,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC;QAC3B,eAAe,EAAE,OAAO,CAAC,iBAAiB,CAAC;QAC3C,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC;QAC/C,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC;QACrC,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,CAAC;QACjD,0BAA0B,EAAE,OAAO,CAAC,4BAA4B,CAAC;QACjE,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC;QAC/C,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC;QAC/B,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC;QACvC,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC;KACxC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type FileLockObservation = {
|
|
2
|
+
phase: 'choosing-published';
|
|
3
|
+
entry: string;
|
|
4
|
+
} | {
|
|
5
|
+
phase: 'stale-entry';
|
|
6
|
+
entry: string;
|
|
7
|
+
} | {
|
|
8
|
+
phase: 'waiting';
|
|
9
|
+
blockers: string[];
|
|
10
|
+
};
|
|
11
|
+
interface FileLockOptions {
|
|
12
|
+
waitMs?: number;
|
|
13
|
+
observe?: (observation: FileLockObservation) => void;
|
|
14
|
+
/** Installer transactions report lock replacement after a successful action. */
|
|
15
|
+
strictRelease?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function withFileLock<T>(file: string, action: () => T, options?: FileLockOptions): T;
|
|
18
|
+
/**
|
|
19
|
+
* Serialize a read/merge/write transaction for one user-owned target file.
|
|
20
|
+
*
|
|
21
|
+
* This is the single installer-facing lock policy: the target's direct parent
|
|
22
|
+
* is a real current-user-owned directory, remains the same inode throughout,
|
|
23
|
+
* and the bakery rendezvous lives beside the target rather than inside it.
|
|
24
|
+
*/
|
|
25
|
+
export declare function withTargetFileLock<T>(target: string, action: () => T, options?: Omit<FileLockOptions, 'strictRelease'>): T;
|
|
26
|
+
export {};
|