@rubytech/create-sitedesk-code 0.1.608 → 0.1.610
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/platform/lib/graph-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/plugins/admin/skills/platform-architecture/SKILL.md +45 -1
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +12 -0
- package/payload/platform/plugins/docs/references/telegram-guide.md +44 -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 +2 -0
- 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/telegram-channel/dist/instructions.d.ts +9 -0
- package/payload/platform/services/telegram-channel/dist/instructions.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/instructions.js +15 -0
- package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.d.ts +6 -4
- package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.js +15 -1
- package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
- 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-uk2gBvI9.js} +1 -1
- package/payload/server/public/assets/AdminLoginScreens-uk2gBvI9.js.br +0 -0
- package/payload/server/public/assets/AdminLoginScreens-uk2gBvI9.js.gz +0 -0
- package/payload/server/public/assets/AdminShell-DyOPTLdb.js +3 -0
- package/payload/server/public/assets/AdminShell-DyOPTLdb.js.br +0 -0
- package/payload/server/public/assets/AdminShell-DyOPTLdb.js.gz +0 -0
- package/payload/server/public/assets/{activity-C2qWlcJ5.js → activity-DfIud5UH.js} +1 -1
- package/payload/server/public/assets/activity-DfIud5UH.js.br +0 -0
- package/payload/server/public/assets/activity-DfIud5UH.js.gz +0 -0
- package/payload/server/public/assets/admin-Duy2d3ks.js +1 -0
- package/payload/server/public/assets/admin-Duy2d3ks.js.br +0 -0
- package/payload/server/public/assets/admin-Duy2d3ks.js.gz +0 -0
- package/payload/server/public/assets/{agents-DoGVAjIT.js → agents-Rcdk-pni.js} +1 -1
- package/payload/server/public/assets/agents-Rcdk-pni.js.br +0 -0
- package/payload/server/public/assets/agents-Rcdk-pni.js.gz +0 -0
- package/payload/server/public/assets/{browser-DjqS897k.js → browser-Bt6h1Pjb.js} +1 -1
- package/payload/server/public/assets/browser-Bt6h1Pjb.js.br +0 -0
- package/payload/server/public/assets/browser-Bt6h1Pjb.js.gz +0 -0
- package/payload/server/public/assets/{calendar-DJeOm0WS.js → calendar-Di0yArmc.js} +1 -1
- package/payload/server/public/assets/calendar-Di0yArmc.js.br +0 -0
- package/payload/server/public/assets/calendar-Di0yArmc.js.gz +0 -0
- package/payload/server/public/assets/chat-xJTrFY2U.js +1 -0
- package/payload/server/public/assets/chat-xJTrFY2U.js.br +1 -0
- package/payload/server/public/assets/chat-xJTrFY2U.js.gz +0 -0
- package/payload/server/public/assets/{chevron-left-D9z1aK3p.js → chevron-left-QGcFX-3R.js} +1 -1
- package/payload/server/public/assets/chevron-left-QGcFX-3R.js.br +0 -0
- package/payload/server/public/assets/clock-PkEm8y4i.js +1 -0
- package/payload/server/public/assets/clock-PkEm8y4i.js.br +0 -0
- package/payload/server/public/assets/clock-PkEm8y4i.js.gz +0 -0
- package/payload/server/public/assets/copy-RSaF-402.js +1 -0
- package/payload/server/public/assets/copy-RSaF-402.js.br +0 -0
- package/payload/server/public/assets/copy-RSaF-402.js.gz +0 -0
- package/payload/server/public/assets/data-CLmmCyzs.js +1 -0
- package/payload/server/public/assets/data-CLmmCyzs.js.br +1 -0
- package/payload/server/public/assets/data-CLmmCyzs.js.gz +0 -0
- package/payload/server/public/assets/{field-WRk67lvr.js → field-nfpVNHyk.js} +1 -1
- package/payload/server/public/assets/field-nfpVNHyk.js.br +0 -0
- package/payload/server/public/assets/field-nfpVNHyk.js.gz +0 -0
- package/payload/server/public/assets/{file-text-BJDCb334.js → file-text-Cws2LExM.js} +1 -1
- package/payload/server/public/assets/file-text-Cws2LExM.js.br +0 -0
- package/payload/server/public/assets/file-text-Cws2LExM.js.gz +0 -0
- package/payload/server/public/assets/graph-56nTCvKa.js +51 -0
- package/payload/server/public/assets/graph-56nTCvKa.js.br +0 -0
- package/payload/server/public/assets/graph-56nTCvKa.js.gz +0 -0
- package/payload/server/public/assets/{graph-labels-CEDmX7qW.js → graph-labels-qHDVYalh.js} +1 -1
- package/payload/server/public/assets/graph-labels-qHDVYalh.js.br +0 -0
- package/payload/server/public/assets/graph-labels-qHDVYalh.js.gz +0 -0
- package/payload/server/public/assets/{jsx-runtime-hPFGo4rC.css → jsx-runtime-B5zQuMcr.css} +1 -1
- package/payload/server/public/assets/jsx-runtime-B5zQuMcr.css.br +0 -0
- package/payload/server/public/assets/{jsx-runtime-hPFGo4rC.css.gz → jsx-runtime-B5zQuMcr.css.gz} +0 -0
- package/payload/server/public/assets/{operator-1WFztEQA.js → operator-D-P6oemk.js} +1 -1
- package/payload/server/public/assets/operator-D-P6oemk.js.br +2 -0
- package/payload/server/public/assets/operator-D-P6oemk.js.gz +0 -0
- package/payload/server/public/assets/page-8goE0IWS.js +32 -0
- package/payload/server/public/assets/page-8goE0IWS.js.br +0 -0
- package/payload/server/public/assets/page-8goE0IWS.js.gz +0 -0
- package/payload/server/public/assets/page-iL446JAc.js +1 -0
- package/payload/server/public/assets/page-iL446JAc.js.br +0 -0
- package/payload/server/public/assets/page-iL446JAc.js.gz +0 -0
- package/payload/server/public/assets/play-B8bxRax6.js +1 -0
- package/payload/server/public/assets/play-B8bxRax6.js.br +0 -0
- package/payload/server/public/assets/play-B8bxRax6.js.gz +0 -0
- package/payload/server/public/assets/{public-DAea6w7w.js → public-BwfIj7tM.js} +1 -1
- package/payload/server/public/assets/public-BwfIj7tM.js.br +0 -0
- package/payload/server/public/assets/public-BwfIj7tM.js.gz +0 -0
- package/payload/server/public/assets/{rotate-ccw-CqlRlGsY.js → rotate-ccw-X7-7vE7t.js} +1 -1
- package/payload/server/public/assets/rotate-ccw-X7-7vE7t.js.br +0 -0
- package/payload/server/public/assets/rotate-ccw-X7-7vE7t.js.gz +0 -0
- package/payload/server/public/assets/{routines-vy5xsyqx.js → routines-sFud5tka.js} +2 -2
- package/payload/server/public/assets/routines-sFud5tka.js.br +0 -0
- package/payload/server/public/assets/routines-sFud5tka.js.gz +0 -0
- package/payload/server/public/assets/{skills-X7FTilVy.js → skills-_Dc3eG9T.js} +1 -1
- package/payload/server/public/assets/skills-_Dc3eG9T.js.br +0 -0
- package/payload/server/public/assets/skills-_Dc3eG9T.js.gz +0 -0
- package/payload/server/public/assets/tasks-C0u8AtqT.js +3 -0
- package/payload/server/public/assets/tasks-C0u8AtqT.js.br +0 -0
- package/payload/server/public/assets/tasks-C0u8AtqT.js.gz +0 -0
- package/payload/server/public/assets/{triangle-alert-CuWcGaRo.js → triangle-alert-DD4kSK45.js} +1 -1
- package/payload/server/public/assets/triangle-alert-DD4kSK45.js.br +0 -0
- package/payload/server/public/assets/triangle-alert-DD4kSK45.js.gz +0 -0
- package/payload/server/public/assets/{useCopyFeedback-DLSKs6r2.js → useCopyFeedback-Dq-Putj7.js} +1 -1
- package/payload/server/public/assets/useCopyFeedback-Dq-Putj7.js.br +0 -0
- package/payload/server/public/assets/useCopyFeedback-Dq-Putj7.js.gz +0 -0
- package/payload/server/public/assets/useMediaQuery-Cm_fvNIH.js +6 -0
- package/payload/server/public/assets/useMediaQuery-Cm_fvNIH.js.br +0 -0
- package/payload/server/public/assets/useMediaQuery-Cm_fvNIH.js.gz +0 -0
- package/payload/server/public/assets/useVoiceRecorder-C6xqnm7i.js +2 -0
- package/payload/server/public/assets/useVoiceRecorder-C6xqnm7i.js.br +0 -0
- package/payload/server/public/assets/useVoiceRecorder-C6xqnm7i.js.gz +0 -0
- package/payload/server/public/assets/{wrench-nDMQ6x-6.js → wrench-Bjw6eVl_.js} +1 -1
- package/payload/server/public/assets/wrench-Bjw6eVl_.js.br +0 -0
- package/payload/server/public/assets/wrench-Bjw6eVl_.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 +15 -15
- 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 +511 -283
- 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 +0 -3
- 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 +0 -1
- 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 +0 -1
- 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 +0 -51
- 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 +0 -32
- 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 +0 -1
- 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 +0 -3
- 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 +0 -6
- 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 +0 -2
- 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-DeRQuYlX.js} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js.br → jsx-runtime-DeRQuYlX.js.br} +0 -0
- /package/payload/server/public/assets/{jsx-runtime-CvVXOszc.js.gz → jsx-runtime-DeRQuYlX.js.gz} +0 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// Task 2728 — account resolution for the `/rc-spawn` recover path.
|
|
2
|
+
//
|
|
3
|
+
// `/rc-spawn` resolves its account as `requestedAccountId ?? deps.accountId`.
|
|
4
|
+
// The recovery caller (`manager-client.ts` `managerRcRecover`) sends no
|
|
5
|
+
// `targetAccountId` at all, so every wedged sub-account session respawned under
|
|
6
|
+
// the boot house account, carrying the same conversation id into a second
|
|
7
|
+
// account's projects dir. Eight lines above that default, an UNKNOWN account id
|
|
8
|
+
// is rejected outright, with the comment that a silent default "would route a
|
|
9
|
+
// switched session to the wrong account's graph"; the absent case did exactly
|
|
10
|
+
// that, and emitted nothing.
|
|
11
|
+
//
|
|
12
|
+
// Observed 2026-08-15 on laptop 192.168.88.10 (maxy-code): session 26f5687a,
|
|
13
|
+
// opened on sub-account 8a160746 at 12:30:53.322, answered by house 20028fb5
|
|
14
|
+
// from 12:32:45.406, one uuid holding two sidecar records.
|
|
15
|
+
//
|
|
16
|
+
// What this module answers: which account directory holds the session's own
|
|
17
|
+
// sidecar record. The DIRECTORY is the fact, not the sidecar's `accountId`
|
|
18
|
+
// field — that field is optional on disk (pre-983 sidecars and every /spawn
|
|
19
|
+
// sidecar written before Task 2038 carry no key), and a record that fails the
|
|
20
|
+
// strict `parseSidecar` shape still proves which account owns the session. So
|
|
21
|
+
// resolution reads file locations, and parses only to break a tie.
|
|
22
|
+
//
|
|
23
|
+
// Account membership mirrors the predicate /rc-spawn already applies inline when
|
|
24
|
+
// it rejects an unknown `targetAccountId`: a directory under `accountsRoot`
|
|
25
|
+
// carrying an `account.json`. The manager has no rootDir-clean import path for
|
|
26
|
+
// the account-enumeration lib, which is why that predicate is repeated rather
|
|
27
|
+
// than imported.
|
|
28
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
29
|
+
import { join } from 'node:path';
|
|
30
|
+
import { sidecarPathForSessionId } from './jsonl-path.js';
|
|
31
|
+
/** Accounts in the on-disk registry, in readdir order. Never throws: an absent
|
|
32
|
+
* or unreadable accountsRoot yields no accounts, which the caller reports as a
|
|
33
|
+
* refusal rather than a silent fall-back to house.
|
|
34
|
+
*
|
|
35
|
+
* Exported so the standing census in `session-account-census.ts` counts the
|
|
36
|
+
* same account set this resolver searches. Two copies of the predicate could
|
|
37
|
+
* disagree, and the census exists to catch exactly what this resolver missed. */
|
|
38
|
+
export function registeredAccountIds(accountsRoot) {
|
|
39
|
+
if (!existsSync(accountsRoot))
|
|
40
|
+
return [];
|
|
41
|
+
try {
|
|
42
|
+
return readdirSync(accountsRoot, { withFileTypes: true })
|
|
43
|
+
.filter((d) => d.isDirectory())
|
|
44
|
+
.map((d) => d.name)
|
|
45
|
+
.filter((id) => existsSync(join(accountsRoot, id, 'account.json')));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** The sidecar's `startedAt` as epoch ms, or null when the file is unreadable,
|
|
52
|
+
* unparseable, or carries no usable timestamp. Only the tie-break reads this;
|
|
53
|
+
* a null orders AFTER every real timestamp, so a record whose start time is
|
|
54
|
+
* known always beats one whose is not. */
|
|
55
|
+
function startedAtMs(path) {
|
|
56
|
+
let raw;
|
|
57
|
+
try {
|
|
58
|
+
raw = readFileSync(path, 'utf8');
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = JSON.parse(raw);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
if (!parsed || typeof parsed !== 'object')
|
|
71
|
+
return null;
|
|
72
|
+
const startedAt = parsed.startedAt;
|
|
73
|
+
if (typeof startedAt !== 'string')
|
|
74
|
+
return null;
|
|
75
|
+
const ms = Date.parse(startedAt);
|
|
76
|
+
return Number.isNaN(ms) ? null : ms;
|
|
77
|
+
}
|
|
78
|
+
/** Task 2728 — the account a `recover: true` spawn must run under: the one whose
|
|
79
|
+
* directory holds this session's sidecar record (live or archived).
|
|
80
|
+
*
|
|
81
|
+
* No account holds one → `refused-no-sidecar`. There is no session to recover,
|
|
82
|
+
* so the house account is never the right answer and the caller refuses rather
|
|
83
|
+
* than spawning.
|
|
84
|
+
*
|
|
85
|
+
* More than one holds one → the defect's own residue, one conversation id
|
|
86
|
+
* spanning two accounts. The earlier `startedAt` wins, which is the account the
|
|
87
|
+
* conversation was opened on. `candidates` carries the count so a split id is
|
|
88
|
+
* visible in the log line at recover time, not only in the standing census. */
|
|
89
|
+
export function resolveRecoverAccount(input) {
|
|
90
|
+
const env = input.env ?? process.env;
|
|
91
|
+
const holders = [];
|
|
92
|
+
for (const accountId of registeredAccountIds(input.accountsRoot)) {
|
|
93
|
+
const accountDir = join(input.accountsRoot, accountId);
|
|
94
|
+
const live = sidecarPathForSessionId(accountDir, input.sessionId, {}, env);
|
|
95
|
+
const archived = sidecarPathForSessionId(accountDir, input.sessionId, { archived: true }, env);
|
|
96
|
+
if (existsSync(live) || existsSync(archived))
|
|
97
|
+
holders.push(accountId);
|
|
98
|
+
}
|
|
99
|
+
if (holders.length === 0)
|
|
100
|
+
return { outcome: 'refused-no-sidecar', candidates: 0 };
|
|
101
|
+
if (holders.length === 1)
|
|
102
|
+
return { outcome: 'ok', accountId: holders[0], candidates: 1 };
|
|
103
|
+
// Deterministic ordering: earliest known startedAt first, unknown last, then
|
|
104
|
+
// account id. Without the final key, two unreadable records would resolve in
|
|
105
|
+
// readdir order and the same split id could answer differently per boot.
|
|
106
|
+
const ranked = holders
|
|
107
|
+
.map((accountId) => {
|
|
108
|
+
const accountDir = join(input.accountsRoot, accountId);
|
|
109
|
+
const live = sidecarPathForSessionId(accountDir, input.sessionId, {}, env);
|
|
110
|
+
const path = existsSync(live)
|
|
111
|
+
? live
|
|
112
|
+
: sidecarPathForSessionId(accountDir, input.sessionId, { archived: true }, env);
|
|
113
|
+
return { accountId, ms: startedAtMs(path) };
|
|
114
|
+
})
|
|
115
|
+
.sort((a, b) => {
|
|
116
|
+
if (a.ms !== b.ms) {
|
|
117
|
+
if (a.ms === null)
|
|
118
|
+
return 1;
|
|
119
|
+
if (b.ms === null)
|
|
120
|
+
return -1;
|
|
121
|
+
return a.ms - b.ms;
|
|
122
|
+
}
|
|
123
|
+
return a.accountId < b.accountId ? -1 : a.accountId > b.accountId ? 1 : 0;
|
|
124
|
+
});
|
|
125
|
+
return { outcome: 'ok', accountId: ranked[0].accountId, candidates: holders.length };
|
|
126
|
+
}
|
|
127
|
+
/** The per-recover lifeline. Emitted on EVERY recover, including one that
|
|
128
|
+
* carried an explicit `targetAccountId` (`source=body`), so a grep on one
|
|
129
|
+
* sessionId shows which account the recovery landed on and what decided it.
|
|
130
|
+
* `source=default` on a recover is the 2728 defect recurring. No call site can
|
|
131
|
+
* produce it today — a recover either resolves from sidecars or is handed an
|
|
132
|
+
* account by the body — and that is the point: it renders only if a later change
|
|
133
|
+
* lets a recover reach the boot-account fallback again, which is the regression
|
|
134
|
+
* this line exists to make visible.
|
|
135
|
+
* A null sessionId renders `new`, the token this route already uses for it. */
|
|
136
|
+
export function formatRecoverAccountLine(input) {
|
|
137
|
+
return (`[rc-spawn] op=recover-account sessionId=${input.sessionId ? input.sessionId.slice(0, 8) : 'new'}` +
|
|
138
|
+
` resolved=${input.resolved ?? 'none'} source=${input.source}` +
|
|
139
|
+
` outcome=${input.outcome} candidates=${input.candidates}`);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=recover-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-account.js","sourceRoot":"","sources":["../src/recover-account.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,8EAA8E;AAC9E,wEAAwE;AACxE,gFAAgF;AAChF,0EAA0E;AAC1E,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,6BAA6B;AAC7B,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,2DAA2D;AAC3D,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,mEAAmE;AACnE,EAAE;AACF,iFAAiF;AACjF,4EAA4E;AAC5E,+EAA+E;AAC/E,8EAA8E;AAC9E,iBAAiB;AAEjB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAYzD;;;;;;kFAMkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,YAAoB;IACvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAA;IACxC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;2CAG2C;AAC3C,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,SAAS,GAAI,MAAkC,CAAC,SAAS,CAAA;IAC/D,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAChC,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AACrC,CAAC;AAED;;;;;;;;;;gFAUgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,KAIrC;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACpC,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,SAAS,IAAI,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9F,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;IACxF,6EAA6E;IAC7E,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;YAC3B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QACjF,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAA;IAC7C,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAA;YAC3B,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAC,CAAA;YAC5B,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAA;QACpB,CAAC;QACD,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IACJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;AACtF,CAAC;AAED;;;;;;;;gFAQgF;AAChF,MAAM,UAAU,wBAAwB,CAAC,KAMxC;IACC,OAAO,CACL,2CAA2C,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;QAClG,aAAa,KAAK,CAAC,QAAQ,IAAI,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE;QAC9D,YAAY,KAAK,CAAC,OAAO,eAAe,KAAK,CAAC,UAAU,EAAE,CAC3D,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Logger } from './types.js';
|
|
2
|
+
/** Reconcile sidecar records by session id across every registered account.
|
|
3
|
+
* `ids` counts distinct session ids seen; `splitIds` names, in the eight-char
|
|
4
|
+
* short form the manager's log lines use, the ids that hold a record under more
|
|
5
|
+
* than one account. Live and archived records of the same account are one
|
|
6
|
+
* account, not a split, because archiving moves the pair within a directory. */
|
|
7
|
+
export declare function collectSessionAccountCensus(input: {
|
|
8
|
+
accountsRoot: string;
|
|
9
|
+
env?: NodeJS.ProcessEnv;
|
|
10
|
+
}): {
|
|
11
|
+
ids: number;
|
|
12
|
+
splitIds: string[];
|
|
13
|
+
};
|
|
14
|
+
/** `splitIds=none` (not an empty field) marks "no offenders", so the field is
|
|
15
|
+
* always present and greppable. `split>0` is the alarm condition. */
|
|
16
|
+
export declare function formatSessionAccountCensus(input: {
|
|
17
|
+
ids: number;
|
|
18
|
+
splitIds: string[];
|
|
19
|
+
}): string;
|
|
20
|
+
export interface SessionAccountCensus {
|
|
21
|
+
start(): void;
|
|
22
|
+
stop(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare function createSessionAccountCensus(deps: {
|
|
25
|
+
accountsRoot: string;
|
|
26
|
+
intervalMs: number;
|
|
27
|
+
logger: Logger;
|
|
28
|
+
env?: NodeJS.ProcessEnv;
|
|
29
|
+
}): SessionAccountCensus;
|
|
30
|
+
//# sourceMappingURL=session-account-census.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-account-census.d.ts","sourceRoot":"","sources":["../src/session-account-census.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAkBxC;;;;iFAIiF;AACjF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBtC;AAED;sEACsE;AACtE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,CAM7F;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,IAAI,CAAA;CACb;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB,GAAG,oBAAoB,CAwBvB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Task 2728 — standing session-to-account census.
|
|
2
|
+
//
|
|
3
|
+
// One conversation id must hold sidecar records under exactly one account. The
|
|
4
|
+
// wrong-account respawn broke that: session 26f5687a held a record under
|
|
5
|
+
// sub-account 8a160746 (opened 12:30:53.322, no transcript) and another under
|
|
6
|
+
// house 20028fb5 (12:32:45.406, the whole transcript). Nothing emitted an event
|
|
7
|
+
// when the second record was written, and the state does not reproduce on
|
|
8
|
+
// demand, so no action log can catch it. A periodic reconciliation over the
|
|
9
|
+
// on-disk sidecars is the only reader that sees it.
|
|
10
|
+
//
|
|
11
|
+
// `ids=` is in the line for a reason: zero split out of zero ids is a census
|
|
12
|
+
// that is not measuring, not a healthy install, and a reader that only greps
|
|
13
|
+
// `split=0` cannot tell those apart.
|
|
14
|
+
//
|
|
15
|
+
// Shape mirrors cross-account-census.ts: a pure formatter and a pure-enough
|
|
16
|
+
// collector (both unit-tested), plus a start/stop factory whose setInterval is
|
|
17
|
+
// unref'd so it never holds the process open.
|
|
18
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { projectsDirForCwd } from './jsonl-path.js';
|
|
21
|
+
import { registeredAccountIds } from './recover-account.js';
|
|
22
|
+
const SIDECAR_SUFFIX = '.meta.json';
|
|
23
|
+
/** Session ids with a sidecar in this directory. Never throws; an absent or
|
|
24
|
+
* unreadable directory contributes nothing. */
|
|
25
|
+
function sessionIdsIn(dir) {
|
|
26
|
+
if (!existsSync(dir))
|
|
27
|
+
return [];
|
|
28
|
+
try {
|
|
29
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
30
|
+
.filter((d) => d.isFile() && d.name.endsWith(SIDECAR_SUFFIX))
|
|
31
|
+
.map((d) => d.name.slice(0, -SIDECAR_SUFFIX.length))
|
|
32
|
+
.filter((id) => id.length > 0);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Reconcile sidecar records by session id across every registered account.
|
|
39
|
+
* `ids` counts distinct session ids seen; `splitIds` names, in the eight-char
|
|
40
|
+
* short form the manager's log lines use, the ids that hold a record under more
|
|
41
|
+
* than one account. Live and archived records of the same account are one
|
|
42
|
+
* account, not a split, because archiving moves the pair within a directory. */
|
|
43
|
+
export function collectSessionAccountCensus(input) {
|
|
44
|
+
const env = input.env ?? process.env;
|
|
45
|
+
const accountsBySession = new Map();
|
|
46
|
+
for (const accountId of registeredAccountIds(input.accountsRoot)) {
|
|
47
|
+
const projectsDir = projectsDirForCwd(join(input.accountsRoot, accountId), env);
|
|
48
|
+
for (const sessionId of [...sessionIdsIn(projectsDir), ...sessionIdsIn(join(projectsDir, 'archive'))]) {
|
|
49
|
+
const holders = accountsBySession.get(sessionId) ?? new Set();
|
|
50
|
+
holders.add(accountId);
|
|
51
|
+
accountsBySession.set(sessionId, holders);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const splitIds = [...accountsBySession.entries()]
|
|
55
|
+
.filter(([, holders]) => holders.size > 1)
|
|
56
|
+
.map(([sessionId]) => sessionId.slice(0, 8))
|
|
57
|
+
.sort();
|
|
58
|
+
return { ids: accountsBySession.size, splitIds };
|
|
59
|
+
}
|
|
60
|
+
/** `splitIds=none` (not an empty field) marks "no offenders", so the field is
|
|
61
|
+
* always present and greppable. `split>0` is the alarm condition. */
|
|
62
|
+
export function formatSessionAccountCensus(input) {
|
|
63
|
+
const named = [...input.splitIds].sort();
|
|
64
|
+
return (`[session-account-census] ids=${input.ids} split=${named.length}` +
|
|
65
|
+
` splitIds=${named.length === 0 ? 'none' : named.join(',')}`);
|
|
66
|
+
}
|
|
67
|
+
export function createSessionAccountCensus(deps) {
|
|
68
|
+
const emit = () => {
|
|
69
|
+
try {
|
|
70
|
+
deps.logger(formatSessionAccountCensus(collectSessionAccountCensus({ accountsRoot: deps.accountsRoot, env: deps.env })));
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Best-effort, like every other standing check here: a census that throws
|
|
74
|
+
// must not take the manager down with it.
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
let timer = null;
|
|
78
|
+
return {
|
|
79
|
+
start() {
|
|
80
|
+
if (timer)
|
|
81
|
+
return;
|
|
82
|
+
// Emit once at start so the standing signal has a baseline immediately and
|
|
83
|
+
// an install that restarts inside the interval still produces a line.
|
|
84
|
+
emit();
|
|
85
|
+
timer = setInterval(emit, deps.intervalMs);
|
|
86
|
+
if (typeof timer.unref === 'function')
|
|
87
|
+
timer.unref();
|
|
88
|
+
},
|
|
89
|
+
stop() {
|
|
90
|
+
if (timer)
|
|
91
|
+
clearInterval(timer);
|
|
92
|
+
timer = null;
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=session-account-census.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-account-census.js","sourceRoot":"","sources":["../src/session-account-census.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,15 @@ export type TelegramChannelRole = 'admin' | 'public';
|
|
|
15
15
|
* spawn is wrong and the channel must not boot. */
|
|
16
16
|
export declare function resolveChannelRole(raw: string | undefined): TelegramChannelRole;
|
|
17
17
|
export declare const OPERATOR_INSTRUCTION_REFRAME: string;
|
|
18
|
+
/** Task 2730 — the operator did not instruct the agent here; they answered the
|
|
19
|
+
* visitor themselves. The visitor already holds these exact words, so the only
|
|
20
|
+
* thing owed is that this conversation's context holds them too.
|
|
21
|
+
*
|
|
22
|
+
* The follower withholds this turn's final text whatever this block says, so its
|
|
23
|
+
* job is to stop the agent spending the turn composing a reply nobody will see,
|
|
24
|
+
* and to stop it reaching for a card, which sends through the Bot API directly
|
|
25
|
+
* and is the one delivery the follower cannot withhold. */
|
|
26
|
+
export declare const OPERATOR_SENT_REFRAME: string;
|
|
18
27
|
export declare function channelInstructions(role: TelegramChannelRole): string;
|
|
19
28
|
export declare function replyToolDescription(role: TelegramChannelRole): string;
|
|
20
29
|
export declare function replyTextDescription(role: TelegramChannelRole): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD;;;;;;;;;;;;;oDAaoD;AACpD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAM/E;AAiFD,eAAO,MAAM,4BAA4B,QAQb,CAAA;AAE5B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAoBD,eAAO,MAAM,yBAAyB,QAkEiE,CAAA"}
|
|
1
|
+
{"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEpD;;;;;;;;;;;;;oDAaoD;AACpD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAM/E;AAiFD,eAAO,MAAM,4BAA4B,QAQb,CAAA;AAE5B;;;;;;;4DAO4D;AAC5D,eAAO,MAAM,qBAAqB,QAOgD,CAAA;AAElF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAItE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAEtE;AAoBD,eAAO,MAAM,yBAAyB,QAkEiE,CAAA"}
|
|
@@ -104,6 +104,21 @@ export const OPERATOR_INSTRUCTION_REFRAME = 'The account operator sent this thro
|
|
|
104
104
|
'Write it as your own words to the visitor, in the same voice as the rest of this conversation. ' +
|
|
105
105
|
'Never quote this block, never repeat the instruction back, and never tell the visitor that ' +
|
|
106
106
|
'somebody instructed you.';
|
|
107
|
+
/** Task 2730 — the operator did not instruct the agent here; they answered the
|
|
108
|
+
* visitor themselves. The visitor already holds these exact words, so the only
|
|
109
|
+
* thing owed is that this conversation's context holds them too.
|
|
110
|
+
*
|
|
111
|
+
* The follower withholds this turn's final text whatever this block says, so its
|
|
112
|
+
* job is to stop the agent spending the turn composing a reply nobody will see,
|
|
113
|
+
* and to stop it reaching for a card, which sends through the Bot API directly
|
|
114
|
+
* and is the one delivery the follower cannot withhold. */
|
|
115
|
+
export const OPERATOR_SENT_REFRAME = 'The account operator sent this message to the visitor themselves, from their own admin door. ' +
|
|
116
|
+
'It is not the visitor speaking and it is not an instruction for you. ' +
|
|
117
|
+
'The visitor has already received these exact words, so treat them as part of this ' +
|
|
118
|
+
'conversation and as something already said to the visitor on your side. ' +
|
|
119
|
+
'Nothing is to be sent in response: no reply, no acknowledgement, no card, no follow-up. ' +
|
|
120
|
+
'Answer with one short line for the record and stop. That line is not delivered to anybody. ' +
|
|
121
|
+
'Never quote this block, and never tell the visitor that anything was recorded.';
|
|
107
122
|
export function channelInstructions(role) {
|
|
108
123
|
return role === 'public' ? PUBLIC_INSTRUCTIONS : ADMIN_INSTRUCTIONS;
|
|
109
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,7 +77,7 @@ export interface InboundPayload {
|
|
|
77
77
|
* write.
|
|
78
78
|
*
|
|
79
79
|
* Absent on legacy frames = 'user'. */
|
|
80
|
-
source?: 'user' | 'schedule' | 'operator';
|
|
80
|
+
source?: 'user' | 'schedule' | 'operator' | 'operator-sent';
|
|
81
81
|
/** Task 2561 — who sent this message, and the account it landed on. The
|
|
82
82
|
* gateway held both for the whole turn and passed neither, so an admin turn
|
|
83
83
|
* opened straight into rules written about the account owner and a second
|
|
@@ -151,9 +151,11 @@ export interface ComposedInbound {
|
|
|
151
151
|
* this service's own admin constant, which is every admin turn on this door and
|
|
152
152
|
* cannot fail; 'public-plain' is the public role, which carries no instruction
|
|
153
153
|
* block at all. Task 2724 adds 'operator': the public role carrying the
|
|
154
|
-
* operator-instruction constant, the one public turn that IS framed.
|
|
155
|
-
*
|
|
156
|
-
|
|
154
|
+
* operator-instruction constant, the one public turn that IS framed. Task 2730
|
|
155
|
+
* adds 'operator-sent': the public role carrying the already-sent constant,
|
|
156
|
+
* which is framed for the opposite reason. There is no 'absent': this door
|
|
157
|
+
* reads no file. */
|
|
158
|
+
instructionSource: 'platform' | 'public-plain' | 'operator' | 'operator-sent';
|
|
157
159
|
}
|
|
158
160
|
export declare function composeContent(p: InboundPayload, role: TelegramChannelRole): ComposedInbound;
|
|
159
161
|
/** Defence in depth: this server serves exactly one key. Even though the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAyBA,OAAO,
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// Task 2364 — a type-only import from this package's own turn follower, so the
|
|
22
22
|
// turn-end body and the counts it carries have one definition. Type-only, so it
|
|
23
23
|
// erases at build and this file still pulls in no runtime dependency.
|
|
24
|
-
import { ADMIN_REFRAME_INSTRUCTION, OPERATOR_INSTRUCTION_REFRAME, } from './instructions.js';
|
|
24
|
+
import { ADMIN_REFRAME_INSTRUCTION, OPERATOR_INSTRUCTION_REFRAME, OPERATOR_SENT_REFRAME, } from './instructions.js';
|
|
25
25
|
/**
|
|
26
26
|
* Task 1516 — render the dispatcher's operator-provenance as a platform-verified
|
|
27
27
|
* preamble. Every value is dispatcher-stamped (an inbound message cannot produce
|
|
@@ -148,6 +148,20 @@ export function composeContent(p, role) {
|
|
|
148
148
|
instructionSource: 'operator',
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
|
+
// Task 2730 — the second public payload the visitor did not write, framed for
|
|
152
|
+
// the OPPOSITE reason to the one above: the visitor HAS seen it, so this
|
|
153
|
+
// tells the agent to record it and send nothing. The follower withholds the
|
|
154
|
+
// turn's final text regardless; this is what stops the agent reaching for a
|
|
155
|
+
// card, which no suppression here can catch.
|
|
156
|
+
if (p.source === 'operator-sent') {
|
|
157
|
+
return {
|
|
158
|
+
content: `## Operator message already sent to the visitor (platform-verified)\n${OPERATOR_SENT_REFRAME}\n\n` +
|
|
159
|
+
`## What the operator sent\n${payload}`,
|
|
160
|
+
payloadBytes,
|
|
161
|
+
provenance: true,
|
|
162
|
+
instructionSource: 'operator-sent',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
151
165
|
return { content: payload, payloadBytes, provenance: false, instructionSource: 'public-plain' };
|
|
152
166
|
}
|
|
153
167
|
// Task 1516 — a scheduled turn opens with the platform-verified provenance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,yEAAyE;AACzE,gCAAgC;AAChC,EAAE;AACF,6EAA6E;AAC7E,iFAAiF;AACjF,gEAAgE;AAChE,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,kFAAkF;AAClF,iFAAiF;AACjF,kFAAkF;AAClF,+EAA+E;AAC/E,2FAA2F;AAC3F,+EAA+E;AAC/E,iFAAiF;AACjF,iFAAiF;AACjF,qFAAqF;AAErF,+EAA+E;AAC/E,gFAAgF;AAChF,sEAAsE;AAEtE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"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"}
|
|
@@ -183,22 +183,33 @@ if (!existsSync3(PLATFORM_ROOT2)) {
|
|
|
183
183
|
Set the MAXY_PLATFORM_ROOT environment variable to the absolute path of the platform directory.`
|
|
184
184
|
);
|
|
185
185
|
}
|
|
186
|
-
var
|
|
187
|
-
function
|
|
188
|
-
|
|
186
|
+
var STUB_DIR_GRACE_MS = 6e4;
|
|
187
|
+
function stubDirIdleMs(accountDir, nowMs) {
|
|
188
|
+
let st;
|
|
189
|
+
try {
|
|
190
|
+
st = statSync(accountDir);
|
|
191
|
+
} catch {
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
return nowMs - Math.max(st.birthtimeMs, st.ctimeMs, st.mtimeMs);
|
|
195
|
+
}
|
|
196
|
+
var _stubDirsReported = /* @__PURE__ */ new Map();
|
|
197
|
+
function listValidAccounts(accountsDir = ACCOUNTS_DIR, nowMs = Date.now()) {
|
|
198
|
+
if (!existsSync3(accountsDir)) return [];
|
|
189
199
|
const out = [];
|
|
190
|
-
const entries2 = readdirSync(
|
|
200
|
+
const entries2 = readdirSync(accountsDir, { withFileTypes: true });
|
|
191
201
|
for (const entry of entries2) {
|
|
192
202
|
if (!entry.isDirectory()) continue;
|
|
193
203
|
if (entry.name.startsWith(".")) continue;
|
|
194
|
-
const accountDir = resolve2(
|
|
204
|
+
const accountDir = resolve2(accountsDir, entry.name);
|
|
195
205
|
const configPath = resolve2(accountDir, "account.json");
|
|
196
206
|
if (!existsSync3(configPath)) {
|
|
197
|
-
|
|
207
|
+
const idleMs = stubDirIdleMs(accountDir, nowMs);
|
|
208
|
+
if (idleMs >= STUB_DIR_GRACE_MS && !_stubDirsReported.has(entry.name)) {
|
|
198
209
|
console.error(
|
|
199
|
-
`[platform] accounts-state STUB-DIR id=${entry.name} \u2014
|
|
210
|
+
`[platform] accounts-state STUB-DIR id=${entry.name} idleMs=${idleMs} \u2014 no account.json; not enumerated. Inspect it; an account directory is the account's only copy.`
|
|
200
211
|
);
|
|
201
|
-
|
|
212
|
+
_stubDirsReported.set(entry.name, nowMs);
|
|
202
213
|
}
|
|
203
214
|
continue;
|
|
204
215
|
}
|
|
@@ -211,10 +222,33 @@ function listValidAccounts() {
|
|
|
211
222
|
);
|
|
212
223
|
continue;
|
|
213
224
|
}
|
|
225
|
+
const reportedAtMs = _stubDirsReported.get(entry.name);
|
|
226
|
+
if (reportedAtMs !== void 0) {
|
|
227
|
+
console.error(
|
|
228
|
+
`[accounts-state] op=stub-dir-resolved id=${entry.name} reportedAgoMs=${nowMs - reportedAtMs}`
|
|
229
|
+
);
|
|
230
|
+
_stubDirsReported.delete(entry.name);
|
|
231
|
+
}
|
|
214
232
|
out.push({ accountId: config.accountId, accountDir, config });
|
|
215
233
|
}
|
|
216
234
|
return out;
|
|
217
235
|
}
|
|
236
|
+
function censusAccountDirs(accountsDir = ACCOUNTS_DIR, nowMs = Date.now()) {
|
|
237
|
+
if (!existsSync3(accountsDir)) return { dirs: 0, provisioning: [], abandoned: [] };
|
|
238
|
+
const provisioning = [];
|
|
239
|
+
const abandoned = [];
|
|
240
|
+
let dirs = 0;
|
|
241
|
+
for (const entry of readdirSync(accountsDir, { withFileTypes: true })) {
|
|
242
|
+
if (!entry.isDirectory()) continue;
|
|
243
|
+
if (entry.name.startsWith(".")) continue;
|
|
244
|
+
dirs++;
|
|
245
|
+
const accountDir = resolve2(accountsDir, entry.name);
|
|
246
|
+
if (existsSync3(resolve2(accountDir, "account.json"))) continue;
|
|
247
|
+
if (stubDirIdleMs(accountDir, nowMs) >= STUB_DIR_GRACE_MS) abandoned.push(entry.name);
|
|
248
|
+
else provisioning.push(entry.name);
|
|
249
|
+
}
|
|
250
|
+
return { dirs, provisioning, abandoned };
|
|
251
|
+
}
|
|
218
252
|
function isValidAccountId(id) {
|
|
219
253
|
return listValidAccounts().some((a) => a.accountId === id);
|
|
220
254
|
}
|
|
@@ -2194,6 +2228,7 @@ export {
|
|
|
2194
2228
|
PLATFORM_ROOT2 as PLATFORM_ROOT,
|
|
2195
2229
|
ACCOUNTS_DIR,
|
|
2196
2230
|
listValidAccounts,
|
|
2231
|
+
censusAccountDirs,
|
|
2197
2232
|
isValidAccountId,
|
|
2198
2233
|
resolveAccount,
|
|
2199
2234
|
readAgentFile,
|
|
@@ -30,8 +30,8 @@ import {
|
|
|
30
30
|
startConnection,
|
|
31
31
|
stopConnection,
|
|
32
32
|
storeMessage
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import "./chunk-
|
|
33
|
+
} from "./chunk-DRDU74ZM.js";
|
|
34
|
+
import "./chunk-T6NXRWMG.js";
|
|
35
35
|
import "./chunk-CYU75QAV.js";
|
|
36
36
|
import "./chunk-HYQNUVGO.js";
|
|
37
37
|
export {
|
|
@@ -19,13 +19,13 @@ import {
|
|
|
19
19
|
screencastLog,
|
|
20
20
|
vncLog,
|
|
21
21
|
websockifyLog
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-IOPUA7QV.js";
|
|
23
23
|
import {
|
|
24
24
|
CDP_PORT,
|
|
25
25
|
LOG_DIR,
|
|
26
26
|
WEBSOCKIFY_PORT,
|
|
27
27
|
registerLoop
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-T6NXRWMG.js";
|
|
29
29
|
import "./chunk-HYQNUVGO.js";
|
|
30
30
|
|
|
31
31
|
// server/edge.ts
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Activity — Maxy</title>
|
|
7
7
|
<link rel="icon" href="/favicon.ico">
|
|
8
|
-
<script type="module" crossorigin src="/assets/activity-
|
|
8
|
+
<script type="module" crossorigin src="/assets/activity-DfIud5UH.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-BycB0eMI.js">
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/useMediaQuery-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/AdminShell-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/triangle-alert-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-DeRQuYlX.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/useMediaQuery-Cm_fvNIH.js">
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/AdminShell-DyOPTLdb.js">
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/triangle-alert-DD4kSK45.js">
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-B5zQuMcr.css">
|
|
15
15
|
<link rel="stylesheet" crossorigin href="/assets/useMediaQuery-DXAuc8G-.css">
|
|
16
16
|
<link rel="stylesheet" href="/brand-defaults.css">
|
|
17
17
|
</head>
|