@songsid/agend 2.3.0-beta.8 → 2.3.0
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 +16 -8
- package/README.zh-TW.md +16 -8
- package/dist/adapter-world.js.map +1 -1
- package/dist/agend-home.d.ts +5 -0
- package/dist/agend-home.js +7 -0
- package/dist/agend-home.js.map +1 -0
- package/dist/agent-cli-instructions.md +9 -2
- package/dist/agent-cli.js +44 -0
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +9 -0
- package/dist/agent-endpoint.js +23 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.js +1 -1
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-whats-new.d.ts +16 -0
- package/dist/agent-whats-new.js +54 -11
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/apply-job.js.map +1 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +12 -0
- package/dist/auth-api.js +77 -22
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +4 -0
- package/dist/authority/authority-state.js +17 -8
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +16 -8
- package/dist/authority/web-authority.js +19 -5
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/antigravity.d.ts +2 -2
- package/dist/backend/antigravity.js +2 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.js +13 -4
- 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-package.d.ts +30 -0
- package/dist/backend/codex-package.js +133 -0
- package/dist/backend/codex-package.js.map +1 -0
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.d.ts +2 -0
- package/dist/backend/codex.js +25 -5
- 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/effort-metadata.js.map +1 -1
- package/dist/backend/grok.js +58 -3
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-engine-ledger.js.map +1 -1
- package/dist/backend/kiro-kas-store.js.map +1 -1
- package/dist/backend/kiro-v2-store.js.map +1 -1
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +9 -1
- package/dist/backend/kiro.js +102 -1
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/mock.js.map +1 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/opencode-permission.js +1 -1
- package/dist/backend/opencode-permission.js.map +1 -1
- package/dist/backend/opencode.js +2 -1
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/session-signals.js.map +1 -1
- package/dist/backend-availability.js.map +1 -1
- package/dist/backend-command.d.ts +2 -0
- package/dist/backend-command.js +3 -1
- package/dist/backend-command.js.map +1 -1
- package/dist/backend-outage.js.map +1 -1
- package/dist/binary-probe.js +1 -1
- package/dist/binary-probe.js.map +1 -1
- package/dist/bug-report-cli.d.ts +30 -0
- package/dist/bug-report-cli.js +139 -0
- package/dist/bug-report-cli.js.map +1 -0
- package/dist/bug-report.d.ts +47 -0
- package/dist/bug-report.js +137 -0
- package/dist/bug-report.js.map +1 -0
- package/dist/bundled-skills.d.ts +18 -0
- package/dist/bundled-skills.js +38 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-service.js +1 -1
- 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 +4 -0
- package/dist/channel/adapters/discord.js +57 -12
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +6 -0
- package/dist/channel/adapters/telegram.js +54 -14
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-server.js +21 -4
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +3 -1
- package/dist/channel/mcp-tools.js +43 -6
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-queue.js.map +1 -1
- package/dist/channel/sticker-download.js.map +1 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/child-process.d.ts +21 -0
- package/dist/child-process.js +54 -0
- package/dist/child-process.js.map +1 -0
- package/dist/classic-channel-manager.js +3 -2
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli-entry.js.map +1 -1
- package/dist/cli-flags.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +443 -311
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +1 -1
- package/dist/command-table.js +1 -1
- package/dist/command-table.js.map +1 -1
- package/dist/compact-watch.js.map +1 -1
- package/dist/completion-install.js.map +1 -1
- package/dist/completion.js.map +1 -1
- package/dist/config-validator.d.ts +6 -0
- package/dist/config-validator.js +81 -8
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +15 -3
- package/dist/config.js +41 -10
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.js.map +1 -1
- package/dist/context-guardian.js.map +1 -1
- package/dist/coredump-filter.js.map +1 -1
- package/dist/cpu-profile.js.map +1 -1
- package/dist/cross-instance-envelope.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 +39 -1
- package/dist/daemon.js +234 -15
- package/dist/daemon.js.map +1 -1
- package/dist/daily-summary.js.map +1 -1
- package/dist/darwin-memory.js +1 -1
- package/dist/darwin-memory.js.map +1 -1
- package/dist/dashboard-live.d.ts +8 -0
- package/dist/dashboard-live.js +35 -0
- package/dist/dashboard-live.js.map +1 -0
- package/dist/dashboard-permissions.d.ts +69 -0
- package/dist/dashboard-permissions.js +138 -0
- package/dist/dashboard-permissions.js.map +1 -0
- 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-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.js +5 -0
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-outbox.test.js.map +1 -1
- package/dist/delivery-reconciliation.test.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/doctor.d.ts +8 -0
- package/dist/doctor.js +52 -0
- package/dist/doctor.js.map +1 -1
- package/dist/e2e-isolation.js.map +1 -1
- package/dist/event-log.js.map +1 -1
- package/dist/export-import.js +7 -5
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-label.js.map +1 -1
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +2 -0
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-lock.js +3 -2
- package/dist/fleet-lock.js.map +1 -1
- package/dist/fleet-manager.d.ts +258 -15
- package/dist/fleet-manager.js +1605 -304
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +70 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-startup.d.ts +14 -0
- package/dist/fleet-startup.js +30 -0
- package/dist/fleet-startup.js.map +1 -0
- package/dist/fleet-traffic.d.ts +36 -0
- package/dist/fleet-traffic.js +100 -0
- package/dist/fleet-traffic.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +0 -20
- package/dist/forged-envelope-scan.js +3 -2
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/full-restart.d.ts +5 -5
- package/dist/full-restart.js +5 -5
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/bug-report/SKILL.md +31 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +52 -11
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +5 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +3 -1
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +8 -9
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +1 -1
- 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.canvas-worker-off.md +321 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +28 -4
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +553 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +170 -35
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/general-knowledge/steering/core-rules.md +1 -1
- package/dist/host-memory.js.map +1 -1
- package/dist/idle-gate-log.d.ts +19 -0
- package/dist/idle-gate-log.js +15 -0
- package/dist/idle-gate-log.js.map +1 -0
- package/dist/instance-config-impact.js +25 -4
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -1
- package/dist/instance-lifecycle.js +86 -25
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +12 -6
- package/dist/instructions.js +19 -10
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-compact-pane.js.map +1 -1
- package/dist/kiro-db-reader.js.map +1 -1
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-log-gate.js.map +1 -1
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/locale.js +428 -20
- package/dist/locale.js.map +1 -1
- package/dist/log-service.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/logger.js +3 -2
- package/dist/logger.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/login-flows.js +1 -1
- package/dist/login-manager.js.map +1 -1
- package/dist/login-shell.js +3 -1
- package/dist/login-shell.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 +83 -4
- package/dist/ls-rows.js.map +1 -1
- package/dist/memory-pressure.js.map +1 -1
- package/dist/muse-usage-relay.js.map +1 -1
- package/dist/needs-you-hub.d.ts +98 -1
- package/dist/needs-you-hub.js +313 -44
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +5 -2
- package/dist/needs-you-live.js +6 -3
- package/dist/needs-you-live.js.map +1 -1
- package/dist/needs-you.d.ts +68 -3
- package/dist/needs-you.js +38 -4
- package/dist/needs-you.js.map +1 -1
- package/dist/network-family.js.map +1 -1
- package/dist/operator-control-paths.js +3 -4
- package/dist/operator-control-paths.js.map +1 -1
- package/dist/outbound-handlers.d.ts +3 -0
- package/dist/outbound-handlers.js +76 -19
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +112 -64
- package/dist/outbound-schemas.js +39 -12
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/outbox-open-error.js.map +1 -1
- package/dist/pane-context-cache.js.map +1 -1
- package/dist/paths.js.map +1 -1
- package/dist/private-dir.js.map +1 -1
- package/dist/probe-worker-pool.js.map +1 -1
- package/dist/profile-control.js.map +1 -1
- package/dist/prompt-file-ref.js.map +1 -1
- package/dist/provider-probe.js.map +1 -1
- package/dist/provider-secret-registry.d.ts +5 -3
- package/dist/provider-secret-registry.js +8 -2
- package/dist/provider-secret-registry.js.map +1 -1
- package/dist/public-link-auto-open.d.ts +32 -0
- package/dist/public-link-auto-open.js +86 -0
- package/dist/public-link-auto-open.js.map +1 -0
- package/dist/public-link-owner.d.ts +10 -0
- package/dist/public-link-owner.js +36 -0
- package/dist/public-link-owner.js.map +1 -0
- package/dist/public-link-progress.d.ts +12 -1
- package/dist/public-link-progress.js +5 -10
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-preview.js.map +1 -1
- package/dist/public-tunnel-config.d.ts +11 -0
- package/dist/public-tunnel-config.js +68 -0
- package/dist/public-tunnel-config.js.map +1 -0
- package/dist/public-web-gateway.d.ts +2 -0
- package/dist/public-web-gateway.js +19 -6
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +48 -3
- package/dist/public-web-link.js +177 -51
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +9 -0
- package/dist/quickstart-api.js +82 -0
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +5 -0
- package/dist/quickstart.js +40 -25
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-dedup.js.map +1 -1
- package/dist/resource-report.js +1 -1
- package/dist/resource-report.js.map +1 -1
- package/dist/restart-guard.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.js.map +1 -1
- package/dist/runtime-cpu-profile.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/scheduler.js.map +1 -1
- package/dist/scheduler/task-board-text.d.ts +26 -0
- package/dist/scheduler/task-board-text.js +140 -0
- package/dist/scheduler/task-board-text.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +730 -0
- package/dist/scheduler/task-board.js +2179 -0
- package/dist/scheduler/task-board.js.map +1 -0
- package/dist/scheduler/types.d.ts +6 -1
- package/dist/sd-notify.js +2 -1
- package/dist/sd-notify.js.map +1 -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/secret-file.js.map +1 -1
- package/dist/secret-store.d.ts +2 -0
- package/dist/secret-store.js +21 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-installer.d.ts +75 -0
- package/dist/service-installer.js +206 -0
- package/dist/service-installer.js.map +1 -1
- package/dist/service-owner.d.ts +44 -0
- package/dist/service-owner.js +48 -0
- package/dist/service-owner.js.map +1 -0
- package/dist/service-plan.d.ts +39 -2
- package/dist/service-plan.js +188 -6
- package/dist/service-plan.js.map +1 -1
- package/dist/session-oom.d.ts +21 -0
- package/dist/session-oom.js +139 -0
- package/dist/session-oom.js.map +1 -0
- package/dist/settings-api.d.ts +13 -0
- package/dist/settings-api.js +73 -12
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.d.ts +5 -0
- package/dist/settings-change.js +167 -6
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +9 -1
- package/dist/settings-confirmation.js +18 -8
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-control.js +2 -1
- package/dist/settings-control.js.map +1 -1
- package/dist/settings-effect.js +29 -4
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +13 -0
- package/dist/settings-http-confirmation.js +15 -3
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +13 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/settings-request-capability.d.ts +4 -1
- package/dist/settings-request-capability.js +11 -3
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-auth.d.ts +1 -0
- package/dist/setup-auth.js +2 -1
- package/dist/setup-auth.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/setup-host.d.ts +6 -1
- package/dist/setup-host.js +15 -4
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +6 -3
- package/dist/setup-wizard.js.map +1 -1
- package/dist/spawn-gate.d.ts +5 -0
- package/dist/spawn-gate.js +28 -8
- package/dist/spawn-gate.js.map +1 -1
- package/dist/start-attempt.d.ts +1 -0
- package/dist/start-attempt.js +18 -0
- package/dist/start-attempt.js.map +1 -0
- package/dist/start-failure-notice.d.ts +4 -0
- package/dist/start-failure-notice.js +20 -0
- package/dist/start-failure-notice.js.map +1 -0
- package/dist/start-failure.d.ts +147 -0
- package/dist/start-failure.js +281 -0
- package/dist/start-failure.js.map +1 -0
- package/dist/startup-memory-deadline.d.ts +23 -0
- package/dist/startup-memory-deadline.js +55 -0
- package/dist/startup-memory-deadline.js.map +1 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/storm-window.js.map +1 -1
- package/dist/systemd-peer-bus.js.map +1 -1
- package/dist/target-queue-worker.js.map +1 -1
- package/dist/task-board-summary.d.ts +101 -0
- package/dist/task-board-summary.js +177 -0
- package/dist/task-board-summary.js.map +1 -0
- package/dist/task-board-tool.d.ts +25 -0
- package/dist/task-board-tool.js +155 -0
- package/dist/task-board-tool.js.map +1 -0
- package/dist/task-board-waker.d.ts +51 -0
- package/dist/task-board-waker.js +141 -0
- package/dist/task-board-waker.js.map +1 -0
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.js +1 -1
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.d.ts +104 -0
- package/dist/tmux-exec-helper.js +412 -0
- package/dist/tmux-exec-helper.js.map +1 -0
- package/dist/tmux-manager.d.ts +1 -0
- package/dist/tmux-manager.js +29 -13
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +2 -2
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.js +9 -42
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-archiver.js.map +1 -1
- package/dist/topic-commands.d.ts +13 -0
- package/dist/topic-commands.js +56 -33
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.js.map +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-monitor.js +5 -0
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +2 -0
- package/dist/transcript-sources.js +4 -0
- package/dist/transcript-sources.js.map +1 -1
- package/dist/tunnel/cloudflared-install.js +3 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +7 -16
- package/dist/tunnel/cloudflared.js +100 -13
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/lease.js +3 -2
- package/dist/tunnel/lease.js.map +1 -1
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/tunnel/named-diagnostics.d.ts +13 -0
- package/dist/tunnel/named-diagnostics.js +52 -0
- package/dist/tunnel/named-diagnostics.js.map +1 -0
- package/dist/tunnel/public-fetch.js.map +1 -1
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/tunnel/types.d.ts +4 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/types.d.ts +55 -2
- package/dist/ui/app-effects.js +27 -5
- package/dist/ui/app.html +2 -0
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-effects.js +15 -7
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +67 -20
- package/dist/ui/chat-store.js +218 -48
- package/dist/ui/chat-strings.js +42 -10
- package/dist/ui/chat-thread.js +249 -23
- package/dist/ui/effect-trial-controller.js +13 -8
- package/dist/ui/effect-trial-offer.js +2 -31
- package/dist/ui/effects-waker.js +2 -0
- package/dist/ui/fleet-canvas-layout.js +13 -4
- package/dist/ui/fleet-canvas.js +120 -43
- package/dist/ui/fleet-office-editor.js +149 -0
- package/dist/ui/fleet-office-model.js +358 -0
- package/dist/ui/fleet-office-pack.js +199 -0
- package/dist/ui/fleet-office-skin.js +474 -0
- package/dist/ui/fleet-office-store.js +49 -0
- package/dist/ui/fleet-office-zones.js +177 -0
- package/dist/ui/fleet-office.js +434 -0
- package/dist/ui/fleet-org.js +21 -8
- package/dist/ui/fleet-route-scene.js +272 -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 +482 -0
- package/dist/ui/fleet-task-work.js +107 -0
- package/dist/ui/fleet-tasks.js +569 -0
- package/dist/ui/fleet-traffic.js +227 -45
- package/dist/ui/fleet-usage.js +36 -2
- package/dist/ui/guest-refused.html +41 -0
- package/dist/ui/icons/icon-192.png +0 -0
- package/dist/ui/icons/icon-512.png +0 -0
- package/dist/ui/image-lightbox.js +45 -1
- package/dist/ui/image-zoom.js +242 -0
- package/dist/ui/panel-chat.js +282 -89
- package/dist/ui/panel-details.js +2 -0
- package/dist/ui/panel-fleet.js +32 -71
- package/dist/ui/panel-needs.js +23 -6
- package/dist/ui/panel-settings.js +158 -32
- package/dist/ui/preview-panel.js +2 -1
- package/dist/ui/search-dialog.js +350 -0
- package/dist/ui/settings-appearance.js +170 -10
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-dialogs.js +46 -21
- package/dist/ui/settings-discord.js +6 -2
- package/dist/ui/settings-guests.js +2 -1
- package/dist/ui/settings-learn.js +1 -0
- package/dist/ui/settings-model.js +51 -18
- package/dist/ui/settings-mods.js +8 -3
- package/dist/ui/settings-owner-effects.js +6 -4
- package/dist/ui/settings-strings.js +180 -6
- package/dist/ui/settings-token.js +3 -1
- package/dist/ui/settings-web-authority.js +13 -5
- package/dist/ui/settings-wizard.js +13 -7
- package/dist/ui/shared/agend-auth.js +3 -1
- package/dist/ui/shared/app-i18n.js +12 -5
- package/dist/ui/shared/app-needs.js +2 -2
- package/dist/ui/shared/app-prefs.js +15 -0
- package/dist/ui/shared/app-route.js +18 -0
- package/dist/ui/shared/app-shell.js +172 -28
- package/dist/ui/shared/app-store.js +3 -2
- package/dist/ui/shared/app-stream.js +7 -2
- package/dist/ui/shared/app-themes.js +116 -1
- package/dist/ui/shared/app.css +681 -54
- package/dist/ui/shared/app.js +9 -1
- package/dist/ui/shared/card-strings.js +4 -0
- package/dist/ui/shared/effect-app-runtime.js +7 -5
- package/dist/ui/shared/effect-chat-runtime.js +2 -7
- package/dist/ui/shared/effect-cursor.js +3 -2
- package/dist/ui/shared/effect-display-metadata.js +39 -0
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-policy.js +2 -2
- package/dist/ui/shared/effect-registry.js +30 -11
- package/dist/ui/shared/effect-runtime-loader.js +3 -1
- package/dist/ui/shared/effect-stock-snapshot.js +9 -0
- package/dist/ui/shared/effect-stock-trust.js +40 -9
- package/dist/ui/shared/effect-trial-source.js +1 -1
- package/dist/ui/shared/effect-trial-stage.js +27 -21
- package/dist/ui/shared/effect-trial.css +1 -1
- package/dist/ui/shared/feature-flags.js +127 -0
- package/dist/ui/shared/guest-refused.js +35 -0
- package/dist/ui/shared/header-tools.js +2 -2
- package/dist/ui/shared/identity-card.js +26 -8
- package/dist/ui/shared/identity-color.js +17 -10
- package/dist/ui/shared/instance-nav.js +183 -28
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/panel-view.js +14 -29
- package/dist/ui/shared/text-undo.js +210 -0
- package/dist/ui/shared/tokens.css +13 -3
- package/dist/ui/shared/ui-dialog.js +5 -4
- package/dist/ui/shared/ui-icons.js +4 -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 +206 -16
- package/dist/ui/shared/view-strings.js +68 -4
- package/dist/ui/shared/web-authorize.js +50 -1
- package/dist/ui/signin.html +2 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/ui/web-terminal/terminal.html +10 -10
- package/dist/ui/web-terminal/terminal.js +58 -12
- package/dist/update-check.js.map +1 -1
- package/dist/update-dispatch.js +1 -1
- package/dist/update-dispatch.js.map +1 -1
- package/dist/update-install.js.map +1 -1
- package/dist/update-launch.d.ts +10 -1
- package/dist/update-launch.js +39 -14
- package/dist/update-launch.js.map +1 -1
- package/dist/update-marker.js.map +1 -1
- package/dist/update-preflight.js +1 -1
- package/dist/update-preflight.js.map +1 -1
- package/dist/update-progress.d.ts +3 -1
- package/dist/update-progress.js +3 -1
- package/dist/update-progress.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 +89 -2
- package/dist/usage/providers.js +247 -41
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/usage/usage-api.d.ts +5 -1
- package/dist/usage/usage-api.js +185 -58
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.js +1 -1
- package/dist/usage-rollup.js.map +1 -1
- 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 +7 -0
- package/dist/view-api.js +16 -4
- package/dist/view-api.js.map +1 -1
- package/dist/wake-coordinator.js.map +1 -1
- package/dist/web-ambient.js +9 -2
- package/dist/web-ambient.js.map +1 -1
- package/dist/web-api.d.ts +58 -10
- package/dist/web-api.js +1104 -71
- package/dist/web-api.js.map +1 -1
- package/dist/web-app-icon-worker.d.ts +1 -0
- package/dist/web-app-icon-worker.js +16 -0
- package/dist/web-app-icon-worker.js.map +1 -0
- package/dist/web-app-icon.d.ts +109 -0
- package/dist/web-app-icon.js +257 -0
- package/dist/web-app-icon.js.map +1 -0
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +1 -0
- package/dist/web-appearance-tools.js +7 -3
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +4 -10
- package/dist/web-appearance.js +7 -4
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-auth.d.ts +8 -4
- package/dist/web-auth.js +33 -21
- 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.js.map +1 -1
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +118 -8
- package/dist/web-chat-history.js +220 -25
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +5 -1
- package/dist/web-commands.js +1 -1
- package/dist/web-commands.js.map +1 -1
- package/dist/web-cookie-names.d.ts +5 -0
- package/dist/web-cookie-names.js +12 -0
- package/dist/web-cookie-names.js.map +1 -0
- package/dist/web-effect-bundle.d.ts +2 -2
- package/dist/web-effect-library.js.map +1 -1
- package/dist/web-effect-playback.js.map +1 -1
- package/dist/web-effect-profiles.d.ts +16 -16
- package/dist/web-effect-profiles.js +3 -2
- package/dist/web-effect-profiles.js.map +1 -1
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.js.map +1 -1
- package/dist/web-effect.d.ts +6 -6
- package/dist/web-effect.js.map +1 -1
- package/dist/web-experimental-http.d.ts +2 -0
- package/dist/web-experimental-http.js +12 -0
- package/dist/web-experimental-http.js.map +1 -0
- package/dist/web-experimental.d.ts +11 -0
- package/dist/web-experimental.js +49 -0
- package/dist/web-experimental.js.map +1 -0
- package/dist/web-guest-access.d.ts +4 -2
- package/dist/web-guest-access.js +22 -10
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-guest-rooms.js.map +1 -1
- 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-icons.d.ts +33 -1
- package/dist/web-icons.js +83 -11
- package/dist/web-icons.js.map +1 -1
- package/dist/web-identity-color.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-images.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.js.map +1 -1
- package/dist/web-mentions.js.map +1 -1
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-store.d.ts +2 -0
- package/dist/web-mod-store.js +10 -0
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-office-store.d.ts +104 -0
- package/dist/web-office-store.js +236 -0
- package/dist/web-office-store.js.map +1 -0
- 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-owner-css.js.map +1 -1
- package/dist/web-png.d.ts +33 -0
- package/dist/web-png.js +329 -0
- package/dist/web-png.js.map +1 -0
- package/dist/web-prefs.d.ts +6 -0
- package/dist/web-prefs.js +29 -3
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +2 -0
- package/dist/web-preview.js +2 -0
- package/dist/web-preview.js.map +1 -1
- package/dist/web-profile.js.map +1 -1
- package/dist/web-reactions.d.ts +35 -0
- package/dist/web-reactions.js +47 -0
- package/dist/web-reactions.js.map +1 -0
- package/dist/web-request-context.d.ts +5 -0
- package/dist/web-request-context.js.map +1 -1
- package/dist/web-returning-device.d.ts +4 -2
- package/dist/web-returning-device.js +13 -6
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-schedules.js.map +1 -1
- package/dist/web-send-dedupe.d.ts +36 -0
- package/dist/web-send-dedupe.js +69 -0
- package/dist/web-send-dedupe.js.map +1 -0
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.js +1 -1
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +11 -5
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +6 -0
- package/dist/web-settings-tools.js +52 -17
- package/dist/web-settings-tools.js.map +1 -1
- package/dist/web-terminal-http.js +15 -2
- package/dist/web-terminal-http.js.map +1 -1
- package/dist/web-terminal.js +1 -1
- package/dist/web-terminal.js.map +1 -1
- package/dist/web-theme-store.d.ts +2 -2
- package/dist/web-theme-store.js +6 -3
- package/dist/web-theme-store.js.map +1 -1
- package/dist/web-theme.d.ts +29 -0
- package/dist/web-theme.js +89 -1
- package/dist/web-theme.js.map +1 -1
- package/dist/web-upload.d.ts +18 -1
- package/dist/web-upload.js +45 -7
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.js.map +1 -1
- package/dist/webhook-emitter.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/ws-server.js.map +1 -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 +828 -0
- package/launcher/install-admission.cjs +4 -39
- package/launcher/postinstall.cjs +14 -12
- package/launcher/private-home.cjs +43 -0
- package/package.json +16 -13
- 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,101 @@
|
|
|
1
|
+
import type { Card, Project, ProjectStats } from "./scheduler/task-board.js";
|
|
2
|
+
/** Cards listed per section; the rest are counted. */
|
|
3
|
+
export declare const SUMMARY_LISTED = 10;
|
|
4
|
+
/**
|
|
5
|
+
* `defaults.task_board.summary_at`: `"HH:MM"` (24 h) → itself, `"off"` (any case) or not set → null (off); anything
|
|
6
|
+
* else → undefined (the validator refuses it; the clock then sends nothing). Off unless set (2.3.0-beta.25, the
|
|
7
|
+
* user's call after beta.24's task-board flood, #2425): a fleet that wants the summary names its time.
|
|
8
|
+
*/
|
|
9
|
+
export declare function summaryTime(value: unknown): string | null | undefined;
|
|
10
|
+
/** The wall clock at `now` in `zone` ("YYYY-MM-DD", "HH:MM"); a zone the runtime does not know reads as UTC. */
|
|
11
|
+
export declare function wallClock(now: Date, zone: string): {
|
|
12
|
+
date: string;
|
|
13
|
+
time: string;
|
|
14
|
+
};
|
|
15
|
+
/** When the last summary went out: its local date and the end of the time it covered. */
|
|
16
|
+
export interface SummaryMark {
|
|
17
|
+
date: string;
|
|
18
|
+
until: string;
|
|
19
|
+
}
|
|
20
|
+
/** The mark on disk (`<dataDir>/task-board-summary.json`); a missing or unreadable file is no mark. */
|
|
21
|
+
export declare function summaryMarkFile(path: string): {
|
|
22
|
+
read(): SummaryMark | null;
|
|
23
|
+
write(mark: SummaryMark): void;
|
|
24
|
+
};
|
|
25
|
+
export interface SummaryClockDeps {
|
|
26
|
+
/** `defaults.task_board.summary_at` as it is now ("HH:MM"), or null when off. Read at every look. */
|
|
27
|
+
at(): string | null;
|
|
28
|
+
zone(): string;
|
|
29
|
+
now(): Date;
|
|
30
|
+
mark: {
|
|
31
|
+
read(): SummaryMark | null;
|
|
32
|
+
write(mark: SummaryMark): void;
|
|
33
|
+
};
|
|
34
|
+
/** Gather and post the summary of [since, until). */
|
|
35
|
+
send(since: Date, until: Date): void;
|
|
36
|
+
/** A look that threw (the data directory gone, a board that cannot be read): logged, and the next look tries again. */
|
|
37
|
+
failed?(err: unknown): void;
|
|
38
|
+
setInterval?(fn: () => void, ms: number): unknown;
|
|
39
|
+
clearInterval?(handle: unknown): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class TaskBoardSummaryClock {
|
|
42
|
+
private readonly deps;
|
|
43
|
+
private timer;
|
|
44
|
+
private first;
|
|
45
|
+
constructor(deps: SummaryClockDeps);
|
|
46
|
+
/** A look 5 s after start (a summary missed while the fleet was down), then every minute. */
|
|
47
|
+
start(): void;
|
|
48
|
+
stop(): void;
|
|
49
|
+
/** One look: true when a summary was due today and is now handled (sent, or quiet). */
|
|
50
|
+
tick(): boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface ProjectLine {
|
|
53
|
+
name: string;
|
|
54
|
+
percent: number;
|
|
55
|
+
done: number;
|
|
56
|
+
total: number;
|
|
57
|
+
waiting: number;
|
|
58
|
+
blocked: number;
|
|
59
|
+
}
|
|
60
|
+
export interface BoardSummary {
|
|
61
|
+
since: Date;
|
|
62
|
+
until: Date;
|
|
63
|
+
review: Card[];
|
|
64
|
+
blocked: Card[];
|
|
65
|
+
done: Card[];
|
|
66
|
+
created: Card[];
|
|
67
|
+
projects: ProjectLine[];
|
|
68
|
+
}
|
|
69
|
+
export interface SummaryRead {
|
|
70
|
+
/** What waits for the person now (TaskBoard.waitingForPerson): review cards that need them, blocked cards they handed out. */
|
|
71
|
+
waiting: Card[];
|
|
72
|
+
done: Card[];
|
|
73
|
+
created: Card[];
|
|
74
|
+
/** Every live main task's project and assignee: a project's line goes to the chats whose instances hold one. */
|
|
75
|
+
mains: Array<{
|
|
76
|
+
projectId: number | null;
|
|
77
|
+
assignee: string | null;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* One chat's summary: the cards `inChat` keeps (by assignee), and the active projects one of its cards' main tasks is
|
|
82
|
+
* in, with the project's numbers over all its cards (projectStats).
|
|
83
|
+
*/
|
|
84
|
+
export declare function buildSummary(read: SummaryRead, since: Date, until: Date, opts: {
|
|
85
|
+
inChat(assignee: string | null): boolean;
|
|
86
|
+
projects: Project[];
|
|
87
|
+
stats: Record<string, ProjectStats>;
|
|
88
|
+
}): BoardSummary;
|
|
89
|
+
/** Nothing waits and nothing moved: no summary that day. */
|
|
90
|
+
export declare function isQuiet(s: BoardSummary): boolean;
|
|
91
|
+
type T = (key: string, ...args: (string | number)[]) => string;
|
|
92
|
+
/**
|
|
93
|
+
* The summary as plain text in the fleet's language (no markup: Telegram, Discord and the web chat read it the same).
|
|
94
|
+
* `projectOf`: a main task's project name.
|
|
95
|
+
*/
|
|
96
|
+
export declare function renderSummary(s: BoardSummary, opts: {
|
|
97
|
+
zone: string;
|
|
98
|
+
t: T;
|
|
99
|
+
projectOf(card: Card): string | null;
|
|
100
|
+
}): string;
|
|
101
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2246 step 3: the task board's daily summary for the person, as taskhall sends it. Once a day at
|
|
3
|
+
* `defaults.task_board.summary_at` (the fleet's zone): what waits for their confirmation and what is blocked now, what
|
|
4
|
+
* got done and what was opened since the last summary, and each project's progress. Each chat world's General gets the
|
|
5
|
+
* cards of its own instances (a card nobody in a world holds goes to the primary one); the web chat's Generals too.
|
|
6
|
+
*
|
|
7
|
+
* The clock is taskhall's: it looks every minute, sends at most once a calendar day, and a summary missed while the
|
|
8
|
+
* fleet was down goes out when it is back that day, covering the time since the last one (at most a week). A quiet day
|
|
9
|
+
* (nothing waits, nothing moved) sends nothing. The first summary after this ships waits for the next morning.
|
|
10
|
+
*/
|
|
11
|
+
import { atomicWriteFileSync } from "./atomic-write.js";
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
/** Cards listed per section; the rest are counted. */
|
|
14
|
+
export const SUMMARY_LISTED = 10;
|
|
15
|
+
const WEEK_MS = 7 * 86_400_000;
|
|
16
|
+
/**
|
|
17
|
+
* `defaults.task_board.summary_at`: `"HH:MM"` (24 h) → itself, `"off"` (any case) or not set → null (off); anything
|
|
18
|
+
* else → undefined (the validator refuses it; the clock then sends nothing). Off unless set (2.3.0-beta.25, the
|
|
19
|
+
* user's call after beta.24's task-board flood, #2425): a fleet that wants the summary names its time.
|
|
20
|
+
*/
|
|
21
|
+
export function summaryTime(value) {
|
|
22
|
+
if (value === undefined || value === null)
|
|
23
|
+
return null;
|
|
24
|
+
if (typeof value !== "string")
|
|
25
|
+
return undefined;
|
|
26
|
+
const v = value.trim().toLowerCase();
|
|
27
|
+
if (v === "off")
|
|
28
|
+
return null;
|
|
29
|
+
return /^([01]\d|2[0-3]):[0-5]\d$/.test(v) ? v : undefined;
|
|
30
|
+
}
|
|
31
|
+
/** The wall clock at `now` in `zone` ("YYYY-MM-DD", "HH:MM"); a zone the runtime does not know reads as UTC. */
|
|
32
|
+
export function wallClock(now, zone) {
|
|
33
|
+
let wall;
|
|
34
|
+
try {
|
|
35
|
+
wall = now.toLocaleString("sv-SE", { timeZone: zone, hour12: false });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
wall = now.toLocaleString("sv-SE", { timeZone: "UTC", hour12: false });
|
|
39
|
+
}
|
|
40
|
+
return { date: wall.slice(0, 10), time: wall.slice(11, 16) };
|
|
41
|
+
}
|
|
42
|
+
/** The mark on disk (`<dataDir>/task-board-summary.json`); a missing or unreadable file is no mark. */
|
|
43
|
+
export function summaryMarkFile(path) {
|
|
44
|
+
return {
|
|
45
|
+
read() {
|
|
46
|
+
try {
|
|
47
|
+
const m = JSON.parse(readFileSync(path, "utf8"));
|
|
48
|
+
return typeof m.date === "string" && typeof m.until === "string" ? { date: m.date, until: m.until } : null;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
write(mark) { atomicWriteFileSync(path, JSON.stringify(mark) + "\n"); },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export class TaskBoardSummaryClock {
|
|
58
|
+
deps;
|
|
59
|
+
timer = null;
|
|
60
|
+
first = null;
|
|
61
|
+
constructor(deps) {
|
|
62
|
+
this.deps = deps;
|
|
63
|
+
}
|
|
64
|
+
/** A look 5 s after start (a summary missed while the fleet was down), then every minute. */
|
|
65
|
+
start() {
|
|
66
|
+
if (this.timer)
|
|
67
|
+
return;
|
|
68
|
+
const every = this.deps.setInterval ?? ((fn, ms) => { const h = setInterval(fn, ms); h.unref?.(); return h; });
|
|
69
|
+
const look = () => { try {
|
|
70
|
+
this.tick();
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
this.deps.failed?.(err);
|
|
74
|
+
} };
|
|
75
|
+
this.timer = every(look, 60_000);
|
|
76
|
+
this.first = setTimeout(look, 5_000);
|
|
77
|
+
this.first.unref?.();
|
|
78
|
+
}
|
|
79
|
+
stop() {
|
|
80
|
+
if (this.timer)
|
|
81
|
+
(this.deps.clearInterval ?? ((h) => clearInterval(h)))(this.timer);
|
|
82
|
+
if (this.first)
|
|
83
|
+
clearTimeout(this.first);
|
|
84
|
+
this.timer = null;
|
|
85
|
+
this.first = null;
|
|
86
|
+
}
|
|
87
|
+
/** One look: true when a summary was due today and is now handled (sent, or quiet). */
|
|
88
|
+
tick() {
|
|
89
|
+
const at = this.deps.at();
|
|
90
|
+
if (!at)
|
|
91
|
+
return false;
|
|
92
|
+
const now = this.deps.now();
|
|
93
|
+
const wall = wallClock(now, this.deps.zone());
|
|
94
|
+
if (wall.time < at)
|
|
95
|
+
return false;
|
|
96
|
+
const last = this.deps.mark.read();
|
|
97
|
+
if (last?.date === wall.date)
|
|
98
|
+
return false;
|
|
99
|
+
// Marked before it is sent: a send that throws does not repeat every minute.
|
|
100
|
+
this.deps.mark.write({ date: wall.date, until: now.toISOString() });
|
|
101
|
+
if (!last)
|
|
102
|
+
return false; // the first day: nothing to look back on yet; the next one covers from now
|
|
103
|
+
const since = Math.min(Math.max(Date.parse(last.until) || 0, now.getTime() - WEEK_MS), now.getTime());
|
|
104
|
+
this.deps.send(new Date(since), now);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Main tasks first, then by number. */
|
|
109
|
+
const byNumber = (a, b) => (a.kind === b.kind ? 0 : a.kind === "main" ? -1 : 1) || Number(a.code.slice(2)) - Number(b.code.slice(2));
|
|
110
|
+
/**
|
|
111
|
+
* One chat's summary: the cards `inChat` keeps (by assignee), and the active projects one of its cards' main tasks is
|
|
112
|
+
* in, with the project's numbers over all its cards (projectStats).
|
|
113
|
+
*/
|
|
114
|
+
export function buildSummary(read, since, until, opts) {
|
|
115
|
+
const mine = (cards) => cards.filter((c) => opts.inChat(c.assignee)).sort(byNumber);
|
|
116
|
+
const here = new Set(read.mains.filter((m) => m.projectId !== null && opts.inChat(m.assignee)).map((m) => m.projectId));
|
|
117
|
+
return {
|
|
118
|
+
since, until,
|
|
119
|
+
review: mine(read.waiting.filter((c) => c.status === "review")),
|
|
120
|
+
blocked: mine(read.waiting.filter((c) => c.status === "blocked")),
|
|
121
|
+
done: mine(read.done),
|
|
122
|
+
created: mine(read.created),
|
|
123
|
+
projects: opts.projects.filter((p) => !p.archived && here.has(p.id)).flatMap((p) => {
|
|
124
|
+
const st = opts.stats[String(p.id)];
|
|
125
|
+
return st && st.mains ? [{ name: p.name, percent: st.percent, done: st.units.done, total: st.units.total, waiting: st.waiting, blocked: st.blocked }] : [];
|
|
126
|
+
}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** Nothing waits and nothing moved: no summary that day. */
|
|
130
|
+
export function isQuiet(s) {
|
|
131
|
+
return !s.review.length && !s.blocked.length && !s.done.length && !s.created.length;
|
|
132
|
+
}
|
|
133
|
+
const short = (s, n) => (Array.from(s).length > n ? Array.from(s).slice(0, n - 1).join("") + "…" : s);
|
|
134
|
+
/** `M/D HH:MM` in the fleet's zone. */
|
|
135
|
+
function shortTime(d, zone) {
|
|
136
|
+
const { date, time } = wallClock(d, zone);
|
|
137
|
+
return `${Number(date.slice(5, 7))}/${Number(date.slice(8, 10))} ${time}`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The summary as plain text in the fleet's language (no markup: Telegram, Discord and the web chat read it the same).
|
|
141
|
+
* `projectOf`: a main task's project name.
|
|
142
|
+
*/
|
|
143
|
+
export function renderSummary(s, opts) {
|
|
144
|
+
const { t } = opts;
|
|
145
|
+
const ref = (c) => t("board_summary.card", c.code, short(c.title, 30))
|
|
146
|
+
+ (c.kind === "main" ? (opts.projectOf(c) ? ` · ${opts.projectOf(c)}` : "") : c.assignee ? ` @${c.assignee}` : "");
|
|
147
|
+
const list = (cards, line) => {
|
|
148
|
+
const out = cards.slice(0, SUMMARY_LISTED).map((c) => `• ${line(c)}`);
|
|
149
|
+
if (cards.length > SUMMARY_LISTED)
|
|
150
|
+
out.push(`• ${t("board_summary.more", cards.length - SUMMARY_LISTED)}`);
|
|
151
|
+
return out;
|
|
152
|
+
};
|
|
153
|
+
// Finished and new: a main task a line each, sub tasks folded into one line of numbers.
|
|
154
|
+
const folded = (cards) => {
|
|
155
|
+
const mains = cards.filter((c) => c.kind === "main"), subs = cards.filter((c) => c.kind === "sub");
|
|
156
|
+
const out = list(mains, ref);
|
|
157
|
+
if (subs.length) {
|
|
158
|
+
const codes = subs.slice(0, SUMMARY_LISTED).map((c) => c.code).join(t("board_summary.join"));
|
|
159
|
+
out.push(`• ${t(subs.length > SUMMARY_LISTED ? "board_summary.subs_more" : "board_summary.subs", subs.length, codes)}`);
|
|
160
|
+
}
|
|
161
|
+
return out;
|
|
162
|
+
};
|
|
163
|
+
const blocks = [t("board_summary.title", shortTime(s.since, opts.zone), shortTime(s.until, opts.zone))];
|
|
164
|
+
const section = (title, lines) => { if (lines.length)
|
|
165
|
+
blocks.push([title, ...lines].join("\n")); };
|
|
166
|
+
section(t("board_summary.review", s.review.length), list(s.review, ref));
|
|
167
|
+
section(t("board_summary.blocked", s.blocked.length), list(s.blocked, (c) => ref(c) + (c.kind === "main" && c.assignee ? ` @${c.assignee}` : "") + (c.blockedReason ? t("board_summary.reason", short(c.blockedReason, 60)) : "")));
|
|
168
|
+
section(t("board_summary.done", s.done.length), folded(s.done));
|
|
169
|
+
section(t("board_summary.created", s.created.length), folded(s.created));
|
|
170
|
+
section(t("board_summary.projects"), s.projects.map((p) => {
|
|
171
|
+
const extra = [p.waiting ? t("board_summary.project_waiting", p.waiting) : "", p.blocked ? t("board_summary.project_blocked", p.blocked) : ""].filter(Boolean);
|
|
172
|
+
return `• ${t("board_summary.project", p.name, p.percent, p.done, p.total)}${extra.length ? t("board_summary.project_extra", extra.join(t("board_summary.join"))) : ""}`;
|
|
173
|
+
}));
|
|
174
|
+
blocks.push(t("board_summary.footer"));
|
|
175
|
+
return blocks.join("\n\n");
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=task-board-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-board-summary.js","sourceRoot":"","sources":["../src/task-board-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,155 @@
|
|
|
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 someone's confirmation hands it to them (review) — unless
|
|
50
|
+
// the caller is the one who confirms it (#2434: an agent's card, by its dispatcher; nobody's, by its assignee).
|
|
51
|
+
if (to === "done") {
|
|
52
|
+
const held = board.findCard(id);
|
|
53
|
+
if (held?.needsReview && held.status !== "review" && !board.confirms(held, actor))
|
|
54
|
+
to = "review";
|
|
55
|
+
}
|
|
56
|
+
const { card, from, notes } = board.moveCard(actor, id, to, {
|
|
57
|
+
reason: str(args.reason), result: str(args.result), comment: str(args.comment), version: int(args.version),
|
|
58
|
+
});
|
|
59
|
+
return writeText(card, notes, from);
|
|
60
|
+
}
|
|
61
|
+
case "create": {
|
|
62
|
+
if (!has(args, BOARD_CREATE))
|
|
63
|
+
return undefined;
|
|
64
|
+
const spec = {
|
|
65
|
+
title: need(args.title, "title"),
|
|
66
|
+
goal: str(args.description),
|
|
67
|
+
scope: str(args.scope),
|
|
68
|
+
context: str(args.context),
|
|
69
|
+
acceptance: strs(args.acceptance),
|
|
70
|
+
priority: priority(args.priority),
|
|
71
|
+
size: size(args.size) ?? undefined,
|
|
72
|
+
dependsOn: strs(args.depends_on),
|
|
73
|
+
needsReview: bool(args.needs_review),
|
|
74
|
+
dispatcher: dispatcher(args.dispatcher),
|
|
75
|
+
...(str(args.parent) ? { parent: str(args.parent) } : { project: str(args.project) ?? (typeof args.project === "number" ? args.project : undefined) }),
|
|
76
|
+
...(args.assignee !== undefined ? { assignee: str(args.assignee) ?? null } : {}),
|
|
77
|
+
};
|
|
78
|
+
const { cards, notes } = board.createCards(actor, { cards: [spec] });
|
|
79
|
+
return writeText(cards[0], notes);
|
|
80
|
+
}
|
|
81
|
+
case "update": {
|
|
82
|
+
if (!has(args, BOARD_UPDATE))
|
|
83
|
+
return undefined;
|
|
84
|
+
const patch = {
|
|
85
|
+
version: int(args.version),
|
|
86
|
+
title: str(args.title),
|
|
87
|
+
goal: str(args.description),
|
|
88
|
+
scope: str(args.scope),
|
|
89
|
+
context: str(args.context),
|
|
90
|
+
state: str(args.state),
|
|
91
|
+
result: str(args.result),
|
|
92
|
+
acceptance: strs(args.acceptance),
|
|
93
|
+
check: nums(args.check),
|
|
94
|
+
uncheck: nums(args.uncheck),
|
|
95
|
+
log: str(args.log),
|
|
96
|
+
comment: str(args.comment),
|
|
97
|
+
needsReview: bool(args.needs_review),
|
|
98
|
+
dispatcher: dispatcher(args.dispatcher),
|
|
99
|
+
size: size(args.size),
|
|
100
|
+
priority: priority(args.priority),
|
|
101
|
+
dependsOn: strs(args.depends_on),
|
|
102
|
+
...(args.assignee !== undefined ? { assignee: str(args.assignee) ?? null } : {}),
|
|
103
|
+
};
|
|
104
|
+
if (args.status === undefined) {
|
|
105
|
+
const { card, notes } = board.updateCard(actor, need(args.id, "id"), patch);
|
|
106
|
+
return writeText(card, notes);
|
|
107
|
+
}
|
|
108
|
+
// A status given with the fields: the fields, then the move as the tool's plain update makes it (the board's
|
|
109
|
+
// rules, the gate) — one write, so a refused move keeps the fields unchanged too.
|
|
110
|
+
const to = status(args.status, "status");
|
|
111
|
+
const { card, from } = board.atomically(() => {
|
|
112
|
+
const { card: edited } = board.updateCard(actor, need(args.id, "id"), patch);
|
|
113
|
+
if (to !== edited.status)
|
|
114
|
+
db.updateTask(edited.uuid, { status: to }, actor);
|
|
115
|
+
return { card: board.getCard(edited.uuid), from: edited.status };
|
|
116
|
+
});
|
|
117
|
+
return writeText(card, board.takeNotes(), from);
|
|
118
|
+
}
|
|
119
|
+
case "list": {
|
|
120
|
+
if (!has(args, ["project", "parent"]))
|
|
121
|
+
return undefined;
|
|
122
|
+
const filterStatus = args.filter_status === undefined ? undefined : (Array.isArray(args.filter_status) ? args.filter_status : [args.filter_status]).map((v) => status(v, "filter_status"));
|
|
123
|
+
const project = args.project === "" || args.project === "none" ? null : (str(args.project) ?? (typeof args.project === "number" ? args.project : undefined));
|
|
124
|
+
const { cards, total } = board.listCards({ project, parent: str(args.parent), assignee: str(args.filter_assignee) || undefined, status: filterStatus });
|
|
125
|
+
if (!cards.length)
|
|
126
|
+
return "No cards match.";
|
|
127
|
+
return [...cards.map((c) => cardLine(c)), ...(total > cards.length ? [`… ${total - cards.length} more: narrow with filter_status or filter_assignee`] : [])].join("\n");
|
|
128
|
+
}
|
|
129
|
+
case "get": {
|
|
130
|
+
const card = board.findCard(need(args.id, "id"));
|
|
131
|
+
return card && board.isOnBoard(card) ? cardText(board, card) : undefined;
|
|
132
|
+
}
|
|
133
|
+
default:
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** The activity log's line for a board action that changed work (as `created task:` / `claimed:` / `completed:` for plain tasks). */
|
|
138
|
+
export function boardActivity(args) {
|
|
139
|
+
const id = typeof args.id === "string" ? args.id : "";
|
|
140
|
+
if (args.action === "create" && has(args, BOARD_CREATE) && typeof args.title === "string")
|
|
141
|
+
return `created task: ${args.title}`;
|
|
142
|
+
if (args.action !== "move")
|
|
143
|
+
return null;
|
|
144
|
+
const to = typeof args.to === "string" ? args.to : typeof args.status === "string" ? args.status : "";
|
|
145
|
+
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;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* #2303: how many handed-out board cards an instance may have in progress at once — its `board_cards_at_once`, else
|
|
149
|
+
* 1 (the validator holds it to a whole number of at least 1; anything else here counts as 1).
|
|
150
|
+
*/
|
|
151
|
+
export function boardCardLimit(fleet, name) {
|
|
152
|
+
const own = fleet?.instances && Object.prototype.hasOwnProperty.call(fleet.instances, name) ? fleet.instances[name]?.board_cards_at_once : undefined;
|
|
153
|
+
return typeof own === "number" && Number.isInteger(own) && own >= 1 ? own : 1;
|
|
154
|
+
}
|
|
155
|
+
//# 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,51 @@
|
|
|
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
|
+
/**
|
|
20
|
+
* #2352: whether the person has this card's Needs you buttons in `instance`'s own channel (it is the card's lane):
|
|
21
|
+
* then a dispatcher's wake says so instead of asking it to tell the person.
|
|
22
|
+
*/
|
|
23
|
+
buttonsHere?(instance: string, uuid: string): boolean;
|
|
24
|
+
log(level: "info" | "warn", message: string, extra?: Record<string, unknown>): void;
|
|
25
|
+
gatherMs?: number;
|
|
26
|
+
timers?: {
|
|
27
|
+
set(fn: () => void, ms: number): unknown;
|
|
28
|
+
clear(handle: unknown): void;
|
|
29
|
+
};
|
|
30
|
+
now?: () => number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* One message for an instance's gathered news: a line per card (a main task assigned with its sub tasks is one line),
|
|
34
|
+
* or — a whole plan assigned at once — a count, so it does not read as everything to do right now.
|
|
35
|
+
*/
|
|
36
|
+
export declare function wakeMessage(wakes: Wake[], card?: (uuid: string) => Card | undefined,
|
|
37
|
+
/** #2352: the person has this wake's card's buttons in the woken instance's channel. */
|
|
38
|
+
buttonsHere?: (w: Wake) => boolean): string;
|
|
39
|
+
export declare class TaskBoardWaker {
|
|
40
|
+
private readonly deps;
|
|
41
|
+
private readonly gathering;
|
|
42
|
+
private stopped;
|
|
43
|
+
private seq;
|
|
44
|
+
private readonly timers;
|
|
45
|
+
constructor(deps: TaskBoardWakerDeps);
|
|
46
|
+
/** A committed write's wakes: gathered per instance, a card's news merged (each reason keeps its own words). */
|
|
47
|
+
note(wakes: readonly Wake[]): void;
|
|
48
|
+
/** Nothing more is sent (the fleet is stopping); news still gathering is dropped — the cards keep it. */
|
|
49
|
+
stop(): void;
|
|
50
|
+
private flush;
|
|
51
|
+
}
|