@rubytech/create-sitedesk-code 0.1.522 → 0.1.523
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/package.json +1 -1
- package/payload/platform/lib/graph-style/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-style/dist/index.js +28 -0
- package/payload/platform/lib/graph-style/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-style/src/__tests__/caption-coverage.test.ts +7 -0
- package/payload/platform/lib/graph-style/src/index.ts +24 -0
- package/payload/platform/lib/graph-write/dist/__tests__/merge-on.test.d.ts.map +1 -0
- package/payload/platform/lib/graph-write/dist/__tests__/merge-on.test.js.map +1 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts +16 -0
- package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +83 -6
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/index.ts +117 -10
- package/payload/platform/lib/routine-templates/dist/index.d.ts +151 -0
- package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/routine-templates/dist/index.js +207 -0
- package/payload/platform/lib/routine-templates/dist/index.js.map +1 -0
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +57 -0
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -0
- package/payload/platform/lib/routine-templates/dist/roster.js +182 -0
- package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -0
- package/payload/platform/lib/routine-templates/dist/seed-cli.d.ts +2 -0
- package/payload/platform/lib/routine-templates/dist/seed-cli.d.ts.map +1 -0
- package/payload/platform/lib/routine-templates/dist/seed-cli.js +64 -0
- package/payload/platform/lib/routine-templates/dist/seed-cli.js.map +1 -0
- package/payload/platform/lib/routine-templates/package.json +6 -0
- package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +170 -0
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +298 -0
- package/payload/platform/lib/routine-templates/src/index.ts +299 -0
- package/payload/platform/lib/routine-templates/src/roster.ts +206 -0
- package/payload/platform/lib/routine-templates/src/seed-cli.ts +65 -0
- package/payload/platform/lib/routine-templates/tsconfig.json +9 -0
- package/payload/platform/lib/routine-templates/vitest.config.ts +9 -0
- package/payload/platform/neo4j/edge-annotations.json +2 -2
- package/payload/platform/neo4j/schema.cypher +25 -1
- package/payload/platform/package.json +3 -2
- package/payload/platform/plugins/admin/PLUGIN.md +2 -2
- package/payload/platform/plugins/admin/mcp/dist/index.js +39 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +277 -61
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +265 -59
- package/payload/platform/plugins/docs/references/memory-guide.md +11 -1
- package/payload/platform/plugins/graph/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/graph/PLUGIN.md +1 -1
- package/payload/platform/plugins/memory/PLUGIN.md +1 -1
- package/payload/platform/plugins/memory/mcp/dist/index.js +12 -5
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.js +197 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/phase-estate-census.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js +55 -9
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-loader.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-validator.test.js +96 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/schema-validator.test.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/index.d.ts +7 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/index.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.d.ts +29 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.js +126 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/dream-cycle/phase-estate-census.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/scripts/dream-cycle-sweep.js +7 -4
- package/payload/platform/plugins/memory/mcp/dist/scripts/dream-cycle-sweep.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.d.ts +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.js +18 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-dream-run.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts +7 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +4 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
- package/payload/platform/plugins/memory/references/schema-estate-agent.md +2 -2
- package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +4 -4
- package/payload/platform/plugins/quickbooks/PLUGIN.md +10 -10
- package/payload/platform/plugins/scheduling/PLUGIN.md +49 -1
- package/payload/platform/plugins/scheduling/mcp/dist/index.js +48 -0
- package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.js +78 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/notes-cap.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js +457 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/routine-run.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.d.ts +35 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.js +39 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/notes-cap.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts +175 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js +533 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/routine-run.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +123 -9
- 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__/routine-roster-audit.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +189 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js +95 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/suspension-census.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.js +114 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/sweep-excludes-suspended.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +109 -2
- 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 +340 -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.d.ts +9 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +210 -45
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +43 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.js +55 -7
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-get-agent.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-list.test.js +45 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-list.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.js +96 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-runs.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js +2 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-cancel.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts +5 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js +13 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-get.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.d.ts +4 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js +24 -3
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-list.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.d.ts +33 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.js +51 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-runs.js.map +1 -0
- 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 +12 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
- package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +30 -2
- package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +1 -1
- package/payload/platform/scripts/check-specialist-tool-surface.mjs +92 -16
- package/payload/platform/scripts/seed-neo4j.sh +41 -0
- package/payload/platform/scripts/verify-skill-tool-surface.sh +91 -2
- 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/platform/templates/specialists/agents/librarian.md +1 -1
- package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
- package/payload/server/{chunk-K7CJGZPU.js → chunk-VUXKXOJU.js} +342 -152
- package/payload/server/{chunk-UX2FRNO7.js → chunk-WT2PFGY4.js} +37 -265
- package/payload/server/{chunk-PXNY2TAP.js → chunk-XCR5D2G3.js} +239 -10
- package/payload/server/{manager-RKL7JZ4Y.js → manager-4TJK3YOY.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/{AdminLoginScreens-zc2_qqh-.js → AdminLoginScreens-uknqh2Pm.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-uknqh2Pm.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-uknqh2Pm.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-GqtMImyQ.js +2 -0
- package/payload/server/public/assets/AdminShell-GqtMImyQ.js.br +0 -0
- package/payload/server/public/assets/AdminShell-GqtMImyQ.js.gz +0 -0
- package/payload/server/public/assets/{activity-DVgO8YuM.js → activity-B4KfMJqO.js} +1 -1
- package/payload/server/public/assets/activity-B4KfMJqO.js.br +0 -0
- package/payload/server/public/assets/activity-B4KfMJqO.js.gz +0 -0
- package/payload/server/public/assets/admin-DxCZeVw0.js +1 -0
- package/payload/server/public/assets/admin-DxCZeVw0.js.br +0 -0
- package/payload/server/public/assets/admin-DxCZeVw0.js.gz +0 -0
- package/payload/server/public/assets/agents-BtwBuO4G.js +1 -0
- package/payload/server/public/assets/agents-BtwBuO4G.js.br +0 -0
- package/payload/server/public/assets/agents-BtwBuO4G.js.gz +0 -0
- package/payload/server/public/assets/{browser-Mw7DY3ft.js → browser-B3hSzI3O.js} +1 -1
- package/payload/server/public/assets/browser-B3hSzI3O.js.br +0 -0
- package/payload/server/public/assets/browser-B3hSzI3O.js.gz +0 -0
- package/payload/server/public/assets/{calendar-B9gvL_1_.js → calendar-BggxXxhS.js} +1 -1
- package/payload/server/public/assets/calendar-BggxXxhS.js.br +0 -0
- package/payload/server/public/assets/calendar-BggxXxhS.js.gz +0 -0
- package/payload/server/public/assets/chat-flivHt0t.js +1 -0
- package/payload/server/public/assets/chat-flivHt0t.js.br +0 -0
- package/payload/server/public/assets/chat-flivHt0t.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-nVRThX7f.js +1 -0
- package/payload/server/public/assets/chevron-right-CLqfrkRA.js +1 -0
- package/payload/server/public/assets/chevron-right-CLqfrkRA.js.br +0 -0
- package/payload/server/public/assets/clock-Dj3SRZKo.js +1 -0
- package/payload/server/public/assets/clock-Dj3SRZKo.js.br +0 -0
- package/payload/server/public/assets/clock-Dj3SRZKo.js.gz +0 -0
- package/payload/server/public/assets/data-Ckjkne54.js +1 -0
- package/payload/server/public/assets/data-Ckjkne54.js.br +3 -0
- package/payload/server/public/assets/data-Ckjkne54.js.gz +0 -0
- package/payload/server/public/assets/{file-text-dYBnXNEX.js → file-text-BKs9eyiw.js} +1 -1
- package/payload/server/public/assets/file-text-BKs9eyiw.js.br +0 -0
- package/payload/server/public/assets/file-text-BKs9eyiw.js.gz +0 -0
- package/payload/server/public/assets/{graph-CDyzd1Et.js → graph-DTi71NaZ.js} +3 -3
- package/payload/server/public/assets/graph-DTi71NaZ.js.br +0 -0
- package/payload/server/public/assets/graph-DTi71NaZ.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-BT3S6e9H.js +1 -0
- package/payload/server/public/assets/graph-labels-BT3S6e9H.js.br +0 -0
- package/payload/server/public/assets/graph-labels-BT3S6e9H.js.gz +0 -0
- package/payload/server/public/assets/{maximize-2-M-iSaznd.js → maximize-2-zC94tsxY.js} +1 -1
- package/payload/server/public/assets/maximize-2-zC94tsxY.js.br +0 -0
- package/payload/server/public/assets/maximize-2-zC94tsxY.js.gz +0 -0
- package/payload/server/public/assets/operator-BtWNEMh-.js +1 -0
- package/payload/server/public/assets/operator-BtWNEMh-.js.br +0 -0
- package/payload/server/public/assets/operator-BtWNEMh-.js.gz +0 -0
- package/payload/server/public/assets/page-BFm91p0e.js +1 -0
- package/payload/server/public/assets/page-BFm91p0e.js.br +0 -0
- package/payload/server/public/assets/page-BFm91p0e.js.gz +0 -0
- package/payload/server/public/assets/{page-CZ-73FAk.js → page-Ccl0FazM.js} +3 -3
- package/payload/server/public/assets/page-Ccl0FazM.js.br +0 -0
- package/payload/server/public/assets/page-Ccl0FazM.js.gz +0 -0
- package/payload/server/public/assets/{public-CN-ltC8x.js → public-BpC6cn9S.js} +1 -1
- package/payload/server/public/assets/public-BpC6cn9S.js.br +0 -0
- package/payload/server/public/assets/public-BpC6cn9S.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-Buopsc22.js → rotate-ccw-BNcqbHkZ.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-BNcqbHkZ.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-BNcqbHkZ.js.gz +0 -0
- package/payload/server/public/assets/routines-D5iia-XG.js +1 -0
- package/payload/server/public/assets/routines-D5iia-XG.js.br +0 -0
- package/payload/server/public/assets/routines-D5iia-XG.js.gz +0 -0
- package/payload/server/public/assets/{skills-DiiuVzDK.js → skills-COLAw_jt.js} +1 -1
- package/payload/server/public/assets/skills-COLAw_jt.js.br +0 -0
- package/payload/server/public/assets/skills-COLAw_jt.js.gz +0 -0
- package/payload/server/public/assets/tasks-CZDQI4nB.js +1 -0
- package/payload/server/public/assets/tasks-CZDQI4nB.js.br +0 -0
- package/payload/server/public/assets/tasks-CZDQI4nB.js.gz +0 -0
- package/payload/server/public/assets/{time-entry-format-BBokCF-D.js → time-entry-format-laTFzawg.js} +1 -1
- package/payload/server/public/assets/time-entry-format-laTFzawg.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-laTFzawg.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-C_AcpTW5.js → triangle-alert-DrwqhEog.js} +1 -1
- package/payload/server/public/assets/triangle-alert-DrwqhEog.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-DrwqhEog.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-TdimmPVR.js → useCopyFeedback-Cxme5GK6.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-Cxme5GK6.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Cxme5GK6.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css +1 -0
- package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-B-K8y5a4.css.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-C_1E11Dv.js +14 -0
- package/payload/server/public/assets/useSubAccountSwitcher-C_1E11Dv.js.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-C_1E11Dv.js.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-BT2738ZS.js → useVoiceRecorder-DUBpVa2T.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-DUBpVa2T.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DUBpVa2T.js.gz +0 -0
- package/payload/server/public/assets/{wrench-B51s5kGA.js → wrench-DWuxPnzF.js} +1 -1
- package/payload/server/public/assets/wrench-DWuxPnzF.js.br +0 -0
- package/payload/server/public/assets/wrench-DWuxPnzF.js.gz +0 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +7 -7
- package/payload/server/public/chat.html +13 -13
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +13 -13
- package/payload/server/public/routines.html +6 -6
- package/payload/server/public/skills.html +5 -5
- package/payload/server/public/tasks.html +6 -6
- package/payload/server/server.js +5910 -5369
- package/payload/server/public/assets/AdminLoginScreens-zc2_qqh-.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-zc2_qqh-.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-IGUdTx5q.js +0 -2
- package/payload/server/public/assets/AdminShell-IGUdTx5q.js.br +0 -0
- package/payload/server/public/assets/AdminShell-IGUdTx5q.js.gz +0 -0
- package/payload/server/public/assets/activity-DVgO8YuM.js.br +0 -0
- package/payload/server/public/assets/activity-DVgO8YuM.js.gz +0 -0
- package/payload/server/public/assets/admin-xtpM7fgl.js +0 -1
- package/payload/server/public/assets/admin-xtpM7fgl.js.br +0 -0
- package/payload/server/public/assets/admin-xtpM7fgl.js.gz +0 -0
- package/payload/server/public/assets/agents-P0nTIxo-.js +0 -1
- package/payload/server/public/assets/agents-P0nTIxo-.js.br +0 -0
- package/payload/server/public/assets/agents-P0nTIxo-.js.gz +0 -0
- package/payload/server/public/assets/browser-Mw7DY3ft.js.br +0 -0
- package/payload/server/public/assets/browser-Mw7DY3ft.js.gz +0 -0
- package/payload/server/public/assets/calendar-B9gvL_1_.js.br +0 -0
- package/payload/server/public/assets/calendar-B9gvL_1_.js.gz +0 -0
- package/payload/server/public/assets/chat-DBGqh4wg.js +0 -1
- package/payload/server/public/assets/chat-DBGqh4wg.js.br +0 -2
- package/payload/server/public/assets/chat-DBGqh4wg.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-Bl4vpOM0.js +0 -1
- package/payload/server/public/assets/chevron-left-Bl4vpOM0.js.br +0 -0
- package/payload/server/public/assets/chevron-right-BExigCnp.js +0 -1
- package/payload/server/public/assets/chevron-right-BExigCnp.js.br +0 -0
- package/payload/server/public/assets/clock-D8TJvgJC.js +0 -1
- package/payload/server/public/assets/clock-D8TJvgJC.js.br +0 -0
- package/payload/server/public/assets/data-HfFSxaC2.js +0 -1
- package/payload/server/public/assets/data-HfFSxaC2.js.br +0 -0
- package/payload/server/public/assets/data-HfFSxaC2.js.gz +0 -0
- package/payload/server/public/assets/file-text-dYBnXNEX.js.br +0 -0
- package/payload/server/public/assets/file-text-dYBnXNEX.js.gz +0 -0
- package/payload/server/public/assets/graph-CDyzd1Et.js.br +0 -0
- package/payload/server/public/assets/graph-CDyzd1Et.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-D1LkKiJr.js +0 -1
- package/payload/server/public/assets/graph-labels-D1LkKiJr.js.br +0 -0
- package/payload/server/public/assets/graph-labels-D1LkKiJr.js.gz +0 -0
- package/payload/server/public/assets/maximize-2-M-iSaznd.js.br +0 -0
- package/payload/server/public/assets/maximize-2-M-iSaznd.js.gz +0 -0
- package/payload/server/public/assets/operator-9jfCv1Fg.js +0 -1
- package/payload/server/public/assets/operator-9jfCv1Fg.js.br +0 -0
- package/payload/server/public/assets/operator-9jfCv1Fg.js.gz +0 -0
- package/payload/server/public/assets/page-CZ-73FAk.js.br +0 -0
- package/payload/server/public/assets/page-CZ-73FAk.js.gz +0 -0
- package/payload/server/public/assets/page-CjwSt7kx.js +0 -1
- package/payload/server/public/assets/page-CjwSt7kx.js.br +0 -0
- package/payload/server/public/assets/page-CjwSt7kx.js.gz +0 -0
- package/payload/server/public/assets/public-CN-ltC8x.js.br +0 -0
- package/payload/server/public/assets/public-CN-ltC8x.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-Buopsc22.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-Buopsc22.js.gz +0 -0
- package/payload/server/public/assets/routines-C-yr8ddT.js +0 -1
- package/payload/server/public/assets/routines-C-yr8ddT.js.br +0 -0
- package/payload/server/public/assets/routines-C-yr8ddT.js.gz +0 -0
- package/payload/server/public/assets/skills-DiiuVzDK.js.br +0 -0
- package/payload/server/public/assets/skills-DiiuVzDK.js.gz +0 -0
- package/payload/server/public/assets/tasks-CnHIfn2_.js +0 -1
- package/payload/server/public/assets/tasks-CnHIfn2_.js.br +0 -0
- package/payload/server/public/assets/tasks-CnHIfn2_.js.gz +0 -0
- package/payload/server/public/assets/time-entry-format-BBokCF-D.js.br +0 -0
- package/payload/server/public/assets/time-entry-format-BBokCF-D.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-C_AcpTW5.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-C_AcpTW5.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-TdimmPVR.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-TdimmPVR.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js +0 -14
- package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-BwHqV55p.js.gz +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css +0 -1
- package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css.br +0 -0
- package/payload/server/public/assets/useSubAccountSwitcher-CsrPYqtm.css.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BT2738ZS.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BT2738ZS.js.gz +0 -0
- package/payload/server/public/assets/wrench-B51s5kGA.js.br +0 -0
- package/payload/server/public/assets/wrench-B51s5kGA.js.gz +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Task 2130 — the shipped routine roster.
|
|
4
|
+
*
|
|
5
|
+
* A fresh install used to ship zero routines, so the only working examples
|
|
6
|
+
* lived in one customer's graph and every operator wrote the prompts from
|
|
7
|
+
* scratch. These eleven are the catalogue that ships with the platform instead.
|
|
8
|
+
*
|
|
9
|
+
* Two properties make a routine shippable, and both are load-bearing:
|
|
10
|
+
*
|
|
11
|
+
* 1. It resolves its own surfaces at run time. Every prompt opens on
|
|
12
|
+
* `capabilities-here`, which reports the account's live install set, and
|
|
13
|
+
* ends the turn without replying when the surface it needs is absent. That
|
|
14
|
+
* is what makes the same eleven rows correct on an estate agency, a web studio
|
|
15
|
+
* and a field-service install rather than a template someone must edit.
|
|
16
|
+
*
|
|
17
|
+
* 2. It names nobody. No prompt carries a person's name, an email address, a
|
|
18
|
+
* phone number, a hostname or a database name. `scripts/check-routine-
|
|
19
|
+
* templates-generic.sh` is the standing control for that; a review pass is
|
|
20
|
+
* not, because the failure is silent and the routine still works.
|
|
21
|
+
*
|
|
22
|
+
* The `recurrence` on each row is a PROPOSAL, not a schedule. Seeded rows carry
|
|
23
|
+
* `eventStatus:'suspended'` and `nextRun:NULL`, so nothing here fires until an
|
|
24
|
+
* operator enables it and supplies the cron and zone they actually want (see
|
|
25
|
+
* `.docs/routine-roster.md` for why the enable path takes all four arguments).
|
|
26
|
+
*
|
|
27
|
+
* Every tool name cited in a prompt exists in
|
|
28
|
+
* `platform/services/claude-session-manager/src/canonical-tool-names.generated.ts`.
|
|
29
|
+
* The roster test asserts that, so a renamed tool breaks the build rather than
|
|
30
|
+
* shipping a prompt that reaches for a tool no install serves.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.ROUTINE_ROSTER_KEYS = exports.ROUTINE_ROSTER = exports.ROUTINE_TEMPLATE_VERSION = void 0;
|
|
34
|
+
/** Bumped whenever any prompt in the roster changes. The seed refreshes a
|
|
35
|
+
* routine's prompt only when the stored `routineTemplateVersion` is BELOW this
|
|
36
|
+
* and no operator has edited the row, so an unbumped edit ships to new installs
|
|
37
|
+
* and never reaches existing ones — bump it in the same commit as the edit. */
|
|
38
|
+
exports.ROUTINE_TEMPLATE_VERSION = 1;
|
|
39
|
+
const START_OF_DAY = `Prepare the operator's morning briefing and reply with it as a single message.
|
|
40
|
+
|
|
41
|
+
Call capabilities-here first and work only with the plugins it reports as enabled. Nothing below is mandatory: each part is included when its surface is present and skipped in silence when it is not.
|
|
42
|
+
|
|
43
|
+
Mail: read today's unread and overnight messages with email-read, or outlook-mail-list when the mailbox is on the Microsoft side. Report what actually needs the operator, not a count.
|
|
44
|
+
Diary: list today's appointments with outlook-calendar-list or google-calendar-list, plus schedule-list for anything booked in the graph rather than a provider calendar.
|
|
45
|
+
Work: list what is open and due today or overdue with work-list.
|
|
46
|
+
Connected systems: if a connector is registered, call connector-call for whatever it treats as today's queue.
|
|
47
|
+
|
|
48
|
+
Write it the way a colleague would say it out loud: what needs a decision, what is time-bound, what changed overnight. Lead with the thing that will cost the most if it is missed. No headings, no counts for their own sake, no restating the sections above.
|
|
49
|
+
|
|
50
|
+
If every surface is absent, or every surface is present and there is genuinely nothing worth saying, end the turn without replying. A silent morning is a correct result and is better than a message that says there is nothing to report.`;
|
|
51
|
+
const INBOUND_CHECK = `Triage inbound messages that arrived since the last check and prepare replies for the operator to approve. Never send anything.
|
|
52
|
+
|
|
53
|
+
Call capabilities-here first. If no mail plugin is enabled, end the turn without replying.
|
|
54
|
+
|
|
55
|
+
Search for messages received since the previous run with email-search, or outlook-mail-search on the Microsoft side. Ignore anything already answered, anything automated, and anything the operator has clearly seen.
|
|
56
|
+
|
|
57
|
+
For each message that genuinely needs a human reply, write a draft with email-draft or outlook-draft. Drafts only: this routine has no authority to send, and a sent message it should not have sent cannot be recalled. Match the operator's usual register from the surrounding thread rather than a house style.
|
|
58
|
+
|
|
59
|
+
When a message commits the business to doing something rather than to saying something, record it with work-create so the obligation survives the inbox.
|
|
60
|
+
|
|
61
|
+
Reply with one short message naming what you drafted and what you deliberately left alone, so the operator can open the drafts and send them. If there was nothing new that needed a reply, end the turn without replying.`;
|
|
62
|
+
const END_OF_DAY = `Close the operator's day and reply with a single message.
|
|
63
|
+
|
|
64
|
+
Call capabilities-here first and include only the parts whose surface is enabled.
|
|
65
|
+
|
|
66
|
+
Waiting on the operator: list unsent drafts with email-draft-list. A draft written today and still unsent is the single most common thing that falls through, so name each one.
|
|
67
|
+
Overdue: list work that is past due or due today and still open with work-list.
|
|
68
|
+
Tomorrow: list tomorrow's appointments with outlook-calendar-list or google-calendar-list, and schedule-list for anything booked in the graph.
|
|
69
|
+
|
|
70
|
+
Say what is unfinished and what tomorrow looks like, in that order, in plain sentences. Do not congratulate, do not summarise the day back, do not pad the message to look thorough.
|
|
71
|
+
|
|
72
|
+
If nothing is waiting, nothing is overdue and tomorrow is empty, end the turn without replying.`;
|
|
73
|
+
const APPOINTMENT_REMINDER = `Remind the people attending an appointment that is coming up, so nobody is reminded twice and nobody is missed.
|
|
74
|
+
|
|
75
|
+
Call capabilities-here first. If neither a mail plugin nor a messaging channel is enabled, end the turn without replying.
|
|
76
|
+
|
|
77
|
+
Find appointments starting within the next reminder window with schedule-list, and read each one's attendees. Resolve each attendee to a person and a contact route with contact-lookup. An attendee you cannot resolve to a route is not a failure to work around: leave them, and say so at the end.
|
|
78
|
+
|
|
79
|
+
Send each attendee one reminder on the route they are already reachable on: email-send for a mailbox, whatsapp-reply or the Telegram message tool for a messaging thread that already exists. Carry the time, the place and what the appointment is about. Do not open a new conversation with someone who has never messaged the business.
|
|
80
|
+
|
|
81
|
+
Send at most one reminder per attendee per appointment. Before sending, check the appointment's notes for a reminder already recorded, and record the one you send there.
|
|
82
|
+
|
|
83
|
+
Reply with one line naming who was reminded and who could not be reached. If no appointment falls in the window, end the turn without replying.`;
|
|
84
|
+
const COMMITMENT_CHASE = `Find the promises the business has made and not kept, and the promises made to it that nobody has kept.
|
|
85
|
+
|
|
86
|
+
Call capabilities-here first and use only the surfaces it reports.
|
|
87
|
+
|
|
88
|
+
Outbound: search sent mail with email-search for messages where the business undertook to do something, and check whether the thing happened. A promise with a date attached and no follow-up is the case worth surfacing.
|
|
89
|
+
Inbound: find threads where the business asked for something and received no reply. Age matters more than volume; a three-week silence is worth naming and a two-day one is not.
|
|
90
|
+
Work: list items past their due date with work-list.
|
|
91
|
+
Context: check memory-search for what was previously agreed before deciding something has been dropped, so a commitment already met elsewhere is not chased again.
|
|
92
|
+
|
|
93
|
+
Reply with the short list, each item saying what was promised, by whom, and how long it has been outstanding. Judgement is the point here, not coverage: three real items beat thirty possible ones.
|
|
94
|
+
|
|
95
|
+
If nothing has been dropped, end the turn without replying.`;
|
|
96
|
+
const CALENDAR_RECONCILE = `Reconcile the provider calendars against the appointments held in the graph, so the operator's diary and the agent's view of it are the same diary.
|
|
97
|
+
|
|
98
|
+
Call capabilities-here first. If no calendar surface is enabled, end the turn without replying.
|
|
99
|
+
|
|
100
|
+
Read the provider side with outlook-calendar-list or google-calendar-list, and the graph side with schedule-list, over the same window. Compare them.
|
|
101
|
+
|
|
102
|
+
An appointment on the provider calendar with no counterpart in the graph is invisible to every other routine: write it with schedule-event. An appointment in the graph that has been cancelled provider-side should be marked cancelled, not deleted, so its history survives. Where the two disagree on time or attendees, the provider calendar is authoritative, because that is the one the operator edits.
|
|
103
|
+
|
|
104
|
+
If the account has a busy-time sync configured, run schedule-connector-busy-sync so availability reflects what was just reconciled.
|
|
105
|
+
|
|
106
|
+
Reply only when something was actually changed, naming what and why. A clean reconcile ends the turn without replying, every time. This routine runs often, so a message on every clean run trains the operator to ignore it.`;
|
|
107
|
+
const CONTACT_RECONCILE = `Reconcile the people the business actually deals with against the people it has recorded.
|
|
108
|
+
|
|
109
|
+
Call capabilities-here first. If neither a mail plugin nor the contacts plugin is enabled, end the turn without replying.
|
|
110
|
+
|
|
111
|
+
Find the counterparties in recent correspondence with email-graph-query, and on the Microsoft side read the address book with outlook-contacts-list. Read the recorded people with contact-list.
|
|
112
|
+
|
|
113
|
+
Someone corresponded with repeatedly and never recorded should be created with contact-create. Someone recorded with a stale route, a changed employer or a missing name should be updated with contact-update, taking the newer value from the correspondence.
|
|
114
|
+
|
|
115
|
+
Two rules keep this from making the graph worse. A single inbound message is not a relationship, so do not create a contact from one. And two records that look like the same person may be two people, so surface the possible duplicate rather than merging it.
|
|
116
|
+
|
|
117
|
+
Reply only when records were created or updated, naming the counts and anything ambiguous you left alone. A clean reconcile ends the turn without replying.`;
|
|
118
|
+
const CRM_RECONCILE = `Reconcile whatever operational system this business runs against the graph, so the agent answers from the same records the operator works in.
|
|
119
|
+
|
|
120
|
+
Call capabilities-here first and read the registered connectors with connector-register. If none is registered, end the turn without replying. This routine is deliberately unopinionated about which system that is: read what the connector actually exposes rather than assuming a shape.
|
|
121
|
+
|
|
122
|
+
Pull the records that changed since the last run with connector-call. For each, decide whether the graph already holds it. Write what is genuinely new or genuinely changed with memory-write, and leave the rest alone.
|
|
123
|
+
|
|
124
|
+
The connector is the system of record. Where the graph disagrees, the graph is stale and the connector wins. Never write back to the connector from here: this routine reads.
|
|
125
|
+
|
|
126
|
+
Reply only when something changed, in one or two lines. A run with nothing to bring across ends the turn without replying.`;
|
|
127
|
+
const FINANCE_RECONCILE = `Reconcile the accounting system against the ledger held in the graph.
|
|
128
|
+
|
|
129
|
+
Call capabilities-here first. If no accounting connector is enabled, end the turn without replying.
|
|
130
|
+
|
|
131
|
+
Read the accounting side with quickbooks-query over the period since the last run. Reconcile it against the internal ledger with ledger-reconcile, then read the resulting position with ledger-balance.
|
|
132
|
+
|
|
133
|
+
Report only what an operator would act on: entries present on one side and not the other, amounts that disagree, and anything unreconciled long enough to be a problem rather than a timing difference. A difference explained by a payment still clearing is not a discrepancy.
|
|
134
|
+
|
|
135
|
+
Never adjust an entry to make the two sides agree. An unexplained difference is the finding; silencing it destroys the only evidence that something is wrong.
|
|
136
|
+
|
|
137
|
+
Reply with the discrepancies and the closing position. If everything reconciles, end the turn without replying.`;
|
|
138
|
+
const WEEKLY_DIGEST = `Write the week in review and reply with it as a single message.
|
|
139
|
+
|
|
140
|
+
Call capabilities-here first and cover only the surfaces that are enabled.
|
|
141
|
+
|
|
142
|
+
Correspondence: what came in and what went out that mattered, from email-search or outlook-mail-search across the week.
|
|
143
|
+
Diary: what happened and what is coming, from outlook-calendar-list, google-calendar-list and schedule-list.
|
|
144
|
+
Work: what was completed, what slipped, what is still open, from work-list.
|
|
145
|
+
Systems: if a connector is registered, what changed in it over the week, from connector-call.
|
|
146
|
+
Context: check memory-search for what was said last week, so the digest reports movement rather than restating a standing position.
|
|
147
|
+
|
|
148
|
+
This is the one routine written for a person with a few minutes, not for completeness. Say what changed, what is stuck, and what next week turns on. Three paragraphs at most. No section headings, no counts presented as achievements, no restating the categories above.
|
|
149
|
+
|
|
150
|
+
If the week was genuinely empty, end the turn without replying.`;
|
|
151
|
+
const CHANNEL_LINK_CHECK = `Check whether the business's messaging links are still up, and speak only when one is down.
|
|
152
|
+
|
|
153
|
+
Call capabilities-here first. If no messaging channel is enabled, end the turn without replying.
|
|
154
|
+
|
|
155
|
+
Read the link state with whatsapp-status. It reports, per link, whether it is connected, the number it is paired to, how many reconnect attempts it has made, and the error it last failed on.
|
|
156
|
+
|
|
157
|
+
If every link is connected, end the turn without replying. A message on a healthy check is what trains an operator to ignore this routine, and an ignored check is worth less than no check.
|
|
158
|
+
|
|
159
|
+
When a link is down, reply with one message naming the number it is paired to, the exact error it last reported, and how long it has been down. Say plainly whether the platform is still retrying it or has stopped. A link that was logged out, or replaced by another device, will not come back on its own: re-pairing needs someone holding the phone, so say that rather than implying it will recover by itself.
|
|
160
|
+
|
|
161
|
+
Never disconnect a link and never begin a re-pair from here. This routine reports; the remedy is a person's decision.`;
|
|
162
|
+
/** The eleven. Order is the display order on `/routines` before the operator
|
|
163
|
+
* retimes anything: the daily rhythm first, then the reconciles, then the
|
|
164
|
+
* weekly, then the standing check. */
|
|
165
|
+
exports.ROUTINE_ROSTER = [
|
|
166
|
+
{ key: "start-of-day", name: "Start of day briefing", recurrence: "30 7 * * 1-5", prompt: START_OF_DAY },
|
|
167
|
+
{ key: "inbound-check", name: "Working-hours inbound check", recurrence: "*/30 9-17 * * 1-5", prompt: INBOUND_CHECK },
|
|
168
|
+
{ key: "end-of-day", name: "End of day wrap-up", recurrence: "0 18 * * 1-5", prompt: END_OF_DAY },
|
|
169
|
+
{ key: "appointment-reminder", name: "Appointment reminders", recurrence: "0 * * * *", prompt: APPOINTMENT_REMINDER },
|
|
170
|
+
{ key: "commitment-chase", name: "Commitment chase", recurrence: "0 10 * * 2", prompt: COMMITMENT_CHASE },
|
|
171
|
+
{ key: "calendar-reconcile", name: "Calendar reconcile", recurrence: "15 */4 * * *", prompt: CALENDAR_RECONCILE },
|
|
172
|
+
{ key: "contact-reconcile", name: "Contact reconcile", recurrence: "45 6 * * 1-5", prompt: CONTACT_RECONCILE },
|
|
173
|
+
{ key: "crm-reconcile", name: "Operational system reconcile", recurrence: "0 3 * * *", prompt: CRM_RECONCILE },
|
|
174
|
+
{ key: "finance-reconcile", name: "Finance reconcile", recurrence: "0 4 * * 1", prompt: FINANCE_RECONCILE },
|
|
175
|
+
{ key: "weekly-digest", name: "Weekly digest", recurrence: "0 16 * * 5", prompt: WEEKLY_DIGEST },
|
|
176
|
+
{ key: "channel-link-check", name: "Channel link check", recurrence: "*/15 * * * *", prompt: CHANNEL_LINK_CHECK },
|
|
177
|
+
];
|
|
178
|
+
/** Every roster key, in roster order. The scheduling heartbeat's `op=roster`
|
|
179
|
+
* drift check reconciles this expected set against what is actually in the
|
|
180
|
+
* graph, so it is exported rather than re-derived there. */
|
|
181
|
+
exports.ROUTINE_ROSTER_KEYS = exports.ROUTINE_ROSTER.map((r) => r.key);
|
|
182
|
+
//# sourceMappingURL=roster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAEH;;;gFAGgF;AACnE,QAAA,wBAAwB,GAAG,CAAC,CAAC;AAgB1C,MAAM,YAAY,GAAG;;;;;;;;;;;4OAWuN,CAAC;AAE7O,MAAM,aAAa,GAAG;;;;;;;;;;2NAUqM,CAAC;AAE5N,MAAM,UAAU,GAAG;;;;;;;;;;gGAU6E,CAAC;AAEjG,MAAM,oBAAoB,GAAG;;;;;;;;;;gJAUmH,CAAC;AAEjJ,MAAM,gBAAgB,GAAG;;;;;;;;;;;4DAWmC,CAAC;AAE7D,MAAM,kBAAkB,GAAG;;;;;;;;;;8NAUmM,CAAC;AAE/N,MAAM,iBAAiB,GAAG;;;;;;;;;;4JAUkI,CAAC;AAE7J,MAAM,aAAa,GAAG;;;;;;;;2HAQqG,CAAC;AAE5H,MAAM,iBAAiB,GAAG;;;;;;;;;;gHAUsF,CAAC;AAEjH,MAAM,aAAa,GAAG;;;;;;;;;;;;gEAY0C,CAAC;AAEjE,MAAM,kBAAkB,GAAG;;;;;;;;;;sHAU2F,CAAC;AAEvH;;uCAEuC;AAC1B,QAAA,cAAc,GAA+B;IACxD,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE;IACxG,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE;IACrH,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE;IACjG,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE;IACrH,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE;IACzG,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,kBAAkB,EAAE;IACjH,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE;IAC9G,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE;IAC9G,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE;IAC3G,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE;IAChG,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,kBAAkB,EAAE;CAClH,CAAC;AAEF;;6DAE6D;AAChD,QAAA,mBAAmB,GAAsB,sBAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-cli.d.ts","sourceRoot":"","sources":["../src/seed-cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* Task 2130 — the install/upgrade entry point for the routine-roster seed.
|
|
8
|
+
*
|
|
9
|
+
* `platform/scripts/seed-neo4j.sh` is bash driving cypher-shell and cannot
|
|
10
|
+
* import the roster, so it invokes this instead. Everything about the seed —
|
|
11
|
+
* the MERGE, the classification, the whole `[routine-seed]` lifecycle — lives
|
|
12
|
+
* in `index.ts` and is shared verbatim with the sub-account path in the admin
|
|
13
|
+
* plugin. This file is only the process boundary: read the environment,
|
|
14
|
+
* connect, call the seed, decide the exit code.
|
|
15
|
+
*
|
|
16
|
+
* This runs on every install AND every upgrade, which is what carries the
|
|
17
|
+
* roster to the existing fleet rather than to new installs alone.
|
|
18
|
+
*
|
|
19
|
+
* NEO4J_URI=… NEO4J_PASSWORD=… ROUTINE_SEED_ACCOUNT_ID=… node dist/seed-cli.js
|
|
20
|
+
*
|
|
21
|
+
* Exit codes:
|
|
22
|
+
* 0 the roster is present and complete (`expected === actual`)
|
|
23
|
+
* 1 a required variable is missing, Neo4j refused, or the post-condition
|
|
24
|
+
* read came back short
|
|
25
|
+
*/
|
|
26
|
+
const neo4j_driver_1 = __importDefault(require("neo4j-driver"));
|
|
27
|
+
const index_js_1 = require("./index.js");
|
|
28
|
+
function requireEnv(name) {
|
|
29
|
+
const value = process.env[name];
|
|
30
|
+
if (!value || value.trim() === "") {
|
|
31
|
+
process.stderr.write(`[routine-seed] op=abort reason=missing-env var=${name}\n`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
async function main() {
|
|
37
|
+
const uri = requireEnv("NEO4J_URI");
|
|
38
|
+
const password = requireEnv("NEO4J_PASSWORD");
|
|
39
|
+
const accountId = requireEnv("ROUTINE_SEED_ACCOUNT_ID");
|
|
40
|
+
const user = process.env.NEO4J_USER ?? "neo4j";
|
|
41
|
+
const driver = neo4j_driver_1.default.driver(uri, neo4j_driver_1.default.auth.basic(user, password));
|
|
42
|
+
const session = driver.session();
|
|
43
|
+
try {
|
|
44
|
+
const report = await (0, index_js_1.seedRoutineRoster)({ session, accountId });
|
|
45
|
+
// The read-back is the gate, not the fact that the statements ran. A seed
|
|
46
|
+
// that issued ten MERGEs and left nine rows in the graph has failed, and
|
|
47
|
+
// the install must say so here rather than leave a short roster to be
|
|
48
|
+
// noticed later by the heartbeat's op=roster drift check.
|
|
49
|
+
if (report.verify.actual < report.verify.expected) {
|
|
50
|
+
process.stderr.write(`[routine-seed] op=abort acct=${(0, index_js_1.acctTag)(accountId)} reason=short-roster ` +
|
|
51
|
+
`expected=${report.verify.expected} actual=${report.verify.actual}\n`);
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await session.close();
|
|
57
|
+
await driver.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
main().catch((err) => {
|
|
61
|
+
process.stderr.write(`[routine-seed] op=abort reason=error detail=${err instanceof Error ? err.message : String(err)}\n`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=seed-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-cli.js","sourceRoot":"","sources":["../src/seed-cli.ts"],"names":[],"mappings":";;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,gEAAiC;AACjC,yCAAwD;AAExD,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,IAAI,IAAI,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;IAE/C,MAAM,MAAM,GAAG,sBAAK,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAiB,EAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,0EAA0E;QAC1E,yEAAyE;QACzE,sEAAsE;QACtE,0DAA0D;QAC1D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,IAAA,kBAAO,EAAC,SAAS,CAAC,uBAAuB;gBACvE,YAAY,MAAM,CAAC,MAAM,CAAC,QAAQ,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CACxE,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+CAA+C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACpG,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task 2130 — the roster's shipping invariants.
|
|
3
|
+
*
|
|
4
|
+
* These assert the properties that make the roster shippable at all, so a later
|
|
5
|
+
* edit that breaks one fails here rather than on a customer's install. Two of
|
|
6
|
+
* them (the tool-name check and the private-shape check) exist because the
|
|
7
|
+
* corresponding failure is silent: a prompt naming a tool no install serves,
|
|
8
|
+
* or carrying a real mailbox, still parses, still stores, still dispatches.
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { resolve } from "node:path";
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
import { ROUTINE_ROSTER, ROUTINE_ROSTER_KEYS, ROUTINE_TEMPLATE_VERSION } from "../roster.js";
|
|
14
|
+
|
|
15
|
+
/** Every canonical maxy tool name, read from the generated registry rather than
|
|
16
|
+
* re-listed here. A list re-typed in this file would drift from the registry,
|
|
17
|
+
* which is the exact failure it would claim to prevent. */
|
|
18
|
+
const CANONICAL_TOOL_NAMES: ReadonlySet<string> = (() => {
|
|
19
|
+
// vitest runs with cwd at this lib's root (where vitest.config.ts lives).
|
|
20
|
+
const generated = resolve(
|
|
21
|
+
process.cwd(),
|
|
22
|
+
"../../services/claude-session-manager/src/canonical-tool-names.generated.ts",
|
|
23
|
+
);
|
|
24
|
+
const raw = readFileSync(generated, "utf-8");
|
|
25
|
+
const names = new Set<string>();
|
|
26
|
+
for (const m of raw.matchAll(/mcp__plugin_[a-z0-9-]+_[a-z0-9-]+__([a-z0-9-]+)/g)) {
|
|
27
|
+
names.add(m[1]);
|
|
28
|
+
}
|
|
29
|
+
return names;
|
|
30
|
+
})();
|
|
31
|
+
|
|
32
|
+
/** Bare kebab-case identifiers a prompt might be citing as a tool. Deliberately
|
|
33
|
+
* greedy: it over-collects ordinary hyphenated English, which the assertion
|
|
34
|
+
* below then filters by asking whether the token looks like a tool name at all
|
|
35
|
+
* (a known plugin prefix). Over-collecting is safe; under-collecting would let
|
|
36
|
+
* an invented tool through. */
|
|
37
|
+
function citedToolCandidates(prompt: string): string[] {
|
|
38
|
+
const prefixes = [
|
|
39
|
+
"email-",
|
|
40
|
+
"outlook-",
|
|
41
|
+
"google-",
|
|
42
|
+
"schedule-",
|
|
43
|
+
"work-",
|
|
44
|
+
"contact-",
|
|
45
|
+
"connector-",
|
|
46
|
+
"memory-",
|
|
47
|
+
"quickbooks-",
|
|
48
|
+
"ledger-",
|
|
49
|
+
"whatsapp-",
|
|
50
|
+
"telegram-",
|
|
51
|
+
"capabilities-",
|
|
52
|
+
"graph-",
|
|
53
|
+
];
|
|
54
|
+
const out = new Set<string>();
|
|
55
|
+
for (const m of prompt.matchAll(/\b[a-z][a-z0-9]*(?:-[a-z0-9]+)+\b/g)) {
|
|
56
|
+
const token = m[0];
|
|
57
|
+
if (prefixes.some((p) => token.startsWith(p))) out.add(token);
|
|
58
|
+
}
|
|
59
|
+
return [...out];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
describe("routine roster shape", () => {
|
|
63
|
+
it("ships exactly eleven routines", () => {
|
|
64
|
+
expect(ROUTINE_ROSTER).toHaveLength(11);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("has the eleven keys the task and the drift check agree on", () => {
|
|
68
|
+
expect([...ROUTINE_ROSTER_KEYS].sort()).toEqual(
|
|
69
|
+
[
|
|
70
|
+
"appointment-reminder",
|
|
71
|
+
"calendar-reconcile",
|
|
72
|
+
"channel-link-check",
|
|
73
|
+
"commitment-chase",
|
|
74
|
+
"contact-reconcile",
|
|
75
|
+
"crm-reconcile",
|
|
76
|
+
"end-of-day",
|
|
77
|
+
"finance-reconcile",
|
|
78
|
+
"inbound-check",
|
|
79
|
+
"start-of-day",
|
|
80
|
+
"weekly-digest",
|
|
81
|
+
].sort(),
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("keys are unique — a duplicate would collapse two rows onto one MERGE key", () => {
|
|
86
|
+
expect(new Set(ROUTINE_ROSTER_KEYS).size).toBe(ROUTINE_ROSTER.length);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("names are unique and non-empty", () => {
|
|
90
|
+
const names = ROUTINE_ROSTER.map((r) => r.name);
|
|
91
|
+
expect(names.every((n) => n.trim().length > 0)).toBe(true);
|
|
92
|
+
expect(new Set(names).size).toBe(names.length);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("every recurrence is a five-field cron expression", () => {
|
|
96
|
+
for (const r of ROUTINE_ROSTER) {
|
|
97
|
+
expect(r.recurrence.trim().split(/\s+/), `${r.key} recurrence`).toHaveLength(5);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("the template version is a positive integer", () => {
|
|
102
|
+
expect(Number.isInteger(ROUTINE_TEMPLATE_VERSION)).toBe(true);
|
|
103
|
+
expect(ROUTINE_TEMPLATE_VERSION).toBeGreaterThan(0);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe("routine prompts resolve their own surfaces", () => {
|
|
108
|
+
it("every prompt opens on capabilities-here", () => {
|
|
109
|
+
for (const r of ROUTINE_ROSTER) {
|
|
110
|
+
expect(r.prompt, `${r.key} must call capabilities-here`).toContain("capabilities-here");
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("every prompt states the silent-exit condition", () => {
|
|
115
|
+
for (const r of ROUTINE_ROSTER) {
|
|
116
|
+
expect(r.prompt, `${r.key} must end silently when its surface is absent`).toContain(
|
|
117
|
+
"end the turn without replying",
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("cites no tool that is absent from the canonical registry", () => {
|
|
123
|
+
const unknown: string[] = [];
|
|
124
|
+
let checked = 0;
|
|
125
|
+
for (const r of ROUTINE_ROSTER) {
|
|
126
|
+
for (const candidate of citedToolCandidates(r.prompt)) {
|
|
127
|
+
checked++;
|
|
128
|
+
if (!CANONICAL_TOOL_NAMES.has(candidate)) unknown.push(`${r.key}: ${candidate}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// A check that examined nothing would pass while the roster cited invented
|
|
132
|
+
// tools, which is the whole failure. Assert it actually reached the prompts
|
|
133
|
+
// and that the registry it compares against is populated.
|
|
134
|
+
expect(CANONICAL_TOOL_NAMES.size).toBeGreaterThan(50);
|
|
135
|
+
expect(checked).toBeGreaterThanOrEqual(ROUTINE_ROSTER.length);
|
|
136
|
+
expect(unknown).toEqual([]);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe("routine prompts are generic", () => {
|
|
141
|
+
// The same classes scripts/check-routine-templates-generic.sh enforces at
|
|
142
|
+
// commit and publish time. Duplicated here so a failure is caught in the unit
|
|
143
|
+
// run too, where the message points at the routine rather than at a line
|
|
144
|
+
// number in a corpus scan.
|
|
145
|
+
const SHAPES: ReadonlyArray<{ label: string; re: RegExp }> = [
|
|
146
|
+
{ label: "email address", re: /[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i },
|
|
147
|
+
{ label: "E.164 number", re: /\+[0-9]{10,15}\b/ },
|
|
148
|
+
{ label: "hostname", re: /\b[a-z0-9-]+\.(com|co\.uk|net|org|io|dev|chat|app|ai|pages\.dev)\b/i },
|
|
149
|
+
{ label: "absolute developer path", re: /(\/Users\/[a-z]|\/home\/[a-z])/i },
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
it("carries no email address, phone number, hostname or developer path", () => {
|
|
153
|
+
const hits: string[] = [];
|
|
154
|
+
for (const r of ROUTINE_ROSTER) {
|
|
155
|
+
for (const shape of SHAPES) {
|
|
156
|
+
const m = r.prompt.match(shape.re);
|
|
157
|
+
if (m) hits.push(`${r.key}: ${shape.label} "${m[0]}"`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
expect(hits).toEqual([]);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("names no vertical as the only vertical", () => {
|
|
164
|
+
// A prompt that assumes an estate agency is not shippable to a web studio.
|
|
165
|
+
// These are the words the four live laptop routines used.
|
|
166
|
+
const verticalTells = /\b(property|listing|viewing|valuation|tenancy|landlord|vendor)\b/i;
|
|
167
|
+
const hits = ROUTINE_ROSTER.filter((r) => verticalTells.test(r.prompt)).map((r) => r.key);
|
|
168
|
+
expect(hits).toEqual([]);
|
|
169
|
+
});
|
|
170
|
+
});
|