@songsid/agend 2.3.2 → 2.3.3-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/dist/agent-cli-instructions.md +2 -2
- package/dist/agent-cli.js +13 -112
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +0 -1
- package/dist/agent-endpoint.js +1 -9
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-whats-new.d.ts +23 -5
- package/dist/agent-whats-new.js +58 -40
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +0 -7
- package/dist/auth-api.js +1 -15
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.js +1 -1
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/web-authority.d.ts +9 -4
- package/dist/authority/web-authority.js +10 -5
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/antigravity.js +6 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +20 -1
- package/dist/backend/claude-code.js +54 -29
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/claude-transcript-errors.d.ts +18 -0
- package/dist/backend/claude-transcript-errors.js +19 -0
- package/dist/backend/claude-transcript-errors.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +16 -3
- package/dist/backend/codex-session-lookup.js +45 -11
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.d.ts +16 -0
- package/dist/backend/codex.js +184 -35
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.js +58 -12
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-reconcile-store.js +8 -1
- package/dist/backend/kiro-reconcile-store.js.map +1 -1
- package/dist/backend/kiro.d.ts +0 -5
- package/dist/backend/kiro.js +2 -10
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +2 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +53 -4
- package/dist/backend/types.js.map +1 -1
- package/dist/bundled-skills.d.ts +4 -6
- package/dist/bundled-skills.js +10 -14
- package/dist/bundled-skills.js.map +1 -1
- package/dist/channel/adapters/discord.js +60 -17
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-server.js +5 -5
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +1 -3
- package/dist/channel/mcp-tools.js +4 -58
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/classic-channel-manager.d.ts +4 -1
- package/dist/classic-channel-manager.js +21 -7
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +23 -6
- package/dist/cli.js.map +1 -1
- package/dist/config-history.d.ts +50 -0
- package/dist/config-history.js +263 -0
- package/dist/config-history.js.map +1 -0
- package/dist/config-validator.js +10 -8
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +11 -4
- package/dist/config.js.map +1 -1
- package/dist/cross-instance-envelope.d.ts +10 -5
- package/dist/cross-instance-envelope.js +20 -17
- package/dist/cross-instance-envelope.js.map +1 -1
- package/dist/daemon.d.ts +130 -64
- package/dist/daemon.js +603 -428
- package/dist/daemon.js.map +1 -1
- package/dist/daily-summary.d.ts +8 -1
- package/dist/daily-summary.js +8 -5
- package/dist/daily-summary.js.map +1 -1
- package/dist/dashboard-live.d.ts +1 -1
- package/dist/dashboard-live.js +3 -3
- package/dist/dashboard-live.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +1 -1
- package/dist/dashboard-permissions.js +1 -3
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-outbox.d.ts +31 -22
- package/dist/delivery-outbox.js +119 -161
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-outbox.test.js +10 -25
- package/dist/delivery-outbox.test.js.map +1 -1
- package/dist/doctor.d.ts +4 -0
- package/dist/doctor.js +16 -1
- package/dist/doctor.js.map +1 -1
- package/dist/fleet-level-config.js +1 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +74 -66
- package/dist/fleet-manager.js +285 -414
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +5 -0
- package/dist/fleet-process-handlers.js +21 -0
- package/dist/fleet-process-handlers.js.map +1 -1
- package/dist/fleet-service-owner.d.ts +11 -0
- package/dist/fleet-service-owner.js +3 -0
- package/dist/fleet-service-owner.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +11 -1
- package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +1 -1
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
- package/dist/general-knowledge/skills/session-management/SKILL.md +7 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +13 -204
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +30 -68
- package/dist/instance-lifecycle.d.ts +19 -0
- package/dist/instance-lifecycle.js +73 -15
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.js +6 -7
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-reconcile.js +3 -3
- package/dist/kiro-reconcile.js.map +1 -1
- package/dist/locale.js +96 -58
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -1
- package/dist/log-service.js.map +1 -1
- package/dist/needs-you-hub.d.ts +1 -0
- package/dist/needs-you-hub.js +6 -3
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +3 -1
- package/dist/needs-you-live.js +24 -2
- package/dist/needs-you-live.js.map +1 -1
- package/dist/needs-you.d.ts +13 -2
- package/dist/needs-you.js +11 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/notify-socket.d.ts +10 -0
- package/dist/notify-socket.js +45 -0
- package/dist/notify-socket.js.map +1 -0
- package/dist/outbound-handlers.js +20 -8
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +0 -62
- package/dist/outbound-schemas.js +4 -43
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/parked-notices.d.ts +87 -0
- package/dist/parked-notices.js +194 -0
- package/dist/parked-notices.js.map +1 -0
- package/dist/public-link-progress.d.ts +5 -2
- package/dist/public-link-progress.js +4 -3
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-web-gateway.js +0 -9
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +12 -0
- package/dist/public-web-link.js +29 -5
- package/dist/public-web-link.js.map +1 -1
- package/dist/quota-notice.d.ts +23 -0
- package/dist/quota-notice.js +22 -0
- package/dist/quota-notice.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +17 -25
- package/dist/scheduler/task-board.js +29 -39
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/sd-notify.d.ts +23 -15
- package/dist/sd-notify.js +88 -29
- package/dist/sd-notify.js.map +1 -1
- package/dist/search/search-docs.d.ts +1 -1
- package/dist/search/search-docs.js +2 -2
- package/dist/search/search-docs.js.map +1 -1
- package/dist/settings-api.d.ts +16 -1
- package/dist/settings-api.js +56 -16
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +3 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +17 -3
- package/dist/settings-confirmation.js +8 -5
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +0 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +31 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-wizard.d.ts +3 -0
- package/dist/setup-wizard.js +4 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/task-board-waker.d.ts +43 -1
- package/dist/task-board-waker.js +121 -9
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tmux-control.d.ts +1 -1
- package/dist/tmux-control.js +3 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.js +18 -16
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +2 -0
- package/dist/tmux-read.js +7 -1
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.js +3 -10
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +29 -7
- package/dist/topic-commands.js +97 -37
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.d.ts +7 -0
- package/dist/transcript-monitor.js +48 -3
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +5 -0
- package/dist/tunnel/cloudflared.js +32 -1
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/named-diagnostics.d.ts +2 -1
- package/dist/tunnel/named-diagnostics.js +4 -1
- package/dist/tunnel/named-diagnostics.js.map +1 -1
- package/dist/tunnel/named-link-test.d.ts +90 -0
- package/dist/tunnel/named-link-test.js +270 -0
- package/dist/tunnel/named-link-test.js.map +1 -0
- package/dist/tunnel/purpose-lane.d.ts +3 -1
- package/dist/tunnel/purpose-lane.js +2 -0
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/types.d.ts +9 -11
- package/dist/ui/chat-ambient.js +4 -4
- package/dist/ui/chat-commands.js +3 -2
- package/dist/ui/chat-store.js +4 -1
- package/dist/ui/chat-strings.js +12 -46
- package/dist/ui/chat-thread.js +51 -59
- package/dist/ui/fleet-office-skin.js +37 -14
- package/dist/ui/fleet-office.js +31 -7
- package/dist/ui/html-attachment.js +22 -8
- package/dist/ui/panel-chat.js +21 -50
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +11 -9
- package/dist/ui/panel-settings.js +5 -3
- package/dist/ui/preview-panel.js +12 -21
- package/dist/ui/preview.js +10 -3
- package/dist/ui/search-dialog.js +30 -14
- package/dist/ui/settings-appearance.js +3 -37
- package/dist/ui/settings-confirm.js +18 -0
- package/dist/ui/settings-guests.js +13 -4
- package/dist/ui/settings-learn.js +1 -1
- package/dist/ui/settings-mods.js +5 -12
- package/dist/ui/settings-named-test.js +144 -0
- package/dist/ui/settings-registry.js +0 -2
- package/dist/ui/settings-strings.js +16 -16
- package/dist/ui/settings-web-authority.js +4 -3
- package/dist/ui/shared/app-i18n.js +15 -4
- package/dist/ui/shared/app-needs.js +5 -1
- package/dist/ui/shared/app-prefs.js +17 -17
- package/dist/ui/shared/app-shell.js +47 -9
- package/dist/ui/shared/app-store.js +6 -2
- package/dist/ui/shared/app.css +33 -39
- package/dist/ui/shared/app.js +5 -4
- package/dist/ui/shared/instance-nav.js +9 -9
- package/dist/ui/shared/instance-switch.js +8 -2
- package/dist/ui/shared/panel-view.js +22 -8
- package/dist/ui/shared/view-strings.js +6 -0
- package/dist/ui/shared/web-authorize.js +35 -13
- package/dist/update-check.d.ts +13 -4
- package/dist/update-check.js +17 -4
- package/dist/update-check.js.map +1 -1
- package/dist/usage/usage-api.d.ts +3 -0
- package/dist/usage/usage-api.js +5 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/view-api.d.ts +2 -0
- package/dist/view-api.js +64 -0
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +9 -17
- package/dist/web-api.js +257 -371
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +0 -2
- package/dist/web-appearance-tools.js +2 -5
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +0 -6
- package/dist/web-appearance-view.js +0 -1
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +14 -7
- package/dist/web-appearance.js +5 -6
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +1 -17
- package/dist/web-asset-parts.js +1 -15
- package/dist/web-asset-parts.js.map +1 -1
- package/dist/web-auth.js +1 -7
- package/dist/web-auth.js.map +1 -1
- package/dist/web-chat-history.d.ts +3 -7
- package/dist/web-chat-history.js +10 -17
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +9 -1
- package/dist/web-commands.js +13 -0
- package/dist/web-commands.js.map +1 -1
- package/dist/web-experimental.d.ts +3 -8
- package/dist/web-experimental.js +9 -33
- package/dist/web-experimental.js.map +1 -1
- package/dist/web-guest-access.d.ts +40 -2
- package/dist/web-guest-access.js +50 -14
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +2 -45
- package/dist/web-mod-bundle.js +15 -63
- package/dist/web-mod-bundle.js.map +1 -1
- package/dist/web-mod-store.d.ts +3 -48
- package/dist/web-mod-store.js +30 -97
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-prefs.d.ts +13 -0
- package/dist/web-prefs.js +38 -0
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +6 -13
- package/dist/web-preview.js +12 -23
- package/dist/web-preview.js.map +1 -1
- package/dist/web-session.d.ts +11 -3
- package/dist/web-session.js +22 -11
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +1 -1
- package/dist/web-settings-patch.js +9 -7
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +0 -13
- package/dist/web-settings-tools.js +12 -84
- package/dist/web-settings-tools.js.map +1 -1
- package/dist/workflow-templates/default.md +2 -2
- package/dist/working-recovery.d.ts +0 -2
- package/dist/working-recovery.js +2 -23
- package/dist/working-recovery.js.map +1 -1
- package/launcher/agend-install.cjs +7 -1
- package/launcher/fleet-service-owner.cjs +150 -0
- package/package.json +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +0 -376
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +0 -673
- package/dist/task-board-summary.d.ts +0 -101
- package/dist/task-board-summary.js +0 -177
- package/dist/task-board-summary.js.map +0 -1
- package/dist/ui/app-effects.js +0 -251
- package/dist/ui/chat-effect-posters.js +0 -42
- package/dist/ui/chat-effects.js +0 -167
- package/dist/ui/effect-trial-controller.js +0 -124
- package/dist/ui/effect-trial-offer.js +0 -2
- package/dist/ui/effect-trial-panel.js +0 -40
- package/dist/ui/effects-waker.js +0 -2
- package/dist/ui/settings-effects.js +0 -202
- package/dist/ui/settings-owner-effects.js +0 -82
- package/dist/ui/shared/effect-app-runtime.js +0 -299
- package/dist/ui/shared/effect-baseline.js +0 -64
- package/dist/ui/shared/effect-chat-runtime.js +0 -162
- package/dist/ui/shared/effect-cursor.js +0 -126
- package/dist/ui/shared/effect-display-metadata.js +0 -39
- package/dist/ui/shared/effect-frame.js +0 -146
- package/dist/ui/shared/effect-geometry.js +0 -137
- package/dist/ui/shared/effect-host-style.js +0 -10
- package/dist/ui/shared/effect-owner-regions.js +0 -74
- package/dist/ui/shared/effect-owner-source.js +0 -122
- package/dist/ui/shared/effect-policy.js +0 -151
- package/dist/ui/shared/effect-poster-reader.js +0 -98
- package/dist/ui/shared/effect-posters.js +0 -117
- package/dist/ui/shared/effect-profiler.js +0 -184
- package/dist/ui/shared/effect-profiles.js +0 -65
- package/dist/ui/shared/effect-registry.js +0 -545
- package/dist/ui/shared/effect-runtime-loader.js +0 -236
- package/dist/ui/shared/effect-safety.js +0 -153
- package/dist/ui/shared/effect-stock-snapshot.js +0 -43
- package/dist/ui/shared/effect-stock-trust.js +0 -217
- package/dist/ui/shared/effect-trial-shadow.js +0 -62
- package/dist/ui/shared/effect-trial-source.js +0 -103
- package/dist/ui/shared/effect-trial-stage.js +0 -170
- package/dist/ui/shared/effect-trial.css +0 -40
- package/dist/ui/shared/feature-flags.js +0 -127
- package/dist/ui/shared/owner-effect-prefs.js +0 -117
- package/dist/upgrade-notices.d.ts +0 -17
- package/dist/upgrade-notices.js +0 -93
- package/dist/upgrade-notices.js.map +0 -1
- package/dist/web-effect-bootstrap.d.ts +0 -12
- package/dist/web-effect-bootstrap.js +0 -49
- package/dist/web-effect-bootstrap.js.map +0 -1
- package/dist/web-effect-bundle.d.ts +0 -28
- package/dist/web-effect-bundle.js +0 -171
- package/dist/web-effect-bundle.js.map +0 -1
- package/dist/web-effect-canonical.d.ts +0 -8
- package/dist/web-effect-canonical.js +0 -27
- package/dist/web-effect-canonical.js.map +0 -1
- package/dist/web-effect-library.d.ts +0 -114
- package/dist/web-effect-library.js +0 -530
- package/dist/web-effect-library.js.map +0 -1
- package/dist/web-effect-playback.d.ts +0 -30
- package/dist/web-effect-playback.js +0 -71
- package/dist/web-effect-playback.js.map +0 -1
- package/dist/web-effect-poster.d.ts +0 -8
- package/dist/web-effect-poster.js +0 -52
- package/dist/web-effect-poster.js.map +0 -1
- package/dist/web-effect-profiles.d.ts +0 -118
- package/dist/web-effect-profiles.js +0 -181
- package/dist/web-effect-profiles.js.map +0 -1
- package/dist/web-effect-service.d.ts +0 -93
- package/dist/web-effect-service.js +0 -335
- package/dist/web-effect-service.js.map +0 -1
- package/dist/web-effect-tools.d.ts +0 -48
- package/dist/web-effect-tools.js +0 -129
- package/dist/web-effect-tools.js.map +0 -1
- package/dist/web-effect-trials.d.ts +0 -86
- package/dist/web-effect-trials.js +0 -204
- package/dist/web-effect-trials.js.map +0 -1
- package/dist/web-effect-upload.d.ts +0 -27
- package/dist/web-effect-upload.js +0 -185
- package/dist/web-effect-upload.js.map +0 -1
- package/dist/web-effect-worker.d.ts +0 -8
- package/dist/web-effect-worker.js +0 -170
- package/dist/web-effect-worker.js.map +0 -1
- package/dist/web-effect.d.ts +0 -103
- package/dist/web-effect.js +0 -153
- package/dist/web-effect.js.map +0 -1
- package/dist/web-experimental-http.d.ts +0 -2
- package/dist/web-experimental-http.js +0 -12
- package/dist/web-experimental-http.js.map +0 -1
- package/dist/web-mod-agent.d.ts +0 -50
- package/dist/web-mod-agent.js +0 -207
- package/dist/web-mod-agent.js.map +0 -1
package/dist/sd-notify.js
CHANGED
|
@@ -3,6 +3,8 @@ import { execFile } from "./child-process.js";
|
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { getAgendHome } from "./paths.js";
|
|
6
|
+
import { notifySocketProblem } from "./notify-socket.js";
|
|
7
|
+
export { notifySocketProblem };
|
|
6
8
|
/**
|
|
7
9
|
* Keep systemd's notification socket private to the fleet process. The socket
|
|
8
10
|
* path is a capability: any child that inherits it can send READY/WATCHDOG/
|
|
@@ -51,64 +53,106 @@ export function sendSystemdNotificationAsync(state, socket, environment, execute
|
|
|
51
53
|
catch { /* reporting must never throw out of a child callback */ } });
|
|
52
54
|
}
|
|
53
55
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* loop. Proving it with `execFileSync` stopped the loop for as long as the fork
|
|
58
|
-
* took — up to the 5s timeout — every 30 seconds, and forking is slowest exactly
|
|
59
|
-
* when the machine is loaded, i.e. when the ping matters. A fire-and-forget spawn
|
|
60
|
-
* says the same thing about liveness (the timer fired, the call was made) without
|
|
61
|
-
* contradicting itself.
|
|
62
|
-
*
|
|
63
|
-
* Still a subprocess: Node does not expose AF_UNIX datagram sockets, so
|
|
64
|
-
* systemd-notify remains the only way to reach NOTIFY_SOCKET from here.
|
|
56
|
+
* Wait for the notify child asynchronously. execFile still has a synchronous
|
|
57
|
+
* fork cost under host pressure; the shorter heartbeat interval and bounded
|
|
58
|
+
* retry restore margin without an independent heartbeat or changing barriers.
|
|
65
59
|
*/
|
|
66
60
|
export function sdNotify(state) {
|
|
67
61
|
defaultNotifier(state);
|
|
68
62
|
}
|
|
69
63
|
let warnSink = null;
|
|
70
|
-
|
|
71
|
-
/**
|
|
64
|
+
let startChecked = false;
|
|
65
|
+
/** The fleet sets this as it starts: the first time, a socket that is already gone is said once (log only). */
|
|
66
|
+
export function setSdNotifyWarn(sink) {
|
|
67
|
+
warnSink = sink;
|
|
68
|
+
if (sink && !startChecked) {
|
|
69
|
+
startChecked = true;
|
|
70
|
+
reportNotifySocketAtStart(sink);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Repeated unchanged ownership skips may coalesce; delivery failures never do. */
|
|
72
74
|
export const SD_NOTIFY_WARN_INTERVAL_MS = 10 * 60_000;
|
|
75
|
+
/** More opportunities within WatchdogSec=60, still driven by the main loop. */
|
|
76
|
+
export const SD_WATCHDOG_INTERVAL_MS = 10_000;
|
|
77
|
+
export const SD_NOTIFY_RETRY_MS = 1_000;
|
|
78
|
+
/** Liveness is sampled only by the fleet's main loop, never an independent sender. */
|
|
79
|
+
export function startSdWatchdog(notify = sdNotify) {
|
|
80
|
+
return setInterval(() => notify("WATCHDOG=1"), SD_WATCHDOG_INTERVAL_MS);
|
|
81
|
+
}
|
|
73
82
|
/**
|
|
74
83
|
* The notification path, with what it depends on passed in (tests). A skipped notification used to be silent: a
|
|
75
84
|
* fleet.pid naming another process, or a systemd-notify that failed, stopped the watchdog being fed with nothing in
|
|
76
|
-
* the log, and the abort that followed looked like a hang.
|
|
85
|
+
* the log, and the abort that followed looked like a hang. Delivery failures include the child outcome on every attempt; ownership skips coalesce.
|
|
77
86
|
*/
|
|
78
87
|
export function createSdNotifier(deps) {
|
|
79
88
|
const now = deps.now ?? (() => performance.now());
|
|
80
89
|
const lastWarnAt = new Map();
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
let retryTimer = null;
|
|
91
|
+
let generation = 0;
|
|
92
|
+
const cancelRetry = () => {
|
|
93
|
+
generation++;
|
|
94
|
+
if (retryTimer)
|
|
95
|
+
clearTimeout(retryTimer);
|
|
96
|
+
retryTimer = null;
|
|
97
|
+
};
|
|
98
|
+
const warnOwner = (fields) => {
|
|
99
|
+
const at = now(), last = lastWarnAt.get("not_owner");
|
|
86
100
|
if (last !== undefined && at - last < SD_NOTIFY_WARN_INTERVAL_MS)
|
|
87
101
|
return;
|
|
88
|
-
lastWarnAt.set(
|
|
102
|
+
lastWarnAt.set("not_owner", at);
|
|
89
103
|
try {
|
|
90
|
-
|
|
104
|
+
deps.warn()?.(fields, "systemd notification not sent: fleet.pid does not name this process, so systemd's watchdog is not being fed");
|
|
91
105
|
}
|
|
92
106
|
catch { /* reporting must never break the ping */ }
|
|
93
107
|
};
|
|
94
|
-
|
|
95
|
-
if (!deps.socket)
|
|
108
|
+
const attempt = (state, retry, epoch) => {
|
|
109
|
+
if (!deps.socket || epoch !== generation)
|
|
96
110
|
return;
|
|
97
111
|
const pid = deps.pid(), recorded = deps.recordedPid();
|
|
98
112
|
if (recorded !== pid) {
|
|
99
|
-
|
|
113
|
+
warnOwner({ state, pid, recordedPid: recorded });
|
|
100
114
|
return;
|
|
101
115
|
}
|
|
116
|
+
const startedAt = now();
|
|
117
|
+
let completed = false;
|
|
118
|
+
const done = (error) => {
|
|
119
|
+
if (completed)
|
|
120
|
+
return;
|
|
121
|
+
completed = true;
|
|
122
|
+
if (!error)
|
|
123
|
+
return;
|
|
124
|
+
const detail = error;
|
|
125
|
+
// Every failed attempt is visible, including a failed retry. A later
|
|
126
|
+
// successful ping needs no warning; only unchanged ownership skips coalesce.
|
|
127
|
+
try {
|
|
128
|
+
const why = deps.socket ? (deps.socketProblem ?? notifySocketProblem)(deps.socket) : null;
|
|
129
|
+
deps.warn()?.({ state, retry, error: error.message, code: detail.code ?? null,
|
|
130
|
+
signal: detail.signal ?? null, killed: detail.killed ?? false,
|
|
131
|
+
elapsedMs: Math.max(0, Math.round(now() - startedAt)), ...why }, "systemd-notify failed; systemd's watchdog may not be fed");
|
|
132
|
+
}
|
|
133
|
+
catch { /* reporting must never break the ping */ }
|
|
134
|
+
if (state === "WATCHDOG=1" && !retry && epoch === generation) {
|
|
135
|
+
retryTimer = setTimeout(() => {
|
|
136
|
+
retryTimer = null;
|
|
137
|
+
attempt(state, true, epoch); // owner is checked again, and a retry never retries itself
|
|
138
|
+
}, SD_NOTIFY_RETRY_MS);
|
|
139
|
+
retryTimer.unref?.();
|
|
140
|
+
}
|
|
141
|
+
};
|
|
102
142
|
try {
|
|
103
|
-
deps.send(state, deps.socket,
|
|
104
|
-
if (error)
|
|
105
|
-
warn("notify_failed", { state, error: error.message, code: error.code }, "systemd-notify failed; systemd's watchdog may not be fed");
|
|
106
|
-
});
|
|
143
|
+
deps.send(state, deps.socket, done);
|
|
107
144
|
}
|
|
108
145
|
catch (error) {
|
|
109
|
-
|
|
146
|
+
done(error instanceof Error ? error : new Error(String(error)));
|
|
110
147
|
}
|
|
111
148
|
};
|
|
149
|
+
const notify = (state) => {
|
|
150
|
+
// A regular ping supersedes an older retry; STOPPING/READY also fence any
|
|
151
|
+
// in-flight failure callback from rearming a heartbeat after lifecycle changes.
|
|
152
|
+
cancelRetry();
|
|
153
|
+
attempt(state, false, generation);
|
|
154
|
+
};
|
|
155
|
+
return Object.assign(notify, { cancelRetry });
|
|
112
156
|
}
|
|
113
157
|
const defaultNotifier = createSdNotifier({
|
|
114
158
|
socket: notifySocket,
|
|
@@ -117,6 +161,20 @@ const defaultNotifier = createSdNotifier({
|
|
|
117
161
|
send: (state, socket, onDone) => sendSystemdNotificationAsync(state, socket, process.env, undefined, onDone),
|
|
118
162
|
warn: () => warnSink,
|
|
119
163
|
});
|
|
164
|
+
/**
|
|
165
|
+
* Once at startup (log only): the socket systemd gave this process is already gone, so READY will not arrive either.
|
|
166
|
+
* Returns whether it said so.
|
|
167
|
+
*/
|
|
168
|
+
export function reportNotifySocketAtStart(warn, socket = notifySocket, problem = notifySocketProblem) {
|
|
169
|
+
const why = problem(socket);
|
|
170
|
+
if (!why)
|
|
171
|
+
return false;
|
|
172
|
+
try {
|
|
173
|
+
warn(why, "systemd's notify socket is missing; READY and WATCHDOG cannot reach systemd");
|
|
174
|
+
}
|
|
175
|
+
catch { /* best effort */ }
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
120
178
|
/**
|
|
121
179
|
* Blocking variant, for the one case where the process is about to exit.
|
|
122
180
|
*
|
|
@@ -125,6 +183,7 @@ const defaultNotifier = createSdNotifier({
|
|
|
125
183
|
* should use this.
|
|
126
184
|
*/
|
|
127
185
|
export function sdNotifyBlocking(state) {
|
|
186
|
+
defaultNotifier.cancelRetry();
|
|
128
187
|
if (!notifySocket || !isFleetOwner())
|
|
129
188
|
return;
|
|
130
189
|
try {
|
package/dist/sd-notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-notify.js","sourceRoot":"","sources":["../src/sd-notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"sd-notify.js","sourceRoot":"","sources":["../src/sd-notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { WebChatMessage } from "../web-chat-history.js";
|
|
10
10
|
import type { SearchDoc } from "./search-store.js";
|
|
11
|
-
/** A chat row's doc, or null when it is not searched (a status line,
|
|
11
|
+
/** A chat row's doc, or null when it is not searched (a status line, nothing to find). */
|
|
12
12
|
export declare function chatDoc(m: WebChatMessage): SearchDoc | null;
|
|
13
13
|
export interface CrossInstanceRecord {
|
|
14
14
|
messageId: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const time = (iso, fallback = Date.now()) => { const t = typeof iso === "string" ? Date.parse(iso) : NaN; return Number.isFinite(t) ? t : fallback; };
|
|
2
|
-
/** A chat row's doc, or null when it is not searched (a status line,
|
|
2
|
+
/** A chat row's doc, or null when it is not searched (a status line, nothing to find). */
|
|
3
3
|
export function chatDoc(m) {
|
|
4
|
-
if (
|
|
4
|
+
if (m.role !== "user" && m.role !== "agent")
|
|
5
5
|
return null;
|
|
6
6
|
const words = m.click?.label ?? m.text ?? "";
|
|
7
7
|
const files = (m.attachments ?? []).map(a => a.name).filter(Boolean).join(" ");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../src/search/search-docs.ts"],"names":[],"mappings":"AAWA,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,EAAU,EAAE,GAAG,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEvK,
|
|
1
|
+
{"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../src/search/search-docs.ts"],"names":[],"mappings":"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"}
|
package/dist/settings-api.d.ts
CHANGED
|
@@ -40,6 +40,16 @@ export interface SettingsApiContext extends AppShellContext {
|
|
|
40
40
|
queued: boolean;
|
|
41
41
|
already_running?: boolean;
|
|
42
42
|
};
|
|
43
|
+
/** #2906: the fixed address's Test connection (closed step codes only; never the token). */
|
|
44
|
+
testNamedLink?(input: {
|
|
45
|
+
hostname: unknown;
|
|
46
|
+
port: unknown;
|
|
47
|
+
protocol: unknown;
|
|
48
|
+
token?: unknown;
|
|
49
|
+
current?: () => boolean;
|
|
50
|
+
}): Promise<import("./tunnel/named-link-test.js").NamedTestResult | {
|
|
51
|
+
busy: true;
|
|
52
|
+
}>;
|
|
43
53
|
/** #1920 phase 3: Settings → Web sign-ins → Guests. */
|
|
44
54
|
guestOverview?(): unknown;
|
|
45
55
|
/** #2667: the ClassicBot rooms' instance names — a guest grant may name one, so a save's validation knows them. */
|
|
@@ -51,6 +61,11 @@ export interface SettingsApiContext extends AppShellContext {
|
|
|
51
61
|
count: number;
|
|
52
62
|
durable: boolean;
|
|
53
63
|
};
|
|
64
|
+
/** #2855: a removed guest's own preferences go with it. */
|
|
65
|
+
forgetGuestPrefs?(owner: {
|
|
66
|
+
adapterId: string;
|
|
67
|
+
userId: string;
|
|
68
|
+
}): void;
|
|
54
69
|
/** #2348 delta §5: one audit entry per person whose granted agents changed with a save (event log, the Log tab). */
|
|
55
70
|
noteGuestGrantChange?(change: {
|
|
56
71
|
by: string | null;
|
|
@@ -59,6 +74,7 @@ export interface SettingsApiContext extends AppShellContext {
|
|
|
59
74
|
added: string[];
|
|
60
75
|
removed: string[];
|
|
61
76
|
endedSessions: number;
|
|
77
|
+
level?: "chat" | "trusted";
|
|
62
78
|
}): void;
|
|
63
79
|
/** #2348: the people AgEnD has seen in chat (the Guests picker), never a fleet admin or a bot. */
|
|
64
80
|
guestPeople?(): unknown;
|
|
@@ -87,7 +103,6 @@ export interface SettingsApiContext extends AppShellContext {
|
|
|
87
103
|
getRawFleetConfig(): RawFleetConfig;
|
|
88
104
|
saveFleetConfig(explicitPatches?: RawConfigPatch[]): void;
|
|
89
105
|
/** Refresh managed guidance and web clients after a committed experimental setting change. */
|
|
90
|
-
canvasWorkerSettingChanged?(): void;
|
|
91
106
|
lifecycle: {
|
|
92
107
|
isPaused(name: string): boolean;
|
|
93
108
|
pause(name: string): Promise<void>;
|
package/dist/settings-api.js
CHANGED
|
@@ -4,7 +4,7 @@ import { DEFAULT_REPLY_TRIGGERS } from "./reply-triggers.js";
|
|
|
4
4
|
import { PUBLIC_TUNNEL_SECRET_ID, PUBLIC_TUNNEL_TOKEN_HINT } from "./public-tunnel-config.js";
|
|
5
5
|
import { withSpawnHoldReply } from "./spawn-hold-reply.js";
|
|
6
6
|
import { normalizeSettingsInstancePatch, removesInstanceOverride } from "./settings-instance-patch.js";
|
|
7
|
-
import { isSettingsReplay, settingsRequestExecution,
|
|
7
|
+
import { isSettingsReplay, settingsRequestExecution, settingsWrite } from "./settings-request-capability.js";
|
|
8
8
|
import { noteSettingsWrite, settingsUndo, undoSettingsPaths } from "./settings-transaction.js";
|
|
9
9
|
import { readBoundedWebBody } from "./web-body.js";
|
|
10
10
|
import { gatewayRequestContext } from "./web-request-context.js";
|
|
@@ -346,6 +346,47 @@ export function handleSettingsRequest(req, res, url, ctx) {
|
|
|
346
346
|
}
|
|
347
347
|
return true;
|
|
348
348
|
}
|
|
349
|
+
// #2906 (the user, 2026-11-01): Settings → Access → Test connection, on the fixed-address values as filled in. Admin
|
|
350
|
+
// only and never over the public link, like the rest of Access; the typed token is read from the body once, used
|
|
351
|
+
// only in the test connector's environment, and never echoed — the answer is closed step codes.
|
|
352
|
+
if (method === "POST" && path === "/api/settings/public-link/test") {
|
|
353
|
+
if (gatewayRequestContext(req)) {
|
|
354
|
+
json(res, 403, { error: "web_settings_not_over_public_link" }, true);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
const caller = guestSettingsCaller(req, url, ctx);
|
|
358
|
+
if (!caller) {
|
|
359
|
+
json(res, 403, { error: "An admin sign-in is required" }, true);
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
if (!ctx.testNamedLink) {
|
|
363
|
+
json(res, 501, { error: "test unavailable" }, true);
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
// #2907 review: the same admin, still current, after the body's await — and again before anything is started.
|
|
367
|
+
const current = () => guestSettingsCaller(req, url, ctx) === caller;
|
|
368
|
+
readBody(req, 16 * 1024).then(async (buf) => {
|
|
369
|
+
if (!permitWebContinuation(req, res, ctx))
|
|
370
|
+
return;
|
|
371
|
+
if (!current())
|
|
372
|
+
return json(res, 401, { error: "no longer authorized" }, true);
|
|
373
|
+
let body;
|
|
374
|
+
try {
|
|
375
|
+
body = JSON.parse(buf.toString("utf-8") || "{}");
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
return json(res, 400, { error: "invalid JSON" }, true);
|
|
379
|
+
}
|
|
380
|
+
if (!body || typeof body !== "object" || Array.isArray(body))
|
|
381
|
+
return json(res, 400, { error: "invalid body" }, true);
|
|
382
|
+
const result = await ctx.testNamedLink({ hostname: body.hostname, port: body.origin_port, protocol: body.protocol, token: body.token, current });
|
|
383
|
+
if ("busy" in result)
|
|
384
|
+
return json(res, 409, { error: "test_running" }, true);
|
|
385
|
+
json(res, 200, { steps: result.steps, hostname: result.hostname, port: result.port, ...(result.cleanup ? { cleanup: result.cleanup } : {}) }, true);
|
|
386
|
+
}).catch(() => { if (!res.headersSent)
|
|
387
|
+
json(res, 400, { error: "bad request" }, true); });
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
349
390
|
// Generic provider API-key registry. Unlike the legacy connection token
|
|
350
391
|
// routes, this endpoint accepts a code-owned spec id only; env key, origin,
|
|
351
392
|
// auth header and verifier are resolved server-side. The body is consumed
|
|
@@ -894,12 +935,6 @@ export function handleSettingsRequest(req, res, url, ctx) {
|
|
|
894
935
|
const parsed = parseWebSettingsBody(body);
|
|
895
936
|
if ("error" in parsed)
|
|
896
937
|
return json(res, 400, { error: parsed.error });
|
|
897
|
-
if (parsed.canvasWorker !== undefined && !settingsRequestLocalAdmin(req)) {
|
|
898
|
-
const actor = evaluateWebRequest(req, url, ctx.webToken ?? null, ctx.webSessions, { touch: false });
|
|
899
|
-
if (actor.kind !== "allow" || actor.via !== "session" || actor.session.tier !== "admin" || actor.session.surface !== "local") {
|
|
900
|
-
return json(res, 403, { error: "canvas_worker_setting_needs_local_admin" });
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
938
|
const { session: sessionPatch, terminal: terminalPatch } = parsed;
|
|
904
939
|
// #2499 review: who is saving, asked now, before the save — a session policy saved with it can end this very session
|
|
905
940
|
// (a shorter sign-in time), and the audit must still name who did it. A confirmation's replay is no one's: null.
|
|
@@ -907,10 +942,6 @@ export function handleSettingsRequest(req, res, url, ctx) {
|
|
|
907
942
|
const changes = [];
|
|
908
943
|
let web = { ...cfg.web };
|
|
909
944
|
let webTerminal = cfg.web_terminal;
|
|
910
|
-
if (parsed.canvasWorker !== undefined) {
|
|
911
|
-
web.experimental = { ...web.experimental, canvas_worker: parsed.canvasWorker };
|
|
912
|
-
changes.push({ path: ["web", "experimental", "canvas_worker"], value: parsed.canvasWorker });
|
|
913
|
-
}
|
|
914
945
|
if (parsed.notifyLogin !== undefined) {
|
|
915
946
|
const holder = { defaults: cfg.defaults, web };
|
|
916
947
|
setNoticeMode(holder, "login", parsed.notifyLogin);
|
|
@@ -1020,9 +1051,6 @@ export function handleSettingsRequest(req, res, url, ctx) {
|
|
|
1020
1051
|
ctx.logger.warn({ err }, "settings: web save refused");
|
|
1021
1052
|
return json(res, 500, { ok: false, error: err.message });
|
|
1022
1053
|
}
|
|
1023
|
-
if (parsed.canvasWorker !== undefined && (previous.web?.experimental?.canvas_worker === true) !== parsed.canvasWorker) {
|
|
1024
|
-
ctx.canvasWorkerSettingChanged?.();
|
|
1025
|
-
}
|
|
1026
1054
|
// #2348: a grant taken away (or emptied) ends that person's guest access now — sessions, an outstanding code, and
|
|
1027
1055
|
// remembered browsers — not at their next request. A narrowed grant keeps its sessions; they see less from now on.
|
|
1028
1056
|
const ended = new Map();
|
|
@@ -1036,6 +1064,15 @@ export function handleSettingsRequest(req, res, url, ctx) {
|
|
|
1036
1064
|
catch (err) {
|
|
1037
1065
|
ctx.logger.warn({ err }, "settings: could not end a removed guest's sessions");
|
|
1038
1066
|
}
|
|
1067
|
+
// #2855: removed (not just emptied): the guest's own preferences go too. Its name stays for its past messages.
|
|
1068
|
+
if (grant === null) {
|
|
1069
|
+
try {
|
|
1070
|
+
ctx.forgetGuestPrefs?.({ adapterId: key.slice(0, at), userId: key.slice(at + 1) });
|
|
1071
|
+
}
|
|
1072
|
+
catch (err) {
|
|
1073
|
+
ctx.logger.warn({ err }, "settings: could not delete a removed guest's preferences");
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1039
1076
|
}
|
|
1040
1077
|
// #2348 delta §5: every grant change is audited, widening (confirmed in General, replayed here) or narrowing (at
|
|
1041
1078
|
// once) alike: who, how, the agents added and taken away. Agent names only; never message content. Shown under
|
|
@@ -1046,10 +1083,13 @@ export function handleSettingsRequest(req, res, url, ctx) {
|
|
|
1046
1083
|
for (const key of new Set([...Object.keys(was), ...Object.keys(now)])) {
|
|
1047
1084
|
const a = new Set(Object.hasOwn(was, key) ? was[key].instances : []), b = new Set(Object.hasOwn(now, key) ? now[key].instances : []);
|
|
1048
1085
|
const added = [...b].filter((n) => !a.has(n)), removed = [...a].filter((n) => !b.has(n));
|
|
1049
|
-
|
|
1086
|
+
// #2855: a kept grant's level, when it changed (Chat ↔ Trusted).
|
|
1087
|
+
const levelOf = (g) => (g?.level === "trusted" ? "trusted" : "chat");
|
|
1088
|
+
const level = Object.hasOwn(was, key) && Object.hasOwn(now, key) && levelOf(was[key]) !== levelOf(now[key]) ? levelOf(now[key]) : undefined;
|
|
1089
|
+
if (!added.length && !removed.length && !level)
|
|
1050
1090
|
continue;
|
|
1051
1091
|
try {
|
|
1052
|
-
ctx.noteGuestGrantChange({ by, via, account: key, added, removed, endedSessions: ended.get(key) ?? 0 });
|
|
1092
|
+
ctx.noteGuestGrantChange({ by, via, account: key, added, removed, endedSessions: ended.get(key) ?? 0, ...(level ? { level } : {}) });
|
|
1053
1093
|
}
|
|
1054
1094
|
catch (err) {
|
|
1055
1095
|
ctx.logger.warn({ err }, "settings: could not audit a guest grant change");
|