@rubytech/create-sitedesk-code 0.1.607 → 0.1.609
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/admins-write/vitest.config.ts +1 -0
- package/payload/platform/lib/agent-dispatch-rule/vitest.config.ts +1 -0
- package/payload/platform/lib/brand-templating/vitest.config.ts +1 -0
- package/payload/platform/lib/canonical-instant/vitest.config.ts +1 -0
- package/payload/platform/lib/dispatch-read/vitest.config.ts +1 -0
- package/payload/platform/lib/graph-search/vitest.config.ts +1 -0
- package/payload/platform/lib/graph-style/vitest.config.ts +1 -0
- package/payload/platform/lib/graph-write/dist/__tests__/account-id-gate.test.js +86 -0
- package/payload/platform/lib/graph-write/dist/__tests__/account-id-gate.test.js.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.d.ts +30 -9
- package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-write/dist/index.js +22 -2
- package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-write/src/__tests__/account-id-gate.test.ts +99 -1
- package/payload/platform/lib/graph-write/src/index.ts +47 -12
- package/payload/platform/lib/mcp-lifeline/vitest.config.ts +1 -0
- package/payload/platform/lib/routine-templates/vitest.config.ts +1 -0
- package/payload/platform/lib/task-secrets/vitest.config.ts +1 -0
- package/payload/platform/lib/telegram-button-labels/vitest.config.ts +1 -0
- package/payload/platform/lib/telegram-managed-bot/vitest.config.ts +1 -0
- package/payload/platform/lib/telegram-media/vitest.config.ts +1 -0
- package/payload/platform/lib/telegram-reach/vitest.config.ts +1 -0
- package/payload/platform/lib/telegram-store-read/vitest.config.ts +1 -0
- package/payload/platform/plugins/admin/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +83 -2
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +14 -0
- package/payload/platform/plugins/aeo/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/cloudflare/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/connector/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/contacts/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/docs/references/telegram-guide.md +82 -1
- package/payload/platform/plugins/email/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/filesystem/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/graph-viewer/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js +65 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.js +169 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/xacct-counters.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.d.ts +63 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.js +114 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/xacct-counters.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.js +123 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-write-cross-account.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.js +110 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/xacct-write-gate.test.js.map +1 -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 +7 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/vitest.config.ts +3 -0
- package/payload/platform/plugins/scheduling/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/storage-broker/mcp/vitest.config.ts +6 -1
- package/payload/platform/plugins/telegram/PLUGIN.md +6 -2
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js +35 -3
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/card-tool.test.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/instruct-tool.test.d.ts +2 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/instruct-tool.test.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/instruct-tool.test.js +93 -0
- package/payload/platform/plugins/telegram/mcp/dist/__tests__/instruct-tool.test.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/index.js +20 -0
- package/payload/platform/plugins/telegram/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.d.ts.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js +7 -0
- package/payload/platform/plugins/telegram/mcp/dist/lib/public-pin.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.d.ts.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.js +12 -5
- package/payload/platform/plugins/telegram/mcp/dist/tools/card.js.map +1 -1
- package/payload/platform/plugins/telegram/mcp/dist/tools/instruct.d.ts +56 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/instruct.d.ts.map +1 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/instruct.js +91 -0
- package/payload/platform/plugins/telegram/mcp/dist/tools/instruct.js.map +1 -0
- package/payload/platform/plugins/telegram/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/url-get/mcp/vitest.config.ts +1 -0
- package/payload/platform/plugins/whatsapp/mcp/vitest.config.ts +1 -0
- package/payload/platform/scripts/repair-misfiled-card-rows.sh +276 -0
- 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/services/claude-session-manager/dist/claude-trust-preflight.d.ts +43 -0
- package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.js +88 -0
- package/payload/platform/services/claude-session-manager/dist/claude-trust-preflight.js.map +1 -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 +125 -4
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +26 -1
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +26 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/recover-account.d.ts +54 -0
- package/payload/platform/services/claude-session-manager/dist/recover-account.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/recover-account.js +141 -0
- package/payload/platform/services/claude-session-manager/dist/recover-account.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/session-account-census.d.ts +30 -0
- package/payload/platform/services/claude-session-manager/dist/session-account-census.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/session-account-census.js +96 -0
- package/payload/platform/services/claude-session-manager/dist/session-account-census.js.map +1 -0
- package/payload/platform/services/claude-session-manager/vitest.config.ts +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.d.ts +10 -0
- package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.js +38 -0
- package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.d.ts +24 -7
- package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.js +31 -1
- package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
- package/payload/platform/test/tmpdir-setup.ts +54 -0
- package/payload/server/{chunk-GI5AVCRG.js → chunk-DRDU74ZM.js} +1 -1
- package/payload/server/{chunk-MNN2RWJR.js → chunk-IOPUA7QV.js} +1 -1
- package/payload/server/{chunk-6AQYMT6C.js → chunk-T6NXRWMG.js} +43 -8
- package/payload/server/{manager-VDHT3YYI.js → manager-O5L2SKW7.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/public/activity.html +6 -6
- package/payload/server/public/agents.html +5 -5
- package/payload/server/public/assets/{AdminLoginScreens-DuQ3ax5U.js → AdminLoginScreens-BBKEIEjY.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-BBKEIEjY.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-BBKEIEjY.js.gz +0 -0
- package/payload/server/public/assets/{AdminShell-1HyATV_t.js → AdminShell-CrCdEMNW.js} +1 -1
- package/payload/server/public/assets/AdminShell-CrCdEMNW.js.br +0 -0
- package/payload/server/public/assets/AdminShell-CrCdEMNW.js.gz +0 -0
- package/payload/server/public/assets/{activity-C2qWlcJ5.js → activity-CbR3vaq1.js} +1 -1
- package/payload/server/public/assets/activity-CbR3vaq1.js.br +0 -0
- package/payload/server/public/assets/activity-CbR3vaq1.js.gz +0 -0
- package/payload/server/public/assets/{admin-DqpfY8-t.js → admin-D8qKnmhE.js} +1 -1
- package/payload/server/public/assets/admin-D8qKnmhE.js.br +0 -0
- package/payload/server/public/assets/admin-D8qKnmhE.js.gz +0 -0
- package/payload/server/public/assets/{agents-DoGVAjIT.js → agents-8gAQjRqI.js} +1 -1
- package/payload/server/public/assets/agents-8gAQjRqI.js.br +0 -0
- package/payload/server/public/assets/agents-8gAQjRqI.js.gz +0 -0
- package/payload/server/public/assets/{browser-DjqS897k.js → browser-jAje5ILy.js} +1 -1
- package/payload/server/public/assets/browser-jAje5ILy.js.br +0 -0
- package/payload/server/public/assets/browser-jAje5ILy.js.gz +0 -0
- package/payload/server/public/assets/{calendar-DJeOm0WS.js → calendar-xEmCJif9.js} +1 -1
- package/payload/server/public/assets/calendar-xEmCJif9.js.br +0 -0
- package/payload/server/public/assets/calendar-xEmCJif9.js.gz +0 -0
- package/payload/server/public/assets/chat-Ct5RDmv6.js +1 -0
- package/payload/server/public/assets/chat-Ct5RDmv6.js.br +0 -0
- package/payload/server/public/assets/chat-Ct5RDmv6.js.gz +0 -0
- package/payload/server/public/assets/{chevron-left-D9z1aK3p.js → chevron-left-DV8gIVC9.js} +1 -1
- package/payload/server/public/assets/chevron-left-DV8gIVC9.js.br +0 -0
- package/payload/server/public/assets/clock-PnR4Tlg9.js +1 -0
- package/payload/server/public/assets/clock-PnR4Tlg9.js.br +0 -0
- package/payload/server/public/assets/{copy-p9ZM9fnn.js → copy-b6MpzRz9.js} +1 -1
- package/payload/server/public/assets/copy-b6MpzRz9.js.br +0 -0
- package/payload/server/public/assets/copy-b6MpzRz9.js.gz +0 -0
- package/payload/server/public/assets/data-BxFc9wPl.js +1 -0
- package/payload/server/public/assets/data-BxFc9wPl.js.br +2 -0
- package/payload/server/public/assets/data-BxFc9wPl.js.gz +0 -0
- package/payload/server/public/assets/{field-WRk67lvr.js → field-CiIsn-47.js} +1 -1
- package/payload/server/public/assets/field-CiIsn-47.js.br +0 -0
- package/payload/server/public/assets/field-CiIsn-47.js.gz +0 -0
- package/payload/server/public/assets/{file-text-BJDCb334.js → file-text-Cy-IjCf8.js} +1 -1
- package/payload/server/public/assets/file-text-Cy-IjCf8.js.br +0 -0
- package/payload/server/public/assets/file-text-Cy-IjCf8.js.gz +0 -0
- package/payload/server/public/assets/{graph-CAU2xh2Z.js → graph-BdC2IGOT.js} +1 -1
- package/payload/server/public/assets/graph-BdC2IGOT.js.br +0 -0
- package/payload/server/public/assets/graph-BdC2IGOT.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-CEDmX7qW.js → graph-labels-3bstML8n.js} +1 -1
- package/payload/server/public/assets/graph-labels-3bstML8n.js.br +0 -0
- package/payload/server/public/assets/graph-labels-3bstML8n.js.gz +0 -0
- package/payload/server/public/assets/{jsx-runtime-hPFGo4rC.css → jsx-runtime-JxxB_2S6.css} +1 -1
- package/payload/server/public/assets/jsx-runtime-JxxB_2S6.css.br +0 -0
- package/payload/server/public/assets/{jsx-runtime-hPFGo4rC.css.gz → jsx-runtime-JxxB_2S6.css.gz} +0 -0
- package/payload/server/public/assets/{operator-1WFztEQA.js → operator-D7L2SA16.js} +1 -1
- package/payload/server/public/assets/operator-D7L2SA16.js.br +0 -0
- package/payload/server/public/assets/operator-D7L2SA16.js.gz +0 -0
- package/payload/server/public/assets/{page-B72XigcU.js → page-DspGbDgK.js} +1 -1
- package/payload/server/public/assets/page-DspGbDgK.js.br +0 -0
- package/payload/server/public/assets/page-DspGbDgK.js.gz +0 -0
- package/payload/server/public/assets/{page-nT8l_cX1.js → page-ObXxk8ol.js} +1 -1
- package/payload/server/public/assets/page-ObXxk8ol.js.br +0 -0
- package/payload/server/public/assets/page-ObXxk8ol.js.gz +0 -0
- package/payload/server/public/assets/play-BL4ztD3m.js +1 -0
- package/payload/server/public/assets/play-BL4ztD3m.js.br +0 -0
- package/payload/server/public/assets/play-BL4ztD3m.js.gz +0 -0
- package/payload/server/public/assets/{public-DAea6w7w.js → public-CEXKl8wg.js} +1 -1
- package/payload/server/public/assets/public-CEXKl8wg.js.br +0 -0
- package/payload/server/public/assets/public-CEXKl8wg.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-CqlRlGsY.js → rotate-ccw-ckXDebK2.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-ckXDebK2.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-ckXDebK2.js.gz +0 -0
- package/payload/server/public/assets/{routines-vy5xsyqx.js → routines-Dwc2meN2.js} +1 -1
- package/payload/server/public/assets/routines-Dwc2meN2.js.br +0 -0
- package/payload/server/public/assets/routines-Dwc2meN2.js.gz +0 -0
- package/payload/server/public/assets/{skills-X7FTilVy.js → skills-DdHKHl4Z.js} +1 -1
- package/payload/server/public/assets/skills-DdHKHl4Z.js.br +0 -0
- package/payload/server/public/assets/skills-DdHKHl4Z.js.gz +0 -0
- package/payload/server/public/assets/{tasks-BXx_jk_p.js → tasks-C_yWRvOG.js} +1 -1
- package/payload/server/public/assets/tasks-C_yWRvOG.js.br +0 -0
- package/payload/server/public/assets/tasks-C_yWRvOG.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-CuWcGaRo.js → triangle-alert-C-7A00P0.js} +1 -1
- package/payload/server/public/assets/triangle-alert-C-7A00P0.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-C-7A00P0.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-DLSKs6r2.js → useCopyFeedback-CWvSi-Qe.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-CWvSi-Qe.js.br +2 -0
- package/payload/server/public/assets/useCopyFeedback-CWvSi-Qe.js.gz +0 -0
- package/payload/server/public/assets/{useMediaQuery-C_1CV_iW.js → useMediaQuery-CLVRXJMp.js} +1 -1
- package/payload/server/public/assets/useMediaQuery-CLVRXJMp.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-CLVRXJMp.js.gz +0 -0
- package/payload/server/public/assets/{useVoiceRecorder-DBzM_HIx.js → useVoiceRecorder-BbJad9CQ.js} +1 -1
- package/payload/server/public/assets/useVoiceRecorder-BbJad9CQ.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-BbJad9CQ.js.gz +0 -0
- package/payload/server/public/assets/{wrench-nDMQ6x-6.js → wrench-Cl6TUm2T.js} +1 -1
- package/payload/server/public/assets/wrench-Cl6TUm2T.js.br +0 -0
- package/payload/server/public/assets/wrench-Cl6TUm2T.js.gz +0 -0
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +8 -8
- package/payload/server/public/chat.html +14 -14
- package/payload/server/public/data.html +12 -12
- package/payload/server/public/field.html +3 -3
- package/payload/server/public/graph.html +10 -10
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +16 -16
- package/payload/server/public/public.html +14 -14
- package/payload/server/public/routines.html +8 -8
- package/payload/server/public/skills.html +6 -6
- package/payload/server/public/tasks.html +7 -7
- package/payload/server/server.js +1820 -1195
- package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-DuQ3ax5U.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-1HyATV_t.js.br +0 -0
- package/payload/server/public/assets/AdminShell-1HyATV_t.js.gz +0 -0
- package/payload/server/public/assets/activity-C2qWlcJ5.js.br +0 -0
- package/payload/server/public/assets/activity-C2qWlcJ5.js.gz +0 -0
- package/payload/server/public/assets/admin-DqpfY8-t.js.br +0 -0
- package/payload/server/public/assets/admin-DqpfY8-t.js.gz +0 -0
- package/payload/server/public/assets/agents-DoGVAjIT.js.br +0 -0
- package/payload/server/public/assets/agents-DoGVAjIT.js.gz +0 -0
- package/payload/server/public/assets/browser-DjqS897k.js.br +0 -0
- package/payload/server/public/assets/browser-DjqS897k.js.gz +0 -0
- package/payload/server/public/assets/calendar-DJeOm0WS.js.br +0 -0
- package/payload/server/public/assets/calendar-DJeOm0WS.js.gz +0 -0
- package/payload/server/public/assets/chat-BrRE0Dck.js +0 -1
- package/payload/server/public/assets/chat-BrRE0Dck.js.br +0 -0
- package/payload/server/public/assets/chat-BrRE0Dck.js.gz +0 -0
- package/payload/server/public/assets/chevron-left-D9z1aK3p.js.br +0 -0
- package/payload/server/public/assets/clock-BqHWMICF.js +0 -1
- package/payload/server/public/assets/clock-BqHWMICF.js.br +0 -0
- package/payload/server/public/assets/clock-BqHWMICF.js.gz +0 -0
- package/payload/server/public/assets/copy-p9ZM9fnn.js.br +0 -0
- package/payload/server/public/assets/copy-p9ZM9fnn.js.gz +0 -0
- package/payload/server/public/assets/data-CPsqW0qW.js +0 -1
- package/payload/server/public/assets/data-CPsqW0qW.js.br +0 -0
- package/payload/server/public/assets/data-CPsqW0qW.js.gz +0 -0
- package/payload/server/public/assets/field-WRk67lvr.js.br +0 -0
- package/payload/server/public/assets/field-WRk67lvr.js.gz +0 -0
- package/payload/server/public/assets/file-text-BJDCb334.js.br +0 -0
- package/payload/server/public/assets/file-text-BJDCb334.js.gz +0 -0
- package/payload/server/public/assets/graph-CAU2xh2Z.js.br +0 -0
- package/payload/server/public/assets/graph-CAU2xh2Z.js.gz +0 -0
- package/payload/server/public/assets/graph-labels-CEDmX7qW.js.br +0 -0
- package/payload/server/public/assets/graph-labels-CEDmX7qW.js.gz +0 -0
- package/payload/server/public/assets/jsx-runtime-hPFGo4rC.css.br +0 -0
- package/payload/server/public/assets/operator-1WFztEQA.js.br +0 -0
- package/payload/server/public/assets/operator-1WFztEQA.js.gz +0 -0
- package/payload/server/public/assets/page-B72XigcU.js.br +0 -0
- package/payload/server/public/assets/page-B72XigcU.js.gz +0 -0
- package/payload/server/public/assets/page-nT8l_cX1.js.br +0 -0
- package/payload/server/public/assets/page-nT8l_cX1.js.gz +0 -0
- package/payload/server/public/assets/play-CYqOCqm6.js +0 -1
- package/payload/server/public/assets/play-CYqOCqm6.js.br +0 -0
- package/payload/server/public/assets/play-CYqOCqm6.js.gz +0 -0
- package/payload/server/public/assets/public-DAea6w7w.js.br +0 -0
- package/payload/server/public/assets/public-DAea6w7w.js.gz +0 -0
- package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-CqlRlGsY.js.gz +0 -0
- package/payload/server/public/assets/routines-vy5xsyqx.js.br +0 -0
- package/payload/server/public/assets/routines-vy5xsyqx.js.gz +0 -0
- package/payload/server/public/assets/skills-X7FTilVy.js.br +0 -0
- package/payload/server/public/assets/skills-X7FTilVy.js.gz +0 -0
- package/payload/server/public/assets/tasks-BXx_jk_p.js.br +0 -0
- package/payload/server/public/assets/tasks-BXx_jk_p.js.gz +0 -0
- package/payload/server/public/assets/triangle-alert-CuWcGaRo.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-CuWcGaRo.js.gz +0 -0
- package/payload/server/public/assets/useCopyFeedback-DLSKs6r2.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-DLSKs6r2.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-C_1CV_iW.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-DBzM_HIx.js.gz +0 -0
- package/payload/server/public/assets/wrench-nDMQ6x-6.js.br +0 -0
- package/payload/server/public/assets/wrench-nDMQ6x-6.js.gz +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js → jsx-runtime-BCAZhYqz.js} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js.br → jsx-runtime-BCAZhYqz.js.br} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js.gz → jsx-runtime-BCAZhYqz.js.gz} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-architecture
|
|
3
3
|
description: Use when grounding any documented-surface claim about what SiteDesk ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
|
|
4
|
-
content-hash: sha256:
|
|
4
|
+
content-hash: sha256:10a85aebfe311aca7adc6d999fd75ed0b233f35c57f4bf26006e4c76cb170ecc
|
|
5
5
|
brand: sitedesk-code
|
|
6
6
|
product-name: SiteDesk
|
|
7
7
|
---
|
|
@@ -2961,6 +2961,41 @@ Telegram profile name and will tell you plainly that it cannot put a name to the
|
|
|
2961
2961
|
Ask SiteDesk to save the Telegram ID against the contact. It is one change to one contact, and
|
|
2962
2962
|
it takes effect on the very next message.
|
|
2963
2963
|
|
|
2964
|
+
## Correcting what a public agent told a visitor
|
|
2965
|
+
|
|
2966
|
+
When one of your public bots tells a visitor something wrong, the fix is to instruct the agent that
|
|
2967
|
+
is talking to them, not to message the visitor yourself.
|
|
2968
|
+
|
|
2969
|
+
The reason is worth understanding, because the obvious approach quietly fails. Every conversation is
|
|
2970
|
+
its own separate agent with its own memory. If you send the visitor a correction from your chat, they
|
|
2971
|
+
receive it, but the agent that has been talking to them never sees it: it is a different
|
|
2972
|
+
conversation, and nothing carries a message from yours into theirs. It carries on from what it
|
|
2973
|
+
believes, and repeats the mistake on the next question. That is exactly what happened on a live
|
|
2974
|
+
conversation where a corrected price was quoted wrong again ninety-seven seconds later.
|
|
2975
|
+
|
|
2976
|
+
So tell SiteDesk what the visitor should be told, and name the bot and the chat: "Tell the
|
|
2977
|
+
visitor on chat 1234567890 that the price is 75, not 65." The instruction goes into that visitor's
|
|
2978
|
+
own conversation. The agent writes the message itself, in the same voice it has been using, and its
|
|
2979
|
+
own memory now holds what it said, so it will not contradict it a moment later. The visitor sees a
|
|
2980
|
+
normal message from the assistant they have been talking to, with no sign that anybody stepped in.
|
|
2981
|
+
|
|
2982
|
+
Write the intent rather than the exact sentence. This is an instruction to the agent, not text
|
|
2983
|
+
delivered word for word, so "tell them we can do Thursday morning but not the afternoon" works better
|
|
2984
|
+
than a script.
|
|
2985
|
+
|
|
2986
|
+
Four situations are refused, and each one says why rather than failing quietly:
|
|
2987
|
+
|
|
2988
|
+
- The bot is not a public bot. Your own admin bot and any specialist bot are conversations with your
|
|
2989
|
+
own side, not with a visitor, so there is nothing to instruct.
|
|
2990
|
+
- The agent has been switched off. Nothing is resurrected behind your back; turn it back on, or
|
|
2991
|
+
message the person yourself.
|
|
2992
|
+
- The chat belongs to a connected business account. Those conversations are held separately and this
|
|
2993
|
+
route cannot reach them.
|
|
2994
|
+
- The chat is a broadcast channel the bot does not allow. A channel post reaches every subscriber and
|
|
2995
|
+
cannot be unsent.
|
|
2996
|
+
|
|
2997
|
+
If you need the chat ID, ask "who can you reach on Telegram?" first.
|
|
2998
|
+
|
|
2964
2999
|
## Getting a Chat ID
|
|
2965
3000
|
|
|
2966
3001
|
To message a specific person or group, SiteDesk needs their chat ID. The easiest way:
|
|
@@ -3022,6 +3057,50 @@ Two things to know:
|
|
|
3022
3057
|
Text only for now. Photos, files and voice notes are not available on Telegram
|
|
3023
3058
|
from the dashboard.
|
|
3024
3059
|
|
|
3060
|
+
### What the agent knows about a message you typed
|
|
3061
|
+
|
|
3062
|
+
When you type into a public bot's conversation, that agent's own memory is
|
|
3063
|
+
updated with what you sent, so its next answer does not contradict you. It knows
|
|
3064
|
+
the words came from you and that the visitor has already received them, so it
|
|
3065
|
+
sends nothing in reply. The visitor sees one message, yours.
|
|
3066
|
+
|
|
3067
|
+
This matters because without it the agent carries on from what it believed. On a
|
|
3068
|
+
live conversation an operator sent a visitor the real prices by hand, and the
|
|
3069
|
+
agent's memory still held a visitor asking for a price it had never given.
|
|
3070
|
+
|
|
3071
|
+
Four situations record nothing, and each one says which in the log rather than
|
|
3072
|
+
failing quietly:
|
|
3073
|
+
|
|
3074
|
+
- The bot is not a public bot. Your own admin bot and any specialist bot are
|
|
3075
|
+
conversations with your own side, so there is no agent knowledge to correct.
|
|
3076
|
+
- The agent has been switched off. Nothing is woken behind your back, which is
|
|
3077
|
+
the whole point of having switched it off. Your message still goes out.
|
|
3078
|
+
- The chat belongs to a connected business account. Those conversations are held
|
|
3079
|
+
separately and this route cannot reach them.
|
|
3080
|
+
- The conversation has not started yet. There is nothing to keep consistent, and
|
|
3081
|
+
an agent started this way would be holding a visitor nobody asked it to answer.
|
|
3082
|
+
|
|
3083
|
+
To check it is working, look at the log after sending:
|
|
3084
|
+
|
|
3085
|
+
```bash
|
|
3086
|
+
grep -hE 'op=(sent|context-recorded)|telegram-manual-census|op=text-suppressed' ~/.maxy-code/logs/server.log
|
|
3087
|
+
```
|
|
3088
|
+
|
|
3089
|
+
A healthy send shows one `op=sent … ok=true`, one `op=context-recorded …
|
|
3090
|
+
suppressed=yes reason=-`, and one `op=text-suppressed … reason=operator-sent` for
|
|
3091
|
+
that conversation. The standing line
|
|
3092
|
+
`[telegram-manual-census] sent=N recorded=N suppressed=N unrecorded=0 skipped=0
|
|
3093
|
+
leaked=0 window=60m` should show `recorded` and `suppressed` both equal to `sent`,
|
|
3094
|
+
once the four situations above are set aside.
|
|
3095
|
+
|
|
3096
|
+
- **`unrecorded`** above zero: a send reached no conversation and nothing said
|
|
3097
|
+
why.
|
|
3098
|
+
- **`leaked`** above zero: a send reached a conversation, and ten minutes later
|
|
3099
|
+
nothing had reported holding that turn's reply back. Either the agent never
|
|
3100
|
+
woke, or it answered on top of your message and the visitor saw it twice.
|
|
3101
|
+
- **`skipped`** above zero is normal. It is one of the four situations above, and
|
|
3102
|
+
the `reason=` on that send's own line says which.
|
|
3103
|
+
|
|
3025
3104
|
## Building your own Telegram functionality
|
|
3026
3105
|
|
|
3027
3106
|
Telegram is a core plugin, so it is on every install and cannot be switched off.
|
|
@@ -3047,7 +3126,9 @@ it puts the answer in the card itself and does not add a sentence beside it. On
|
|
|
3047
3126
|
public bot, that following sentence is held back on purpose, so the visitor sees
|
|
3048
3127
|
the card once and not the same thing twice. And when someone presses a button,
|
|
3049
3128
|
your conversation view shows the button's own wording — "1 passenger", "One way"
|
|
3050
|
-
— rather than the code behind it.
|
|
3129
|
+
— rather than the code behind it. A card SiteDesk sends into a different
|
|
3130
|
+
chat appears in that chat's conversation, where the person who received it is,
|
|
3131
|
+
and not in the conversation you asked for it from.
|
|
3051
3132
|
|
|
3052
3133
|
The same is now true of most of what Telegram sends. Reply to one of
|
|
3053
3134
|
SiteDesk's messages and it sees the message you replied to, so "yes, do
|
|
@@ -9,6 +9,20 @@ Invoked by the admin agent directly.
|
|
|
9
9
|
|
|
10
10
|
This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
|
|
11
11
|
|
|
12
|
+
## 2026-08-15 (0.1.609)
|
|
13
|
+
|
|
14
|
+
- An account created after an install now starts its first conversation. It halted on a folder-trust prompt, which finishes the fix begun in the previous release for accounts that already existed.
|
|
15
|
+
- A message you send by hand now reaches the conversation. It was accepted and went nowhere.
|
|
16
|
+
- Writing a memory into another account works. It was permitted and then refused at the point of writing, so the feature had never once succeeded.
|
|
17
|
+
- A stuck sub-account conversation restarts under its own account rather than the main one, and starting a conversation no longer reports success when the assistant behind it never came up.
|
|
18
|
+
- An account being set up is no longer reported as a privacy leak. The check counted it while provisioning was still in progress.
|
|
19
|
+
|
|
20
|
+
## 2026-08-15 (0.1.608)
|
|
21
|
+
|
|
22
|
+
- You can now steer a public agent while it is mid-conversation with someone, rather than waiting for the exchange to end.
|
|
23
|
+
- A card sent into a different chat is filed in that chat, not in the conversation of whoever sent it.
|
|
24
|
+
- Routines already running on your installs now use the work-check gates added over the past week. They kept their old always-run behaviour until this backfill, and routines left behind with nothing to run are removed.
|
|
25
|
+
|
|
12
26
|
## 2026-08-14 (0.1.607)
|
|
13
27
|
|
|
14
28
|
- Upgrades no longer fail on a Raspberry Pi with a 16K page size. The system's own Chromium launcher adds a setting that current Chromium has removed, so the browser exited on startup and the install stopped when it could not reach it. The installer now runs Chromium directly, skipping that launcher.
|
|
@@ -2,6 +2,7 @@ import { defineConfig } from "vitest/config";
|
|
|
2
2
|
|
|
3
3
|
export default defineConfig({
|
|
4
4
|
test: {
|
|
5
|
+
setupFiles: ["../../../test/tmpdir-setup.ts"],
|
|
5
6
|
environment: "node",
|
|
6
7
|
include: ["__tests__/**/*.test.ts"],
|
|
7
8
|
exclude: process.env.RUN_LIVE === "1" ? [] : ["__tests__/live/**"],
|
|
@@ -2,6 +2,7 @@ import { defineConfig } from "vitest/config";
|
|
|
2
2
|
|
|
3
3
|
export default defineConfig({
|
|
4
4
|
test: {
|
|
5
|
+
setupFiles: ["../../../test/tmpdir-setup.ts"],
|
|
5
6
|
environment: "node",
|
|
6
7
|
// Scoped to src, matching plugins/telegram/mcp: without it vitest also
|
|
7
8
|
// collects dist/__tests__/*.test.js, which `tsc -p` emits because this
|
|
@@ -138,6 +138,41 @@ Telegram profile name and will tell you plainly that it cannot put a name to the
|
|
|
138
138
|
Ask {{productName}} to save the Telegram ID against the contact. It is one change to one contact, and
|
|
139
139
|
it takes effect on the very next message.
|
|
140
140
|
|
|
141
|
+
## Correcting what a public agent told a visitor
|
|
142
|
+
|
|
143
|
+
When one of your public bots tells a visitor something wrong, the fix is to instruct the agent that
|
|
144
|
+
is talking to them, not to message the visitor yourself.
|
|
145
|
+
|
|
146
|
+
The reason is worth understanding, because the obvious approach quietly fails. Every conversation is
|
|
147
|
+
its own separate agent with its own memory. If you send the visitor a correction from your chat, they
|
|
148
|
+
receive it, but the agent that has been talking to them never sees it: it is a different
|
|
149
|
+
conversation, and nothing carries a message from yours into theirs. It carries on from what it
|
|
150
|
+
believes, and repeats the mistake on the next question. That is exactly what happened on a live
|
|
151
|
+
conversation where a corrected price was quoted wrong again ninety-seven seconds later.
|
|
152
|
+
|
|
153
|
+
So tell {{productName}} what the visitor should be told, and name the bot and the chat: "Tell the
|
|
154
|
+
visitor on chat 1234567890 that the price is 75, not 65." The instruction goes into that visitor's
|
|
155
|
+
own conversation. The agent writes the message itself, in the same voice it has been using, and its
|
|
156
|
+
own memory now holds what it said, so it will not contradict it a moment later. The visitor sees a
|
|
157
|
+
normal message from the assistant they have been talking to, with no sign that anybody stepped in.
|
|
158
|
+
|
|
159
|
+
Write the intent rather than the exact sentence. This is an instruction to the agent, not text
|
|
160
|
+
delivered word for word, so "tell them we can do Thursday morning but not the afternoon" works better
|
|
161
|
+
than a script.
|
|
162
|
+
|
|
163
|
+
Four situations are refused, and each one says why rather than failing quietly:
|
|
164
|
+
|
|
165
|
+
- The bot is not a public bot. Your own admin bot and any specialist bot are conversations with your
|
|
166
|
+
own side, not with a visitor, so there is nothing to instruct.
|
|
167
|
+
- The agent has been switched off. Nothing is resurrected behind your back; turn it back on, or
|
|
168
|
+
message the person yourself.
|
|
169
|
+
- The chat belongs to a connected business account. Those conversations are held separately and this
|
|
170
|
+
route cannot reach them.
|
|
171
|
+
- The chat is a broadcast channel the bot does not allow. A channel post reaches every subscriber and
|
|
172
|
+
cannot be unsent.
|
|
173
|
+
|
|
174
|
+
If you need the chat ID, ask "who can you reach on Telegram?" first.
|
|
175
|
+
|
|
141
176
|
## Getting a Chat ID
|
|
142
177
|
|
|
143
178
|
To message a specific person or group, {{productName}} needs their chat ID. The easiest way:
|
|
@@ -199,6 +234,50 @@ Two things to know:
|
|
|
199
234
|
Text only for now. Photos, files and voice notes are not available on Telegram
|
|
200
235
|
from the dashboard.
|
|
201
236
|
|
|
237
|
+
### What the agent knows about a message you typed
|
|
238
|
+
|
|
239
|
+
When you type into a public bot's conversation, that agent's own memory is
|
|
240
|
+
updated with what you sent, so its next answer does not contradict you. It knows
|
|
241
|
+
the words came from you and that the visitor has already received them, so it
|
|
242
|
+
sends nothing in reply. The visitor sees one message, yours.
|
|
243
|
+
|
|
244
|
+
This matters because without it the agent carries on from what it believed. On a
|
|
245
|
+
live conversation an operator sent a visitor the real prices by hand, and the
|
|
246
|
+
agent's memory still held a visitor asking for a price it had never given.
|
|
247
|
+
|
|
248
|
+
Four situations record nothing, and each one says which in the log rather than
|
|
249
|
+
failing quietly:
|
|
250
|
+
|
|
251
|
+
- The bot is not a public bot. Your own admin bot and any specialist bot are
|
|
252
|
+
conversations with your own side, so there is no agent knowledge to correct.
|
|
253
|
+
- The agent has been switched off. Nothing is woken behind your back, which is
|
|
254
|
+
the whole point of having switched it off. Your message still goes out.
|
|
255
|
+
- The chat belongs to a connected business account. Those conversations are held
|
|
256
|
+
separately and this route cannot reach them.
|
|
257
|
+
- The conversation has not started yet. There is nothing to keep consistent, and
|
|
258
|
+
an agent started this way would be holding a visitor nobody asked it to answer.
|
|
259
|
+
|
|
260
|
+
To check it is working, look at the log after sending:
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
grep -hE 'op=(sent|context-recorded)|telegram-manual-census|op=text-suppressed' ~/.maxy-code/logs/server.log
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
A healthy send shows one `op=sent … ok=true`, one `op=context-recorded …
|
|
267
|
+
suppressed=yes reason=-`, and one `op=text-suppressed … reason=operator-sent` for
|
|
268
|
+
that conversation. The standing line
|
|
269
|
+
`[telegram-manual-census] sent=N recorded=N suppressed=N unrecorded=0 skipped=0
|
|
270
|
+
leaked=0 window=60m` should show `recorded` and `suppressed` both equal to `sent`,
|
|
271
|
+
once the four situations above are set aside.
|
|
272
|
+
|
|
273
|
+
- **`unrecorded`** above zero: a send reached no conversation and nothing said
|
|
274
|
+
why.
|
|
275
|
+
- **`leaked`** above zero: a send reached a conversation, and ten minutes later
|
|
276
|
+
nothing had reported holding that turn's reply back. Either the agent never
|
|
277
|
+
woke, or it answered on top of your message and the visitor saw it twice.
|
|
278
|
+
- **`skipped`** above zero is normal. It is one of the four situations above, and
|
|
279
|
+
the `reason=` on that send's own line says which.
|
|
280
|
+
|
|
202
281
|
## Building your own Telegram functionality
|
|
203
282
|
|
|
204
283
|
Telegram is a core plugin, so it is on every install and cannot be switched off.
|
|
@@ -224,7 +303,9 @@ it puts the answer in the card itself and does not add a sentence beside it. On
|
|
|
224
303
|
public bot, that following sentence is held back on purpose, so the visitor sees
|
|
225
304
|
the card once and not the same thing twice. And when someone presses a button,
|
|
226
305
|
your conversation view shows the button's own wording — "1 passenger", "One way"
|
|
227
|
-
— rather than the code behind it.
|
|
306
|
+
— rather than the code behind it. A card {{productName}} sends into a different
|
|
307
|
+
chat appears in that chat's conversation, where the person who received it is,
|
|
308
|
+
and not in the conversation you asked for it from.
|
|
228
309
|
|
|
229
310
|
The same is now true of most of what Telegram sends. Reply to one of
|
|
230
311
|
{{productName}}'s messages and it sees the message you replied to, so "yes, do
|
|
@@ -68,6 +68,10 @@ import { resolve } from "node:path";
|
|
|
68
68
|
import { enumerateValidAccountIds, isProvisionedAccount } from "../../../../lib/account-enumeration/dist/index.js";
|
|
69
69
|
import { readHouseAdminScope } from "../../../../lib/account-scope/dist/index.js";
|
|
70
70
|
import { makeResolveToolAccount } from "./index-testable.js";
|
|
71
|
+
// Task 2731 — cross-account write observability. `isInvalidAccountIdError` is
|
|
72
|
+
// the gate's own discriminator, so the outcome line never matches on prose.
|
|
73
|
+
import { isInvalidAccountIdError } from "../../../../lib/graph-write/dist/index.js";
|
|
74
|
+
import { noteXacctWriteCall, noteXacctWriteOutcome, formatWriteOutcome, writeOutcomeReason, startXacctCensus, } from "./lib/xacct-counters.js";
|
|
71
75
|
const server = new McpServer({
|
|
72
76
|
name: "maxy-memory",
|
|
73
77
|
version: "0.1.0",
|
|
@@ -116,6 +120,47 @@ const XACCT_DESC = "House-scoped admin only: operate on the named sub-account su
|
|
|
116
120
|
// resolved (possibly cross-account) id. A resolved id != this is a cross-account
|
|
117
121
|
// call (the resolver only returns a target for a house-authorised session).
|
|
118
122
|
const BOOT_ACCOUNT_ID = accountId;
|
|
123
|
+
// Task 2731 — the standing census over cross-account writes. Armed at boot so a
|
|
124
|
+
// window of zero is still reported: a capability nobody invokes looks identical
|
|
125
|
+
// to one that works, which is how the allow-then-refuse defect survived. The
|
|
126
|
+
// handle is unref'd, so it never keeps this stdio child alive past its session.
|
|
127
|
+
//
|
|
128
|
+
// Not armed in a read-only child, which registers no write tool at all. Its
|
|
129
|
+
// `writeCalls` could only ever be zero, and a zero that means "this process
|
|
130
|
+
// cannot write" is indistinguishable from the zero that means "nobody exercised
|
|
131
|
+
// the feature" — which is the one the operator needs to read.
|
|
132
|
+
if (!readOnly)
|
|
133
|
+
startXacctCensus();
|
|
134
|
+
/**
|
|
135
|
+
* Task 2731 — the paired write-outcome line, emitted only for a cross-account
|
|
136
|
+
* call so it sits one-for-one against the resolver's `[xacct] op=call` line.
|
|
137
|
+
* `decision=allow` followed by `gate=rejected` for the same target is the
|
|
138
|
+
* defect this task fixed, and must never appear again.
|
|
139
|
+
*
|
|
140
|
+
* `gate` reports the graph-write ACCOUNT gate alone. A write that failed for any
|
|
141
|
+
* other reason — schema validation, a system-managed key, a missing target node
|
|
142
|
+
* — got past that gate and reads `gate=passed reason=write-failed`. Conflating
|
|
143
|
+
* the two would hide the one pairing worth watching.
|
|
144
|
+
*
|
|
145
|
+
* `reason` is one of three names, never an error message. An operator greps
|
|
146
|
+
* `reason=invalid-account-id`, and a message pasted in here would carry its own
|
|
147
|
+
* spaces, punctuation and account slice into the field, matching nothing. The
|
|
148
|
+
* detail of a non-gate failure is already on the `[mcp:memory] … result=error`
|
|
149
|
+
* line for the same call.
|
|
150
|
+
*/
|
|
151
|
+
function noteCrossAccountWriteOutcome(o) {
|
|
152
|
+
if (!o.targetAccountId)
|
|
153
|
+
return;
|
|
154
|
+
const gate = isInvalidAccountIdError(o.err) ? "rejected" : "passed";
|
|
155
|
+
noteXacctWriteOutcome(gate);
|
|
156
|
+
process.stderr.write(formatWriteOutcome({
|
|
157
|
+
tool: o.tool,
|
|
158
|
+
caller: o.caller ?? "unknown",
|
|
159
|
+
target: o.target,
|
|
160
|
+
gate,
|
|
161
|
+
reason: writeOutcomeReason(gate, o.err !== null),
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
119
164
|
async function resolveProfileIdentity(toolName, crossAccount, resolvedAccountId, callerUserId) {
|
|
120
165
|
// Resolve the facts the pure classifier needs. On the own-account path the
|
|
121
166
|
// account's owner is resolved only when the caller is NOT operating their
|
|
@@ -893,6 +938,12 @@ if (!readOnly) {
|
|
|
893
938
|
targetAccountId: z.string().optional().describe(XACCT_DESC),
|
|
894
939
|
}, async ({ labels, properties, scope, relationships, producedByTaskId, mergeOn, targetAccountId }) => {
|
|
895
940
|
const scoped = resolveToolAccount("memory-write", targetAccountId);
|
|
941
|
+
// Task 2731 — count the cross-account call before its outcome is known,
|
|
942
|
+
// so a denied call still lands in the census. Own-account calls are not
|
|
943
|
+
// counted: `writeCalls=0` must mean "nobody targeted another account",
|
|
944
|
+
// not "nobody wrote".
|
|
945
|
+
if (targetAccountId)
|
|
946
|
+
noteXacctWriteCall(!("reject" in scoped));
|
|
896
947
|
if ("reject" in scoped)
|
|
897
948
|
return scoped.reject;
|
|
898
949
|
const accountId = scoped.accountId;
|
|
@@ -912,6 +963,13 @@ if (!readOnly) {
|
|
|
912
963
|
producedByTaskId,
|
|
913
964
|
mergeOn,
|
|
914
965
|
});
|
|
966
|
+
noteCrossAccountWriteOutcome({
|
|
967
|
+
targetAccountId,
|
|
968
|
+
tool: "memory-write",
|
|
969
|
+
caller: BOOT_ACCOUNT_ID,
|
|
970
|
+
target: accountId,
|
|
971
|
+
err: null,
|
|
972
|
+
});
|
|
915
973
|
return {
|
|
916
974
|
content: [
|
|
917
975
|
{
|
|
@@ -922,6 +980,13 @@ if (!readOnly) {
|
|
|
922
980
|
};
|
|
923
981
|
}
|
|
924
982
|
catch (err) {
|
|
983
|
+
noteCrossAccountWriteOutcome({
|
|
984
|
+
targetAccountId,
|
|
985
|
+
tool: "memory-write",
|
|
986
|
+
caller: BOOT_ACCOUNT_ID,
|
|
987
|
+
target: accountId,
|
|
988
|
+
err,
|
|
989
|
+
});
|
|
925
990
|
return {
|
|
926
991
|
content: [
|
|
927
992
|
{
|