@songsid/agend 2.1.4-beta.2 → 2.1.4-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/backend/claude-code.js +23 -2
  2. package/dist/backend/claude-code.js.map +1 -1
  3. package/dist/channel/adapters/discord.js +12 -6
  4. package/dist/channel/adapters/discord.js.map +1 -1
  5. package/dist/channel/types.d.ts +1 -1
  6. package/dist/cli.js +65 -13
  7. package/dist/cli.js.map +1 -1
  8. package/dist/completion-install.d.ts +70 -0
  9. package/dist/completion-install.js +152 -0
  10. package/dist/completion-install.js.map +1 -0
  11. package/dist/completion.d.ts +7 -1
  12. package/dist/completion.js +14 -4
  13. package/dist/completion.js.map +1 -1
  14. package/dist/daemon.js +8 -3
  15. package/dist/daemon.js.map +1 -1
  16. package/dist/fleet-context.d.ts +3 -0
  17. package/dist/fleet-manager.d.ts +54 -3
  18. package/dist/fleet-manager.js +452 -168
  19. package/dist/fleet-manager.js.map +1 -1
  20. package/dist/instance-lifecycle.d.ts +6 -0
  21. package/dist/instance-lifecycle.js +45 -25
  22. package/dist/instance-lifecycle.js.map +1 -1
  23. package/dist/locale.js +68 -0
  24. package/dist/locale.js.map +1 -1
  25. package/dist/quickstart.js +25 -0
  26. package/dist/quickstart.js.map +1 -1
  27. package/dist/restart-progress.d.ts +7 -1
  28. package/dist/restart-progress.js +27 -6
  29. package/dist/restart-progress.js.map +1 -1
  30. package/dist/topic-commands.js +3 -1
  31. package/dist/topic-commands.js.map +1 -1
  32. package/dist/update-marker.d.ts +30 -0
  33. package/dist/update-marker.js +71 -20
  34. package/dist/update-marker.js.map +1 -1
  35. package/dist/update-progress.d.ts +6 -0
  36. package/dist/update-progress.js +29 -0
  37. package/dist/update-progress.js.map +1 -0
  38. package/package.json +1 -1
@@ -13,7 +13,7 @@
13
13
  * machine reboots) must not leave the fleet permanently unable to report a real
14
14
  * crash — a stale marker is ignored, and the next fleet startup deletes it.
15
15
  */
16
- import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
16
+ import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
17
17
  import { join } from "node:path";
