@rubytech/create-maxy-code 0.1.542 → 0.1.543
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 +37 -0
- package/package.json +1 -1
- package/payload/platform/lib/shared-folder/dist/index.d.ts +47 -0
- package/payload/platform/lib/shared-folder/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/shared-folder/dist/index.js +93 -0
- package/payload/platform/lib/shared-folder/dist/index.js.map +1 -0
- package/payload/platform/lib/shared-folder/src/index.ts +92 -0
- package/payload/platform/lib/shared-folder/tsconfig.json +5 -0
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +15 -1
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +8 -0
- package/payload/platform/plugins/docs/references/access-control.md +14 -0
- package/payload/platform/plugins/filesystem/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/filesystem/PLUGIN.md +11 -1
- package/payload/platform/plugins/filesystem/mcp/dist/index.js +23 -7
- package/payload/platform/plugins/filesystem/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js +104 -4
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.d.ts +2 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.js +67 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/shared-folder.test.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts +16 -2
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js +54 -1
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js +76 -2
- package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +3 -3
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js +3 -3
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js +3 -3
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js +3 -3
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -1
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +3 -3
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/agent-turn-dispatch.test.js +81 -1
- 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/agent-turn-dispatch.d.ts +22 -0
- 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 +80 -0
- 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 +13 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
- package/payload/platform/plugins/whatsapp/PLUGIN.md +2 -2
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +1 -1
- package/payload/platform/scripts/check-no-esm-require.mjs +5 -0
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +8 -4
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +27 -7
- package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.d.ts +11 -6
- package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.js +8 -4
- package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +2 -2
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +35 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +136 -19
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +98 -26
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +24 -12
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +130 -27
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +4 -0
- package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/role-census.d.ts +24 -0
- package/payload/platform/services/claude-session-manager/dist/role-census.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/role-census.js +50 -0
- package/payload/platform/services/claude-session-manager/dist/role-census.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +9 -2
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +13 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts +67 -0
- package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js +101 -19
- package/payload/platform/services/claude-session-manager/dist/stuck-turn-recover.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts +19 -0
- package/payload/platform/services/claude-session-manager/dist/stuck-turn.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/stuck-turn.js +37 -2
- package/payload/platform/services/claude-session-manager/dist/stuck-turn.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +9 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/types.d.ts +9 -3
- package/payload/platform/services/claude-session-manager/dist/types.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +105 -8
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +108 -10
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts +18 -0
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js +86 -5
- package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +38 -7
- package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/targets.js +42 -7
- package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
- package/payload/platform/templates/agents/admin/INSTRUCTION.md +15 -0
- package/payload/server/{adminuser-self-heal-LC7HZAC6.js → adminuser-self-heal-ZHFNDKJK.js} +1 -1
- package/payload/server/{chunk-CKTHAHL4.js → chunk-BIHII3CT.js} +3 -2
- package/payload/server/{chunk-PFF6I7KP.js → chunk-HYQNUVGO.js} +8 -1
- package/payload/server/{chunk-HZP7BKBF.js → chunk-MGW536C5.js} +128 -4
- package/payload/server/{chunk-ERIM3EFB.js → chunk-RSNVIN4G.js} +1 -1
- package/payload/server/{manager-CM55K4J2.js → manager-GJHKO7WW.js} +3 -3
- package/payload/server/maxy-edge.js +3 -3
- package/payload/server/public/activity.html +5 -5
- package/payload/server/public/agents.html +4 -4
- package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js +1 -0
- package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-C1iXeR-9.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-BeIGNC1Q.js +2 -0
- package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.br +0 -0
- package/payload/server/public/assets/AdminShell-BeIGNC1Q.js.gz +0 -0
- package/payload/server/public/assets/activity-AaFvfwrZ.js +1 -0
- package/payload/server/public/assets/activity-AaFvfwrZ.js.br +0 -0
- package/payload/server/public/assets/activity-AaFvfwrZ.js.gz +0 -0
- package/payload/server/public/assets/admin-Bz34CZqL.js +1 -0
- package/payload/server/public/assets/admin-Bz34CZqL.js.br +0 -0
- package/payload/server/public/assets/admin-Bz34CZqL.js.gz +0 -0
- package/payload/server/public/assets/agents-N0z7qg8a.js +1 -0
- package/payload/server/public/assets/agents-N0z7qg8a.js.br +0 -0
- package/payload/server/public/assets/agents-N0z7qg8a.js.gz +0 -0
- package/payload/server/public/assets/browser-_k-v0iky.js +1 -0
- package/payload/server/public/assets/browser-_k-v0iky.js.br +0 -0
- package/payload/server/public/assets/browser-_k-v0iky.js.gz +0 -0
- package/payload/server/public/assets/calendar-D_DvVRJS.js +1 -0
- package/payload/server/public/assets/calendar-D_DvVRJS.js.br +0 -0
- package/payload/server/public/assets/calendar-D_DvVRJS.js.gz +0 -0
- package/payload/server/public/assets/chat-BbAsvXL_.js +1 -0
- package/payload/server/public/assets/chat-BbAsvXL_.js.br +1 -0
- package/payload/server/public/assets/chat-BbAsvXL_.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-trZmu0ZU.js +1 -0
- package/payload/server/public/assets/chevron-left-trZmu0ZU.js.br +0 -0
- package/payload/server/public/assets/chevron-right-BiGJuNSX.js +1 -0
- package/payload/server/public/assets/chevron-right-BiGJuNSX.js.br +0 -0
- package/payload/server/public/assets/clock-DAeRdj4p.js +1 -0
- package/payload/server/public/assets/clock-DAeRdj4p.js.br +0 -0
- package/payload/server/public/assets/clock-DAeRdj4p.js.gz +0 -0
- package/payload/server/public/assets/{copy-3kj9Oaoc.js → copy-BDoxl3Oi.js} +1 -1
- package/payload/server/public/assets/copy-BDoxl3Oi.js.br +0 -0
- package/payload/server/public/assets/copy-BDoxl3Oi.js.gz +0 -0
- package/payload/server/public/assets/data-DB6T1I-w.js +1 -0
- package/payload/server/public/assets/data-DB6T1I-w.js.br +1 -0
- package/payload/server/public/assets/data-DB6T1I-w.js.gz +0 -0
- package/payload/server/public/assets/{file-text-CBaewT76.js → file-text-DRGn4gjH.js} +1 -1
- package/payload/server/public/assets/file-text-DRGn4gjH.js.br +0 -0
- package/payload/server/public/assets/file-text-DRGn4gjH.js.gz +0 -0
- package/payload/server/public/assets/{graph-B8-e2_Z-.js → graph-D7ECsLPs.js} +3 -3
- package/payload/server/public/assets/graph-D7ECsLPs.js.br +0 -0
- package/payload/server/public/assets/graph-D7ECsLPs.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-Bsc23eZU.js → graph-labels-ClzmLEoK.js} +1 -1
- package/payload/server/public/assets/graph-labels-ClzmLEoK.js.br +0 -0
- package/payload/server/public/assets/graph-labels-ClzmLEoK.js.gz +0 -0
- package/payload/server/public/assets/operator-jSdha7TP.js +1 -0
- package/payload/server/public/assets/operator-jSdha7TP.js.br +0 -0
- package/payload/server/public/assets/operator-jSdha7TP.js.gz +0 -0
- package/payload/server/public/assets/page-Cq4SkWbr.js +1 -0
- package/payload/server/public/assets/page-Cq4SkWbr.js.br +0 -0
- package/payload/server/public/assets/page-Cq4SkWbr.js.gz +0 -0
- package/payload/server/public/assets/page-DrwRXi3K.js +32 -0
- package/payload/server/public/assets/page-DrwRXi3K.js.br +0 -0
- package/payload/server/public/assets/page-DrwRXi3K.js.gz +0 -0
- package/payload/server/public/assets/play-CWyPEXiB.js +1 -0
- package/payload/server/public/assets/play-CWyPEXiB.js.br +0 -0
- package/payload/server/public/assets/play-CWyPEXiB.js.gz +0 -0
- package/payload/server/public/assets/public-D7MfkWvM.js +1 -0
- package/payload/server/public/assets/public-D7MfkWvM.js.br +0 -0
- package/payload/server/public/assets/public-D7MfkWvM.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-FZW7c8p8.js → rotate-ccw-CaWP-njL.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-CaWP-njL.js.gz +0 -0
- package/payload/server/public/assets/routines-XTk0vJUD.js +2 -0
- package/payload/server/public/assets/routines-XTk0vJUD.js.br +0 -0
- package/payload/server/public/assets/routines-XTk0vJUD.js.gz +0 -0
- package/payload/server/public/assets/skills-sjTaAr0v.js +1 -0
- package/payload/server/public/assets/skills-sjTaAr0v.js.br +0 -0
- package/payload/server/public/assets/skills-sjTaAr0v.js.gz +0 -0
- package/payload/server/public/assets/tasks-D0-qwWZR.js +3 -0
- package/payload/server/public/assets/tasks-D0-qwWZR.js.br +0 -0
- package/payload/server/public/assets/tasks-D0-qwWZR.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-CR-jRJdI.js → triangle-alert-BCndBPvE.js} +1 -1
- package/payload/server/public/assets/triangle-alert-BCndBPvE.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-BCndBPvE.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js +1 -0
- package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-BFMmBvVw.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css +1 -0
- package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.br +0 -0
- package/payload/server/public/assets/useMediaQuery-CXdUnGSe.css.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js +14 -0
- package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-q9BSy1Ld.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js +2 -0
- package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DmW6CW7B.js.gz +0 -0
- package/payload/server/public/assets/{wrench-CpCOYUBc.js → wrench-BBl51xDU.js} +1 -1
- package/payload/server/public/assets/wrench-BBl51xDU.js.br +0 -0
- package/payload/server/public/assets/wrench-BBl51xDU.js.gz +0 -0
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +8 -8
- 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 +474 -254
- package/payload/server/{src-JN6PIAJN.js → src-MM64CYYZ.js} +1 -1
- package/payload/server/{userprofile-reconcile-QHVLY2AH.js → userprofile-reconcile-TL4JKBPG.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js +0 -1
- package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-DuFCjbz2.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DJL5DzRX.js +0 -2
- package/payload/server/public/assets/AdminShell-DJL5DzRX.js.br +0 -0
- package/payload/server/public/assets/AdminShell-DJL5DzRX.js.gz +0 -0
- package/payload/server/public/assets/activity-CpMnNr5c.js +0 -1
- package/payload/server/public/assets/activity-CpMnNr5c.js.br +0 -0
- package/payload/server/public/assets/activity-CpMnNr5c.js.gz +0 -0
- package/payload/server/public/assets/admin-CBwKIfaI.js +0 -1
- package/payload/server/public/assets/admin-CBwKIfaI.js.br +0 -0
- package/payload/server/public/assets/admin-CBwKIfaI.js.gz +0 -0
- package/payload/server/public/assets/agents-C4LmSKjb.js +0 -1
- package/payload/server/public/assets/agents-C4LmSKjb.js.br +0 -0
- package/payload/server/public/assets/agents-C4LmSKjb.js.gz +0 -0
- package/payload/server/public/assets/browser-Bm9xm_yc.js +0 -1
- package/payload/server/public/assets/browser-Bm9xm_yc.js.br +0 -0
- package/payload/server/public/assets/browser-Bm9xm_yc.js.gz +0 -0
- package/payload/server/public/assets/calendar-CNY9FTWe.js +0 -1
- package/payload/server/public/assets/calendar-CNY9FTWe.js.br +0 -0
- package/payload/server/public/assets/calendar-CNY9FTWe.js.gz +0 -0
- package/payload/server/public/assets/chat-3WoUGCTd.js +0 -1
- package/payload/server/public/assets/chat-3WoUGCTd.js.br +0 -0
- package/payload/server/public/assets/chat-3WoUGCTd.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-BE16BJnw.js +0 -1
- package/payload/server/public/assets/chevron-left-BE16BJnw.js.br +0 -0
- package/payload/server/public/assets/chevron-right-Bu2VKpeU.js +0 -1
- package/payload/server/public/assets/chevron-right-Bu2VKpeU.js.br +0 -0
- package/payload/server/public/assets/clock-C4Nu2aRV.js +0 -1
- package/payload/server/public/assets/clock-C4Nu2aRV.js.br +0 -0
- package/payload/server/public/assets/copy-3kj9Oaoc.js.br +0 -0
- package/payload/server/public/assets/copy-3kj9Oaoc.js.gz +0 -0
- package/payload/server/public/assets/data-C-x5EHyi.js +0 -1
- package/payload/server/public/assets/data-C-x5EHyi.js.br +0 -1
- package/payload/server/public/assets/data-C-x5EHyi.js.gz +0 -0
- package/payload/server/public/assets/file-text-CBaewT76.js.br +0 -0
- package/payload/server/public/assets/file-text-CBaewT76.js.gz +0 -0
- package/payload/server/public/assets/graph-B8-e2_Z-.js.br +0 -0
- package/payload/server/public/assets/graph-B8-e2_Z-.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-Bsc23eZU.js.br +0 -0
- package/payload/server/public/assets/graph-labels-Bsc23eZU.js.gz +0 -0
- package/payload/server/public/assets/operator-Cve0-qfO.js +0 -1
- package/payload/server/public/assets/operator-Cve0-qfO.js.br +0 -0
- package/payload/server/public/assets/operator-Cve0-qfO.js.gz +0 -0
- package/payload/server/public/assets/page-BgVMs6Vf.js +0 -1
- package/payload/server/public/assets/page-BgVMs6Vf.js.br +0 -0
- package/payload/server/public/assets/page-BgVMs6Vf.js.gz +0 -0
- package/payload/server/public/assets/page-fABub-w8.js +0 -32
- package/payload/server/public/assets/page-fABub-w8.js.br +0 -0
- package/payload/server/public/assets/page-fABub-w8.js.gz +0 -0
- package/payload/server/public/assets/play-B6zXB9K7.js +0 -1
- package/payload/server/public/assets/play-B6zXB9K7.js.br +0 -0
- package/payload/server/public/assets/play-B6zXB9K7.js.gz +0 -0
- package/payload/server/public/assets/public--R2DbdWs.js +0 -1
- package/payload/server/public/assets/public--R2DbdWs.js.br +0 -0
- package/payload/server/public/assets/public--R2DbdWs.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-FZW7c8p8.js.gz +0 -0
- package/payload/server/public/assets/routines-BpZs2SaT.js +0 -2
- package/payload/server/public/assets/routines-BpZs2SaT.js.br +0 -0
- package/payload/server/public/assets/routines-BpZs2SaT.js.gz +0 -0
- package/payload/server/public/assets/skills-DF7uyEEz.js +0 -1
- package/payload/server/public/assets/skills-DF7uyEEz.js.br +0 -0
- package/payload/server/public/assets/skills-DF7uyEEz.js.gz +0 -0
- package/payload/server/public/assets/tasks-BfJJmoWO.js +0 -3
- package/payload/server/public/assets/tasks-BfJJmoWO.js.br +0 -0
- package/payload/server/public/assets/tasks-BfJJmoWO.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CR-jRJdI.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js +0 -1
- package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-IOuPUAHY.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js +0 -14
- package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-CA6dR5iz.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css +0 -1
- package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.br +0 -0
- package/payload/server/public/assets/useMediaQuery-DpwgV1Da.css.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js +0 -2
- package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DGhsN7nV.js.gz +0 -0
- package/payload/server/public/assets/wrench-CpCOYUBc.js.br +0 -0
- package/payload/server/public/assets/wrench-CpCOYUBc.js.gz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-watcher.d.ts","sourceRoot":"","sources":["../src/fs-watcher.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"fs-watcher.d.ts","sourceRoot":"","sources":["../src/fs-watcher.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAI5D,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,oBAAoB,CAAA;AAsC3B,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;AACpD;;;;;;;;gCAQgC;AAChC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7D,MAAM,WAAW,UAAU;IACzB;;mDAE+C;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,wEAAwE;IACxE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B;mEAC+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB;;;;qCAIiC;IACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB;;;;;2EAKuE;IACvE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,SAAS,CAAA;IACjB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;qBAOiB;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAW7B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,+DAA+D;IAC/D,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,+DAA+D;IAC/D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB;;wBAEoB;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB;;oDAEgD;IAChD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B;;;;;;;mBAOe;IACf,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC;2BACuB;IACvB,MAAM,EAAE,OAAO,CAAA;IACf;;;;yCAIqC;IACrC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACpC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAA;IACvB,GAAG,EAAE,UAAU,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;AAEtD,MAAM,WAAW,SAAS;IACxB,QAAQ,IAAI,IAAI,CAAA;IAChB,GAAG,IAAI,IAAI,CAAA;IACX,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI,CAAA;IACtC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IAClD,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IACxD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IAC7C,GAAG,IAAI,UAAU,EAAE,CAAA;IACnB;;;;;;;+EAO2E;IAC3E,eAAe,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IAC3D,6EAA6E;IAC7E,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC/D;;;;;;4CAMwC;IACxC,oBAAoB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3D;;;;;;;;;mDAS+C;IAC/C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1C,KAAK,IAAI,IAAI,CAAA;IACb;;;;2EAIuE;IACvE,UAAU,EAAE;QACV,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KACvC,CAAA;CACF;AAyDD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd;;;;sFAIkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;6EAIyE;IACzE,YAAY,CAAC,EAAE,eAAe,CAAA;IAC9B;;8EAE0E;IAC1E,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B;;+EAE2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,SAAS,CA22BZ"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
+
import type { AgentRole } from './types.js';
|
|
2
3
|
import { type SpawnDeps } from './pty-spawner.js';
|
|
3
4
|
import type { PtyCensusSnapshot } from './pty-census.js';
|
|
5
|
+
import type { RoleCensus } from './role-census.js';
|
|
4
6
|
import type { FsWatcher } from './fs-watcher.js';
|
|
5
7
|
import type { SubagentInjectionTail } from './subagent-injection-tail.js';
|
|
6
8
|
import type { RateLimiter } from './spawn-rate-limiter.js';
|
|
@@ -9,6 +11,35 @@ import { AccountTitleStores } from './account-title-stores.js';
|
|
|
9
11
|
import { WaChannelStore } from './wa-channel-store.js';
|
|
10
12
|
import { WebchatChannelStore } from './webchat-channel-store.js';
|
|
11
13
|
import { TelegramChannelStore } from './telegram-channel-store.js';
|
|
14
|
+
/** Task 2325 — the rc-spawn role, as supplied by the request body. Task 1468
|
|
15
|
+
* widened this position to allow `undefined` because rc-spawn's role was
|
|
16
|
+
* absent for a non-admin/non-public request; null now means "the body named
|
|
17
|
+
* none", and the handler resolves it against the prior sidecar before
|
|
18
|
+
* deciding whether that is an error. `passive` is not accepted here:
|
|
19
|
+
* rc-spawn composes no persona at all (its --append-system-prompt segments
|
|
20
|
+
* are reseat / voice / specialist-domains / authenticated-identity
|
|
21
|
+
* fragments, never composeAppendSystemPrompt). */
|
|
22
|
+
export declare function parseRcSpawnRole(body: {
|
|
23
|
+
role?: unknown;
|
|
24
|
+
}): Extract<AgentRole, 'admin' | 'public'> | null;
|
|
25
|
+
/** Task 2325 — the single place a /public-spawn wire role becomes a typed one.
|
|
26
|
+
* Returns the wire role (always 'admin' or 'public', narrowed by the ROLES
|
|
27
|
+
* allowlist above) and the persona role the spawn composes from. They differ
|
|
28
|
+
* only for a passive spawn. Anything the allowlist does not name returns null
|
|
29
|
+
* and the caller refuses; nothing falls through to 'admin'.
|
|
30
|
+
*
|
|
31
|
+
* The passive condition reproduces the Task 1483 invariant exactly, moved
|
|
32
|
+
* here from pty-spawner: a passive spawn rides `role:'public'` on the wire
|
|
33
|
+
* and is never a specialist, so a passive flag on any other role or on a
|
|
34
|
+
* specialist is ignored rather than silently registering a different (e.g.
|
|
35
|
+
* full-admin) server surface while the allowlist locks to work-create. */
|
|
36
|
+
export declare function parseSpawnRole(body: {
|
|
37
|
+
role?: unknown;
|
|
38
|
+
passive?: unknown;
|
|
39
|
+
}, specialist: string | undefined): {
|
|
40
|
+
role: AgentRole;
|
|
41
|
+
agentRole: AgentRole;
|
|
42
|
+
} | null;
|
|
12
43
|
export declare const SESSION_ID_PATTERN: RegExp;
|
|
13
44
|
export declare const RC_SPAWN_URL_WAIT_DEFAULT_MS = 60000;
|
|
14
45
|
export interface HttpDeps extends Omit<SpawnDeps, 'onSessionReady' | 'watcher'> {
|
|
@@ -37,6 +68,10 @@ export interface HttpDeps extends Omit<SpawnDeps, 'onSessionReady' | 'watcher'>
|
|
|
37
68
|
* the live /rc-spawn handler) keep working unchanged; production index.ts
|
|
38
69
|
* always injects it. */
|
|
39
70
|
webchatChannelStore?: WebchatChannelStore;
|
|
71
|
+
/** Task 2325 — the standing per-role spawn census. Optional so the existing
|
|
72
|
+
* test deps factories keep working unchanged; production index.ts always
|
|
73
|
+
* injects it. */
|
|
74
|
+
roleCensus?: RoleCensus;
|
|
40
75
|
/** Per-session telegram channel binding, the telegram twin of
|
|
41
76
|
* webchatChannelStore. Optional for the same reason: test deps factories
|
|
42
77
|
* that run the live /rc-spawn handler keep working unchanged; production
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,7 +59,40 @@ import { claudeStateRoot, projectSlugForCwd, jsonlPathForSessionId, sidecarPathF
|
|
|
59
59
|
import { basename, dirname, join } from 'node:path';
|
|
60
60
|
import { validateUserTitle } from './user-title-store.js';
|
|
61
61
|
import { credentialsPathForConfigDir, snapshotAuthForFailureReason } from './auth-snapshot.js';
|
|
62
|
+
// Task 2325 — the wire subset of AgentRole. `passive` is a persona role
|
|
63
|
+
// resolved at the /public-spawn boundary from role:'public' plus the passive
|
|
64
|
+
// flag; it is deliberately absent here so no client can POST it directly.
|
|
62
65
|
const ROLES = ['admin', 'public'];
|
|
66
|
+
/** Task 2325 — the rc-spawn role, as supplied by the request body. Task 1468
|
|
67
|
+
* widened this position to allow `undefined` because rc-spawn's role was
|
|
68
|
+
* absent for a non-admin/non-public request; null now means "the body named
|
|
69
|
+
* none", and the handler resolves it against the prior sidecar before
|
|
70
|
+
* deciding whether that is an error. `passive` is not accepted here:
|
|
71
|
+
* rc-spawn composes no persona at all (its --append-system-prompt segments
|
|
72
|
+
* are reseat / voice / specialist-domains / authenticated-identity
|
|
73
|
+
* fragments, never composeAppendSystemPrompt). */
|
|
74
|
+
export function parseRcSpawnRole(body) {
|
|
75
|
+
return body.role === 'admin' || body.role === 'public' ? body.role : null;
|
|
76
|
+
}
|
|
77
|
+
/** Task 2325 — the single place a /public-spawn wire role becomes a typed one.
|
|
78
|
+
* Returns the wire role (always 'admin' or 'public', narrowed by the ROLES
|
|
79
|
+
* allowlist above) and the persona role the spawn composes from. They differ
|
|
80
|
+
* only for a passive spawn. Anything the allowlist does not name returns null
|
|
81
|
+
* and the caller refuses; nothing falls through to 'admin'.
|
|
82
|
+
*
|
|
83
|
+
* The passive condition reproduces the Task 1483 invariant exactly, moved
|
|
84
|
+
* here from pty-spawner: a passive spawn rides `role:'public'` on the wire
|
|
85
|
+
* and is never a specialist, so a passive flag on any other role or on a
|
|
86
|
+
* specialist is ignored rather than silently registering a different (e.g.
|
|
87
|
+
* full-admin) server surface while the allowlist locks to work-create. */
|
|
88
|
+
export function parseSpawnRole(body, specialist) {
|
|
89
|
+
const raw = body.role;
|
|
90
|
+
if (typeof raw !== 'string' || !ROLES.includes(raw))
|
|
91
|
+
return null;
|
|
92
|
+
const role = raw;
|
|
93
|
+
const agentRole = body.passive === true && role === 'public' && specialist === undefined ? 'passive' : role;
|
|
94
|
+
return { role, agentRole };
|
|
95
|
+
}
|
|
63
96
|
const CHANNELS = ['browser', 'whatsapp', 'telegram', 'webchat', 'email'];
|
|
64
97
|
// Task 382 — body.conversationNodeId shape gate. The value is the
|
|
65
98
|
// sessionId UUID (v4) minted by createNewAdminConversation in
|
|
@@ -1037,12 +1070,21 @@ export function buildHttpApp(deps) {
|
|
|
1037
1070
|
const userId = typeof body.userId === 'string' && body.userId.length > 0 && body.userId.length <= 128
|
|
1038
1071
|
? body.userId
|
|
1039
1072
|
: undefined;
|
|
1040
|
-
const role = typeof body.role === 'string' ? body.role : '';
|
|
1041
1073
|
const channel = typeof body.channel === 'string' ? body.channel : '';
|
|
1042
1074
|
const hidden = body.hidden === true;
|
|
1043
1075
|
const specialist = typeof body.specialist === 'string' && /^[A-Za-z0-9_-]{1,64}$/.test(body.specialist)
|
|
1044
1076
|
? body.specialist
|
|
1045
1077
|
: undefined;
|
|
1078
|
+
// Task 2325 — one parse, before any other use of the role. `role` is what
|
|
1079
|
+
// arrived on the wire; `agentRole` is which persona it resolves to. They
|
|
1080
|
+
// differ only for a passive spawn. `role` keeps its string-or-empty shape
|
|
1081
|
+
// so every existing read of it, including the spawn-request log line's
|
|
1082
|
+
// `role=${role || 'missing'}`, is unchanged.
|
|
1083
|
+
const parsedRole = parseSpawnRole(body, specialist);
|
|
1084
|
+
const role = parsedRole?.role ?? '';
|
|
1085
|
+
const agentRole = parsedRole?.agentRole ?? null;
|
|
1086
|
+
// Task 2325 — recorded before the guard so a refused spawn is counted.
|
|
1087
|
+
deps.roleCensus?.record(agentRole);
|
|
1046
1088
|
// Task 956 — public sessions are pinned to Sonnet 5 (operator decision:
|
|
1047
1089
|
// admin-only Bypass/Opus; public stays Sonnet + fail-closed dontAsk). The
|
|
1048
1090
|
// role==='public' force is the chokepoint covering every public spawn
|
|
@@ -1152,7 +1194,15 @@ export function buildHttpApp(deps) {
|
|
|
1152
1194
|
: body.dormantPlugins == null ? 'absent' : typeof body.dormantPlugins;
|
|
1153
1195
|
const initialMessageBytes = typeof body.initialMessage === 'string' ? Buffer.byteLength(body.initialMessage, 'utf8') : 0;
|
|
1154
1196
|
deps.logger(`spawn-request senderId=${senderId || 'missing'} userId=${userId ? userId.slice(0, 8) : 'absent'} role=${role || 'missing'} channel=${channel || 'missing'} permissionMode=${typeof body.permissionMode === 'string' ? body.permissionMode : 'default'} channels=${Array.isArray(body.channels) ? body.channels.length : 0} attachmentDir=${typeof body.attachmentDir === 'string' ? 'set' : 'absent'} aboutOwner=${aboutOwnerShape} dormantPlugins=${dormantPluginsShape} tunnelUrl=${typeof body.tunnelUrl === 'string' ? 'set' : (body.tunnelUrl === null ? 'null' : 'absent')} initialMessageBytes=${initialMessageBytes}`);
|
|
1155
|
-
if (!senderId ||
|
|
1197
|
+
if (!senderId || parsedRole === null || agentRole === null || !CHANNELS.includes(channel)) {
|
|
1198
|
+
// Task 2325 — emitted only when the ROLE is what failed. The guard also
|
|
1199
|
+
// covers a missing senderId and a bad channel, and naming those
|
|
1200
|
+
// `role-unresolved` would make the line lie about its own cause, which
|
|
1201
|
+
// is the exact defect class this task exists to remove. The 400 body
|
|
1202
|
+
// below still reports all three fields.
|
|
1203
|
+
if (parsedRole === null) {
|
|
1204
|
+
deps.logger(`[spawn] op=role-unresolved sessionId=new role=${typeof body.role === 'string' ? body.role : String(body.role)} site=public-spawn`);
|
|
1205
|
+
}
|
|
1156
1206
|
timed(deps.logger, 'POST', '/public-spawn', 400, Date.now() - start);
|
|
1157
1207
|
return c.json({ error: 'invalid-arguments', detail: { senderId: !!senderId, role, channel } }, 400);
|
|
1158
1208
|
}
|
|
@@ -1282,7 +1332,7 @@ export function buildHttpApp(deps) {
|
|
|
1282
1332
|
if (!passive) {
|
|
1283
1333
|
// Task 2271 — `spawnCwd` here is the re-scoped value, so the audit
|
|
1284
1334
|
// follows a public-agent session into its own account's slug.
|
|
1285
|
-
attachPublicAudit(deps, tracker.sessionId, role, spawnCwd);
|
|
1335
|
+
attachPublicAudit(deps, tracker.sessionId, parsedRole.role, spawnCwd);
|
|
1286
1336
|
// Task 2262 — the exit notify is webchat machinery: the route it
|
|
1287
1337
|
// calls resolves the sessionId against the WEBCHAT gateway's
|
|
1288
1338
|
// publicSessions map to fire a slice-review, so a WhatsApp public
|
|
@@ -1292,7 +1342,7 @@ export function buildHttpApp(deps) {
|
|
|
1292
1342
|
// because a WhatsApp visitor's realised tool surface is exactly what
|
|
1293
1343
|
// Task 2260 wants audited.
|
|
1294
1344
|
if (channel !== 'whatsapp') {
|
|
1295
|
-
attachPublicExitNotify(tracker.sessionId, role, deps.logger);
|
|
1345
|
+
attachPublicExitNotify(tracker.sessionId, parsedRole.role, deps.logger);
|
|
1296
1346
|
}
|
|
1297
1347
|
}
|
|
1298
1348
|
attachSpecialistEndTurnAutoArchive(deps, tracker.sessionId, tracker.specialist);
|
|
@@ -1304,7 +1354,10 @@ export function buildHttpApp(deps) {
|
|
|
1304
1354
|
}, {
|
|
1305
1355
|
senderId,
|
|
1306
1356
|
userId,
|
|
1307
|
-
role
|
|
1357
|
+
// Task 2325 — the PERSONA role the spawn composes from, resolved by
|
|
1358
|
+
// the boundary parse above. No cast: `agentRole` is non-null past the
|
|
1359
|
+
// guard. The wire role stays on the sidecar (pty-spawner maps it back).
|
|
1360
|
+
role: agentRole,
|
|
1308
1361
|
channel: channel,
|
|
1309
1362
|
channels,
|
|
1310
1363
|
permissionMode,
|
|
@@ -1326,7 +1379,6 @@ export function buildHttpApp(deps) {
|
|
|
1326
1379
|
waChannel,
|
|
1327
1380
|
...sessionIdFields,
|
|
1328
1381
|
previousContext,
|
|
1329
|
-
passive,
|
|
1330
1382
|
targetAccountId,
|
|
1331
1383
|
// Task 2271 — the RESOLVED variable, not the parsed field: when the
|
|
1332
1384
|
// same-slug rule declines the re-scope, the sidecar stays at the house
|
|
@@ -2692,7 +2744,11 @@ export function buildHttpApp(deps) {
|
|
|
2692
2744
|
// session-end review) supply no channel and get no sidecar. Task 852 widens
|
|
2693
2745
|
// the accepted role to 'public' (authenticated-public WhatsApp person) and
|
|
2694
2746
|
// the sidecar records the actual role.
|
|
2695
|
-
|
|
2747
|
+
// Task 2325 — the BODY's role. Null when absent or unrecognised. A
|
|
2748
|
+
// channel-bound resume legitimately omits it and inherits from its prior
|
|
2749
|
+
// sidecar, so the refusal is not here; it is where both sources have been
|
|
2750
|
+
// consulted, just below `priorSidecar`.
|
|
2751
|
+
const rcRole = parseRcSpawnRole(body);
|
|
2696
2752
|
const adminChannel = typeof body.channel === 'string' && CHANNELS.includes(body.channel)
|
|
2697
2753
|
? body.channel
|
|
2698
2754
|
: undefined;
|
|
@@ -3035,11 +3091,46 @@ export function buildHttpApp(deps) {
|
|
|
3035
3091
|
// yields null; the gate degrades to the not-resolvable identity form.
|
|
3036
3092
|
// Task 1214 — widened from webchat-only to any channel-bound session so the
|
|
3037
3093
|
// admin-role signal resolves for WhatsApp/Telegram resumes that omit role
|
|
3038
|
-
// too (the voice-contract gate below keys on `adminBinding`).
|
|
3039
|
-
// channel-
|
|
3040
|
-
|
|
3094
|
+
// too (the voice-contract gate below keys on `adminBinding`).
|
|
3095
|
+
// Task 2325 — widened again to EVERY resume, channel-bound or not, so the
|
|
3096
|
+
// role can be inherited from disk before the refusal below. The dropped
|
|
3097
|
+
// "channel-less resumes skip the disk touch" optimisation cost one small
|
|
3098
|
+
// readFileSync on a path that then spawns a PTY. Without it, the bare
|
|
3099
|
+
// `{ sessionId }` resumes that wedged-session recovery (index.ts, the
|
|
3100
|
+
// recoverWedgedSession resumeSpawn) and the re-seat route send would be
|
|
3101
|
+
// refused for carrying no role, when their role has been on disk all along.
|
|
3102
|
+
const priorSidecar = sessionId
|
|
3041
3103
|
? readSidecar(sidecarPathForSessionId(effectiveAccountDir, sessionId), deps.logger).sidecar
|
|
3042
3104
|
: null;
|
|
3105
|
+
// Task 2325 — the session's role, from the body or inherited from disk.
|
|
3106
|
+
// The refusal sits here rather than at the body parse because an absent
|
|
3107
|
+
// `role` has THREE legitimate readings and only one of them is an error:
|
|
3108
|
+
// 1. a channel-bound resume, which inherits from `priorSidecar` (Task
|
|
3109
|
+
// 2260's own words: "a resume omits `role` in the body");
|
|
3110
|
+
// 2. a one-shot admin job, which is not a channel conversation — those
|
|
3111
|
+
// now pass role:'admin' and are told apart by their absent `channel`,
|
|
3112
|
+
// which is what the classification-sidecar gate below reads;
|
|
3113
|
+
// 3. a caller that simply supplied none on a FRESH spawn, which is the
|
|
3114
|
+
// error. Before this it became `undefined` and rode on, and
|
|
3115
|
+
// `sessionRole=undefined` was documented (Task 1468) as a value to
|
|
3116
|
+
// preserve rather than treated as a fault.
|
|
3117
|
+
//
|
|
3118
|
+
// The `mode === 'fresh'` half of the gate is load-bearing, not caution. A
|
|
3119
|
+
// resume that inherits nothing is the claude.ai/code bridge: the bare
|
|
3120
|
+
// admin-host branch of session-rc-spawn.ts posts `{ sessionId, name }`
|
|
3121
|
+
// with no role and no channel, and wedged-session recovery posts
|
|
3122
|
+
// `{ sessionId }`. Both resume a session whose role predates the request.
|
|
3123
|
+
// Refusing them would take out a core operator surface to close a hole
|
|
3124
|
+
// that only a fresh spawn can open: a resume composes no new persona,
|
|
3125
|
+
// and rc-spawn composes none at all.
|
|
3126
|
+
const effectiveRcRole = rcRole ?? priorSidecar?.role ?? null;
|
|
3127
|
+
// Task 2325 — recorded before the refusal so a refused spawn is counted.
|
|
3128
|
+
deps.roleCensus?.record(effectiveRcRole);
|
|
3129
|
+
if (effectiveRcRole === null && mode === 'fresh') {
|
|
3130
|
+
deps.logger(`[rc-spawn] op=role-unresolved sessionId=${sessionId ? sessionId.slice(0, 8) : 'new'} role=${String(body.role)} site=rc-spawn`);
|
|
3131
|
+
timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
|
|
3132
|
+
return c.json({ error: 'invalid-arguments', detail: { role: body.role ?? null } }, 400);
|
|
3133
|
+
}
|
|
3043
3134
|
// Task 850 — assemble the bound target set and choose the channel server:
|
|
3044
3135
|
// - ≥2 kinds: ONE unified `channel` server (one reply tool fanning to every
|
|
3045
3136
|
// target's existing gateway endpoint). The mature per-kind servers are
|
|
@@ -3136,7 +3227,9 @@ export function buildHttpApp(deps) {
|
|
|
3136
3227
|
gatewayUrl: effectiveTelegramChannel.gatewayUrl,
|
|
3137
3228
|
serverPath: effectiveTelegramChannel.serverPath,
|
|
3138
3229
|
nodeBin: deps.nodeBin,
|
|
3139
|
-
role
|
|
3230
|
+
// Task 2325 — the body role, unchanged in meaning; `?? undefined`
|
|
3231
|
+
// only bridges null to the optional parameter this builder declares.
|
|
3232
|
+
role: rcRole ?? undefined,
|
|
3140
3233
|
});
|
|
3141
3234
|
telegramPath = telegramChannelMcpConfigPath(sessionId, tmpdir());
|
|
3142
3235
|
try {
|
|
@@ -3159,7 +3252,7 @@ export function buildHttpApp(deps) {
|
|
|
3159
3252
|
// which is every public spawn that can reply. Pushed after the channel argv
|
|
3160
3253
|
// so `--strict-mcp-config` leaves exactly the per-spawn channel server
|
|
3161
3254
|
// registered; `admin` and roleless spawns produce byte-identical argv.
|
|
3162
|
-
|
|
3255
|
+
// Task 2325 — resolved once, above, beside the refusal.
|
|
3163
3256
|
const publicLockdown = effectiveRcRole === 'public' ? buildRcPublicLockdownArgv(channelServerName) : null;
|
|
3164
3257
|
if (publicLockdown) {
|
|
3165
3258
|
// A re-seat fork pushes its own caller-picked --permission-mode above,
|
|
@@ -3279,6 +3372,12 @@ export function buildHttpApp(deps) {
|
|
|
3279
3372
|
// (effectiveAccountId !== house) spawns — fail-closed, no escalation.
|
|
3280
3373
|
const acctIsHouse = isHouseAccount(deps.platformRoot, effectiveAccountId);
|
|
3281
3374
|
const rcHouseAdminScope = houseAdminScopeFor({
|
|
3375
|
+
// Task 2325 — the BODY's role, deliberately not `effectiveRcRole`. A
|
|
3376
|
+
// resume that omits the role has never carried house scope (its old
|
|
3377
|
+
// `undefined` was cast and failed the `role === 'admin'` test), and
|
|
3378
|
+
// switching to the inherited role here would newly grant cross-account
|
|
3379
|
+
// authority to every admin channel resume. That gap is real and
|
|
3380
|
+
// pre-existing; deciding it is not this task's scope.
|
|
3282
3381
|
role: rcRole,
|
|
3283
3382
|
accountId: effectiveAccountId,
|
|
3284
3383
|
isHouse: acctIsHouse,
|
|
@@ -3290,7 +3389,12 @@ export function buildHttpApp(deps) {
|
|
|
3290
3389
|
// line makes the rc-spawn decision greppable per spawn.
|
|
3291
3390
|
deps.logger(formatHouseScopeInjectLine({
|
|
3292
3391
|
sessionId,
|
|
3293
|
-
|
|
3392
|
+
// Task 2325 — the session's role, so this line can no longer render
|
|
3393
|
+
// `sessionRole=undefined`. A resume that inherits no role renders the
|
|
3394
|
+
// explicit token `none`, matching the idiom this handler already uses
|
|
3395
|
+
// for the same value below. A stringified absence read as a formatting
|
|
3396
|
+
// artefact, which is how an unnamed role stayed invisible for two tasks.
|
|
3397
|
+
sessionRole: effectiveRcRole ?? 'none',
|
|
3294
3398
|
acctIsHouse,
|
|
3295
3399
|
inject: rcHouseAdminScope !== null,
|
|
3296
3400
|
}));
|
|
@@ -3509,18 +3613,31 @@ export function buildHttpApp(deps) {
|
|
|
3509
3613
|
// when one exists. Non-fatal: the PTY here is already serving a live thread —
|
|
3510
3614
|
// a failed classification sidecar must not tear it down, so it logs and the
|
|
3511
3615
|
// session keeps running (the pre-fix reader-blind behaviour, no worse).
|
|
3512
|
-
|
|
3616
|
+
// Task 2325 — the sidecar is written for a channel conversation. What
|
|
3617
|
+
// distinguishes one from a one-shot admin job is the CHANNEL, not whether
|
|
3618
|
+
// a role was supplied: the LinkedIn ingest and the public session-end
|
|
3619
|
+
// review are role:'admin' and pass no channel, and they still get no
|
|
3620
|
+
// sidecar. Before this the absent role carried both meanings at once.
|
|
3621
|
+
const classifyChannel = adminChannel;
|
|
3513
3622
|
const classifySenderId = adminSenderId ?? effectiveWaChannel?.senderId ?? effectiveWebchatChannel?.key ?? effectiveTelegramChannel?.senderId;
|
|
3514
|
-
|
|
3623
|
+
// Task 2325 — `effectiveRcRole !== null` joins the guard rather than being
|
|
3624
|
+
// cast away. The sidecar's `role` is read back through an allowlist that
|
|
3625
|
+
// rejects the whole row on a bad value, so a session with no resolvable
|
|
3626
|
+
// role gets NO sidecar rather than one recording an absence.
|
|
3627
|
+
if (sessionId && classifyChannel && classifySenderId && effectiveRcRole !== null) {
|
|
3515
3628
|
const classifySidecarPath = sidecarPathForSessionId(effectiveAccountDir, sessionId);
|
|
3516
3629
|
if (!existsSync(classifySidecarPath)) {
|
|
3517
3630
|
try {
|
|
3518
3631
|
writeSidecar(classifySidecarPath, {
|
|
3519
3632
|
senderId: classifySenderId,
|
|
3520
|
-
// Task 852 — the actual role
|
|
3521
|
-
//
|
|
3522
|
-
//
|
|
3523
|
-
|
|
3633
|
+
// Task 852 — the actual role, not a hardcoded 'admin'. Task 2325
|
|
3634
|
+
// — the effective role (body, else inherited from disk),
|
|
3635
|
+
// non-null by the guard above. The old
|
|
3636
|
+
// `rcRole as 'admin' | 'public'` relied on this gate being
|
|
3637
|
+
// role-derived; the gate now reads the channel, so without the
|
|
3638
|
+
// guard a resume with a channel and no body role would have
|
|
3639
|
+
// written a cast `undefined` into the sidecar.
|
|
3640
|
+
role: effectiveRcRole,
|
|
3524
3641
|
channel: classifyChannel,
|
|
3525
3642
|
url: null,
|
|
3526
3643
|
startedAt: new Date().toISOString(),
|