@aeolus-fleet/gateway 0.38.2 → 0.38.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/prisma/fleet-forgetter.d.ts +1 -1
- package/dist/adapters/prisma/fleet-forgetter.js +2 -2
- package/dist/adapters/prisma/fleet-forgetter.js.map +1 -1
- package/dist/adapters/prisma/generated/browser.d.ts +10 -0
- package/dist/adapters/prisma/generated/client.d.ts +10 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +22 -0
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +172 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +19 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +21 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +19 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/QuietHours.d.ts +1102 -0
- package/dist/adapters/prisma/generated/models/QuietHours.js +2 -0
- package/dist/adapters/prisma/generated/models/QuietHours.js.map +1 -0
- package/dist/adapters/prisma/generated/models/QuietShip.d.ts +1031 -0
- package/dist/adapters/prisma/generated/models/QuietShip.js +2 -0
- package/dist/adapters/prisma/generated/models/QuietShip.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +2 -0
- package/dist/adapters/prisma/quiet-preferences.d.ts +12 -0
- package/dist/adapters/prisma/quiet-preferences.js +49 -0
- package/dist/adapters/prisma/quiet-preferences.js.map +1 -0
- package/dist/adapters/trpc/router.d.ts +76 -0
- package/dist/adapters/trpc/router.js +35 -0
- package/dist/adapters/trpc/router.js.map +1 -1
- package/dist/app.js +15 -2
- package/dist/app.js.map +1 -1
- package/dist/core/argo-inbox/wake-for-argo.d.ts +3 -1
- package/dist/core/argo-inbox/wake-for-argo.js +10 -2
- package/dist/core/argo-inbox/wake-for-argo.js.map +1 -1
- package/dist/core/people/inbox-entry.d.ts +3 -1
- package/dist/core/people/inbox-entry.js +2 -2
- package/dist/core/people/inbox-entry.js.map +1 -1
- package/dist/core/people/person-wakes.d.ts +9 -2
- package/dist/core/people/person-wakes.js +10 -2
- package/dist/core/people/person-wakes.js.map +1 -1
- package/dist/core/people/quiet-hours.d.ts +40 -0
- package/dist/core/people/quiet-hours.js +65 -0
- package/dist/core/people/quiet-hours.js.map +1 -0
- package/dist/core/people/quiet-ships.d.ts +40 -0
- package/dist/core/people/quiet-ships.js +24 -0
- package/dist/core/people/quiet-ships.js.map +1 -0
- package/dist/core/people/read-quiet-among.d.ts +15 -0
- package/dist/core/people/read-quiet-among.js +15 -0
- package/dist/core/people/read-quiet-among.js.map +1 -0
- package/dist/core/people/read-quiet-hours.d.ts +30 -0
- package/dist/core/people/read-quiet-hours.js +35 -0
- package/dist/core/people/read-quiet-hours.js.map +1 -0
- package/dist/core/people/read-quiet-ships.d.ts +26 -0
- package/dist/core/people/read-quiet-ships.js +19 -0
- package/dist/core/people/read-quiet-ships.js.map +1 -0
- package/dist/core/people/set-quiet-hours.d.ts +21 -0
- package/dist/core/people/set-quiet-hours.js +24 -0
- package/dist/core/people/set-quiet-hours.js.map +1 -0
- package/dist/core/people/turn-ship-quiet.d.ts +24 -0
- package/dist/core/people/turn-ship-quiet.js +25 -0
- package/dist/core/people/turn-ship-quiet.js.map +1 -0
- package/dist/core/people/wake-person.d.ts +10 -1
- package/dist/core/people/wake-person.js +18 -2
- package/dist/core/people/wake-person.js.map +1 -1
- package/dist/core/shared/errors.d.ts +1 -1
- package/dist/core/shared/errors.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/prisma/migrations/20261111090000_quiet_preferences/migration.sql +27 -0
- package/src/adapters/prisma/schema.prisma +28 -0
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +3 -3
- package/web/.next/diagnostics/route-bundle-stats.json +65 -65
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/basket/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/bridge/basket/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/basket/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/bridge/done/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/done/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/fleet/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/fleet/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/messages/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/(bridge)/bridge/messages/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/messages/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/bridge/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(bridge)/bridge/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/requests/[requestId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page/server-reference-manifest.json +7 -7
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/settings/routing/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/bridge/stay-aware/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/change/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(bridge)/outside-parties/[name]/change/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/change/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/page/server-reference-manifest.json +10 -10
- package/web/.next/server/app/(bridge)/outside-parties/[name]/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/retire/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(bridge)/outside-parties/[name]/retire/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/[name]/retire/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add/page/server-reference-manifest.json +12 -12
- package/web/.next/server/app/(bridge)/outside-parties/add/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-agent/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-agent/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-agent/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-client/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-client/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/add-a2a-client/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/page/server-reference-manifest.json +4 -4
- package/web/.next/server/app/(bridge)/outside-parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(bridge)/outside-parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/gateway-off/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/gateway-off/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/(console)/meetings/[meetingId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/meetings/[meetingId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/parties/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/(console)/parties/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/parties/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/sign-in/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/disconnect/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/disconnect/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/expose/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/expose/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/expose/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(console)/slack/remove/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/(console)/slack/remove/page.js.nft.json +1 -1
- package/web/.next/server/app/(console)/slack/remove/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/failed/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/failed/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/failed/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/pick/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/pick/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/pick/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page.js.nft.json +1 -1
- package/web/.next/server/app/authorize/waiting/approval/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js +1 -1
- package/web/.next/server/chunks/ssr/01fr_app_(bridge)_bridge_settings_requests_[requestId]_page_actions_0o8g7_xshtmem.js.map +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_messages_page_actions_1tg2-lw0i6g9l.js +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_messages_page_actions_1tg2-lw0i6g9l.js.map +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_settings_page_actions_0_te6h-2xxp7l.js +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_settings_page_actions_0_te6h-2xxp7l.js.map +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js +1 -1
- package/web/.next/server/chunks/ssr/0b9d__next-internal_server_app_(bridge)_bridge_stay-aware_page_actions_1u0xo0v3y9c34.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_bridge_settings_routing_page_actions_06_j7s24dy5ee.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_change_page_actions_1is-kjq5bubl4.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_change_page_actions_1is-kjq5bubl4.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_page_actions_1mctxtlzsa7xi.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_page_actions_1mctxtlzsa7xi.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_retire_page_actions_0xh6ok1un7s9k.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_[name]_retire_page_actions_0xh6ok1un7s9k.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add-a2a-agent_page_actions_1w1q5eavo_loo.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add-a2a-agent_page_actions_1w1q5eavo_loo.js.map +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add_page_actions_0urcbg_r0lo7j.js +1 -1
- package/web/.next/server/chunks/ssr/0vkm_server_app_(bridge)_outside-parties_add_page_actions_0urcbg_r0lo7j.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04g-10_lwy-l2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ovcg5tg3nh49._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ovcg5tg3nh49._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ro-majrw7piv._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0ro-majrw7piv._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0zz6fx0keti4r._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0zz6fx0keti4r._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__18-8taiduk1jn._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19p4g16n2nh0b._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19p4g16n2nh0b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1ncn4wx-1i09m._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1ncn4wx-1i09m._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1vrtfw4dxnfxt._.js +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js +1 -1
- package/web/.next/server/chunks/ssr/_00hfzlqn1og18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0_nfv33ug5g31._.js +1 -1
- package/web/.next/server/chunks/ssr/_0_nfv33ug5g31._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js +1 -1
- package/web/.next/server/chunks/ssr/_0ka_9elusb800._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0-785idcov4j4._.js → _0nz6sbd5qnb97._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_17pnprd-0lxai._.js.map → _0nz6sbd5qnb97._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js +1 -1
- package/web/.next/server/chunks/ssr/_0pyd1_y7w8ngp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_17pnprd-0lxai._.js → _0tvjhfjjhmllr._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0-785idcov4j4._.js.map → _0tvjhfjjhmllr._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js +1 -1
- package/web/.next/server/chunks/ssr/_0xickgbbju_9-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0nh9w3mh82f53._.js → _13b33o-hvhs42._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1q5o7l5d6r_f5._.js.map → _13b33o-hvhs42._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1cs_0d0h7mhw0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1cs_0d0h7mhw0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1q5o7l5d6r_f5._.js → _1j8eks4eyxdp2._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0nh9w3mh82f53._.js.map → _1j8eks4eyxdp2._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1l2qxsuvs6qro._.js +3 -0
- package/web/.next/server/chunks/ssr/{_1cxulh-x54r6v._.js.map → _1l2qxsuvs6qro._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1pd7s9yymb567._.js +57 -0
- package/web/.next/server/chunks/ssr/_1pd7s9yymb567._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js +1 -1
- package/web/.next/server/chunks/ssr/_1pjtire7rqla0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1preuo1e_lntw._.js +3 -0
- package/web/.next/server/chunks/ssr/{_1j80let80btdj._.js.map → _1preuo1e_lntw._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js +1 -1
- package/web/.next/server/chunks/ssr/_1qbsmlji34yph._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_20soyq-dwc131._.js +57 -0
- package/web/.next/server/chunks/ssr/_20soyq-dwc131._.js.map +1 -0
- package/web/.next/server/chunks/ssr/web_0a9n7acgjrk5c._.js +1 -1
- package/web/.next/server/chunks/ssr/web_0a9n7acgjrk5c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_1vvrekkq5mirt._.js +1 -1
- package/web/.next/server/chunks/ssr/web_1vvrekkq5mirt._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_basket_page_actions_0g7q_rc5nma1e.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_done_page_actions_0kjm34arntdzv.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_fleet_page_actions_19wmo6phgvqfk.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_fleet_page_actions_19wmo6phgvqfk.js.map +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js +1 -1
- package/web/.next/server/chunks/ssr/web__next-internal_server_app_(bridge)_bridge_page_actions_1ok64rg3edm_u.js.map +1 -1
- package/web/.next/server/chunks/ssr/{web_features_1kv2-nwrqcvkb._.js → web_features_0r6fdx9tk4lfm._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_1kv2-nwrqcvkb._.js.map → web_features_0r6fdx9tk4lfm._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{web_features_1ldqjm-0yawn-._.js → web_features_115v4ed7e_b-8._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_1ldqjm-0yawn-._.js.map → web_features_115v4ed7e_b-8._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-agent_ui_a2a-agent-form_tsx_0z8t1aalwzyl7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-a2a-client_ui_a2a-client-form_tsx_1anv88g385nwe._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_add-server_ui_add-server_tsx_1jnmar5xju49k._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{web_features_bridge_1kjza9vdof095._.js → web_features_bridge_0cugt1x2wt4m0._.js} +2 -2
- package/web/.next/server/chunks/ssr/{web_features_bridge_1kjza9vdof095._.js.map → web_features_bridge_0cugt1x2wt4m0._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_hooks_bridge-actions_ts_0h-_xm2rcb-ij._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_basket-panel_tsx_1qi_kzld0rfgs._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_decision-panel_tsx_1mzsixgc8zuxc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_done-panel_tsx_1m844-qb1z9p_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_message-rows_tsx_1ky4-xa4az_yu._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_message-rows_tsx_1ky4-xa4az_yu._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_messages-panel_tsx_1yvr_ww639d25._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_bridge_state_messages-panel_tsx_1yvr_ww639d25._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_meeting_state_meeting-controls_tsx_12g4kzk2mbvvz._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-parties_ui_switch-card_tsx_1_xnu9bm4tc-_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/web_features_outside-party_actions_ts_102ar5pdowf8s._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_parties_actions_ts_0r-tbfsig2ty-._.js +1 -1
- package/web/.next/server/chunks/ssr/web_features_slack_actions_ts_1l3yg9vl20_vu._.js +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/preview-props.json +3 -3
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +50 -50
- package/web/.next/static/chunks/{1-fz8siz2ll12.js → 0-r1bwsrnja6x.js} +1 -1
- package/web/.next/static/chunks/{2h_eln166j2qm.js → 0fm-6zl5hm5-9.js} +1 -1
- package/web/.next/static/chunks/{0u8l5qlnqqouz.js → 0iu2ts1oy1nzi.js} +1 -1
- package/web/.next/static/chunks/{0mgpgj4c1qyd-.js → 0yx6w-_36c76d.js} +1 -1
- package/web/.next/static/chunks/{0r0gremjx2f00.js → 1mke3ztpr-wmu.js} +1 -1
- package/web/.next/static/chunks/{0d9nwi_5jtx1s.js → 1nicl2mkstipv.js} +1 -1
- package/web/.next/static/chunks/{2xewn4wc6-r89.js → 1t0fq-vepg52w.js} +1 -1
- package/web/.next/static/chunks/{2zy50m3u0ncal.js → 1xzhbir4zphli.js} +1 -1
- package/web/.next/static/chunks/{2uyfitze_si6t.js → 1zy3y1lvr38g4.js} +1 -1
- package/web/.next/static/chunks/{1qk1rg1nlwibf.js → 2-wl7cajj-ynx.js} +4 -4
- package/web/.next/static/chunks/{1gws30z-w_b5u.js → 2a8ce88qvmtth.js} +1 -1
- package/web/.next/static/chunks/{3qx9pxz84tr19.js → 2o5u1c-wzvbgm.js} +1 -1
- package/web/.next/static/chunks/{1l7xdbkkzyg84.js → 2rtc0exjb6w5l.js} +1 -1
- package/web/.next/static/chunks/{3vslm1-mw-xs2.js → 2s1d7_ca-qsif.js} +1 -1
- package/web/.next/static/chunks/{363hplgln_a8l.js → 39m3_x0v7i-za.js} +1 -1
- package/web/.next/static/chunks/{2bwa_vmicucp7.js → 3_jnl679rr4gb.js} +1 -1
- package/web/.next/static/chunks/{3jmofkmbej71o.js → 3ool2gtdd_dtc.js} +1 -1
- package/web/.next/static/chunks/{3_pcw5v326or4.js → 3z9siyl43u-rb.js} +1 -1
- package/web/.next/static/chunks/{1y0i5sfbser7m.js → 3zqj28w22cklq.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/_1cxulh-x54r6v._.js +0 -3
- package/web/.next/server/chunks/ssr/_1j80let80btdj._.js +0 -3
- package/web/.next/server/chunks/ssr/_1unzgziqo0j03._.js +0 -57
- package/web/.next/server/chunks/ssr/_1unzgziqo0j03._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1yy6lx5ur8mbz._.js +0 -57
- package/web/.next/server/chunks/ssr/_1yy6lx5ur8mbz._.js.map +0 -1
- /package/web/.next/static/{EmsE5wPdK7fJYQ7DzIz5z → vYCXAc7TLc4U7-Vynu6VC}/_buildManifest.js +0 -0
- /package/web/.next/static/{EmsE5wPdK7fJYQ7DzIz5z → vYCXAc7TLc4U7-Vynu6VC}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{EmsE5wPdK7fJYQ7DzIz5z → vYCXAc7TLc4U7-Vynu6VC}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
const MINUTES_PER_DAY = 24 * 60;
|
|
4
|
+
const MS_PER_MINUTE = 60_000;
|
|
5
|
+
const isMinuteOfDay = (minute) => Number.isInteger(minute) && minute >= 0 && minute < MINUTES_PER_DAY;
|
|
6
|
+
function isKnownTimeZone(timeZone) {
|
|
7
|
+
try {
|
|
8
|
+
new Intl.DateTimeFormat('en-US', { timeZone });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** A quiet window, refused when either end is not a minute of the day, both ends are one, or the time zone is unknown. */
|
|
16
|
+
export function quietWindowOf(window) {
|
|
17
|
+
const { fromMinute, toMinute, timeZone } = window;
|
|
18
|
+
if (!isMinuteOfDay(fromMinute) || !isMinuteOfDay(toMinute)) {
|
|
19
|
+
return refuse('INVALID_QUIET_HOURS', 'Quiet hours start and end at a time of the day');
|
|
20
|
+
}
|
|
21
|
+
if (fromMinute === toMinute) {
|
|
22
|
+
return refuse('INVALID_QUIET_HOURS', 'Quiet hours end at another time than they start');
|
|
23
|
+
}
|
|
24
|
+
if (!isKnownTimeZone(timeZone)) {
|
|
25
|
+
return refuse('INVALID_QUIET_HOURS', `No time zone is named ${timeZone}`);
|
|
26
|
+
}
|
|
27
|
+
return ok({ fromMinute, toMinute, timeZone });
|
|
28
|
+
}
|
|
29
|
+
function localTimeOf(instant, timeZone) {
|
|
30
|
+
const parts = new Intl.DateTimeFormat('en-US', { timeZone, hourCycle: 'h23', year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric' }).formatToParts(instant);
|
|
31
|
+
const part = (type) => Number(parts.find((each) => each.type === type)?.value);
|
|
32
|
+
const [year, month, day, hour, minute] = [part('year'), part('month'), part('day'), part('hour'), part('minute')];
|
|
33
|
+
return { year, month, day, minute: hour * 60 + minute, asUtcMs: Date.UTC(year, month - 1, day, hour, minute) };
|
|
34
|
+
}
|
|
35
|
+
/** How far the time zone's clock is ahead of UTC at the instant. */
|
|
36
|
+
function offsetMsAt(instantMs, timeZone) {
|
|
37
|
+
const floored = Math.floor(instantMs / MS_PER_MINUTE) * MS_PER_MINUTE;
|
|
38
|
+
return localTimeOf(new Date(floored), timeZone).asUtcMs - floored;
|
|
39
|
+
}
|
|
40
|
+
/** The instant the time zone's clock shows the minute on the day, the day counted from the local day given. */
|
|
41
|
+
function instantAt(local, { dayOffset, minute, timeZone }) {
|
|
42
|
+
const asUtcMs = Date.UTC(local.year, local.month - 1, local.day + dayOffset, 0, minute);
|
|
43
|
+
// The offset at a first guess, then at the instant it gives, so a change of the clocks in between is taken.
|
|
44
|
+
const guess = asUtcMs - offsetMsAt(asUtcMs, timeZone);
|
|
45
|
+
return new Date(asUtcMs - offsetMsAt(guess, timeZone));
|
|
46
|
+
}
|
|
47
|
+
/** The quiet hours in effect at the instant, or none while they are off or the instant is outside them. */
|
|
48
|
+
export function quietSpellAt(hours, now) {
|
|
49
|
+
if (!hours.isOn) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const { fromMinute, toMinute, timeZone } = hours;
|
|
53
|
+
const local = localTimeOf(now, timeZone);
|
|
54
|
+
const isCrossingMidnight = fromMinute > toMinute;
|
|
55
|
+
const isAfterStart = local.minute >= fromMinute;
|
|
56
|
+
const isBeforeEnd = local.minute < toMinute;
|
|
57
|
+
if (isCrossingMidnight ? !isAfterStart && !isBeforeEnd : !isAfterStart || !isBeforeEnd) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
// Crossing midnight, a spell began yesterday when it is after midnight now, and ends tomorrow when it is before.
|
|
61
|
+
const startDay = isCrossingMidnight && !isAfterStart ? -1 : 0;
|
|
62
|
+
const endDay = isCrossingMidnight && isAfterStart ? 1 : 0;
|
|
63
|
+
return { since: instantAt(local, { dayOffset: startDay, minute: fromMinute, timeZone }), until: instantAt(local, { dayOffset: endDay, minute: toMinute, timeZone }) };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=quiet-hours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quiet-hours.js","sourceRoot":"","sources":["../../../src/core/people/quiet-hours.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quiet ships (preferences design): per fleet and person ship, the ships
|
|
3
|
+
* the person quieted. A quiet ship never wakes the person, through web push
|
|
4
|
+
* or email, for any job; Slack and a chat are places, not wakes, so their
|
|
5
|
+
* per job switches stand. Every item still waits whatever is chosen. A ship
|
|
6
|
+
* woken again is kept so, with when, as it wakes only for what it sends
|
|
7
|
+
* after. Kept by ship id, so a rename stays quiet and a reused name does
|
|
8
|
+
* not inherit it; the name is the one it had when quieted.
|
|
9
|
+
*/
|
|
10
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
11
|
+
import type { PersonShip } from './ports.js';
|
|
12
|
+
import type { Routing } from './routing.js';
|
|
13
|
+
/** A ship a person quieted, or woke again, with when they did. */
|
|
14
|
+
export interface QuietShip {
|
|
15
|
+
readonly fleetId: FleetId;
|
|
16
|
+
readonly shipId: ShipId;
|
|
17
|
+
readonly quietShipId: ShipId;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly isQuiet: boolean;
|
|
20
|
+
readonly changedAt: Date;
|
|
21
|
+
}
|
|
22
|
+
/** A page of the person's quiet ships, the latest quieted first, and the cursor of the next; null on the last. */
|
|
23
|
+
export interface QuietShipsPage {
|
|
24
|
+
readonly ships: readonly QuietShip[];
|
|
25
|
+
readonly nextCursor: ShipId | null;
|
|
26
|
+
}
|
|
27
|
+
/** Outbound port: each person's quiet ships, by fleet and person ship. */
|
|
28
|
+
export interface QuietShips {
|
|
29
|
+
/** What the person chose for any of these ships: quiet, or woken again. */
|
|
30
|
+
among(ship: PersonShip, shipIds: readonly ShipId[]): Promise<QuietShip[]>;
|
|
31
|
+
/** The quiet ones only, the latest quieted first, after the cursor. */
|
|
32
|
+
listQuiet(ship: PersonShip, page: {
|
|
33
|
+
cursor: ShipId | null;
|
|
34
|
+
limit: number;
|
|
35
|
+
}): Promise<QuietShipsPage>;
|
|
36
|
+
/** Keeps it, or keeps it anew for its ship. */
|
|
37
|
+
save(quietShip: QuietShip): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/** Routing with the person's quiet ships: none of them wakes, and one woken again wakes for what it sent since. */
|
|
40
|
+
export declare function withQuietShips(routing: Routing, quietShips: readonly QuietShip[]): Routing;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Whether the place wakes the person, so a quiet ship keeps out of it. */
|
|
2
|
+
function isWakePlace(place) {
|
|
3
|
+
switch (place) {
|
|
4
|
+
case 'web-push':
|
|
5
|
+
case 'email':
|
|
6
|
+
return true;
|
|
7
|
+
case 'slack':
|
|
8
|
+
case 'chat':
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Routing with the person's quiet ships: none of them wakes, and one woken again wakes for what it sent since. */
|
|
13
|
+
export function withQuietShips(routing, quietShips) {
|
|
14
|
+
const chosen = new Map(quietShips.map((quietShip) => [quietShip.quietShipId, quietShip]));
|
|
15
|
+
const isQuietFor = ({ senderShipId, sentAt }) => {
|
|
16
|
+
const quietShip = chosen.get(senderShipId);
|
|
17
|
+
return quietShip !== undefined && (quietShip.isQuiet || sentAt.getTime() < quietShip.changedAt.getTime());
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
isOn: (job, place) => routing.isOn(job, place),
|
|
21
|
+
isShowing: (place, item) => !(isWakePlace(place) && isQuietFor(item)) && routing.isShowing(place, item),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=quiet-ships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quiet-ships.js","sourceRoot":"","sources":["../../../src/core/people/quiet-ships.ts"],"names":[],"mappings":"AAwCA,2EAA2E;AAC3E,SAAS,WAAW,CAAC,KAAmB;IACtC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,UAAgC;IAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,UAAU,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAc,EAAW,EAAE;QACnE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5G,CAAC,CAAC;IACF,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;QAC9C,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;KACxG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type Result } from '../shared/result.js';
|
|
3
|
+
import type { CrewPersonShip } from './crew-person-ship.js';
|
|
4
|
+
import { type PersonCaller, type PersonCrewError } from './person-crew.js';
|
|
5
|
+
import type { QuietShips } from './quiet-ships.js';
|
|
6
|
+
import { type QuietShipView } from './read-quiet-ships.js';
|
|
7
|
+
export type ReadQuietAmong = (read: {
|
|
8
|
+
caller: PersonCaller;
|
|
9
|
+
shipIds: readonly ShipId[];
|
|
10
|
+
}) => Promise<Result<QuietShipView[], PersonCrewError>>;
|
|
11
|
+
/** Use case: a person's client asks which of the ships it shows are quiet (preferences design), to mark them in a conversation and the list of conversations. */
|
|
12
|
+
export declare function createReadQuietAmong(deps: {
|
|
13
|
+
crewPersonShip: CrewPersonShip;
|
|
14
|
+
quietShips: Pick<QuietShips, 'among'>;
|
|
15
|
+
}): ReadQuietAmong;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { personCrewOf } from './person-crew.js';
|
|
3
|
+
import { quietShipViewOf } from './read-quiet-ships.js';
|
|
4
|
+
/** Use case: a person's client asks which of the ships it shows are quiet (preferences design), to mark them in a conversation and the list of conversations. */
|
|
5
|
+
export function createReadQuietAmong(deps) {
|
|
6
|
+
return async ({ caller, shipIds }) => {
|
|
7
|
+
const crew = await personCrewOf(deps.crewPersonShip, caller);
|
|
8
|
+
if (!crew.isOk) {
|
|
9
|
+
return crew;
|
|
10
|
+
}
|
|
11
|
+
const chosen = await deps.quietShips.among({ fleetId: caller.fleetId, shipId: crew.value.shipId }, shipIds);
|
|
12
|
+
return ok(chosen.filter(({ isQuiet }) => isQuiet).map(quietShipViewOf));
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=read-quiet-among.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-quiet-among.js","sourceRoot":"","sources":["../../../src/core/people/read-quiet-among.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAA2C,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAI5E,iKAAiK;AACjK,MAAM,UAAU,oBAAoB,CAAC,IAA+E;IAClH,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5G,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Clock } from '../shared/clock.js';
|
|
2
|
+
import { type Result } from '../shared/result.js';
|
|
3
|
+
import type { CrewPersonShip } from './crew-person-ship.js';
|
|
4
|
+
import type { HeldDeliveries } from './held-deliveries.js';
|
|
5
|
+
import { type PersonCaller, type PersonCrewError } from './person-crew.js';
|
|
6
|
+
import type { PersonCrews, PersonShipDoor } from './ports.js';
|
|
7
|
+
import { type QuietHoursStore, type QuietSpell, type QuietWindow } from './quiet-hours.js';
|
|
8
|
+
/** A person's quiet hours as their client draws them: on or off, the window set, if any, and the spell in effect now with how many of what waits arrived since it began, if any. */
|
|
9
|
+
export interface QuietHoursView {
|
|
10
|
+
readonly isOn: boolean;
|
|
11
|
+
readonly window: QuietWindow | null;
|
|
12
|
+
readonly quietNow: (QuietSpell & {
|
|
13
|
+
readonly arrived: number;
|
|
14
|
+
}) | null;
|
|
15
|
+
}
|
|
16
|
+
export type ReadQuietHours = (caller: PersonCaller) => Promise<Result<QuietHoursView, PersonCrewError>>;
|
|
17
|
+
/**
|
|
18
|
+
* Use case: a person's client reads their quiet hours (preferences design);
|
|
19
|
+
* off with no window while they set none. While they are in effect, it
|
|
20
|
+
* counts what waits that arrived since they began, from what waits as the
|
|
21
|
+
* inbox reads it; outside them it asks the fleet nothing.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createReadQuietHours(deps: {
|
|
24
|
+
crewPersonShip: CrewPersonShip;
|
|
25
|
+
crews: PersonCrews;
|
|
26
|
+
door: PersonShipDoor;
|
|
27
|
+
held: HeldDeliveries;
|
|
28
|
+
quietHours: Pick<QuietHoursStore, 'find'>;
|
|
29
|
+
clock: Clock;
|
|
30
|
+
}): ReadQuietHours;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { personCrewOf } from './person-crew.js';
|
|
3
|
+
import { quietSpellAt } from './quiet-hours.js';
|
|
4
|
+
import { waitingFor } from './read-inbox.js';
|
|
5
|
+
/**
|
|
6
|
+
* Use case: a person's client reads their quiet hours (preferences design);
|
|
7
|
+
* off with no window while they set none. While they are in effect, it
|
|
8
|
+
* counts what waits that arrived since they began, from what waits as the
|
|
9
|
+
* inbox reads it; outside them it asks the fleet nothing.
|
|
10
|
+
*/
|
|
11
|
+
export function createReadQuietHours(deps) {
|
|
12
|
+
return async (caller) => {
|
|
13
|
+
const crew = await personCrewOf(deps.crewPersonShip, caller);
|
|
14
|
+
if (!crew.isOk) {
|
|
15
|
+
return crew;
|
|
16
|
+
}
|
|
17
|
+
const hours = await deps.quietHours.find({ fleetId: caller.fleetId, shipId: crew.value.shipId });
|
|
18
|
+
if (hours === undefined) {
|
|
19
|
+
return ok({ isOn: false, window: null, quietNow: null });
|
|
20
|
+
}
|
|
21
|
+
const { isOn, fromMinute, toMinute, timeZone } = hours;
|
|
22
|
+
const window = { fromMinute, toMinute, timeZone };
|
|
23
|
+
const spell = quietSpellAt(hours, deps.clock.now());
|
|
24
|
+
if (spell === undefined) {
|
|
25
|
+
return ok({ isOn, window, quietNow: null });
|
|
26
|
+
}
|
|
27
|
+
const waiting = await waitingFor(deps, caller);
|
|
28
|
+
if (!waiting.isOk) {
|
|
29
|
+
return waiting;
|
|
30
|
+
}
|
|
31
|
+
const arrived = waiting.value.deliveries.filter(({ sentAt }) => sentAt.getTime() >= spell.since.getTime()).length;
|
|
32
|
+
return ok({ isOn, window, quietNow: { ...spell, arrived } });
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=read-quiet-hours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-quiet-hours.js","sourceRoot":"","sources":["../../../src/core/people/read-quiet-hours.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAA2C,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAE,YAAY,EAA2D,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAW7C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAiK;IACpM,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QACvD,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAClH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type Result } from '../shared/result.js';
|
|
3
|
+
import type { CrewPersonShip } from './crew-person-ship.js';
|
|
4
|
+
import { type PersonCaller, type PersonCrewError } from './person-crew.js';
|
|
5
|
+
import type { QuietShip, QuietShips } from './quiet-ships.js';
|
|
6
|
+
/** How many quiet ships a page holds, as preferences show them. */
|
|
7
|
+
export declare const QUIET_SHIPS_PAGE_SIZE = 20;
|
|
8
|
+
/** A quiet ship as a person's client shows it: its name when quieted, and since when. */
|
|
9
|
+
export interface QuietShipView {
|
|
10
|
+
readonly shipId: ShipId;
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly since: Date;
|
|
13
|
+
}
|
|
14
|
+
export declare function quietShipViewOf({ quietShipId, name, changedAt }: QuietShip): QuietShipView;
|
|
15
|
+
export type ReadQuietShips = (read: {
|
|
16
|
+
caller: PersonCaller;
|
|
17
|
+
cursor: ShipId | null;
|
|
18
|
+
}) => Promise<Result<{
|
|
19
|
+
ships: QuietShipView[];
|
|
20
|
+
nextCursor: ShipId | null;
|
|
21
|
+
}, PersonCrewError>>;
|
|
22
|
+
/** Use case: a person's client lists their quiet ships (preferences design), 20 at a time, the latest quieted first, after the cursor the last page answered. */
|
|
23
|
+
export declare function createReadQuietShips(deps: {
|
|
24
|
+
crewPersonShip: CrewPersonShip;
|
|
25
|
+
quietShips: Pick<QuietShips, 'listQuiet'>;
|
|
26
|
+
}): ReadQuietShips;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { personCrewOf } from './person-crew.js';
|
|
3
|
+
/** How many quiet ships a page holds, as preferences show them. */
|
|
4
|
+
export const QUIET_SHIPS_PAGE_SIZE = 20;
|
|
5
|
+
export function quietShipViewOf({ quietShipId, name, changedAt }) {
|
|
6
|
+
return { shipId: quietShipId, name, since: changedAt };
|
|
7
|
+
}
|
|
8
|
+
/** Use case: a person's client lists their quiet ships (preferences design), 20 at a time, the latest quieted first, after the cursor the last page answered. */
|
|
9
|
+
export function createReadQuietShips(deps) {
|
|
10
|
+
return async ({ caller, cursor }) => {
|
|
11
|
+
const crew = await personCrewOf(deps.crewPersonShip, caller);
|
|
12
|
+
if (!crew.isOk) {
|
|
13
|
+
return crew;
|
|
14
|
+
}
|
|
15
|
+
const page = await deps.quietShips.listQuiet({ fleetId: caller.fleetId, shipId: crew.value.shipId }, { cursor, limit: QUIET_SHIPS_PAGE_SIZE });
|
|
16
|
+
return ok({ ships: page.ships.map(quietShipViewOf), nextCursor: page.nextCursor });
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=read-quiet-ships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-quiet-ships.js","sourceRoot":"","sources":["../../../src/core/people/read-quiet-ships.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAA2C,MAAM,kBAAkB,CAAC;AAGzF,mEAAmE;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AASxC,MAAM,UAAU,eAAe,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAa;IACzE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACzD,CAAC;AAID,iKAAiK;AACjK,MAAM,UAAU,oBAAoB,CAAC,IAAmF;IACtH,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC/I,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Clock } from '../shared/clock.js';
|
|
2
|
+
import type { DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
import type { CrewPersonShip } from './crew-person-ship.js';
|
|
5
|
+
import { type PersonCaller, type PersonCrewError } from './person-crew.js';
|
|
6
|
+
import { type QuietHoursStore, type QuietWindow } from './quiet-hours.js';
|
|
7
|
+
export type SetQuietHours = (set: {
|
|
8
|
+
caller: PersonCaller;
|
|
9
|
+
isOn: boolean;
|
|
10
|
+
} & QuietWindow) => Promise<Result<undefined, PersonCrewError | DomainError<'INVALID_QUIET_HOURS'>>>;
|
|
11
|
+
/**
|
|
12
|
+
* Use case: a person sets their quiet hours (preferences design), on or off
|
|
13
|
+
* with their window, kept by fleet and person ship with when they set them.
|
|
14
|
+
* It applies at once, as every wake reads them anew. A window that is not
|
|
15
|
+
* one is refused, keeping nothing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createSetQuietHours(deps: {
|
|
18
|
+
crewPersonShip: CrewPersonShip;
|
|
19
|
+
quietHours: Pick<QuietHoursStore, 'save'>;
|
|
20
|
+
clock: Clock;
|
|
21
|
+
}): SetQuietHours;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { personCrewOf } from './person-crew.js';
|
|
3
|
+
import { quietWindowOf } from './quiet-hours.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: a person sets their quiet hours (preferences design), on or off
|
|
6
|
+
* with their window, kept by fleet and person ship with when they set them.
|
|
7
|
+
* It applies at once, as every wake reads them anew. A window that is not
|
|
8
|
+
* one is refused, keeping nothing.
|
|
9
|
+
*/
|
|
10
|
+
export function createSetQuietHours(deps) {
|
|
11
|
+
return async ({ caller, isOn, ...asked }) => {
|
|
12
|
+
const window = quietWindowOf(asked);
|
|
13
|
+
if (!window.isOk) {
|
|
14
|
+
return window;
|
|
15
|
+
}
|
|
16
|
+
const crew = await personCrewOf(deps.crewPersonShip, caller);
|
|
17
|
+
if (!crew.isOk) {
|
|
18
|
+
return crew;
|
|
19
|
+
}
|
|
20
|
+
await deps.quietHours.save({ fleetId: caller.fleetId, shipId: crew.value.shipId, isOn, ...window.value, changedAt: deps.clock.now() });
|
|
21
|
+
return ok(undefined);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=set-quiet-hours.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-quiet-hours.js","sourceRoot":"","sources":["../../../src/core/people/set-quiet-hours.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAA2C,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,aAAa,EAA0C,MAAM,kBAAkB,CAAC;AAIzF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAiG;IACnI,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvI,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
import type { CrewPersonShip } from './crew-person-ship.js';
|
|
5
|
+
import { type PersonCaller, type PersonCrewError } from './person-crew.js';
|
|
6
|
+
import type { QuietShips } from './quiet-ships.js';
|
|
7
|
+
export type TurnShipQuiet = (turn: {
|
|
8
|
+
caller: PersonCaller;
|
|
9
|
+
shipId: ShipId;
|
|
10
|
+
name: string;
|
|
11
|
+
isQuiet: boolean;
|
|
12
|
+
}) => Promise<Result<undefined, PersonCrewError>>;
|
|
13
|
+
/**
|
|
14
|
+
* Use case: a person quiets a ship, so it never wakes them, or wakes it
|
|
15
|
+
* again (preferences design), kept by fleet, person ship and ship with when.
|
|
16
|
+
* It applies at once, as every wake reads it anew. A ship already as asked
|
|
17
|
+
* is kept as it is, so a quiet ship keeps since when it was quieted; a ship
|
|
18
|
+
* never quieted needs nothing kept to wake the person.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createTurnShipQuiet(deps: {
|
|
21
|
+
crewPersonShip: CrewPersonShip;
|
|
22
|
+
quietShips: Pick<QuietShips, 'among' | 'save'>;
|
|
23
|
+
clock: Clock;
|
|
24
|
+
}): TurnShipQuiet;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { personCrewOf } from './person-crew.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: a person quiets a ship, so it never wakes them, or wakes it
|
|
5
|
+
* again (preferences design), kept by fleet, person ship and ship with when.
|
|
6
|
+
* It applies at once, as every wake reads it anew. A ship already as asked
|
|
7
|
+
* is kept as it is, so a quiet ship keeps since when it was quieted; a ship
|
|
8
|
+
* never quieted needs nothing kept to wake the person.
|
|
9
|
+
*/
|
|
10
|
+
export function createTurnShipQuiet(deps) {
|
|
11
|
+
return async ({ caller, shipId, name, isQuiet }) => {
|
|
12
|
+
const crew = await personCrewOf(deps.crewPersonShip, caller);
|
|
13
|
+
if (!crew.isOk) {
|
|
14
|
+
return crew;
|
|
15
|
+
}
|
|
16
|
+
const ship = { fleetId: caller.fleetId, shipId: crew.value.shipId };
|
|
17
|
+
const [chosen] = await deps.quietShips.among(ship, [shipId]);
|
|
18
|
+
if ((chosen?.isQuiet ?? false) === isQuiet) {
|
|
19
|
+
return ok(undefined);
|
|
20
|
+
}
|
|
21
|
+
await deps.quietShips.save({ ...ship, quietShipId: shipId, name, isQuiet, changedAt: deps.clock.now() });
|
|
22
|
+
return ok(undefined);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=turn-ship-quiet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-ship-quiet.js","sourceRoot":"","sources":["../../../src/core/people/turn-ship-quiet.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAA2C,MAAM,kBAAkB,CAAC;AAKzF;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAsG;IACxI,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzG,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -2,6 +2,8 @@ import type { ConnectionStore, FleetRefusal } from "../connection/ports.js";
|
|
|
2
2
|
import type { Clock } from "../shared/clock.js";
|
|
3
3
|
import { type Result } from "../shared/result.js";
|
|
4
4
|
import type { RoutingDefaults, Routes } from "./routing.js";
|
|
5
|
+
import { type QuietHoursStore } from "./quiet-hours.js";
|
|
6
|
+
import { type QuietShips } from "./quiet-ships.js";
|
|
5
7
|
import type { FocusedPages, PersonShip, PersonShipDoor, ShownElsewhere, WakeChannel, WakeChannelName, WakesSent } from "./ports.js";
|
|
6
8
|
/**
|
|
7
9
|
* What a wake came to: nothing left to wake (settled), a wake held back
|
|
@@ -43,7 +45,11 @@ export type WakePerson = (ship: PersonShip, crewToken: string) => Promise<Result
|
|
|
43
45
|
* person routed there, even while a page is in focus; nothing wakes for those
|
|
44
46
|
* (gateway scopes 9.5 step 5). It is asked at every wake, fresh deliveries
|
|
45
47
|
* or none, so what it left unfinished is finished, and while anything is
|
|
46
|
-
* left the wake counts as failed, so it is tried again.
|
|
48
|
+
* left the wake counts as failed, so it is tried again. The person's
|
|
49
|
+
* preferences are read anew at every wake too: a quiet ship's deliveries
|
|
50
|
+
* wake nobody and wait unhanded, and during quiet hours no wake goes out;
|
|
51
|
+
* the wake is held back until they end or a channel's window passes,
|
|
52
|
+
* whichever comes first, so turning them off applies by the next window.
|
|
47
53
|
*/
|
|
48
54
|
export declare function createWakePerson(deps: {
|
|
49
55
|
door: Pick<PersonShipDoor, "pushReceive" | "handed">;
|
|
@@ -55,6 +61,9 @@ export declare function createWakePerson(deps: {
|
|
|
55
61
|
/** Where each person routed each job (Bridge, section 8), and the defaults where they chose nothing. */
|
|
56
62
|
routes: Routes;
|
|
57
63
|
defaults: RoutingDefaults;
|
|
64
|
+
/** The person's quiet hours and quiet ships (preferences design). */
|
|
65
|
+
quietHours: Pick<QuietHoursStore, "find">;
|
|
66
|
+
quietShips: Pick<QuietShips, "among">;
|
|
58
67
|
wakesSent: WakesSent;
|
|
59
68
|
focused: FocusedPages;
|
|
60
69
|
/** How long a page counts in focus since it was last seen so. */
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { RECEIVE_MAX_UPPER_BOUND } from "@aeolus-fleet/common";
|
|
2
2
|
import { err, ok } from "../shared/result.js";
|
|
3
3
|
import { ownStepsInBridgeOnly, routingOf } from "./routing.js";
|
|
4
|
+
import { quietSpellAt } from "./quiet-hours.js";
|
|
5
|
+
import { withQuietShips } from "./quiet-ships.js";
|
|
4
6
|
/**
|
|
5
7
|
* Use case: wakes a person for what waits on their person ship (wake a
|
|
6
8
|
* person, W3, W8). It takes the ship's deliveries with the gateway as their
|
|
@@ -27,7 +29,11 @@ import { ownStepsInBridgeOnly, routingOf } from "./routing.js";
|
|
|
27
29
|
* person routed there, even while a page is in focus; nothing wakes for those
|
|
28
30
|
* (gateway scopes 9.5 step 5). It is asked at every wake, fresh deliveries
|
|
29
31
|
* or none, so what it left unfinished is finished, and while anything is
|
|
30
|
-
* left the wake counts as failed, so it is tried again.
|
|
32
|
+
* left the wake counts as failed, so it is tried again. The person's
|
|
33
|
+
* preferences are read anew at every wake too: a quiet ship's deliveries
|
|
34
|
+
* wake nobody and wait unhanded, and during quiet hours no wake goes out;
|
|
35
|
+
* the wake is held back until they end or a channel's window passes,
|
|
36
|
+
* whichever comes first, so turning them off applies by the next window.
|
|
31
37
|
*/
|
|
32
38
|
export function createWakePerson(deps) {
|
|
33
39
|
/** Channels that refused for good during an attempt still failing, by person ship: a retry of that attempt does not ask them again. */
|
|
@@ -87,7 +93,11 @@ export function createWakePerson(deps) {
|
|
|
87
93
|
const refused = await handEach(allFresh, "page");
|
|
88
94
|
return refused === undefined ? ok({ kind: "settled" }) : err(refused);
|
|
89
95
|
}
|
|
90
|
-
const
|
|
96
|
+
const senderShipIds = [...new Set(allFresh.map(({ senderShipId }) => senderShipId))];
|
|
97
|
+
const [quietShips, quietHours] = await Promise.all([deps.quietShips.among(ship, senderShipIds), deps.quietHours.find(ship)]);
|
|
98
|
+
// A quiet ship wakes nobody: what it sent waits unhanded.
|
|
99
|
+
const wakeRouting = withQuietShips(routing, quietShips);
|
|
100
|
+
const showsOf = (channel) => (delivery) => wakeRouting.isShowing(channel.name, delivery);
|
|
91
101
|
const turnedOn = (await Promise.all(deps.channels.map(async (channel) => allFresh.some(showsOf(channel)) && (await channel.isOn(ship)) ? [channel] : []))).flat();
|
|
92
102
|
if (turnedOn.length === 0) {
|
|
93
103
|
return ok({ kind: "settled" });
|
|
@@ -120,6 +130,12 @@ export function createWakePerson(deps) {
|
|
|
120
130
|
if (fresh.length === 0) {
|
|
121
131
|
return ok({ kind: "settled" });
|
|
122
132
|
}
|
|
133
|
+
const quiet = quietHours === undefined ? undefined : quietSpellAt(quietHours, now);
|
|
134
|
+
if (quiet !== undefined) {
|
|
135
|
+
// Looked at again once a window passes, so quiet hours turned off meanwhile wake by then.
|
|
136
|
+
const nextWindowMs = Math.min(...turnedOn.filter((channel) => fresh.some(showsOf(channel))).map(({ windowMs }) => windowMs));
|
|
137
|
+
return ok({ kind: "inWindow", until: new Date(Math.min(quiet.until.getTime(), now.getTime() + nextWindowMs)) });
|
|
138
|
+
}
|
|
123
139
|
const refusedBefore = refusedInAttempt.get(attemptKey(ship)) ?? new Set();
|
|
124
140
|
/** The channels still asked that show any of these deliveries, with their windows. */
|
|
125
141
|
const askedFor = (deliveries) => windows.filter(({ channel }) => !refusedBefore.has(channel.name) && deliveries.some(showsOf(channel)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wake-person.js","sourceRoot":"","sources":["../../../src/core/people/wake-person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAmB,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"wake-person.js","sourceRoot":"","sources":["../../../src/core/people/wake-person.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Err } from './result.js';
|
|
2
2
|
/** Every reason the gateway's core refuses a request. */
|
|
3
|
-
export type DomainErrorKind = 'ALREADY_CONNECTED' | 'SECRET_REFUSED' | 'OTHER_FLEET' | 'MISSING_SCOPES' | 'SCOPE_REFUSED' | 'NOT_THE_OPERATOR' | 'NOT_AN_ACTOR' | 'NOT_AN_APPROVER' | 'NO_SUCH_REQUEST' | 'ALREADY_DECIDED' | 'EXPIRED' | 'SCOPE_NOT_HELD' | 'SERVER_DETAILS_MISSING' | 'REQUEST_ID_USED' | 'FLEET_UNAVAILABLE' | 'NOT_A_STEP' | 'KEY_UNAVAILABLE' | 'NOT_CONNECTED' | 'PARTY_EXISTS' | 'COMMISSION_REFUSED' | 'NO_SUCH_PARTY' | 'NOT_AWAITING_CREW' | 'NOT_CREWED' | 'SERVER_UNREACHABLE' | 'NO_AUTHORIZATION_SERVER' | 'SIGN_IN_CHECK_FAILED' | 'NOT_SIGNED_IN' | 'NO_SIGN_IN' | 'SIGN_IN_FAILED' | 'TURNED_AWAY' | 'AUTHORIZATION_SERVER_UNREACHABLE' | 'NO_DYNAMIC_REGISTRATION' | 'REGISTRATION_REFUSED' | 'STATEMENT_REFUSED' | 'INVALID_REDIRECT_URIS' | 'CLIENT_HAS_PARTY' | 'PARTY_NOT_CREWED' | 'NO_SUCH_TOOL' | 'INVALID_ARGUMENTS' | 'NOT_REACHABLE' | 'SEND_REFUSED' | 'NO_SUCH_CALL' | 'NOT_A_PERSON' | 'SIGNED_OUT' | 'NO_SUCH_DELIVERY' | 'NOT_A_QUESTION' | 'NOT_IN_BASKET' | 'NOT_A_NETWORKER' | 'OPEN_NETWORK' | 'OUTSIDE_PARTIES_OFF' | 'INVALID_SERVER_URL' | 'NOT_A_MANAGER' | 'RETIRE_REFUSED' | 'NOT_AN_ACCOUNT' | 'PARTY_NOT_COMMISSIONED' | 'CHANGE_REFUSED' | 'UNKNOWN_ALIAS' | 'PAYLOAD_TOO_LARGE' | 'TASK_NOT_FOUND' | 'TASK_TERMINAL' | 'WEBHOOK_REFUSED' | 'PUSH_CONFIG_NOT_FOUND' | 'CONTEXT_MISMATCH' | 'CARD_UNREACHABLE' | 'CARD_INVALID' | 'NOT_A_MESSAGE' | 'CHANNEL_NOT_OFFERED' | 'INVALID_SUBSCRIPTION' | 'NO_SUCH_MEETING' | 'MIC_REFUSED' | 'SCOPE_NOT_LISTED' | 'SLACK_SCOPE_NOT_HELD' | 'SLACK_NOT_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE' | 'OTHER_WORKSPACE' | 'INSTALL_REFUSED' | 'NOT_EXPOSABLE' | 'NO_SUCH_BOT' | 'LINK_REFUSED' | 'SLACK_USER_LINKED' | 'ACCOUNT_LINKED' | 'NOT_LINKED' | 'CONFLICT';
|
|
3
|
+
export type DomainErrorKind = 'ALREADY_CONNECTED' | 'SECRET_REFUSED' | 'OTHER_FLEET' | 'MISSING_SCOPES' | 'SCOPE_REFUSED' | 'NOT_THE_OPERATOR' | 'NOT_AN_ACTOR' | 'NOT_AN_APPROVER' | 'NO_SUCH_REQUEST' | 'ALREADY_DECIDED' | 'EXPIRED' | 'SCOPE_NOT_HELD' | 'SERVER_DETAILS_MISSING' | 'REQUEST_ID_USED' | 'FLEET_UNAVAILABLE' | 'NOT_A_STEP' | 'KEY_UNAVAILABLE' | 'NOT_CONNECTED' | 'PARTY_EXISTS' | 'COMMISSION_REFUSED' | 'NO_SUCH_PARTY' | 'NOT_AWAITING_CREW' | 'NOT_CREWED' | 'SERVER_UNREACHABLE' | 'NO_AUTHORIZATION_SERVER' | 'SIGN_IN_CHECK_FAILED' | 'NOT_SIGNED_IN' | 'NO_SIGN_IN' | 'SIGN_IN_FAILED' | 'TURNED_AWAY' | 'AUTHORIZATION_SERVER_UNREACHABLE' | 'NO_DYNAMIC_REGISTRATION' | 'REGISTRATION_REFUSED' | 'STATEMENT_REFUSED' | 'INVALID_REDIRECT_URIS' | 'CLIENT_HAS_PARTY' | 'PARTY_NOT_CREWED' | 'NO_SUCH_TOOL' | 'INVALID_ARGUMENTS' | 'NOT_REACHABLE' | 'SEND_REFUSED' | 'NO_SUCH_CALL' | 'NOT_A_PERSON' | 'SIGNED_OUT' | 'NO_SUCH_DELIVERY' | 'NOT_A_QUESTION' | 'NOT_IN_BASKET' | 'NOT_A_NETWORKER' | 'OPEN_NETWORK' | 'OUTSIDE_PARTIES_OFF' | 'INVALID_SERVER_URL' | 'NOT_A_MANAGER' | 'RETIRE_REFUSED' | 'NOT_AN_ACCOUNT' | 'PARTY_NOT_COMMISSIONED' | 'CHANGE_REFUSED' | 'UNKNOWN_ALIAS' | 'PAYLOAD_TOO_LARGE' | 'TASK_NOT_FOUND' | 'TASK_TERMINAL' | 'WEBHOOK_REFUSED' | 'PUSH_CONFIG_NOT_FOUND' | 'CONTEXT_MISMATCH' | 'CARD_UNREACHABLE' | 'CARD_INVALID' | 'NOT_A_MESSAGE' | 'CHANNEL_NOT_OFFERED' | 'INVALID_SUBSCRIPTION' | 'INVALID_QUIET_HOURS' | 'NO_SUCH_MEETING' | 'MIC_REFUSED' | 'SCOPE_NOT_LISTED' | 'SLACK_SCOPE_NOT_HELD' | 'SLACK_NOT_CONNECTED' | 'SLACK_TOKEN_REFUSED' | 'SLACK_UNAVAILABLE' | 'OTHER_WORKSPACE' | 'INSTALL_REFUSED' | 'NOT_EXPOSABLE' | 'NO_SUCH_BOT' | 'LINK_REFUSED' | 'SLACK_USER_LINKED' | 'ACCOUNT_LINKED' | 'NOT_LINKED' | 'CONFLICT';
|
|
4
4
|
/** Why the core refused a request. Adapters map the kind to their own error shape; the message is safe to show. */
|
|
5
5
|
export interface DomainError<K extends DomainErrorKind = DomainErrorKind> {
|
|
6
6
|
readonly kind: K;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/shared/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AAgG5C,qDAAqD;AACrD,MAAM,UAAU,MAAM,CAA4B,IAAO,EAAE,OAAe;IACxE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- Each person's quiet hours (preferences design): one daily window in the time zone of the device that set them.
|
|
2
|
+
CREATE TABLE "quiet_hours" (
|
|
3
|
+
"fleet_id" TEXT NOT NULL,
|
|
4
|
+
"ship_id" TEXT NOT NULL,
|
|
5
|
+
"is_on" BOOLEAN NOT NULL,
|
|
6
|
+
"from_minute" INTEGER NOT NULL,
|
|
7
|
+
"to_minute" INTEGER NOT NULL,
|
|
8
|
+
"time_zone" TEXT NOT NULL,
|
|
9
|
+
"changed_at" TIMESTAMPTZ(3) NOT NULL,
|
|
10
|
+
|
|
11
|
+
CONSTRAINT "quiet_hours_pkey" PRIMARY KEY ("fleet_id","ship_id")
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
-- The ships each person quieted or woke again (preferences design).
|
|
15
|
+
CREATE TABLE "quiet_ships" (
|
|
16
|
+
"fleet_id" TEXT NOT NULL,
|
|
17
|
+
"ship_id" TEXT NOT NULL,
|
|
18
|
+
"quiet_ship_id" TEXT NOT NULL,
|
|
19
|
+
"name" TEXT NOT NULL,
|
|
20
|
+
"is_quiet" BOOLEAN NOT NULL,
|
|
21
|
+
"changed_at" TIMESTAMPTZ(3) NOT NULL,
|
|
22
|
+
|
|
23
|
+
CONSTRAINT "quiet_ships_pkey" PRIMARY KEY ("fleet_id","ship_id","quiet_ship_id")
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
-- A person's quiet ships, the latest quieted first, a page at a time.
|
|
27
|
+
CREATE INDEX "quiet_ships_listed_idx" ON "quiet_ships"("fleet_id", "ship_id", "is_quiet", "changed_at" DESC, "quiet_ship_id" DESC);
|