18
18
  /**
19
19
  * How long a marker is believed. Long enough for a slow npm install plus a
@@ -25,16 +25,75 @@ const FILE = "update-in-progress.json";
25
25
  function markerPath(dataDir) {
26
26
  return join(dataDir, FILE);
27
27
  }
28
- /** Called by `agend update` before it touches anything. */
29
- export function markUpdateInProgress(dataDir, now = Date.now()) {
28
+ function readMarker(dataDir) {
29
+ try {
30
+ const parsed = JSON.parse(readFileSync(markerPath(dataDir), "utf-8"));
31
+ if (typeof parsed.startedAt !== "number" || !Number.isFinite(parsed.startedAt))
32
+ return null;
33
+ if (typeof parsed.pid !== "number" || !Number.isFinite(parsed.pid))
34
+ return null;
35
+ return parsed;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ function writeMarker(dataDir, marker) {
42
+ const path = markerPath(dataDir);
43
+ const temp = `${path}.${process.pid}.${Date.now()}.tmp`;
30
44
  try {
31
- writeFileSync(markerPath(dataDir), JSON.stringify({ startedAt: now, pid: process.pid }));
45
+ writeFileSync(temp, JSON.stringify(marker), { mode: 0o600 });
46
+ renameSync(temp, path);
47
+ return true;
32
48
  }
33
49
  catch {
34
- // Best effort: failing to write the marker costs a few spurious alerts,
35
- // which is not a reason to abort someone's upgrade.
50
+ try {
51
+ unlinkSync(temp);
52
+ }
53
+ catch { /* best effort */ }
54
+ return false;
36
55
  }
37
56
  }
57
+ /** Persist the channel message that `/update` will edit across process restart. */
58
+ export function beginUpdateProgress(dataDir, target, now = Date.now()) {
59
+ writeMarker(dataDir, {
60
+ startedAt: now,
61
+ pid: process.pid,
62
+ progress: { stage: "preparing", target },
63
+ });
64
+ }
65
+ /** Read the live progress contract shared by the old CLI and the new fleet. */
66
+ export function readUpdateProgress(dataDir) {
67
+ const marker = readMarker(dataDir);
68
+ if (!marker?.progress?.target?.messageId || !marker.progress.target.adapterId)
69
+ return null;
70
+ return marker;
71
+ }
72
+ /** Advance the cross-process progress state without losing its message target. */
73
+ export function setUpdateProgressStage(dataDir, stage, details = {}) {
74
+ const marker = readMarker(dataDir);
75
+ if (!marker?.progress)
76
+ return false;
77
+ const previousStage = marker.progress.stage;
78
+ marker.pid = process.pid;
79
+ marker.progress = {
80
+ ...marker.progress,
81
+ stage,
82
+ ...(details.version !== undefined ? { version: details.version } : {}),
83
+ ...(details.error !== undefined ? { error: details.error.replace(/\s+/g, " ").trim().slice(0, 300) } : {}),
84
+ ...(stage === "failed" ? { failedStage: previousStage } : {}),
85
+ };
86
+ return writeMarker(dataDir, marker);
87
+ }
88
+ /** Called by `agend update` before it touches anything. */
89
+ export function markUpdateInProgress(dataDir, now = Date.now()) {
90
+ const existing = readMarker(dataDir);
91
+ writeMarker(dataDir, {
92
+ startedAt: existing?.startedAt ?? now,
93
+ pid: process.pid,
94
+ ...(existing?.progress ? { progress: existing.progress } : {}),
95
+ });
96
+ }
38
97
  /** Called when the update finishes or gives up, and by the new fleet on startup. */
39
98
  export function clearUpdateMarker(dataDir) {
40
99
  try {
@@ -47,23 +106,15 @@ export function clearUpdateMarker(dataDir) {
47
106
  * abandoned marker must not silence real incidents forever.
48
107
  */
49
108
  export function isUpdateInProgress(dataDir, now = Date.now()) {
50
- const path = markerPath(dataDir);
51
- if (!existsSync(path))
109
+ if (!existsSync(markerPath(dataDir)))
52
110
  return false;
53
- let startedAt = null;
54
- try {
55
- const parsed = JSON.parse(readFileSync(path, "utf-8"));
56
- if (typeof parsed.startedAt === "number" && Number.isFinite(parsed.startedAt)) {
57
- startedAt = parsed.startedAt;
58
- }
59
- }
60
- catch {
61
- // Truncated or hand-edited: treat as unknown age rather than as fresh.
62
- }
63
- if (startedAt === null)
111
+ const marker = readMarker(dataDir);
112
+ if (!marker)
113
+ return false;
114
+ if (marker.progress?.stage === "failed" || marker.progress?.stage === "complete")
64
115
  return false;
65
116
  // A clock jump backwards would otherwise make a marker look infinitely fresh.
66
- const age = now - startedAt;
117
+ const age = now - marker.startedAt;
67
118
  return age >= 0 && age < UPDATE_MARKER_MAX_AGE_MS;
68
119
  }
69
120
  //# sourceMappingURL=update-marker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-marker.js","sourceRoot":"","sources":["../src/update-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,MAAM,CAAC;AAEpD,MAAM,IAAI,GAAG,yBAAyB,CAAC;AAEvC,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACpE,IAAI,CAAC;QACH,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,oDAAoD;IACtD,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC;QAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAClE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAA4B,CAAC;QAClF,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9E,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;IACzE,CAAC;IACD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACrC,8EAA8E;IAC9E,MAAM,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC;IAC5B,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,wBAAwB,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"update-marker.js","sourceRoot":"","sources":["../src/update-marker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { UpdateMarker } from "./update-marker.js";
2
+ export declare function updateElapsedSeconds(startedAt: number, now?: number): number;
3
+ /** Render the persisted CLI-side stage while the old fleet is still alive. */
4
+ export declare function formatUpdateProgress(marker: UpdateMarker & {
5
+ progress: NonNullable<UpdateMarker["progress"]>;
6
+ }, now?: number): string;
@@ -0,0 +1,29 @@
1
+ import { t } from "./locale.js";
2
+ export function updateElapsedSeconds(startedAt, now = Date.now()) {
3
+ return Math.max(0, Math.floor((now - startedAt) / 1000));
4
+ }
5
+ function stageLabel(stage) {
6
+ return t(`update.stage.${stage ?? "preparing"}`);
7
+ }
8
+ /** Render the persisted CLI-side stage while the old fleet is still alive. */
9
+ export function formatUpdateProgress(marker, now = Date.now()) {
10
+ const elapsed = updateElapsedSeconds(marker.startedAt, now);
11
+ const progress = marker.progress;
12
+ switch (progress.stage) {
13
+ case "preparing":
14
+ return t("update.progress.preparing", elapsed);
15
+ case "downloading":
16
+ return t("update.progress.downloading", elapsed);
17
+ case "installed":
18
+ return t("update.progress.installed", progress.version ?? "?", elapsed);
19
+ case "stopping":
20
+ return t("update.progress.stopping", elapsed);
21
+ case "starting":
22
+ return t("update.progress.starting", elapsed);
23
+ case "complete":
24
+ return t("update.progress.already_current", progress.version ?? "?", elapsed);
25
+ case "failed":
26
+ return t("update.progress.failed", stageLabel(progress.failedStage), progress.error ?? "unknown error", elapsed);
27
+ }
28
+ }
29
+ //# sourceMappingURL=update-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-progress.js","sourceRoot":"","sources":["../src/update-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAGhC,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,KAAsC;IACxD,OAAO,CAAC,CAAC,gBAAgB,KAAK,IAAI,WAAW,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,MAA0E,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/H,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,QAAQ,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,CAAC,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;QACjD,KAAK,aAAa;YAChB,OAAO,CAAC,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QACnD,KAAK,WAAW;YACd,OAAO,CAAC,CAAC,2BAA2B,EAAE,QAAQ,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1E,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,iCAAiC,EAAE,QAAQ,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;QAChF,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,wBAAwB,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,KAAK,IAAI,eAAe,EAAE,OAAO,CAAC,CAAC;IACrH,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.1.4-beta.2",
3
+ "version": "2.1.4-beta.4",
4
4
  "description": "Multi-agent fleet daemon — run any coding CLI (Claude, Gemini, Codex, OpenCode) from Telegram",
5
5
  "type": "module",
6
6
  "bin": {