@rubytech/create-sitedesk-code 0.1.528 → 0.1.530
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/index.js +13 -0
- package/package.json +1 -1
- package/payload/platform/lib/account-ingest-token/dist/index.d.ts +21 -0
- package/payload/platform/lib/account-ingest-token/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/account-ingest-token/dist/index.js +128 -0
- package/payload/platform/lib/account-ingest-token/dist/index.js.map +1 -0
- package/payload/platform/lib/account-ingest-token/src/index.ts +137 -0
- package/payload/platform/lib/account-ingest-token/tsconfig.json +8 -0
- package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts +5 -0
- package/payload/platform/lib/agent-dispatch-rule/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/agent-dispatch-rule/dist/index.js.map +1 -1
- package/payload/platform/lib/agent-dispatch-rule/src/index.ts +5 -0
- package/payload/platform/lib/routine-templates/dist/index.d.ts +19 -3
- package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/index.js +22 -4
- package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +19 -6
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.js +127 -17
- package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
- package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +46 -3
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +52 -10
- package/payload/platform/lib/routine-templates/src/index.ts +30 -4
- package/payload/platform/lib/routine-templates/src/roster.ts +147 -17
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +5 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js +37 -0
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.d.ts +10 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.d.ts.map +1 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.js +22 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/linkedin-ingest-token.js.map +1 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +31 -6
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +28 -3
- package/payload/platform/plugins/docs/references/linkedin-extension.md +2 -2
- package/payload/platform/plugins/linkedin-extension/extension/README.md +3 -3
- package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +12 -7
- package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +4 -1
- package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +4 -1
- package/payload/platform/plugins/linkedin-extension/extension/options/options.html +3 -3
- package/payload/platform/plugins/linkedin-extension/extension/options/options.js +24 -16
- package/payload/platform/plugins/scheduling/PLUGIN.md +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +5 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.js +100 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/normalise-start-date.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.d.ts +36 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.js +82 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/dispatcher-env.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts +31 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js +99 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/time-format.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +12 -12
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js +79 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/converge-startdate-utc.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.js +23 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/dispatch-lateness.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +61 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js +45 -2
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +33 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +111 -9
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +21 -69
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts +24 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js +87 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.js +123 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-event-startdate.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.js +71 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-startdate.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js +14 -3
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-status.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +9 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +19 -3
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +24 -9
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/server/{chunk-UTIHI6KV.js → chunk-2YMGNYA3.js} +12 -12
- package/payload/server/{manager-B4LRDZKC.js → manager-XPRN5UF5.js} +1 -1
- package/payload/server/package.json +1 -1
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-Bx9vPuUg.js → AdminLoginScreens-7Czw3MAC.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-7Czw3MAC.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-7Czw3MAC.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-BxJPbC3p.js → AdminShell-D5GApZ_n.js} +1 -1
- package/payload/server/public/assets/AdminShell-D5GApZ_n.js.br +0 -0
- package/payload/server/public/assets/AdminShell-D5GApZ_n.js.gz +0 -0
- package/payload/server/public/assets/{CdpScreencastSurface-5HLhTQTV.js → CdpScreencastSurface-BbekDUFw.js} +1 -1
- package/payload/server/public/assets/CdpScreencastSurface-BbekDUFw.js.br +0 -0
- package/payload/server/public/assets/CdpScreencastSurface-BbekDUFw.js.gz +0 -0
- package/payload/server/public/assets/{activity-BaSYn62l.js → activity-ClI-RgJu.js} +1 -1
- package/payload/server/public/assets/activity-ClI-RgJu.js.br +0 -0
- package/payload/server/public/assets/activity-ClI-RgJu.js.gz +0 -0
- package/payload/server/public/assets/{admin-CYCKrV_x.js → admin-svtCmBPk.js} +1 -1
- package/payload/server/public/assets/admin-svtCmBPk.js.br +0 -0
- package/payload/server/public/assets/admin-svtCmBPk.js.gz +0 -0
- package/payload/server/public/assets/{agents-D8EJG-ta.js → agents-BO8YBj8d.js} +1 -1
- package/payload/server/public/assets/agents-BO8YBj8d.js.br +0 -0
- package/payload/server/public/assets/agents-BO8YBj8d.js.gz +0 -0
- package/payload/server/public/assets/{browser-D6Y_Zu8C.js → browser-Bj8oTG5R.js} +1 -1
- package/payload/server/public/assets/browser-Bj8oTG5R.js.br +0 -0
- package/payload/server/public/assets/browser-Bj8oTG5R.js.gz +0 -0
- package/payload/server/public/assets/{calendar-DD4oVa-r.js → calendar-CrkSY8U7.js} +1 -1
- package/payload/server/public/assets/calendar-CrkSY8U7.js.br +0 -0
- package/payload/server/public/assets/calendar-CrkSY8U7.js.gz +0 -0
- package/payload/server/public/assets/chat-Bvxoni2e.js +1 -0
- package/payload/server/public/assets/chat-Bvxoni2e.js.br +0 -0
- package/payload/server/public/assets/chat-Bvxoni2e.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-CdUzxzeB.js +1 -0
- package/payload/server/public/assets/chevron-left-CdUzxzeB.js.br +0 -0
- package/payload/server/public/assets/chevron-right-CKGwd-M0.js +1 -0
- package/payload/server/public/assets/chevron-right-CKGwd-M0.js.br +0 -0
- package/payload/server/public/assets/clock-Cf8Oe9qi.js +1 -0
- package/payload/server/public/assets/clock-Cf8Oe9qi.js.br +0 -0
- package/payload/server/public/assets/clock-Cf8Oe9qi.js.gz +0 -0
- package/payload/server/public/assets/data-DF0Pstdp.js +1 -0
- package/payload/server/public/assets/data-DF0Pstdp.js.br +1 -0
- package/payload/server/public/assets/data-DF0Pstdp.js.gz +0 -0
- package/payload/server/public/assets/{file-download-sXU3_umF.js → file-download-Di_s0_4w.js} +1 -1
- package/payload/server/public/assets/file-download-Di_s0_4w.js.br +0 -0
- package/payload/server/public/assets/file-download-Di_s0_4w.js.gz +0 -0
- package/payload/server/public/assets/{file-text-CeXBviDH.js → file-text-CP1KIrJV.js} +1 -1
- package/payload/server/public/assets/file-text-CP1KIrJV.js.br +1 -0
- package/payload/server/public/assets/file-text-CP1KIrJV.js.gz +0 -0
- package/payload/server/public/assets/{graph-BSuDP6k7.js → graph-BCMscnCV.js} +1 -1
- package/payload/server/public/assets/graph-BCMscnCV.js.br +0 -0
- package/payload/server/public/assets/graph-BCMscnCV.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-D2pQkgYW.js → graph-labels-CgP17xHK.js} +1 -1
- package/payload/server/public/assets/graph-labels-CgP17xHK.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CgP17xHK.js.gz +0 -0
- package/payload/server/public/assets/{maximize-2-DlzSNygU.js → maximize-2-DkQzDv-g.js} +1 -1
- package/payload/server/public/assets/maximize-2-DkQzDv-g.js.br +0 -0
- package/payload/server/public/assets/maximize-2-DkQzDv-g.js.gz +0 -0
- package/payload/server/public/assets/{operator-BP61-xjz.js → operator-CLbCar9e.js} +1 -1
- package/payload/server/public/assets/operator-CLbCar9e.js.br +0 -0
- package/payload/server/public/assets/operator-CLbCar9e.js.gz +0 -0
- package/payload/server/public/assets/{page-DX7ArY_s.js → page-CNJl3tWT.js} +1 -1
- package/payload/server/public/assets/page-CNJl3tWT.js.br +0 -0
- package/payload/server/public/assets/page-CNJl3tWT.js.gz +0 -0
- package/payload/server/public/assets/{page-eQ4OVros.js → page-CPVUAwb8.js} +1 -1
- package/payload/server/public/assets/page-CPVUAwb8.js.br +0 -0
- package/payload/server/public/assets/page-CPVUAwb8.js.gz +0 -0
- package/payload/server/public/assets/{public-DPDKFKM2.js → public-DQea3Ybz.js} +1 -1
- package/payload/server/public/assets/public-DQea3Ybz.js.br +0 -0
- package/payload/server/public/assets/public-DQea3Ybz.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-BR0JbPFV.js → rotate-ccw-DPw0vXC0.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-DPw0vXC0.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-DPw0vXC0.js.gz +0 -0
- package/payload/server/public/assets/routines-CwiiYpfK.js +2 -0
- package/payload/server/public/assets/routines-CwiiYpfK.js.br +0 -0
- package/payload/server/public/assets/routines-CwiiYpfK.js.gz +0 -0
- package/payload/server/public/assets/{skills-fH0uA7cj.js → skills-0FOjKUM-.js} +1 -1
- package/payload/server/public/assets/skills-0FOjKUM-.js.br +0 -0
- package/payload/server/public/assets/skills-0FOjKUM-.js.gz +0 -0
- package/payload/server/public/assets/{tasks-CrVzFrTR.js → tasks-BUVsPEGm.js} +1 -1
- package/payload/server/public/assets/tasks-BUVsPEGm.js.br +0 -0
- package/payload/server/public/assets/tasks-BUVsPEGm.js.gz +0 -0
- package/payload/server/public/assets/{time-entry-format-C_0jiMpQ.js → time-entry-format-B6fX_19a.js} +1 -1
- package/payload/server/public/assets/time-entry-format-B6fX_19a.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-B6fX_19a.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-eLJHC_QJ.js → triangle-alert-vAaSDhVq.js} +1 -1
- package/payload/server/public/assets/triangle-alert-vAaSDhVq.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-vAaSDhVq.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-vPCmdOmY.js → useCopyFeedback-BvIRgs7W.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-BvIRgs7W.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-BvIRgs7W.js.gz +0 -0
- package/payload/server/public/assets/{useSubAccountSwitcher-DxuUS_C7.css → useSubAccountSwitcher-DM5Y9eio.css} +1 -1
- package/payload/server/public/assets/useSubAccountSwitcher-DM5Y9eio.css.br +0 -0
- package/payload/server/public/assets/{useSubAccountSwitcher-DxuUS_C7.css.gz → useSubAccountSwitcher-DM5Y9eio.css.gz} +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-D5bFDRqL.js → useVoiceRecorder-CiDOh8PG.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-CiDOh8PG.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-CiDOh8PG.js.gz +0 -0
- package/payload/server/public/assets/{wrench-sXisQXkf.js → wrench-BNBtwT2p.js} +1 -1
- package/payload/server/public/assets/wrench-BNBtwT2p.js.br +0 -0
- package/payload/server/public/assets/wrench-BNBtwT2p.js.gz +0 -0
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +7 -7
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +12 -12
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +16 -16
- package/payload/server/public/operator.html +15 -15
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +7 -7
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +353 -209
- package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-Bx9vPuUg.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-BxJPbC3p.js.br +0 -0
- package/payload/server/public/assets/AdminShell-BxJPbC3p.js.gz +0 -0
- package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js.br +0 -0
- package/payload/server/public/assets/CdpScreencastSurface-5HLhTQTV.js.gz +0 -0
- package/payload/server/public/assets/activity-BaSYn62l.js.br +0 -0
- package/payload/server/public/assets/activity-BaSYn62l.js.gz +0 -0
- package/payload/server/public/assets/admin-CYCKrV_x.js.br +0 -0
- package/payload/server/public/assets/admin-CYCKrV_x.js.gz +0 -0
- package/payload/server/public/assets/agents-D8EJG-ta.js.br +0 -0
- package/payload/server/public/assets/agents-D8EJG-ta.js.gz +0 -0
- package/payload/server/public/assets/browser-D6Y_Zu8C.js.br +0 -0
- package/payload/server/public/assets/browser-D6Y_Zu8C.js.gz +0 -0
- package/payload/server/public/assets/calendar-DD4oVa-r.js.br +0 -0
- package/payload/server/public/assets/calendar-DD4oVa-r.js.gz +0 -0
- package/payload/server/public/assets/chat-CwWs69PO.js +0 -1
- package/payload/server/public/assets/chat-CwWs69PO.js.br +0 -0
- package/payload/server/public/assets/chat-CwWs69PO.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-ClfIy5Fx.js +0 -1
- package/payload/server/public/assets/chevron-right-B0QvXpxl.js +0 -1
- package/payload/server/public/assets/chevron-right-B0QvXpxl.js.br +0 -0
- package/payload/server/public/assets/clock-BIaRnIP_.js +0 -1
- package/payload/server/public/assets/clock-BIaRnIP_.js.br +0 -0
- package/payload/server/public/assets/clock-BIaRnIP_.js.gz +0 -0
- package/payload/server/public/assets/data-O_9Kiicl.js +0 -1
- package/payload/server/public/assets/data-O_9Kiicl.js.br +0 -2
- package/payload/server/public/assets/data-O_9Kiicl.js.gz +0 -0
- package/payload/server/public/assets/file-download-sXU3_umF.js.br +0 -0
- package/payload/server/public/assets/file-download-sXU3_umF.js.gz +0 -0
- package/payload/server/public/assets/file-text-CeXBviDH.js.br +0 -0
- package/payload/server/public/assets/file-text-CeXBviDH.js.gz +0 -0
- package/payload/server/public/assets/graph-BSuDP6k7.js.br +0 -0
- package/payload/server/public/assets/graph-BSuDP6k7.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-D2pQkgYW.js.br +0 -0
- package/payload/server/public/assets/graph-labels-D2pQkgYW.js.gz +0 -0
- package/payload/server/public/assets/maximize-2-DlzSNygU.js.br +0 -0
- package/payload/server/public/assets/maximize-2-DlzSNygU.js.gz +0 -0
- package/payload/server/public/assets/operator-BP61-xjz.js.br +0 -0
- package/payload/server/public/assets/operator-BP61-xjz.js.gz +0 -0
- package/payload/server/public/assets/page-DX7ArY_s.js.br +0 -0
- package/payload/server/public/assets/page-DX7ArY_s.js.gz +0 -0
- package/payload/server/public/assets/page-eQ4OVros.js.br +0 -0
- package/payload/server/public/assets/page-eQ4OVros.js.gz +0 -0
- package/payload/server/public/assets/public-DPDKFKM2.js.br +0 -0
- package/payload/server/public/assets/public-DPDKFKM2.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-BR0JbPFV.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-BR0JbPFV.js.gz +0 -0
- package/payload/server/public/assets/routines-y413YZa-.js +0 -1
- package/payload/server/public/assets/routines-y413YZa-.js.br +0 -0
- package/payload/server/public/assets/routines-y413YZa-.js.gz +0 -0
- package/payload/server/public/assets/skills-fH0uA7cj.js.br +0 -0
- package/payload/server/public/assets/skills-fH0uA7cj.js.gz +0 -0
- package/payload/server/public/assets/tasks-CrVzFrTR.js.br +0 -0
- package/payload/server/public/assets/tasks-CrVzFrTR.js.gz +0 -0
- package/payload/server/public/assets/time-entry-format-C_0jiMpQ.js.br +0 -1
- package/payload/server/public/assets/time-entry-format-C_0jiMpQ.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-eLJHC_QJ.js.br +0 -1
- package/payload/server/public/assets/triangle-alert-eLJHC_QJ.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-vPCmdOmY.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-vPCmdOmY.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-DxuUS_C7.css.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-D5bFDRqL.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-D5bFDRqL.js.gz +0 -0
- package/payload/server/public/assets/wrench-sXisQXkf.js.br +0 -0
- package/payload/server/public/assets/wrench-sXisQXkf.js.gz +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-DMr3DR5N.js → useSubAccountSwitcher-BEwQMRMo.js} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-DMr3DR5N.js.br → useSubAccountSwitcher-BEwQMRMo.js.br} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-DMr3DR5N.js.gz → useSubAccountSwitcher-BEwQMRMo.js.gz} +0 -0
package/dist/index.js
CHANGED
|
@@ -3385,6 +3385,19 @@ function setupAccount() {
|
|
|
3385
3385
|
logFile(` [neo4j] passing NEO4J_URI=${neo4jUri} to seed`);
|
|
3386
3386
|
shell("bash", [seedScript], { cwd: INSTALL_DIR, env: neo4jEnv });
|
|
3387
3387
|
}
|
|
3388
|
+
// Task 2213 — converge :Event.startDate onto canonical UTC. The dispatcher
|
|
3389
|
+
// compares startDate to new Date().toISOString() LEXICALLY, so a row storing
|
|
3390
|
+
// a +01:00 offset fires 60 minutes late under BST. Runs after the seed so the
|
|
3391
|
+
// schema exists, with the same Neo4j env, and needs PLATFORM_ROOT to scope
|
|
3392
|
+
// itself to this install's accounts on a shared Neo4j. Idempotent: a converged
|
|
3393
|
+
// install rewrites nothing and prints op=done rewritten=0.
|
|
3394
|
+
const convergeStartDate = join(INSTALL_DIR, "platform/plugins/scheduling/mcp/dist/scripts/converge-startdate-utc.js");
|
|
3395
|
+
if (existsSync(convergeStartDate)) {
|
|
3396
|
+
shell("node", [convergeStartDate], {
|
|
3397
|
+
cwd: INSTALL_DIR,
|
|
3398
|
+
env: { ...neo4jEnv, PLATFORM_ROOT: join(INSTALL_DIR, "platform") },
|
|
3399
|
+
});
|
|
3400
|
+
}
|
|
3388
3401
|
// Task 165 — register every bundled specialist subagent at
|
|
3389
3402
|
// $CLAUDE_CONFIG_DIR/agents/<name>.md. Claude Code's `--agent <name>`
|
|
3390
3403
|
// discovery only resolves under this path; without these symlinks,
|
package/package.json
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The `account.json` field holding the token. */
|
|
2
|
+
export declare const INGEST_TOKEN_FIELD: "ingestToken";
|
|
3
|
+
/** The account's current token, or null when none is set or it is malformed. */
|
|
4
|
+
export declare function readIngestToken(accountsDir: string, accountId: string): string | null;
|
|
5
|
+
/** Mint on first call; return the existing token unchanged on every call after. */
|
|
6
|
+
export declare function ensureIngestToken(accountsDir: string, accountId: string): {
|
|
7
|
+
token: string;
|
|
8
|
+
minted: boolean;
|
|
9
|
+
};
|
|
10
|
+
/** Issue a replacement, invalidating every extension install holding the old one. */
|
|
11
|
+
export declare function rotateIngestToken(accountsDir: string, accountId: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Reverse lookup: which account owns this token.
|
|
14
|
+
*
|
|
15
|
+
* Compared with `timingSafeEqual` because the token is a bearer secret and a
|
|
16
|
+
* length- or prefix-sensitive compare leaks it across repeated calls. The shape
|
|
17
|
+
* check runs first so a malformed input costs no disk reads at all — which is
|
|
18
|
+
* the common case, since a pasted conversation session key is a UUID.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveAccountIdByIngestToken(accountsDir: string, token: string): string | null;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,kDAAkD;AAClD,eAAO,MAAM,kBAAkB,EAAG,aAAsB,CAAC;AA2CzD,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrF;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAIpC;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhF;AA0BD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAYf"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INGEST_TOKEN_FIELD = void 0;
|
|
4
|
+
exports.readIngestToken = readIngestToken;
|
|
5
|
+
exports.ensureIngestToken = ensureIngestToken;
|
|
6
|
+
exports.rotateIngestToken = rotateIngestToken;
|
|
7
|
+
exports.resolveAccountIdByIngestToken = resolveAccountIdByIngestToken;
|
|
8
|
+
/**
|
|
9
|
+
* Per-account LinkedIn ingest token (Task 2208).
|
|
10
|
+
*
|
|
11
|
+
* The admin browser's `session_key` cannot serve as the extension's credential.
|
|
12
|
+
* It lives in an in-memory Map with a 24h TTL (`platform/ui/app/lib/claude-agent/
|
|
13
|
+
* session-store.ts`), every service restart wipes it, and starting a new chat
|
|
14
|
+
* session rotates it. No cookie ever carried it either, so the documented
|
|
15
|
+
* "copy session_key from the cookie" instruction named something that does not
|
|
16
|
+
* exist and operators pasted conversation session keys instead.
|
|
17
|
+
*
|
|
18
|
+
* This token is a durable bearer secret held in `account.json`: minted once on
|
|
19
|
+
* request by the `linkedin-ingest-token` admin MCP tool, then stable across
|
|
20
|
+
* restarts, new sessions and time.
|
|
21
|
+
*
|
|
22
|
+
* Pure by construction. Callers supply `accountsDir`, and the reverse lookup
|
|
23
|
+
* takes the account-id list from `account-enumeration` as a parameter, so this
|
|
24
|
+
* module reads no environment and depends on no sibling lib.
|
|
25
|
+
*/
|
|
26
|
+
const node_crypto_1 = require("node:crypto");
|
|
27
|
+
const node_fs_1 = require("node:fs");
|
|
28
|
+
const node_path_1 = require("node:path");
|
|
29
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
30
|
+
/** The `account.json` field holding the token. */
|
|
31
|
+
exports.INGEST_TOKEN_FIELD = "ingestToken";
|
|
32
|
+
const TOKEN_BYTES = 32;
|
|
33
|
+
/** 32 bytes hex-encoded. Anything else on disk is treated as absent. */
|
|
34
|
+
const TOKEN_RE = /^[0-9a-f]{64}$/;
|
|
35
|
+
function configPath(accountsDir, accountId) {
|
|
36
|
+
return (0, node_path_1.resolve)(accountsDir, accountId, "account.json");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* null on a missing or unparseable config. Corruption is never a partial read:
|
|
40
|
+
* a half-understood account.json must not produce a token decision.
|
|
41
|
+
*/
|
|
42
|
+
function readConfig(accountsDir, accountId) {
|
|
43
|
+
const path = configPath(accountsDir, accountId);
|
|
44
|
+
if (!(0, node_fs_1.existsSync)(path))
|
|
45
|
+
return null;
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8"));
|
|
48
|
+
return parsed !== null && typeof parsed === "object"
|
|
49
|
+
? parsed
|
|
50
|
+
: null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function writeToken(accountsDir, accountId) {
|
|
57
|
+
const config = readConfig(accountsDir, accountId);
|
|
58
|
+
if (!config) {
|
|
59
|
+
throw new Error(`[ingest-token] no readable account.json for accountId=${accountId}`);
|
|
60
|
+
}
|
|
61
|
+
const token = (0, node_crypto_1.randomBytes)(TOKEN_BYTES).toString("hex");
|
|
62
|
+
config[exports.INGEST_TOKEN_FIELD] = token;
|
|
63
|
+
(0, node_fs_1.writeFileSync)(configPath(accountsDir, accountId), JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
64
|
+
return token;
|
|
65
|
+
}
|
|
66
|
+
/** The account's current token, or null when none is set or it is malformed. */
|
|
67
|
+
function readIngestToken(accountsDir, accountId) {
|
|
68
|
+
const value = readConfig(accountsDir, accountId)?.[exports.INGEST_TOKEN_FIELD];
|
|
69
|
+
return typeof value === "string" && TOKEN_RE.test(value) ? value : null;
|
|
70
|
+
}
|
|
71
|
+
/** Mint on first call; return the existing token unchanged on every call after. */
|
|
72
|
+
function ensureIngestToken(accountsDir, accountId) {
|
|
73
|
+
const existing = readIngestToken(accountsDir, accountId);
|
|
74
|
+
if (existing)
|
|
75
|
+
return { token: existing, minted: false };
|
|
76
|
+
return { token: writeToken(accountsDir, accountId), minted: true };
|
|
77
|
+
}
|
|
78
|
+
/** Issue a replacement, invalidating every extension install holding the old one. */
|
|
79
|
+
function rotateIngestToken(accountsDir, accountId) {
|
|
80
|
+
return writeToken(accountsDir, accountId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Every UUID-shaped account dir carrying an account.json, scanned fresh.
|
|
84
|
+
*
|
|
85
|
+
* Deliberately NOT `account-enumeration`'s `enumerateValidAccountIds`: that is a
|
|
86
|
+
* per-process cached list, and its own module doc records that the install-time
|
|
87
|
+
* invariant no longer holds because `account_create` provisions sub-accounts
|
|
88
|
+
* during a live session, so the cached list is stale for exactly the account
|
|
89
|
+
* that just minted a token. This endpoint runs once per pill click, at human
|
|
90
|
+
* rate, so a fresh readdir is the right trade against a token that authenticates
|
|
91
|
+
* only after a restart.
|
|
92
|
+
*/
|
|
93
|
+
function listAccountIdsOnDisk(accountsDir) {
|
|
94
|
+
if (!(0, node_fs_1.existsSync)(accountsDir))
|
|
95
|
+
return [];
|
|
96
|
+
let entries;
|
|
97
|
+
try {
|
|
98
|
+
entries = (0, node_fs_1.readdirSync)(accountsDir);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
return entries.filter((name) => UUID_RE.test(name) && (0, node_fs_1.existsSync)((0, node_path_1.resolve)(accountsDir, name, "account.json")));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reverse lookup: which account owns this token.
|
|
107
|
+
*
|
|
108
|
+
* Compared with `timingSafeEqual` because the token is a bearer secret and a
|
|
109
|
+
* length- or prefix-sensitive compare leaks it across repeated calls. The shape
|
|
110
|
+
* check runs first so a malformed input costs no disk reads at all — which is
|
|
111
|
+
* the common case, since a pasted conversation session key is a UUID.
|
|
112
|
+
*/
|
|
113
|
+
function resolveAccountIdByIngestToken(accountsDir, token) {
|
|
114
|
+
if (typeof token !== "string" || !TOKEN_RE.test(token))
|
|
115
|
+
return null;
|
|
116
|
+
const probe = Buffer.from(token, "utf-8");
|
|
117
|
+
for (const accountId of listAccountIdsOnDisk(accountsDir)) {
|
|
118
|
+
const stored = readIngestToken(accountsDir, accountId);
|
|
119
|
+
if (!stored)
|
|
120
|
+
continue;
|
|
121
|
+
const candidate = Buffer.from(stored, "utf-8");
|
|
122
|
+
if (candidate.length === probe.length && (0, node_crypto_1.timingSafeEqual)(candidate, probe)) {
|
|
123
|
+
return accountId;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAqEA,0CAGC;AAGD,8CAOC;AAGD,8CAEC;AAkCD,sEAeC;AAxID;;;;;;;;;;;;;;;;;GAiBG;AACH,6CAA2D;AAC3D,qCAA+E;AAC/E,yCAAoC;AAEpC,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF,kDAAkD;AACrC,QAAA,kBAAkB,GAAG,aAAsB,CAAC;AAEzD,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,wEAAwE;AACxE,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAElC,SAAS,UAAU,CAAC,WAAmB,EAAE,SAAiB;IACxD,OAAO,IAAA,mBAAO,EAAC,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,WAAmB,EAAE,SAAiB;IACxD,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAClD,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,WAAmB,EAAE,SAAiB;IACxD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yDAAyD,SAAS,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,yBAAW,EAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,CAAC,0BAAkB,CAAC,GAAG,KAAK,CAAC;IACnC,IAAA,uBAAa,EACX,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,EAClC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACtC,OAAO,CACR,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,SAAgB,eAAe,CAAC,WAAmB,EAAE,SAAiB;IACpE,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,0BAAkB,CAAC,CAAC;IACvE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,mFAAmF;AACnF,SAAgB,iBAAiB,CAC/B,WAAmB,EACnB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxD,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,qFAAqF;AACrF,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,SAAiB;IACtE,OAAO,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,WAAmB;IAC/C,IAAI,CAAC,IAAA,oBAAU,EAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,IAAA,qBAAW,EAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,WAAW,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CACvF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,6BAA6B,CAC3C,WAAmB,EACnB,KAAa;IAEb,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAA,6BAAe,EAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-account LinkedIn ingest token (Task 2208).
|
|
3
|
+
*
|
|
4
|
+
* The admin browser's `session_key` cannot serve as the extension's credential.
|
|
5
|
+
* It lives in an in-memory Map with a 24h TTL (`platform/ui/app/lib/claude-agent/
|
|
6
|
+
* session-store.ts`), every service restart wipes it, and starting a new chat
|
|
7
|
+
* session rotates it. No cookie ever carried it either, so the documented
|
|
8
|
+
* "copy session_key from the cookie" instruction named something that does not
|
|
9
|
+
* exist and operators pasted conversation session keys instead.
|
|
10
|
+
*
|
|
11
|
+
* This token is a durable bearer secret held in `account.json`: minted once on
|
|
12
|
+
* request by the `linkedin-ingest-token` admin MCP tool, then stable across
|
|
13
|
+
* restarts, new sessions and time.
|
|
14
|
+
*
|
|
15
|
+
* Pure by construction. Callers supply `accountsDir`, and the reverse lookup
|
|
16
|
+
* takes the account-id list from `account-enumeration` as a parameter, so this
|
|
17
|
+
* module reads no environment and depends on no sibling lib.
|
|
18
|
+
*/
|
|
19
|
+
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
20
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { resolve } from "node:path";
|
|
22
|
+
|
|
23
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
24
|
+
|
|
25
|
+
/** The `account.json` field holding the token. */
|
|
26
|
+
export const INGEST_TOKEN_FIELD = "ingestToken" as const;
|
|
27
|
+
|
|
28
|
+
const TOKEN_BYTES = 32;
|
|
29
|
+
|
|
30
|
+
/** 32 bytes hex-encoded. Anything else on disk is treated as absent. */
|
|
31
|
+
const TOKEN_RE = /^[0-9a-f]{64}$/;
|
|
32
|
+
|
|
33
|
+
function configPath(accountsDir: string, accountId: string): string {
|
|
34
|
+
return resolve(accountsDir, accountId, "account.json");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* null on a missing or unparseable config. Corruption is never a partial read:
|
|
39
|
+
* a half-understood account.json must not produce a token decision.
|
|
40
|
+
*/
|
|
41
|
+
function readConfig(accountsDir: string, accountId: string): Record<string, unknown> | null {
|
|
42
|
+
const path = configPath(accountsDir, accountId);
|
|
43
|
+
if (!existsSync(path)) return null;
|
|
44
|
+
try {
|
|
45
|
+
const parsed: unknown = JSON.parse(readFileSync(path, "utf-8"));
|
|
46
|
+
return parsed !== null && typeof parsed === "object"
|
|
47
|
+
? (parsed as Record<string, unknown>)
|
|
48
|
+
: null;
|
|
49
|
+
} catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function writeToken(accountsDir: string, accountId: string): string {
|
|
55
|
+
const config = readConfig(accountsDir, accountId);
|
|
56
|
+
if (!config) {
|
|
57
|
+
throw new Error(`[ingest-token] no readable account.json for accountId=${accountId}`);
|
|
58
|
+
}
|
|
59
|
+
const token = randomBytes(TOKEN_BYTES).toString("hex");
|
|
60
|
+
config[INGEST_TOKEN_FIELD] = token;
|
|
61
|
+
writeFileSync(
|
|
62
|
+
configPath(accountsDir, accountId),
|
|
63
|
+
JSON.stringify(config, null, 2) + "\n",
|
|
64
|
+
"utf-8",
|
|
65
|
+
);
|
|
66
|
+
return token;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The account's current token, or null when none is set or it is malformed. */
|
|
70
|
+
export function readIngestToken(accountsDir: string, accountId: string): string | null {
|
|
71
|
+
const value = readConfig(accountsDir, accountId)?.[INGEST_TOKEN_FIELD];
|
|
72
|
+
return typeof value === "string" && TOKEN_RE.test(value) ? value : null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Mint on first call; return the existing token unchanged on every call after. */
|
|
76
|
+
export function ensureIngestToken(
|
|
77
|
+
accountsDir: string,
|
|
78
|
+
accountId: string,
|
|
79
|
+
): { token: string; minted: boolean } {
|
|
80
|
+
const existing = readIngestToken(accountsDir, accountId);
|
|
81
|
+
if (existing) return { token: existing, minted: false };
|
|
82
|
+
return { token: writeToken(accountsDir, accountId), minted: true };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Issue a replacement, invalidating every extension install holding the old one. */
|
|
86
|
+
export function rotateIngestToken(accountsDir: string, accountId: string): string {
|
|
87
|
+
return writeToken(accountsDir, accountId);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Every UUID-shaped account dir carrying an account.json, scanned fresh.
|
|
92
|
+
*
|
|
93
|
+
* Deliberately NOT `account-enumeration`'s `enumerateValidAccountIds`: that is a
|
|
94
|
+
* per-process cached list, and its own module doc records that the install-time
|
|
95
|
+
* invariant no longer holds because `account_create` provisions sub-accounts
|
|
96
|
+
* during a live session, so the cached list is stale for exactly the account
|
|
97
|
+
* that just minted a token. This endpoint runs once per pill click, at human
|
|
98
|
+
* rate, so a fresh readdir is the right trade against a token that authenticates
|
|
99
|
+
* only after a restart.
|
|
100
|
+
*/
|
|
101
|
+
function listAccountIdsOnDisk(accountsDir: string): string[] {
|
|
102
|
+
if (!existsSync(accountsDir)) return [];
|
|
103
|
+
let entries: string[];
|
|
104
|
+
try {
|
|
105
|
+
entries = readdirSync(accountsDir);
|
|
106
|
+
} catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
return entries.filter(
|
|
110
|
+
(name) => UUID_RE.test(name) && existsSync(resolve(accountsDir, name, "account.json")),
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Reverse lookup: which account owns this token.
|
|
116
|
+
*
|
|
117
|
+
* Compared with `timingSafeEqual` because the token is a bearer secret and a
|
|
118
|
+
* length- or prefix-sensitive compare leaks it across repeated calls. The shape
|
|
119
|
+
* check runs first so a malformed input costs no disk reads at all — which is
|
|
120
|
+
* the common case, since a pasted conversation session key is a UUID.
|
|
121
|
+
*/
|
|
122
|
+
export function resolveAccountIdByIngestToken(
|
|
123
|
+
accountsDir: string,
|
|
124
|
+
token: string,
|
|
125
|
+
): string | null {
|
|
126
|
+
if (typeof token !== "string" || !TOKEN_RE.test(token)) return null;
|
|
127
|
+
const probe = Buffer.from(token, "utf-8");
|
|
128
|
+
for (const accountId of listAccountIdsOnDisk(accountsDir)) {
|
|
129
|
+
const stored = readIngestToken(accountsDir, accountId);
|
|
130
|
+
if (!stored) continue;
|
|
131
|
+
const candidate = Buffer.from(stored, "utf-8");
|
|
132
|
+
if (candidate.length === probe.length && timingSafeEqual(candidate, probe)) {
|
|
133
|
+
return accountId;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
@@ -78,6 +78,11 @@ export interface DispatchDestination {
|
|
|
78
78
|
channel: AgentChannel;
|
|
79
79
|
destination: string;
|
|
80
80
|
label: DispatchLabel;
|
|
81
|
+
/** Task 2204 — a display-only person name, attached by a CALLER that has a
|
|
82
|
+
* graph to read. `listDispatchDestinations` never sets it: this module reads
|
|
83
|
+
* account.json and nothing else, and `validateAgentDestination` never
|
|
84
|
+
* consults it. Absent means no `:Person` matched, which is not an error. */
|
|
85
|
+
name?: string;
|
|
81
86
|
}
|
|
82
87
|
/**
|
|
83
88
|
* Every destination `accountId` may legally bind, computed from the same lists
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC1C;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG;wCACwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;uCAEuC;AACvC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC;AAC3F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAwDrG;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAOf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAkBrB;AAED;;uDAEuD;AACvD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEjF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC1C;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG;wCACwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,sCAAsC;AACtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;uCAEuC;AACvC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC;AAC3F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAwDrG;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAOf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAkBrB;AAED;;uDAEuD;AACvD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEjF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB;;;iFAG6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,mBAAmB,EAAE,CAsCxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AA4CA,sCAOC;AAGD,kCAIC;AAaD,8CAqDC;AASD,0EAWC;AAOD,gDAMC;AAqBD,4DAwBC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -211,6 +211,11 @@ export interface DispatchDestination {
|
|
|
211
211
|
channel: AgentChannel;
|
|
212
212
|
destination: string;
|
|
213
213
|
label: DispatchLabel;
|
|
214
|
+
/** Task 2204 — a display-only person name, attached by a CALLER that has a
|
|
215
|
+
* graph to read. `listDispatchDestinations` never sets it: this module reads
|
|
216
|
+
* account.json and nothing else, and `validateAgentDestination` never
|
|
217
|
+
* consults it. Absent means no `:Person` matched, which is not an error. */
|
|
218
|
+
name?: string;
|
|
214
219
|
}
|
|
215
220
|
|
|
216
221
|
/**
|
|
@@ -70,6 +70,14 @@ export interface RoutineVerifyCounts {
|
|
|
70
70
|
actual: number;
|
|
71
71
|
suspended: number;
|
|
72
72
|
nextRunNull: number;
|
|
73
|
+
/** Task 2214 — roster rows holding no description. Zero is the healthy value
|
|
74
|
+
* on every account, not only a fresh one: `VERIFY_CYPHER` matches
|
|
75
|
+
* `routineTemplate IS NOT NULL`, so operator-created routines are outside
|
|
76
|
+
* its scope and cannot contribute, and `ON MATCH` writes the description
|
|
77
|
+
* unconditionally, so an operator-edited row is covered too. Anything above
|
|
78
|
+
* zero while `expected === actual` is a MERGE that wrote no description —
|
|
79
|
+
* the one failure here that emits no error and does not reproduce. */
|
|
80
|
+
descNull: number;
|
|
73
81
|
}
|
|
74
82
|
export interface RoutineSeedReport {
|
|
75
83
|
accountId: string;
|
|
@@ -114,11 +122,19 @@ export declare function resolveOwnerTimezone(session: SeedSessionLike, accountId
|
|
|
114
122
|
* `agentChannel`, not `agentDestination`, not `recurrence`, not `timezone`. A
|
|
115
123
|
* re-seed on upgrade must not re-suspend an enabled routine, unbind a bound
|
|
116
124
|
* destination, or reset a retimed cron. Only the prompt, the name and the
|
|
117
|
-
* version move, and only when the row is behind and unedited.
|
|
118
|
-
|
|
125
|
+
* version move, and only when the row is behind and unedited.
|
|
126
|
+
*
|
|
127
|
+
* `routineDescription` (Task 2214) is the one property ON MATCH writes on
|
|
128
|
+
* every match rather than only on the refresh branch, and that is not an
|
|
129
|
+
* exception to the rule above. It is roster-owned: the routines route projects
|
|
130
|
+
* it but its PATCH field set refuses it, so no operator edit exists for this
|
|
131
|
+
* to overwrite. Gating it on `refreshing` would leave every operator-edited
|
|
132
|
+
* row description-less permanently, because `skip-operator-edited` takes
|
|
133
|
+
* neither branch, and that row's card would show a title and nothing else. */
|
|
134
|
+
export declare const MERGE_CYPHER = "\nUNWIND $rows AS row\nOPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})\nWITH row,\n pre IS NOT NULL AS existed,\n coalesce(pre.routineTemplateVersion, 0) AS priorVersion,\n pre.operatorEdited IS NOT NULL AS edited\nWITH row, existed, priorVersion, edited,\n (existed AND NOT edited AND priorVersion < $version) AS refreshing\nMERGE (e:Event {accountId: $accountId, routineTemplate: row.key})\n ON CREATE SET e.eventId = randomUUID(),\n e.name = row.name,\n e.routineDescription = row.description,\n e.agentPrompt = row.prompt,\n e.recurrence = row.recurrence,\n e.routineTemplateVersion = $version,\n e.eventStatus = 'suspended',\n e.nextRun = null,\n e.agentChannel = null,\n e.agentDestination = null,\n e.actionPlugin = null,\n e.actionTool = null,\n e.actionArgs = null,\n e.sourcePlugin = null,\n e.timezone = $timezone,\n e.createdBySource = 'installer',\n e.createdByAgent = 'system',\n e.createdByTool = 'routine-roster-seed',\n e.createdAt = $now,\n e.updatedAt = $now\n ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,\n e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,\n e.routineDescription = row.description,\n e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,\n e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END\nRETURN row.key AS key,\n e.eventId AS eventId,\n CASE WHEN NOT existed THEN 'create'\n WHEN priorVersion >= $version THEN 'unchanged'\n WHEN edited THEN 'skip-operator-edited'\n ELSE 'refresh-version' END AS action";
|
|
119
135
|
/** The post-condition read. Counts every roster row the account actually holds,
|
|
120
136
|
* independently of what the MERGE above believes it wrote. */
|
|
121
|
-
export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull";
|
|
137
|
+
export declare const VERIFY_CYPHER = "\nMATCH (e:Event {accountId: $accountId})\nWHERE e.routineTemplate IS NOT NULL\nRETURN count(e) AS actual,\n sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,\n sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,\n sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull";
|
|
122
138
|
export interface SeedRoutineRosterArgs {
|
|
123
139
|
session: SeedSessionLike;
|
|
124
140
|
accountId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;2EAG2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAClH;AAED;;;;;;;4EAO4E;AAC5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;;0EAM0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;2EAMuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,eAAe,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAYD;4DAC4D;AAC5D,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAA;CAAE,CAAC,CAa1E;AAED;;;;;;;;;;;;;;;;;;;;+EAoB+E;AAC/E,eAAO,MAAM,YAAY,28DAwCwB,CAAC;AAElD;+DAC+D;AAC/D,eAAO,MAAM,aAAa,+VAMuD,CAAC;AAElF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,+DAA+D;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;sEACkE;IAClE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgF/F"}
|
|
@@ -90,7 +90,15 @@ async function resolveOwnerTimezone(session, accountId) {
|
|
|
90
90
|
* `agentChannel`, not `agentDestination`, not `recurrence`, not `timezone`. A
|
|
91
91
|
* re-seed on upgrade must not re-suspend an enabled routine, unbind a bound
|
|
92
92
|
* destination, or reset a retimed cron. Only the prompt, the name and the
|
|
93
|
-
* version move, and only when the row is behind and unedited.
|
|
93
|
+
* version move, and only when the row is behind and unedited.
|
|
94
|
+
*
|
|
95
|
+
* `routineDescription` (Task 2214) is the one property ON MATCH writes on
|
|
96
|
+
* every match rather than only on the refresh branch, and that is not an
|
|
97
|
+
* exception to the rule above. It is roster-owned: the routines route projects
|
|
98
|
+
* it but its PATCH field set refuses it, so no operator edit exists for this
|
|
99
|
+
* to overwrite. Gating it on `refreshing` would leave every operator-edited
|
|
100
|
+
* row description-less permanently, because `skip-operator-edited` takes
|
|
101
|
+
* neither branch, and that row's card would show a title and nothing else. */
|
|
94
102
|
exports.MERGE_CYPHER = `
|
|
95
103
|
UNWIND $rows AS row
|
|
96
104
|
OPTIONAL MATCH (pre:Event {accountId: $accountId, routineTemplate: row.key})
|
|
@@ -103,6 +111,7 @@ WITH row, existed, priorVersion, edited,
|
|
|
103
111
|
MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
|
|
104
112
|
ON CREATE SET e.eventId = randomUUID(),
|
|
105
113
|
e.name = row.name,
|
|
114
|
+
e.routineDescription = row.description,
|
|
106
115
|
e.agentPrompt = row.prompt,
|
|
107
116
|
e.recurrence = row.recurrence,
|
|
108
117
|
e.routineTemplateVersion = $version,
|
|
@@ -122,6 +131,7 @@ MERGE (e:Event {accountId: $accountId, routineTemplate: row.key})
|
|
|
122
131
|
e.updatedAt = $now
|
|
123
132
|
ON MATCH SET e.agentPrompt = CASE WHEN refreshing THEN row.prompt ELSE e.agentPrompt END,
|
|
124
133
|
e.name = CASE WHEN refreshing THEN row.name ELSE e.name END,
|
|
134
|
+
e.routineDescription = row.description,
|
|
125
135
|
e.routineTemplateVersion = CASE WHEN refreshing THEN $version ELSE e.routineTemplateVersion END,
|
|
126
136
|
e.updatedAt = CASE WHEN refreshing THEN $now ELSE e.updatedAt END
|
|
127
137
|
RETURN row.key AS key,
|
|
@@ -137,7 +147,8 @@ MATCH (e:Event {accountId: $accountId})
|
|
|
137
147
|
WHERE e.routineTemplate IS NOT NULL
|
|
138
148
|
RETURN count(e) AS actual,
|
|
139
149
|
sum(CASE WHEN e.eventStatus = 'suspended' THEN 1 ELSE 0 END) AS suspended,
|
|
140
|
-
sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull
|
|
150
|
+
sum(CASE WHEN e.nextRun IS NULL THEN 1 ELSE 0 END) AS nextRunNull,
|
|
151
|
+
sum(CASE WHEN e.routineDescription IS NULL THEN 1 ELSE 0 END) AS descNull`;
|
|
141
152
|
/**
|
|
142
153
|
* Seed (or re-seed) the roster for one account and report what happened.
|
|
143
154
|
*
|
|
@@ -163,7 +174,13 @@ async function seedRoutineRoster(args) {
|
|
|
163
174
|
version,
|
|
164
175
|
timezone,
|
|
165
176
|
now,
|
|
166
|
-
rows: roster.map((r) => ({
|
|
177
|
+
rows: roster.map((r) => ({
|
|
178
|
+
key: r.key,
|
|
179
|
+
name: r.name,
|
|
180
|
+
description: r.description,
|
|
181
|
+
prompt: r.prompt,
|
|
182
|
+
recurrence: r.recurrence,
|
|
183
|
+
})),
|
|
167
184
|
});
|
|
168
185
|
const merges = mergeRes.records.map((rec) => ({
|
|
169
186
|
key: String(rec.get("key")),
|
|
@@ -180,9 +197,10 @@ async function seedRoutineRoster(args) {
|
|
|
180
197
|
actual: toInt(verifyRec?.get("actual")),
|
|
181
198
|
suspended: toInt(verifyRec?.get("suspended")),
|
|
182
199
|
nextRunNull: toInt(verifyRec?.get("nextRunNull")),
|
|
200
|
+
descNull: toInt(verifyRec?.get("descNull")),
|
|
183
201
|
};
|
|
184
202
|
log(`[routine-seed] op=verify acct=${acct} expected=${verify.expected} actual=${verify.actual} ` +
|
|
185
|
-
`suspended=${verify.suspended} nextRunNull=${verify.nextRunNull}`);
|
|
203
|
+
`suspended=${verify.suspended} nextRunNull=${verify.nextRunNull} descNull=${verify.descNull}`);
|
|
186
204
|
const created = merges.filter((m) => m.action === "create").length;
|
|
187
205
|
const refreshed = merges.filter((m) => m.action === "refresh-version").length;
|
|
188
206
|
const skippedOperatorEdited = merges.filter((m) => m.action === "skip-operator-edited").length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A fresh install used to ship zero routines, so the only working examples
|
|
5
5
|
* lived in one customer's graph and every operator wrote the prompts from
|
|
6
|
-
* scratch. These
|
|
6
|
+
* scratch. These thirteen are the catalogue that ships with the platform
|
|
7
|
+
* instead.
|
|
7
8
|
*
|
|
8
9
|
* Two properties make a routine shippable, and both are load-bearing:
|
|
9
10
|
*
|
|
10
11
|
* 1. It resolves its own surfaces at run time. Every prompt opens on
|
|
11
12
|
* `capabilities-here`, which reports the account's live install set, and
|
|
12
13
|
* ends the turn without replying when the surface it needs is absent. That
|
|
13
|
-
* is what makes the same
|
|
14
|
-
* and a field-service install rather than a template someone must
|
|
14
|
+
* is what makes the same thirteen rows correct on an estate agency, a web
|
|
15
|
+
* studio and a field-service install rather than a template someone must
|
|
16
|
+
* edit.
|
|
15
17
|
*
|
|
16
18
|
* 2. It names nobody. No prompt carries a person's name, an email address, a
|
|
17
19
|
* phone number, a hostname or a database name. `scripts/check-routine-
|
|
@@ -32,7 +34,7 @@
|
|
|
32
34
|
* routine's prompt only when the stored `routineTemplateVersion` is BELOW this
|
|
33
35
|
* and no operator has edited the row, so an unbumped edit ships to new installs
|
|
34
36
|
* and never reaches existing ones — bump it in the same commit as the edit. */
|
|
35
|
-
export declare const ROUTINE_TEMPLATE_VERSION =
|
|
37
|
+
export declare const ROUTINE_TEMPLATE_VERSION = 2;
|
|
36
38
|
export interface RoutineTemplate {
|
|
37
39
|
/** Stable identity. Half of the MERGE key `(accountId, routineTemplate)`, so
|
|
38
40
|
* it is never renamed: a renamed key seeds a duplicate row and orphans the
|
|
@@ -40,15 +42,26 @@ export interface RoutineTemplate {
|
|
|
40
42
|
readonly key: string;
|
|
41
43
|
/** The title shown on `/routines`. */
|
|
42
44
|
readonly name: string;
|
|
45
|
+
/** One sentence under the title on the card: what this does and what it will
|
|
46
|
+
* not do. Roster-owned and read-only — projected by the routines route but
|
|
47
|
+
* absent from its PATCH field set, so no operator edit exists for the seed to
|
|
48
|
+
* overwrite and the MERGE rewrites it on every match. */
|
|
49
|
+
readonly description: string;
|
|
43
50
|
/** The proposed cron. Written ON CREATE only, never refreshed, so an operator
|
|
44
51
|
* who retimes a routine keeps their expression across upgrades. */
|
|
45
52
|
readonly recurrence: string;
|
|
46
53
|
/** The injected turn. Refreshed on a version bump when the row is unedited. */
|
|
47
54
|
readonly prompt: string;
|
|
48
55
|
}
|
|
49
|
-
/** The
|
|
56
|
+
/** The thirteen. Order is the display order on `/routines` before the operator
|
|
50
57
|
* retimes anything: the daily rhythm first, then the reconciles, then the
|
|
51
|
-
* weekly, then the standing check.
|
|
58
|
+
* weekly, then the standing check, then the two health reports.
|
|
59
|
+
*
|
|
60
|
+
* `description` is what the card shows under the title. It says what the row
|
|
61
|
+
* does and, where the row is deliberately narrower than its name suggests,
|
|
62
|
+
* what it will not do — the send it never makes, the write it never performs,
|
|
63
|
+
* the file it never deletes. That second half is the part an operator cannot
|
|
64
|
+
* infer from a title, and it is why the sentence is not just the name again. */
|
|
52
65
|
export declare const ROUTINE_ROSTER: readonly RoutineTemplate[];
|
|
53
66
|
/** Every roster key, in roster order. The scheduling heartbeat's `op=roster`
|
|
54
67
|
* drift check reconciles this expected set against what is actually in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;8DAG0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAgKD;;;;;;;;iFAQiF;AACjF,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAyGpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}
|