abtars 0.1.0-alpha.13 → 0.1.0-alpha.15

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.
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  showHintOnce,
5
5
  update
6
- } from "./chunk-3Z3EP7E6.js";
6
+ } from "./chunk-XIEKGESU.js";
7
7
  import {
8
8
  install
9
9
  } from "./chunk-RB3X66KM.js";
@@ -1036,7 +1036,7 @@ Next: cd into the abtars repo and run 'abtars update' to build and activate.
1036
1036
  process.stdout.write(`
1037
1037
  \u2500\u2500 Running 'abtars update' \u2500\u2500
1038
1038
  `);
1039
- const { update: update2 } = await import("./update-U7M63AAV.js");
1039
+ const { update: update2 } = await import("./update-RWL26Q5R.js");
1040
1040
  const updRc = await update2({ source: "local", fromLocal: true, allowAbmindMismatch: false });
1041
1041
  if (updRc !== 0) {
1042
1042
  process.stderr.write(`
@@ -1398,7 +1398,7 @@ async function main(argv) {
1398
1398
  return await startCmd();
1399
1399
  }
1400
1400
  case "daemon": {
1401
- const { daemon: daemonCmd } = await import("./daemon-KGP6PZ5P.js");
1401
+ const { daemon: daemonCmd } = await import("./daemon-VIBI3SQQ.js");
1402
1402
  return await daemonCmd(argv.slice(1));
1403
1403
  }
1404
1404
  case "logs": {
@@ -0,0 +1,541 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+ import {
4
+ RETENTION,
5
+ acquireLock,
6
+ activate,
7
+ emptyManifest,
8
+ hashFile,
9
+ packagePaths,
10
+ pruneReleases,
11
+ readManifest,
12
+ writeManifest
13
+ } from "./chunk-HXJRZWKA.js";
14
+ import {
15
+ init_log_and_swallow,
16
+ logAndSwallow
17
+ } from "./chunk-EX2SRTUE.js";
18
+
19
+ // src/cli/commands/update.ts
20
+ init_log_and_swallow();
21
+ import { hostname } from "node:os";
22
+ import { join as join4, dirname } from "node:path";
23
+ import { readFileSync as readFileSync3, existsSync as existsSync4, mkdirSync } from "node:fs";
24
+ import { copyFile as copyFile2, mkdir as mkdir3, chmod, readdir, readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
25
+
26
+ // src/cli/update-sources/local.ts
27
+ import { spawnSync } from "node:child_process";
28
+ import { existsSync } from "node:fs";
29
+ import { copyFile, cp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
30
+ import { join } from "node:path";
31
+ var LocalBuildError = class extends Error {
32
+ constructor(message, hint) {
33
+ super(hint ? `${message}
34
+
35
+ ${hint}` : message);
36
+ this.hint = hint;
37
+ this.name = "LocalBuildError";
38
+ }
39
+ };
40
+ function runCmd(cmd, args, cwd) {
41
+ const r = spawnSync(cmd, args, { cwd, encoding: "utf-8" });
42
+ if (r.error) throw new LocalBuildError(`${cmd} ${args.join(" ")} failed: ${r.error.message}`);
43
+ if (r.status !== 0) {
44
+ throw new LocalBuildError(
45
+ `${cmd} ${args.join(" ")} exited with status ${r.status}`,
46
+ r.stderr?.trim() || void 0
47
+ );
48
+ }
49
+ return r.stdout.trim();
50
+ }
51
+ function tryCmd(cmd, args, cwd) {
52
+ const r = spawnSync(cmd, args, { cwd, encoding: "utf-8" });
53
+ if (r.status !== 0) return null;
54
+ return r.stdout.trim();
55
+ }
56
+ function checkStaleness(repoRoot, allowStale) {
57
+ const commit = runCmd("git", ["rev-parse", "--short", "HEAD"], repoRoot);
58
+ const branch = tryCmd("git", ["rev-parse", "--abbrev-ref", "HEAD"], repoRoot);
59
+ if (allowStale) return { commit, branch: branch === "HEAD" ? null : branch };
60
+ if (branch === "HEAD" || branch === null) {
61
+ throw new LocalBuildError(
62
+ "Working tree is in detached HEAD (no current branch).",
63
+ "Cannot check for staleness. Pass --from-local to proceed with the current tree."
64
+ );
65
+ }
66
+ runCmd("git", ["fetch", "--quiet"], repoRoot);
67
+ const upstream = tryCmd("git", ["rev-parse", "--abbrev-ref", `${branch}@{upstream}`], repoRoot);
68
+ if (upstream === null) {
69
+ throw new LocalBuildError(
70
+ `Branch '${branch}' has no upstream configured.`,
71
+ "Cannot check for staleness. Push the branch, or pass --from-local to proceed with the current tree."
72
+ );
73
+ }
74
+ const behindStr = tryCmd("git", ["rev-list", "--count", `HEAD..${upstream}`], repoRoot);
75
+ const behind = behindStr === null ? null : Number(behindStr);
76
+ if (behind === null || !Number.isFinite(behind)) {
77
+ throw new LocalBuildError(
78
+ `Could not determine how far HEAD is behind ${upstream}.`,
79
+ "Pass --from-local to proceed anyway."
80
+ );
81
+ }
82
+ if (behind > 0) {
83
+ throw new LocalBuildError(
84
+ `Current branch: ${branch} (${commit})
85
+ ${upstream} is ahead by ${behind} commit${behind === 1 ? "" : "s"}.`,
86
+ `Run 'git pull' first, or pass --from-local to build from the current tree.`
87
+ );
88
+ }
89
+ return { commit, branch };
90
+ }
91
+ async function readPackageVersion(repoRoot) {
92
+ const pkg = JSON.parse(await readFile(join(repoRoot, "package.json"), "utf-8"));
93
+ if (typeof pkg.version !== "string") {
94
+ throw new LocalBuildError("package.json has no version field.");
95
+ }
96
+ return pkg.version;
97
+ }
98
+ function makeLocalBuildSource(opts = {}) {
99
+ const repoRoot = opts.repoRoot ?? process.cwd();
100
+ const isNpmPackage = !existsSync(join(repoRoot, ".git"));
101
+ return {
102
+ name: "local",
103
+ async prepare(ctx) {
104
+ if (isNpmPackage) {
105
+ const bundleDir = join(repoRoot, "bundle");
106
+ if (!existsSync(bundleDir)) {
107
+ throw new Error(`No bundle/ found at ${repoRoot}. Run from the abtars npm package or a git checkout.`);
108
+ }
109
+ const pkgVersion2 = await readPackageVersion(repoRoot);
110
+ const version2 = pkgVersion2;
111
+ const stagedPath2 = join(ctx.releasesDir, version2);
112
+ await rm(stagedPath2, { recursive: true, force: true });
113
+ await mkdir(stagedPath2, { recursive: true });
114
+ await cp(bundleDir, join(stagedPath2, "bundle"), { recursive: true });
115
+ const coreDir = join(repoRoot, "core");
116
+ if (existsSync(coreDir)) await cp(coreDir, join(stagedPath2, "core"), { recursive: true });
117
+ const scriptsSrc = join(repoRoot, "scripts");
118
+ if (existsSync(scriptsSrc)) await cp(scriptsSrc, join(stagedPath2, "scripts"), { recursive: true });
119
+ const manifestSrc = join(repoRoot, "install-manifest.json");
120
+ if (existsSync(manifestSrc)) await copyFile(manifestSrc, join(stagedPath2, "install-manifest.json"));
121
+ await writeFile(join(stagedPath2, "package.json"), JSON.stringify({ type: "module", name: "abtars", version: version2 }, null, 2) + "\n");
122
+ process.stdout.write(`\u2713 staged ${version2} (from npm package)
123
+ `);
124
+ return { version: version2, stagedPath: stagedPath2, commit: null, branch: null, packageLockHash: null, source: "local" };
125
+ }
126
+ const { commit, branch } = checkStaleness(repoRoot, opts.allowStale === true || ctx.allowStale);
127
+ const pkgVersion = await readPackageVersion(repoRoot);
128
+ const version = `${pkgVersion}-${commit}`;
129
+ if (opts.skipInstall !== true) {
130
+ runCmd("npm", ["install", "--no-audit", "--no-fund"], repoRoot);
131
+ }
132
+ const useBundle = process.env["AGENTBRIDGE_BUILD_MODE"] !== "tsc";
133
+ if (useBundle) {
134
+ runCmd("npm", ["run", "bundle"], repoRoot);
135
+ const stagedPath2 = join(ctx.releasesDir, version);
136
+ await rm(stagedPath2, { recursive: true, force: true });
137
+ await mkdir(stagedPath2, { recursive: true });
138
+ await cp(join(repoRoot, "bundle"), join(stagedPath2, "bundle"), { recursive: true });
139
+ const coreSkillsSrc = join(repoRoot, "core", "skills");
140
+ if (existsSync(coreSkillsSrc)) {
141
+ await cp(coreSkillsSrc, join(stagedPath2, "core", "skills"), { recursive: true });
142
+ }
143
+ await writeFile(join(stagedPath2, "package.json"), JSON.stringify({ type: "module", name: "abtars", version }, null, 2) + "\n");
144
+ await copyFile(join(repoRoot, "install-manifest.json"), join(stagedPath2, "install-manifest.json"));
145
+ const packageLockHash2 = await hashFile(join(repoRoot, "package-lock.json"));
146
+ return { version, stagedPath: stagedPath2, commit, branch, packageLockHash: packageLockHash2, source: "local" };
147
+ }
148
+ runCmd("npm", ["run", "build"], repoRoot);
149
+ const stagedPath = join(ctx.releasesDir, version);
150
+ await rm(stagedPath, { recursive: true, force: true });
151
+ await mkdir(stagedPath, { recursive: true });
152
+ await cp(join(repoRoot, "dist"), join(stagedPath, "dist"), { recursive: true });
153
+ await copyFile(join(repoRoot, "install-manifest.json"), join(stagedPath, "install-manifest.json"));
154
+ await rm(ctx.nodeModulesDir, { recursive: true, force: true });
155
+ await mkdir(ctx.nodeModulesDir, { recursive: true });
156
+ const rsyncResult = spawnSync(
157
+ "rsync",
158
+ ["-aL", "--quiet", `${join(repoRoot, "node_modules")}/`, `${ctx.nodeModulesDir}/`],
159
+ { stdio: "inherit" }
160
+ );
161
+ if (rsyncResult.status !== 0) {
162
+ throw new LocalBuildError(
163
+ `rsync of node_modules failed (status ${rsyncResult.status ?? -1})`,
164
+ `Ensure rsync is installed. Falling back to node cp would re-create symlinks.`
165
+ );
166
+ }
167
+ const packageLockHash = await hashFile(join(repoRoot, "package-lock.json"));
168
+ return { version, stagedPath, commit, branch, packageLockHash, source: "local" };
169
+ }
170
+ };
171
+ }
172
+
173
+ // src/cli/update-sources/npm.ts
174
+ import { spawnSync as spawnSync2 } from "node:child_process";
175
+ import { existsSync as existsSync2, readFileSync, unlinkSync } from "node:fs";
176
+ import { mkdir as mkdir2, rm as rm2 } from "node:fs/promises";
177
+ import { join as join2 } from "node:path";
178
+ var TIMEOUT_MS = 6e4;
179
+ function run(cmd, args, cwd) {
180
+ const r = spawnSync2(cmd, args, { cwd, encoding: "utf-8", timeout: TIMEOUT_MS });
181
+ if (r.error) throw new Error(`${cmd} ${args.join(" ")}: ${r.error.message}`);
182
+ if (r.status !== 0) throw new Error(`${cmd} ${args.join(" ")} exited ${r.status}: ${r.stderr?.trim()}`);
183
+ return r.stdout.trim();
184
+ }
185
+ function readLocalVersion(home) {
186
+ try {
187
+ const pkg = JSON.parse(readFileSync(join2(home, "current", "package.json"), "utf-8"));
188
+ return pkg.version ?? null;
189
+ } catch {
190
+ return null;
191
+ }
192
+ }
193
+ function makeNpmSource(packageName) {
194
+ return {
195
+ name: "npm",
196
+ async prepare(ctx) {
197
+ const latest = run("npm", ["view", packageName, "version"], ctx.home);
198
+ const current = readLocalVersion(ctx.home);
199
+ if (latest === current) {
200
+ throw new Error(`Already at latest version (${latest}). Nothing to update.`);
201
+ }
202
+ const stagedPath = join2(ctx.releasesDir, latest);
203
+ await rm2(stagedPath, { recursive: true, force: true });
204
+ await mkdir2(stagedPath, { recursive: true });
205
+ run("npm", ["pack", `${packageName}@${latest}`, "--pack-destination", stagedPath], stagedPath);
206
+ const tgzName = `${packageName}-${latest}.tgz`.replace("@", "").replace("/", "-");
207
+ const tgzPath = join2(stagedPath, tgzName);
208
+ run("tar", ["-xzf", tgzPath, "--strip-components=1"], stagedPath);
209
+ if (existsSync2(tgzPath)) unlinkSync(tgzPath);
210
+ run("npm", ["install", "--omit=dev", "--no-audit", "--no-fund"], stagedPath);
211
+ return { version: latest, stagedPath, commit: null, branch: null, packageLockHash: null, source: "npm" };
212
+ }
213
+ };
214
+ }
215
+
216
+ // src/components/hints.ts
217
+ import { existsSync as existsSync3, readFileSync as readFileSync2, writeFileSync, renameSync } from "node:fs";
218
+ import { join as join3 } from "node:path";
219
+ function manifestPath() {
220
+ const home = process.env["ABTARS_HOME"] ?? join3(process.env["HOME"] ?? "", ".abtars");
221
+ return join3(home, "manifest.json");
222
+ }
223
+ function readManifest2() {
224
+ const path = manifestPath();
225
+ if (!existsSync3(path)) return {};
226
+ try {
227
+ return JSON.parse(readFileSync2(path, "utf-8"));
228
+ } catch {
229
+ return {};
230
+ }
231
+ }
232
+ function writeManifestAtomic(data) {
233
+ const path = manifestPath();
234
+ const tmp = path + ".tmp";
235
+ writeFileSync(tmp, JSON.stringify(data, null, 2) + "\n");
236
+ renameSync(tmp, path);
237
+ }
238
+ function showHintOnce(id, text) {
239
+ const manifest = readManifest2();
240
+ const seen = manifest["hintsSeen"] ?? {};
241
+ if (seen[id]) return;
242
+ process.stderr.write(`
243
+ \u{1F4A1} ${text}
244
+
245
+ `);
246
+ seen[id] = (/* @__PURE__ */ new Date()).toISOString();
247
+ manifest["hintsSeen"] = seen;
248
+ writeManifestAtomic(manifest);
249
+ }
250
+
251
+ // src/cli/commands/update.ts
252
+ function readJsonField(file, field) {
253
+ try {
254
+ return JSON.parse(readFileSync3(file, "utf-8"))[field];
255
+ } catch {
256
+ return void 0;
257
+ }
258
+ }
259
+ async function update(opts) {
260
+ if (opts.source !== "local" && opts.source !== "npm") {
261
+ process.stderr.write(`--source ${opts.source} is not yet supported.
262
+ Use --source local (default) or --source npm.
263
+ `);
264
+ return 2;
265
+ }
266
+ const paths = packagePaths("abtars");
267
+ if (!existsSync4(paths.releases) && existsSync4(join4(paths.home, "current"))) {
268
+ process.stdout.write("Migrating old layout \u2192 releases/...\n");
269
+ mkdirSync(paths.releases, { recursive: true });
270
+ }
271
+ const release = await acquireLock(paths.lock, `update --source ${opts.source}`);
272
+ try {
273
+ let repoRoot = opts.repoRoot ?? process.cwd();
274
+ if (!opts.repoRoot && !existsSync4(join4(repoRoot, ".git"))) {
275
+ const { realpathSync } = await import("node:fs");
276
+ const scriptPath = realpathSync(process.argv[1] ?? "");
277
+ const candidate = join4(dirname(scriptPath), "..");
278
+ if (existsSync4(join4(candidate, "bundle"))) repoRoot = candidate;
279
+ }
280
+ const source = opts.source === "npm" ? makeNpmSource("abtars") : makeLocalBuildSource({ repoRoot, allowStale: opts.fromLocal });
281
+ if (opts.fromLocal) {
282
+ showHintOnce("update-from-local", "Building from working copy (--from-local). To sync with remote first: git pull && abtars update");
283
+ }
284
+ process.stdout.write(`Building from local checkout (${process.cwd()})...
285
+ `);
286
+ const staged = await source.prepare({
287
+ releasesDir: paths.releases,
288
+ nodeModulesDir: paths.nodeModules,
289
+ home: paths.home,
290
+ allowStale: opts.fromLocal
291
+ });
292
+ process.stdout.write(`\u2713 staged ${staged.version} at ${staged.stagedPath}
293
+ `);
294
+ {
295
+ const pkgPath = join4(staged.stagedPath, "package.json");
296
+ const { readFileSync: readFileSync4, writeFileSync: writeFileSync2 } = await import("node:fs");
297
+ try {
298
+ const pkg = JSON.parse(readFileSync4(pkgPath, "utf-8"));
299
+ const externals = { patchright: "^1.59.4", "rettiwt-api": "^4.1.3" };
300
+ pkg.dependencies = { ...pkg.dependencies, ...externals };
301
+ writeFileSync2(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
302
+ const { execSync } = await import("node:child_process");
303
+ execSync("npm install --omit=dev --ignore-scripts 2>/dev/null", { cwd: staged.stagedPath, timeout: 6e4 });
304
+ process.stdout.write(`\u2713 external deps installed
305
+ `);
306
+ } catch (err) {
307
+ process.stdout.write(`\u26A0 external deps install failed: ${err instanceof Error ? err.message : String(err)}
308
+ `);
309
+ }
310
+ }
311
+ {
312
+ const { existsSync: existsSync5, unlinkSync: unlinkSync2, symlinkSync } = await import("node:fs");
313
+ const mainLink = join4(staged.stagedPath, "main.js");
314
+ try {
315
+ unlinkSync2(mainLink);
316
+ } catch (err) {
317
+ logAndSwallow("update", "op", err);
318
+ }
319
+ const entry = existsSync5(join4(staged.stagedPath, "bundle", "abtars.js")) ? "bundle/abtars.js" : "dist/main.js";
320
+ symlinkSync(entry, mainLink);
321
+ }
322
+ const { existsSync: ex2, lstatSync, readlinkSync, symlinkSync: sl2, mkdirSync: mk2 } = await import("node:fs");
323
+ const oldNm = join4(paths.home, "current", "node_modules");
324
+ const preservedLinks = [];
325
+ if (ex2(oldNm)) {
326
+ for (const name of ["abmind", "better-sqlite3"]) {
327
+ const p = join4(oldNm, name);
328
+ try {
329
+ if (ex2(p) && lstatSync(p).isSymbolicLink()) preservedLinks.push({ name, target: readlinkSync(p) });
330
+ } catch {
331
+ }
332
+ }
333
+ }
334
+ await activate(paths.current, staged.version);
335
+ process.stdout.write(`\u2713 current -> releases/${staged.version}
336
+ `);
337
+ if (preservedLinks.length > 0) {
338
+ const newNm = join4(paths.home, "current", "node_modules");
339
+ mk2(newNm, { recursive: true });
340
+ for (const { name, target } of preservedLinks) {
341
+ try {
342
+ sl2(target, join4(newNm, name));
343
+ } catch {
344
+ }
345
+ }
346
+ }
347
+ const prior = await readManifest(paths.manifest);
348
+ const now = (/* @__PURE__ */ new Date()).toISOString();
349
+ const newPriorReleases = prior?.version ? [
350
+ {
351
+ version: prior.version,
352
+ commit: prior.commit,
353
+ activatedAt: prior.activatedAt,
354
+ packageLockHash: prior.packageLockHash
355
+ },
356
+ ...prior.priorReleases ?? []
357
+ ].slice(0, RETENTION - 1) : prior?.priorReleases ?? [];
358
+ await writeManifest(paths.manifest, {
359
+ ...prior ?? emptyManifest("abtars", hostname()),
360
+ version: staged.version,
361
+ commit: staged.commit,
362
+ branch: staged.branch,
363
+ packageLockHash: staged.packageLockHash,
364
+ activatedAt: now,
365
+ source: "local",
366
+ priorReleases: newPriorReleases
367
+ });
368
+ process.stdout.write(`\u2713 manifest updated
369
+ `);
370
+ const pruned = await pruneReleases(
371
+ paths.releases,
372
+ [staged.version, ...newPriorReleases.map((r) => r.version)],
373
+ staged.version,
374
+ RETENTION
375
+ );
376
+ if (pruned.length > 0) {
377
+ process.stdout.write(`\u2713 pruned ${pruned.length} old release${pruned.length === 1 ? "" : "s"}: ${pruned.join(", ")}
378
+ `);
379
+ }
380
+ process.stdout.write(`
381
+ Update complete: ${staged.version}
382
+ `);
383
+ const { loadManifest } = await import("./install-manifest-MCJCAYSR.js");
384
+ const installManifest = loadManifest(process.cwd());
385
+ const repoScripts = join4(process.cwd(), "scripts");
386
+ const destScripts = join4(paths.home, "scripts");
387
+ await mkdir3(destScripts, { recursive: true });
388
+ const allScriptFiles = await readdir(repoScripts).catch(() => []);
389
+ const matchesInclude = (name) => installManifest.scripts.include.some((pattern) => {
390
+ const ext = pattern.replace("*", "");
391
+ return name.endsWith(ext);
392
+ });
393
+ const scriptFiles = allScriptFiles.filter(matchesInclude);
394
+ const home = process.env["HOME"] ?? "";
395
+ let serviceChanged = false;
396
+ const installMode = (await readManifest(paths.manifest))?.installMode ?? "supervised";
397
+ const isExecutable = (name) => {
398
+ const ext = installManifest.scripts.executable.replace("*", "");
399
+ return name.endsWith(ext);
400
+ };
401
+ for (const name of scriptFiles) {
402
+ await copyFile2(join4(repoScripts, name), join4(destScripts, name));
403
+ if (isExecutable(name)) await chmod(join4(destScripts, name), 493);
404
+ if (isExecutable(name)) {
405
+ await copyFile2(join4(repoScripts, name), join4(paths.home, name));
406
+ await chmod(join4(paths.home, name), 493);
407
+ }
408
+ const macService = installManifest.services.supervised.macos;
409
+ if (macService && name === macService.plist && process.platform === "darwin" && home && installMode === "supervised") {
410
+ const launchAgentsDir = join4(home, "Library", "LaunchAgents");
411
+ await mkdir3(launchAgentsDir, { recursive: true });
412
+ const dst = join4(launchAgentsDir, name);
413
+ const oldContent = await readFile2(dst, "utf-8").catch(() => "");
414
+ let templated = await readFile2(join4(repoScripts, name), "utf-8");
415
+ for (const ph of macService.placeholders) templated = templated.replaceAll(ph, home);
416
+ await writeFile2(dst, templated);
417
+ if (oldContent !== templated) serviceChanged = true;
418
+ }
419
+ const linuxService = installManifest.services.supervised.linux;
420
+ if (linuxService?.units.includes(name) && process.platform === "linux" && home && installMode === "supervised") {
421
+ const systemdDir = join4(home, ".config", "systemd", "user");
422
+ await mkdir3(systemdDir, { recursive: true });
423
+ const dst = join4(systemdDir, name);
424
+ const oldContent = await readFile2(dst, "utf-8").catch(() => "");
425
+ await copyFile2(join4(repoScripts, name), dst);
426
+ const newContent = await readFile2(dst, "utf-8").catch(() => "");
427
+ if (oldContent !== newContent) serviceChanged = true;
428
+ }
429
+ }
430
+ process.stdout.write(`\u2713 scripts refreshed (${scriptFiles.length} files)
431
+ `);
432
+ const { writeWrapper } = await import("./install-AJ7VW76P.js");
433
+ await mkdir3(paths.bin, { recursive: true });
434
+ for (const name of installManifest.cliWrappers) {
435
+ await writeWrapper(paths.bin, name, paths.current, false);
436
+ }
437
+ process.stdout.write(`\u2713 wrappers refreshed (${installManifest.cliWrappers.length} files)
438
+ `);
439
+ const { rmSync, cpSync, readdirSync } = await import("node:fs");
440
+ const skillsCoreSrc = join4(staged.stagedPath, "core", "skills");
441
+ const skillsCoreDst = join4(paths.home, "skills", "core");
442
+ if (existsSync4(skillsCoreSrc)) {
443
+ rmSync(skillsCoreDst, { recursive: true, force: true });
444
+ cpSync(skillsCoreSrc, skillsCoreDst, { recursive: true });
445
+ const files = readdirSync(skillsCoreDst, { recursive: true });
446
+ const count = files.filter((f) => f.endsWith("SKILL.md")).length;
447
+ process.stdout.write(`\u2713 skills/core synced (${count} skills)
448
+ `);
449
+ }
450
+ for (const d of ["custom", "downloaded", "self"]) {
451
+ await mkdir3(join4(paths.home, "skills", d), { recursive: true });
452
+ }
453
+ for (const stale of ["memory", "ops", "tools", "coding"]) {
454
+ const p = join4(paths.home, "skills", stale);
455
+ if (existsSync4(p)) {
456
+ rmSync(p, { recursive: true, force: true });
457
+ }
458
+ }
459
+ if (serviceChanged) {
460
+ if (process.platform === "darwin") {
461
+ process.stdout.write(`\u26A0\uFE0F LaunchAgent plist updated \u2014 reload with: launchctl bootout gui/$(id -u)/com.abtars.watchdog && launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist
462
+ `);
463
+ } else {
464
+ process.stdout.write(`\u26A0\uFE0F systemd service updated \u2014 reload with: systemctl --user daemon-reload && systemctl --user restart abtars-watchdog
465
+ `);
466
+ }
467
+ }
468
+ void hashFile;
469
+ const { ensureInstallInvariants } = await import("./ensure-invariants-K2ZUZ6NR.js");
470
+ const invariantResults = await ensureInstallInvariants(process.cwd(), paths.home);
471
+ if (invariantResults.length > 0) {
472
+ process.stdout.write(`\u2713 invariants: ${invariantResults.join(", ")}
473
+ `);
474
+ }
475
+ const doctorPath = join4(paths.home, "scripts", "doctor.sh");
476
+ if (existsSync4(doctorPath)) {
477
+ process.stdout.write("\n\u{1FA7A} Health check...\n");
478
+ try {
479
+ const { execSync } = await import("node:child_process");
480
+ execSync(`bash "${doctorPath}" --fix`, { stdio: "inherit", timeout: 3e4 });
481
+ } catch (err) {
482
+ process.stderr.write(`\u26A0\uFE0F doctor --fix failed: ${err instanceof Error ? err.message : String(err)}
483
+ `);
484
+ }
485
+ }
486
+ const manifestForRestart = await readManifest(paths.manifest);
487
+ const restartMode = manifestForRestart?.installMode;
488
+ if (!restartMode) {
489
+ process.stderr.write("\u274C installMode not set in manifest.json. Run 'abtars install' first.\n");
490
+ return 1;
491
+ }
492
+ if (restartMode === "supervised-daemon" || restartMode === "supervised") {
493
+ process.stdout.write("\nRestarting bridge via watchdog...\n");
494
+ const wdLock = join4(paths.home, "watchdog.lock");
495
+ const wdPid = readJsonField(wdLock, "pid");
496
+ if (wdPid && wdPid > 0) {
497
+ try {
498
+ process.kill(wdPid, "SIGUSR1");
499
+ process.stdout.write(`\u267B\uFE0F USR1 sent to watchdog (PID ${wdPid}) \u2014 bridge will restart
500
+ `);
501
+ } catch {
502
+ process.stdout.write(`\u26A0\uFE0F Could not signal watchdog (PID ${wdPid}). Restart manually:
503
+ `);
504
+ if (process.platform === "darwin") {
505
+ process.stdout.write(` launchctl kickstart -k gui/$(id -u)/com.abtars.watchdog
506
+ `);
507
+ } else {
508
+ process.stdout.write(` systemctl --user restart abtars-watchdog
509
+ `);
510
+ }
511
+ }
512
+ } else {
513
+ process.stdout.write(`\u26A0\uFE0F Watchdog not running. Cold restart...
514
+ `);
515
+ const { restart } = await import("./abtars-restart.js");
516
+ await restart({ cold: true }).catch((err) => {
517
+ process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}
518
+ `);
519
+ });
520
+ }
521
+ } else {
522
+ process.stdout.write("\nRestarting bridge...\n");
523
+ const { restart } = await import("./abtars-restart.js");
524
+ await restart({ cold: true }).catch((err) => {
525
+ process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}
526
+ `);
527
+ });
528
+ }
529
+ const { printHealthSummary } = await import("./health-check-RJ2SUJYL.js");
530
+ printHealthSummary(paths.home);
531
+ return 0;
532
+ } finally {
533
+ await release();
534
+ }
535
+ }
536
+
537
+ export {
538
+ showHintOnce,
539
+ update
540
+ };
541
+ //# sourceMappingURL=chunk-XIEKGESU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/commands/update.ts", "../src/cli/update-sources/local.ts", "../src/cli/update-sources/npm.ts", "../src/components/hints.ts"],
4
+ "sourcesContent": ["/**\n * `abtars update` \u2014 build current checkout, stage new release, flip symlink.\n *\n * Phase 1 implements --source local only. Other sources error with a\n * \"not yet supported\" stub (Phase 5 will add NpmSource).\n */\n\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { hostname } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport { readFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { copyFile, mkdir, chmod, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { makeLocalBuildSource } from '../update-sources/local.js';\nimport { makeNpmSource } from '../update-sources/npm.js';\nimport type { SourceName } from '../update-sources/types.js';\nimport { acquireLock, activate, emptyManifest, hashFile, packagePaths, pruneReleases, readManifest, writeManifest, RETENTION, type PriorRelease } from '../deploy-lib-import.js';\nimport { showHintOnce } from '../../components/hints.js';\n\nfunction readJsonField(file: string, field: string): unknown {\n try { return JSON.parse(readFileSync(file, 'utf-8'))[field]; } catch { return undefined; }\n}\n\nexport interface UpdateOptions {\n readonly source: SourceName;\n readonly fromLocal: boolean;\n readonly allowAbmindMismatch: boolean;\n readonly repoRoot?: string;\n}\n\nexport async function update(opts: UpdateOptions): Promise<number> {\n if (opts.source !== 'local' && opts.source !== 'npm') {\n process.stderr.write(`--source ${opts.source} is not yet supported.\\nUse --source local (default) or --source npm.\\n`);\n return 2;\n }\n\n const paths = packagePaths('abtars');\n\n // Auto-migrate old flat layout (current/main.js without releases/) \u2192 create releases dir\n if (!existsSync(paths.releases) && existsSync(join(paths.home, 'current'))) {\n process.stdout.write('Migrating old layout \u2192 releases/...\\n');\n mkdirSync(paths.releases, { recursive: true });\n }\n const release = await acquireLock(paths.lock, `update --source ${opts.source}`);\n\n try {\n // Resolve source root: explicit > cwd (if git) > npm package (from argv[1])\n let repoRoot = opts.repoRoot ?? process.cwd();\n if (!opts.repoRoot && !existsSync(join(repoRoot, '.git'))) {\n // Not in a git checkout \u2014 try npm global package path\n const { realpathSync } = await import('node:fs');\n const scriptPath = realpathSync(process.argv[1] ?? '');\n const candidate = join(dirname(scriptPath), '..');\n if (existsSync(join(candidate, 'bundle'))) repoRoot = candidate;\n }\n const source = opts.source === 'npm'\n ? makeNpmSource('abtars')\n : makeLocalBuildSource({ repoRoot, allowStale: opts.fromLocal });\n if (opts.fromLocal) {\n showHintOnce(\"update-from-local\", \"Building from working copy (--from-local). To sync with remote first: git pull && abtars update\");\n }\n process.stdout.write(`Building from local checkout (${process.cwd()})...\\n`);\n const staged = await source.prepare({\n releasesDir: paths.releases,\n nodeModulesDir: paths.nodeModules,\n home: paths.home,\n allowStale: opts.fromLocal,\n });\n process.stdout.write(`\u2713 staged ${staged.version} at ${staged.stagedPath}\\n`);\n\n // Install external runtime deps at the release dir (#582)\n {\n const pkgPath = join(staged.stagedPath, \"package.json\");\n const { readFileSync, writeFileSync } = await import(\"node:fs\");\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const externals: Record<string, string> = { patchright: \"^1.59.4\", \"rettiwt-api\": \"^4.1.3\" };\n pkg.dependencies = { ...pkg.dependencies, ...externals };\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n const { execSync } = await import(\"node:child_process\");\n execSync(\"npm install --omit=dev --ignore-scripts 2>/dev/null\", { cwd: staged.stagedPath, timeout: 60_000 });\n process.stdout.write(`\u2713 external deps installed\\n`);\n } catch (err) {\n process.stdout.write(`\u26A0 external deps install failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Create stable entry point symlink (main.js \u2192 bundle or dist)\n {\n const { existsSync, unlinkSync, symlinkSync } = await import(\"node:fs\");\n const mainLink = join(staged.stagedPath, \"main.js\");\n try { unlinkSync(mainLink); } catch (err) { logAndSwallow(\"update\", \"op\", err); }\n const entry = existsSync(join(staged.stagedPath, \"bundle\", \"abtars.js\"))\n ? \"bundle/abtars.js\"\n : \"dist/main.js\";\n symlinkSync(entry, mainLink);\n }\n\n // Preserve abmind symlinks from old release (#722)\n const { existsSync: ex2, lstatSync, readlinkSync, symlinkSync: sl2, mkdirSync: mk2 } = await import(\"node:fs\");\n const oldNm = join(paths.home, \"current\", \"node_modules\");\n const preservedLinks: Array<{ name: string; target: string }> = [];\n if (ex2(oldNm)) {\n for (const name of [\"abmind\", \"better-sqlite3\"]) {\n const p = join(oldNm, name);\n try { if (ex2(p) && lstatSync(p).isSymbolicLink()) preservedLinks.push({ name, target: readlinkSync(p) }); } catch { /* skip */ }\n }\n }\n\n // Flip current \u2192 releases/<version>\n await activate(paths.current, staged.version);\n process.stdout.write(`\u2713 current -> releases/${staged.version}\\n`);\n\n // Recreate preserved symlinks in new release\n if (preservedLinks.length > 0) {\n const newNm = join(paths.home, \"current\", \"node_modules\");\n mk2(newNm, { recursive: true });\n for (const { name, target } of preservedLinks) {\n try { sl2(target, join(newNm, name)); } catch { /* best effort */ }\n }\n }\n\n // Update manifest\n const prior = await readManifest(paths.manifest);\n const now = new Date().toISOString();\n const newPriorReleases = prior?.version\n ? [\n {\n version: prior.version,\n commit: prior.commit,\n activatedAt: prior.activatedAt,\n packageLockHash: prior.packageLockHash,\n },\n ...(prior.priorReleases ?? []),\n ].slice(0, RETENTION - 1)\n : prior?.priorReleases ?? [];\n\n await writeManifest(paths.manifest, {\n ...(prior ?? emptyManifest('abtars', hostname())),\n version: staged.version,\n commit: staged.commit,\n branch: staged.branch,\n packageLockHash: staged.packageLockHash,\n activatedAt: now,\n source: 'local',\n priorReleases: newPriorReleases,\n });\n process.stdout.write(`\u2713 manifest updated\\n`);\n\n // Prune old releases\n const pruned = await pruneReleases(\n paths.releases,\n [staged.version, ...newPriorReleases.map((r: PriorRelease) => r.version)],\n staged.version,\n RETENTION,\n );\n if (pruned.length > 0) {\n process.stdout.write(`\u2713 pruned ${pruned.length} old release${pruned.length === 1 ? '' : 's'}: ${pruned.join(', ')}\\n`);\n }\n\n process.stdout.write(`\\nUpdate complete: ${staged.version}\\n`);\n\n // Refresh scripts from repo \u2014 manifest-driven\n const { loadManifest } = await import('../install-manifest.js');\n const installManifest = loadManifest(process.cwd());\n const repoScripts = join(process.cwd(), 'scripts');\n const destScripts = join(paths.home, 'scripts');\n await mkdir(destScripts, { recursive: true });\n const allScriptFiles = await readdir(repoScripts).catch(() => [] as string[]);\n // Filter by manifest include patterns\n const matchesInclude = (name: string): boolean =>\n installManifest.scripts.include.some(pattern => {\n const ext = pattern.replace(\"*\", \"\");\n return name.endsWith(ext);\n });\n const scriptFiles = allScriptFiles.filter(matchesInclude);\n const home = process.env['HOME'] ?? '';\n let serviceChanged = false;\n\n // Resolve install mode \u2014 skip supervisor artifacts in simple mode\n const installMode = (await readManifest(paths.manifest))?.installMode ?? \"supervised\";\n\n const isExecutable = (name: string): boolean => {\n const ext = installManifest.scripts.executable.replace(\"*\", \"\");\n return name.endsWith(ext);\n };\n\n for (const name of scriptFiles) {\n await copyFile(join(repoScripts, name), join(destScripts, name));\n if (isExecutable(name)) await chmod(join(destScripts, name), 0o755);\n // Root-level copies for launcher scripts watchdog/launchd reference directly\n if (isExecutable(name)) {\n await copyFile(join(repoScripts, name), join(paths.home, name));\n await chmod(join(paths.home, name), 0o755);\n }\n // macOS: template + install LaunchAgent plist (supervised only)\n const macService = installManifest.services.supervised.macos;\n if (macService && name === macService.plist && process.platform === 'darwin' && home && installMode === 'supervised') {\n const launchAgentsDir = join(home, 'Library', 'LaunchAgents');\n await mkdir(launchAgentsDir, { recursive: true });\n const dst = join(launchAgentsDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n let templated = await readFile(join(repoScripts, name), 'utf-8');\n for (const ph of macService.placeholders) templated = templated.replaceAll(ph, home);\n await writeFile(dst, templated);\n if (oldContent !== templated) serviceChanged = true;\n }\n // Linux: install systemd user service (supervised only)\n const linuxService = installManifest.services.supervised.linux;\n if (linuxService?.units.includes(name) && process.platform === 'linux' && home && installMode === 'supervised') {\n const systemdDir = join(home, '.config', 'systemd', 'user');\n await mkdir(systemdDir, { recursive: true });\n const dst = join(systemdDir, name);\n const oldContent = await readFile(dst, 'utf-8').catch(() => '');\n await copyFile(join(repoScripts, name), dst);\n const newContent = await readFile(dst, 'utf-8').catch(() => '');\n if (oldContent !== newContent) serviceChanged = true;\n }\n }\n process.stdout.write(`\u2713 scripts refreshed (${scriptFiles.length} files)\\n`);\n\n // Regenerate CLI bin wrappers (#310) \u2014 keeps wrapper paths in sync with build layout\n const { writeWrapper } = await import('./install.js');\n await mkdir(paths.bin, { recursive: true });\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.current, false);\n }\n process.stdout.write(`\u2713 wrappers refreshed (${installManifest.cliWrappers.length} files)\\n`);\n\n // Sync core skills from release to runtime (#438)\n const { rmSync, cpSync, readdirSync } = await import(\"node:fs\");\n const skillsCoreSrc = join(staged.stagedPath, \"core\", \"skills\");\n const skillsCoreDst = join(paths.home, \"skills\", \"core\");\n if (existsSync(skillsCoreSrc)) {\n rmSync(skillsCoreDst, { recursive: true, force: true });\n cpSync(skillsCoreSrc, skillsCoreDst, { recursive: true });\n const files = readdirSync(skillsCoreDst, { recursive: true }) as string[];\n const count = files.filter(f => f.endsWith(\"SKILL.md\")).length;\n process.stdout.write(`\u2713 skills/core synced (${count} skills)\\n`);\n }\n // Ensure other skill dirs exist\n for (const d of [\"custom\", \"downloaded\", \"self\"]) {\n await mkdir(join(paths.home, \"skills\", d), { recursive: true });\n }\n // Migration (#614): remove stale pre-#438 top-level skill dirs (duplicates of core/)\n for (const stale of [\"memory\", \"ops\", \"tools\", \"coding\"]) {\n const p = join(paths.home, \"skills\", stale);\n if (existsSync(p)) { rmSync(p, { recursive: true, force: true }); }\n }\n\n if (serviceChanged) {\n if (process.platform === 'darwin') {\n process.stdout.write(`\u26A0\uFE0F LaunchAgent plist updated \u2014 reload with: launchctl bootout gui/$(id -u)/com.abtars.watchdog && launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.abtars.watchdog.plist\\n`);\n } else {\n process.stdout.write(`\u26A0\uFE0F systemd service updated \u2014 reload with: systemctl --user daemon-reload && systemctl --user restart abtars-watchdog\\n`);\n }\n }\n\n\n // hashFile is unused here but imported to validate the re-export surface;\n // leaving this no-op call removed \u2014 the re-export is exercised by tests.\n void hashFile;\n\n // #426 \u2014 Seed missing config + run config migrations\n const { ensureInstallInvariants } = await import(\"../ensure-invariants.js\");\n const invariantResults = await ensureInstallInvariants(process.cwd(), paths.home);\n if (invariantResults.length > 0) {\n process.stdout.write(`\u2713 invariants: ${invariantResults.join(\", \")}\\n`);\n }\n\n // Native deps (sqlite-vec, better-sqlite3) handled by `abmind install` (#716)\n\n // Run doctor before restart\n const doctorPath = join(paths.home, \"scripts\", \"doctor.sh\");\n if (existsSync(doctorPath)) {\n process.stdout.write(\"\\n\uD83E\uDE7A Health check...\\n\");\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(`bash \"${doctorPath}\" --fix`, { stdio: \"inherit\", timeout: 30_000 });\n } catch (err) {\n process.stderr.write(`\u26A0\uFE0F doctor --fix failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n }\n\n // Auto-restart bridge on new code\n const manifestForRestart = await readManifest(paths.manifest);\n const restartMode = manifestForRestart?.installMode;\n if (!restartMode) {\n process.stderr.write(\"\u274C installMode not set in manifest.json. Run 'abtars install' first.\\n\");\n return 1;\n }\n\n if (restartMode === \"supervised-daemon\" || restartMode === \"supervised\") {\n // Send USR1 to watchdog for graceful restart (#688)\n process.stdout.write(\"\\nRestarting bridge via watchdog...\\n\");\n const wdLock = join(paths.home, \"watchdog.lock\");\n const wdPid = readJsonField(wdLock, \"pid\") as number | undefined;\n if (wdPid && wdPid > 0) {\n try {\n process.kill(wdPid, \"SIGUSR1\");\n process.stdout.write(`\u267B\uFE0F USR1 sent to watchdog (PID ${wdPid}) \u2014 bridge will restart\\n`);\n } catch {\n process.stdout.write(`\u26A0\uFE0F Could not signal watchdog (PID ${wdPid}). Restart manually:\\n`);\n if (process.platform === \"darwin\") {\n process.stdout.write(` launchctl kickstart -k gui/$(id -u)/com.abtars.watchdog\\n`);\n } else {\n process.stdout.write(` systemctl --user restart abtars-watchdog\\n`);\n }\n }\n } else {\n // No watchdog running \u2014 fall back to cold restart\n process.stdout.write(`\u26A0\uFE0F Watchdog not running. Cold restart...\\n`);\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n } else {\n // simple mode: no watchdog, cold restart\n process.stdout.write(\"\\nRestarting bridge...\\n\");\n const { restart } = await import(\"./restart.js\");\n await restart({ cold: true }).catch((err: unknown) => {\n process.stderr.write(`\u26A0\uFE0F Restart failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n });\n }\n\n const { printHealthSummary } = await import('./health-check.js');\n printHealthSummary(paths.home);\n\n return 0;\n } finally {\n await release();\n }\n}\n", "/**\n * LocalBuildSource: the Phase 1 adapter. Builds the current working-tree\n * checkout and stages the output into releases/<version>/dist/.\n *\n * Staleness guard: runs `git fetch` and refuses to proceed if HEAD is behind\n * origin/<branch>, unless allowStale (--from-local) is passed. Handles the\n * detached-HEAD / no-upstream / unpushed edge cases with a friendly message.\n *\n * Version string: `<package-version>-<short-sha>`, e.g. `0.1.0-28f71ef`.\n * Uniqueness: if the same version is staged twice, the second stage\n * overwrites (rsync --delete semantics via rm + cp). Rare; only happens when\n * operator runs update twice without changing a commit or bumping version.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { copyFile, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { hashFile } from '../deploy-lib-import.js';\nimport type { PrepareContext, StagedRelease, UpdateSource } from './types.js';\n\nexport class LocalBuildError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(hint ? `${message}\\n\\n${hint}` : message);\n this.name = 'LocalBuildError';\n }\n}\n\nexport interface LocalBuildOptions {\n /** Repository root for the build (defaults to process.cwd()). */\n readonly repoRoot?: string;\n /** If true, skip the behind-origin guard. Operator opt-in. */\n readonly allowStale?: boolean;\n /** If true, skip `npm install` (assume node_modules is already current). */\n readonly skipInstall?: boolean;\n}\n\nfunction runCmd(cmd: string, args: readonly string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.error) throw new LocalBuildError(`${cmd} ${args.join(' ')} failed: ${r.error.message}`);\n if (r.status !== 0) {\n throw new LocalBuildError(\n `${cmd} ${args.join(' ')} exited with status ${r.status}`,\n r.stderr?.trim() || undefined,\n );\n }\n return r.stdout.trim();\n}\n\nfunction tryCmd(cmd: string, args: readonly string[], cwd: string): string | null {\n const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8' });\n if (r.status !== 0) return null;\n return r.stdout.trim();\n}\n\nfunction checkStaleness(repoRoot: string, allowStale: boolean): { commit: string; branch: string | null } {\n const commit = runCmd('git', ['rev-parse', '--short', 'HEAD'], repoRoot);\n const branch = tryCmd('git', ['rev-parse', '--abbrev-ref', 'HEAD'], repoRoot);\n if (allowStale) return { commit, branch: branch === 'HEAD' ? null : branch };\n\n // Detached HEAD / no-branch case\n if (branch === 'HEAD' || branch === null) {\n throw new LocalBuildError(\n 'Working tree is in detached HEAD (no current branch).',\n 'Cannot check for staleness. Pass --from-local to proceed with the current tree.',\n );\n }\n\n // Fetch to refresh origin refs. Not --unshallow; caller may have a shallow clone intentionally.\n runCmd('git', ['fetch', '--quiet'], repoRoot);\n\n // Does the branch have an upstream?\n const upstream = tryCmd('git', ['rev-parse', '--abbrev-ref', `${branch}@{upstream}`], repoRoot);\n if (upstream === null) {\n throw new LocalBuildError(\n `Branch '${branch}' has no upstream configured.`,\n 'Cannot check for staleness. Push the branch, or pass --from-local to proceed with the current tree.',\n );\n }\n\n // How many commits is HEAD behind upstream?\n const behindStr = tryCmd('git', ['rev-list', '--count', `HEAD..${upstream}`], repoRoot);\n const behind = behindStr === null ? null : Number(behindStr);\n if (behind === null || !Number.isFinite(behind)) {\n throw new LocalBuildError(\n `Could not determine how far HEAD is behind ${upstream}.`,\n 'Pass --from-local to proceed anyway.',\n );\n }\n if (behind > 0) {\n throw new LocalBuildError(\n `Current branch: ${branch} (${commit})\\n${upstream} is ahead by ${behind} commit${behind === 1 ? '' : 's'}.`,\n `Run 'git pull' first, or pass --from-local to build from the current tree.`,\n );\n }\n\n return { commit, branch };\n}\n\nasync function readPackageVersion(repoRoot: string): Promise<string> {\n const pkg = JSON.parse(await readFile(join(repoRoot, 'package.json'), 'utf-8')) as { version?: string };\n if (typeof pkg.version !== 'string') {\n throw new LocalBuildError('package.json has no version field.');\n }\n return pkg.version;\n}\n\nexport function makeLocalBuildSource(opts: LocalBuildOptions = {}): UpdateSource {\n const repoRoot = opts.repoRoot ?? process.cwd();\n const isNpmPackage = !existsSync(join(repoRoot, '.git'));\n\n return {\n name: 'local',\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n // npm package mode: no git, no build \u2014 just copy the pre-built bundle\n if (isNpmPackage) {\n const bundleDir = join(repoRoot, 'bundle');\n if (!existsSync(bundleDir)) {\n throw new Error(`No bundle/ found at ${repoRoot}. Run from the abtars npm package or a git checkout.`);\n }\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = pkgVersion;\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(bundleDir, join(stagedPath, 'bundle'), { recursive: true });\n const coreDir = join(repoRoot, 'core');\n if (existsSync(coreDir)) await cp(coreDir, join(stagedPath, 'core'), { recursive: true });\n const scriptsSrc = join(repoRoot, 'scripts');\n if (existsSync(scriptsSrc)) await cp(scriptsSrc, join(stagedPath, 'scripts'), { recursive: true });\n const manifestSrc = join(repoRoot, 'install-manifest.json');\n if (existsSync(manifestSrc)) await copyFile(manifestSrc, join(stagedPath, 'install-manifest.json'));\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n process.stdout.write(`\u2713 staged ${version} (from npm package)\\n`);\n return { version, stagedPath, commit: null, branch: null, packageLockHash: null, source: 'local' };\n }\n\n // Git checkout mode: build from source\n const { commit, branch } = checkStaleness(repoRoot, opts.allowStale === true || ctx.allowStale);\n const pkgVersion = await readPackageVersion(repoRoot);\n const version = `${pkgVersion}-${commit}`;\n\n // Install deps into the shared node_modules/ (if not skipped).\n if (opts.skipInstall !== true) {\n runCmd('npm', ['install', '--no-audit', '--no-fund'], repoRoot);\n }\n\n // Build: bundle mode (esbuild) or legacy mode (tsc)\n const useBundle = process.env['AGENTBRIDGE_BUILD_MODE'] !== 'tsc';\n\n if (useBundle) {\n // Bundle mode: esbuild \u2192 bundle/ + pruned native deps\n runCmd('npm', ['run', 'bundle'], repoRoot);\n\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'bundle'), join(stagedPath, 'bundle'), { recursive: true });\n\n // Copy core skills for runtime sync (#438)\n const coreSkillsSrc = join(repoRoot, 'core', 'skills');\n if (existsSync(coreSkillsSrc)) {\n await cp(coreSkillsSrc, join(stagedPath, 'core', 'skills'), { recursive: true });\n }\n\n // Ensure ESM works without warnings (MODULE_TYPELESS_PACKAGE_JSON)\n await writeFile(join(stagedPath, 'package.json'), JSON.stringify({ type: \"module\", name: \"abtars\", version }, null, 2) + \"\\n\");\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Native addons (better-sqlite3, sqlite-vec) live at ~/.abmind/lib/node_modules/\n // and are loaded via native-loader.ts from there. No need to copy into release.\n // See #431 (persistent install) + native-loader.ts.\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n }\n\n // Legacy tsc mode (AGENTBRIDGE_BUILD_MODE=tsc)\n runCmd('npm', ['run', 'build'], repoRoot);\n\n // Stage releases/<version>/dist/\n const stagedPath = join(ctx.releasesDir, version);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n await cp(join(repoRoot, 'dist'), join(stagedPath, 'dist'), { recursive: true });\n\n // Copy install-manifest.json for doctor reconciliation\n await copyFile(join(repoRoot, 'install-manifest.json'), join(stagedPath, 'install-manifest.json'));\n\n // Sync node_modules/ to the shared location.\n //\n // Use `rsync -aL` to DEREFERENCE symlinks \u2014 critical because\n // package.json `\"abmind\": \"file:../abmind\"` creates a symlink at\n // node_modules/abmind pointing into the dev workspace. Plain cp\n // preserves the symlink, so the runtime ends up with abmind code\n // served from the developer's working tree (active live edits +\n // test-suite contention on memory.db). We want a materialized copy.\n //\n // Delete destination first so rsync's --delete is unnecessary (and\n // safer \u2014 we don't want to rsync-delete anything outside).\n await rm(ctx.nodeModulesDir, { recursive: true, force: true });\n await mkdir(ctx.nodeModulesDir, { recursive: true });\n const rsyncResult = spawnSync(\n 'rsync',\n ['-aL', '--quiet', `${join(repoRoot, 'node_modules')}/`, `${ctx.nodeModulesDir}/`],\n { stdio: 'inherit' },\n );\n if (rsyncResult.status !== 0) {\n throw new LocalBuildError(\n `rsync of node_modules failed (status ${rsyncResult.status ?? -1})`,\n `Ensure rsync is installed. Falling back to node cp would re-create symlinks.`,\n );\n }\n\n // Note: abmind's nested node_modules/ (rsync'd from its dev workspace)\n // stays in place. Previously deleted to avoid duplicate better-sqlite3\n // native-addon conflict (#230-related), but since f24b33f removed\n // better-sqlite3 from abtars's deps, abmind's nested copy is the\n // only one and must remain \u2014 deleting it breaks module resolution for\n // abmind at runtime ('Cannot find package better-sqlite3').\n\n const packageLockHash = await hashFile(join(repoRoot, 'package-lock.json'));\n\n return { version, stagedPath, commit, branch, packageLockHash, source: 'local' };\n },\n };\n}\n", "/**\n * NpmSource: fetch latest published version from npm registry (#462).\n * Downloads tarball, extracts, installs prod deps, stages.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PrepareContext, StagedRelease, UpdateSource } from \"./types.js\";\n\nconst TIMEOUT_MS = 60_000;\n\nfunction run(cmd: string, args: string[], cwd: string): string {\n const r = spawnSync(cmd, args, { cwd, encoding: \"utf-8\", timeout: TIMEOUT_MS });\n if (r.error) throw new Error(`${cmd} ${args.join(\" \")}: ${r.error.message}`);\n if (r.status !== 0) throw new Error(`${cmd} ${args.join(\" \")} exited ${r.status}: ${r.stderr?.trim()}`);\n return r.stdout.trim();\n}\n\nfunction readLocalVersion(home: string): string | null {\n try {\n const pkg = JSON.parse(readFileSync(join(home, \"current\", \"package.json\"), \"utf-8\"));\n return pkg.version ?? null;\n } catch { return null; }\n}\n\nexport function makeNpmSource(packageName: string): UpdateSource {\n return {\n name: \"npm\",\n async prepare(ctx: PrepareContext): Promise<StagedRelease> {\n const latest = run(\"npm\", [\"view\", packageName, \"version\"], ctx.home);\n const current = readLocalVersion(ctx.home);\n if (latest === current) {\n throw new Error(`Already at latest version (${latest}). Nothing to update.`);\n }\n\n const stagedPath = join(ctx.releasesDir, latest);\n await rm(stagedPath, { recursive: true, force: true });\n await mkdir(stagedPath, { recursive: true });\n\n // Download tarball\n run(\"npm\", [\"pack\", `${packageName}@${latest}`, \"--pack-destination\", stagedPath], stagedPath);\n const tgzName = `${packageName}-${latest}.tgz`.replace(\"@\", \"\").replace(\"/\", \"-\");\n const tgzPath = join(stagedPath, tgzName);\n\n // Extract (strip package/ prefix)\n run(\"tar\", [\"-xzf\", tgzPath, \"--strip-components=1\"], stagedPath);\n\n // Cleanup tarball\n if (existsSync(tgzPath)) unlinkSync(tgzPath);\n\n // Install production deps\n run(\"npm\", [\"install\", \"--omit=dev\", \"--no-audit\", \"--no-fund\"], stagedPath);\n\n return { version: latest, stagedPath, commit: null, branch: null, packageLockHash: null, source: \"npm\" };\n },\n };\n}\n", "/**\n * First-touch hint system \u2014 show a hint once, persist to manifest.\n * Output to stderr with \uD83D\uDCA1 prefix. Never corrupts manifest (atomic write).\n */\n\nimport { existsSync, readFileSync, writeFileSync, renameSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nfunction manifestPath(): string {\n const home = process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n return join(home, \"manifest.json\");\n}\n\nfunction readManifest(): Record<string, unknown> {\n const path = manifestPath();\n if (!existsSync(path)) return {};\n try { return JSON.parse(readFileSync(path, \"utf-8\")); }\n catch { return {}; }\n}\n\nfunction writeManifestAtomic(data: Record<string, unknown>): void {\n const path = manifestPath();\n const tmp = path + \".tmp\";\n writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\");\n renameSync(tmp, path);\n}\n\nexport function showHintOnce(id: string, text: string): void {\n const manifest = readManifest();\n const seen = (manifest[\"hintsSeen\"] as Record<string, string> | undefined) ?? {};\n if (seen[id]) return;\n\n process.stderr.write(`\\n\uD83D\uDCA1 ${text}\\n\\n`);\n\n seen[id] = new Date().toISOString();\n manifest[\"hintsSeen\"] = seen;\n writeManifestAtomic(manifest);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "readFileSync", "existsSync", "copyFile", "mkdir", "readFile", "writeFile", "pkgVersion", "version", "stagedPath", "packageLockHash", "spawnSync", "existsSync", "mkdir", "rm", "join", "existsSync", "readFileSync", "join", "readManifest", "readFileSync", "existsSync", "join", "writeFileSync", "unlinkSync", "mkdir", "copyFile", "readFile", "writeFile"]
7
+ }
@@ -0,0 +1,286 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+ import {
4
+ init_log_and_swallow,
5
+ logAndSwallow
6
+ } from "./chunk-EX2SRTUE.js";
7
+ import "./chunk-2BY6I4P5.js";
8
+ import "./chunk-MJ6PHMOK.js";
9
+ import "./chunk-7K2YZTLD.js";
10
+
11
+ // src/cli/commands/daemon.ts
12
+ init_log_and_swallow();
13
+ import { existsSync, readFileSync } from "node:fs";
14
+ import { join, dirname } from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+ function abtarsHome() {
17
+ return process.env["ABTARS_HOME"] ?? join(process.env["HOME"] ?? "", ".abtars");
18
+ }
19
+ function isWSL() {
20
+ try {
21
+ return readFileSync("/proc/version", "utf-8").toLowerCase().includes("microsoft");
22
+ } catch {
23
+ return false;
24
+ }
25
+ }
26
+ function detectScope() {
27
+ if (existsSync("/etc/systemd/system/abtars.service")) return "system";
28
+ const userUnit = join(process.env["HOME"] ?? "", ".config", "systemd", "user", "abtars-watchdog.service");
29
+ if (existsSync(userUnit)) return "user";
30
+ return null;
31
+ }
32
+ function unitName(scope) {
33
+ return scope === "user" ? "abtars-watchdog" : "abtars";
34
+ }
35
+ async function daemonInstall() {
36
+ const platform = process.platform;
37
+ const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
38
+ if (platform === "linux" && isWSL()) {
39
+ process.stderr.write(`\u2139\uFE0F WSL detected \u2014 ensure systemd is enabled (wsl.conf: [boot] systemd=true)
40
+ `);
41
+ }
42
+ const sudoUser = process.env["SUDO_USER"];
43
+ if (process.getuid?.() !== 0) {
44
+ process.stderr.write(
45
+ `Requires sudo for system-scope service registration.
46
+ Run: sudo -k $(which abtars) daemon install
47
+ `
48
+ );
49
+ return 2;
50
+ }
51
+ if (!sudoUser) {
52
+ process.stderr.write(`Cannot determine target user \u2014 $SUDO_USER is not set.
53
+ `);
54
+ return 2;
55
+ }
56
+ const { execSync: execSyncHome } = await import("node:child_process");
57
+ const userHome = execSyncHome(`eval echo ~${sudoUser}`, { encoding: "utf-8" }).trim();
58
+ const home = join(userHome, ".abtars");
59
+ const currentLink = join(home, "current");
60
+ if (!existsSync(currentLink)) {
61
+ process.stderr.write(`No release staged. Run 'abtars install' first.
62
+ `);
63
+ return 2;
64
+ }
65
+ if (platform === "darwin") {
66
+ const { execSync, execFileSync } = await import("node:child_process");
67
+ let group = sudoUser;
68
+ try {
69
+ group = execSync(`id -gn ${sudoUser}`, { encoding: "utf-8" }).trim();
70
+ } catch (err) {
71
+ logAndSwallow("daemon", "op", err);
72
+ }
73
+ const plistSrc = join(pkgRoot, "scripts", "com.abtars.daemon.plist");
74
+ if (!existsSync(plistSrc)) {
75
+ process.stderr.write(`Template not found: ${plistSrc}
76
+ `);
77
+ return 1;
78
+ }
79
+ let content = readFileSync(plistSrc, "utf-8");
80
+ content = content.replaceAll("{{USER}}", sudoUser).replaceAll("{{GROUP}}", group);
81
+ const dst = "/Library/LaunchDaemons/com.abtars.daemon.plist";
82
+ const { writeFileSync, chmodSync } = await import("node:fs");
83
+ writeFileSync(dst, content);
84
+ chmodSync(dst, 420);
85
+ try {
86
+ execFileSync("launchctl", ["bootstrap", "system", dst]);
87
+ } catch (err) {
88
+ logAndSwallow("daemon", "op", err);
89
+ }
90
+ process.stdout.write(`\u2713 LaunchDaemon installed at ${dst}
91
+ `);
92
+ process.stdout.write(`\u2713 bridge runs as ${sudoUser}, survives logout + reboot
93
+ `);
94
+ return 0;
95
+ }
96
+ if (platform === "linux") {
97
+ const { execSync, execFileSync } = await import("node:child_process");
98
+ try {
99
+ execSync("systemctl --version", { stdio: "ignore" });
100
+ } catch {
101
+ process.stderr.write(`systemctl not found \u2014 requires systemd.
102
+ `);
103
+ return 2;
104
+ }
105
+ const unitSrc = join(pkgRoot, "scripts", "abtars-daemon.service");
106
+ if (!existsSync(unitSrc)) {
107
+ process.stderr.write(`Template not found: ${unitSrc}
108
+ `);
109
+ return 1;
110
+ }
111
+ let content = readFileSync(unitSrc, "utf-8");
112
+ content = content.replaceAll("{{USER}}", sudoUser);
113
+ const dst = "/etc/systemd/system/abtars.service";
114
+ const { writeFileSync } = await import("node:fs");
115
+ writeFileSync(dst, content);
116
+ execFileSync("systemctl", ["daemon-reload"]);
117
+ execFileSync("systemctl", ["enable", "--now", "abtars"]);
118
+ const manifestPath = join(home, "manifest.json");
119
+ try {
120
+ const { readFileSync: rfs, writeFileSync: wfs } = await import("node:fs");
121
+ const mf = JSON.parse(rfs(manifestPath, "utf-8"));
122
+ mf.installMode = "supervised-daemon";
123
+ wfs(manifestPath, JSON.stringify(mf, null, 2) + "\n");
124
+ } catch {
125
+ }
126
+ process.stdout.write(`\u2713 systemd unit installed at ${dst}
127
+ `);
128
+ process.stdout.write(`\u2713 bridge runs as ${sudoUser}, survives logout + reboot
129
+ `);
130
+ return 0;
131
+ }
132
+ process.stderr.write(`Unsupported platform: ${platform}
133
+ `);
134
+ return 2;
135
+ }
136
+ async function daemonUninstall() {
137
+ const scope = detectScope();
138
+ if (!scope) {
139
+ process.stderr.write("No daemon service found.\n");
140
+ return 1;
141
+ }
142
+ if (scope === "system") {
143
+ if (process.getuid?.() !== 0) {
144
+ process.stderr.write(`Requires sudo: sudo -k $(which abtars) daemon uninstall
145
+ `);
146
+ return 2;
147
+ }
148
+ const { execFileSync } = await import("node:child_process");
149
+ const { unlinkSync } = await import("node:fs");
150
+ try {
151
+ execFileSync("systemctl", ["stop", "abtars"]);
152
+ } catch (err) {
153
+ logAndSwallow("daemon", "op", err);
154
+ }
155
+ try {
156
+ execFileSync("systemctl", ["disable", "abtars"]);
157
+ } catch (err) {
158
+ logAndSwallow("daemon", "op", err);
159
+ }
160
+ try {
161
+ unlinkSync("/etc/systemd/system/abtars.service");
162
+ } catch (err) {
163
+ logAndSwallow("daemon", "op", err);
164
+ }
165
+ try {
166
+ execFileSync("systemctl", ["daemon-reload"]);
167
+ } catch (err) {
168
+ logAndSwallow("daemon", "op", err);
169
+ }
170
+ process.stdout.write("\u2713 system service removed\n");
171
+ } else {
172
+ const { execFileSync } = await import("node:child_process");
173
+ const { unlinkSync } = await import("node:fs");
174
+ const unit = join(process.env["HOME"] ?? "", ".config", "systemd", "user", "abtars-watchdog.service");
175
+ try {
176
+ execFileSync("systemctl", ["--user", "stop", "abtars-watchdog"]);
177
+ } catch (err) {
178
+ logAndSwallow("daemon", "op", err);
179
+ }
180
+ try {
181
+ execFileSync("systemctl", ["--user", "disable", "abtars-watchdog"]);
182
+ } catch (err) {
183
+ logAndSwallow("daemon", "op", err);
184
+ }
185
+ try {
186
+ unlinkSync(unit);
187
+ } catch (err) {
188
+ logAndSwallow("daemon", "op", err);
189
+ }
190
+ try {
191
+ execFileSync("systemctl", ["--user", "daemon-reload"]);
192
+ } catch (err) {
193
+ logAndSwallow("daemon", "op", err);
194
+ }
195
+ process.stdout.write("\u2713 user service removed\n");
196
+ }
197
+ return 0;
198
+ }
199
+ async function daemonControl(action) {
200
+ const scope = detectScope();
201
+ if (!scope) {
202
+ process.stderr.write("No daemon service found. Run: abtars daemon install\n");
203
+ return 1;
204
+ }
205
+ const { execFileSync } = await import("node:child_process");
206
+ const unit = unitName(scope);
207
+ const args = scope === "user" ? ["--user", action, unit] : [action, unit];
208
+ try {
209
+ execFileSync("systemctl", args, { stdio: "inherit" });
210
+ process.stdout.write(`\u2713 ${action} ${unit}
211
+ `);
212
+ } catch {
213
+ process.stderr.write(`\u2717 ${action} failed
214
+ `);
215
+ return 1;
216
+ }
217
+ return 0;
218
+ }
219
+ async function daemonStatus() {
220
+ const scope = detectScope();
221
+ if (!scope) {
222
+ process.stdout.write("No daemon service installed.\n");
223
+ process.stdout.write(" Install: sudo $(which abtars) daemon install\n");
224
+ return 0;
225
+ }
226
+ const { spawnSync } = await import("node:child_process");
227
+ const unit = unitName(scope);
228
+ const args = scope === "user" ? ["--user", "status", unit] : ["status", unit];
229
+ const r = spawnSync("systemctl", args, { encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
230
+ const output = r.stdout || r.stderr || "";
231
+ const activeMatch = output.match(/Active:\s+(.+)/);
232
+ const pidMatch = output.match(/Main PID:\s+(\d+)/);
233
+ process.stdout.write(`\u25CF ${unit} (${scope} scope)
234
+ `);
235
+ process.stdout.write(` ${activeMatch?.[1] ?? "unknown"}
236
+ `);
237
+ if (pidMatch) process.stdout.write(` PID: ${pidMatch[1]}
238
+ `);
239
+ const home = abtarsHome();
240
+ const lockPath = join(home, "bridge.lock");
241
+ if (existsSync(lockPath)) {
242
+ try {
243
+ const lock = JSON.parse(readFileSync(lockPath, "utf-8"));
244
+ if (lock.pid) process.stdout.write(` Bridge PID: ${lock.pid}
245
+ `);
246
+ if (lock.startedAt) {
247
+ const upMs = Date.now() - new Date(lock.startedAt).getTime();
248
+ const upMin = Math.round(upMs / 6e4);
249
+ process.stdout.write(` Uptime: ${upMin >= 60 ? `${Math.floor(upMin / 60)}h ${upMin % 60}m` : `${upMin}m`}
250
+ `);
251
+ }
252
+ if (lock.version) process.stdout.write(` Version: ${lock.version}
253
+ `);
254
+ if (lock.restartReason) process.stdout.write(` Last restart: ${lock.restartReason}
255
+ `);
256
+ } catch {
257
+ }
258
+ }
259
+ return 0;
260
+ }
261
+ async function daemon(args) {
262
+ const sub = args[0] ?? "status";
263
+ switch (sub) {
264
+ case "install":
265
+ return daemonInstall();
266
+ case "uninstall":
267
+ return daemonUninstall();
268
+ case "start":
269
+ return daemonControl("start");
270
+ case "stop":
271
+ return daemonControl("stop");
272
+ case "restart":
273
+ return daemonControl("restart");
274
+ case "status":
275
+ return daemonStatus();
276
+ default:
277
+ process.stderr.write(`Unknown: abtars daemon ${sub}
278
+ Usage: abtars daemon [install|uninstall|start|stop|restart|status]
279
+ `);
280
+ return 1;
281
+ }
282
+ }
283
+ export {
284
+ daemon
285
+ };
286
+ //# sourceMappingURL=daemon-VIBI3SQQ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/commands/daemon.ts"],
4
+ "sourcesContent": ["/**\n * `abtars daemon` \u2014 manage the system service (install/uninstall/start/stop/restart/status).\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nfunction abtarsHome(): string {\n return process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n}\n\nfunction isWSL(): boolean {\n try { return readFileSync(\"/proc/version\", \"utf-8\").toLowerCase().includes(\"microsoft\"); } catch { return false; }\n}\n\ntype Scope = \"system\" | \"user\" | null;\n\nfunction detectScope(): Scope {\n if (existsSync(\"/etc/systemd/system/abtars.service\")) return \"system\";\n const userUnit = join(process.env[\"HOME\"] ?? \"\", \".config\", \"systemd\", \"user\", \"abtars-watchdog.service\");\n if (existsSync(userUnit)) return \"user\";\n return null;\n}\nfunction unitName(scope: Scope): string {\n return scope === \"user\" ? \"abtars-watchdog\" : \"abtars\";\n}\n\n// \u2500\u2500 install \u2500\u2500\n\nasync function daemonInstall(): Promise<number> {\n const platform = process.platform;\n const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), \"..\");\n\n if (platform === \"linux\" && isWSL()) {\n process.stderr.write(`\u2139\uFE0F WSL detected \u2014 ensure systemd is enabled (wsl.conf: [boot] systemd=true)\\n`);\n }\n\n const sudoUser = process.env[\"SUDO_USER\"];\n if (process.getuid?.() !== 0) {\n process.stderr.write(\n `Requires sudo for system-scope service registration.\\n` +\n `Run: sudo -k $(which abtars) daemon install\\n`,\n );\n return 2;\n }\n if (!sudoUser) {\n process.stderr.write(`Cannot determine target user \u2014 $SUDO_USER is not set.\\n`);\n return 2;\n }\n\n // Resolve the SUDO_USER's home, not root's\n const { execSync: execSyncHome } = await import(\"node:child_process\");\n const userHome = execSyncHome(`eval echo ~${sudoUser}`, { encoding: \"utf-8\" }).trim();\n const home = join(userHome, \".abtars\");\n\n const currentLink = join(home, \"current\");\n if (!existsSync(currentLink)) {\n process.stderr.write(`No release staged. Run 'abtars install' first.\\n`);\n return 2;\n }\n\n if (platform === \"darwin\") {\n const { execSync, execFileSync } = await import(\"node:child_process\");\n let group = sudoUser;\n try { group = execSync(`id -gn ${sudoUser}`, { encoding: \"utf-8\" }).trim(); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n\n const plistSrc = join(pkgRoot, \"scripts\", \"com.abtars.daemon.plist\");\n if (!existsSync(plistSrc)) { process.stderr.write(`Template not found: ${plistSrc}\\n`); return 1; }\n let content = readFileSync(plistSrc, \"utf-8\");\n content = content.replaceAll(\"{{USER}}\", sudoUser).replaceAll(\"{{GROUP}}\", group);\n const dst = \"/Library/LaunchDaemons/com.abtars.daemon.plist\";\n\n const { writeFileSync, chmodSync } = await import(\"node:fs\");\n writeFileSync(dst, content);\n chmodSync(dst, 0o644);\n try { execFileSync(\"launchctl\", [\"bootstrap\", \"system\", dst]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n process.stdout.write(`\u2713 LaunchDaemon installed at ${dst}\\n`);\n process.stdout.write(`\u2713 bridge runs as ${sudoUser}, survives logout + reboot\\n`);\n return 0;\n }\n\n if (platform === \"linux\") {\n const { execSync, execFileSync } = await import(\"node:child_process\");\n try { execSync(\"systemctl --version\", { stdio: \"ignore\" }); } catch {\n process.stderr.write(`systemctl not found \u2014 requires systemd.\\n`);\n return 2;\n }\n\n const unitSrc = join(pkgRoot, \"scripts\", \"abtars-daemon.service\");\n if (!existsSync(unitSrc)) { process.stderr.write(`Template not found: ${unitSrc}\\n`); return 1; }\n let content = readFileSync(unitSrc, \"utf-8\");\n content = content.replaceAll(\"{{USER}}\", sudoUser);\n const dst = \"/etc/systemd/system/abtars.service\";\n\n const { writeFileSync } = await import(\"node:fs\");\n writeFileSync(dst, content);\n execFileSync(\"systemctl\", [\"daemon-reload\"]);\n execFileSync(\"systemctl\", [\"enable\", \"--now\", \"abtars\"]);\n // Update manifest mode\n const manifestPath = join(home, \"manifest.json\");\n try {\n const { readFileSync: rfs, writeFileSync: wfs } = await import(\"node:fs\");\n const mf = JSON.parse(rfs(manifestPath, \"utf-8\"));\n mf.installMode = \"supervised-daemon\";\n wfs(manifestPath, JSON.stringify(mf, null, 2) + \"\\n\");\n } catch { /* best effort */ }\n process.stdout.write(`\u2713 systemd unit installed at ${dst}\\n`);\n process.stdout.write(`\u2713 bridge runs as ${sudoUser}, survives logout + reboot\\n`);\n return 0;\n }\n\n process.stderr.write(`Unsupported platform: ${platform}\\n`);\n return 2;\n}\n\n// \u2500\u2500 uninstall \u2500\u2500\n\nasync function daemonUninstall(): Promise<number> {\n const scope = detectScope();\n if (!scope) { process.stderr.write(\"No daemon service found.\\n\"); return 1; }\n\n if (scope === \"system\") {\n if (process.getuid?.() !== 0) {\n process.stderr.write(`Requires sudo: sudo -k $(which abtars) daemon uninstall\\n`);\n return 2;\n }\n const { execFileSync } = await import(\"node:child_process\");\n const { unlinkSync } = await import(\"node:fs\");\n try { execFileSync(\"systemctl\", [\"stop\", \"abtars\"]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n try { execFileSync(\"systemctl\", [\"disable\", \"abtars\"]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n try { unlinkSync(\"/etc/systemd/system/abtars.service\"); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n try { execFileSync(\"systemctl\", [\"daemon-reload\"]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n process.stdout.write(\"\u2713 system service removed\\n\");\n } else {\n const { execFileSync } = await import(\"node:child_process\");\n const { unlinkSync } = await import(\"node:fs\");\n const unit = join(process.env[\"HOME\"] ?? \"\", \".config\", \"systemd\", \"user\", \"abtars-watchdog.service\");\n try { execFileSync(\"systemctl\", [\"--user\", \"stop\", \"abtars-watchdog\"]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n try { execFileSync(\"systemctl\", [\"--user\", \"disable\", \"abtars-watchdog\"]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n try { unlinkSync(unit); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n try { execFileSync(\"systemctl\", [\"--user\", \"daemon-reload\"]); } catch (err) { logAndSwallow(\"daemon\", \"op\", err); }\n process.stdout.write(\"\u2713 user service removed\\n\");\n }\n return 0;\n}\n\n// \u2500\u2500 start/stop/restart \u2500\u2500\n\nasync function daemonControl(action: \"start\" | \"stop\" | \"restart\"): Promise<number> {\n const scope = detectScope();\n if (!scope) { process.stderr.write(\"No daemon service found. Run: abtars daemon install\\n\"); return 1; }\n const { execFileSync } = await import(\"node:child_process\");\n const unit = unitName(scope);\n const args = scope === \"user\" ? [\"--user\", action, unit] : [action, unit];\n try {\n execFileSync(\"systemctl\", args, { stdio: \"inherit\" });\n process.stdout.write(`\u2713 ${action} ${unit}\\n`);\n } catch {\n process.stderr.write(`\u2717 ${action} failed\\n`);\n return 1;\n }\n return 0;\n}\n\n// \u2500\u2500 status \u2500\u2500\n\nasync function daemonStatus(): Promise<number> {\n const scope = detectScope();\n if (!scope) {\n process.stdout.write(\"No daemon service installed.\\n\");\n process.stdout.write(\" Install: sudo $(which abtars) daemon install\\n\");\n return 0;\n }\n\n const { spawnSync } = await import(\"node:child_process\");\n const unit = unitName(scope);\n const args = scope === \"user\" ? [\"--user\", \"status\", unit] : [\"status\", unit];\n const r = spawnSync(\"systemctl\", args, { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const output = r.stdout || r.stderr || \"\";\n\n // Parse active state\n const activeMatch = output.match(/Active:\\s+(.+)/);\n const pidMatch = output.match(/Main PID:\\s+(\\d+)/);\n\n process.stdout.write(`\u25CF ${unit} (${scope} scope)\\n`);\n process.stdout.write(` ${activeMatch?.[1] ?? \"unknown\"}\\n`);\n if (pidMatch) process.stdout.write(` PID: ${pidMatch[1]}\\n`);\n\n // Bridge info from bridge.lock\n const home = abtarsHome();\n const lockPath = join(home, \"bridge.lock\");\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n if (lock.pid) process.stdout.write(` Bridge PID: ${lock.pid}\\n`);\n if (lock.startedAt) {\n const upMs = Date.now() - new Date(lock.startedAt).getTime();\n const upMin = Math.round(upMs / 60000);\n process.stdout.write(` Uptime: ${upMin >= 60 ? `${Math.floor(upMin / 60)}h ${upMin % 60}m` : `${upMin}m`}\\n`);\n }\n if (lock.version) process.stdout.write(` Version: ${lock.version}\\n`);\n if (lock.restartReason) process.stdout.write(` Last restart: ${lock.restartReason}\\n`);\n } catch { /* ignore */ }\n }\n return 0;\n}\n\n// \u2500\u2500 router \u2500\u2500\n\nexport async function daemon(args: string[]): Promise<number> {\n const sub = args[0] ?? \"status\";\n switch (sub) {\n case \"install\": return daemonInstall();\n case \"uninstall\": return daemonUninstall();\n case \"start\": return daemonControl(\"start\");\n case \"stop\": return daemonControl(\"stop\");\n case \"restart\": return daemonControl(\"restart\");\n case \"status\": return daemonStatus();\n default:\n process.stderr.write(`Unknown: abtars daemon ${sub}\\nUsage: abtars daemon [install|uninstall|start|stop|restart|status]\\n`);\n return 1;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAMA;AAHA,SAAS,YAAY,oBAAoB;AACzC,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAG9B,SAAS,aAAqB;AAC5B,SAAO,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,SAAS;AAChF;AAEA,SAAS,QAAiB;AACxB,MAAI;AAAE,WAAO,aAAa,iBAAiB,OAAO,EAAE,YAAY,EAAE,SAAS,WAAW;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAO;AACnH;AAIA,SAAS,cAAqB;AAC5B,MAAI,WAAW,oCAAoC,EAAG,QAAO;AAC7D,QAAM,WAAW,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,WAAW,WAAW,QAAQ,yBAAyB;AACxG,MAAI,WAAW,QAAQ,EAAG,QAAO;AACjC,SAAO;AACT;AACA,SAAS,SAAS,OAAsB;AACtC,SAAO,UAAU,SAAS,oBAAoB;AAChD;AAIA,eAAe,gBAAiC;AAC9C,QAAM,WAAW,QAAQ;AACzB,QAAM,UAAU,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,IAAI;AAElE,MAAI,aAAa,WAAW,MAAM,GAAG;AACnC,YAAQ,OAAO,MAAM;AAAA,CAAgF;AAAA,EACvG;AAEA,QAAM,WAAW,QAAQ,IAAI,WAAW;AACxC,MAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,YAAQ,OAAO;AAAA,MACb;AAAA;AAAA;AAAA,IAEF;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU;AACb,YAAQ,OAAO,MAAM;AAAA,CAAyD;AAC9E,WAAO;AAAA,EACT;AAGA,QAAM,EAAE,UAAU,aAAa,IAAI,MAAM,OAAO,oBAAoB;AACpE,QAAM,WAAW,aAAa,cAAc,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AACpF,QAAM,OAAO,KAAK,UAAU,SAAS;AAErC,QAAM,cAAc,KAAK,MAAM,SAAS;AACxC,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,YAAQ,OAAO,MAAM;AAAA,CAAkD;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,UAAU;AACzB,UAAM,EAAE,UAAU,aAAa,IAAI,MAAM,OAAO,oBAAoB;AACpE,QAAI,QAAQ;AACZ,QAAI;AAAE,cAAQ,SAAS,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAEhI,UAAM,WAAW,KAAK,SAAS,WAAW,yBAAyB;AACnE,QAAI,CAAC,WAAW,QAAQ,GAAG;AAAE,cAAQ,OAAO,MAAM,uBAAuB,QAAQ;AAAA,CAAI;AAAG,aAAO;AAAA,IAAG;AAClG,QAAI,UAAU,aAAa,UAAU,OAAO;AAC5C,cAAU,QAAQ,WAAW,YAAY,QAAQ,EAAE,WAAW,aAAa,KAAK;AAChF,UAAM,MAAM;AAEZ,UAAM,EAAE,eAAe,UAAU,IAAI,MAAM,OAAO,SAAS;AAC3D,kBAAc,KAAK,OAAO;AAC1B,cAAU,KAAK,GAAK;AACpB,QAAI;AAAE,mBAAa,aAAa,CAAC,aAAa,UAAU,GAAG,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AACnH,YAAQ,OAAO,MAAM,oCAA+B,GAAG;AAAA,CAAI;AAC3D,YAAQ,OAAO,MAAM,yBAAoB,QAAQ;AAAA,CAA8B;AAC/E,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,SAAS;AACxB,UAAM,EAAE,UAAU,aAAa,IAAI,MAAM,OAAO,oBAAoB;AACpE,QAAI;AAAE,eAAS,uBAAuB,EAAE,OAAO,SAAS,CAAC;AAAA,IAAG,QAAQ;AAClE,cAAQ,OAAO,MAAM;AAAA,CAA2C;AAChE,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,SAAS,WAAW,uBAAuB;AAChE,QAAI,CAAC,WAAW,OAAO,GAAG;AAAE,cAAQ,OAAO,MAAM,uBAAuB,OAAO;AAAA,CAAI;AAAG,aAAO;AAAA,IAAG;AAChG,QAAI,UAAU,aAAa,SAAS,OAAO;AAC3C,cAAU,QAAQ,WAAW,YAAY,QAAQ;AACjD,UAAM,MAAM;AAEZ,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,SAAS;AAChD,kBAAc,KAAK,OAAO;AAC1B,iBAAa,aAAa,CAAC,eAAe,CAAC;AAC3C,iBAAa,aAAa,CAAC,UAAU,SAAS,QAAQ,CAAC;AAEvD,UAAM,eAAe,KAAK,MAAM,eAAe;AAC/C,QAAI;AACF,YAAM,EAAE,cAAc,KAAK,eAAe,IAAI,IAAI,MAAM,OAAO,SAAS;AACxE,YAAM,KAAK,KAAK,MAAM,IAAI,cAAc,OAAO,CAAC;AAChD,SAAG,cAAc;AACjB,UAAI,cAAc,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,IAAI;AAAA,IACtD,QAAQ;AAAA,IAAoB;AAC5B,YAAQ,OAAO,MAAM,oCAA+B,GAAG;AAAA,CAAI;AAC3D,YAAQ,OAAO,MAAM,yBAAoB,QAAQ;AAAA,CAA8B;AAC/E,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM,yBAAyB,QAAQ;AAAA,CAAI;AAC1D,SAAO;AACT;AAIA,eAAe,kBAAmC;AAChD,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,OAAO;AAAE,YAAQ,OAAO,MAAM,4BAA4B;AAAG,WAAO;AAAA,EAAG;AAE5E,MAAI,UAAU,UAAU;AACtB,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,cAAQ,OAAO,MAAM;AAAA,CAA2D;AAChF,aAAO;AAAA,IACT;AACA,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,oBAAoB;AAC1D,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,SAAS;AAC7C,QAAI;AAAE,mBAAa,aAAa,CAAC,QAAQ,QAAQ,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AACzG,QAAI;AAAE,mBAAa,aAAa,CAAC,WAAW,QAAQ,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAC5G,QAAI;AAAE,iBAAW,oCAAoC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAC5G,QAAI;AAAE,mBAAa,aAAa,CAAC,eAAe,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AACxG,YAAQ,OAAO,MAAM,iCAA4B;AAAA,EACnD,OAAO;AACL,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,oBAAoB;AAC1D,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,SAAS;AAC7C,UAAM,OAAO,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,WAAW,WAAW,QAAQ,yBAAyB;AACpG,QAAI;AAAE,mBAAa,aAAa,CAAC,UAAU,QAAQ,iBAAiB,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAC5H,QAAI;AAAE,mBAAa,aAAa,CAAC,UAAU,WAAW,iBAAiB,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAC/H,QAAI;AAAE,iBAAW,IAAI;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAC5E,QAAI;AAAE,mBAAa,aAAa,CAAC,UAAU,eAAe,CAAC;AAAA,IAAG,SAAS,KAAK;AAAE,oBAAc,UAAU,MAAM,GAAG;AAAA,IAAG;AAClH,YAAQ,OAAO,MAAM,+BAA0B;AAAA,EACjD;AACA,SAAO;AACT;AAIA,eAAe,cAAc,QAAuD;AAClF,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,OAAO;AAAE,YAAQ,OAAO,MAAM,uDAAuD;AAAG,WAAO;AAAA,EAAG;AACvG,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,oBAAoB;AAC1D,QAAM,OAAO,SAAS,KAAK;AAC3B,QAAM,OAAO,UAAU,SAAS,CAAC,UAAU,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI;AACxE,MAAI;AACF,iBAAa,aAAa,MAAM,EAAE,OAAO,UAAU,CAAC;AACpD,YAAQ,OAAO,MAAM,UAAK,MAAM,IAAI,IAAI;AAAA,CAAI;AAAA,EAC9C,QAAQ;AACN,YAAQ,OAAO,MAAM,UAAK,MAAM;AAAA,CAAW;AAC3C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAIA,eAAe,eAAgC;AAC7C,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,OAAO;AACV,YAAQ,OAAO,MAAM,gCAAgC;AACrD,YAAQ,OAAO,MAAM,kDAAkD;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,oBAAoB;AACvD,QAAM,OAAO,SAAS,KAAK;AAC3B,QAAM,OAAO,UAAU,SAAS,CAAC,UAAU,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI;AAC5E,QAAM,IAAI,UAAU,aAAa,MAAM,EAAE,UAAU,SAAS,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC/F,QAAM,SAAS,EAAE,UAAU,EAAE,UAAU;AAGvC,QAAM,cAAc,OAAO,MAAM,gBAAgB;AACjD,QAAM,WAAW,OAAO,MAAM,mBAAmB;AAEjD,UAAQ,OAAO,MAAM,UAAK,IAAI,KAAK,KAAK;AAAA,CAAW;AACnD,UAAQ,OAAO,MAAM,KAAK,cAAc,CAAC,KAAK,SAAS;AAAA,CAAI;AAC3D,MAAI,SAAU,SAAQ,OAAO,MAAM,UAAU,SAAS,CAAC,CAAC;AAAA,CAAI;AAG5D,QAAM,OAAO,WAAW;AACxB,QAAM,WAAW,KAAK,MAAM,aAAa;AACzC,MAAI,WAAW,QAAQ,GAAG;AACxB,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AACvD,UAAI,KAAK,IAAK,SAAQ,OAAO,MAAM,iBAAiB,KAAK,GAAG;AAAA,CAAI;AAChE,UAAI,KAAK,WAAW;AAClB,cAAM,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AAC3D,cAAM,QAAQ,KAAK,MAAM,OAAO,GAAK;AACrC,gBAAQ,OAAO,MAAM,aAAa,SAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,EAAE,CAAC,KAAK,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG;AAAA,CAAI;AAAA,MAC/G;AACA,UAAI,KAAK,QAAS,SAAQ,OAAO,MAAM,cAAc,KAAK,OAAO;AAAA,CAAI;AACrE,UAAI,KAAK,cAAe,SAAQ,OAAO,MAAM,mBAAmB,KAAK,aAAa;AAAA,CAAI;AAAA,IACxF,QAAQ;AAAA,IAAe;AAAA,EACzB;AACA,SAAO;AACT;AAIA,eAAsB,OAAO,MAAiC;AAC5D,QAAM,MAAM,KAAK,CAAC,KAAK;AACvB,UAAQ,KAAK;AAAA,IACX,KAAK;AAAW,aAAO,cAAc;AAAA,IACrC,KAAK;AAAa,aAAO,gBAAgB;AAAA,IACzC,KAAK;AAAS,aAAO,cAAc,OAAO;AAAA,IAC1C,KAAK;AAAQ,aAAO,cAAc,MAAM;AAAA,IACxC,KAAK;AAAW,aAAO,cAAc,SAAS;AAAA,IAC9C,KAAK;AAAU,aAAO,aAAa;AAAA,IACnC;AACE,cAAQ,OAAO,MAAM,0BAA0B,GAAG;AAAA;AAAA,CAAwE;AAC1H,aAAO;AAAA,EACX;AACF;",
6
+ "names": []
7
+ }
package/bundle/meta.json CHANGED
@@ -28518,7 +28518,7 @@
28518
28518
  "format": "esm"
28519
28519
  },
28520
28520
  "src/cli/commands/update.ts": {
28521
- "bytes": 15316,
28521
+ "bytes": 15386,
28522
28522
  "imports": [
28523
28523
  {
28524
28524
  "path": "src/components/log-and-swallow.ts",
@@ -28570,6 +28570,11 @@
28570
28570
  "kind": "dynamic-import",
28571
28571
  "external": true
28572
28572
  },
28573
+ {
28574
+ "path": "node:fs",
28575
+ "kind": "dynamic-import",
28576
+ "external": true
28577
+ },
28573
28578
  {
28574
28579
  "path": "node:child_process",
28575
28580
  "kind": "dynamic-import",
@@ -28819,7 +28824,7 @@
28819
28824
  "format": "esm"
28820
28825
  },
28821
28826
  "src/cli/commands/daemon.ts": {
28822
- "bytes": 8982,
28827
+ "bytes": 9351,
28823
28828
  "imports": [
28824
28829
  {
28825
28830
  "path": "node:fs",
@@ -28866,6 +28871,11 @@
28866
28871
  "kind": "dynamic-import",
28867
28872
  "external": true
28868
28873
  },
28874
+ {
28875
+ "path": "node:fs",
28876
+ "kind": "dynamic-import",
28877
+ "external": true
28878
+ },
28869
28879
  {
28870
28880
  "path": "node:child_process",
28871
28881
  "kind": "dynamic-import",
@@ -29148,16 +29158,16 @@
29148
29158
  }
29149
29159
  },
29150
29160
  "outputs": {
29151
- "bundle/update-U7M63AAV.js.map": {
29161
+ "bundle/update-RWL26Q5R.js.map": {
29152
29162
  "imports": [],
29153
29163
  "exports": [],
29154
29164
  "inputs": {},
29155
29165
  "bytes": 93
29156
29166
  },
29157
- "bundle/update-U7M63AAV.js": {
29167
+ "bundle/update-RWL26Q5R.js": {
29158
29168
  "imports": [
29159
29169
  {
29160
- "path": "bundle/chunk-3Z3EP7E6.js",
29170
+ "path": "bundle/chunk-XIEKGESU.js",
29161
29171
  "kind": "import-statement"
29162
29172
  },
29163
29173
  {
@@ -29264,13 +29274,13 @@
29264
29274
  },
29265
29275
  "bytes": 1250
29266
29276
  },
29267
- "bundle/daemon-KGP6PZ5P.js.map": {
29277
+ "bundle/daemon-VIBI3SQQ.js.map": {
29268
29278
  "imports": [],
29269
29279
  "exports": [],
29270
29280
  "inputs": {},
29271
- "bytes": 15697
29281
+ "bytes": 16322
29272
29282
  },
29273
- "bundle/daemon-KGP6PZ5P.js": {
29283
+ "bundle/daemon-VIBI3SQQ.js": {
29274
29284
  "imports": [
29275
29285
  {
29276
29286
  "path": "bundle/chunk-EX2SRTUE.js",
@@ -29328,6 +29338,11 @@
29328
29338
  "kind": "dynamic-import",
29329
29339
  "external": true
29330
29340
  },
29341
+ {
29342
+ "path": "node:fs",
29343
+ "kind": "dynamic-import",
29344
+ "external": true
29345
+ },
29331
29346
  {
29332
29347
  "path": "node:child_process",
29333
29348
  "kind": "dynamic-import",
@@ -29365,10 +29380,10 @@
29365
29380
  "entryPoint": "src/cli/commands/daemon.ts",
29366
29381
  "inputs": {
29367
29382
  "src/cli/commands/daemon.ts": {
29368
- "bytesInOutput": 8655
29383
+ "bytesInOutput": 8982
29369
29384
  }
29370
29385
  },
29371
- "bytes": 9314
29386
+ "bytes": 9641
29372
29387
  },
29373
29388
  "bundle/logs-EK4HYRKR.js.map": {
29374
29389
  "imports": [],
@@ -40038,7 +40053,7 @@
40038
40053
  "bundle/abtars-cli.js": {
40039
40054
  "imports": [
40040
40055
  {
40041
- "path": "bundle/chunk-3Z3EP7E6.js",
40056
+ "path": "bundle/chunk-XIEKGESU.js",
40042
40057
  "kind": "import-statement"
40043
40058
  },
40044
40059
  {
@@ -40201,7 +40216,7 @@
40201
40216
  "external": true
40202
40217
  },
40203
40218
  {
40204
- "path": "bundle/update-U7M63AAV.js",
40219
+ "path": "bundle/update-RWL26Q5R.js",
40205
40220
  "kind": "dynamic-import"
40206
40221
  },
40207
40222
  {
@@ -40247,7 +40262,7 @@
40247
40262
  "kind": "dynamic-import"
40248
40263
  },
40249
40264
  {
40250
- "path": "bundle/daemon-KGP6PZ5P.js",
40265
+ "path": "bundle/daemon-VIBI3SQQ.js",
40251
40266
  "kind": "dynamic-import"
40252
40267
  },
40253
40268
  {
@@ -40295,13 +40310,13 @@
40295
40310
  },
40296
40311
  "bytes": 52367
40297
40312
  },
40298
- "bundle/chunk-3Z3EP7E6.js.map": {
40313
+ "bundle/chunk-XIEKGESU.js.map": {
40299
40314
  "imports": [],
40300
40315
  "exports": [],
40301
40316
  "inputs": {},
40302
- "bytes": 46423
40317
+ "bytes": 46545
40303
40318
  },
40304
- "bundle/chunk-3Z3EP7E6.js": {
40319
+ "bundle/chunk-XIEKGESU.js": {
40305
40320
  "imports": [
40306
40321
  {
40307
40322
  "path": "bundle/chunk-HXJRZWKA.js",
@@ -40386,6 +40401,11 @@
40386
40401
  "kind": "dynamic-import",
40387
40402
  "external": true
40388
40403
  },
40404
+ {
40405
+ "path": "node:fs",
40406
+ "kind": "dynamic-import",
40407
+ "external": true
40408
+ },
40389
40409
  {
40390
40410
  "path": "node:child_process",
40391
40411
  "kind": "dynamic-import",
@@ -40442,7 +40462,7 @@
40442
40462
  ],
40443
40463
  "inputs": {
40444
40464
  "src/cli/commands/update.ts": {
40445
- "bytesInOutput": 12734
40465
+ "bytesInOutput": 12804
40446
40466
  },
40447
40467
  "src/cli/update-sources/local.ts": {
40448
40468
  "bytesInOutput": 7019
@@ -40454,7 +40474,7 @@
40454
40474
  "bytesInOutput": 994
40455
40475
  }
40456
40476
  },
40457
- "bytes": 23526
40477
+ "bytes": 23596
40458
40478
  },
40459
40479
  "bundle/chunk-RB3X66KM.js.map": {
40460
40480
  "imports": [],
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+ import {
4
+ update
5
+ } from "./chunk-XIEKGESU.js";
6
+ import "./chunk-HXJRZWKA.js";
7
+ import "./chunk-EX2SRTUE.js";
8
+ import "./chunk-2BY6I4P5.js";
9
+ import "./chunk-MJ6PHMOK.js";
10
+ import "./chunk-7K2YZTLD.js";
11
+ export {
12
+ update
13
+ };
14
+ //# sourceMappingURL=update-RWL26Q5R.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abtars",
3
- "version": "0.1.0-alpha.13",
3
+ "version": "0.1.0-alpha.15",
4
4
  "description": "Standalone agent bridging Telegram to Kiro CLI via tmux/ACP",
5
5
  "type": "module",
6
6
  "main": "bundle/abtars.js",