@songsid/agend 2.3.5-alpha.4 → 2.3.5-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +52 -0
- package/dist/accounts-view.d.ts +97 -0
- package/dist/accounts-view.js +116 -0
- package/dist/accounts-view.js.map +1 -0
- package/dist/agent-cli-instructions.md +1 -1
- package/dist/agent-credentials.d.ts +24 -0
- package/dist/agent-credentials.js +66 -0
- package/dist/agent-credentials.js.map +1 -0
- package/dist/agent-endpoint.d.ts +3 -1
- package/dist/agent-endpoint.js +13 -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-runtime-change.d.ts +3 -1
- package/dist/agent-runtime-change.js +15 -3
- package/dist/agent-runtime-change.js.map +1 -1
- package/dist/agent-workspace.d.ts +93 -0
- package/dist/agent-workspace.js +353 -0
- package/dist/agent-workspace.js.map +1 -0
- package/dist/auth-api.d.ts +27 -0
- package/dist/auth-api.js +164 -3
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +28 -4
- package/dist/authority/session-authorizations.js +63 -17
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/backend/antigravity.js +3 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +3 -0
- package/dist/backend/codex-footer-hints.js +14 -0
- package/dist/backend/codex-footer-hints.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +14 -0
- package/dist/backend/codex-metadata.js +45 -0
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex-quota-history.d.ts +7 -0
- package/dist/backend/codex-quota-history.js +57 -0
- package/dist/backend/codex-quota-history.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +6 -0
- package/dist/backend/codex-session-lookup.js +1 -1
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex-speed.d.ts +14 -0
- package/dist/backend/codex-speed.js +35 -0
- package/dist/backend/codex-speed.js.map +1 -0
- package/dist/backend/codex.d.ts +7 -0
- package/dist/backend/codex.js +78 -15
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok-weekly-reset.d.ts +24 -0
- package/dist/backend/grok-weekly-reset.js +95 -0
- package/dist/backend/grok-weekly-reset.js.map +1 -0
- package/dist/backend/grok.d.ts +30 -1
- package/dist/backend/grok.js +301 -54
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -0
- package/dist/backend/kiro.js +50 -2
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +5 -3
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/native-pane.d.ts +3 -1
- package/dist/backend/native-pane.js +2 -2
- package/dist/backend/native-pane.js.map +1 -1
- package/dist/backend/types.d.ts +13 -1
- package/dist/backend/types.js +3 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/build-provenance-cli.d.ts +3 -0
- package/dist/build-provenance-cli.js +11 -0
- package/dist/build-provenance-cli.js.map +1 -0
- package/dist/build-provenance.d.ts +20 -0
- package/dist/build-provenance.js +67 -0
- package/dist/build-provenance.js.map +1 -0
- package/dist/build-provenance.json +1 -0
- package/dist/cache-ledger.d.ts +95 -0
- package/dist/cache-ledger.js +276 -4
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +5 -0
- package/dist/cache-service.js +16 -4
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.js +11 -3
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +51 -0
- package/dist/channel/adapters/telegram.js +235 -17
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +3 -3
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +2 -0
- package/dist/claude-auth-status.d.ts +48 -0
- package/dist/claude-auth-status.js +149 -0
- package/dist/claude-auth-status.js.map +1 -0
- package/dist/cli.js +138 -37
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +21 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +10 -0
- package/dist/cross-instance-notice.js +67 -5
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +70 -1
- package/dist/daemon.js +547 -25
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +8 -0
- package/dist/dashboard-permissions.js +16 -0
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +23 -1
- package/dist/delivery-consumed-watch.js +30 -3
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +1 -1
- package/dist/delivery-reconciliation.js +1 -1
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/doctor.js +20 -9
- package/dist/doctor.js.map +1 -1
- package/dist/export-import.d.ts +7 -0
- package/dist/export-import.js +44 -10
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -0
- package/dist/fleet-manager.d.ts +359 -7
- package/dist/fleet-manager.js +1365 -90
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +2 -1
- package/dist/fleet-windows-runtime.js +25 -7
- package/dist/fleet-windows-runtime.js.map +1 -1
- package/dist/general-knowledge/skills/concepts/SKILL.md +425 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
- package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +31 -15
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/general-role.d.ts +1 -1
- package/dist/general-role.js +1 -0
- package/dist/general-role.js.map +1 -1
- package/dist/hub/admission.d.ts +28 -0
- package/dist/hub/admission.js +62 -0
- package/dist/hub/admission.js.map +1 -0
- package/dist/hub/attachments/limits.d.ts +20 -0
- package/dist/hub/attachments/limits.js +48 -0
- package/dist/hub/attachments/limits.js.map +1 -0
- package/dist/hub/attachments/store.d.ts +116 -0
- package/dist/hub/attachments/store.js +246 -0
- package/dist/hub/attachments/store.js.map +1 -0
- package/dist/hub/audit/index.d.ts +62 -0
- package/dist/hub/audit/index.js +344 -0
- package/dist/hub/audit/index.js.map +1 -0
- package/dist/hub/browser-certificate.d.ts +38 -0
- package/dist/hub/browser-certificate.js +247 -0
- package/dist/hub/browser-certificate.js.map +1 -0
- package/dist/hub/buttons-model.d.ts +9 -0
- package/dist/hub/buttons-model.js +42 -0
- package/dist/hub/buttons-model.js.map +1 -0
- package/dist/hub/buttons.d.ts +54 -0
- package/dist/hub/buttons.js +346 -0
- package/dist/hub/buttons.js.map +1 -0
- package/dist/hub/catalog.d.ts +74 -0
- package/dist/hub/catalog.js +195 -0
- package/dist/hub/catalog.js.map +1 -0
- package/dist/hub/client.d.ts +69 -0
- package/dist/hub/client.js +300 -0
- package/dist/hub/client.js.map +1 -0
- package/dist/hub/compose/member.d.ts +139 -0
- package/dist/hub/compose/member.js +450 -0
- package/dist/hub/compose/member.js.map +1 -0
- package/dist/hub/compose/server.d.ts +77 -0
- package/dist/hub/compose/server.js +349 -0
- package/dist/hub/compose/server.js.map +1 -0
- package/dist/hub/compose/views.d.ts +12 -0
- package/dist/hub/compose/views.js +4 -0
- package/dist/hub/compose/views.js.map +1 -0
- package/dist/hub/db.d.ts +56 -0
- package/dist/hub/db.js +188 -0
- package/dist/hub/db.js.map +1 -0
- package/dist/hub/directory/config.d.ts +39 -0
- package/dist/hub/directory/config.js +108 -0
- package/dist/hub/directory/config.js.map +1 -0
- package/dist/hub/directory/directory.d.ts +18 -0
- package/dist/hub/directory/directory.js +320 -0
- package/dist/hub/directory/directory.js.map +1 -0
- package/dist/hub/directory/index.d.ts +7 -0
- package/dist/hub/directory/index.js +4 -0
- package/dist/hub/directory/index.js.map +1 -0
- package/dist/hub/directory/profiles.d.ts +41 -0
- package/dist/hub/directory/profiles.js +90 -0
- package/dist/hub/directory/profiles.js.map +1 -0
- package/dist/hub/directory/types.d.ts +71 -0
- package/dist/hub/directory/types.js +14 -0
- package/dist/hub/directory/types.js.map +1 -0
- package/dist/hub/execution/cli-provider.d.ts +23 -0
- package/dist/hub/execution/cli-provider.js +341 -0
- package/dist/hub/execution/cli-provider.js.map +1 -0
- package/dist/hub/execution/index.d.ts +13 -0
- package/dist/hub/execution/index.js +8 -0
- package/dist/hub/execution/index.js.map +1 -0
- package/dist/hub/execution/model-broker.d.ts +24 -0
- package/dist/hub/execution/model-broker.js +208 -0
- package/dist/hub/execution/model-broker.js.map +1 -0
- package/dist/hub/execution/provider-setup.d.ts +11 -0
- package/dist/hub/execution/provider-setup.js +21 -0
- package/dist/hub/execution/provider-setup.js.map +1 -0
- package/dist/hub/execution/sandbox-runner.d.ts +1 -0
- package/dist/hub/execution/sandbox-runner.js +221 -0
- package/dist/hub/execution/sandbox-runner.js.map +1 -0
- package/dist/hub/execution/service.d.ts +136 -0
- package/dist/hub/execution/service.js +459 -0
- package/dist/hub/execution/service.js.map +1 -0
- package/dist/hub/execution/store.d.ts +61 -0
- package/dist/hub/execution/store.js +182 -0
- package/dist/hub/execution/store.js.map +1 -0
- package/dist/hub/execution/views.d.ts +20 -0
- package/dist/hub/execution/views.js +48 -0
- package/dist/hub/execution/views.js.map +1 -0
- package/dist/hub/http/compose.d.ts +20 -0
- package/dist/hub/http/compose.js +518 -0
- package/dist/hub/http/compose.js.map +1 -0
- package/dist/hub/http/core.d.ts +49 -0
- package/dist/hub/http/core.js +124 -0
- package/dist/hub/http/core.js.map +1 -0
- package/dist/hub/http/deps.d.ts +61 -0
- package/dist/hub/http/deps.js +2 -0
- package/dist/hub/http/deps.js.map +1 -0
- package/dist/hub/http/schema.d.ts +14 -0
- package/dist/hub/http/schema.js +80 -0
- package/dist/hub/http/schema.js.map +1 -0
- package/dist/hub/identity.d.ts +32 -0
- package/dist/hub/identity.js +80 -0
- package/dist/hub/identity.js.map +1 -0
- package/dist/hub/init/browser-certificate.d.ts +9 -0
- package/dist/hub/init/browser-certificate.js +78 -0
- package/dist/hub/init/browser-certificate.js.map +1 -0
- package/dist/hub/init/browser-tls.d.ts +18 -0
- package/dist/hub/init/browser-tls.js +62 -0
- package/dist/hub/init/browser-tls.js.map +1 -0
- package/dist/hub/init/cli.d.ts +3 -0
- package/dist/hub/init/cli.js +83 -0
- package/dist/hub/init/cli.js.map +1 -0
- package/dist/hub/init/directory-certificate.d.ts +24 -0
- package/dist/hub/init/directory-certificate.js +222 -0
- package/dist/hub/init/directory-certificate.js.map +1 -0
- package/dist/hub/init/existing-fleet.d.ts +6 -0
- package/dist/hub/init/existing-fleet.js +58 -0
- package/dist/hub/init/existing-fleet.js.map +1 -0
- package/dist/hub/init/handoff.d.ts +8 -0
- package/dist/hub/init/handoff.js +36 -0
- package/dist/hub/init/handoff.js.map +1 -0
- package/dist/hub/init/identity.d.ts +5 -0
- package/dist/hub/init/identity.js +24 -0
- package/dist/hub/init/identity.js.map +1 -0
- package/dist/hub/init/initializer.d.ts +24 -0
- package/dist/hub/init/initializer.js +385 -0
- package/dist/hub/init/initializer.js.map +1 -0
- package/dist/hub/init/inventory.d.ts +17 -0
- package/dist/hub/init/inventory.js +33 -0
- package/dist/hub/init/inventory.js.map +1 -0
- package/dist/hub/init/layout.d.ts +32 -0
- package/dist/hub/init/layout.js +53 -0
- package/dist/hub/init/layout.js.map +1 -0
- package/dist/hub/init/network.d.ts +18 -0
- package/dist/hub/init/network.js +104 -0
- package/dist/hub/init/network.js.map +1 -0
- package/dist/hub/init/plan-digest.d.ts +5 -0
- package/dist/hub/init/plan-digest.js +47 -0
- package/dist/hub/init/plan-digest.js.map +1 -0
- package/dist/hub/init/prompt.d.ts +26 -0
- package/dist/hub/init/prompt.js +110 -0
- package/dist/hub/init/prompt.js.map +1 -0
- package/dist/hub/init/secret-file.d.ts +1 -0
- package/dist/hub/init/secret-file.js +59 -0
- package/dist/hub/init/secret-file.js.map +1 -0
- package/dist/hub/init/text.d.ts +127 -0
- package/dist/hub/init/text.js +247 -0
- package/dist/hub/init/text.js.map +1 -0
- package/dist/hub/init/types.d.ts +114 -0
- package/dist/hub/init/types.js +9 -0
- package/dist/hub/init/types.js.map +1 -0
- package/dist/hub/init/wizard.d.ts +34 -0
- package/dist/hub/init/wizard.js +554 -0
- package/dist/hub/init/wizard.js.map +1 -0
- package/dist/hub/initialization.d.ts +23 -0
- package/dist/hub/initialization.js +28 -0
- package/dist/hub/initialization.js.map +1 -0
- package/dist/hub/member/agent-mode.d.ts +6 -0
- package/dist/hub/member/agent-mode.js +23 -0
- package/dist/hub/member/agent-mode.js.map +1 -0
- package/dist/hub/member/attachments.d.ts +29 -0
- package/dist/hub/member/attachments.js +107 -0
- package/dist/hub/member/attachments.js.map +1 -0
- package/dist/hub/member/exposure-api.d.ts +87 -0
- package/dist/hub/member/exposure-api.js +64 -0
- package/dist/hub/member/exposure-api.js.map +1 -0
- package/dist/hub/member/exposures.d.ts +123 -0
- package/dist/hub/member/exposures.js +282 -0
- package/dist/hub/member/exposures.js.map +1 -0
- package/dist/hub/member/pairing-api.d.ts +85 -0
- package/dist/hub/member/pairing-api.js +385 -0
- package/dist/hub/member/pairing-api.js.map +1 -0
- package/dist/hub/member/quota.d.ts +20 -0
- package/dist/hub/member/quota.js +98 -0
- package/dist/hub/member/quota.js.map +1 -0
- package/dist/hub/member-journal.d.ts +104 -0
- package/dist/hub/member-journal.js +336 -0
- package/dist/hub/member-journal.js.map +1 -0
- package/dist/hub/member-reconciliation.d.ts +14 -0
- package/dist/hub/member-reconciliation.js +97 -0
- package/dist/hub/member-reconciliation.js.map +1 -0
- package/dist/hub/mount.d.ts +39 -0
- package/dist/hub/mount.js +123 -0
- package/dist/hub/mount.js.map +1 -0
- package/dist/hub/pairing-client.d.ts +17 -0
- package/dist/hub/pairing-client.js +108 -0
- package/dist/hub/pairing-client.js.map +1 -0
- package/dist/hub/pairing.d.ts +65 -0
- package/dist/hub/pairing.js +211 -0
- package/dist/hub/pairing.js.map +1 -0
- package/dist/hub/policy.d.ts +63 -0
- package/dist/hub/policy.js +147 -0
- package/dist/hub/policy.js.map +1 -0
- package/dist/hub/preview.d.ts +32 -0
- package/dist/hub/preview.js +64 -0
- package/dist/hub/preview.js.map +1 -0
- package/dist/hub/private-files.d.ts +5 -0
- package/dist/hub/private-files.js +44 -0
- package/dist/hub/private-files.js.map +1 -0
- package/dist/hub/profile.d.ts +59 -0
- package/dist/hub/profile.js +73 -0
- package/dist/hub/profile.js.map +1 -0
- package/dist/hub/protocol.d.ts +779 -0
- package/dist/hub/protocol.js +93 -0
- package/dist/hub/protocol.js.map +1 -0
- package/dist/hub/quota.d.ts +24 -0
- package/dist/hub/quota.js +112 -0
- package/dist/hub/quota.js.map +1 -0
- package/dist/hub/representative.d.ts +141 -0
- package/dist/hub/representative.js +528 -0
- package/dist/hub/representative.js.map +1 -0
- package/dist/hub/retention.d.ts +17 -0
- package/dist/hub/retention.js +45 -0
- package/dist/hub/retention.js.map +1 -0
- package/dist/hub/rooms.d.ts +120 -0
- package/dist/hub/rooms.js +535 -0
- package/dist/hub/rooms.js.map +1 -0
- package/dist/hub/runtime.d.ts +106 -0
- package/dist/hub/runtime.js +298 -0
- package/dist/hub/runtime.js.map +1 -0
- package/dist/hub/server.d.ts +56 -0
- package/dist/hub/server.js +202 -0
- package/dist/hub/server.js.map +1 -0
- package/dist/hub/service-start.d.ts +17 -0
- package/dist/hub/service-start.js +109 -0
- package/dist/hub/service-start.js.map +1 -0
- package/dist/hub/sessions.d.ts +53 -0
- package/dist/hub/sessions.js +196 -0
- package/dist/hub/sessions.js.map +1 -0
- package/dist/hub/socket.d.ts +24 -0
- package/dist/hub/socket.js +79 -0
- package/dist/hub/socket.js.map +1 -0
- package/dist/hub/store.d.ts +77 -0
- package/dist/hub/store.js +88 -0
- package/dist/hub/store.js.map +1 -0
- package/dist/hub/tls.d.ts +31 -0
- package/dist/hub/tls.js +135 -0
- package/dist/hub/tls.js.map +1 -0
- package/dist/hub/types.d.ts +401 -0
- package/dist/hub/types.js +2 -0
- package/dist/hub/types.js.map +1 -0
- package/dist/hub/validation.d.ts +33 -0
- package/dist/hub/validation.js +136 -0
- package/dist/hub/validation.js.map +1 -0
- package/dist/hub/version-floor.d.ts +10 -0
- package/dist/hub/version-floor.js +45 -0
- package/dist/hub/version-floor.js.map +1 -0
- package/dist/hub-browser-certificate-policy.d.ts +31 -0
- package/dist/hub-browser-certificate-policy.js +25 -0
- package/dist/hub-browser-certificate-policy.js.map +1 -0
- package/dist/hub-membership-settings.d.ts +6 -0
- package/dist/hub-membership-settings.js +21 -0
- package/dist/hub-membership-settings.js.map +1 -0
- package/dist/hub-mode.d.ts +15 -0
- package/dist/hub-mode.js +17 -0
- package/dist/hub-mode.js.map +1 -0
- package/dist/hub-pairing-summary.d.ts +48 -0
- package/dist/hub-pairing-summary.js +36 -0
- package/dist/hub-pairing-summary.js.map +1 -0
- package/dist/hub-report-target.d.ts +32 -0
- package/dist/hub-report-target.js +33 -0
- package/dist/hub-report-target.js.map +1 -0
- package/dist/hub-retention-policy.d.ts +14 -0
- package/dist/hub-retention-policy.js +15 -0
- package/dist/hub-retention-policy.js.map +1 -0
- package/dist/instance-config-impact.js +3 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +17 -2
- package/dist/instance-lifecycle.js +58 -8
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-topic-delete.d.ts +77 -0
- package/dist/instance-topic-delete.js +123 -0
- package/dist/instance-topic-delete.js.map +1 -0
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +1 -1
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +11 -0
- package/dist/kiro-engine-status.js +6 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/launchd-service-domain.d.ts +5 -0
- package/dist/launchd-service-domain.js +21 -0
- package/dist/launchd-service-domain.js.map +1 -0
- package/dist/locale.js +125 -3
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +28 -0
- package/dist/log-service.js +29 -0
- package/dist/log-service.js.map +1 -1
- package/dist/log-steps.d.ts +4 -3
- package/dist/log-steps.js +32 -7
- package/dist/log-steps.js.map +1 -1
- package/dist/logger.d.ts +16 -2
- package/dist/logger.js +346 -66
- package/dist/logger.js.map +1 -1
- package/dist/login-flows.d.ts +15 -7
- package/dist/login-flows.js +29 -3
- package/dist/login-flows.js.map +1 -1
- package/dist/login-manager.js +25 -4
- package/dist/login-manager.js.map +1 -1
- package/dist/ls-rows.js +3 -4
- package/dist/ls-rows.js.map +1 -1
- package/dist/missed-offline.d.ts +25 -0
- package/dist/missed-offline.js +79 -0
- package/dist/missed-offline.js.map +1 -0
- package/dist/native-instance-api.d.ts +0 -1
- package/dist/native-instance-api.js +15 -3
- package/dist/native-instance-api.js.map +1 -1
- package/dist/native-instance-input.d.ts +3 -0
- package/dist/native-instance-input.js +6 -1
- package/dist/native-instance-input.js.map +1 -1
- package/dist/native-instance-registry.d.ts +6 -0
- package/dist/native-instance-registry.js +24 -0
- package/dist/native-instance-registry.js.map +1 -1
- package/dist/native-mcp.d.ts +3 -0
- package/dist/native-mcp.js +15 -2
- package/dist/native-mcp.js.map +1 -1
- package/dist/native-pane-lifecycle.d.ts +8 -0
- package/dist/native-pane-lifecycle.js +13 -4
- package/dist/native-pane-lifecycle.js.map +1 -1
- package/dist/native-pane-manager.js +17 -9
- package/dist/native-pane-manager.js.map +1 -1
- package/dist/needs-you-hub.d.ts +9 -1
- package/dist/needs-you-hub.js +46 -8
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +47 -2
- package/dist/needs-you.js +31 -3
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +2 -2
- package/dist/office-share-page.js.map +1 -1
- package/dist/office-share.d.ts +11 -0
- package/dist/office-share.js +14 -0
- package/dist/office-share.js.map +1 -1
- package/dist/office-talk.d.ts +26 -0
- package/dist/office-talk.js +50 -0
- package/dist/office-talk.js.map +1 -0
- package/dist/outbound-handlers.d.ts +14 -0
- package/dist/outbound-handlers.js +49 -6
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +33 -1
- package/dist/outbound-schemas.js +29 -16
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-quota-history.d.ts +9 -0
- package/dist/pane-quota-history.js +67 -0
- package/dist/pane-quota-history.js.map +1 -0
- package/dist/pause-marker.d.ts +1 -1
- package/dist/pause-marker.js +1 -1
- package/dist/pause-marker.js.map +1 -1
- package/dist/platform-general.d.ts +46 -0
- package/dist/platform-general.js +91 -0
- package/dist/platform-general.js.map +1 -0
- package/dist/public-web-gateway.js +7 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/queued-handoffs.d.ts +33 -0
- package/dist/queued-handoffs.js +75 -0
- package/dist/queued-handoffs.js.map +1 -0
- package/dist/quickstart.d.ts +13 -0
- package/dist/quickstart.js +81 -5
- package/dist/quickstart.js.map +1 -1
- package/dist/quota-notice.d.ts +7 -0
- package/dist/quota-notice.js +40 -0
- package/dist/quota-notice.js.map +1 -1
- package/dist/reply-buttons-controller.js +10 -6
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-polls.d.ts +2 -2
- package/dist/reply-polls.js +3 -3
- package/dist/reply-polls.js.map +1 -1
- package/dist/runtime-api.d.ts +2 -0
- package/dist/runtime-api.js +25 -7
- package/dist/runtime-api.js.map +1 -1
- package/dist/runtime-build-info.js +5 -3
- package/dist/runtime-build-info.js.map +1 -1
- package/dist/runtime-bundle.d.ts +3 -0
- package/dist/runtime-bundle.js +3 -1
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-cli.d.ts +8 -1
- package/dist/runtime-cli.js +127 -8
- package/dist/runtime-cli.js.map +1 -1
- package/dist/runtime-client-store.d.ts +7 -0
- package/dist/runtime-client-store.js +30 -2
- package/dist/runtime-client-store.js.map +1 -1
- package/dist/runtime-client.d.ts +63 -1
- package/dist/runtime-client.js +295 -21
- package/dist/runtime-client.js.map +1 -1
- package/dist/runtime-coordinator.d.ts +7 -0
- package/dist/runtime-coordinator.js +213 -35
- package/dist/runtime-coordinator.js.map +1 -1
- package/dist/runtime-credential-profiles.d.ts +78 -0
- package/dist/runtime-credential-profiles.js +280 -0
- package/dist/runtime-credential-profiles.js.map +1 -0
- package/dist/runtime-install.d.ts +50 -0
- package/dist/runtime-install.js +186 -0
- package/dist/runtime-install.js.map +1 -0
- package/dist/runtime-pane-assets.d.ts +1 -1
- package/dist/runtime-pane-assets.js +1 -1
- package/dist/runtime-pane-assets.js.map +1 -1
- package/dist/runtime-pane-codex-index.d.ts +10 -1
- package/dist/runtime-pane-codex-index.js +131 -27
- package/dist/runtime-pane-codex-index.js.map +1 -1
- package/dist/runtime-pane-host.d.ts +19 -0
- package/dist/runtime-pane-host.js +50 -7
- package/dist/runtime-pane-host.js.map +1 -1
- package/dist/runtime-pane-link.d.ts +7 -0
- package/dist/runtime-pane-link.js +93 -2
- package/dist/runtime-pane-link.js.map +1 -1
- package/dist/runtime-pane-mcp-relay.d.ts +1 -0
- package/dist/runtime-pane-mcp-relay.js +10 -0
- package/dist/runtime-pane-mcp-relay.js.map +1 -1
- package/dist/runtime-pane-mcp.d.ts +4 -0
- package/dist/runtime-pane-mcp.js +6 -3
- package/dist/runtime-pane-mcp.js.map +1 -1
- package/dist/runtime-pane-native.d.ts +32 -2
- package/dist/runtime-pane-native.js +55 -6
- package/dist/runtime-pane-native.js.map +1 -1
- package/dist/runtime-pane-port.d.ts +5 -0
- package/dist/runtime-pane-port.js +17 -1
- package/dist/runtime-pane-port.js.map +1 -1
- package/dist/runtime-pane-process.d.ts +1 -1
- package/dist/runtime-pane-process.js +11 -2
- package/dist/runtime-pane-process.js.map +1 -1
- package/dist/runtime-pane-protocol.d.ts +11 -1
- package/dist/runtime-pane-protocol.js +27 -5
- package/dist/runtime-pane-protocol.js.map +1 -1
- package/dist/runtime-pane-quota-history.d.ts +6 -0
- package/dist/runtime-pane-quota-history.js +44 -0
- package/dist/runtime-pane-quota-history.js.map +1 -0
- package/dist/runtime-pane-service.d.ts +5 -0
- package/dist/runtime-pane-service.js +47 -12
- package/dist/runtime-pane-service.js.map +1 -1
- package/dist/runtime-pane-transcript.d.ts +5 -0
- package/dist/runtime-pane-transcript.js +66 -5
- package/dist/runtime-pane-transcript.js.map +1 -1
- package/dist/runtime-pane-worker.js +19 -6
- package/dist/runtime-pane-worker.js.map +1 -1
- package/dist/runtime-protocol.d.ts +17 -2
- package/dist/runtime-protocol.js +12 -0
- package/dist/runtime-protocol.js.map +1 -1
- package/dist/runtime-update-activity.d.ts +21 -0
- package/dist/runtime-update-activity.js +51 -0
- package/dist/runtime-update-activity.js.map +1 -0
- package/dist/runtime-update-artifact.d.ts +31 -0
- package/dist/runtime-update-artifact.js +252 -0
- package/dist/runtime-update-artifact.js.map +1 -0
- package/dist/runtime-update-install.d.ts +31 -0
- package/dist/runtime-update-install.js +205 -0
- package/dist/runtime-update-install.js.map +1 -0
- package/dist/runtime-update-journal.d.ts +44 -0
- package/dist/runtime-update-journal.js +121 -0
- package/dist/runtime-update-journal.js.map +1 -0
- package/dist/runtime-update-lock.d.ts +48 -0
- package/dist/runtime-update-lock.js +217 -0
- package/dist/runtime-update-lock.js.map +1 -0
- package/dist/runtime-update-owners.d.ts +29 -0
- package/dist/runtime-update-owners.js +240 -0
- package/dist/runtime-update-owners.js.map +1 -0
- package/dist/runtime-update-protocol.d.ts +15 -0
- package/dist/runtime-update-protocol.js +13 -0
- package/dist/runtime-update-protocol.js.map +1 -0
- package/dist/runtime-windows-bridge.d.ts +2 -1
- package/dist/runtime-windows-bridge.js +11 -1
- package/dist/runtime-windows-bridge.js.map +1 -1
- package/dist/scheduler/db.d.ts +2 -1
- package/dist/scheduler/db.js +23 -9
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/task-board-text.js +1 -1
- package/dist/scheduler/task-board-text.js.map +1 -1
- package/dist/scheduler/task-board.d.ts +13 -0
- package/dist/scheduler/task-board.js +28 -3
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/service-drain.d.ts +19 -0
- package/dist/service-drain.js +64 -0
- package/dist/service-drain.js.map +1 -0
- package/dist/service-installer.d.ts +7 -2
- package/dist/service-installer.js +13 -10
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +20 -0
- package/dist/settings-api.js +414 -4
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +6 -0
- package/dist/settings-baseline.js +3 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.js +29 -6
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.d.ts +13 -0
- package/dist/settings-effect.js +97 -0
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +13 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +27 -0
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/setup-wizard.js +6 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/task-board-tool.d.ts +13 -1
- package/dist/task-board-tool.js +104 -4
- package/dist/task-board-tool.js.map +1 -1
- package/dist/task-board-waker.d.ts +6 -0
- package/dist/task-board-waker.js +4 -0
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tmux-binary.d.ts +59 -0
- package/dist/tmux-binary.js +200 -0
- package/dist/tmux-binary.js.map +1 -0
- package/dist/tmux-control.js +4 -4
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.js +32 -1
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tmux-manager.d.ts +1 -1
- package/dist/tmux-manager.js +45 -36
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +4 -3
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.d.ts +5 -2
- package/dist/tool-permissions.js +6 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.d.ts +2 -0
- package/dist/tool-progress.js +19 -3
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.js +10 -5
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.d.ts +20 -0
- package/dist/transcript-monitor.js +47 -3
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-needles.d.ts +7 -0
- package/dist/transcript-needles.js +9 -1
- package/dist/transcript-needles.js.map +1 -1
- package/dist/transcript-records.d.ts +1 -1
- package/dist/transcript-records.js +2 -1
- package/dist/transcript-records.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/ui/account-identity.js +27 -0
- package/dist/ui/accounts-view.js +214 -0
- package/dist/ui/agent-runtime-settings.js +9 -8
- package/dist/ui/backend-signin.js +4 -1
- package/dist/ui/chat-ambient.js +1 -1
- package/dist/ui/chat-md-strings.js +3 -0
- package/dist/ui/chat-render.js +3 -670
- package/dist/ui/chat-store.js +1 -1
- package/dist/ui/chat-strings.js +3 -333
- package/dist/ui/chat-thread.js +3 -919
- package/dist/ui/chat-time.js +3 -80
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/credential-profile-select.js +54 -0
- package/dist/ui/fleet-office-dialogue.d.ts +30 -0
- package/dist/ui/fleet-office-dialogue.js +382 -0
- package/dist/ui/fleet-office-pack.d.ts +9 -0
- package/dist/ui/fleet-office-pack.js +76 -4
- package/dist/ui/fleet-office-skin.js +23 -5
- package/dist/ui/fleet-office-store.js +5 -0
- package/dist/ui/fleet-office.js +173 -6
- package/dist/ui/fleet-task-card.js +10 -6
- package/dist/ui/fleet-task-common.js +12 -2
- package/dist/ui/fleet-task-menu.js +188 -0
- package/dist/ui/fleet-task-stats.js +124 -0
- package/dist/ui/fleet-task-view.js +340 -0
- package/dist/ui/fleet-tasks.js +131 -43
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/html-attachment.js +3 -40
- package/dist/ui/hub-agent-copy.js +23 -0
- package/dist/ui/hub-button-actions.js +65 -0
- package/dist/ui/hub-chat-store.js +158 -0
- package/dist/ui/hub-chat-strings.js +77 -0
- package/dist/ui/hub-client.js +329 -0
- package/dist/ui/hub-owner-strings.js +51 -0
- package/dist/ui/hub-provider-guidance.js +31 -0
- package/dist/ui/hub-quota.js +85 -0
- package/dist/ui/hub-strings.js +162 -0
- package/dist/ui/hub-switcher.js +27 -0
- package/dist/ui/native-pane-recovery.js +1 -1
- package/dist/ui/office-share-page.js +4 -2
- package/dist/ui/panel-chat.js +34 -48
- package/dist/ui/panel-details.js +1 -1
- package/dist/ui/panel-fleet.js +78 -10
- package/dist/ui/panel-hub.js +619 -0
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +24 -8
- package/dist/ui/panel-runtimes.js +114 -23
- package/dist/ui/panel-settings.js +69 -80
- package/dist/ui/panel-windows-cli.js +12 -2
- package/dist/ui/preview-pages.js +1 -1
- package/dist/ui/preview-panel.js +92 -6
- package/dist/ui/preview-versions.js +1 -1
- package/dist/ui/preview.js +3 -476
- package/dist/ui/runtime-commands.d.ts +4 -0
- package/dist/ui/runtime-commands.js +59 -0
- package/dist/ui/search-dialog.js +2 -0
- package/dist/ui/settings-access-strings.js +42 -0
- package/dist/ui/settings-build-version.js +35 -0
- package/dist/ui/settings-codex-copy.js +19 -0
- package/dist/ui/settings-devices.js +253 -0
- package/dist/ui/settings-dialogs.js +28 -7
- package/dist/ui/settings-hub-browser-certificate.js +74 -0
- package/dist/ui/settings-hub-membership.js +72 -0
- package/dist/ui/settings-hub-retention.js +52 -0
- package/dist/ui/settings-hub.js +196 -0
- package/dist/ui/settings-layout.js +8 -11
- package/dist/ui/settings-model.js +16 -2
- package/dist/ui/settings-outside.js +104 -38
- package/dist/ui/settings-registry.js +4 -1
- package/dist/ui/settings-shared-strings.js +143 -0
- package/dist/ui/settings-shared.js +345 -0
- package/dist/ui/settings-strings.js +10 -46
- package/dist/ui/settings-web-authority.js +5 -2
- package/dist/ui/shared/accounts.css +15 -0
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-needs.js +1 -1
- package/dist/ui/shared/app-route.js +6 -1
- package/dist/ui/shared/app-session.js +6 -2
- package/dist/ui/shared/app-shell.js +64 -8
- package/dist/ui/shared/app.css +121 -30
- package/dist/ui/shared/app.js +12 -3
- package/dist/ui/shared/chat-composer.js +68 -0
- package/dist/ui/shared/chat-md-strings.js +9 -0
- package/dist/ui/shared/chat-render.js +682 -0
- package/dist/ui/shared/chat-strings.js +333 -0
- package/dist/ui/shared/chat-thread.js +969 -0
- package/dist/ui/shared/chat-time.js +80 -0
- package/dist/ui/shared/header-tools.js +3 -5
- package/dist/ui/shared/html-attachment.js +42 -0
- package/dist/ui/shared/hub-chat.css +85 -0
- package/dist/ui/shared/hub-owner.css +33 -0
- package/dist/ui/shared/hub-quota.css +8 -0
- package/dist/ui/shared/hub.css +71 -0
- package/dist/ui/shared/page-head.js +8 -0
- package/dist/ui/shared/panel-view.js +77 -4
- package/dist/ui/shared/preview.js +476 -0
- package/dist/ui/shared/runtime-install.css +26 -0
- package/dist/ui/shared/side-rail.js +15 -0
- package/dist/ui/shared/signin.js +172 -0
- package/dist/ui/shared/task-board.css +95 -0
- package/dist/ui/shared/usage-dialog.js +18 -1
- package/dist/ui/shared/view-history.css +17 -0
- package/dist/ui/shared/view-history.js +438 -0
- package/dist/ui/shared/view-strings.js +16 -0
- package/dist/ui/shared/workspace.css +20 -0
- package/dist/ui/signin.html +21 -0
- package/dist/ui/workspace-panel.js +189 -0
- package/dist/ui/workspace-strings.js +35 -0
- package/dist/unattended-install.d.ts +11 -2
- package/dist/unattended-install.js +41 -6
- package/dist/unattended-install.js.map +1 -1
- package/dist/usage/capacity.d.ts +69 -0
- package/dist/usage/capacity.js +119 -0
- package/dist/usage/capacity.js.map +1 -0
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +3 -0
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/profile-timeline.d.ts +16 -0
- package/dist/usage/profile-timeline.js +58 -0
- package/dist/usage/profile-timeline.js.map +1 -0
- package/dist/usage/providers.js +2 -1
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/quota-history.d.ts +43 -0
- package/dist/usage/quota-history.js +168 -0
- package/dist/usage/quota-history.js.map +1 -0
- package/dist/usage/usage-api.d.ts +31 -0
- package/dist/usage/usage-api.js +80 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.d.ts +25 -1
- package/dist/usage-report.js +55 -4
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +6 -1
- package/dist/usage-rollup.js +16 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/view-api.d.ts +16 -0
- package/dist/view-api.js +105 -23
- package/dist/view-api.js.map +1 -1
- package/dist/view-history.d.ts +84 -0
- package/dist/view-history.js +116 -0
- package/dist/view-history.js.map +1 -0
- package/dist/web-api.d.ts +48 -2
- package/dist/web-api.js +276 -8
- package/dist/web-api.js.map +1 -1
- package/dist/web-backend-login.d.ts +23 -1
- package/dist/web-backend-login.js +11 -17
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-device-login.d.ts +153 -0
- package/dist/web-device-login.js +278 -0
- package/dist/web-device-login.js.map +1 -0
- package/dist/web-office-skins.d.ts +9 -0
- package/dist/web-office-skins.js +16 -1
- package/dist/web-office-skins.js.map +1 -1
- package/dist/web-session-authorization.d.ts +13 -2
- package/dist/web-session-authorization.js +10 -3
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.d.ts +35 -0
- package/dist/web-session.js +7 -0
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +4 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +6 -0
- package/dist/web-shell-routes.js +7 -0
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal.d.ts +4 -30
- package/dist/web-terminal.js +9 -6
- package/dist/web-terminal.js.map +1 -1
- package/dist/windows-agents.d.ts +1 -0
- package/dist/windows-agents.js +1 -0
- package/dist/windows-agents.js.map +1 -1
- package/dist/windows-cli-api.d.ts +12 -1
- package/dist/windows-cli-api.js +27 -1
- package/dist/windows-cli-api.js.map +1 -1
- package/dist/windows-cli-providers.d.ts +0 -9
- package/dist/windows-cli-providers.js +4 -9
- package/dist/windows-cli-providers.js.map +1 -1
- package/dist/windows-cli-worker.d.ts +24 -0
- package/dist/windows-cli-worker.js +96 -5
- package/dist/windows-cli-worker.js.map +1 -1
- package/dist/windows-cli.d.ts +10 -0
- package/dist/windows-cli.js +10 -1
- package/dist/windows-cli.js.map +1 -1
- package/dist/yaml-shared-nodes.js +8 -3
- package/dist/yaml-shared-nodes.js.map +1 -1
- package/launcher/agend-install.cjs +8 -1
- package/launcher/launchd-session-type.cjs +14 -0
- package/launcher/postinstall.cjs +27 -2
- package/launcher/private-home.cjs +1 -1
- package/launcher/tmux-bundle.cjs +247 -0
- package/package.json +3 -2
- package/templates/launchd.plist.ejs +3 -1
- package/templates/runtime-install/install.ps1 +270 -0
package/dist/ui/fleet-tasks.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
// (an agent's tool, another tab) arrives as a "tasks" stream event with the board's revision; the board reads again
|
|
6
6
|
// when its revision moved. Over the temporary public link the board is read-only (the server refuses its writes there).
|
|
7
7
|
// A card moves by drag, by Alt+arrow keys on its title, or by its dialog ("Move to…", up and down) — touch and keyboard
|
|
8
|
-
// need no drag.
|
|
8
|
+
// need no drag. A project shows as the board or as a list, and filters stack (fleet-task-view.js). A right click on a
|
|
9
|
+
// card (or the menu key) opens its menu; its dialog steps to the previous / next card (fleet-task-menu.js).
|
|
9
10
|
import { html, useEffect, useMemo, useRef, useState } from "/assets/app-html.js";
|
|
10
11
|
import { t } from "/assets/app-i18n.js";
|
|
11
12
|
import { recordEdit } from "/assets/text-undo.js";
|
|
@@ -15,18 +16,21 @@ import { Empty, ErrorState, Skeleton } from "/assets/ui-states.js";
|
|
|
15
16
|
import { Icon } from "/assets/ui-icons.js";
|
|
16
17
|
import { Menu } from "/assets/ui-menu.js";
|
|
17
18
|
import { toast } from "/assets/ui-toast.js";
|
|
18
|
-
import { AskHost, COLUMNS, NO_PROJECT, ProgressBar, StatusPill,
|
|
19
|
+
import { AskHost, AssigneeOption, COLUMNS, NO_PROJECT, ProgressBar, StatusPill, Who, answerBlocked, askText, boardApi, currentWork, dropNeighbours, errorText, followsSubs, moveCard, notesForPeople, onPublicLink, projectKey, projectStats, readStored, relTime, reviewLabel, waitsForYou, workersOf, wrapUpText, writeStored } from "./fleet-task-common.js";
|
|
19
20
|
import { CardDialog } from "./fleet-task-card.js";
|
|
21
|
+
import { CardMenu, cardAt, cardMenuItems, pageOrder, stepsOf } from "./fleet-task-menu.js";
|
|
22
|
+
import { DisplayMenu, FilterBar, FilterMenu, ListView, SubList, doneShown, formatFilters, keepFilters, listRows, mainMatches, readDisplay, startFilters, writeDisplay } from "./fleet-task-view.js";
|
|
20
23
|
import { InstancesDrawer } from "./fleet-task-work.js";
|
|
24
|
+
import { InsightsDialog } from "./fleet-task-stats.js";
|
|
21
25
|
|
|
22
26
|
const PROJECT_KEY = "agend_tasks_project";
|
|
23
|
-
const FILTER_KEY = "agend_tasks_assignee";
|
|
24
27
|
|
|
25
28
|
// ── The tab ───────────────────────────────────────────────
|
|
26
29
|
|
|
27
30
|
/**
|
|
28
31
|
* Fleet › Tasks. `?card=M-3` in the address opens that card (a link from a notice). The project last looked at is
|
|
29
|
-
* remembered on this device
|
|
32
|
+
* remembered on this device; on a project's board the address says which (`?tp=`) and its filters (`?tf=`), so the
|
|
33
|
+
* filtered board can be sent as a link — and such a link opens it.
|
|
30
34
|
*/
|
|
31
35
|
export function TaskBoardTab({ lease }) {
|
|
32
36
|
const [state, setState] = useState(null);
|
|
@@ -34,8 +38,9 @@ export function TaskBoardTab({ lease }) {
|
|
|
34
38
|
const [version, setVersion] = useState({ n: 0, ifMoved: false });
|
|
35
39
|
const writable = !onPublicLink();
|
|
36
40
|
const [at, setAtRaw] = useState(() => {
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
let v = readStored(PROJECT_KEY, "");
|
|
42
|
+
try { v = new URLSearchParams(globalThis.location?.search || "").get("tp") ?? v; } catch { /* no address bar */ }
|
|
43
|
+
return v === "" ? null : v === NO_PROJECT ? NO_PROJECT : Number.isInteger(Number(v)) ? Number(v) : null;
|
|
39
44
|
});
|
|
40
45
|
const [openId, setOpenId] = useState(() => {
|
|
41
46
|
try { return new URLSearchParams(globalThis.location?.search || "").get("card"); } catch { return null; }
|
|
@@ -43,8 +48,16 @@ export function TaskBoardTab({ lease }) {
|
|
|
43
48
|
const [tick, setTick] = useState(0);
|
|
44
49
|
const [flashed, setFlashed] = useState(() => new Map());
|
|
45
50
|
const [dialog, setDialog] = useState(null);
|
|
46
|
-
//
|
|
47
|
-
const [
|
|
51
|
+
// A card's menu ({ card, x, y, el }), and the cards the page showed when a card's dialog opened (its Previous / Next).
|
|
52
|
+
const [menu, setMenu] = useState(null);
|
|
53
|
+
const [trail, setTrail] = useState([]);
|
|
54
|
+
// How a project shows (board or list, …) and its filters: remembered on this device, the filters also in the address.
|
|
55
|
+
const [display, setDisplayRaw] = useState(readDisplay);
|
|
56
|
+
const [filters, setFiltersRaw] = useState(() => startFilters(globalThis.location?.search));
|
|
57
|
+
const setDisplay = (d) => { setDisplayRaw(d); writeDisplay(d); };
|
|
58
|
+
const setFilters = (f) => { setFiltersRaw(f); keepFilters(f); };
|
|
59
|
+
// Finished cards "All": every done main task is read only when asked for (the server keeps recent ones otherwise).
|
|
60
|
+
const allDone = display.done === "all";
|
|
48
61
|
const seq = useRef(0);
|
|
49
62
|
const setAt = (v) => { setAtRaw(v); writeStored(PROJECT_KEY, v === null ? null : String(v)); };
|
|
50
63
|
const reload = (ifMoved = false) => setVersion((v) => ({ n: v.n + 1, ifMoved }));
|
|
@@ -89,15 +102,31 @@ export function TaskBoardTab({ lease }) {
|
|
|
89
102
|
return () => { off(); offConn(); if (timer) clearTimeout(timer); };
|
|
90
103
|
}, [lease]);
|
|
91
104
|
|
|
105
|
+
// The project and its filters in the address (Home has neither), for a link to this very board.
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
try {
|
|
108
|
+
const u = new URL(globalThis.location.href);
|
|
109
|
+
const before = u.search;
|
|
110
|
+
const f = formatFilters(filters);
|
|
111
|
+
if (at === null) { u.searchParams.delete("tp"); u.searchParams.delete("tf"); }
|
|
112
|
+
else { u.searchParams.set("tp", String(at)); if (f) u.searchParams.set("tf", f); else u.searchParams.delete("tf"); }
|
|
113
|
+
if (u.search !== before) globalThis.history.replaceState(globalThis.history.state, "", u);
|
|
114
|
+
} catch { /* no address bar */ }
|
|
115
|
+
}, [at, filters]);
|
|
116
|
+
|
|
92
117
|
const openCard = (id) => {
|
|
93
118
|
setOpenId(id);
|
|
94
119
|
try { const u = new URL(globalThis.location.href); u.searchParams.set("card", id); globalThis.history.replaceState(globalThis.history.state, "", u); } catch { /* no address bar */ }
|
|
95
120
|
};
|
|
96
121
|
const closeCard = () => {
|
|
97
122
|
setOpenId(null);
|
|
123
|
+
setTrail([]);
|
|
98
124
|
try { const u = new URL(globalThis.location.href); u.searchParams.delete("card"); globalThis.history.replaceState(globalThis.history.state, "", u); } catch { /* no address bar */ }
|
|
99
125
|
};
|
|
100
126
|
|
|
127
|
+
// A card's dialog walks the page's cards in the order shown when it opened (read once the page is drawn).
|
|
128
|
+
useEffect(() => { if (openId && !trail.length) setTrail(pageOrder()); }, [openId, state]);
|
|
129
|
+
|
|
101
130
|
// #2246 step 3: who works on what — the drawer gives way to a card opened from it (one drawer at a time).
|
|
102
131
|
const showInstances = () => setDialog({ kind: "instances" });
|
|
103
132
|
|
|
@@ -107,19 +136,69 @@ export function TaskBoardTab({ lease }) {
|
|
|
107
136
|
const projects = Array.isArray(state.data.projects) ? state.data.projects : [];
|
|
108
137
|
// #2355 review: the names a project's lead may be, as the server accepts them (the fleet's instances).
|
|
109
138
|
const leads = Array.isArray(state.data.leads) ? state.data.leads : [];
|
|
139
|
+
// The instances with the task board switched off: the board hands them no cards, so the pickers do not offer them.
|
|
140
|
+
const boardOff = Array.isArray(state.data.boardOff) ? state.data.boardOff : [];
|
|
110
141
|
// The server's numbers cover every card (finished ones are not all on the board); computed here only without them.
|
|
111
142
|
const stats = (key) => (state.data.stats && state.data.stats[String(key)]) || projectStats(key, cards);
|
|
112
143
|
const project = at === null ? null : at === NO_PROJECT ? NO_PROJECT : projects.find((p) => p.id === at) || null;
|
|
113
144
|
const body = project === null
|
|
114
145
|
? html`<${Home} cards=${cards} projects=${projects} stats=${stats} writable=${writable} onOpenProject=${setAt} onOpen=${openCard} onDialog=${setDialog} onInstances=${showInstances} reload=${reload} />`
|
|
115
|
-
: html`<${ProjectBoard} project=${project} cards=${cards} stats=${stats} flashed=${flashed}
|
|
146
|
+
: html`<${ProjectBoard} project=${project} cards=${cards} stats=${stats} flashed=${flashed} display=${display} filters=${filters} writable=${writable}
|
|
147
|
+
onDisplay=${setDisplay} onFilters=${setFilters} onBack=${() => setAt(null)}
|
|
116
148
|
onOpen=${openCard} onCreate=${() => setDialog({ kind: "main", project: project === NO_PROJECT ? null : project.id })} onInstances=${showInstances} reload=${reload} />`;
|
|
117
|
-
|
|
149
|
+
|
|
150
|
+
/** A right click on a card, or the keyboard's menu key on it (no pointer: the menu goes under the card). */
|
|
151
|
+
function onMenu(e) {
|
|
152
|
+
const hit = cardAt(e);
|
|
153
|
+
const card = hit && cards.find((c) => c.id === hit.id);
|
|
154
|
+
if (!card) return;
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
let x = e.clientX || 0, y = e.clientY || 0;
|
|
157
|
+
if (!x && !y && typeof hit.el.getBoundingClientRect === "function") { const r = hit.el.getBoundingClientRect(); x = r.left + 8; y = r.bottom; }
|
|
158
|
+
setMenu({ id: card.id, x, y, el: hit.el });
|
|
159
|
+
}
|
|
160
|
+
function closeMenu(refocus) {
|
|
161
|
+
const el = menu && menu.el;
|
|
162
|
+
setMenu(null);
|
|
163
|
+
if (refocus && el && document.contains?.(el)) (el.querySelector("button") || el).focus?.();
|
|
164
|
+
}
|
|
165
|
+
/** A menu choice, through the calls and questions the card's dialog uses. */
|
|
166
|
+
async function menuAct(card, a) {
|
|
167
|
+
const after = (r, said) => { if (r) { if (said) toast(t(said, card.id)); reload(); } };
|
|
168
|
+
try {
|
|
169
|
+
if (a.kind === "open") openCard(card.id);
|
|
170
|
+
else if (a.kind === "confirm") after(await moveCard(card, "done"), "tasks.confirmed");
|
|
171
|
+
else if (a.kind === "sendBack") after(await moveCard(card, "claimed"), "tasks.sentBack");
|
|
172
|
+
else if (a.kind === "answer") after(await answerBlocked(card), "tasks.answered");
|
|
173
|
+
else if (a.kind === "move") after(await moveCard(card, a.to));
|
|
174
|
+
else if (a.kind === "cancel") after(await moveCard(card, "cancelled"));
|
|
175
|
+
else if (a.kind === "assign" || a.kind === "assignOther" || a.kind === "priority") {
|
|
176
|
+
const value = a.kind === "assignOther" ? await askText({ title: t("taskcard.otherTitle"), label: t("taskcard.otherLabel"), required: true }) : a.value;
|
|
177
|
+
if (a.kind === "assignOther" && !value) return;
|
|
178
|
+
const r = await boardApi.update(card.id, { [a.kind === "priority" ? "priority" : "assignee"]: value, version: card.version });
|
|
179
|
+
for (const n of notesForPeople(r.notes)) toast(n);
|
|
180
|
+
reload();
|
|
181
|
+
} else if (a.kind === "copyLink" || a.kind === "copyId") {
|
|
182
|
+
const u = new URL(globalThis.location.href);
|
|
183
|
+
u.searchParams.set("card", card.id);
|
|
184
|
+
const text = a.kind === "copyLink" ? u.toString() : card.id;
|
|
185
|
+
// Without a clipboard (a plain-http address) the text is shown to copy by hand.
|
|
186
|
+
if (navigator.clipboard) { await navigator.clipboard.writeText(text); toast(t("taskmenu.copied", text)); } else toast(text);
|
|
187
|
+
}
|
|
188
|
+
} catch (err) { toast(errorText(err), false); }
|
|
189
|
+
}
|
|
190
|
+
const menuCard = menu ? cards.find((c) => c.id === menu.id) : null;
|
|
191
|
+
// The assignees a card's menu offers: who has cards in its project (Other… names anyone else).
|
|
192
|
+
const names = menuCard ? cards.filter((c) => projectKey(c) === projectKey(menuCard) && c.assignee).map((c) => c.assignee) : [];
|
|
193
|
+
|
|
194
|
+
return html`<div class="tb" onContextMenu=${onMenu}>
|
|
118
195
|
${writable ? null : html`<p class="tb-readonly" role="note"><${Icon} name="eye" size=${16} />${t("tasks.readOnly")}</p>`}
|
|
119
196
|
${body}
|
|
120
|
-
${
|
|
121
|
-
|
|
122
|
-
${
|
|
197
|
+
${menuCard ? html`<${CardMenu} at=${{ x: menu.x, y: menu.y }} label=${t("taskmenu.label", menuCard.id)} onClose=${closeMenu}
|
|
198
|
+
items=${cardMenuItems(menuCard, { writable, names, act: (a) => menuAct(menuCard, a) })} />` : null}
|
|
199
|
+
${openId ? html`<${CardDialog} key=${openId} id=${openId} tick=${tick} projects=${projects} boardOff=${boardOff} writable=${writable} place=${writable ? placeOf(cards, openId, reload) : null}
|
|
200
|
+
steps=${stepsOf(trail, openId, cards)} onClose=${closeCard} onOpen=${openCard} reloadBoard=${reload} />` : null}
|
|
201
|
+
${dialog && dialog.kind === "main" ? html`<${CreateMainDialog} projects=${projects} project=${dialog.project} boardOff=${boardOff} onClose=${() => setDialog(null)}
|
|
123
202
|
onCreated=${(id) => { if (!lease.current()) return; setDialog(null); reload(); openCard(id); }} />` : null}
|
|
124
203
|
${dialog && dialog.kind === "instances" ? html`<${InstancesDrawer} tick=${tick} onClose=${() => setDialog(null)} onOpen=${(id) => { setDialog(null); openCard(id); }} />` : null}
|
|
125
204
|
${dialog && dialog.kind === "project" ? html`<${ProjectDialog} project=${dialog.project} leads=${leads} onClose=${() => setDialog(null)}
|
|
@@ -208,7 +287,7 @@ function Waiting({ cards, writable, onOpen, reload }) {
|
|
|
208
287
|
};
|
|
209
288
|
return html`<section class="tb-waiting" aria-label=${t("tasks.waitingTitle")}>
|
|
210
289
|
<h3 class="tb-section-title"><${Icon} name="inbox" size=${16} />${t("tasks.waitingTitle")}</h3>
|
|
211
|
-
<ul class="rows">${[...review, ...blocked].map((c) => html`<li key=${c.id} class="row-item tb-wait-row">
|
|
290
|
+
<ul class="rows">${[...review, ...blocked].map((c) => html`<li key=${c.id} class="row-item tb-wait-row" data-wait=${c.id}>
|
|
212
291
|
<div class="tb-wait-main">
|
|
213
292
|
<${StatusPill} status=${c.status} />
|
|
214
293
|
<button type="button" class="tb-wait-title" onClick=${() => onOpen(c.id)}><span class="tb-code">${c.id}</span> ${c.title}
|
|
@@ -264,15 +343,13 @@ function SearchBox({ onOpen }) {
|
|
|
264
343
|
|
|
265
344
|
// ── A project's board ─────────────────────────────────────
|
|
266
345
|
|
|
267
|
-
function ProjectBoard({ project, cards, stats: statsOf, flashed,
|
|
268
|
-
const { instances } = useStore(appStore);
|
|
269
|
-
const [assignee, setAssigneeRaw] = useState(() => readStored(FILTER_KEY, ""));
|
|
346
|
+
function ProjectBoard({ project, cards, stats: statsOf, flashed, display, filters, writable, onDisplay, onFilters, onBack, onOpen, onCreate, onInstances, reload }) {
|
|
270
347
|
const [expanded, setExpanded] = useState({});
|
|
271
348
|
const [drag, setDrag] = useState(null);
|
|
272
349
|
const [spot, setSpot] = useState(null);
|
|
273
|
-
const setAssignee = (v) => { setAssigneeRaw(v); writeStored(FILTER_KEY, v || null); };
|
|
274
350
|
const key = project === NO_PROJECT ? NO_PROJECT : project.id;
|
|
275
351
|
const archived = project !== NO_PROJECT && project.archived;
|
|
352
|
+
const [insights, setInsights] = useState(false);
|
|
276
353
|
const stats = statsOf(key);
|
|
277
354
|
const now = Date.now();
|
|
278
355
|
|
|
@@ -281,11 +358,25 @@ function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writab
|
|
|
281
358
|
for (const c of cards) if (c.kind === "sub" && c.parentId && c.status !== "cancelled") m.set(c.parentId, [...(m.get(c.parentId) || []), c]);
|
|
282
359
|
return m;
|
|
283
360
|
}, [cards]);
|
|
284
|
-
const
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
const
|
|
361
|
+
const byId = useMemo(() => new Map(cards.map((c) => [c.id, c])), [cards]);
|
|
362
|
+
const live = cards.filter((c) => c.kind === "main" && projectKey(c) === key && c.status !== "cancelled");
|
|
363
|
+
// What the filters offer: this project's main tasks and their sub tasks.
|
|
364
|
+
const own = live.flatMap((c) => [c, ...(subsOf.get(c.id) || [])]);
|
|
365
|
+
const mains = live.filter((c) => doneShown(c, display.done, now) && mainMatches(c, subsOf.get(c.id), filters));
|
|
366
|
+
// Finished cards hidden: no Done column (a card is still confirmed or finished from its dialog).
|
|
367
|
+
const columns = display.done === "hide" ? COLUMNS.filter((s) => s !== "done") : COLUMNS;
|
|
368
|
+
const toggleSubs = (id) => setExpanded({ ...expanded, [id]: !expanded[id] });
|
|
369
|
+
const empty = () => html`<${Empty} icon="tasks" title=${filters.length ? t("tasks.emptyFiltered") : t("tasks.emptyBoard")} hint=${filters.length || archived ? undefined : t("tasks.emptyBoardHint")} />`;
|
|
370
|
+
// Insights counts what the page shows. A list with sub-task rows shows exactly its rows (each matched by the filter, a
|
|
371
|
+
// finished one as Done shows it); the board, or a list without them, shows a main task with all its sub tasks.
|
|
372
|
+
const insightCards = () => (display.view === "list" && display.subs
|
|
373
|
+
? listRows(mains, subsOf, display, filters, now)
|
|
374
|
+
: mains.flatMap((c) => [c, ...(subsOf.get(c.id) || [])]));
|
|
375
|
+
const listBody = () => {
|
|
376
|
+
const rows = listRows(mains, subsOf, display, filters, now);
|
|
377
|
+
return rows.length === 0 ? empty() : html`<${ListView} rows=${rows} display=${display} subsOf=${subsOf} byId=${byId} flashed=${flashed} now=${now}
|
|
378
|
+
expanded=${expanded} onToggleSubs=${toggleSubs} onOpen=${onOpen} />`;
|
|
379
|
+
};
|
|
289
380
|
|
|
290
381
|
const dropping = useRef(false);
|
|
291
382
|
// A card moved from the keyboard is drawn again in its new place, and the focus it had goes with the old tile: give it
|
|
@@ -326,7 +417,7 @@ function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writab
|
|
|
326
417
|
if (e.key === "ArrowUp" && i > 0) void drop(card, card.status, column[i - 2]?.id ?? null, column[i - 1].id);
|
|
327
418
|
else if (e.key === "ArrowDown" && i < column.length - 1) void drop(card, card.status, column[i + 1].id, column[i + 2]?.id ?? null);
|
|
328
419
|
else if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
|
|
329
|
-
const to =
|
|
420
|
+
const to = columns[columns.indexOf(card.status) + (e.key === "ArrowLeft" ? -1 : 1)];
|
|
330
421
|
if (to) void drop(card, to, null, null);
|
|
331
422
|
}
|
|
332
423
|
}
|
|
@@ -362,36 +453,39 @@ function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writab
|
|
|
362
453
|
<span class="muted">${stats.mains === 1 ? t("tasks.mainOne") : t("tasks.mainCount", stats.mains)}</span>
|
|
363
454
|
${stats.waiting ? html`<span class="tb-flag st-review">${t("tasks.waiting", stats.waiting)}</span>` : null}
|
|
364
455
|
${stats.blocked ? html`<span class="tb-flag st-blocked">${t("tasks.blockedN", stats.blocked)}</span>` : null}
|
|
456
|
+
<button type="button" class="btn btn-ghost btn-sm tb-insights" title=${t("taskstats.buttonTip")} onClick=${() => setInsights(true)}><${Icon} name="chart" size=${16} />${t("taskstats.button")}</button>
|
|
365
457
|
</div>
|
|
366
458
|
<span class="tb-grow"></span>
|
|
367
|
-
<select class="tb-select" value=${assignee} aria-label=${t("tasks.filterLabel")} onChange=${(e) => setAssignee(e.target.value)}>
|
|
368
|
-
<option value="">${t("tasks.everyone")}</option>
|
|
369
|
-
<option value=${UNASSIGNED}>${t("tasks.nobody")}</option>
|
|
370
|
-
${names.map((n) => html`<option key=${n} value=${n}>${n}</option>`)}
|
|
371
|
-
</select>
|
|
372
459
|
<${InstancesButton} onClick=${onInstances} />
|
|
373
460
|
${archived || !writable ? null : html`<button type="button" class="btn btn-primary" onClick=${onCreate}><${Icon} name="plus" size=${16} />${t("tasks.newMain")}</button>`}
|
|
374
461
|
</div>
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
462
|
+
<div class="tb-view-bar">
|
|
463
|
+
<${FilterMenu} cards=${own} filters=${filters} onChange=${onFilters} />
|
|
464
|
+
<${DisplayMenu} display=${display} onChange=${onDisplay} />
|
|
465
|
+
<${FilterBar} cards=${own} filters=${filters} onChange=${onFilters} />
|
|
466
|
+
</div>
|
|
467
|
+
${display.view === "list" ? listBody() : mains.length === 0 && !drag ? empty()
|
|
468
|
+
: html`<div class="tb-scroll"><div class=${`tb-columns${columns.length < COLUMNS.length ? " no-done" : ""}`}>
|
|
469
|
+
${columns.map((status) => {
|
|
378
470
|
const list = mains.filter((c) => c.status === status);
|
|
379
471
|
const line = spot && spot.status === status ? spot.index : -1;
|
|
380
472
|
return html`<section key=${status} class=${`tb-col st-${status}${drag ? " can-drop" : ""}${line >= 0 ? " over" : ""}`} aria-label=${t(`tasks.${status}`)}
|
|
381
473
|
onDragOver=${(e) => over(e, status)} onDrop=${(e) => dropOn(e, status, list)}>
|
|
382
474
|
<h3 class="tb-col-head"><span class="tb-dot"></span>${t(`tasks.${status}`)}
|
|
383
|
-
${status === "done" ? html`<button type="button" class="tb-link" title=${t("tasks.toggleDone")} onClick=${() =>
|
|
475
|
+
${status === "done" ? html`<button type="button" class="tb-link" title=${t("tasks.toggleDone")} onClick=${() => onDisplay({ ...display, done: display.done === "all" ? "recent" : "all" })}>${display.done === "all" ? t("tasks.all") : t("tasks.recent")}</button>` : null}
|
|
384
476
|
<span class="tb-count">${list.length}</span></h3>
|
|
385
477
|
${cellItems(list, drag ? drag.id : null, line, (card, dragging) => {
|
|
386
478
|
const lit = Math.max(flashed.get(card.id) || 0, ...(subsOf.get(card.id) || []).map((s) => flashed.get(s.id) || 0));
|
|
387
479
|
return html`<${Tile} key=${card.id} card=${card} dragging=${dragging} flash=${now - lit < 4000} subs=${subsOf.get(card.id)} writable=${writable}
|
|
388
|
-
expanded=${!!expanded[card.id]} onToggleSubs=${() =>
|
|
480
|
+
expanded=${!!expanded[card.id]} onToggleSubs=${() => toggleSubs(card.id)}
|
|
389
481
|
onOpen=${onOpen} onKeyMove=${(e) => keyMove(card, e)}
|
|
390
482
|
onDragStart=${(e) => { e.dataTransfer.setData("text/plain", card.id); e.dataTransfer.effectAllowed = "move"; setDrag(card); }} onDragEnd=${end} />`;
|
|
391
483
|
})}
|
|
392
484
|
</section>`;
|
|
393
485
|
})}
|
|
394
486
|
</div></div>`}
|
|
487
|
+
${insights ? html`<${InsightsDialog} name=${project === NO_PROJECT ? t("tasks.noProject") : project.name} onClose=${() => setInsights(false)}
|
|
488
|
+
cards=${insightCards()} />` : null}
|
|
395
489
|
</div>`;
|
|
396
490
|
}
|
|
397
491
|
|
|
@@ -445,13 +539,7 @@ function Tile({ card, dragging, flash, subs = [], expanded, writable, onToggleSu
|
|
|
445
539
|
${progress.blocked ? html`<span class="tb-flag st-blocked"><${Icon} name="alert" size=${12} />${progress.blocked}</span>` : null}
|
|
446
540
|
<${Icon} name="chevron" size=${14} cls=${expanded ? "tb-chev open" : "tb-chev"} />
|
|
447
541
|
</button>` : null}
|
|
448
|
-
${hasSubs && expanded ? html
|
|
449
|
-
${subs.map((s) => html`<li key=${s.id}><button type="button" onClick=${() => onOpen(s.id)} title=${`${s.id} ${s.title} (${t(`tasks.${s.status}`)})`}>
|
|
450
|
-
<span class=${`tb-dot st-${s.status}`} aria-label=${t(`tasks.${s.status}`)}></span><span class="tb-code">${s.id}</span><span class="tb-sub-title">${s.title}</span>
|
|
451
|
-
${s.assignee ? html`<span class="tb-who">${s.assignee}</span>` : null}</button>
|
|
452
|
-
${s.status === "blocked" && s.blockedReason ? html`<div class="tb-sub-blocked">${s.blockedReason}</div>` : null}</li>`)}
|
|
453
|
-
${older > 0 ? html`<li class="muted tb-sub-more">${t("tasks.olderSubs", older)}</li>` : null}
|
|
454
|
-
</ul>` : null}
|
|
542
|
+
${hasSubs && expanded ? html`<${SubList} subs=${subs} older=${older} onOpen=${onOpen} />` : null}
|
|
455
543
|
${now ? html`<div class="tb-tile-now" title=${now.cards.map((c) => `${c.id} ${c.title}`).join("\n")}>
|
|
456
544
|
<span class=${`tb-now-label st-${now.tone}`}>${t(now.label)}</span><span class="tb-code">${now.cards[0].id}</span>
|
|
457
545
|
<span class="tb-now-title">${now.cards[0].title}</span>${now.cards.length > 1 ? html`<span class="muted">${t("tasks.moreCards", now.cards.length - 1)}</span>` : null}</div>` : null}
|
|
@@ -471,7 +559,7 @@ function Tile({ card, dragging, flash, subs = [], expanded, writable, onToggleSu
|
|
|
471
559
|
|
|
472
560
|
// ── Dialogs: a new main task, a project ───────────────────
|
|
473
561
|
|
|
474
|
-
function CreateMainDialog({ projects, project, onClose, onCreated }) {
|
|
562
|
+
function CreateMainDialog({ projects, project, boardOff = [], onClose, onCreated }) {
|
|
475
563
|
const { instances } = useStore(appStore);
|
|
476
564
|
const active = projects.filter((p) => !p.archived);
|
|
477
565
|
const [f, setF] = useState({ project: project === null || project === undefined ? "" : String(project), title: "", goal: "", scope: "", acceptance: "", context: "", size: "", priority: "normal", assignee: "", needsReview: true });
|
|
@@ -502,7 +590,7 @@ function CreateMainDialog({ projects, project, onClose, onCreated }) {
|
|
|
502
590
|
${field(t("tasks.definition"), html`<textarea rows="3" placeholder=${t("tasks.definitionHint")} value=${f.acceptance} onInput=${set("acceptance")}></textarea>`)}
|
|
503
591
|
${field(t("tasks.context"), html`<textarea rows="2" maxlength="1000" placeholder=${t("tasks.contextHint")} value=${f.context} onInput=${set("context")}></textarea>`)}
|
|
504
592
|
<div class="tb-form-row">
|
|
505
|
-
${field(t("tasks.assignee"), html`<select value=${f.assignee} onChange=${set("assignee")}><option value="">${t("tasks.nobody")}</option>${instances.map((i) => html
|
|
593
|
+
${field(t("tasks.assignee"), html`<select value=${f.assignee} onChange=${set("assignee")}><option value="">${t("tasks.nobody")}</option>${instances.map((i) => html`<${AssigneeOption} key=${i.name} name=${i.name} boardOff=${boardOff} />`)}</select>`)}
|
|
506
594
|
${field(t("tasks.size"), html`<select value=${f.size} onChange=${set("size")}><option value="">${t("tasks.sizeNone")}</option><option value="S">${t("tasks.sizeS")}</option><option value="M">${t("tasks.sizeM")}</option><option value="L">${t("tasks.sizeL")}</option></select>`)}
|
|
507
595
|
${field(t("tasks.priority"), html`<select value=${f.priority} onChange=${set("priority")}>${["urgent", "high", "normal", "low"].map((p) => html`<option key=${p} value=${p}>${t(`tasks.${p}`)}</option>`)}</select>`)}
|
|
508
596
|
</div>
|
package/dist/ui/fleet-usage.js
CHANGED
|
@@ -14,11 +14,20 @@ register("fusage", {
|
|
|
14
14
|
en: {
|
|
15
15
|
range: "Range", today: "Today", r7d: "7 days", month: "This month", all: "All", custom: "Custom", from: "From", to: "To", apply: "Apply",
|
|
16
16
|
group: "Group by", g_instance: "Agent", g_backend: "Backend", g_model: "Model", g_profile: "Credential profile", g_team: "Team (as configured now)",
|
|
17
|
-
csv: "Download CSV", basis: "API-equivalent at list price (
|
|
17
|
+
csv: "Download CSV", basis: "API-equivalent at list price ({0}) — not money spent.", basisMore: "Subscriptions are not billed per token.",
|
|
18
18
|
amount: "API-equivalent", input: "Input", output: "Output", reasoning: "Reasoning", read: "Cache read", write: "Cache write", total: "Total tokens", requests: "Requests", messages: "Messages",
|
|
19
19
|
notPriced: "not priced", partial: "partial", noTeam: "(no team)", unknown: "unknown",
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
// #3066 §3: what a row's numbers are, said once each as a small mark with its tooltip (never a pill per row).
|
|
21
|
+
t_not_priced: "Not priced: {0}", t_partial: "Part of this row's models have no price", t_write_unreported: "Codex/Muse don't report cache writes",
|
|
22
|
+
t_cost_reported: "Amount as the CLI reported it", t_estimated: "Estimated from text size (Kiro records no token counts)", t_reasoning_none: "Not reported by this CLI",
|
|
23
|
+
sourceNote: "Some hours were read before AgEnD recorded their backend and profile.", profileUnrecorded: "profile not recorded",
|
|
24
|
+
l_partial: "◐ partly priced", l_cost_reported: "† amount from the CLI", l_estimated: "≈ estimated",
|
|
25
|
+
// #3066 §2: output speed (Claude after the first token, Codex over the response window).
|
|
26
|
+
speed: "Speed", speedUnit: "{0} tok/s", speedCoverage: "{0} of {1} requests timed", speedSpread: "p10–p90: {0}–{1} tok/s",
|
|
27
|
+
speedNone: "no timing in its transcripts", speedByModel: "Speed by model",
|
|
28
|
+
speedBasis: "Output tokens ÷ the model's own response time (tool time excluded); method after tokdash.",
|
|
29
|
+
|
|
30
|
+
f_includes_estimates: "includes estimates (Kiro)", estimatedPart: "of which estimated: {0}",
|
|
22
31
|
scanning: "Scanning — totals may still grow.", updated: "Updated {0} · read every 10 min", since: "Collected since {0}", notYet: "Not collected yet",
|
|
23
32
|
refresh: "Refresh",
|
|
24
33
|
notMeasured: "Not measured", nm_credit_billed: "Kiro is credit-billed and records no tokens", nm_unsupported: "AgEnD can't read this CLI's usage yet", nm_no_data: "nothing read yet",
|
|
@@ -42,11 +51,18 @@ register("fusage", {
|
|
|
42
51
|
"zh-TW": {
|
|
43
52
|
range: "期間", today: "今天", r7d: "7 天", month: "本月", all: "全部", custom: "自訂", from: "從", to: "到", apply: "套用",
|
|
44
53
|
group: "分組", g_instance: "Agent", g_backend: "Backend", g_model: "模型", g_profile: "憑證 profile", g_team: "Team(依目前設定)",
|
|
45
|
-
csv: "下載 CSV", basis: "依牌價換算的 API
|
|
54
|
+
csv: "下載 CSV", basis: "依牌價換算的 API 等值({0})——不是實際花費。", basisMore: "訂閱方案不按 token 計費。",
|
|
46
55
|
amount: "API 等值", input: "輸入", output: "輸出", reasoning: "推理", read: "快取讀取", write: "快取寫入", total: "token 總計", requests: "請求數", messages: "訊息數",
|
|
47
56
|
notPriced: "未定價", partial: "部分", noTeam: "(不屬於任何 team)", unknown: "未知",
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
t_not_priced: "未定價:{0}", t_partial: "這一列有部分模型沒有價格", t_write_unreported: "Codex/Muse 不回報快取寫入",
|
|
58
|
+
t_cost_reported: "金額為 CLI 自行回報", t_estimated: "依文字長度估算(Kiro 不記錄 token 數)", t_reasoning_none: "這個 CLI 不回報",
|
|
59
|
+
sourceNote: "部分時段在 AgEnD 記錄 backend 與 profile 之前就已讀取。", profileUnrecorded: "未記錄 profile",
|
|
60
|
+
l_partial: "◐ 部分定價", l_cost_reported: "† 金額由 CLI 回報", l_estimated: "≈ 估算值",
|
|
61
|
+
speed: "速度", speedUnit: "{0} token/秒", speedCoverage: "{1} 個請求中有 {0} 個可計時", speedSpread: "p10–p90:{0}–{1} token/秒",
|
|
62
|
+
speedNone: "transcript 沒有計時資訊", speedByModel: "各模型速度",
|
|
63
|
+
speedBasis: "輸出 token ÷ 模型本身的回應時間(不含工具執行時間);方法參考 tokdash。",
|
|
64
|
+
|
|
65
|
+
f_includes_estimates: "含估算值(Kiro)", estimatedPart: "其中估算:{0}",
|
|
50
66
|
scanning: "掃描中——總數可能還會增加。", updated: "更新於 {0} · 每 10 分鐘讀取一次", since: "自 {0} 起收集", notYet: "尚未收集",
|
|
51
67
|
refresh: "重新整理",
|
|
52
68
|
notMeasured: "未量測", nm_credit_billed: "Kiro 以 credit 計費,不記錄 token", nm_unsupported: "AgEnD 目前還讀不到這個 CLI 的用量", nm_no_data: "尚未讀到任何資料",
|
|
@@ -95,10 +111,6 @@ export function keyText(group, key) {
|
|
|
95
111
|
return key;
|
|
96
112
|
}
|
|
97
113
|
const writes = (r) => (r.cacheWrite5m || 0) + (r.cacheWrite1h || 0) + (r.cacheWrite || 0);
|
|
98
|
-
function flagText(f, r) {
|
|
99
|
-
if (f === "not_priced") return tu("f_not_priced", (r.unpriced || []).join(", "));
|
|
100
|
-
return ["cache_write_not_reported", "source_unknown", "estimated", "includes_estimates", "cost_reported"].includes(f) ? tu(`f_${f}`) : f;
|
|
101
|
-
}
|
|
102
114
|
|
|
103
115
|
// ── CSV (design §4): the daily rows of this same answer; messages on their own rows (they are per agent, not per model).
|
|
104
116
|
const CSV_COLUMNS = ["date", "zone", "instance", "backend", "model", "tier", "profile", "input", "output", "reasoning", "cache_read", "cache_write_5m", "cache_write_1h", "cache_write", "requests", "messages", "amount", "basis", "flags", "estimated"];
|
|
@@ -318,25 +330,73 @@ function Heatmap({ report, dates }) {
|
|
|
318
330
|
</section>`;
|
|
319
331
|
}
|
|
320
332
|
|
|
321
|
-
|
|
333
|
+
/**
|
|
334
|
+
* A mark with what it means: shown as its sign, said (title, and aria-label for readers) as words. role="img" makes it
|
|
335
|
+
* nameable (#3067 review, Prism P3: aria-label is not allowed on a generic span).
|
|
336
|
+
*/
|
|
337
|
+
const mark = (sign, words, cls = "us-mark") => html`<span class=${cls} role="img" title=${words} aria-label=${words}>${sign}</span>`;
|
|
338
|
+
/** "—" that says why there is no number (nameable the same way). */
|
|
339
|
+
const dash = (words) => html`<span class="us-none" role="img" title=${words} aria-label=${words}>—</span>`;
|
|
340
|
+
/** The marks a row's numbers carry (#3066 §3): ◐ partly priced, † the CLI's own amount, ≈ estimated. */
|
|
341
|
+
export function rowMarks(r) {
|
|
342
|
+
const flags = r.flags || [];
|
|
343
|
+
return { partial: r.priced === "partial", cost: flags.includes("cost_reported"), est: flags.includes("estimated") || r.estimated === true,
|
|
344
|
+
writeUnreported: flags.includes("cache_write_not_reported") && writes(r) === 0, unpriced: r.amount === null || r.amount === undefined };
|
|
345
|
+
}
|
|
346
|
+
/** A profile as shown: Codex's older hours were never tagged with one. */
|
|
347
|
+
const profileText = (p) => (p === "unrecorded" ? tu("profileUnrecorded") : p);
|
|
348
|
+
|
|
349
|
+
function Row({ r, group, max, measure, cols }) {
|
|
322
350
|
const share = max > 0 ? Math.max(0.01, measure(r) / max) : 0;
|
|
323
|
-
const meta = [r.backends.join(", "), r.models.join(", "), r.profiles.join(", ")].filter(Boolean).join(" · ");
|
|
351
|
+
const meta = [r.backends.join(", "), r.models.join(", "), r.profiles.map(profileText).join(", ")].filter(Boolean).join(" · ");
|
|
352
|
+
const m = rowMarks(r);
|
|
353
|
+
// Estimated rows (Kiro): every number is an estimate — "≈" before each, the reason in its tooltip.
|
|
354
|
+
const num = (text) => (m.est ? html`${mark("≈", tu("t_estimated"), "us-mark us-approx")}${text}` : text);
|
|
355
|
+
const key = group === "profile" ? profileText(keyText(group, r.key)) : keyText(group, r.key);
|
|
324
356
|
return html`<tr class="us-row">
|
|
325
|
-
<th scope="row" class="us-name"><span class="mono">${
|
|
357
|
+
<th scope="row" class="us-name"><span class="mono">${key}</span>
|
|
326
358
|
<svg class="us-bar" aria-hidden="true"><rect class="us-bar-bg" width="100%" height="6" rx="3" /><rect class="us-bar-fg" width=${`${Math.round(share * 100)}%`} height="6" rx="3" /></svg>
|
|
327
|
-
${group !== "instance" || meta ? html`<span class="us-meta">${meta}</span>` : null}
|
|
328
|
-
|
|
329
|
-
<td data-label=${tu("
|
|
330
|
-
<td data-label=${tu("
|
|
331
|
-
|
|
332
|
-
<td data-label=${tu("
|
|
333
|
-
<td data-label=${tu("
|
|
334
|
-
<td data-label=${tu("
|
|
335
|
-
<td data-label=${tu("total")} class="num">${tokens(r.total)}</td>
|
|
359
|
+
${group !== "instance" || meta ? html`<span class="us-meta">${meta}</span>` : null}</th>
|
|
360
|
+
<td data-label=${tu("amount")} class=${`num${m.unpriced ? " muted" : ""}`}>${m.unpriced ? dash(tu("t_not_priced", (r.unpriced || []).join(", "))) : html`${num(money(r.amount))}${m.partial ? mark("◐", tu("t_partial")) : null}${m.cost ? mark("†", tu("t_cost_reported")) : null}`}</td>
|
|
361
|
+
<td data-label=${tu("input")} class="num">${num(tokens(r.input))}</td>
|
|
362
|
+
<td data-label=${tu("output")} class="num">${num(tokens(r.output))}</td>
|
|
363
|
+
${cols.reasoning ? html`<td data-label=${tu("reasoning")} class="num">${r.reasoningReported === false ? dash(tu("t_reasoning_none")) : num(tokens(r.reasoning || 0))}</td>` : null}
|
|
364
|
+
<td data-label=${tu("read")} class="num">${num(tokens(r.cacheRead))}</td>
|
|
365
|
+
<td data-label=${tu("write")} class="num">${m.writeUnreported ? dash(tu("t_write_unreported")) : num(tokens(writes(r)))}</td>
|
|
366
|
+
<td data-label=${tu("total")} class="num">${num(tokens(r.total))}</td>
|
|
336
367
|
<td data-label=${tu("requests")} class="num">${n(r.requests)}</td>
|
|
337
|
-
|
|
368
|
+
${cols.messages ? html`<td data-label=${tu("messages")} class="num">${r.messages === null ? "—" : n(r.messages)}</td>` : null}
|
|
369
|
+
${cols.speed ? html`<td data-label=${tu("speed")} class="num">${r.speed ? speedText(r.speed) : dash(tu("speedNone"))}</td>` : null}
|
|
338
370
|
</tr>`;
|
|
339
371
|
}
|
|
372
|
+
/** #3066 §2: a rate as shown — whole tok/s, one decimal below 10. */
|
|
373
|
+
export const speedText = (s) => tu("speedUnit", s.tokPerSec >= 10 ? Math.round(s.tokPerSec).toLocaleString("en-US") : s.tokPerSec.toFixed(1));
|
|
374
|
+
/** Columns worth a place (#3066 §3): Reasoning only when some row reports it; Messages only when some row has them; Speed (§2) only when some response was timed. */
|
|
375
|
+
export function usageColumns(rows) {
|
|
376
|
+
return { reasoning: rows.some((r) => r.reasoningReported !== false), messages: rows.some((r) => r.messages !== null && r.messages !== undefined),
|
|
377
|
+
speed: rows.some((r) => !!r.speed) };
|
|
378
|
+
}
|
|
379
|
+
/** #3066 §2: each model's speed — rate · requests timed (coverage) · p10–p90 from 30 timed. */
|
|
380
|
+
function SpeedCard({ report }) {
|
|
381
|
+
const list = report.speedByModel || [];
|
|
382
|
+
if (!list.length) return null;
|
|
383
|
+
return html`<section class="us-speed card" aria-labelledby="us-speed-h">
|
|
384
|
+
<h3 id="us-speed-h">${tu("speedByModel")}</h3>
|
|
385
|
+
<ul class="rows">${list.map((m) => html`<li key=${m.model} class="row-item"><span class="grow strong mono">${m.model}</span>
|
|
386
|
+
<span class="num">${speedText(m.speed)}</span>
|
|
387
|
+
<span class="muted">${[m.requests > 0 ? tu("speedCoverage", n(m.speed.timedRequests), n(m.requests)) : null,
|
|
388
|
+
m.speed.p10 !== null && m.speed.p90 !== null ? tu("speedSpread", Math.round(m.speed.p10), Math.round(m.speed.p90)) : null].filter(Boolean).join(" · ")}</span></li>`)}</ul>
|
|
389
|
+
<p class="note">${tu("speedBasis")}</p>
|
|
390
|
+
</section>`;
|
|
391
|
+
}
|
|
392
|
+
/** The legend under the table: only the marks that appear, and the one footnote when an hour's source was not recorded. */
|
|
393
|
+
function Legend({ rows }) {
|
|
394
|
+
const marks = rows.map(rowMarks);
|
|
395
|
+
const parts = [marks.some((m) => m.partial) && tu("l_partial"), marks.some((m) => m.cost) && tu("l_cost_reported"), marks.some((m) => m.est) && tu("l_estimated")].filter(Boolean);
|
|
396
|
+
const source = rows.some((r) => (r.flags || []).includes("source_unknown"));
|
|
397
|
+
if (!parts.length && !source) return null;
|
|
398
|
+
return html`<p class="note us-key">${parts.join(" · ")}${parts.length && source ? html`<br />` : null}${source ? tu("sourceNote") : null}</p>`;
|
|
399
|
+
}
|
|
340
400
|
|
|
341
401
|
/** The tab's body for one answer of GET /ui/usage-report. */
|
|
342
402
|
export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
|
|
@@ -355,6 +415,7 @@ export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
|
|
|
355
415
|
const zones = zonesChanged(report);
|
|
356
416
|
const csvFrom = report.dailyTruncated ? report.dailyFrom : report.range.kind === "all" ? "all" : report.range.from;
|
|
357
417
|
const rows = report.rows.filter((r) => r.total > 0 || (r.messages || 0) > 0);
|
|
418
|
+
const cols = usageColumns(rows);
|
|
358
419
|
const anyAmount = rows.some((r) => r.amount !== null && r.amount > 0);
|
|
359
420
|
const measure = (r) => (anyAmount ? r.amount || 0 : r.total);
|
|
360
421
|
const max = Math.max(0, ...rows.map(measure));
|
|
@@ -375,7 +436,7 @@ export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
|
|
|
375
436
|
<label>${tu("from")} <input type="date" value=${draft.from} max=${draft.to} onInput=${(e) => setDraft({ ...draft, from: e.target.value })} /></label>
|
|
376
437
|
<label>${tu("to")} <input type="date" value=${draft.to} min=${draft.from} onInput=${(e) => setDraft({ ...draft, to: e.target.value })} /></label>
|
|
377
438
|
<button type="submit" class="btn btn-sm">${tu("apply")}</button></form>` : null}
|
|
378
|
-
<p class="us-basis" role="note">${tu("basis", report.pricesChecked)}</p>
|
|
439
|
+
<p class="us-basis" role="note" title=${tu("basisMore")}>${tu("basis", report.pricesChecked)}</p>
|
|
379
440
|
${noDaily ? html`<p class="us-partial" role="status">${tu("noDaily")}</p>` : report.dailyTruncated ? html`<p class="us-partial" role="status">${tu("partialDays", report.dailyFrom)}</p>` : null}
|
|
380
441
|
${zones ? html`<p class="us-partial" role="status">${tu("zoneChanged", zones.join(", "), report.zone)}</p>` : null}
|
|
381
442
|
<p class="note us-fresh">${tu("updated", new Date(fetchedAt).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }))} · ${Number.isFinite(since) ? tu("since", new Date(since).toLocaleDateString()) : tu("notYet")} · ${tu("zoneNote", report.zone)}${group === "team" ? ` ${tu("teamsNote")}` : ""}
|
|
@@ -389,10 +450,12 @@ export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
|
|
|
389
450
|
<div class="ch-metric"><dt>${tu("messages")}</dt><dd>${report.totals.messages === null ? "—" : n(report.totals.messages)}</dd></div>
|
|
390
451
|
</dl>
|
|
391
452
|
${rows.length ? html`<table class="us-table"><thead><tr><th scope="col">${tu(`g_${group}`)}</th><th scope="col" class="num">${tu("amount")}</th>
|
|
392
|
-
<th scope="col" class="num">${tu("input")}</th><th scope="col" class="num">${tu("output")}</th
|
|
393
|
-
<th scope="col" class="num">${tu("total")}</th><th scope="col" class="num">${tu("requests")}</th
|
|
394
|
-
<tbody>${rows.map((r) => html`<${Row} key=${r.key} r=${r} group=${group} max=${max} measure=${measure} />`)}</tbody></table
|
|
453
|
+
<th scope="col" class="num">${tu("input")}</th><th scope="col" class="num">${tu("output")}</th>${cols.reasoning ? html`<th scope="col" class="num">${tu("reasoning")}</th>` : null}<th scope="col" class="num">${tu("read")}</th><th scope="col" class="num">${tu("write")}</th>
|
|
454
|
+
<th scope="col" class="num">${tu("total")}</th><th scope="col" class="num">${tu("requests")}</th>${cols.messages ? html`<th scope="col" class="num">${tu("messages")}</th>` : null}${cols.speed ? html`<th scope="col" class="num">${tu("speed")}</th>` : null}</tr></thead>
|
|
455
|
+
<tbody>${rows.map((r) => html`<${Row} key=${r.key} r=${r} group=${group} max=${max} measure=${measure} cols=${cols} />`)}</tbody></table>
|
|
456
|
+
<${Legend} rows=${rows} />`
|
|
395
457
|
: html`<p class="note">${tu("noRows")}</p>`}
|
|
458
|
+
<${SpeedCard} report=${report} />
|
|
396
459
|
<${Trend} report=${report} dates=${dates} />
|
|
397
460
|
<${Heatmap} report=${report} dates=${dates} />`}
|
|
398
461
|
${report.notMeasured.length || report.shared.length ? html`<section class="us-rest" aria-labelledby="us-rest-h"><h3 id="us-rest-h">${tu("notMeasured")}</h3>
|
|
@@ -1,40 +1,3 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
// is never opened or framed on the dashboard's origin.
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* #2863: the sizes a preview takes (UTF-8 bytes of the HTML), the same as a block's (preview.js LIMITS): up to ASK it
|
|
8
|
-
* runs at once; above it the person is asked first ("Preview anyway?"); above MAX there is no preview, only the
|
|
9
|
-
* download. MAX is the frame's own ceiling (web-preview.ts PREVIEW_HTML_MAX_BYTES).
|
|
10
|
-
*/
|
|
11
|
-
export const HTML_PREVIEW_ASK = 8 * 1024 * 1024;
|
|
12
|
-
export const HTML_PREVIEW_MAX = 50 * 1024 * 1024;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Read an attachment's HTML: { ok: true, code } or { ok: false, reason } with reason "large" (above `ask` and not
|
|
16
|
-
* `anyway`: nothing is fetched when its listed size says so; `size` is what it is), "over" (above `max`: its listed size
|
|
17
|
-
* is checked before anything is fetched, the bytes again after), "gone" (the fleet no longer serves that id — the file
|
|
18
|
-
* changed, or the fleet restarted), or "failed". The text card reads with its own, single cap (ask = max).
|
|
19
|
-
*/
|
|
20
|
-
export async function loadHtmlAttachment(att, fetchImpl = globalThis.fetch, { ask = HTML_PREVIEW_ASK, max = HTML_PREVIEW_MAX, anyway = false } = {}) {
|
|
21
|
-
if (!att || typeof att.id !== "string" || !/^[0-9a-f]{32}$/.test(att.id)) return { ok: false, reason: "failed" };
|
|
22
|
-
if (typeof att.size === "number" && att.size > max) return { ok: false, reason: "over" };
|
|
23
|
-
if (typeof att.size === "number" && att.size > ask && !anyway) return { ok: false, reason: "large", size: att.size };
|
|
24
|
-
let res;
|
|
25
|
-
try { res = await fetchImpl(`/ui/file/${att.id}`, { credentials: "same-origin", cache: "no-store" }); }
|
|
26
|
-
catch { return { ok: false, reason: "failed" }; }
|
|
27
|
-
if (!res || !res.ok) return { ok: false, reason: res && res.status === 404 ? "gone" : "failed" };
|
|
28
|
-
let bytes;
|
|
29
|
-
try { bytes = await res.arrayBuffer(); } catch { return { ok: false, reason: "failed" }; }
|
|
30
|
-
if (bytes.byteLength > max) return { ok: false, reason: "over" };
|
|
31
|
-
if (bytes.byteLength > ask && !anyway) return { ok: false, reason: "large", size: bytes.byteLength };
|
|
32
|
-
// UTF-8, as a block's text is; a BOM is dropped.
|
|
33
|
-
return { ok: true, code: new TextDecoder("utf-8").decode(bytes) };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** #2863: a size as the person reads it: "12.3 MB" (1 MB = 1024 × 1024 bytes, as the caps are). */
|
|
37
|
-
export function sizeLabel(bytes) {
|
|
38
|
-
const mb = bytes / (1024 * 1024);
|
|
39
|
-
return `${mb >= 10 ? Math.round(mb) : Math.round(mb * 10) / 10} MB`;
|
|
40
|
-
}
|
|
1
|
+
// Hub PR A (#3226): this module moved to /assets/html-attachment.js (src/ui/shared/), shared by the fleet and the Hub. A tab opened
|
|
2
|
+
// before the move still imports it from here: the same module (one instance), re-exported.
|
|
3
|
+
export * from "/assets/html-attachment.js";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Lazy, fixed local-owner copy for the representative-agent share (docs/design/hub-representative-agent.md).
|
|
2
|
+
// A member switcher may retain the old hub-strings module before Settings loads. Own these new words here.
|
|
3
|
+
import { register } from "/assets/app-i18n.js";
|
|
4
|
+
register("hub", {
|
|
5
|
+
en: {
|
|
6
|
+
agentLead: "Every agent is private unless you share it. A shared agent answers Hub questions in its own conversation, with its own folder and the tools its Settings allow. Actions that need approval still come to you.",
|
|
7
|
+
agentShared: "Shared: Hub questions go to this agent's own conversation.",
|
|
8
|
+
republishRequired: "Shared under the older restricted mode. Hub questions are refused until you share this agent again.",
|
|
9
|
+
shareAgain: "Share again",
|
|
10
|
+
agentNotShareable: "This agent can't be shared right now. Reload the page and try again.",
|
|
11
|
+
agentDeliveryUnavailable: "Sharing isn't available on this fleet yet: Hub questions can't reach an agent here.",
|
|
12
|
+
},
|
|
13
|
+
"zh-TW": {
|
|
14
|
+
agentLead: "每個 Agent 預設都不公開。公開後,Agent 會在自己的對話中回答 Hub 的提問,使用它自己的資料夾和設定允許的工具。需要核准的動作仍會交給你。",
|
|
15
|
+
agentShared: "已公開:Hub 的提問會送到這個 Agent 自己的對話。",
|
|
16
|
+
republishRequired: "這是舊的受限模式公開。重新公開這個 Agent 之前,Hub 的提問都會被拒絕。",
|
|
17
|
+
shareAgain: "重新公開",
|
|
18
|
+
agentNotShareable: "目前無法公開這個 Agent。請重新整理頁面後再試一次。",
|
|
19
|
+
agentDeliveryUnavailable: "這個 Fleet 還不能公開:Hub 的提問目前無法送到這裡的 Agent。",
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
/** What a Share sends: the agent itself, no Hub tools (agent-mode.ts on the member). */
|
|
23
|
+
export const AGENT_CHOICE = Object.freeze({ dataViewId: "agent", tools: Object.freeze([]) });
|