@songsid/agend 2.3.0-beta.2 → 2.3.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/README.zh-TW.md +7 -1
- package/dist/agent-cli-instructions.md +9 -2
- package/dist/agent-cli.js +63 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +4 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +4 -1
- package/dist/agent-file-read.js +189 -16
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +29 -5
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +45 -13
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +38 -0
- package/dist/authority/authority-state.js +114 -0
- package/dist/authority/authority-state.js.map +1 -0
- package/dist/authority/session-authorizations.d.ts +43 -0
- package/dist/authority/session-authorizations.js +102 -0
- package/dist/authority/session-authorizations.js.map +1 -0
- package/dist/authority/web-authority.d.ts +120 -0
- package/dist/authority/web-authority.js +157 -0
- package/dist/authority/web-authority.js.map +1 -0
- package/dist/backend/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +18 -8
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +8 -0
- package/dist/backend/codex-metadata.js +74 -17
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex.js +15 -2
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +2 -0
- package/dist/backend/credential-profile.js +2 -0
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/types.d.ts +6 -0
- package/dist/backend/types.js +15 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +23 -3
- package/dist/backend-command.js +25 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bug-report-cli.d.ts +30 -0
- package/dist/bug-report-cli.js +138 -0
- package/dist/bug-report-cli.js.map +1 -0
- package/dist/bug-report.d.ts +47 -0
- package/dist/bug-report.js +136 -0
- package/dist/bug-report.js.map +1 -0
- package/dist/bundled-skills.d.ts +14 -0
- package/dist/bundled-skills.js +29 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +55 -3
- package/dist/cache-service.js +152 -16
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +9 -0
- package/dist/channel/adapters/discord.js +49 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +22 -11
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +6 -0
- package/dist/classic-channel-manager.d.ts +10 -5
- package/dist/classic-channel-manager.js +12 -9
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +224 -111
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.d.ts +6 -0
- package/dist/config-validator.js +129 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +13 -1
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +7 -0
- package/dist/cross-instance-notice.js +10 -0
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +24 -1
- package/dist/daemon.js +151 -19
- package/dist/daemon.js.map +1 -1
- package/dist/decision-list.d.ts +25 -0
- package/dist/decision-list.js +30 -0
- package/dist/decision-list.js.map +1 -0
- package/dist/delivery-outbox.d.ts +10 -0
- package/dist/delivery-outbox.js +17 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/diagnostic-redaction.d.ts +10 -0
- package/dist/diagnostic-redaction.js +167 -0
- package/dist/diagnostic-redaction.js.map +1 -0
- package/dist/fleet-context.d.ts +10 -0
- package/dist/fleet-manager.d.ts +505 -15
- package/dist/fleet-manager.js +1870 -204
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +69 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/bug-report/SKILL.md +31 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +17 -6
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +2 -0
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/scheduling/SKILL.md +4 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +190 -47
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +545 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/human-delivery-receipts.d.ts +24 -1
- package/dist/human-delivery-receipts.js +64 -11
- package/dist/human-delivery-receipts.js.map +1 -1
- package/dist/instance-config-impact.js +7 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -1
- package/dist/instance-lifecycle.js +79 -18
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +173 -12
- package/dist/locale.js.map +1 -1
- package/dist/log-steps.d.ts +1 -0
- package/dist/log-steps.js +15 -0
- package/dist/log-steps.js.map +1 -1
- package/dist/login-controller.d.ts +45 -0
- package/dist/login-controller.js +101 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +96 -0
- package/dist/ls-attach-resolve.js +180 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/ls-rows.d.ts +12 -0
- package/dist/ls-rows.js +82 -3
- package/dist/ls-rows.js.map +1 -1
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/needs-you.d.ts +10 -0
- package/dist/needs-you.js +2 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +11 -0
- package/dist/outbound-handlers.js +139 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +200 -4
- package/dist/outbound-schemas.js +124 -11
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +17 -4
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +19 -1
- package/dist/quickstart-api.js +94 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +4 -0
- package/dist/reply-buttons-controller.js +2 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/restart-progress.d.ts +80 -1
- package/dist/restart-progress.js +306 -21
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.d.ts +5 -0
- package/dist/rollout-index.js +26 -5
- package/dist/rollout-index.js.map +1 -1
- package/dist/scheduler/db.d.ts +40 -13
- package/dist/scheduler/db.js +123 -89
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/task-board-text.d.ts +26 -0
- package/dist/scheduler/task-board-text.js +135 -0
- package/dist/scheduler/task-board-text.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +650 -0
- package/dist/scheduler/task-board.js +1938 -0
- package/dist/scheduler/task-board.js.map +1 -0
- package/dist/scheduler/types.d.ts +6 -1
- package/dist/search/search-docs.d.ts +58 -0
- package/dist/search/search-docs.js +63 -0
- package/dist/search/search-docs.js.map +1 -0
- package/dist/search/search-index.d.ts +141 -0
- package/dist/search/search-index.js +440 -0
- package/dist/search/search-index.js.map +1 -0
- package/dist/search/search-store.d.ts +122 -0
- package/dist/search/search-store.js +236 -0
- package/dist/search/search-store.js.map +1 -0
- package/dist/search/search-worker.d.ts +1 -0
- package/dist/search/search-worker.js +163 -0
- package/dist/search/search-worker.js.map +1 -0
- package/dist/service-installer.js +12 -0
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +23 -0
- package/dist/settings-api.js +164 -3
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +104 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +3 -1
- package/dist/settings-confirmation.js +2 -0
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +34 -3
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +11 -0
- package/dist/settings-http-confirmation.js +10 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +23 -7
- package/dist/setup-form.js.map +1 -1
- package/dist/spawn-gate.d.ts +1 -0
- package/dist/spawn-gate.js +13 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/task-board-tool.d.ts +25 -0
- package/dist/task-board-tool.js +154 -0
- package/dist/task-board-tool.js.map +1 -0
- package/dist/task-board-waker.d.ts +44 -0
- package/dist/task-board-waker.js +128 -0
- package/dist/task-board-waker.js.map +1 -0
- package/dist/tmux-exec-helper.d.ts +94 -0
- package/dist/tmux-exec-helper.js +407 -0
- package/dist/tmux-exec-helper.js.map +1 -0
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +42 -11
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +0 -7
- package/dist/tool-permissions.js +44 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -1
- package/dist/topic-commands.js +45 -19
- package/dist/topic-commands.js.map +1 -1
- package/dist/tunnel/cloudflared.js +37 -2
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/types.d.ts +3 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/types.d.ts +63 -1
- package/dist/ui/app-effects.js +90 -32
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +8 -8
- package/dist/ui/chat-effects.js +110 -15
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +21 -3
- package/dist/ui/chat-store.js +64 -12
- package/dist/ui/chat-strings.js +85 -8
- package/dist/ui/chat-thread.js +204 -21
- package/dist/ui/effect-trial-controller.js +13 -8
- package/dist/ui/effect-trial-panel.js +19 -16
- package/dist/ui/effects-waker.js +70 -0
- package/dist/ui/fleet-canvas-layout.js +117 -0
- package/dist/ui/fleet-canvas.js +555 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-route-scene.js +207 -0
- package/dist/ui/fleet-route-worker.js +21 -0
- package/dist/ui/fleet-route.js +88 -0
- package/dist/ui/fleet-task-card.js +436 -0
- package/dist/ui/fleet-task-common.js +448 -0
- package/dist/ui/fleet-tasks.js +535 -0
- package/dist/ui/fleet-traffic.js +359 -0
- package/dist/ui/fleet-usage.js +435 -0
- package/dist/ui/panel-chat.js +264 -66
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +65 -83
- package/dist/ui/panel-needs.js +4 -2
- package/dist/ui/panel-settings.js +56 -11
- package/dist/ui/preview.js +3 -2
- package/dist/ui/search-dialog.js +349 -0
- package/dist/ui/settings-appearance.js +44 -19
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +4 -3
- package/dist/ui/settings-guests.js +117 -0
- package/dist/ui/settings-learn.js +25 -0
- package/dist/ui/settings-model.js +15 -6
- package/dist/ui/settings-mods.js +23 -9
- package/dist/ui/settings-owner-effects.js +15 -13
- package/dist/ui/settings-strings.js +122 -42
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +1 -1
- package/dist/ui/shared/app-i18n.js +11 -2
- package/dist/ui/shared/app-prefs.js +17 -4
- package/dist/ui/shared/app-route.js +19 -1
- package/dist/ui/shared/app-session.js +2 -0
- package/dist/ui/shared/app-shell.js +174 -30
- package/dist/ui/shared/app-store.js +26 -1
- package/dist/ui/shared/app-stream.js +5 -1
- package/dist/ui/shared/app-themes.js +140 -7
- package/dist/ui/shared/app.css +704 -20
- package/dist/ui/shared/app.js +26 -15
- package/dist/ui/shared/card-strings.js +8 -0
- package/dist/ui/shared/effect-app-runtime.js +68 -19
- package/dist/ui/shared/effect-chat-runtime.js +16 -3
- package/dist/ui/shared/effect-frame.js +26 -7
- package/dist/ui/shared/effect-geometry.js +24 -9
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-policy.js +21 -7
- package/dist/ui/shared/effect-profiler.js +31 -9
- package/dist/ui/shared/effect-registry.js +97 -50
- package/dist/ui/shared/effect-stock-snapshot.js +9 -0
- package/dist/ui/shared/effect-stock-trust.js +62 -10
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +1 -1
- package/dist/ui/shared/effect-trial-stage.js +54 -31
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/identity-card.js +100 -11
- package/dist/ui/shared/identity-color.js +14 -10
- package/dist/ui/shared/instance-nav.js +179 -23
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/panel-view.js +24 -4
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/ui-menu.js +20 -7
- package/dist/ui/shared/ui-toast.js +16 -3
- package/dist/ui/shared/usage-dialog.js +34 -3
- package/dist/ui/shared/view-strings.js +72 -0
- package/dist/ui/shared/web-authorize.js +198 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/ui/web-terminal/terminal.html +1 -1
- package/dist/update-launch.d.ts +9 -0
- package/dist/update-launch.js +38 -12
- package/dist/update-launch.js.map +1 -1
- package/dist/usage/format-rich.js +6 -3
- package/dist/usage/format-rich.js.map +1 -1
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +2 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/i18n.d.ts +13 -1
- package/dist/usage/i18n.js +29 -0
- package/dist/usage/i18n.js.map +1 -1
- package/dist/usage/providers.d.ts +81 -2
- package/dist/usage/providers.js +240 -38
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/usage-api.d.ts +5 -1
- package/dist/usage/usage-api.js +184 -58
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.d.ts +158 -0
- package/dist/usage-report.js +226 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-rollup.d.ts +51 -0
- package/dist/usage-rollup.js +168 -0
- package/dist/usage-rollup.js.map +1 -0
- package/dist/user-systemd.d.ts +24 -0
- package/dist/user-systemd.js +75 -0
- package/dist/user-systemd.js.map +1 -0
- package/dist/view-api.d.ts +39 -0
- package/dist/view-api.js +69 -6
- package/dist/view-api.js.map +1 -1
- package/dist/web-ambient.d.ts +72 -0
- package/dist/web-ambient.js +161 -0
- package/dist/web-ambient.js.map +1 -0
- package/dist/web-api.d.ts +98 -14
- package/dist/web-api.js +1027 -83
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-policy.d.ts +4 -6
- package/dist/web-appearance-policy.js +5 -12
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +3 -0
- package/dist/web-appearance-tools.js +22 -3
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +27 -2
- package/dist/web-appearance-view.js +129 -14
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +17 -3
- package/dist/web-appearance.js +85 -8
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-asset-parts.d.ts +2 -2
- package/dist/web-asset-parts.js +3 -3
- package/dist/web-asset-parts.js.map +1 -1
- package/dist/web-auth.js +3 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +130 -0
- package/dist/web-backend-login.js +225 -0
- package/dist/web-backend-login.js.map +1 -0
- package/dist/web-card.d.ts +14 -0
- package/dist/web-card.js +40 -6
- package/dist/web-card.js.map +1 -1
- package/dist/web-channel-echo.d.ts +7 -1
- package/dist/web-channel-echo.js +6 -2
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +83 -0
- package/dist/web-chat-history.js +137 -5
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +6 -1
- package/dist/web-commands.js +1 -1
- package/dist/web-commands.js.map +1 -1
- package/dist/web-effect-bootstrap.d.ts +12 -0
- package/dist/web-effect-bootstrap.js +49 -0
- package/dist/web-effect-bootstrap.js.map +1 -0
- package/dist/web-effect-bundle.js +46 -1
- package/dist/web-effect-bundle.js.map +1 -1
- package/dist/web-effect-playback.d.ts +30 -0
- package/dist/web-effect-playback.js +71 -0
- package/dist/web-effect-playback.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +4 -4
- package/dist/web-effect-service.d.ts +11 -4
- package/dist/web-effect-service.js +25 -4
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.d.ts +1 -0
- package/dist/web-effect-tools.js +4 -4
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.d.ts +2 -2
- package/dist/web-effect-trials.js +3 -3
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.js +1 -1
- package/dist/web-effect-upload.js.map +1 -1
- package/dist/web-effect-worker.d.ts +1 -1
- package/dist/web-effect-worker.js +2 -2
- package/dist/web-effect-worker.js.map +1 -1
- package/dist/web-effect.d.ts +1 -1
- package/dist/web-guest-access.d.ts +126 -0
- package/dist/web-guest-access.js +238 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-host-guard.d.ts +11 -0
- package/dist/web-host-guard.js +11 -0
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-identity-color.d.ts +1 -1
- package/dist/web-identity-color.js +2 -2
- package/dist/web-identity-color.js.map +1 -1
- package/dist/web-identity-palette.d.ts +1 -1
- package/dist/web-identity-palette.js +2 -2
- package/dist/web-identity-palette.js.map +1 -1
- package/dist/web-image-meta.d.ts +13 -0
- package/dist/web-image-meta.js +62 -0
- package/dist/web-image-meta.js.map +1 -1
- package/dist/web-libavoid.d.ts +14 -0
- package/dist/web-libavoid.js +46 -0
- package/dist/web-libavoid.js.map +1 -0
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +1 -1
- package/dist/web-mod-agent.js +7 -5
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-bundle.d.ts +9 -1
- package/dist/web-mod-bundle.js +62 -3
- package/dist/web-mod-bundle.js.map +1 -1
- package/dist/web-mod-export.d.ts +9 -0
- package/dist/web-mod-export.js +21 -0
- package/dist/web-mod-export.js.map +1 -1
- package/dist/web-mod-store.d.ts +7 -1
- package/dist/web-mod-store.js +19 -6
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +44 -1
- package/dist/web-owner-css-store.js +70 -9
- package/dist/web-owner-css-store.js.map +1 -1
- package/dist/web-prefs.d.ts +14 -0
- package/dist/web-prefs.js +37 -4
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +6 -2
- package/dist/web-preview.js +4 -2
- package/dist/web-preview.js.map +1 -1
- package/dist/web-returning-device.d.ts +41 -0
- package/dist/web-returning-device.js +57 -5
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-session-authorization.d.ts +132 -0
- package/dist/web-session-authorization.js +193 -0
- package/dist/web-session-authorization.js.map +1 -0
- package/dist/web-session.d.ts +70 -10
- package/dist/web-session.js +137 -22
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +49 -2
- package/dist/web-settings-patch.js +145 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +94 -0
- package/dist/web-settings-tools.js +301 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +1 -1
- package/dist/web-shell-routes.js +1 -1
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal-http.js +15 -2
- package/dist/web-terminal-http.js.map +1 -1
- package/dist/web-theme-store.d.ts +39 -0
- package/dist/web-theme-store.js +122 -11
- package/dist/web-theme-store.js.map +1 -1
- package/dist/web-theme.d.ts +31 -0
- package/dist/web-theme.js +99 -2
- package/dist/web-theme.js.map +1 -1
- package/dist/web-upload.d.ts +13 -0
- package/dist/web-upload.js +39 -3
- package/dist/web-upload.js.map +1 -1
- package/dist/windows-shortcuts.d.ts +78 -0
- package/dist/windows-shortcuts.js +203 -0
- package/dist/windows-shortcuts.js.map +1 -0
- package/dist/workflow-templates/default.md +4 -1
- package/dist/yaml-shared-nodes.d.ts +25 -0
- package/dist/yaml-shared-nodes.js +185 -0
- package/dist/yaml-shared-nodes.js.map +1 -0
- package/launcher/agend-install.cjs +553 -0
- package/launcher/install-admission.cjs +4 -39
- package/launcher/postinstall.cjs +14 -12
- package/package.json +4 -2
- package/scripts/preinstall-guard.cjs +2 -5
- package/templates/windows-shortcuts.ps1 +181 -0
- package/launcher/old-updater-note.cjs +0 -48
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `task` tool's board actions (step 2, docs/design/task-board.md), for both of the tool's doors — the MCP tool
|
|
3
|
+
* over IPC (FleetManager.handleTaskCrud) and `agend-agent task` over HTTP (handleTaskCrudHttp):
|
|
4
|
+
*
|
|
5
|
+
* - `mine` — the caller's work; `projects` — the board's projects;
|
|
6
|
+
* - `move` — a card to another status, with the reason, result or comment the move needs;
|
|
7
|
+
* - `create` or `update` naming a board field (a project, a parent, a checklist, state, a log line, a comment…);
|
|
8
|
+
* - `get` of a card on the board — the card as text, with the comments new to its assignee.
|
|
9
|
+
*
|
|
10
|
+
* Everything else is the tool's own and is answered as before (undefined here). The caller is the instance the tool
|
|
11
|
+
* belongs to; the board's rules (scheduler/task-board.ts) decide what it may do. Answers are plain text.
|
|
12
|
+
*/
|
|
13
|
+
import type { SchedulerDb } from "./scheduler/db.js";
|
|
14
|
+
export declare function boardToolAction(db: SchedulerDb, instance: string, args: Record<string, unknown>): string | undefined;
|
|
15
|
+
/** The activity log's line for a board action that changed work (as `created task:` / `claimed:` / `completed:` for plain tasks). */
|
|
16
|
+
export declare function boardActivity(args: Record<string, unknown>): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* #2303: how many handed-out board cards an instance may have in progress at once — its `board_cards_at_once`, else
|
|
19
|
+
* 1 (the validator holds it to a whole number of at least 1; anything else here counts as 1).
|
|
20
|
+
*/
|
|
21
|
+
export declare function boardCardLimit(fleet: {
|
|
22
|
+
instances?: Record<string, {
|
|
23
|
+
board_cards_at_once?: unknown;
|
|
24
|
+
} | undefined>;
|
|
25
|
+
} | null | undefined, name: string): number;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { CARD_PRIORITIES, CARD_SIZES, CARD_STATUSES, TaskBoardError } from "./scheduler/task-board.js";
|
|
2
|
+
import { cardLine, cardText, myWorkText, projectsText, writeText } from "./scheduler/task-board-text.js";
|
|
3
|
+
/** A `create` naming one of these opens a board card; without them it is the tool's plain task. */
|
|
4
|
+
const BOARD_CREATE = ["project", "parent", "scope", "acceptance", "context", "needs_review", "size", "dispatcher"];
|
|
5
|
+
/** An `update` naming one of these edits the card on the board's terms; without them it is the tool's plain update. */
|
|
6
|
+
const BOARD_UPDATE = ["title", "description", "scope", "context", "state", "acceptance", "check", "uncheck", "log", "comment", "needs_review", "size", "depends_on", "version", "dispatcher"];
|
|
7
|
+
/** Words agents bring from other boards. */
|
|
8
|
+
const STATUS_ALIAS = { todo: "open", "to do": "open", doing: "claimed", in_progress: "claimed", "in progress": "claimed", waiting: "review" };
|
|
9
|
+
const str = (v) => (typeof v === "string" ? v : undefined);
|
|
10
|
+
const strs = (v) => (Array.isArray(v) && v.every((x) => typeof x === "string") ? v : undefined);
|
|
11
|
+
const nums = (v) => (Array.isArray(v) && v.every((x) => typeof x === "number") ? v : undefined);
|
|
12
|
+
const int = (v) => (typeof v === "number" && Number.isInteger(v) ? v : undefined);
|
|
13
|
+
const bool = (v) => (typeof v === "boolean" ? v : undefined);
|
|
14
|
+
// A dispatcher of null is a value (nobody), not an absent field.
|
|
15
|
+
const has = (args, keys) => keys.some((k) => args[k] !== undefined && (args[k] !== null || k === "dispatcher"));
|
|
16
|
+
function status(v, param = "to") {
|
|
17
|
+
const s = typeof v === "string" ? v.trim().toLowerCase() : "";
|
|
18
|
+
const known = CARD_STATUSES.includes(s) ? s : STATUS_ALIAS[s];
|
|
19
|
+
if (!known)
|
|
20
|
+
throw new TaskBoardError("invalid", `"${param}" is one of ${CARD_STATUSES.join(", ")}`);
|
|
21
|
+
return known;
|
|
22
|
+
}
|
|
23
|
+
const priority = (v) => (CARD_PRIORITIES.includes(v) ? v : undefined);
|
|
24
|
+
/** An instance's name; null, "" or "none": nobody. */
|
|
25
|
+
const dispatcher = (v) => {
|
|
26
|
+
if (v === undefined)
|
|
27
|
+
return undefined;
|
|
28
|
+
const name = typeof v === "string" ? v.trim() : "";
|
|
29
|
+
return !name || name.toLowerCase() === "none" ? null : { kind: "instance", name };
|
|
30
|
+
};
|
|
31
|
+
const size = (v) => (v === null || v === "" ? null : CARD_SIZES.includes(v) ? v : undefined);
|
|
32
|
+
function need(v, what) {
|
|
33
|
+
const s = str(v)?.trim();
|
|
34
|
+
if (!s)
|
|
35
|
+
throw new TaskBoardError("invalid", `${what} is required`);
|
|
36
|
+
return s;
|
|
37
|
+
}
|
|
38
|
+
export function boardToolAction(db, instance, args) {
|
|
39
|
+
const board = db.board;
|
|
40
|
+
const actor = { kind: "instance", name: instance };
|
|
41
|
+
switch (args.action) {
|
|
42
|
+
case "mine":
|
|
43
|
+
return myWorkText(board, instance, board.myWork(instance));
|
|
44
|
+
case "projects":
|
|
45
|
+
return projectsText(board.listProjects(true), board.projectStats());
|
|
46
|
+
case "move": {
|
|
47
|
+
const id = need(args.id, "id");
|
|
48
|
+
let to = status(args.to ?? args.status);
|
|
49
|
+
// As the tool's `done`: finishing a card that waits for the person's confirmation hands it to them (review).
|
|
50
|
+
if (to === "done") {
|
|
51
|
+
const held = board.findCard(id);
|
|
52
|
+
if (held?.needsReview && held.status !== "review")
|
|
53
|
+
to = "review";
|
|
54
|
+
}
|
|
55
|
+
const { card, from, notes } = board.moveCard(actor, id, to, {
|
|
56
|
+
reason: str(args.reason), result: str(args.result), comment: str(args.comment), version: int(args.version),
|
|
57
|
+
});
|
|
58
|
+
return writeText(card, notes, from);
|
|
59
|
+
}
|
|
60
|
+
case "create": {
|
|
61
|
+
if (!has(args, BOARD_CREATE))
|
|
62
|
+
return undefined;
|
|
63
|
+
const spec = {
|
|
64
|
+
title: need(args.title, "title"),
|
|
65
|
+
goal: str(args.description),
|
|
66
|
+
scope: str(args.scope),
|
|
67
|
+
context: str(args.context),
|
|
68
|
+
acceptance: strs(args.acceptance),
|
|
69
|
+
priority: priority(args.priority),
|
|
70
|
+
size: size(args.size) ?? undefined,
|
|
71
|
+
dependsOn: strs(args.depends_on),
|
|
72
|
+
needsReview: bool(args.needs_review),
|
|
73
|
+
dispatcher: dispatcher(args.dispatcher),
|
|
74
|
+
...(str(args.parent) ? { parent: str(args.parent) } : { project: str(args.project) ?? (typeof args.project === "number" ? args.project : undefined) }),
|
|
75
|
+
...(args.assignee !== undefined ? { assignee: str(args.assignee) ?? null } : {}),
|
|
76
|
+
};
|
|
77
|
+
const { cards, notes } = board.createCards(actor, { cards: [spec] });
|
|
78
|
+
return writeText(cards[0], notes);
|
|
79
|
+
}
|
|
80
|
+
case "update": {
|
|
81
|
+
if (!has(args, BOARD_UPDATE))
|
|
82
|
+
return undefined;
|
|
83
|
+
const patch = {
|
|
84
|
+
version: int(args.version),
|
|
85
|
+
title: str(args.title),
|
|
86
|
+
goal: str(args.description),
|
|
87
|
+
scope: str(args.scope),
|
|
88
|
+
context: str(args.context),
|
|
89
|
+
state: str(args.state),
|
|
90
|
+
result: str(args.result),
|
|
91
|
+
acceptance: strs(args.acceptance),
|
|
92
|
+
check: nums(args.check),
|
|
93
|
+
uncheck: nums(args.uncheck),
|
|
94
|
+
log: str(args.log),
|
|
95
|
+
comment: str(args.comment),
|
|
96
|
+
needsReview: bool(args.needs_review),
|
|
97
|
+
dispatcher: dispatcher(args.dispatcher),
|
|
98
|
+
size: size(args.size),
|
|
99
|
+
priority: priority(args.priority),
|
|
100
|
+
dependsOn: strs(args.depends_on),
|
|
101
|
+
...(args.assignee !== undefined ? { assignee: str(args.assignee) ?? null } : {}),
|
|
102
|
+
};
|
|
103
|
+
if (args.status === undefined) {
|
|
104
|
+
const { card, notes } = board.updateCard(actor, need(args.id, "id"), patch);
|
|
105
|
+
return writeText(card, notes);
|
|
106
|
+
}
|
|
107
|
+
// A status given with the fields: the fields, then the move as the tool's plain update makes it (the board's
|
|
108
|
+
// rules, the gate) — one write, so a refused move keeps the fields unchanged too.
|
|
109
|
+
const to = status(args.status, "status");
|
|
110
|
+
const { card, from } = board.atomically(() => {
|
|
111
|
+
const { card: edited } = board.updateCard(actor, need(args.id, "id"), patch);
|
|
112
|
+
if (to !== edited.status)
|
|
113
|
+
db.updateTask(edited.uuid, { status: to }, actor);
|
|
114
|
+
return { card: board.getCard(edited.uuid), from: edited.status };
|
|
115
|
+
});
|
|
116
|
+
return writeText(card, board.takeNotes(), from);
|
|
117
|
+
}
|
|
118
|
+
case "list": {
|
|
119
|
+
if (!has(args, ["project", "parent"]))
|
|
120
|
+
return undefined;
|
|
121
|
+
const filterStatus = args.filter_status === undefined ? undefined : (Array.isArray(args.filter_status) ? args.filter_status : [args.filter_status]).map((v) => status(v, "filter_status"));
|
|
122
|
+
const project = args.project === "" || args.project === "none" ? null : (str(args.project) ?? (typeof args.project === "number" ? args.project : undefined));
|
|
123
|
+
const { cards, total } = board.listCards({ project, parent: str(args.parent), assignee: str(args.filter_assignee) || undefined, status: filterStatus });
|
|
124
|
+
if (!cards.length)
|
|
125
|
+
return "No cards match.";
|
|
126
|
+
return [...cards.map((c) => cardLine(c)), ...(total > cards.length ? [`… ${total - cards.length} more: narrow with filter_status or filter_assignee`] : [])].join("\n");
|
|
127
|
+
}
|
|
128
|
+
case "get": {
|
|
129
|
+
const card = board.findCard(need(args.id, "id"));
|
|
130
|
+
return card && board.isOnBoard(card) ? cardText(board, card) : undefined;
|
|
131
|
+
}
|
|
132
|
+
default:
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** The activity log's line for a board action that changed work (as `created task:` / `claimed:` / `completed:` for plain tasks). */
|
|
137
|
+
export function boardActivity(args) {
|
|
138
|
+
const id = typeof args.id === "string" ? args.id : "";
|
|
139
|
+
if (args.action === "create" && has(args, BOARD_CREATE) && typeof args.title === "string")
|
|
140
|
+
return `created task: ${args.title}`;
|
|
141
|
+
if (args.action !== "move")
|
|
142
|
+
return null;
|
|
143
|
+
const to = typeof args.to === "string" ? args.to : typeof args.status === "string" ? args.status : "";
|
|
144
|
+
return { claimed: `claimed: ${id}`, done: `completed: ${id}`, review: `submitted for review: ${id}`, blocked: `blocked: ${id}`, cancelled: `cancelled: ${id}`, open: `put back: ${id}` }[STATUS_ALIAS[to] ?? to] ?? null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* #2303: how many handed-out board cards an instance may have in progress at once — its `board_cards_at_once`, else
|
|
148
|
+
* 1 (the validator holds it to a whole number of at least 1; anything else here counts as 1).
|
|
149
|
+
*/
|
|
150
|
+
export function boardCardLimit(fleet, name) {
|
|
151
|
+
const own = fleet?.instances && Object.prototype.hasOwnProperty.call(fleet.instances, name) ? fleet.instances[name]?.board_cards_at_once : undefined;
|
|
152
|
+
return typeof own === "number" && Number.isInteger(own) && own >= 1 ? own : 1;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=task-board-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-board-tool.js","sourceRoot":"","sources":["../src/task-board-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waking an instance when someone else changes a card it owns or handed out (step 2, docs/design/task-board.md). The
|
|
3
|
+
* board decides who hears what (TaskBoard's settleWakes); this gathers an instance's news for `gatherMs` (10 s) into
|
|
4
|
+
* one message — dragging five cards, or opening a whole plan, is one wake — checks again that each piece still stands
|
|
5
|
+
* when it goes out (wakeHolds), and hands it to the fleet as a notice from AgEnD: the delivery outbox holds it until
|
|
6
|
+
* the instance can take it, across a restart too. What is gathered but not yet handed over is lost on a stop; the card
|
|
7
|
+
* keeps the news (`task mine`, the comments new to its assignee).
|
|
8
|
+
*/
|
|
9
|
+
import type { Wake } from "./scheduler/task-board.js";
|
|
10
|
+
import { type Card } from "./scheduler/task-board.js";
|
|
11
|
+
export interface TaskBoardWakerDeps {
|
|
12
|
+
/** Hand `message` to the instance for good (the fleet's durable delivery); false when it could not be taken. */
|
|
13
|
+
deliver(instance: string, message: string, key: string): boolean;
|
|
14
|
+
/** Whether the board may wake this name: a fleet instance (an assignee can be any name). */
|
|
15
|
+
isInstance(name: string): boolean;
|
|
16
|
+
/** What of a wake still stands now (TaskBoard.wakeHolds), and the card, to say what it lacks. */
|
|
17
|
+
holds(wake: Wake): Wake | null;
|
|
18
|
+
card(uuid: string): Card | undefined;
|
|
19
|
+
log(level: "info" | "warn", message: string, extra?: Record<string, unknown>): void;
|
|
20
|
+
gatherMs?: number;
|
|
21
|
+
timers?: {
|
|
22
|
+
set(fn: () => void, ms: number): unknown;
|
|
23
|
+
clear(handle: unknown): void;
|
|
24
|
+
};
|
|
25
|
+
now?: () => number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One message for an instance's gathered news: a line per card (a main task assigned with its sub tasks is one line),
|
|
29
|
+
* or — a whole plan assigned at once — a count, so it does not read as everything to do right now.
|
|
30
|
+
*/
|
|
31
|
+
export declare function wakeMessage(wakes: Wake[], card?: (uuid: string) => Card | undefined): string;
|
|
32
|
+
export declare class TaskBoardWaker {
|
|
33
|
+
private readonly deps;
|
|
34
|
+
private readonly gathering;
|
|
35
|
+
private stopped;
|
|
36
|
+
private seq;
|
|
37
|
+
private readonly timers;
|
|
38
|
+
constructor(deps: TaskBoardWakerDeps);
|
|
39
|
+
/** A committed write's wakes: gathered per instance, a card's news merged (each reason keeps its own words). */
|
|
40
|
+
note(wakes: readonly Wake[]): void;
|
|
41
|
+
/** Nothing more is sent (the fleet is stopping); news still gathering is dropped — the cards keep it. */
|
|
42
|
+
stop(): void;
|
|
43
|
+
private flush;
|
|
44
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { gapText, oneLine } from "./scheduler/task-board-text.js";
|
|
2
|
+
import { wrapUpGap } from "./scheduler/task-board.js";
|
|
3
|
+
/** More assignments than this in one message are told as a count, not a line each. */
|
|
4
|
+
const MANY_ASSIGNED = 3;
|
|
5
|
+
/** The order a card's news is told in. */
|
|
6
|
+
const ORDER = ["cancelled", "sent_back", "decide", "answered", "approved", "wrap_up", "assigned", "start", "ready", "comment"];
|
|
7
|
+
const quote = (text) => (text ? `: "${oneLine(text, 160)}"` : "");
|
|
8
|
+
/** One reason, as a line about the card says it. */
|
|
9
|
+
function say(w, r, card) {
|
|
10
|
+
const by = w.by[r] ?? "someone";
|
|
11
|
+
switch (r) {
|
|
12
|
+
case "assigned": return `assigned to you by ${by}`;
|
|
13
|
+
case "start": return `${by} asks you to start it`;
|
|
14
|
+
case "sent_back": return `sent back by ${by}${quote(w.texts.sent_back)}`;
|
|
15
|
+
case "answered": return `${by} answered your blocked question${quote(w.texts.answered)} — it is in progress again`;
|
|
16
|
+
case "comment": return `new comment from ${by}${quote(w.texts.comment)}`;
|
|
17
|
+
case "ready": return "everything it waited for is done — you can start it";
|
|
18
|
+
case "decide": return `you handed it out and it is blocked${card?.assignee ? ` (@${card.assignee})` : ""}${quote(w.texts.decide)} — ask the person, then answer it: move it back to claimed with the decision as the comment`;
|
|
19
|
+
case "approved": return card?.assignee === w.instance ? `the person confirmed it${quote(w.texts.approved)}` : `you handed it out; the person confirmed it${quote(w.texts.approved)}`;
|
|
20
|
+
case "cancelled": return `cancelled by ${by}${w.texts.cancelled?.startsWith("with its main task") ? ` ${oneLine(w.texts.cancelled, 160)}` : quote(w.texts.cancelled)} — stop working on it`;
|
|
21
|
+
case "wrap_up": {
|
|
22
|
+
const gap = card ? wrapUpGap(card) : null;
|
|
23
|
+
return `it went to the person for confirmation by itself${gap ? `, but ${gapText(gap, true)}` : ""} — fill it in with update`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** "M-11–M-16" for a run of numbers, else the first few. */
|
|
28
|
+
function idList(codes) {
|
|
29
|
+
const n = (c) => Number(c.slice(2));
|
|
30
|
+
const sorted = [...codes].sort((a, b) => n(a) - n(b));
|
|
31
|
+
const run = sorted.length > 2 && sorted.every((c, i) => i === 0 || n(c) === n(sorted[i - 1]) + 1);
|
|
32
|
+
if (run)
|
|
33
|
+
return `${sorted[0]}–${sorted[sorted.length - 1]}`;
|
|
34
|
+
return sorted.length > 5 ? `${sorted.slice(0, 5).join(", ")} …` : sorted.join(", ");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* One message for an instance's gathered news: a line per card (a main task assigned with its sub tasks is one line),
|
|
38
|
+
* or — a whole plan assigned at once — a count, so it does not read as everything to do right now.
|
|
39
|
+
*/
|
|
40
|
+
export function wakeMessage(wakes, card = () => undefined) {
|
|
41
|
+
const assignedMains = new Set(wakes.filter((w) => w.reasons.includes("assigned") && !w.parent).map((w) => w.code));
|
|
42
|
+
const folded = new Map();
|
|
43
|
+
const items = wakes.filter((w) => {
|
|
44
|
+
const into = w.parent && w.reasons.length === 1 && w.reasons[0] === "assigned" && assignedMains.has(w.parent) ? w.parent : null;
|
|
45
|
+
if (into)
|
|
46
|
+
folded.set(into, (folded.get(into) ?? 0) + 1);
|
|
47
|
+
return !into;
|
|
48
|
+
});
|
|
49
|
+
const line = (w) => {
|
|
50
|
+
const subs = folded.get(w.code);
|
|
51
|
+
const news = ORDER.filter((r) => w.reasons.includes(r)).map((r) => say(w, r, card(w.uuid))).join("; ");
|
|
52
|
+
return `${w.code} "${oneLine(w.title, 60)}"${subs ? ` (with ${subs} sub task${subs === 1 ? "" : "s"})` : ""}: ${news}.`;
|
|
53
|
+
};
|
|
54
|
+
const assigned = items.filter((w) => w.reasons.length === 1 && w.reasons[0] === "assigned");
|
|
55
|
+
if (items.length > 1 && assigned.length > MANY_ASSIGNED) {
|
|
56
|
+
const mains = assigned.filter((w) => !w.parent).map((w) => w.code);
|
|
57
|
+
const subs = assigned.length - mains.length + [...folded.values()].reduce((a, b) => a + b, 0);
|
|
58
|
+
const what = [mains.length ? `${mains.length} main task${mains.length === 1 ? "" : "s"} (${idList(mains)})` : "", subs ? `${subs} sub task${subs === 1 ? "" : "s"}` : ""].filter(Boolean).join(" and ");
|
|
59
|
+
const summary = `You were assigned ${what}.`;
|
|
60
|
+
const rest = items.filter((w) => !assigned.includes(w));
|
|
61
|
+
const tail = "Read task mine for the order and work through them one at a time, by priority.";
|
|
62
|
+
return rest.length ? `[Task board] ${summary}\n${rest.map((w) => `- ${line(w)}`).join("\n")}\n${tail}` : `[Task board] ${summary} ${tail}`;
|
|
63
|
+
}
|
|
64
|
+
if (items.length === 1)
|
|
65
|
+
return `[Task board] ${line(items[0])} Read it with: task get ${items[0].code}`;
|
|
66
|
+
return `[Task board] ${items.length} things on your cards:\n${items.map((w) => `- ${line(w)}`).join("\n")}\nYour work: task mine`;
|
|
67
|
+
}
|
|
68
|
+
export class TaskBoardWaker {
|
|
69
|
+
deps;
|
|
70
|
+
gathering = new Map();
|
|
71
|
+
stopped = false;
|
|
72
|
+
seq = 0;
|
|
73
|
+
timers;
|
|
74
|
+
constructor(deps) {
|
|
75
|
+
this.deps = deps;
|
|
76
|
+
this.timers = deps.timers ?? { set: (fn, ms) => { const h = setTimeout(fn, ms); h.unref?.(); return h; }, clear: (h) => clearTimeout(h) };
|
|
77
|
+
}
|
|
78
|
+
/** A committed write's wakes: gathered per instance, a card's news merged (each reason keeps its own words). */
|
|
79
|
+
note(wakes) {
|
|
80
|
+
if (this.stopped)
|
|
81
|
+
return;
|
|
82
|
+
for (const w of wakes) {
|
|
83
|
+
if (!this.deps.isInstance(w.instance))
|
|
84
|
+
continue;
|
|
85
|
+
let batch = this.gathering.get(w.instance);
|
|
86
|
+
if (!batch) {
|
|
87
|
+
batch = { wakes: new Map(), timer: this.timers.set(() => this.flush(w.instance), this.deps.gatherMs ?? 10_000) };
|
|
88
|
+
this.gathering.set(w.instance, batch);
|
|
89
|
+
}
|
|
90
|
+
const had = batch.wakes.get(w.uuid);
|
|
91
|
+
batch.wakes.set(w.uuid, had
|
|
92
|
+
? { ...had, title: w.title, reasons: [...new Set([...had.reasons, ...w.reasons])], by: { ...had.by, ...w.by }, texts: { ...had.texts, ...w.texts } }
|
|
93
|
+
: { ...w, reasons: [...w.reasons], by: { ...w.by }, texts: { ...w.texts } });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Nothing more is sent (the fleet is stopping); news still gathering is dropped — the cards keep it. */
|
|
97
|
+
stop() {
|
|
98
|
+
this.stopped = true;
|
|
99
|
+
for (const b of this.gathering.values())
|
|
100
|
+
this.timers.clear(b.timer);
|
|
101
|
+
this.gathering.clear();
|
|
102
|
+
}
|
|
103
|
+
flush(instance) {
|
|
104
|
+
const batch = this.gathering.get(instance);
|
|
105
|
+
this.gathering.delete(instance);
|
|
106
|
+
if (!batch || this.stopped)
|
|
107
|
+
return;
|
|
108
|
+
// Only what still holds as it goes out: not finished meanwhile, still theirs, still waiting on them.
|
|
109
|
+
const wakes = [...batch.wakes.values()].map((w) => this.deps.holds(w)).filter((w) => w !== null);
|
|
110
|
+
if (!wakes.length)
|
|
111
|
+
return;
|
|
112
|
+
const codes = wakes.map((w) => w.code);
|
|
113
|
+
const key = `task-board:${instance}:${(this.deps.now ?? Date.now)()}:${++this.seq}`;
|
|
114
|
+
let taken = false;
|
|
115
|
+
try {
|
|
116
|
+
taken = this.deps.deliver(instance, wakeMessage(wakes, (uuid) => this.deps.card(uuid)), key);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
this.deps.log("warn", "Task board wake failed", { instance, codes, err: err.message });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (taken)
|
|
123
|
+
this.deps.log("info", "Task board wake handed to delivery", { instance, codes });
|
|
124
|
+
else
|
|
125
|
+
this.deps.log("warn", "Task board wake not taken; the cards keep the news", { instance, codes });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=task-board-waker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-board-waker.js","sourceRoot":"","sources":["../src/task-board-waker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
export interface HelperExecOptions {
|
|
3
|
+
timeout?: number;
|
|
4
|
+
maxBuffer?: number;
|
|
5
|
+
env?: NodeJS.ProcessEnv;
|
|
6
|
+
/** Written to the command's stdin, then closed (load-buffer). */
|
|
7
|
+
input?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface HelperExecResult {
|
|
10
|
+
stdout: string;
|
|
11
|
+
stderr: string;
|
|
12
|
+
}
|
|
13
|
+
/** The binaries the helper may start (by name; resolved to absolute paths on PATH when the helper starts). */
|
|
14
|
+
export declare const HELPER_BINARIES: readonly ["tmux", "stty"];
|
|
15
|
+
/** How long a request may wait for the helper's "started" before the helper is taken as wedged. */
|
|
16
|
+
export declare const HELPER_START_TIMEOUT_MS = 1500;
|
|
17
|
+
/** After "started": how long past the command's own timeout its answer may take (no timeout: this alone). */
|
|
18
|
+
export declare const HELPER_ANSWER_GRACE_MS = 5000;
|
|
19
|
+
export declare const HELPER_NO_TIMEOUT_DEADLINE_MS = 120000;
|
|
20
|
+
/**
|
|
21
|
+
* The helper's program (`node -e`): JSON lines in on stdin, JSON lines out on stdout. It exits when its stdin ends
|
|
22
|
+
* (the fleet went away) or its parent no longer exists (the fleet died while something else held the pipe).
|
|
23
|
+
*/
|
|
24
|
+
export declare const HELPER_SOURCE: string;
|
|
25
|
+
/** The absolute path `name` resolves to on this PATH (an executable file), or null. */
|
|
26
|
+
export declare function resolveOnPath(name: string, path: string | undefined): string | null;
|
|
27
|
+
export interface ExecHelperOptions {
|
|
28
|
+
/** The direct call, used when the helper isn't (or can no longer be) used for a call. */
|
|
29
|
+
direct(file: string, args: string[], opts: HelperExecOptions): Promise<HelperExecResult>;
|
|
30
|
+
/** Start the helper process (tests: another program). */
|
|
31
|
+
spawnHelper?(allow: string[]): ChildProcess;
|
|
32
|
+
/** The PATH binaries are resolved on (default: the fleet's, when the helper starts). */
|
|
33
|
+
path?(): string | undefined;
|
|
34
|
+
now?(): number;
|
|
35
|
+
startTimeoutMs?: number;
|
|
36
|
+
answerGraceMs?: number;
|
|
37
|
+
log?(event: string, detail?: Record<string, unknown>): void;
|
|
38
|
+
}
|
|
39
|
+
export declare class ExecHelper {
|
|
40
|
+
private readonly options;
|
|
41
|
+
private proc;
|
|
42
|
+
private allow;
|
|
43
|
+
private pending;
|
|
44
|
+
private nextId;
|
|
45
|
+
private trusted;
|
|
46
|
+
private backoffMs;
|
|
47
|
+
private restartAt;
|
|
48
|
+
private stopped;
|
|
49
|
+
private resolvedPath;
|
|
50
|
+
constructor(options: ExecHelperOptions);
|
|
51
|
+
private now;
|
|
52
|
+
/** Whether calls go to the helper now. */
|
|
53
|
+
usable(): boolean;
|
|
54
|
+
/** Start the helper (the fleet's own start and timer only). */
|
|
55
|
+
start(): void;
|
|
56
|
+
/** The fleet's timer: start a helper that is not running, after the backoff. */
|
|
57
|
+
maintain(): void;
|
|
58
|
+
/** A fleet started again after a stop may start the helper again. */
|
|
59
|
+
reopen(): void;
|
|
60
|
+
/** The fleet is stopping: no more calls go to the helper; its stdin ends, and it exits once its commands have answered. */
|
|
61
|
+
stop(): void;
|
|
62
|
+
/**
|
|
63
|
+
* A command, through the helper when it can be used, else directly — exactly once either way. `direct` is the
|
|
64
|
+
* caller's own call as it has always been made (so a direct call is byte-for-byte the old one); default: directExec.
|
|
65
|
+
*/
|
|
66
|
+
exec<R = HelperExecResult>(file: string, args: string[], opts?: HelperExecOptions, direct?: () => Promise<R>): Promise<R>;
|
|
67
|
+
/** The helper's absolute path for `file` when the call would start the same binary; else null (the call goes direct). */
|
|
68
|
+
private absoluteFor;
|
|
69
|
+
private receive;
|
|
70
|
+
/**
|
|
71
|
+
* While a call waits on it, the helper keeps the process alive, as a direct call's child would; with none waiting it
|
|
72
|
+
* never does (the fleet's exit is not held up by an idle helper).
|
|
73
|
+
*/
|
|
74
|
+
private holdOpen;
|
|
75
|
+
private settle;
|
|
76
|
+
/** What a direct call that timed out would have rejected with. */
|
|
77
|
+
private timeoutError;
|
|
78
|
+
/**
|
|
79
|
+
* Stop trusting this helper and end it; the calls it never started go direct once it is gone (gone()). Taken as
|
|
80
|
+
* wedged (no_start) while commands it started still run, it is not killed — killing it would not stop them, and their
|
|
81
|
+
* calls would fail though they ran: its stdin is ended, and it exits once they have answered (or their deadline kills it).
|
|
82
|
+
*/
|
|
83
|
+
private retire;
|
|
84
|
+
/** The helper is gone and its output has been read to the end. */
|
|
85
|
+
private gone;
|
|
86
|
+
private scheduleRestart;
|
|
87
|
+
}
|
|
88
|
+
/** execFile as a promise, the way the direct call has always run it (with its sync-work attribution done by callers). */
|
|
89
|
+
export declare function directExec(file: string, args: string[], opts: HelperExecOptions): Promise<HelperExecResult>;
|
|
90
|
+
/**
|
|
91
|
+
* The fleet's one helper. Until the fleet starts it (and whenever it can't be used) every call is the direct one, its
|
|
92
|
+
* synchronous fork attributed as before (#1235's "tmux.spawn").
|
|
93
|
+
*/
|
|
94
|
+
export declare const tmuxExecHelper: ExecHelper;
|