@songsid/agend 2.3.0-beta.9 → 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 +7 -1
- package/dist/agent-cli.js +41 -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 +53 -12
- 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 +41 -4
- 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.js.map +1 -1
- 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 +249 -13
- package/dist/fleet-manager.js +1561 -292
- 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.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 +24 -4
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +553 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +154 -31
- 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 +106 -60
- package/dist/outbound-schemas.js +33 -10
- 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.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 +23 -5
- package/dist/ui/app.html +2 -0
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-effects.js +10 -3
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +62 -18
- package/dist/ui/chat-store.js +218 -48
- package/dist/ui/chat-strings.js +40 -8
- package/dist/ui/chat-thread.js +119 -10
- 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 +69 -28
- 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 +18 -5
- 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 +81 -18
- 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 +200 -56
- 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 +2 -0
- 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 +5 -1
- package/dist/ui/shared/app-themes.js +116 -1
- package/dist/ui/shared/app.css +662 -48
- 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-registry.js +14 -4
- package/dist/ui/shared/effect-runtime-loader.js +3 -1
- package/dist/ui/shared/effect-stock-trust.js +5 -5
- 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 +4 -0
- 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.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.map +1 -1
- package/dist/web-api.d.ts +57 -10
- package/dist/web-api.js +1103 -70
- 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 +3 -0
- 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
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// #1450 C1:
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// - no lock, no token → a plain external install: proceed (the documented restriction covers the rest);
|
|
6
|
-
// - a live lock, its own token → the updater's own npm child: proceed;
|
|
7
|
-
// - a live lock, other/no token → a foreign install while AgEnD owns the prefix: refuse;
|
|
8
|
-
// - a token, but no live lock → late or stale (it cannot authorise a successor): refuse;
|
|
9
|
-
// - a lock that cannot be read → refuse, naming the file (unknown ownership blocks).
|
|
2
|
+
// #1450 C1, reduced by #2264: the install lock's process readers (start time, start ticks, boot id), shared by the
|
|
3
|
+
// updater's lock (src/install-lock.ts). Nothing here decides whether an install may run any more — a manual
|
|
4
|
+
// `npm install -g` is never refused because of a lock (#2264: one that could not be read blocked every install).
|
|
10
5
|
// Same syntax constraints as runtime-platform.cjs: this may run on an old Node.
|
|
11
6
|
var fs = require("fs");
|
|
12
7
|
var path = require("path");
|
|
@@ -124,37 +119,7 @@ function parse(text) {
|
|
|
124
119
|
|| (typeof r.startTicks === "string" && /^\d+$/.test(r.startTicks) && typeof r.bootId === "string" && /^[0-9a-f-]{36}$/.test(r.bootId))) ? r : null;
|
|
125
120
|
}
|
|
126
121
|
|
|
127
|
-
/** { ok: true, why } or { ok: false, reason }. deps (tests): env, processStart. */
|
|
128
|
-
function admit(pkgDir, deps) {
|
|
129
|
-
var d = deps || {};
|
|
130
|
-
var env = d.env || process.env;
|
|
131
|
-
var token = env[TOKEN_ENV] || "";
|
|
132
|
-
var real;
|
|
133
|
-
try { real = fs.realpathSync(pkgDir); } catch (e) { real = pkgDir; }
|
|
134
|
-
var prefix = globalPrefix(real);
|
|
135
|
-
if (!prefix) return token ? { ok: false, reason: "an AgEnD install token was presented, but this is not a global install it could belong to" } : { ok: true, why: "not a global install" };
|
|
136
|
-
try { prefix = fs.realpathSync(prefix); } catch (e) { /* as derived */ }
|
|
137
|
-
var lockPath = path.join(prefix, LOCK);
|
|
138
|
-
var text = null;
|
|
139
|
-
try { text = fs.readFileSync(lockPath, "utf8"); } catch (e) {
|
|
140
|
-
if (e.code !== "ENOENT") return { ok: false, reason: "the install lock " + lockPath + " cannot be read (" + e.code + ")" };
|
|
141
|
-
}
|
|
142
|
-
if (text === null) {
|
|
143
|
-
return token ? { ok: false, reason: "an AgEnD install token was presented, but no update holds " + lockPath + " (a late or stale token)" } : { ok: true, why: "no lock: an external install" };
|
|
144
|
-
}
|
|
145
|
-
var lock = parse(text);
|
|
146
|
-
if (!lock) return { ok: false, reason: "the install lock " + lockPath + " cannot be read as a lock; if no `agend update` is running, remove it and retry" };
|
|
147
|
-
var state = holderState(lock, d);
|
|
148
|
-
if (state === "unknown") return { ok: false, reason: "whether the AgEnD update that holds " + lockPath + " (pid " + lock.pid + ") is still running cannot be told; retry" };
|
|
149
|
-
if (state === "stale") {
|
|
150
|
-
return token ? { ok: false, reason: "the AgEnD update that held " + lockPath + " is gone, so its token cannot authorise this install" } : { ok: true, why: "a stale lock and no token: an external install" };
|
|
151
|
-
}
|
|
152
|
-
if (lock.prefix !== prefix) return { ok: false, reason: "the install lock " + lockPath + " names another prefix (" + lock.prefix + ")" };
|
|
153
|
-
if (token && token === lock.token) return { ok: true, why: "the updater's own install" };
|
|
154
|
-
return { ok: false, reason: "an `agend update` (pid " + lock.pid + ") is installing into " + prefix + " right now; wait for it, then retry" };
|
|
155
|
-
}
|
|
156
|
-
|
|
157
122
|
module.exports = {
|
|
158
|
-
LOCK: LOCK, TOKEN_ENV: TOKEN_ENV,
|
|
123
|
+
LOCK: LOCK, TOKEN_ENV: TOKEN_ENV, globalPrefix: globalPrefix, processStart: processStart, startTicks: startTicks, bootId: bootId,
|
|
159
124
|
sameStartText: sameStartText, START_TOLERANCE_MS: START_TOLERANCE_MS, exists: exists, holderState: holderState, parse: parse,
|
|
160
125
|
};
|
package/launcher/postinstall.cjs
CHANGED
|
@@ -14,8 +14,6 @@ var crypto = require("crypto");
|
|
|
14
14
|
var childProcess = require("child_process");
|
|
15
15
|
var platform = require("./runtime-platform.cjs");
|
|
16
16
|
var select = require("./runtime-select.cjs");
|
|
17
|
-
var admission = require("./install-admission.cjs");
|
|
18
|
-
var oldUpdater = require("./old-updater-note.cjs");
|
|
19
17
|
|
|
20
18
|
/** Runs on the candidate Node with argv[1] = the package dir: version, N-API, and a real DB open in both threads. */
|
|
21
19
|
var PROOF = [
|
|
@@ -33,13 +31,9 @@ var PROOF = [
|
|
|
33
31
|
].join("\n");
|
|
34
32
|
|
|
35
33
|
function refuse(reason, recovery) {
|
|
36
|
-
// #
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
: state === "kept" ? "npm is rolling this install back; the previous install stays.\n"
|
|
40
|
-
: "npm is rolling this install back; a previous install, if any, stays — unless AgEnD 2.1's updater started this.\n";
|
|
41
|
-
var note = oldUpdater.oldUpdaterNote(state);
|
|
42
|
-
process.stderr.write("\n AgEnD cannot be installed here: " + reason + ".\n " + back + " " + recovery + "\n" + (note ? note : "") + "\n");
|
|
34
|
+
// #2264: one repair, whatever happened before: the installer (it puts back what an interrupted install moved aside).
|
|
35
|
+
process.stderr.write("\n AgEnD cannot be installed here: " + reason + ".\n npm is rolling this install back; a previous install, if any, stays.\n " + recovery
|
|
36
|
+
+ "\n If `agend` is missing afterwards, run the installer again: curl -fsSL https://songsid.github.io/AgEnD/install.sh | bash\n\n");
|
|
43
37
|
process.exit(1);
|
|
44
38
|
}
|
|
45
39
|
|
|
@@ -62,9 +56,8 @@ function main(deps) {
|
|
|
62
56
|
try { fs.unlinkSync(file); } catch (e) { /* checked below */ }
|
|
63
57
|
if (!select.absent(file)) refuse("an old runtime receipt at " + file + " cannot be removed", "remove it, then: npm install -g @songsid/agend@" + pkg.manifest.version);
|
|
64
58
|
});
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
if (!admitted.ok) refuse(admitted.reason, "Never run two installs of @songsid/agend into one prefix at once, or one while `agend update` runs.");
|
|
59
|
+
// #2264: no install lock is consulted here. A manual `npm install -g` is never refused because of one (a lock that
|
|
60
|
+
// could not be read used to block every install until removed by hand); only two installers exclude each other.
|
|
68
61
|
var host = d.host || platform.hostPlatform();
|
|
69
62
|
var running = d.versions || { node: process.versions.node, napi: Number(process.versions.napi) };
|
|
70
63
|
var engines = (pkg.manifest.engines && pkg.manifest.engines.node) || ">=22.14.0";
|
|
@@ -72,6 +65,15 @@ function main(deps) {
|
|
|
72
65
|
var support = platform.runtimeSupport(host);
|
|
73
66
|
var log = d.log || function (line) { process.stdout.write(line + "\n"); };
|
|
74
67
|
var installed = function () { log(NEXT_STEP); return 0; };
|
|
68
|
+
// #2264: `npm exec --package @songsid/agend@<v> -- agend-install` fetches a release only to run its installer. npm
|
|
69
|
+
// hoists the bundled Node out of <pkg>/node_modules there, and nothing runs `agend` from that copy: the installer's own
|
|
70
|
+
// `npm install -g` proves the bundled Node where AgEnD is installed. Refusing here (an old Node running npm, the
|
|
71
|
+
// runtime not at its exact path) would stop the update before the installer starts — the real Mac rehearsal.
|
|
72
|
+
var env = d.env || process.env;
|
|
73
|
+
if (env.npm_command === "exec" && !(pin && support.supported && select.runtimeCandidate(pkg.dir, pin).exists)) {
|
|
74
|
+
log(" ℹ Fetched to run its installer (npm exec); the bundled Node is checked by the install itself.");
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
75
77
|
|
|
76
78
|
if (pin && support.supported) {
|
|
77
79
|
var candidate = select.runtimeCandidate(pkg.dir, pin);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Shared by the compiled CLI and the target-version installer. Keep syntax usable by old npm's Node.
|
|
3
|
+
var fs = require("fs");
|
|
4
|
+
var path = require("path");
|
|
5
|
+
|
|
6
|
+
function checkedPath(dir, io, missingAllowed, message) {
|
|
7
|
+
var absolute = path.resolve(dir), parent = path.parse(absolute).root;
|
|
8
|
+
var pieces = absolute.slice(parent.length).split(path.sep).filter(Boolean), info;
|
|
9
|
+
for (var i = 0; i < pieces.length; i++) {
|
|
10
|
+
parent = path.join(parent, pieces[i]);
|
|
11
|
+
try { info = io.lstatSync(parent); }
|
|
12
|
+
catch (error) { if (missingAllowed && error.code === "ENOENT") return null; throw error; }
|
|
13
|
+
if (info.isSymbolicLink() || !info.isDirectory()) throw new Error(message);
|
|
14
|
+
}
|
|
15
|
+
return info || io.lstatSync(absolute);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Create privately; repair only an owned real home, never chmod by pathname or through a symlink. */
|
|
19
|
+
function ensurePrivateHome(dir, options) {
|
|
20
|
+
var opts = options || {}, io = opts.fs || fs;
|
|
21
|
+
var uid = opts.uid === undefined ? (typeof process.getuid === "function" ? process.getuid() : null) : opts.uid;
|
|
22
|
+
var label = opts.label || "AgEnD";
|
|
23
|
+
var message = label + " requires an owned real AGEND_HOME without group/other write permission.";
|
|
24
|
+
checkedPath(dir, io, opts.create !== false, message);
|
|
25
|
+
if (opts.create !== false) io.mkdirSync(dir, { recursive: true, mode: 448 }); // 0700; umask cannot add permissions
|
|
26
|
+
var before = checkedPath(dir, io, false, message);
|
|
27
|
+
// Native Windows has no Unix uid/mode contract. The Windows installer runs this policy inside WSL.
|
|
28
|
+
if (uid === null) return;
|
|
29
|
+
if (before.uid !== uid) throw new Error(message);
|
|
30
|
+
var fd = io.openSync(dir, io.constants.O_RDONLY | io.constants.O_DIRECTORY | io.constants.O_NOFOLLOW);
|
|
31
|
+
try {
|
|
32
|
+
if (opts.afterOpen) opts.afterOpen(); // test seam: replacement at the check/change boundary
|
|
33
|
+
var info = io.fstatSync(fd), current = checkedPath(dir, io, false, message);
|
|
34
|
+
if (!info.isDirectory() || info.uid !== uid || current.dev !== info.dev || current.ino !== info.ino) throw new Error(message);
|
|
35
|
+
if (info.mode & 18) { // 0022: repair affected 0775/0777 homes; existing non-writable roots keep their mode
|
|
36
|
+
io.fchmodSync(fd, 448);
|
|
37
|
+
if ((io.fstatSync(fd).mode & 511) !== 448) throw new Error(message);
|
|
38
|
+
(opts.log || function (line) { console.warn(line); })("AgEnD: tightened owned AGEND_HOME permissions to 0700.");
|
|
39
|
+
}
|
|
40
|
+
} finally { io.closeSync(fd); }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = { ensurePrivateHome: ensurePrivateHome };
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@songsid/agend",
|
|
3
|
-
"version": "2.3.0
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Multi-agent fleet daemon — run coding CLIs (Claude, Muse, Codex, OpenCode) from Discord or Telegram",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"agend": "./launcher/agend",
|
|
8
|
-
"agend-agent": "./launcher/agend-agent"
|
|
8
|
+
"agend-agent": "./launcher/agend-agent",
|
|
9
|
+
"agend-install": "./launcher/agend-install.cjs"
|
|
9
10
|
},
|
|
10
11
|
"exports": {
|
|
11
12
|
".": "./dist/cli.js",
|
|
@@ -59,34 +60,36 @@
|
|
|
59
60
|
"scripts/preinstall-guard.cjs"
|
|
60
61
|
],
|
|
61
62
|
"dependencies": {
|
|
62
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
63
|
+
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
63
64
|
"better-sqlite3": "^13.0.3",
|
|
64
65
|
"commander": "^14.0.3",
|
|
65
66
|
"croner": "^10.0.1",
|
|
66
|
-
"discord.js": "^14.
|
|
67
|
+
"discord.js": "^14.27.0",
|
|
67
68
|
"ejs": "^5.0.1",
|
|
68
69
|
"grammy": "^1.44.0",
|
|
69
|
-
"js-yaml": "^4.
|
|
70
|
+
"js-yaml": "^4.3.2",
|
|
71
|
+
"libavoid-js": "0.4.5",
|
|
70
72
|
"pino": "^10.3.1",
|
|
71
73
|
"pino-pretty": "^13.1.3",
|
|
72
74
|
"smol-toml": "1.9.0",
|
|
73
|
-
"undici": "6.
|
|
75
|
+
"undici": "6.29.1",
|
|
74
76
|
"yaml": "^2.9.0",
|
|
75
77
|
"zod": "^4.3.6"
|
|
76
78
|
},
|
|
77
79
|
"optionalDependencies": {
|
|
78
|
-
"@songsid/agend-node-darwin-arm64": "22.23.
|
|
79
|
-
"@songsid/agend-node-darwin-x64": "22.23.
|
|
80
|
-
"@songsid/agend-node-linux-arm64": "22.23.
|
|
81
|
-
"@songsid/agend-node-linux-x64": "22.23.
|
|
80
|
+
"@songsid/agend-node-darwin-arm64": "22.23.4",
|
|
81
|
+
"@songsid/agend-node-darwin-x64": "22.23.4",
|
|
82
|
+
"@songsid/agend-node-linux-arm64": "22.23.4",
|
|
83
|
+
"@songsid/agend-node-linux-x64": "22.23.4"
|
|
82
84
|
},
|
|
83
85
|
"devDependencies": {
|
|
84
86
|
"@types/better-sqlite3": "^7.6.13",
|
|
85
87
|
"@types/ejs": "^3.1.5",
|
|
86
88
|
"@types/js-yaml": "^4.0.9",
|
|
87
89
|
"@types/node": "^25.5.0",
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
90
|
+
"@typescript/native": "npm:typescript@7.0.2",
|
|
91
|
+
"tsx": "^4.23.15",
|
|
92
|
+
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
93
|
+
"vitest": "^4.1.12"
|
|
91
94
|
}
|
|
92
95
|
}
|
|
@@ -15,8 +15,7 @@
|
|
|
15
15
|
// pins none) AND a system Node older than ENGINES — AgEnD would install and then not start.
|
|
16
16
|
// Old syntax only (var, no ?. ??, no trailing call commas): this runs under whatever Node runs npm.
|
|
17
17
|
//
|
|
18
|
-
// Exiting 1 aborts the install
|
|
19
|
-
// removes the previous AgEnD first (#1487), so the refusal says so and gives the restore commands (old-updater-note.cjs).
|
|
18
|
+
// Exiting 1 aborts the install; a previous install stays (#2264: no 2.1-era restore note — the repair is the installer).
|
|
20
19
|
// --ignore-scripts bypasses this check; see Upgrade Notes in the changelog.
|
|
21
20
|
|
|
22
21
|
"use strict";
|
|
@@ -24,7 +23,6 @@
|
|
|
24
23
|
var path = require("path");
|
|
25
24
|
var fs = require("fs");
|
|
26
25
|
var platform = require(path.join(__dirname, "..", "launcher", "runtime-platform.cjs"));
|
|
27
|
-
var oldUpdater = require(path.join(__dirname, "..", "launcher", "old-updater-note.cjs"));
|
|
28
26
|
|
|
29
27
|
var ENGINES = "^22.14.0 || ^23.6.0 || >=24";
|
|
30
28
|
var running = process.versions.node;
|
|
@@ -52,7 +50,6 @@ process.stderr.write(
|
|
|
52
50
|
"\n" +
|
|
53
51
|
" Update Node to a compatible version, then retry:\n" +
|
|
54
52
|
" npm install -g @songsid/agend\n" +
|
|
55
|
-
"\n"
|
|
56
|
-
(function () { var note = oldUpdater.oldUpdaterNote(oldUpdater.oldUpdaterState(process.env)); return note ? note + "\n" : ""; })()
|
|
53
|
+
"\n"
|
|
57
54
|
);
|
|
58
55
|
process.exit(1);
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# AgEnD 桌面捷徑(#1853):`agend shortcuts` 在 WSL 裡經由 powershell.exe 執行這份文字,建立或更新「AgEnD 儀表板」和
|
|
2
|
+
# 「AgEnD 重新啟動」兩個桌面捷徑。第一個空白行以下和 website/public/install-agend.ps1 裡的同一段一字不差
|
|
3
|
+
# (tests/windows-shortcuts-cli-1853.test.ts 檢查):改的時候兩邊一起改。
|
|
4
|
+
|
|
5
|
+
$WSL_COMMAND_FN = @'
|
|
6
|
+
function Get-WslAgendCommand([string]$command) {
|
|
7
|
+
return ('export PATH=$HOME/.local/bin:$PATH; source $HOME/.nvm/nvm.sh 2>/dev/null; ' + $command)
|
|
8
|
+
}
|
|
9
|
+
# 放進 PowerShell 文字裡的值(Linux、使用者名稱)一律用這個轉成字面字串:名稱裡的單引號(例如 o'neil)不會讓產生的
|
|
10
|
+
# 腳本或貼上的指令壞掉(#2260 審查)。印給人看的指令,名稱沒有特殊字元時維持原樣、不加引號。
|
|
11
|
+
function ConvertTo-PsLiteral([string]$value) { return ("'" + ($value -replace "'", "''") + "'") }
|
|
12
|
+
function ConvertTo-PsArgument([string]$value) { if ($value -match '^[\w.-]+$') { return $value } else { return (ConvertTo-PsLiteral $value) } }
|
|
13
|
+
function Get-AgendStartHint([string]$distro, [string]$user) {
|
|
14
|
+
return ("wsl -d {0} -u {1} -- bash -lc '{2}'" -f (ConvertTo-PsArgument $distro), (ConvertTo-PsArgument $user), (Get-WslAgendCommand 'agend start'))
|
|
15
|
+
}
|
|
16
|
+
'@
|
|
17
|
+
. ([scriptblock]::Create($WSL_COMMAND_FN))
|
|
18
|
+
|
|
19
|
+
$DASHBOARD_OPENER_FN = @'
|
|
20
|
+
function Get-DashboardSignIn([string]$text) {
|
|
21
|
+
$url = [regex]::Match($text, 'Sign-in page:\s*(https?://\S+)')
|
|
22
|
+
$code = [regex]::Match($text, 'Code:\s*([A-Z2-7]{4}-?[A-Z2-7]{4})\b')
|
|
23
|
+
if (-not $url.Success -or -not $code.Success) { return $null }
|
|
24
|
+
return @{ Url = $url.Groups[1].Value; Code = $code.Groups[1].Value }
|
|
25
|
+
}
|
|
26
|
+
function Invoke-OpenDashboard([string]$distro, [string]$user = 'root', [switch]$Wait) {
|
|
27
|
+
# agend web --code 失敗時(AgEnD 沒在跑、沒有 token、連不上)會寫到 stderr 並以 1 結束。Windows PowerShell 5.1 會把重導的
|
|
28
|
+
# stderr 變成錯誤紀錄,在 ErrorActionPreference=Stop 下直接中止(#2242 審查):取得輸出的這段改用 Continue、每一筆都轉成文字,
|
|
29
|
+
# 結束碼不是 0、啟動不了 wsl,都走下面「打不開」的說明。原本的設定在 finally 還原。
|
|
30
|
+
$text = ''; $exit = 1
|
|
31
|
+
$prevEAP = $ErrorActionPreference
|
|
32
|
+
try {
|
|
33
|
+
$ErrorActionPreference = 'Continue'
|
|
34
|
+
$text = ((& wsl.exe -d $distro -u $user -- bash -lc (Get-WslAgendCommand 'agend web --code') 2>&1) | ForEach-Object { "$_" } | Out-String)
|
|
35
|
+
$exit = $LASTEXITCODE
|
|
36
|
+
} catch {
|
|
37
|
+
$text = "$_"; $exit = 1
|
|
38
|
+
} finally {
|
|
39
|
+
$ErrorActionPreference = $prevEAP
|
|
40
|
+
}
|
|
41
|
+
$signIn = if ($exit -eq 0) { Get-DashboardSignIn $text } else { $null }
|
|
42
|
+
if (-not $signIn) {
|
|
43
|
+
Write-Host " [!!] 現在打不開 AgEnD 儀表板:AgEnD 可能還沒啟動。" -ForegroundColor Yellow
|
|
44
|
+
Write-Host (" 稍等一下再試一次;或在 PowerShell 執行:" + (Get-AgendStartHint $distro $user))
|
|
45
|
+
if ($Wait) { Read-Host "按 Enter 關閉" }
|
|
46
|
+
return $false
|
|
47
|
+
}
|
|
48
|
+
$copied = $false; try { Set-Clipboard -Value $signIn.Code; $copied = $true } catch { }
|
|
49
|
+
$opened = $false; try { Start-Process $signIn.Url; $opened = $true } catch { }
|
|
50
|
+
$spaced = ($signIn.Code.ToCharArray() | ForEach-Object { [string]$_ }) -join ' '
|
|
51
|
+
Write-Host ""
|
|
52
|
+
Write-Host (" ┌──────────────────────────────────────┐") -ForegroundColor Green
|
|
53
|
+
Write-Host (" │ 儀表板登入碼: " + $spaced + " │") -ForegroundColor Green
|
|
54
|
+
Write-Host (" └──────────────────────────────────────┘") -ForegroundColor Green
|
|
55
|
+
if ($opened) { Write-Host " [OK] 登入頁已在瀏覽器打開。" -ForegroundColor Green } else { Write-Host (" 請自己在瀏覽器打開:" + $signIn.Url) }
|
|
56
|
+
if ($copied) { Write-Host " [OK] 登入碼已複製:在登入頁的輸入框按 Ctrl+V。這組登入碼只能用一次,幾分鐘內有效。" -ForegroundColor Green }
|
|
57
|
+
else { Write-Host " 在登入頁輸入上面的登入碼。這組登入碼只能用一次,幾分鐘內有效。" }
|
|
58
|
+
if ($Wait) { Read-Host "按 Enter 關閉" }
|
|
59
|
+
return $true
|
|
60
|
+
}
|
|
61
|
+
'@
|
|
62
|
+
. ([scriptblock]::Create($DASHBOARD_OPENER_FN))
|
|
63
|
+
|
|
64
|
+
# 「AgEnD 重新啟動」捷徑(#1853,使用者 2026-10-20 核准):先問,預設不重啟;確定才在安裝時記下的 Linux 和使用者裡執行
|
|
65
|
+
# agend restart,接著顯示 agend status,等你按 Enter。WSL 或 AgEnD 不在時直接說明;絕不執行 wsl --shutdown。
|
|
66
|
+
# 這段函式的文字同時是捷徑執行的腳本(和儀表板捷徑一樣,安裝程式與捷徑共用同一份)。
|
|
67
|
+
$RESTART_FN = @'
|
|
68
|
+
function Invoke-AgendInWsl([string]$distro, [string]$user, [string]$command) {
|
|
69
|
+
# 在 WSL 裡以登入 shell 執行一個 agend 指令,回傳 @{ Code; Text }。Linux 的輸出是 UTF-8;stderr 不讓 5.1 中止(#2242)。
|
|
70
|
+
$prevEAP = $ErrorActionPreference; $prevEnc = [Console]::OutputEncoding
|
|
71
|
+
try {
|
|
72
|
+
$ErrorActionPreference = 'Continue'
|
|
73
|
+
try { [Console]::OutputEncoding = [Text.Encoding]::UTF8 } catch { }
|
|
74
|
+
$text = ((& wsl.exe -d $distro -u $user -- bash -lc (Get-WslAgendCommand $command) 2>&1) | ForEach-Object { "$_" } | Out-String)
|
|
75
|
+
return @{ Code = $LASTEXITCODE; Text = $text }
|
|
76
|
+
} catch {
|
|
77
|
+
return @{ Code = -1; Text = "$_" }
|
|
78
|
+
} finally {
|
|
79
|
+
$ErrorActionPreference = $prevEAP
|
|
80
|
+
try { [Console]::OutputEncoding = $prevEnc } catch { }
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function Invoke-RestartAgend([string]$distro, [string]$user, [switch]$Wait, [int]$SettleSeconds = 3) {
|
|
84
|
+
Write-Host ""
|
|
85
|
+
$answer = Read-Host " 確定要重啟 AgEnD 嗎?所有 agent 會重新啟動,正在進行的工作會中斷。(y/N)"
|
|
86
|
+
# 只有一個 y 才算同意(y/N、yes 都不算);[string]:沒有輸入時 Read-Host 回傳 $null,而 $null -notmatch '…' 不是 $true。
|
|
87
|
+
if (([string]$answer) -notmatch '^\s*[yY]\s*$') {
|
|
88
|
+
Write-Host " 沒有重啟。"
|
|
89
|
+
if ($Wait) { $null = Read-Host "按 Enter 關閉" }
|
|
90
|
+
return 'cancelled'
|
|
91
|
+
}
|
|
92
|
+
$r = Invoke-AgendInWsl $distro $user 'agend restart'
|
|
93
|
+
$result = 'restarted'
|
|
94
|
+
if ($r.Code -eq 0) {
|
|
95
|
+
Write-Host " [OK] AgEnD 正在重新啟動。" -ForegroundColor Green
|
|
96
|
+
} else {
|
|
97
|
+
$result = 'failed'
|
|
98
|
+
if ($r.Code -eq -1) { Write-Host " [!!] 找不到 WSL(wsl.exe),所以沒有重啟。" -ForegroundColor Yellow }
|
|
99
|
+
elseif ($r.Text -match 'Fleet not running') { Write-Host (" [!!] AgEnD 沒有在執行,所以沒有可以重啟的。要啟動它:" + (Get-AgendStartHint $distro $user)) -ForegroundColor Yellow }
|
|
100
|
+
elseif ($r.Text -match 'command not found|agend: not found|no such file') { Write-Host (" [!!] 在 {0} 裡找不到 AgEnD(agend 指令),所以沒有重啟。" -f $distro) -ForegroundColor Yellow }
|
|
101
|
+
else { Write-Host (" [!!] 沒有重啟成功:{0} 不存在、WSL 沒有啟動,或 AgEnD 回報了錯誤。" -f $distro) -ForegroundColor Yellow }
|
|
102
|
+
if ($r.Text.Trim()) { Write-Host (" " + ($r.Text.Trim() -replace "`r?`n", "`n ")) }
|
|
103
|
+
}
|
|
104
|
+
if ($result -eq 'restarted') {
|
|
105
|
+
Start-Sleep -Seconds $SettleSeconds
|
|
106
|
+
Write-Host ""
|
|
107
|
+
$s = Invoke-AgendInWsl $distro $user 'agend status'
|
|
108
|
+
if ($s.Text.Trim()) { Write-Host (" " + ($s.Text.Trim() -replace "`r?`n", "`n ")) }
|
|
109
|
+
}
|
|
110
|
+
if ($Wait) { $null = Read-Host "按 Enter 關閉" }
|
|
111
|
+
return $result
|
|
112
|
+
}
|
|
113
|
+
'@
|
|
114
|
+
. ([scriptblock]::Create($RESTART_FN))
|
|
115
|
+
|
|
116
|
+
# 捷徑執行的腳本:共用的函式加上一行呼叫(UTF-8 有 BOM:Windows PowerShell 5.1 才會正確顯示中文)。Linux 與使用者是安裝時記下的。
|
|
117
|
+
# 捷徑腳本印出的第一行:它要打開的 Linux 和使用者,指錯了一眼就看得出來。
|
|
118
|
+
function Get-ShortcutTargetLine([string]$distro, [string]$user) {
|
|
119
|
+
return ('Write-Host ("AgEnD(Linux:{0},使用者:{1})" -f ' + (ConvertTo-PsLiteral $distro) + ', ' + (ConvertTo-PsLiteral $user) + ')')
|
|
120
|
+
}
|
|
121
|
+
function Get-DashboardOpenerScript([string]$distro, [string]$user) {
|
|
122
|
+
return ("# AgEnD 儀表板(AgEnD 安裝程式建立)`n" + (Get-ShortcutTargetLine $distro $user) + "`n" + $WSL_COMMAND_FN + "`n" + $DASHBOARD_OPENER_FN + "`n" + ("Invoke-OpenDashboard {0} {1} -Wait | Out-Null" -f (ConvertTo-PsLiteral $distro), (ConvertTo-PsLiteral $user)) + "`n")
|
|
123
|
+
}
|
|
124
|
+
function Get-RestartScript([string]$distro, [string]$user) {
|
|
125
|
+
return ("# AgEnD 重新啟動(AgEnD 安裝程式建立)`n" + (Get-ShortcutTargetLine $distro $user) + "`n" + $WSL_COMMAND_FN + "`n" + $RESTART_FN + "`n" + ("Invoke-RestartAgend {0} {1} -Wait | Out-Null" -f (ConvertTo-PsLiteral $distro), (ConvertTo-PsLiteral $user)) + "`n")
|
|
126
|
+
}
|
|
127
|
+
# 安裝時記下的 Linux 與使用者(%LOCALAPPDATA%\AgEnD\install.json):捷徑、重新執行安裝指令時的快速路徑都讀它。
|
|
128
|
+
function Get-AgendShortcutDir { return (Join-Path $env:LOCALAPPDATA 'AgEnD') }
|
|
129
|
+
function Read-InstallRecord {
|
|
130
|
+
try {
|
|
131
|
+
$r = Get-Content -Raw -LiteralPath (Join-Path (Get-AgendShortcutDir) 'install.json') -ErrorAction Stop | ConvertFrom-Json
|
|
132
|
+
if ($r.distro -and $r.user) { return @{ Distro = [string]$r.distro; User = [string]$r.user } }
|
|
133
|
+
} catch { }
|
|
134
|
+
return $null
|
|
135
|
+
}
|
|
136
|
+
# install.json 已經指向另一個 Linux 或使用者時回傳那筆紀錄(例如 AgEnD 專用的 Linux 和原本的 Ubuntu),否則 $null。
|
|
137
|
+
# 捷徑絕不悄悄改指向:agend shortcuts 遇到這種情況會先問。
|
|
138
|
+
function Get-InstallRecordConflict([string]$distro, [string]$user) {
|
|
139
|
+
$record = Read-InstallRecord
|
|
140
|
+
# WSL 的名稱不分大小寫;Linux 的使用者名稱分(Han 和 han 是兩個人,#2279 審查)。
|
|
141
|
+
if ($record -and ($record.Distro -ne $distro -or $record.User -cne $user)) { return $record }
|
|
142
|
+
return $null
|
|
143
|
+
}
|
|
144
|
+
# 真正寫入前再讀一次:詢問時看到的是 $seen($null:當時沒有衝突)。現在沒有衝突,或衝突的還是同一個,才可以寫;
|
|
145
|
+
# 在等回答的時候被別的安裝程式或終端機改掉了,就不寫(#2279 審查)。
|
|
146
|
+
function Test-InstallRecordAsSeen($seen, [string]$distro, [string]$user) {
|
|
147
|
+
$now = Get-InstallRecordConflict $distro $user
|
|
148
|
+
if ($null -eq $now) { return $true }
|
|
149
|
+
return ($null -ne $seen -and $now.Distro -eq $seen.Distro -and $now.User -ceq $seen.User)
|
|
150
|
+
}
|
|
151
|
+
# 一個桌面捷徑:腳本寫在 %LOCALAPPDATA%\AgEnD,捷徑以 Windows PowerShell 執行它(-ExecutionPolicy Bypass 只對那個行程)。
|
|
152
|
+
function New-AgendShortcut([string]$name, [string]$scriptName, [string]$scriptText, [string]$description) {
|
|
153
|
+
$dir = Get-AgendShortcutDir
|
|
154
|
+
New-Item -ItemType Directory -Path $dir -Force | Out-Null
|
|
155
|
+
$file = Join-Path $dir $scriptName
|
|
156
|
+
[IO.File]::WriteAllText($file, $scriptText, (New-Object System.Text.UTF8Encoding $true))
|
|
157
|
+
$lnk = Join-Path ([Environment]::GetFolderPath('Desktop')) ($name + '.lnk')
|
|
158
|
+
$shell = New-Object -ComObject WScript.Shell
|
|
159
|
+
$sc = $shell.CreateShortcut($lnk)
|
|
160
|
+
$sc.TargetPath = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe'
|
|
161
|
+
$sc.Arguments = ('-NoProfile -ExecutionPolicy Bypass -File "{0}"' -f $file)
|
|
162
|
+
$sc.Description = $description
|
|
163
|
+
$sc.Save()
|
|
164
|
+
return $lnk
|
|
165
|
+
}
|
|
166
|
+
# 建立(或更新)兩個桌面捷徑、記下 Linux 與使用者。兩個各自建立,一個失敗不會擋住另一個;回傳建立好的捷徑路徑,
|
|
167
|
+
# 呼叫端用 Write-ShortcutResult 分清楚兩個都好、只好一個、都沒好(#2252 審查)。兩個都好才在 WSL 裡留記號(agend update
|
|
168
|
+
# 之後的提示就不會再出現)。不是 Windows 時回傳空陣列。
|
|
169
|
+
function Install-AgendShortcuts([string]$distro, [string]$user) {
|
|
170
|
+
if (-not $script:OnWindows) { return @() }
|
|
171
|
+
$made = @()
|
|
172
|
+
try { $made += New-AgendShortcut 'AgEnD 儀表板' 'open-dashboard.ps1' (Get-DashboardOpenerScript $distro $user) 'AgEnD 網頁儀表板(自動帶入登入碼)' } catch { }
|
|
173
|
+
try { $made += New-AgendShortcut 'AgEnD 重新啟動' 'restart-agend.ps1' (Get-RestartScript $distro $user) '重新啟動 AgEnD(會先詢問)' } catch { }
|
|
174
|
+
try {
|
|
175
|
+
New-Item -ItemType Directory -Path (Get-AgendShortcutDir) -Force | Out-Null
|
|
176
|
+
$record = @{ distro = $distro; user = $user } | ConvertTo-Json -Compress
|
|
177
|
+
[IO.File]::WriteAllText((Join-Path (Get-AgendShortcutDir) 'install.json'), $record, (New-Object System.Text.UTF8Encoding $false))
|
|
178
|
+
if ($made.Count -eq 2) { $null = Invoke-AgendInWsl $distro $user 'set -f; IFS=; d=${AGEND_HOME:-$HOME/.agend}; umask 077; mkdir -p -m 700 -- $d && date -u +%FT%TZ > $d/windows-shortcuts' }
|
|
179
|
+
} catch { }
|
|
180
|
+
return $made
|
|
181
|
+
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
// old-updater-note.cjs — #1487: what a refused install must tell someone whose AgEnD 2.1.x updater started it.
|
|
2
|
-
//
|
|
3
|
-
// 2.1.x's `agend update` (and chat /update) runs `npm unlink -g @songsid/agend` BEFORE `npm install -g`, so when this
|
|
4
|
-
// install is refused (preinstall-guard.cjs, launcher/postinstall.cjs) nothing stays installed: no `agend`, and the
|
|
5
|
-
// service cannot start after its next restart or login (proven on the real-Mac test host, #1487). That updater writes
|
|
6
|
-
// <AGEND_HOME>/update-in-progress.json before it unlinks; 2.2's own updater never unlinks and marks its npm child with
|
|
7
|
-
// AGEND_UPDATE_KEEPS_PREVIOUS=1. So: a fresh marker without that mark → the previous AgEnD is certainly gone; no marker
|
|
8
|
-
// (a plain npm install) → say it conditionally; 2.2's updater → nothing to add.
|
|
9
|
-
// Reads one small file, writes nothing, no network. Old syntax only (var, no ?. ??): it runs under any Node npm runs on.
|
|
10
|
-
"use strict";
|
|
11
|
-
|
|
12
|
-
var fs = require("fs");
|
|
13
|
-
var os = require("os");
|
|
14
|
-
var path = require("path");
|
|
15
|
-
|
|
16
|
-
/** A 2.1.x update older than this is not the one running now. */
|
|
17
|
-
var FRESH_MS = 60 * 60 * 1000;
|
|
18
|
-
|
|
19
|
-
/** "removed" (certain), "maybe" (cannot tell), or "kept" (2.2's own updater: the previous install stays). */
|
|
20
|
-
function oldUpdaterState(env, now) {
|
|
21
|
-
env = env || process.env;
|
|
22
|
-
if (env.AGEND_UPDATE_KEEPS_PREVIOUS === "1") return "kept";
|
|
23
|
-
var home = env.AGEND_HOME || path.join(os.homedir(), ".agend");
|
|
24
|
-
var marker;
|
|
25
|
-
try { marker = JSON.parse(fs.readFileSync(path.join(home, "update-in-progress.json"), "utf8")); } catch (e) { return "maybe"; }
|
|
26
|
-
var started = marker && typeof marker.startedAt === "number" ? marker.startedAt : NaN;
|
|
27
|
-
var at = now === undefined ? Date.now() : now;
|
|
28
|
-
return started === started && at - started >= 0 && at - started < FRESH_MS ? "removed" : "maybe";
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
var RESTORE = " npm install -g @songsid/agend@2.1.12\n agend install\n";
|
|
32
|
-
|
|
33
|
-
/** The lines to add to a refusal (each starts with two spaces and ends with a newline); "" when nothing applies. */
|
|
34
|
-
function oldUpdaterNote(state) {
|
|
35
|
-
if (state === "removed") {
|
|
36
|
-
return " This install was started by AgEnD 2.1's updater (`agend update` or /update). That updater had ALREADY\n" +
|
|
37
|
-
" REMOVED the previous AgEnD before this install began, so nothing stays installed: there is no `agend`\n" +
|
|
38
|
-
" command now, and the AgEnD service will not start after its next restart or login.\n" +
|
|
39
|
-
" Put the previous version back:\n" + RESTORE;
|
|
40
|
-
}
|
|
41
|
-
if (state === "maybe") {
|
|
42
|
-
return " If this install was started by AgEnD 2.1's updater (`agend update` or /update): that updater had already\n" +
|
|
43
|
-
" removed the previous AgEnD before this install began, so nothing stays installed. Put it back with:\n" + RESTORE;
|
|
44
|
-
}
|
|
45
|
-
return "";
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
module.exports = { oldUpdaterState: oldUpdaterState, oldUpdaterNote: oldUpdaterNote, FRESH_MS: FRESH_MS };
|