@songsid/agend 2.3.1 → 2.3.2-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/agent-cli.js +21 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +5 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/antigravity-usage-scan.d.ts +58 -0
- package/dist/antigravity-usage-scan.js +257 -0
- package/dist/antigravity-usage-scan.js.map +1 -0
- package/dist/antigravity-usage-worker.d.ts +1 -0
- package/dist/antigravity-usage-worker.js +10 -0
- package/dist/antigravity-usage-worker.js.map +1 -0
- package/dist/auth-api.js +4 -0
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +4 -0
- package/dist/authority/authority-state.js +16 -10
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +7 -1
- package/dist/authority/session-authorizations.js +6 -4
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +19 -6
- package/dist/authority/web-authority.js +22 -8
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +64 -0
- package/dist/backend/kiro-identity.js +101 -0
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro-retired-model.d.ts +62 -0
- package/dist/backend/kiro-retired-model.js +160 -0
- package/dist/backend/kiro-retired-model.js.map +1 -0
- package/dist/backend/kiro.d.ts +71 -2
- package/dist/backend/kiro.js +352 -11
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/types.d.ts +59 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-signin-guide.d.ts +1 -0
- package/dist/backend-signin-guide.js +9 -0
- package/dist/backend-signin-guide.js.map +1 -0
- package/dist/backend-signin-pending.d.ts +10 -0
- package/dist/backend-signin-pending.js +44 -0
- package/dist/backend-signin-pending.js.map +1 -0
- package/dist/browser-backend-signins.d.ts +56 -0
- package/dist/browser-backend-signins.js +189 -0
- package/dist/browser-backend-signins.js.map +1 -0
- package/dist/cache-ledger.d.ts +38 -2
- package/dist/cache-ledger.js +133 -8
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-prices.d.ts +2 -1
- package/dist/cache-prices.js +5 -2
- package/dist/cache-prices.js.map +1 -1
- package/dist/cache-service.d.ts +68 -0
- package/dist/cache-service.js +355 -13
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +13 -0
- package/dist/channel/adapters/discord.js +103 -16
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +34 -7
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.js +2 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +11 -0
- package/dist/classic-channel-manager.d.ts +11 -0
- package/dist/classic-channel-manager.js +39 -1
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +21 -2
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.d.ts +7 -1
- package/dist/config-validator.js +92 -12
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.js +31 -1
- package/dist/config.js.map +1 -1
- package/dist/cpu-quota.d.ts +23 -0
- package/dist/cpu-quota.js +86 -0
- package/dist/cpu-quota.js.map +1 -0
- package/dist/daemon.d.ts +57 -3
- package/dist/daemon.js +330 -50
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +20 -6
- package/dist/dashboard-permissions.js +58 -9
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-outbox.d.ts +12 -1
- package/dist/delivery-outbox.js +67 -15
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +11 -1
- package/dist/doctor.js.map +1 -1
- package/dist/event-log.d.ts +5 -0
- package/dist/event-log.js +13 -0
- package/dist/event-log.js.map +1 -1
- package/dist/fleet-manager.d.ts +212 -0
- package/dist/fleet-manager.js +914 -111
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +1 -0
- package/dist/fleet-process-handlers.js +9 -1
- package/dist/fleet-process-handlers.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +9 -0
- package/dist/forged-envelope-scan.js +30 -5
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +14 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +28 -5
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +31 -8
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +138 -59
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +145 -61
- package/dist/guest-seen-people.d.ts +38 -0
- package/dist/guest-seen-people.js +78 -0
- package/dist/guest-seen-people.js.map +1 -0
- package/dist/instance-config-impact.js +14 -6
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +20 -0
- package/dist/instance-lifecycle.js +71 -13
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/kiro-db-reader.d.ts +5 -0
- package/dist/kiro-db-reader.js +18 -0
- package/dist/kiro-db-reader.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +2 -0
- package/dist/kiro-engine-status.js +9 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-migrate.d.ts +49 -0
- package/dist/kiro-migrate.js +105 -0
- package/dist/kiro-migrate.js.map +1 -0
- package/dist/kiro-transcript-lane.d.ts +2 -0
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/kiro-transcript-worker.js +1 -0
- package/dist/kiro-transcript-worker.js.map +1 -1
- package/dist/kiro-tui-forensic.d.ts +7 -0
- package/dist/kiro-tui-forensic.js +110 -0
- package/dist/kiro-tui-forensic.js.map +1 -0
- package/dist/kiro-usage-run.d.ts +7 -0
- package/dist/kiro-usage-run.js +39 -0
- package/dist/kiro-usage-run.js.map +1 -0
- package/dist/kiro-usage-scan.d.ts +49 -0
- package/dist/kiro-usage-scan.js +223 -0
- package/dist/kiro-usage-scan.js.map +1 -0
- package/dist/kiro-usage-worker.d.ts +1 -0
- package/dist/kiro-usage-worker.js +10 -0
- package/dist/kiro-usage-worker.js.map +1 -0
- package/dist/kiro-usage.d.ts +58 -0
- package/dist/kiro-usage.js +310 -0
- package/dist/kiro-usage.js.map +1 -0
- package/dist/locale.js +120 -12
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -1
- package/dist/log-service.js.map +1 -1
- package/dist/login-url.d.ts +4 -0
- package/dist/login-url.js +22 -0
- package/dist/login-url.js.map +1 -0
- package/dist/mac-auto-restore.d.ts +117 -0
- package/dist/mac-auto-restore.js +294 -0
- package/dist/mac-auto-restore.js.map +1 -0
- package/dist/needs-you-hub.d.ts +2 -1
- package/dist/needs-you-hub.js +1 -1
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +8 -2
- package/dist/needs-you.js +6 -0
- package/dist/needs-you.js.map +1 -1
- package/dist/notice-delivery.d.ts +16 -0
- package/dist/notice-delivery.js +35 -0
- package/dist/notice-delivery.js.map +1 -0
- package/dist/office-share-page.d.ts +16 -0
- package/dist/office-share-page.js +85 -0
- package/dist/office-share-page.js.map +1 -0
- package/dist/office-share-service.d.ts +91 -0
- package/dist/office-share-service.js +176 -0
- package/dist/office-share-service.js.map +1 -0
- package/dist/office-share.d.ts +258 -0
- package/dist/office-share.js +549 -0
- package/dist/office-share.js.map +1 -0
- package/dist/opencode-usage-scan.d.ts +28 -0
- package/dist/opencode-usage-scan.js +92 -0
- package/dist/opencode-usage-scan.js.map +1 -0
- package/dist/opencode-usage-worker.d.ts +1 -0
- package/dist/opencode-usage-worker.js +10 -0
- package/dist/opencode-usage-worker.js.map +1 -0
- package/dist/outbound-handlers.js +22 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +28 -2
- package/dist/outbound-schemas.js +29 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +16 -2
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/quickstart-api.js +13 -2
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.js +2 -1
- package/dist/quickstart.js.map +1 -1
- package/dist/remote-card-answer.d.ts +83 -0
- package/dist/remote-card-answer.js +208 -0
- package/dist/remote-card-answer.js.map +1 -0
- package/dist/reply-triggers.d.ts +2 -0
- package/dist/reply-triggers.js +3 -0
- package/dist/reply-triggers.js.map +1 -0
- package/dist/settings-api.d.ts +28 -0
- package/dist/settings-api.js +148 -17
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +54 -17
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +12 -3
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-instance-patch.js +4 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +55 -6
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-host.d.ts +9 -0
- package/dist/setup-host.js +127 -6
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-signin-assets.d.ts +2 -0
- package/dist/setup-signin-assets.js +6 -0
- package/dist/setup-signin-assets.js.map +1 -0
- package/dist/setup-wizard.js +2 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/start-attempt.d.ts +9 -5
- package/dist/start-attempt.js +27 -8
- package/dist/start-attempt.js.map +1 -1
- package/dist/start-failure-chat.d.ts +4 -0
- package/dist/start-failure-chat.js +23 -6
- package/dist/start-failure-chat.js.map +1 -1
- package/dist/start-failure-notice.d.ts +4 -0
- package/dist/start-failure-notice.js +8 -0
- package/dist/start-failure-notice.js.map +1 -1
- package/dist/start-failure.d.ts +25 -0
- package/dist/start-failure.js +75 -2
- package/dist/start-failure.js.map +1 -1
- package/dist/structured-signin-transport.d.ts +8 -0
- package/dist/structured-signin-transport.js +79 -0
- package/dist/structured-signin-transport.js.map +1 -0
- package/dist/structured-signin.d.ts +131 -0
- package/dist/structured-signin.js +388 -0
- package/dist/structured-signin.js.map +1 -0
- package/dist/tool-permissions.js +12 -0
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.js +6 -2
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-sources.d.ts +26 -2
- package/dist/transcript-sources.js +103 -40
- package/dist/transcript-sources.js.map +1 -1
- package/dist/turn-reply-guard.d.ts +25 -0
- package/dist/turn-reply-guard.js +111 -12
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +46 -9
- package/dist/ui/backend-signin.js +68 -12
- package/dist/ui/chat-ambient.js +1 -1
- package/dist/ui/chat-effects.js +4 -4
- package/dist/ui/chat-render.js +5 -2
- package/dist/ui/chat-strings.js +4 -4
- package/dist/ui/chat-thread.js +2 -2
- package/dist/ui/first-run.js +2 -2
- package/dist/ui/fleet-canvas-view.js +114 -0
- package/dist/ui/fleet-canvas.js +15 -77
- package/dist/ui/fleet-office-editor.js +94 -14
- package/dist/ui/fleet-office-layout.js +235 -0
- package/dist/ui/fleet-office-model.js +12 -6
- package/dist/ui/fleet-office-overview.js +167 -0
- package/dist/ui/fleet-office-pack.d.ts +44 -0
- package/dist/ui/fleet-office-pack.js +352 -37
- package/dist/ui/fleet-office-skin.js +220 -36
- package/dist/ui/fleet-office-store.js +112 -7
- package/dist/ui/fleet-office-view.js +155 -0
- package/dist/ui/fleet-office-zones.js +264 -42
- package/dist/ui/fleet-office.js +957 -160
- package/dist/ui/fleet-usage.js +26 -21
- package/dist/ui/office-share-dialog.js +145 -0
- package/dist/ui/office-share-page.js +164 -0
- package/dist/ui/panel-chat.js +9 -2
- package/dist/ui/panel-details.js +2 -2
- package/dist/ui/panel-fleet.js +11 -77
- package/dist/ui/panel-log.js +4 -4
- package/dist/ui/panel-needs.js +4 -4
- package/dist/ui/panel-settings.js +608 -167
- package/dist/ui/search-dialog.js +26 -7
- package/dist/ui/settings-appearance.js +82 -29
- package/dist/ui/settings-apply.js +42 -7
- package/dist/ui/settings-dialogs.js +76 -23
- package/dist/ui/settings-draft.js +51 -0
- package/dist/ui/settings-guests.js +255 -79
- package/dist/ui/settings-learn.js +2 -2
- package/dist/ui/settings-model.js +16 -6
- package/dist/ui/settings-registry.js +146 -0
- package/dist/ui/settings-strings.js +116 -44
- package/dist/ui/settings-web-authority.js +34 -23
- package/dist/ui/shared/app-i18n.js +18 -2
- package/dist/ui/shared/app-nav.js +10 -5
- package/dist/ui/shared/app-prefs.js +80 -2
- package/dist/ui/shared/app-route.js +39 -5
- package/dist/ui/shared/app-shell.js +73 -10
- package/dist/ui/shared/app-stream.js +3 -1
- package/dist/ui/shared/app.css +307 -17
- package/dist/ui/shared/app.js +3 -0
- package/dist/ui/shared/effect-stock-trust.js +1 -1
- package/dist/ui/shared/identity-color.js +4 -4
- package/dist/ui/shared/office/cozy.png +0 -0
- package/dist/ui/shared/side-panel.js +95 -0
- package/dist/ui/shared/signin.js +2 -2
- package/dist/ui/shared/ui-dialog.js +6 -1
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/web-authorize.js +13 -12
- package/dist/ui/structured-signin.js +115 -0
- package/dist/usage-report.d.ts +20 -0
- package/dist/usage-report.js +54 -17
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +9 -1
- package/dist/usage-rollup.js +20 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/web-api.d.ts +26 -2
- package/dist/web-api.js +361 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.js +8 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +1 -7
- package/dist/web-backend-login.js +2 -24
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-experimental.d.ts +1 -1
- package/dist/web-experimental.js +1 -1
- package/dist/web-experimental.js.map +1 -1
- package/dist/web-mod-agent.js +2 -2
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-office-acts.d.ts +173 -0
- package/dist/web-office-acts.js +285 -0
- package/dist/web-office-acts.js.map +1 -0
- package/dist/web-office-skins.d.ts +109 -0
- package/dist/web-office-skins.js +299 -0
- package/dist/web-office-skins.js.map +1 -0
- package/dist/web-office-store.d.ts +8 -2
- package/dist/web-office-store.js +77 -14
- package/dist/web-office-store.js.map +1 -1
- package/dist/web-settings-patch.d.ts +8 -1
- package/dist/web-settings-patch.js +65 -5
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +4 -2
- package/dist/web-shell-routes.js +17 -7
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/working-recovery.d.ts +104 -0
- package/dist/working-recovery.js +298 -0
- package/dist/working-recovery.js.map +1 -0
- package/dist/working-state-journal.d.ts +5 -1
- package/dist/working-state-journal.js +31 -3
- package/dist/working-state-journal.js.map +1 -1
- package/package.json +3 -2
- package/templates/windows-shortcuts.ps1 +155 -140
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { hasInterruptedExecution } from "./working-state-journal.js";
|
|
3
|
+
export const WORKING_RECOVERY_KIND = "working_recovery";
|
|
4
|
+
export const RECOVERY_STABLE_MS = 120_000;
|
|
5
|
+
export const RECOVERY_NORMAL_MS = 30_000;
|
|
6
|
+
export const RECOVERY_PACE_MS = 5_000;
|
|
7
|
+
const taskMetadataOnly = (snapshot) => !hasInterruptedExecution(snapshot) && !snapshot.observation.turn;
|
|
8
|
+
const digest = (value) => createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
9
|
+
export function buildWorkingRecoveryPrompt(tasks, cause, advisory) {
|
|
10
|
+
const ids = tasks.filter(r => r.kind === "task").slice(0, 16).map(r => r.id);
|
|
11
|
+
return `[system:working-recovery] Interrupted work; observed cause: unknown interruption${cause === "unknown_interruption" ? "" : `; prior requested action: ${cause}`}. `
|
|
12
|
+
+ (advisory ? "Advisory: background state is unknown. " : "")
|
|
13
|
+
+ `Task references: ${JSON.stringify(ids)}. Inspect existing jobs, processes, worktrees, receipts and each current card first. `
|
|
14
|
+
+ "Continue only unfinished work still assigned to you, then report normally. Never restart a command or re-send a delegation blindly; do not replay the original request. "
|
|
15
|
+
+ "This is one informational continuation for this work episode.";
|
|
16
|
+
}
|
|
17
|
+
/** Work identity, not boot identity: another failed boot must not create another prompt. */
|
|
18
|
+
export function recoveryKey(instance, snapshot) {
|
|
19
|
+
return digest([instance, snapshot.observation.configuration, snapshot.observation.sessionId,
|
|
20
|
+
snapshot.observation.turn, snapshot.observation.recoveryDeliveryId ?? null,
|
|
21
|
+
[...snapshot.references].sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)))]);
|
|
22
|
+
}
|
|
23
|
+
/** Stage 3 owns task-only episodes. The legacy turn/obligation owners remain intact until stage 4. */
|
|
24
|
+
export function decideWorkingRecovery(episode, live, enabled, card) {
|
|
25
|
+
if (!hasInterruptedExecution(episode.snapshot))
|
|
26
|
+
return { outcome: "excluded", reason: "not_working_at_interruption" };
|
|
27
|
+
if (!enabled)
|
|
28
|
+
return { outcome: "deferred", reason: "opted_out" };
|
|
29
|
+
const snapshot = episode.snapshot, previous = snapshot.observation;
|
|
30
|
+
if (previous.turn?.cancelled || previous.turn?.completionDelivered)
|
|
31
|
+
return { outcome: "excluded", reason: "turn_terminal" };
|
|
32
|
+
if (!live)
|
|
33
|
+
return { outcome: "deferred", reason: "not_running" };
|
|
34
|
+
if (live.stopped)
|
|
35
|
+
return { outcome: "excluded", reason: "session_oom_stopped" };
|
|
36
|
+
if (live.cancelled)
|
|
37
|
+
return { outcome: "excluded", reason: "cancelled" };
|
|
38
|
+
if (previous.configuration !== live.configuration)
|
|
39
|
+
return { outcome: "excluded", reason: "configuration_changed" };
|
|
40
|
+
if (!previous.sessionId || !live.sessionId)
|
|
41
|
+
return { outcome: "deferred", reason: "session_unknown" };
|
|
42
|
+
if (live.freshChoice)
|
|
43
|
+
return { outcome: "excluded", reason: "fresh_session_choice" };
|
|
44
|
+
if (previous.sessionId !== live.sessionId && !live.crashLoopFresh)
|
|
45
|
+
return { outcome: "excluded", reason: "session_changed" };
|
|
46
|
+
if (live.legacyPending)
|
|
47
|
+
return { outcome: "deferred", reason: "legacy_pending" };
|
|
48
|
+
if (previous.turn || live.legacyCovered || snapshot.references.some(r => r.kind === "owed")) {
|
|
49
|
+
return { outcome: "excluded", reason: "legacy_owned" };
|
|
50
|
+
}
|
|
51
|
+
if (snapshot.unavailable.length || snapshot.totalReferences > snapshot.references.length)
|
|
52
|
+
return { outcome: "deferred", reason: "references_incomplete" };
|
|
53
|
+
const tasks = [];
|
|
54
|
+
for (const ref of snapshot.references) {
|
|
55
|
+
if (ref.kind !== "task")
|
|
56
|
+
continue; // waiting on another agent never authorizes a resend
|
|
57
|
+
const current = card(ref.id);
|
|
58
|
+
if (current === null)
|
|
59
|
+
return { outcome: "deferred", reason: "task_store_unavailable" };
|
|
60
|
+
if (!current || current.assignee !== episode.instance || current.status !== "claimed")
|
|
61
|
+
continue;
|
|
62
|
+
if (current.version !== ref.version)
|
|
63
|
+
return { outcome: "excluded", reason: "task_changed" };
|
|
64
|
+
tasks.push(ref);
|
|
65
|
+
}
|
|
66
|
+
if (!tasks.length)
|
|
67
|
+
return { outcome: "excluded", reason: "no_unfinished_task" };
|
|
68
|
+
if (live.nativeWork)
|
|
69
|
+
return { outcome: "excluded", reason: "native_reengaged" };
|
|
70
|
+
if (live.paused || !live.idle)
|
|
71
|
+
return { outcome: "deferred", reason: "not_idle" };
|
|
72
|
+
if (live.background === true)
|
|
73
|
+
return { outcome: "deferred", reason: "background_running" };
|
|
74
|
+
return { outcome: "ready", tasks, advisory: live.background === null };
|
|
75
|
+
}
|
|
76
|
+
/** Authoritative recovery state on the SAME SQLite connection as the outbox. */
|
|
77
|
+
export class WorkingRecoveryStore {
|
|
78
|
+
db;
|
|
79
|
+
constructor(db) {
|
|
80
|
+
this.db = db;
|
|
81
|
+
db.exec(`CREATE TABLE IF NOT EXISTS working_recovery_episodes (
|
|
82
|
+
instance_name TEXT PRIMARY KEY, episode_key TEXT NOT NULL, episode_group TEXT NOT NULL,
|
|
83
|
+
snapshot_json TEXT NOT NULL CHECK(length(CAST(snapshot_json AS BLOB))<=8192),
|
|
84
|
+
outcome TEXT NOT NULL, reason TEXT NOT NULL, delivery_id TEXT
|
|
85
|
+
);
|
|
86
|
+
CREATE TABLE IF NOT EXISTS working_recovery_receipts (episode_key TEXT PRIMARY KEY, outcome TEXT NOT NULL, reason TEXT NOT NULL);
|
|
87
|
+
CREATE TABLE IF NOT EXISTS working_recovery_run (singleton INTEGER PRIMARY KEY CHECK(singleton=1),
|
|
88
|
+
boot_id TEXT NOT NULL, pid INTEGER NOT NULL, started_at INTEGER NOT NULL, requested_cause TEXT);
|
|
89
|
+
CREATE TABLE IF NOT EXISTS working_recovery_summaries (episode_group TEXT PRIMARY KEY);
|
|
90
|
+
CREATE TABLE IF NOT EXISTS working_recovery_cancellations (instance_name TEXT PRIMARY KEY, configuration TEXT NOT NULL, session_id TEXT);`);
|
|
91
|
+
}
|
|
92
|
+
beginRun(bootId, pid, now) {
|
|
93
|
+
return this.db.transaction(() => {
|
|
94
|
+
const previous = this.db.prepare("SELECT boot_id,requested_cause FROM working_recovery_run WHERE singleton=1").get();
|
|
95
|
+
if (previous?.boot_id === bootId)
|
|
96
|
+
return "unknown_interruption";
|
|
97
|
+
this.db.prepare("INSERT OR REPLACE INTO working_recovery_run VALUES(1,?,?,?,NULL)").run(bootId, pid, now);
|
|
98
|
+
return previous?.requested_cause === "manual_restart" || previous?.requested_cause === "update" ? previous.requested_cause : "unknown_interruption";
|
|
99
|
+
})();
|
|
100
|
+
}
|
|
101
|
+
requested(bootId, cause) {
|
|
102
|
+
this.db.prepare("UPDATE working_recovery_run SET requested_cause=? WHERE singleton=1 AND boot_id=?").run(cause, bootId);
|
|
103
|
+
}
|
|
104
|
+
clearRequested(bootId) {
|
|
105
|
+
this.db.prepare("UPDATE working_recovery_run SET requested_cause=NULL WHERE singleton=1 AND boot_id=?").run(bootId);
|
|
106
|
+
}
|
|
107
|
+
cancel(instance, configuration, sessionId) {
|
|
108
|
+
this.db.prepare("INSERT OR REPLACE INTO working_recovery_cancellations VALUES(?,?,?)").run(instance, configuration, sessionId);
|
|
109
|
+
}
|
|
110
|
+
cancelled(instance, snapshot) {
|
|
111
|
+
const row = this.db.prepare("SELECT configuration,session_id FROM working_recovery_cancellations WHERE instance_name=?").get(instance);
|
|
112
|
+
return !!row && row.configuration === snapshot.observation.configuration && row.session_id === snapshot.observation.sessionId;
|
|
113
|
+
}
|
|
114
|
+
discover(instance, snapshot, group = snapshot.managerBootId) {
|
|
115
|
+
if (!hasInterruptedExecution(snapshot)) {
|
|
116
|
+
if (snapshot.reason === "before_stop" && snapshot.observation.executionState === "idle" && !snapshot.observation.turn) {
|
|
117
|
+
this.db.transaction(() => {
|
|
118
|
+
const current = this.get(instance);
|
|
119
|
+
if (!current || current.outcome === "admitted")
|
|
120
|
+
return;
|
|
121
|
+
this.db.prepare("DELETE FROM working_recovery_episodes WHERE instance_name=? AND episode_key=?").run(instance, current.key);
|
|
122
|
+
this.db.prepare("DELETE FROM working_recovery_receipts WHERE episode_key=? AND outcome='excluded'").run(current.key);
|
|
123
|
+
})();
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const key = recoveryKey(instance, snapshot);
|
|
128
|
+
this.db.transaction(() => {
|
|
129
|
+
let current = this.get(instance);
|
|
130
|
+
// Pre-fix task-only idle rows never proved an interruption. Remove only
|
|
131
|
+
// their no-input decisions; admitted/uncertain deliveries keep their fence.
|
|
132
|
+
if (current && current.outcome !== "admitted" && taskMetadataOnly(current.snapshot)) {
|
|
133
|
+
this.db.prepare("DELETE FROM working_recovery_episodes WHERE instance_name=? AND episode_key=?").run(instance, current.key);
|
|
134
|
+
this.db.prepare("DELETE FROM working_recovery_receipts WHERE episode_key=? AND outcome='excluded'").run(current.key);
|
|
135
|
+
current = null;
|
|
136
|
+
}
|
|
137
|
+
const receipt = this.db.prepare("SELECT outcome,reason FROM working_recovery_receipts WHERE episode_key=?").get(key);
|
|
138
|
+
if (current?.key === key) {
|
|
139
|
+
// Same durable work, new fleet-start interval: keep the episode/receipt,
|
|
140
|
+
// but an earlier summary must not consume this restart's summary.
|
|
141
|
+
if (current.outcome === "deferred" && current.group !== group) {
|
|
142
|
+
this.db.prepare("UPDATE working_recovery_episodes SET episode_group=? WHERE instance_name=? AND episode_key=?")
|
|
143
|
+
.run(group, instance, key);
|
|
144
|
+
}
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// An admitted/uncertain delivery is owned by the outbox, never replaced by a new candidate.
|
|
148
|
+
if (current?.outcome === "admitted" && current.deliveryId) {
|
|
149
|
+
const delivery = this.db.prepare("SELECT state FROM deliveries WHERE delivery_id=?").get(current.deliveryId);
|
|
150
|
+
if (!delivery || !["delivered", "failed", "cancelled"].includes(delivery.state))
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
this.db.prepare(`INSERT OR REPLACE INTO working_recovery_episodes VALUES(?,?,?,?,?,?,NULL)`)
|
|
154
|
+
.run(instance, key, group, JSON.stringify(snapshot), receipt?.outcome ?? "deferred", receipt?.reason ?? "awaiting_stability");
|
|
155
|
+
})();
|
|
156
|
+
}
|
|
157
|
+
get(instance) {
|
|
158
|
+
const row = this.db.prepare("SELECT * FROM working_recovery_episodes WHERE instance_name=?").get(instance);
|
|
159
|
+
return row ? { instance: row.instance_name, key: row.episode_key, group: row.episode_group, snapshot: JSON.parse(row.snapshot_json),
|
|
160
|
+
outcome: row.outcome, reason: row.reason, deliveryId: row.delivery_id } : null;
|
|
161
|
+
}
|
|
162
|
+
list() {
|
|
163
|
+
return this.db.prepare("SELECT instance_name FROM working_recovery_episodes ORDER BY instance_name").all().map(r => this.get(r.instance_name));
|
|
164
|
+
}
|
|
165
|
+
clearPrior(episode) {
|
|
166
|
+
this.db.prepare("UPDATE working_state_journal SET prior_json=NULL WHERE instance_name=? AND prior_json=?")
|
|
167
|
+
.run(episode.instance, JSON.stringify(episode.snapshot));
|
|
168
|
+
}
|
|
169
|
+
decision(episode, outcome, reason) {
|
|
170
|
+
const before = this.get(episode.instance);
|
|
171
|
+
if (before?.key !== episode.key || before.outcome === "admitted"
|
|
172
|
+
|| before.outcome === outcome && before.reason === reason)
|
|
173
|
+
return;
|
|
174
|
+
this.db.transaction(() => {
|
|
175
|
+
const current = this.get(episode.instance);
|
|
176
|
+
if (current?.key !== episode.key || current.outcome === "admitted")
|
|
177
|
+
return;
|
|
178
|
+
if (reason === "not_working_at_interruption" && taskMetadataOnly(episode.snapshot)) {
|
|
179
|
+
this.db.prepare("DELETE FROM working_recovery_episodes WHERE instance_name=? AND episode_key=?").run(episode.instance, episode.key);
|
|
180
|
+
this.db.prepare("DELETE FROM working_recovery_receipts WHERE episode_key=? AND outcome='excluded'").run(episode.key);
|
|
181
|
+
return; // An old idle card must not poison a later genuinely working interval with the same task version.
|
|
182
|
+
}
|
|
183
|
+
this.db.prepare("UPDATE working_recovery_episodes SET outcome=?,reason=? WHERE instance_name=? AND episode_key=?").run(outcome, reason, episode.instance, episode.key);
|
|
184
|
+
if (outcome === "excluded") {
|
|
185
|
+
this.db.prepare("INSERT OR IGNORE INTO working_recovery_receipts VALUES(?,?,?)").run(episode.key, outcome, reason);
|
|
186
|
+
this.clearPrior(episode);
|
|
187
|
+
}
|
|
188
|
+
})();
|
|
189
|
+
}
|
|
190
|
+
/** The delivery admission and episode receipt commit together, or neither does. */
|
|
191
|
+
admit(episode, insert, advisory = false) {
|
|
192
|
+
return this.db.transaction(() => {
|
|
193
|
+
const current = this.get(episode.instance);
|
|
194
|
+
if (current?.key !== episode.key || current.outcome !== "deferred")
|
|
195
|
+
return false;
|
|
196
|
+
if (this.db.prepare("SELECT 1 FROM working_recovery_receipts WHERE episode_key=?").get(episode.key))
|
|
197
|
+
return false;
|
|
198
|
+
const deliveryId = insert();
|
|
199
|
+
this.db.prepare("UPDATE working_recovery_episodes SET outcome='admitted',reason=?,delivery_id=? WHERE instance_name=? AND episode_key=?")
|
|
200
|
+
.run(advisory ? "advisory_background_unknown" : "outbox_owned", deliveryId, episode.instance, episode.key);
|
|
201
|
+
this.db.prepare("INSERT INTO working_recovery_receipts VALUES(?,'admitted',?)")
|
|
202
|
+
.run(episode.key, advisory ? "advisory_background_unknown" : "outbox_owned");
|
|
203
|
+
this.clearPrior(episode);
|
|
204
|
+
return true;
|
|
205
|
+
})();
|
|
206
|
+
}
|
|
207
|
+
summary(group, insert) {
|
|
208
|
+
return this.db.transaction(() => {
|
|
209
|
+
if (this.db.prepare("SELECT 1 FROM working_recovery_summaries WHERE episode_group=?").get(group))
|
|
210
|
+
return false;
|
|
211
|
+
insert();
|
|
212
|
+
this.db.prepare("INSERT INTO working_recovery_summaries VALUES(?)").run(group);
|
|
213
|
+
return true;
|
|
214
|
+
})();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/** No spawn or native probes. Missing prerequisites leave the durable candidate deferred. */
|
|
218
|
+
export class WorkingRecoveryCoordinator {
|
|
219
|
+
deps;
|
|
220
|
+
readyAt = null;
|
|
221
|
+
normalAt = null;
|
|
222
|
+
lastAdmittedAt = Number.NEGATIVE_INFINITY;
|
|
223
|
+
lastDispatchedAt = Number.NEGATIVE_INFINITY;
|
|
224
|
+
dispatchOwner = null;
|
|
225
|
+
constructor(deps) {
|
|
226
|
+
this.deps = deps;
|
|
227
|
+
}
|
|
228
|
+
ready() { this.readyAt = this.deps.now(); this.normalAt = null; }
|
|
229
|
+
reset() { this.readyAt = null; this.normalAt = null; }
|
|
230
|
+
stable() {
|
|
231
|
+
const now = this.deps.now(), p = this.deps.pressure();
|
|
232
|
+
if (!this.deps.active() || this.deps.storm() || p.level !== "normal" || p.sampledAt === null || p.recovering) {
|
|
233
|
+
this.normalAt = null;
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
this.normalAt ??= now;
|
|
237
|
+
return this.readyAt !== null && now - this.readyAt >= RECOVERY_STABLE_MS && now - this.normalAt >= RECOVERY_NORMAL_MS;
|
|
238
|
+
}
|
|
239
|
+
verdict(episode) {
|
|
240
|
+
if (this.deps.store.cancelled(episode.instance, episode.snapshot))
|
|
241
|
+
return { outcome: "excluded", reason: "cancelled" };
|
|
242
|
+
return decideWorkingRecovery(episode, this.deps.live(episode.instance), this.deps.enabled(episode.instance), this.deps.card);
|
|
243
|
+
}
|
|
244
|
+
tick() {
|
|
245
|
+
if (!this.stable())
|
|
246
|
+
return;
|
|
247
|
+
for (const row of this.deps.store.list()) {
|
|
248
|
+
if (row.outcome !== "deferred")
|
|
249
|
+
continue;
|
|
250
|
+
const verdict = this.verdict(row);
|
|
251
|
+
if (verdict.outcome !== "ready") {
|
|
252
|
+
this.deps.store.decision(row, verdict.outcome, verdict.reason);
|
|
253
|
+
if (row.reason !== verdict.reason || row.outcome !== verdict.outcome)
|
|
254
|
+
this.deps.log(row, verdict.outcome, verdict.reason);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (!this.deps.laneFree(row.instance) || this.deps.now() - this.lastAdmittedAt < RECOVERY_PACE_MS)
|
|
258
|
+
continue;
|
|
259
|
+
if (this.deps.admit(row, verdict.tasks, verdict.advisory)) {
|
|
260
|
+
this.lastAdmittedAt = this.deps.now();
|
|
261
|
+
this.deps.log(row, "admitted", verdict.advisory ? "advisory_background_unknown" : "outbox_owned");
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const rows = this.deps.store.list();
|
|
265
|
+
for (const group of new Set(rows.map(row => row.group))) {
|
|
266
|
+
const members = rows.filter(row => row.group === group && hasInterruptedExecution(row.snapshot));
|
|
267
|
+
if (!members.length)
|
|
268
|
+
continue;
|
|
269
|
+
// Finish the paced admission sweep before the single summary, so every
|
|
270
|
+
// advisory admission in that sweep is named, rather than only its first row.
|
|
271
|
+
if (members.some(row => row.outcome === "deferred" && this.verdict(row).outcome === "ready"))
|
|
272
|
+
continue;
|
|
273
|
+
this.deps.summary(group, members);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/** Called again by the local pane writer, including after every awaited prerequisite. */
|
|
277
|
+
accepts(instance, key) {
|
|
278
|
+
if (!this.stable())
|
|
279
|
+
return false;
|
|
280
|
+
const row = this.deps.store.get(instance);
|
|
281
|
+
return !!row && row.key === key && row.outcome === "admitted" && this.verdict(row).outcome === "ready";
|
|
282
|
+
}
|
|
283
|
+
/** Recovered queued rows also pass this physical-write pace, independently of admission. */
|
|
284
|
+
canDispatch(instance, key) {
|
|
285
|
+
return this.dispatchOwner === null && this.deps.now() - this.lastDispatchedAt >= RECOVERY_PACE_MS
|
|
286
|
+
&& this.accepts(instance, key);
|
|
287
|
+
}
|
|
288
|
+
reserveDispatch(instance, key) {
|
|
289
|
+
if (!this.canDispatch(instance, key))
|
|
290
|
+
return null;
|
|
291
|
+
const owner = { instance, key };
|
|
292
|
+
this.dispatchOwner = owner;
|
|
293
|
+
this.lastDispatchedAt = this.deps.now();
|
|
294
|
+
return () => { if (this.dispatchOwner === owner)
|
|
295
|
+
this.dispatchOwner = null; };
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=working-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"working-recovery.js","sourceRoot":"","sources":["../src/working-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,10 @@ export interface WorkingStateObservation {
|
|
|
27
27
|
backgroundWork: boolean | null;
|
|
28
28
|
turn: WorkingStateTurn | null;
|
|
29
29
|
/** No generic getSessionId discovery is allowed on this observation path. */
|
|
30
|
-
sessionId: null;
|
|
30
|
+
sessionId: string | null;
|
|
31
31
|
backendTurnId: null;
|
|
32
|
+
/** A confirmed local continuation starts a demonstrably resumed work interval. */
|
|
33
|
+
recoveryDeliveryId?: string;
|
|
32
34
|
}
|
|
33
35
|
export type WorkingStateReference = {
|
|
34
36
|
kind: "task";
|
|
@@ -59,6 +61,8 @@ export interface WorkingStateEntry {
|
|
|
59
61
|
current: WorkingStateSnapshot;
|
|
60
62
|
prior: WorkingStateSnapshot | null;
|
|
61
63
|
}
|
|
64
|
+
/** Task cards describe ownership, not proof that execution was interrupted. */
|
|
65
|
+
export declare function hasInterruptedExecution(s: WorkingStateSnapshot): boolean;
|
|
62
66
|
/** Two bounded snapshots per instance: latest, plus first unconsumed interruption. */
|
|
63
67
|
export declare class WorkingStateJournal {
|
|
64
68
|
private readonly db;
|
|
@@ -32,7 +32,8 @@ function bounded(input) {
|
|
|
32
32
|
turn: turn && integer(turn.generation) ? { generation: turn.generation,
|
|
33
33
|
deliveryId: id(turn.deliveryId) ? turn.deliveryId : null, correlationId: id(turn.correlationId) ? turn.correlationId : null,
|
|
34
34
|
messageId: id(turn.messageId) ? turn.messageId : null, cancelled: turn.cancelled === true, completionDelivered: turn.completionDelivered === true } : null,
|
|
35
|
-
sessionId: null, backendTurnId: null,
|
|
35
|
+
sessionId: id(o.sessionId) ? o.sessionId : null, backendTurnId: null,
|
|
36
|
+
...(id(o.recoveryDeliveryId) ? { recoveryDeliveryId: o.recoveryDeliveryId } : {}),
|
|
36
37
|
},
|
|
37
38
|
references: refs, totalReferences: Math.max(integer(input.totalReferences) ? input.totalReferences : 0, input.references.length),
|
|
38
39
|
unavailable: ["tasks", "obligations"].filter(x => input.unavailable.includes(x)),
|
|
@@ -43,10 +44,16 @@ function bounded(input) {
|
|
|
43
44
|
throw new Error("Working-state observation exceeds its byte budget");
|
|
44
45
|
return value;
|
|
45
46
|
}
|
|
47
|
+
/** Task cards describe ownership, not proof that execution was interrupted. */
|
|
48
|
+
export function hasInterruptedExecution(s) {
|
|
49
|
+
const turn = s.observation.turn;
|
|
50
|
+
return ["working", "stuck"].includes(s.observation.executionState ?? "")
|
|
51
|
+
&& !turn?.cancelled && !turn?.completionDelivered;
|
|
52
|
+
}
|
|
46
53
|
function notable(s) {
|
|
47
54
|
const turn = s.observation.turn;
|
|
48
55
|
return s.totalReferences > 0 || s.observation.backgroundWork === true || (!!turn && !turn.cancelled && !turn.completionDelivered)
|
|
49
|
-
|| (s
|
|
56
|
+
|| hasInterruptedExecution(s);
|
|
50
57
|
}
|
|
51
58
|
/** Two bounded snapshots per instance: latest, plus first unconsumed interruption. */
|
|
52
59
|
export class WorkingStateJournal {
|
|
@@ -68,9 +75,21 @@ export class WorkingStateJournal {
|
|
|
68
75
|
observe(instance, input) {
|
|
69
76
|
if (!id(instance))
|
|
70
77
|
throw new Error("Invalid working-state instance");
|
|
71
|
-
|
|
78
|
+
let snapshot = bounded(input);
|
|
72
79
|
return this.db.transaction(() => {
|
|
73
80
|
const previous = this.get(instance);
|
|
81
|
+
// A confirmed continuation identifies work, not a CLI generation. A
|
|
82
|
+
// replacement may temporarily lack session ownership; recover the marker
|
|
83
|
+
// only after it proves the same configuration/session, never for a fresh one.
|
|
84
|
+
if (!snapshot.observation.recoveryDeliveryId && snapshot.observation.sessionId) {
|
|
85
|
+
const matching = [previous?.current, previous?.prior].find(s => s?.observation.recoveryDeliveryId
|
|
86
|
+
&& s.observation.configuration === snapshot.observation.configuration
|
|
87
|
+
&& s.observation.sessionId === snapshot.observation.sessionId);
|
|
88
|
+
if (matching) {
|
|
89
|
+
snapshot.observation.recoveryDeliveryId = matching.observation.recoveryDeliveryId;
|
|
90
|
+
snapshot = bounded(snapshot); // The inherited metadata must also fit the byte budget.
|
|
91
|
+
}
|
|
92
|
+
}
|
|
74
93
|
// Exact heartbeats do not write or emit. The caller observes changes, not polling.
|
|
75
94
|
const comparable = (s) => JSON.stringify({ ...s, observedAt: 0, reason: "observation" });
|
|
76
95
|
const boundary = snapshot.reason === "before_stop" || snapshot.reason === "before_spawn";
|
|
@@ -78,10 +97,19 @@ export class WorkingStateJournal {
|
|
|
78
97
|
&& !(boundary && previous.current.reason !== snapshot.reason))
|
|
79
98
|
return null;
|
|
80
99
|
let prior = previous?.prior ?? null;
|
|
100
|
+
// Idle task metadata is still observable, but cannot hide later genuine
|
|
101
|
+
// work. Keep legacy-owned turns and the continuation-marker inheritance above.
|
|
102
|
+
if (prior && !hasInterruptedExecution(prior) && !prior.observation.turn && hasInterruptedExecution(snapshot))
|
|
103
|
+
prior = null;
|
|
81
104
|
if (!prior && previous?.current.managerBootId !== snapshot.managerBootId && previous && notable(previous.current))
|
|
82
105
|
prior = previous.current;
|
|
83
106
|
if (!prior && boundary && notable(snapshot))
|
|
84
107
|
prior = snapshot;
|
|
108
|
+
// A later graceful stop is authoritative: work that reached idle before
|
|
109
|
+
// it stopped was not interrupted by this stop. Marker inheritance above
|
|
110
|
+
// remains available as metadata, and durable delivery receipts are separate.
|
|
111
|
+
if (snapshot.reason === "before_stop" && snapshot.observation.executionState === "idle" && !snapshot.observation.turn)
|
|
112
|
+
prior = snapshot;
|
|
85
113
|
const revision = (previous?.revision ?? 0) + 1;
|
|
86
114
|
this.db.prepare(`INSERT INTO working_state_journal(instance_name,revision,current_json,prior_json) VALUES(?,?,?,?)
|
|
87
115
|
ON CONFLICT(instance_name) DO UPDATE SET revision=excluded.revision,current_json=excluded.current_json,prior_json=excluded.prior_json`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-state-journal.js","sourceRoot":"","sources":["../src/working-state-journal.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"working-state-journal.js","sourceRoot":"","sources":["../src/working-state-journal.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AA0CzC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,sBAAsB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AACjP,MAAM,EAAE,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjJ,MAAM,OAAO,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAK,CAAY,IAAI,CAAC,CAAC;AAE3F,wFAAwF;AACxF,SAAS,OAAO,CAAC,KAA2B;IAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;WAC3F,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;WACzG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;WACzD,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC;WACxE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACxH,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,EAAE,CAAC;QACpE,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvH,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACtI,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAyB;QAClC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;QAClG,cAAc,EAAE,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI;QAC/H,WAAW,EAAE;YACX,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE;YACrJ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa;YACpH,cAAc,EAAE,OAAO,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI;YAC/E,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU;gBACpE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;gBAC3H,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;YAC5J,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI;YACpE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClF;QACD,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAChI,WAAW,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAA4B,CAAC,CAAmC;KAC9I,CAAC;IACF,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,uBAAuB,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM;QAAE,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;IAC7H,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,uBAAuB;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC7I,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,CAAuB;IAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;IAChC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC;WACnE,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC;AACtD,CAAC;AAED,SAAS,OAAO,CAAC,CAAuB;IACtC,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;IAChC,OAAO,CAAC,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC;WAC5H,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,sFAAsF;AACtF,MAAM,OAAO,mBAAmB;IACD,EAAE;IAA/B,YAA6B,EAAqB;kBAArB,EAAE;QAC7B,EAAE,CAAC,IAAI,CAAC;;;;MAIN,CAAC,CAAC;IACN,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0FAA0F,CAAC,CAAC,GAAG,CAAC,QAAQ,CACjD,CAAC;QACpF,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChJ,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,KAA2B;QACnD,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACrE,IAAI,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpC,oEAAoE;YACpE,yEAAyE;YACzE,8EAA8E;YAC9E,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,kBAAkB,IAAI,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC/E,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,kBAAkB;uBAC5F,CAAC,CAAC,WAAW,CAAC,aAAa,KAAK,QAAQ,CAAC,WAAW,CAAC,aAAa;uBAClE,CAAC,CAAC,WAAW,CAAC,SAAS,KAAK,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACjE,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,WAAW,CAAC,kBAAkB,GAAG,QAAQ,CAAC,WAAW,CAAC,kBAAkB,CAAC;oBAClF,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,wDAAwD;gBACxF,CAAC;YACH,CAAC;YACD,mFAAmF;YACnF,MAAM,UAAU,GAAG,CAAC,CAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YAC/G,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,KAAK,aAAa,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc,CAAC;YACzF,IAAI,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC;mBAChE,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7E,IAAI,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC;YACpC,wEAAwE;YACxE,+EAA+E;YAC/E,IAAI,KAAK,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,uBAAuB,CAAC,QAAQ,CAAC;gBAAE,KAAK,GAAG,IAAI,CAAC;YAC3H,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,OAAO,CAAC,aAAa,KAAK,QAAQ,CAAC,aAAa,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC5I,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;gBAAE,KAAK,GAAG,QAAQ,CAAC;YAC9D,wEAAwE;YACxE,wEAAwE;YACxE,6EAA6E;YAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,IAAI,QAAQ,CAAC,WAAW,CAAC,cAAc,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI;gBAAE,KAAK,GAAG,QAAQ,CAAC;YACxI,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;8IACwH,CAAC;iBACtI,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3F,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC1D,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@songsid/agend",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.2-beta.10",
|
|
4
4
|
"description": "Multi-agent fleet daemon — run coding CLIs (Claude, Muse, Codex, OpenCode) from Discord or Telegram",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"templates/",
|
|
57
57
|
"README.md",
|
|
58
58
|
"README.zh-TW.md",
|
|
59
|
+
"THIRD_PARTY_NOTICES.md",
|
|
59
60
|
"launcher/",
|
|
60
61
|
"scripts/preinstall-guard.cjs"
|
|
61
62
|
],
|
|
@@ -74,7 +75,7 @@
|
|
|
74
75
|
"smol-toml": "1.9.0",
|
|
75
76
|
"undici": "6.29.1",
|
|
76
77
|
"yaml": "^2.9.0",
|
|
77
|
-
"zod": "^4.
|
|
78
|
+
"zod": "^4.6.6"
|
|
78
79
|
},
|
|
79
80
|
"optionalDependencies": {
|
|
80
81
|
"@songsid/agend-node-darwin-arm64": "22.23.4",
|