@mono-agent/agent-app 0.8.0 → 0.9.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 +71 -22
- package/dist/account-home.d.ts +6 -0
- package/dist/account-home.d.ts.map +1 -0
- package/dist/account-home.js +9 -0
- package/dist/account-home.js.map +1 -0
- package/dist/app-config.d.ts +3 -1
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +8 -5
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts +25 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +237 -16
- package/dist/app.js.map +1 -1
- package/dist/background-environment.d.ts +16 -0
- package/dist/background-environment.d.ts.map +1 -0
- package/dist/background-environment.js +68 -0
- package/dist/background-environment.js.map +1 -0
- package/dist/background-runtime.d.ts +62 -0
- package/dist/background-runtime.d.ts.map +1 -0
- package/dist/background-runtime.js +1115 -0
- package/dist/background-runtime.js.map +1 -0
- package/dist/background-snapshot-key.d.ts +13 -0
- package/dist/background-snapshot-key.d.ts.map +1 -0
- package/dist/background-snapshot-key.js +194 -0
- package/dist/background-snapshot-key.js.map +1 -0
- package/dist/background-snapshot.d.ts +96 -0
- package/dist/background-snapshot.d.ts.map +1 -0
- package/dist/background-snapshot.js +450 -0
- package/dist/background-snapshot.js.map +1 -0
- package/dist/background-worker-lease.d.ts +39 -0
- package/dist/background-worker-lease.d.ts.map +1 -0
- package/dist/background-worker-lease.js +356 -0
- package/dist/background-worker-lease.js.map +1 -0
- package/dist/background.d.ts +74 -2
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +815 -73
- package/dist/background.js.map +1 -1
- package/dist/channel-plugins.d.ts +2 -0
- package/dist/channel-plugins.d.ts.map +1 -1
- package/dist/channel-plugins.js +8 -0
- package/dist/channel-plugins.js.map +1 -1
- package/dist/channels.d.ts +10 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +71 -3
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +12 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +341 -63
- package/dist/cli.js.map +1 -1
- package/dist/config-reference.d.ts.map +1 -1
- package/dist/config-reference.js +253 -0
- package/dist/config-reference.js.map +1 -1
- package/dist/configuration-proposal-tool.d.ts +7 -0
- package/dist/configuration-proposal-tool.d.ts.map +1 -1
- package/dist/configuration-proposal-tool.js +55 -6
- package/dist/configuration-proposal-tool.js.map +1 -1
- package/dist/configured-agent.d.ts +4 -0
- package/dist/configured-agent.d.ts.map +1 -1
- package/dist/configured-agent.js +15 -0
- package/dist/configured-agent.js.map +1 -1
- package/dist/continuation-command.d.ts +15 -0
- package/dist/continuation-command.d.ts.map +1 -0
- package/dist/continuation-command.js +170 -0
- package/dist/continuation-command.js.map +1 -0
- package/dist/continuation-config.d.ts +25 -0
- package/dist/continuation-config.d.ts.map +1 -0
- package/dist/continuation-config.js +236 -0
- package/dist/continuation-config.js.map +1 -0
- package/dist/continuation-service.d.ts +99 -0
- package/dist/continuation-service.d.ts.map +1 -0
- package/dist/continuation-service.js +1313 -0
- package/dist/continuation-service.js.map +1 -0
- package/dist/continuation-store.d.ts +104 -0
- package/dist/continuation-store.d.ts.map +1 -0
- package/dist/continuation-store.js +688 -0
- package/dist/continuation-store.js.map +1 -0
- package/dist/continuations.d.ts +167 -0
- package/dist/continuations.d.ts.map +1 -0
- package/dist/continuations.js +71 -0
- package/dist/continuations.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +426 -27
- package/dist/doctor.js.map +1 -1
- package/dist/first-run-managed-memory.d.ts.map +1 -1
- package/dist/first-run-managed-memory.js +66 -3
- package/dist/first-run-managed-memory.js.map +1 -1
- package/dist/first-run-readiness.d.ts.map +1 -1
- package/dist/first-run-readiness.js +2 -31
- package/dist/first-run-readiness.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +7 -2
- package/dist/init.js.map +1 -1
- package/dist/launchd.d.ts +16 -6
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +30 -15
- package/dist/launchd.js.map +1 -1
- package/dist/local-configuration.d.ts +61 -18
- package/dist/local-configuration.d.ts.map +1 -1
- package/dist/local-configuration.js +530 -145
- package/dist/local-configuration.js.map +1 -1
- package/dist/managed-runtime-packages.d.ts +9 -0
- package/dist/managed-runtime-packages.d.ts.map +1 -0
- package/dist/managed-runtime-packages.js +56 -0
- package/dist/managed-runtime-packages.js.map +1 -0
- package/dist/memory-embedding-service.d.ts +33 -0
- package/dist/memory-embedding-service.d.ts.map +1 -0
- package/dist/memory-embedding-service.js +207 -0
- package/dist/memory-embedding-service.js.map +1 -0
- package/dist/memory-recall.d.ts +5 -4
- package/dist/memory-recall.d.ts.map +1 -1
- package/dist/memory-recall.js +21 -8
- package/dist/memory-recall.js.map +1 -1
- package/dist/modules/catalog.d.ts.map +1 -1
- package/dist/modules/catalog.js +91 -9
- package/dist/modules/catalog.js.map +1 -1
- package/dist/notify-runtime.d.ts +26 -0
- package/dist/notify-runtime.d.ts.map +1 -0
- package/dist/notify-runtime.js +27 -0
- package/dist/notify-runtime.js.map +1 -0
- package/dist/notify-tool.d.ts +51 -0
- package/dist/notify-tool.d.ts.map +1 -0
- package/dist/notify-tool.js +182 -0
- package/dist/notify-tool.js.map +1 -0
- package/dist/proactive-notify.d.ts +2 -0
- package/dist/proactive-notify.d.ts.map +1 -1
- package/dist/proactive-notify.js +1 -0
- package/dist/proactive-notify.js.map +1 -1
- package/dist/process-incarnation.d.ts +23 -0
- package/dist/process-incarnation.d.ts.map +1 -0
- package/dist/process-incarnation.js +208 -0
- package/dist/process-incarnation.js.map +1 -0
- package/dist/project-skills.d.ts +1 -1
- package/dist/project-skills.js +6 -6
- package/dist/recipes/base.d.ts +15 -0
- package/dist/recipes/base.d.ts.map +1 -0
- package/dist/recipes/base.js +51 -0
- package/dist/recipes/base.js.map +1 -0
- package/dist/recipes/catalog.d.ts +4 -0
- package/dist/recipes/catalog.d.ts.map +1 -0
- package/dist/recipes/catalog.js +525 -0
- package/dist/recipes/catalog.js.map +1 -0
- package/dist/recipes/index.d.ts +11 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +14 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/recipes/types.d.ts +70 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +15 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/sandbox-manager.d.ts +17 -0
- package/dist/sandbox-manager.d.ts.map +1 -1
- package/dist/sandbox-manager.js +673 -127
- package/dist/sandbox-manager.js.map +1 -1
- package/dist/setup.d.ts +29 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +97 -0
- package/dist/setup.js.map +1 -0
- package/dist/supermemory-plugin.d.ts +5 -3
- package/dist/supermemory-plugin.d.ts.map +1 -1
- package/dist/supermemory-plugin.js +11 -5
- package/dist/supermemory-plugin.js.map +1 -1
- package/dist/tui-command.d.ts +43 -2
- package/dist/tui-command.d.ts.map +1 -1
- package/dist/tui-command.js +261 -27
- package/dist/tui-command.js.map +1 -1
- package/dist/wizard/answers.d.ts +4 -4
- package/dist/wizard/answers.d.ts.map +1 -1
- package/dist/wizard/answers.js +4 -21
- package/dist/wizard/answers.js.map +1 -1
- package/dist/wizard/run.d.ts.map +1 -1
- package/dist/wizard/run.js +162 -5
- package/dist/wizard/run.js.map +1 -1
- package/package.json +15 -15
- package/schema/mono-agent.config.schema.json +206 -3
- package/skills/mono-agent-composer/SKILL.md +4 -4
- package/skills/mono-agent-composer/references/config-blueprint.md +6 -6
- package/skills/mono-agent-composer/references/discovery-questions.md +25 -10
- package/skills/mono-agent-composer/references/feature-coverage.md +7 -7
- package/skills/mono-agent-composer/references/package-map.md +1 -1
- package/skills/mono-agent-composer/references/validation.md +2 -2
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { constants as fsConstants } from "node:fs";
|
|
3
|
+
import { chmod, lstat, mkdir, open, realpath, rename, rm, } from "node:fs/promises";
|
|
4
|
+
import { userInfo } from "node:os";
|
|
5
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
6
|
+
import process from "node:process";
|
|
7
|
+
import { currentProcessIncarnation, isSameProcessIncarnation as matchesProcessIncarnation, processIncarnationFromJson, } from "./process-incarnation.js";
|
|
8
|
+
const LEASE_SCHEMA = "mono-agent.background-worker-lease.v2";
|
|
9
|
+
const DEFAULT_OWNERLESS_GRACE_MS = 5 * 60_000;
|
|
10
|
+
const MAX_ACQUIRE_ATTEMPTS = 4;
|
|
11
|
+
/**
|
|
12
|
+
* Stable owner-private lifetime-lease path for one exact resolved config.
|
|
13
|
+
* The full path digest avoids relying on the shorter human-facing launchd hash.
|
|
14
|
+
*/
|
|
15
|
+
export function backgroundWorkerLeasePath(configPath, homeDir = effectiveUserHome()) {
|
|
16
|
+
const resolvedConfig = resolve(configPath);
|
|
17
|
+
const digest = createHash("sha256").update(resolvedConfig).digest("hex");
|
|
18
|
+
return join(resolve(homeDir), ".mono-agent", "worker-leases", `${digest}.lease`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Acquire the process-lifetime singleton for a config.
|
|
22
|
+
*
|
|
23
|
+
* `undefined` means either a live owner or a fresh ownerless directory (the
|
|
24
|
+
* atomic mkdir -> owner.json initialization window) already holds the lease.
|
|
25
|
+
* Dead owners and old ownerless crash debris are atomically quarantined before
|
|
26
|
+
* one bounded retry. The returned lease must be held until worker shutdown.
|
|
27
|
+
*/
|
|
28
|
+
export async function acquireBackgroundWorkerLease(configPath, options = {}) {
|
|
29
|
+
const resolvedConfig = await canonicalLeaseConfigPath(configPath);
|
|
30
|
+
// The singleton location belongs to the effective OS account, not an
|
|
31
|
+
// ambient HOME override. Tests and explicit embeddings retain a narrow
|
|
32
|
+
// homeDir seam, while normal workers always converge on one lease root.
|
|
33
|
+
const home = resolve(options.homeDir ?? effectiveUserHome());
|
|
34
|
+
const pid = options.pid ?? process.pid;
|
|
35
|
+
if (!Number.isSafeInteger(pid) || pid <= 0) {
|
|
36
|
+
throw new Error(`Background worker lease pid must be a positive safe integer; received ${String(pid)}.`);
|
|
37
|
+
}
|
|
38
|
+
const now = options.now ?? (() => Date.now());
|
|
39
|
+
const incarnation = options.processIncarnation ?? await currentProcessIncarnation();
|
|
40
|
+
const isSameProcess = options.isSameProcessIncarnation ?? matchesProcessIncarnation;
|
|
41
|
+
const randomToken = options.randomToken ?? randomUUID;
|
|
42
|
+
const ownerlessGraceMs = options.ownerlessGraceMs ?? DEFAULT_OWNERLESS_GRACE_MS;
|
|
43
|
+
if (!Number.isFinite(ownerlessGraceMs) || ownerlessGraceMs < 0) {
|
|
44
|
+
throw new Error("Background worker lease ownerless grace must be a non-negative finite duration.");
|
|
45
|
+
}
|
|
46
|
+
const leasesRoot = await ensurePrivateLeaseRoot(home);
|
|
47
|
+
const leasePath = backgroundWorkerLeasePath(resolvedConfig, home);
|
|
48
|
+
const leaseId = basename(leasePath, ".lease");
|
|
49
|
+
const ownerPath = join(leasePath, "owner.json");
|
|
50
|
+
for (let attempt = 0; attempt < MAX_ACQUIRE_ATTEMPTS; attempt += 1) {
|
|
51
|
+
let createdIdentity;
|
|
52
|
+
try {
|
|
53
|
+
await mkdir(leasePath, { mode: 0o700 });
|
|
54
|
+
const created = await assertPrivateDirectory(leasePath, "Background worker lease");
|
|
55
|
+
createdIdentity = identityOf(created);
|
|
56
|
+
await options.hooks?.afterLeaseDirectoryCreated?.();
|
|
57
|
+
await assertSamePrivateDirectory(leasePath, createdIdentity, "Background worker lease");
|
|
58
|
+
const token = safeToken(randomToken());
|
|
59
|
+
const owner = {
|
|
60
|
+
schema: LEASE_SCHEMA,
|
|
61
|
+
configPath: resolvedConfig,
|
|
62
|
+
pid,
|
|
63
|
+
token,
|
|
64
|
+
createdAt: new Date(now()).toISOString(),
|
|
65
|
+
incarnation,
|
|
66
|
+
};
|
|
67
|
+
await writeOwnerRecord(ownerPath, owner);
|
|
68
|
+
await assertSamePrivateDirectory(leasePath, createdIdentity, "Background worker lease");
|
|
69
|
+
return createLease({
|
|
70
|
+
configPath: resolvedConfig,
|
|
71
|
+
leasePath,
|
|
72
|
+
leasesRoot,
|
|
73
|
+
owner,
|
|
74
|
+
identity: createdIdentity,
|
|
75
|
+
leaseId,
|
|
76
|
+
randomToken,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (createdIdentity !== undefined) {
|
|
81
|
+
await removeIfSameDirectory(leasePath, createdIdentity).catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
if (!isErrno(error, "EEXIST"))
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
const existing = await inspectExistingLease(leasePath, ownerPath, resolvedConfig);
|
|
87
|
+
if (existing === undefined)
|
|
88
|
+
continue;
|
|
89
|
+
if (existing.kind === "owned") {
|
|
90
|
+
let sameOwner = true;
|
|
91
|
+
try {
|
|
92
|
+
sameOwner = await isSameProcess(existing.owner.pid, existing.owner.incarnation);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// A failed incarnation probe cannot authorize stealing another process's lease.
|
|
96
|
+
sameOwner = true;
|
|
97
|
+
}
|
|
98
|
+
if (sameOwner)
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
else if (now() - existing.mtimeMs < ownerlessGraceMs) {
|
|
102
|
+
// Never steal the normal mkdir -> owner.json initialization window.
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
await options.hooks?.beforeStaleLeaseRename?.();
|
|
106
|
+
if (!(await samePrivateDirectory(leasePath, existing.identity)))
|
|
107
|
+
continue;
|
|
108
|
+
const quarantine = join(leasesRoot, `.${leaseId}-${now()}-${pid}-${safeToken(randomToken())}.stale`);
|
|
109
|
+
try {
|
|
110
|
+
await rename(leasePath, quarantine);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (isErrno(error, "ENOENT") || isErrno(error, "EEXIST"))
|
|
114
|
+
continue;
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const moved = await lstat(quarantine);
|
|
118
|
+
if (!sameIdentity(moved, existing.identity)) {
|
|
119
|
+
// A same-user path swap crossed the final rename boundary. Restore when
|
|
120
|
+
// possible and fail closed rather than claiming a potentially live lease.
|
|
121
|
+
await rename(quarantine, leasePath).catch(() => undefined);
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
await rm(quarantine, { recursive: true, force: true });
|
|
125
|
+
}
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
async function canonicalLeaseConfigPath(configPath) {
|
|
129
|
+
const lexical = resolve(configPath);
|
|
130
|
+
try {
|
|
131
|
+
const candidate = join(await realpath(dirname(lexical)), basename(lexical));
|
|
132
|
+
try {
|
|
133
|
+
const details = await lstat(candidate);
|
|
134
|
+
return details.isSymbolicLink() ? candidate : await realpath(candidate);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (isErrno(error, "ENOENT") || isErrno(error, "ENOTDIR"))
|
|
138
|
+
return candidate;
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
// The lease helper is also useful for fail-closed diagnostics/tests before
|
|
144
|
+
// a config exists. Normal foreground startup has already required the
|
|
145
|
+
// config and therefore always takes the canonical-parent branch.
|
|
146
|
+
if (isErrno(error, "ENOENT") || isErrno(error, "ENOTDIR"))
|
|
147
|
+
return lexical;
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function effectiveUserHome() {
|
|
152
|
+
const home = userInfo().homedir;
|
|
153
|
+
if (home.length === 0) {
|
|
154
|
+
throw new Error("Cannot determine the effective OS user's home for the background worker lease.");
|
|
155
|
+
}
|
|
156
|
+
return home;
|
|
157
|
+
}
|
|
158
|
+
function createLease(input) {
|
|
159
|
+
let released = false;
|
|
160
|
+
return {
|
|
161
|
+
configPath: input.configPath,
|
|
162
|
+
path: input.leasePath,
|
|
163
|
+
ownerPid: input.owner.pid,
|
|
164
|
+
async release() {
|
|
165
|
+
if (released)
|
|
166
|
+
return;
|
|
167
|
+
await assertSamePrivateDirectory(input.leasePath, input.identity, "Background worker lease");
|
|
168
|
+
const current = await readOwnerRecord(join(input.leasePath, "owner.json"), input.configPath);
|
|
169
|
+
if (current === undefined
|
|
170
|
+
|| current.pid !== input.owner.pid
|
|
171
|
+
|| current.token !== input.owner.token) {
|
|
172
|
+
throw new Error(`Background worker lease ${input.leasePath} is no longer owned by this worker.`);
|
|
173
|
+
}
|
|
174
|
+
const releasedPath = join(input.leasesRoot, `.${input.leaseId}-${input.owner.pid}-${safeToken(input.randomToken())}.released`);
|
|
175
|
+
await rename(input.leasePath, releasedPath);
|
|
176
|
+
const moved = await assertPrivateDirectory(releasedPath, "Released background worker lease");
|
|
177
|
+
if (!sameIdentity(moved, input.identity)) {
|
|
178
|
+
await rename(releasedPath, input.leasePath).catch(() => undefined);
|
|
179
|
+
throw new Error(`Background worker lease ${input.leasePath} changed during release.`);
|
|
180
|
+
}
|
|
181
|
+
released = true;
|
|
182
|
+
await rm(releasedPath, { recursive: true, force: true });
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
async function ensurePrivateLeaseRoot(home) {
|
|
187
|
+
const homeDetails = await lstat(home);
|
|
188
|
+
if (!homeDetails.isDirectory() || homeDetails.isSymbolicLink()) {
|
|
189
|
+
throw new Error(`Background worker lease home ${home} must be a real directory.`);
|
|
190
|
+
}
|
|
191
|
+
assertOwned(homeDetails, home, "Background worker lease home");
|
|
192
|
+
const managedRoot = join(home, ".mono-agent");
|
|
193
|
+
const leasesRoot = join(managedRoot, "worker-leases");
|
|
194
|
+
for (const path of [managedRoot, leasesRoot]) {
|
|
195
|
+
try {
|
|
196
|
+
await mkdir(path, { mode: 0o700 });
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (!isErrno(error, "EEXIST"))
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
const before = await lstat(path);
|
|
203
|
+
if (!before.isDirectory() || before.isSymbolicLink()) {
|
|
204
|
+
throw new Error(`Background worker lease parent ${path} must be a real directory.`);
|
|
205
|
+
}
|
|
206
|
+
assertOwned(before, path, "Background worker lease parent");
|
|
207
|
+
await chmod(path, 0o700);
|
|
208
|
+
const secured = await lstat(path);
|
|
209
|
+
if (!sameIdentity(secured, identityOf(before))) {
|
|
210
|
+
throw new Error(`Background worker lease parent ${path} changed while it was secured.`);
|
|
211
|
+
}
|
|
212
|
+
assertPrivateDirectoryDetails(secured, path, "Background worker lease parent");
|
|
213
|
+
}
|
|
214
|
+
return leasesRoot;
|
|
215
|
+
}
|
|
216
|
+
async function inspectExistingLease(leasePath, ownerPath, configPath) {
|
|
217
|
+
let details;
|
|
218
|
+
try {
|
|
219
|
+
details = await assertPrivateDirectory(leasePath, "Existing background worker lease");
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (isErrno(error, "ENOENT"))
|
|
223
|
+
return undefined;
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
const identity = identityOf(details);
|
|
227
|
+
const owner = await readOwnerRecord(ownerPath, configPath);
|
|
228
|
+
return owner === undefined
|
|
229
|
+
? { kind: "ownerless", mtimeMs: details.mtimeMs, identity }
|
|
230
|
+
: { kind: "owned", owner, identity };
|
|
231
|
+
}
|
|
232
|
+
async function writeOwnerRecord(path, owner) {
|
|
233
|
+
const flags = fsConstants.O_WRONLY
|
|
234
|
+
| fsConstants.O_CREAT
|
|
235
|
+
| fsConstants.O_EXCL
|
|
236
|
+
| (fsConstants.O_NOFOLLOW ?? 0);
|
|
237
|
+
const handle = await open(path, flags, 0o600);
|
|
238
|
+
try {
|
|
239
|
+
await handle.writeFile(`${JSON.stringify(owner)}\n`, "utf8");
|
|
240
|
+
await handle.sync();
|
|
241
|
+
assertPrivateOwnerFile(await handle.stat(), path);
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
await handle.close();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async function readOwnerRecord(path, configPath) {
|
|
248
|
+
const flags = fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0);
|
|
249
|
+
let handle;
|
|
250
|
+
try {
|
|
251
|
+
handle = await open(path, flags);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
if (isErrno(error, "ENOENT"))
|
|
255
|
+
return undefined;
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
try {
|
|
259
|
+
assertPrivateOwnerFile(await handle.stat(), path);
|
|
260
|
+
let parsed;
|
|
261
|
+
try {
|
|
262
|
+
parsed = JSON.parse(await handle.readFile("utf8"));
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
const incarnation = processIncarnationFromJson(parsed.incarnation);
|
|
268
|
+
return parsed.schema === LEASE_SCHEMA
|
|
269
|
+
&& parsed.configPath === configPath
|
|
270
|
+
&& typeof parsed.pid === "number"
|
|
271
|
+
&& Number.isSafeInteger(parsed.pid)
|
|
272
|
+
&& parsed.pid > 0
|
|
273
|
+
&& typeof parsed.token === "string"
|
|
274
|
+
&& parsed.token.length > 0
|
|
275
|
+
&& typeof parsed.createdAt === "string"
|
|
276
|
+
&& incarnation !== undefined
|
|
277
|
+
? {
|
|
278
|
+
schema: LEASE_SCHEMA,
|
|
279
|
+
configPath,
|
|
280
|
+
pid: parsed.pid,
|
|
281
|
+
token: parsed.token,
|
|
282
|
+
createdAt: parsed.createdAt,
|
|
283
|
+
incarnation,
|
|
284
|
+
}
|
|
285
|
+
: undefined;
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
await handle.close();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async function assertPrivateDirectory(path, label) {
|
|
292
|
+
const details = await lstat(path);
|
|
293
|
+
assertPrivateDirectoryDetails(details, path, label);
|
|
294
|
+
return details;
|
|
295
|
+
}
|
|
296
|
+
function assertPrivateDirectoryDetails(details, path, label) {
|
|
297
|
+
if (!details.isDirectory() || details.isSymbolicLink()) {
|
|
298
|
+
throw new Error(`${label} ${path} must be a real directory.`);
|
|
299
|
+
}
|
|
300
|
+
assertOwned(details, path, label);
|
|
301
|
+
if ((details.mode & 0o077) !== 0) {
|
|
302
|
+
throw new Error(`${label} ${path} must be owner-only (mode 0700).`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function assertPrivateOwnerFile(details, path) {
|
|
306
|
+
if (!details.isFile()
|
|
307
|
+
|| details.isSymbolicLink()
|
|
308
|
+
|| details.nlink !== 1
|
|
309
|
+
|| (details.mode & 0o077) !== 0) {
|
|
310
|
+
throw new Error(`Background worker lease owner ${path} must be an owner-only single-link regular file.`);
|
|
311
|
+
}
|
|
312
|
+
assertOwned(details, path, "Background worker lease owner");
|
|
313
|
+
}
|
|
314
|
+
function assertOwned(details, path, label) {
|
|
315
|
+
if (typeof process.getuid === "function" && details.uid !== process.getuid()) {
|
|
316
|
+
throw new Error(`${label} ${path} is not owned by the current user.`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async function assertSamePrivateDirectory(path, identity, label) {
|
|
320
|
+
const details = await assertPrivateDirectory(path, label);
|
|
321
|
+
if (!sameIdentity(details, identity)) {
|
|
322
|
+
throw new Error(`${label} ${path} changed while the lease was active.`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async function samePrivateDirectory(path, identity) {
|
|
326
|
+
try {
|
|
327
|
+
const details = await assertPrivateDirectory(path, "Background worker lease");
|
|
328
|
+
return sameIdentity(details, identity);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
if (isErrno(error, "ENOENT"))
|
|
332
|
+
return false;
|
|
333
|
+
throw error;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
async function removeIfSameDirectory(path, identity) {
|
|
337
|
+
if (await samePrivateDirectory(path, identity)) {
|
|
338
|
+
await rm(path, { recursive: true, force: true });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function identityOf(details) {
|
|
342
|
+
return { dev: details.dev, ino: details.ino };
|
|
343
|
+
}
|
|
344
|
+
function sameIdentity(details, identity) {
|
|
345
|
+
return details.dev === identity.dev && details.ino === identity.ino;
|
|
346
|
+
}
|
|
347
|
+
function safeToken(value) {
|
|
348
|
+
if (!/^[0-9A-Za-z._-]+$/u.test(value) || value.length === 0) {
|
|
349
|
+
throw new Error("Background worker lease token contains unsupported characters.");
|
|
350
|
+
}
|
|
351
|
+
return value;
|
|
352
|
+
}
|
|
353
|
+
function isErrno(error, code) {
|
|
354
|
+
return typeof error === "object" && error !== null && error.code === code;
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=background-worker-lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-worker-lease.js","sourceRoot":"","sources":["../src/background-worker-lease.ts"],"names":[],"mappings":"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"}
|
package/dist/background.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { listRecordedRuns, listTraceSources } from "@mono-agent/observability";
|
|
2
2
|
import type { TraceSourceListItem } from "@mono-agent/observability";
|
|
3
3
|
import type { LaunchctlRunner, LaunchdPaths } from "./launchd.js";
|
|
4
|
+
import type { ManagedBackgroundRuntime, ManagedBackgroundRuntimeInput, ManagedRuntimeAdditionalPackage } from "./background-runtime.js";
|
|
5
|
+
import type { BackgroundSnapshot } from "./background-snapshot.js";
|
|
6
|
+
import type { ProcessIncarnation, SameProcessIncarnation } from "./process-incarnation.js";
|
|
7
|
+
export { acquireBackgroundWorkerLease, backgroundWorkerLeasePath, } from "./background-worker-lease.js";
|
|
8
|
+
export type { BackgroundWorkerLease, BackgroundWorkerLeaseOptions, } from "./background-worker-lease.js";
|
|
4
9
|
/**
|
|
5
10
|
* Background-service orchestration for the mono-agent CLI. The interactive
|
|
6
11
|
* control commands never talk to the worker directly: they derive a stable
|
|
@@ -22,7 +27,16 @@ export interface InstanceTarget {
|
|
|
22
27
|
readonly nodePath: string;
|
|
23
28
|
readonly cliPath: string;
|
|
24
29
|
readonly envFile?: string;
|
|
25
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Transient effective config environment reconstructed by the controller.
|
|
32
|
+
* It may contain secrets: never serialize, log, or materialize it in launchd.
|
|
33
|
+
*/
|
|
34
|
+
readonly configurationEnvironment: Readonly<Record<string, string | undefined>>;
|
|
35
|
+
readonly environment: Readonly<Record<string, string>>;
|
|
36
|
+
/** Exact wizard/approval snapshot this launch is allowed to claim ready. */
|
|
37
|
+
readonly expectedSnapshot?: BackgroundSnapshot;
|
|
38
|
+
/** Guided/configuration handoffs additionally require a usable TUI endpoint. */
|
|
39
|
+
readonly requireTui?: boolean;
|
|
26
40
|
}
|
|
27
41
|
export interface ResolveInstanceTargetInput {
|
|
28
42
|
readonly args: BackgroundCliArgs;
|
|
@@ -30,13 +44,24 @@ export interface ResolveInstanceTargetInput {
|
|
|
30
44
|
readonly cwd: string;
|
|
31
45
|
/** Absolute path to the running cli.js, baked into the plist. */
|
|
32
46
|
readonly cliPath: string;
|
|
47
|
+
readonly requireTui?: boolean;
|
|
33
48
|
}
|
|
49
|
+
/** Exact non-secret environment materialised into a managed LaunchAgent. */
|
|
50
|
+
export declare function managedBackgroundEnvironment(env: Readonly<Record<string, string | undefined>>): Readonly<Record<string, string>>;
|
|
34
51
|
/**
|
|
35
52
|
* Resolve everything the control commands need from CLI args. The registry dir
|
|
36
53
|
* and config path are resolved exactly as the worker will resolve them, so the
|
|
37
54
|
* detached launcher can find the worker's manifest without any IPC.
|
|
38
55
|
*/
|
|
39
56
|
export declare function resolveInstanceTarget(input: ResolveInstanceTargetInput): Promise<InstanceTarget>;
|
|
57
|
+
/**
|
|
58
|
+
* Collapse symlinked parent aliases without following the config's final path
|
|
59
|
+
* component. The final component is separately required to be a regular,
|
|
60
|
+
* non-symlink file before start; keeping it unresolved preserves that check.
|
|
61
|
+
* Missing parents remain addressable so stop/status/logs can still operate on
|
|
62
|
+
* a previously installed label after an agent folder is damaged or removed.
|
|
63
|
+
*/
|
|
64
|
+
export declare function canonicalBackgroundConfigPath(cwd: string, configuredPath?: string): Promise<string>;
|
|
40
65
|
export interface BackgroundDeps {
|
|
41
66
|
readonly runner: LaunchctlRunner;
|
|
42
67
|
readonly getuid: () => number;
|
|
@@ -53,6 +78,15 @@ export interface BackgroundDeps {
|
|
|
53
78
|
readonly rename: (oldPath: string, newPath: string) => Promise<void>;
|
|
54
79
|
/** True when a pid is still alive (or alive but owned by another user). */
|
|
55
80
|
readonly isAlive: (pid: number) => boolean;
|
|
81
|
+
/** Install/verify an immutable CLI outside npm/npx's disposable cache. */
|
|
82
|
+
readonly ensureManagedRuntime: (input: ManagedBackgroundRuntimeInput) => Promise<ManagedBackgroundRuntime>;
|
|
83
|
+
/** Resolve config-selected plugin-tier packages before the disposable source can disappear. */
|
|
84
|
+
readonly resolveManagedRuntimePackages?: (target: InstanceTarget) => Promise<readonly ManagedRuntimeAdditionalPackage[]>;
|
|
85
|
+
/** Fail closed when another lifecycle command owns this config label. */
|
|
86
|
+
readonly acquireLifecycleLock: (target: InstanceTarget) => Promise<(() => Promise<void>) | undefined>;
|
|
87
|
+
/** Prove a metadata-advertised TUI endpoint is actually reachable. */
|
|
88
|
+
readonly probeTui: (source: TraceSourceListItem) => Promise<boolean>;
|
|
89
|
+
readonly captureSnapshot?: (target: InstanceTarget) => Promise<BackgroundSnapshot>;
|
|
56
90
|
readonly stdout: (text: string) => void;
|
|
57
91
|
readonly stderr: (text: string) => void;
|
|
58
92
|
/** Run `tail` with inherited stdio; resolves with its exit code. */
|
|
@@ -66,13 +100,38 @@ export interface PollOptions {
|
|
|
66
100
|
export interface ReadyPollOptions extends PollOptions {
|
|
67
101
|
/** Only accept a worker that started at or after this time (restart safety). */
|
|
68
102
|
readonly sinceMs: number;
|
|
103
|
+
readonly requireTui?: boolean;
|
|
69
104
|
}
|
|
70
105
|
export declare const LAUNCHD_LOG_MAX_BYTES: number;
|
|
71
106
|
export declare const LAUNCHD_LOG_ROTATION_COUNT = 3;
|
|
107
|
+
export type BackgroundLaunchAction = "started" | "restarted";
|
|
108
|
+
export type BackgroundLaunchResult = {
|
|
109
|
+
readonly ok: true;
|
|
110
|
+
readonly action: BackgroundLaunchAction;
|
|
111
|
+
/** The fresh, authoritative worker trace that proved startup complete. */
|
|
112
|
+
readonly source: TraceSourceListItem;
|
|
113
|
+
} | {
|
|
114
|
+
readonly ok: false;
|
|
115
|
+
readonly action: "start" | "restart";
|
|
116
|
+
readonly reason: "runtime" | "snapshot" | "preparation" | "ownership" | "launchctl" | "readiness" | "timeout";
|
|
117
|
+
};
|
|
72
118
|
export declare function startBackground(target: InstanceTarget, deps: BackgroundDeps, poll?: PollOptions): Promise<number>;
|
|
73
119
|
/** Restart is behaviourally identical: ensure a single fresh running instance. */
|
|
74
120
|
export declare function restartBackground(target: InstanceTarget, deps: BackgroundDeps, poll?: PollOptions): Promise<number>;
|
|
75
|
-
|
|
121
|
+
/**
|
|
122
|
+
* Stop, perform the caller's stopped-worker mutation, and start again while
|
|
123
|
+
* retaining one lifecycle lock. This closes the force-restart gap in which a
|
|
124
|
+
* concurrent start could previously enter while the session store was purged.
|
|
125
|
+
*/
|
|
126
|
+
export declare function forceRestartBackground(target: InstanceTarget, deps: BackgroundDeps, whileStopped: () => Promise<void>, poll?: PollOptions): Promise<number>;
|
|
127
|
+
/**
|
|
128
|
+
* Ensure the canonical per-config LaunchAgent is running and return the fresh
|
|
129
|
+
* trace source that proved it reached `startup-complete`. This is the shared
|
|
130
|
+
* lifecycle boundary for CLI start/restart and remote configuration handoffs;
|
|
131
|
+
* callers must not open a console when the result is not ok.
|
|
132
|
+
*/
|
|
133
|
+
export declare function ensureBackgroundReady(target: InstanceTarget, deps: BackgroundDeps, poll?: PollOptions): Promise<BackgroundLaunchResult>;
|
|
134
|
+
export declare function stopBackground(target: InstanceTarget, deps: BackgroundDeps, poll?: PollOptions): Promise<number>;
|
|
76
135
|
export declare function statusBackground(target: InstanceTarget, deps: BackgroundDeps): Promise<number>;
|
|
77
136
|
export interface LogOptions {
|
|
78
137
|
readonly follow: boolean;
|
|
@@ -81,6 +140,19 @@ export interface LogOptions {
|
|
|
81
140
|
export declare function tailLogs(target: InstanceTarget, deps: BackgroundDeps, options: LogOptions): Promise<number>;
|
|
82
141
|
export declare function pollInstanceReady(target: InstanceTarget, deps: BackgroundDeps, options: ReadyPollOptions): Promise<TraceSourceListItem | undefined>;
|
|
83
142
|
export declare function printInstanceInfo(source: TraceSourceListItem, target: InstanceTarget, deps: BackgroundDeps, verb: string): void;
|
|
143
|
+
export interface FilesystemLifecycleLockOptions {
|
|
144
|
+
readonly pid?: number;
|
|
145
|
+
readonly now?: () => number;
|
|
146
|
+
/** Legacy owner-record compatibility only; new records use incarnation identity. */
|
|
147
|
+
readonly isProcessAlive?: (pid: number) => boolean;
|
|
148
|
+
readonly processIncarnation?: ProcessIncarnation;
|
|
149
|
+
readonly isSameProcessIncarnation?: SameProcessIncarnation;
|
|
150
|
+
readonly ownerlessGraceMs?: number;
|
|
151
|
+
readonly randomToken?: () => string;
|
|
152
|
+
/** Deterministic seam immediately after the final identity check. */
|
|
153
|
+
readonly beforeStaleLockRename?: () => Promise<void>;
|
|
154
|
+
}
|
|
155
|
+
export declare function acquireFilesystemLifecycleLock(target: InstanceTarget, options?: FilesystemLifecycleLockOptions): Promise<(() => Promise<void>) | undefined>;
|
|
84
156
|
export declare function describeChannel(value: unknown): {
|
|
85
157
|
kind: string;
|
|
86
158
|
text: string;
|
package/dist/background.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"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"}
|