@rubytech/create-maxy-code 0.1.293 → 0.1.295

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.
Files changed (164) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +22 -4
  3. package/payload/platform/plugins/docs/references/admin-ui.md +19 -2
  4. package/payload/platform/plugins/docs/references/platform.md +2 -1
  5. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  6. package/payload/platform/services/claude-session-manager/dist/http-server.js +28 -3
  7. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  8. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +9 -0
  9. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
  10. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +14 -0
  11. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  12. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +7 -4
  13. package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
  14. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +7 -4
  15. package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
  16. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.d.ts +3 -0
  17. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.d.ts.map +1 -0
  18. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.js +28 -0
  19. package/payload/platform/services/claude-session-manager/dist/settings-permission-mode.js.map +1 -0
  20. package/payload/platform/templates/specialists/agents/data-manager.md +27 -0
  21. package/payload/server/public/assets/AdminShell-DDieHnzi.js +1 -0
  22. package/payload/server/public/assets/Checkbox-DTrIyIFP.js +1 -0
  23. package/payload/server/public/assets/Transcript-C3aDVJ-n.js +1 -0
  24. package/payload/server/public/assets/admin-DVdyV-Q6.js +1 -0
  25. package/payload/server/public/assets/{arc-iu3VNUKX.js → arc-DmR-LPIx.js} +1 -1
  26. package/payload/server/public/assets/architecture-YZFGNWBL-CjF2k79a.js +1 -0
  27. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-un5y1Pav.js → architectureDiagram-Q4EWVU46-DR9W0q1P.js} +1 -1
  28. package/payload/server/public/assets/audio-attachment-mime-DGEfApkA.js +1 -0
  29. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CrT4y-Ve.js → blockDiagram-DXYQGD6D-C3uwaI7p.js} +1 -1
  30. package/payload/server/public/assets/browser-DrJReVEG.js +1 -0
  31. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BTNlRxRe.js → c4Diagram-AHTNJAMY-C8hmUDdd.js} +1 -1
  32. package/payload/server/public/assets/channel-drVqp11B.js +1 -0
  33. package/payload/server/public/assets/chat-DeEYwIKE.js +1 -0
  34. package/payload/server/public/assets/{chunk-2KRD3SAO-DjQJDvnb.js → chunk-2KRD3SAO-BYqpHDvA.js} +1 -1
  35. package/payload/server/public/assets/chunk-336JU56O-BRCubMCb.js +2 -0
  36. package/payload/server/public/assets/chunk-426QAEUC-BNINkVsL.js +1 -0
  37. package/payload/server/public/assets/{chunk-4BX2VUAB-B2BREWGj.js → chunk-4BX2VUAB-BeDVr5Tb.js} +1 -1
  38. package/payload/server/public/assets/{chunk-4TB4RGXK-CWOel6yZ.js → chunk-4TB4RGXK-DSMj_AZh.js} +1 -1
  39. package/payload/server/public/assets/{chunk-55IACEB6-8_6mlBoL.js → chunk-55IACEB6-DB18cH4S.js} +1 -1
  40. package/payload/server/public/assets/{chunk-5FUZZQ4R-CcBL3hEb.js → chunk-5FUZZQ4R-6DNGaUkf.js} +1 -1
  41. package/payload/server/public/assets/{chunk-5PVQY5BW-DpqQNCTE.js → chunk-5PVQY5BW-DPhkkS4p.js} +1 -1
  42. package/payload/server/public/assets/{chunk-67CJDMHE-D-EZpLie.js → chunk-67CJDMHE-Ca9KwdQm.js} +1 -1
  43. package/payload/server/public/assets/{chunk-7N4EOEYR-C9Ely26O.js → chunk-7N4EOEYR-BDpzHOmv.js} +1 -1
  44. package/payload/server/public/assets/{chunk-AA7GKIK3-DZZsYrza.js → chunk-AA7GKIK3-DXo9fZho.js} +1 -1
  45. package/payload/server/public/assets/{chunk-BSJP7CBP-B_1DfG3d.js → chunk-BSJP7CBP-CTqmM6qI.js} +1 -1
  46. package/payload/server/public/assets/{chunk-CIAEETIT-Osq5Xgsl.js → chunk-CIAEETIT-NufEId2j.js} +1 -1
  47. package/payload/server/public/assets/{chunk-EDXVE4YY-ecraT_D1.js → chunk-EDXVE4YY-BjWSqn7_.js} +1 -1
  48. package/payload/server/public/assets/{chunk-ENJZ2VHE-D2_uycym.js → chunk-ENJZ2VHE-BX1ZnU4A.js} +1 -1
  49. package/payload/server/public/assets/{chunk-FMBD7UC4-CpPyTbk9.js → chunk-FMBD7UC4-_4wtKsfc.js} +1 -1
  50. package/payload/server/public/assets/{chunk-FOC6F5B3-BBUjlBL-.js → chunk-FOC6F5B3-565zaYb3.js} +1 -1
  51. package/payload/server/public/assets/{chunk-ICPOFSXX-BG-5Z4Qz.js → chunk-ICPOFSXX-DvYSWH7x.js} +2 -2
  52. package/payload/server/public/assets/{chunk-K5T4RW27-BQfKdYtk.js → chunk-K5T4RW27-CTZnA5fq.js} +1 -1
  53. package/payload/server/public/assets/{chunk-KGLVRYIC-D1pxYesN.js → chunk-KGLVRYIC-CeuKp7uR.js} +1 -1
  54. package/payload/server/public/assets/{chunk-LIHQZDEY-CwDi08BU.js → chunk-LIHQZDEY-DXkzlh3_.js} +1 -1
  55. package/payload/server/public/assets/{chunk-ORNJ4GCN-Dy-V9ZFU.js → chunk-ORNJ4GCN-DcZUCmgM.js} +1 -1
  56. package/payload/server/public/assets/{chunk-OYMX7WX6-Be3df9Kc.js → chunk-OYMX7WX6-7_m3mEOK.js} +1 -1
  57. package/payload/server/public/assets/chunk-QZHKN3VN-CBWmDBHe.js +1 -0
  58. package/payload/server/public/assets/{chunk-U2HBQHQK-B1lsc9BA.js → chunk-U2HBQHQK-Bl1a895I.js} +1 -1
  59. package/payload/server/public/assets/{chunk-X2U36JSP-lSzO6qYV.js → chunk-X2U36JSP-WkSpBPYx.js} +1 -1
  60. package/payload/server/public/assets/{chunk-XPW4576I-BvIgWKZQ.js → chunk-XPW4576I-CnU6DVpC.js} +1 -1
  61. package/payload/server/public/assets/{chunk-YZCP3GAM-Bb60_vDO.js → chunk-YZCP3GAM-DpWRmPUo.js} +1 -1
  62. package/payload/server/public/assets/{chunk-ZZ45TVLE-Bny6wiCL.js → chunk-ZZ45TVLE-D9Dgmeso.js} +1 -1
  63. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Dplkw_pj.js +1 -0
  64. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-sJXv1Ihp.js +1 -0
  65. package/payload/server/public/assets/clone-Q_B6oO0c.js +1 -0
  66. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DsO6VRrT.js → cose-bilkent-S5V4N54A-C04wkJr7.js} +1 -1
  67. package/payload/server/public/assets/{dagre-KV5264BT-Bd45zu30.js → dagre-KV5264BT-DPq3dcLH.js} +1 -1
  68. package/payload/server/public/assets/{dagre-DTQyvF-b.js → dagre-PrVfCcSt.js} +1 -1
  69. package/payload/server/public/assets/data-CYyR2m_B.js +1 -0
  70. package/payload/server/public/assets/{diagram-5BDNPKRD-B3GfgObm.js → diagram-5BDNPKRD-DoszElKb.js} +1 -1
  71. package/payload/server/public/assets/{diagram-G4DWMVQ6-Ccy_YcB0.js → diagram-G4DWMVQ6-BRuqosix.js} +1 -1
  72. package/payload/server/public/assets/{diagram-MMDJMWI5-uOEKrHYy.js → diagram-MMDJMWI5-CpigG1d_.js} +1 -1
  73. package/payload/server/public/assets/{diagram-TYMM5635-BAWSU1wH.js → diagram-TYMM5635-BS0eYiq9.js} +1 -1
  74. package/payload/server/public/assets/{erDiagram-SMLLAGMA-C5SNsoHU.js → erDiagram-SMLLAGMA-VEQyXCFl.js} +1 -1
  75. package/payload/server/public/assets/file-download-C3pBZjt9.js +1 -0
  76. package/payload/server/public/assets/{flatten-ya0TqRLc.js → flatten-DeFkSYLU.js} +1 -1
  77. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-eGUNT0jC.js → flowDiagram-DWJPFMVM-2NYMfqHX.js} +1 -1
  78. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-ChQD_MQS.js → ganttDiagram-T4ZO3ILL-AAAa2sqE.js} +1 -1
  79. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DsUTwRUb.js +1 -0
  80. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CK5hWyS_.js → gitGraphDiagram-UUTBAWPF-d8NUAIz5.js} +1 -1
  81. package/payload/server/public/assets/{graph-nPeTW1V_.js → graph-Bx9_2qbJ.js} +3 -3
  82. package/payload/server/public/assets/graph-labels-Cc1nU1_f.js +1 -0
  83. package/payload/server/public/assets/{graphlib-DbSkkysa.js → graphlib-DUlqr2mr.js} +1 -1
  84. package/payload/server/public/assets/info-OMHHGYJF-BV9FyUXQ.js +1 -0
  85. package/payload/server/public/assets/infoDiagram-42DDH7IO-D4dh4-0g.js +2 -0
  86. package/payload/server/public/assets/{isEmpty-h-wRi_o9.js → isEmpty-Bn-Se8yT.js} +1 -1
  87. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DR685OiM.js → ishikawaDiagram-UXIWVN3A-DPTmm2IE.js} +1 -1
  88. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DYgyVIQE.js → journeyDiagram-VCZTEJTY-B85vjqkE.js} +1 -1
  89. package/payload/server/public/assets/jsx-runtime-5auA0FEj.js +9 -0
  90. package/payload/server/public/assets/jsx-runtime-D3PZpOAF.css +1 -0
  91. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BbOYz3ft.js → kanban-definition-6JOO6SKY-C2Lfb5Xh.js} +1 -1
  92. package/payload/server/public/assets/{line-BmJuH1ci.js → line-CODKFpwO.js} +1 -1
  93. package/payload/server/public/assets/{linear-HbmXARXu.js → linear-CgbkJiu6.js} +1 -1
  94. package/payload/server/public/assets/{mermaid-parser.core-B9dlRmr6.js → mermaid-parser.core-DYdFZnXH.js} +2 -2
  95. package/payload/server/public/assets/{mermaid.core-CA_tMkuh.js → mermaid.core-Bamjzahu.js} +3 -3
  96. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DNfGKB3j.js → mindmap-definition-QFDTVHPH-CLK90bKJ.js} +1 -1
  97. package/payload/server/public/assets/{ordinal-Dwxksj1B.js → ordinal-C-EimP2j.js} +1 -1
  98. package/payload/server/public/assets/packet-4T2RLAQJ-SXjQ83Vr.js +1 -0
  99. package/payload/server/public/assets/pie-ZZUOXDRM-q7TXebDD.js +1 -0
  100. package/payload/server/public/assets/{pieDiagram-DEJITSTG-4nplxyR3.js → pieDiagram-DEJITSTG-DEsnxhqP.js} +1 -1
  101. package/payload/server/public/assets/public-BFMu-jux.js +35 -0
  102. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BuRxivWl.js → quadrantDiagram-34T5L4WZ-uIP9V2jZ.js} +1 -1
  103. package/payload/server/public/assets/radar-PYXPWWZC-CXKUHVMS.js +1 -0
  104. package/payload/server/public/assets/{reduce-BUuWaDl2.js → reduce-B0wq8DtH.js} +1 -1
  105. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CX0JWzZW.js → requirementDiagram-MS252O5E-CVS6t5tv.js} +1 -1
  106. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BPbfY-tX.js → sankeyDiagram-XADWPNL6-BIsmtyZA.js} +1 -1
  107. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BgDVnY5n.js → sequenceDiagram-FGHM5R23-Cu8TfQiW.js} +1 -1
  108. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DZzcTY8N.js → stateDiagram-FHFEXIEX-ax4vYGft.js} +1 -1
  109. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BRv1By5g.js +1 -0
  110. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-LRc4oAIn.js → timeline-definition-GMOUNBTQ-3l7ojkMA.js} +1 -1
  111. package/payload/server/public/assets/treeView-SZITEDCU-CWuFgUeJ.js +1 -0
  112. package/payload/server/public/assets/treemap-W4RFUUIX-gKO4rbgo.js +1 -0
  113. package/payload/server/public/assets/useSelectionMode-C_EBRd2k.js +5 -0
  114. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-D285XuiE.js → vennDiagram-DHZGUBPP-C_sv0qMD.js} +1 -1
  115. package/payload/server/public/assets/wardley-RL74JXVD-hDEw8pJN.js +1 -0
  116. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-55WTCJwx.js → wardleyDiagram-NUSXRM2D-C7u4IHMB.js} +1 -1
  117. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-mBKutlt4.js → xychartDiagram-5P7HB3ND-A-uLXr1a.js} +1 -1
  118. package/payload/server/public/browser.html +7 -5
  119. package/payload/server/public/chat.html +9 -6
  120. package/payload/server/public/data.html +6 -6
  121. package/payload/server/public/graph.html +9 -7
  122. package/payload/server/public/index.html +9 -7
  123. package/payload/server/public/public.html +6 -4
  124. package/payload/server/server.js +595 -276
  125. package/payload/server/public/assets/AdminShell-7xqVmEF0.js +0 -1
  126. package/payload/server/public/assets/Checkbox-xIFPRr-Y.js +0 -1
  127. package/payload/server/public/assets/Transcript-siyY9S7_.js +0 -1
  128. package/payload/server/public/assets/admin-DVyRE7og.js +0 -1
  129. package/payload/server/public/assets/architecture-YZFGNWBL-HsK_v-AH.js +0 -1
  130. package/payload/server/public/assets/browser-CWFHESdi.js +0 -1
  131. package/payload/server/public/assets/channel-B3X2ELTx.js +0 -1
  132. package/payload/server/public/assets/chat-CoZ5hSiK.js +0 -1
  133. package/payload/server/public/assets/chunk-336JU56O-CWAQPaQW.js +0 -2
  134. package/payload/server/public/assets/chunk-426QAEUC-CYsbwfwG.js +0 -1
  135. package/payload/server/public/assets/chunk-QZHKN3VN-CitInsDb.js +0 -1
  136. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B8ZHYEIL.js +0 -1
  137. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D7TgEwXH.js +0 -1
  138. package/payload/server/public/assets/clone-C-K4Yq8V.js +0 -1
  139. package/payload/server/public/assets/data-Dex0L_hs.js +0 -1
  140. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CP3pxYZ8.js +0 -1
  141. package/payload/server/public/assets/graph-labels-J48HJ3as.js +0 -1
  142. package/payload/server/public/assets/info-OMHHGYJF-DUz8FRjp.js +0 -1
  143. package/payload/server/public/assets/infoDiagram-42DDH7IO-CoLeR6OP.js +0 -2
  144. package/payload/server/public/assets/packet-4T2RLAQJ-C-0PIYwM.js +0 -1
  145. package/payload/server/public/assets/pie-ZZUOXDRM-DUWx5LLr.js +0 -1
  146. package/payload/server/public/assets/public-C7o23SFC.js +0 -35
  147. package/payload/server/public/assets/radar-PYXPWWZC-BPW6Hewb.js +0 -1
  148. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Bk-yVe98.js +0 -1
  149. package/payload/server/public/assets/treeView-SZITEDCU-CfxoEICI.js +0 -1
  150. package/payload/server/public/assets/treemap-W4RFUUIX-BFC84eoy.js +0 -1
  151. package/payload/server/public/assets/useSelectionMode-CFisDuuw.js +0 -13
  152. package/payload/server/public/assets/useSelectionMode-s7AH5v9J.css +0 -1
  153. package/payload/server/public/assets/wardley-RL74JXVD-C-mQV2If.js +0 -1
  154. /package/payload/server/public/assets/{_baseFor-Dn4GSmI6.js → _baseFor-BV-TyLWt.js} +0 -0
  155. /package/payload/server/public/assets/{array-DJN9YAVf.js → array-lqrvkwy7.js} +0 -0
  156. /package/payload/server/public/assets/{cytoscape.esm-BcJTl1re.js → cytoscape.esm-SmEOayFS.js} +0 -0
  157. /package/payload/server/public/assets/{defaultLocale-B4F_XsBB.js → defaultLocale-Dl3Sud5K.js} +0 -0
  158. /package/payload/server/public/assets/{dist-B7zzC2xF.js → dist-Pgmncqde.js} +0 -0
  159. /package/payload/server/public/assets/{AdminShell-qc_xy7Az.css → file-download-qc_xy7Az.css} +0 -0
  160. /package/payload/server/public/assets/{init-DX0Y1qU4.js → init-BukMwkmL.js} +0 -0
  161. /package/payload/server/public/assets/{katex-CjHJ1D7d.js → katex-jl-BtNZi.js} +0 -0
  162. /package/payload/server/public/assets/{path-7vUsG-o2.js → path-DPTRcLku.js} +0 -0
  163. /package/payload/server/public/assets/{rough.esm-NLRoWnq-.js → rough.esm-VLpapkIG.js} +0 -0
  164. /package/payload/server/public/assets/{src-CpjuOYjb.js → src-CozP7LCe.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.293",
3
+ "version": "0.1.295",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy 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:516d6fb2a0a7f45c4e8799c5ae4b3bf1009793c296a8b0882d11ea2eff79245a
4
+ content-hash: sha256:c39a9e28304fa49a4afee3aabc0507872065d868994c9ab14d56b2576f4ce636
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
@@ -153,7 +153,7 @@ Plugins are installed and managed through conversation. You can add marketplace
153
153
 
154
154
  ## Roles
155
155
 
156
- Maxy ships twelve roles it can dispatch for specific tasks — like members of your team. You don't need to configure or manage them — Maxy decides when to use each role and handles everything automatically. You may see activity like "Dispatching personal-assistant..." in the chat timeline when this happens.
156
+ Maxy ships thirteen roles it can dispatch for specific tasks — like members of your team. You don't need to configure or manage them — Maxy decides when to use each role and handles everything automatically. You may see activity like "Dispatching personal-assistant..." in the chat timeline when this happens.
157
157
 
158
158
  The catalogue below is what the platform ships. It is not evidence of what is installed on the current account. For the live install set on this account, ask Maxy to call `capabilities-here`.
159
159
 
@@ -164,6 +164,7 @@ The catalogue below is what the platform ships. It is not evidence of what is in
164
164
  | Coding Assistant | Runs shell commands, drives git repositories, and reads or edits code on your behalf — the specialist you reach for when the work belongs in a developer terminal. |
165
165
  | Compiled Truth Rewriter | Recomputes a node's compiledTruth (and public twin where applicable) from its 90-day timeline plus optional operator hints. |
166
166
  | Content Producer | Produces visual output from your graph: generates images, renders pages to PDF, and hosts static websites you upload as a zip. |
167
+ | Data Manager | Keeps the account data directory organised consistently with the graph ontology, pairing every file move with a database-operator reference update. |
167
168
  | Database Operator | Executes graph writes on admin's behalf when delegated via the Task tool — admin names each write, the specialist runs it. |
168
169
  | Librarian | Owns foreground ingest of documents, conversation transcripts, and external archives into the memory graph. |
169
170
  | Personal Assistant | Handles the operational tasks you'd give a personal assistant: scheduling meetings, managing your platform settings, connecting messaging channels, and completing browser-based tasks on your behalf. |
@@ -2280,7 +2281,9 @@ Task 500 — **admin session management moved entirely to claude's own interface
2280
2281
 
2281
2282
  **Row title resolution.** Both the sidebar (`/sidebar-sessions`) and the manager's own row payload resolve a row's title in the same order: operator rename → Claude Code `ai-title` → first non-CLI user message → 8-char sessionId prefix. The operator-rename tier is the on-disk `<accountDir>/session-titles.json` (the manager's `UserTitleStore`), keyed by the CC sessionId — the sidebar reads that same file, so a write to the store lights up both surfaces with one write.
2282
2283
 
2283
- **Task 785 — `/chat` empty-state greeting panel.** While the admin webchat has no conversation JSONL yet (`GET /api/webchat/session` → `projectDir:null`), `app/chat/page.tsx` renders a "What's up next, {givenName}?" greeting (given name = first whitespace token of the admin session's `userName`) above two read-only lists from `GET /api/webchat/greeting` (`server/routes/webchat-greeting.ts`, `requireAdminSession`-gated, `accountId`-scoped): the next 5 upcoming `:Event` rows (`eventStatus IN ['scheduled','due']`, future `COALESCE(nextRun, startDate)`, soonest first) and the outstanding `:Task` rows (`status IN ['pending','active','running']`, 5 shown + `+N more`). Read failure returns HTTP 200 `{ ok: false }` and the page shows the headline alone — the panel never blocks the composer. Logs: `[webchat:greeting] op=read account=<id8> events=<n> tasks=<n> ms=<n>` / `op=read-failed reason=…`; client warns `[admin-ui] greeting-unavailable …`. The full webchat architecture lives in `.docs/admin-webchat-native-channel.md`.
2284
+ **Task 785 — `/chat` empty-state greeting panel.** While the admin webchat has no conversation JSONL yet (`GET /api/webchat/session` → `projectDir:null`), `app/chat/page.tsx` renders a "What's up next, {givenName}?" greeting (given name = first whitespace token of the admin session's `userName`) above two read-only lists from `GET /api/webchat/greeting` (`server/routes/webchat-greeting.ts`, `requireAdminSession`-gated, `accountId`-scoped): the next 5 upcoming `:Event` rows (`eventStatus IN ['scheduled','due']`, future `COALESCE(nextRun, startDate)`, soonest first) and the outstanding `:Task` rows (`status IN ['pending','active','running']`, 5 shown + `+N more`). Read failure returns HTTP 200 `{ ok: false }` and the page shows the headline alone — the panel never blocks the composer. **Task 792** adds a third section, **Your specialists**: the account's installed roster — every `*.md` under `data/accounts/<accountId>/specialists/agents/`, core and `--`-prefixed premium files alike — shown by frontmatter `name` + `summary` (fallback `description`), empty dir → "No specialists installed". The roster read (`app/lib/claude-agent/specialist-roster.ts`) is isolated from the graph fallback: malformed files are skipped (`op=specialist-skipped file=<name> reason=<…>`), a whole-roster failure degrades to `specialists: []` inside the `ok: true` payload (`op=specialists-read-failed`). Logs: `[webchat:greeting] op=read account=<id8> events=<n> tasks=<n> specialists=<n> ms=<n>` / `op=read-failed reason=…`; client warns `[admin-ui] greeting-unavailable …`. The full webchat architecture lives in `.docs/admin-webchat-native-channel.md`.
2285
+
2286
+ **Task 799 — `/chat` Claude-desktop transcript presentation.** The admin webchat keeps the shared `Transcript` shell (stream, follow-tail) but injects a /chat-only item renderer via the component's optional `renderItems` prop: `renderChatTimeline` in `app/chat/transcript-render.tsx`. Presentation: operator turns render as a right-aligned grey bubble with only the message text (no label, no per-turn time); all agent output renders as plain prose (the reply-document filename line stays, as prose); a maximal consecutive run of `tool-call`/`tool-result` turns renders as one collapsed grey one-liner ("Used N tools ›") whose expansion shows every call and result payload — a lone call still gets the one-liner, and prose or a directive row ends a run. The WhatsApp reader (`/whatsapp`) omits the prop and keeps the default `renderTimeline`, so its rendering is unchanged; both presentations are test-pinned (`app/whatsapp/__tests__/Transcript-*.test.tsx` unmodified, `app/chat/__tests__/transcript-render.test.tsx` new).
2284
2287
 
2285
2288
  **Task 624 — maxy title for public sessions.** A `role=public` webchat spawn never produces a useful Claude Code `ai-title` (an anonymous one-line visitor turn), so every public row would otherwise read identically. The webchat route (`chat.ts`) composes a deterministic title — `Web · <senderId[:8]>[ · <personId>] · <UTC YYYY-MM-DD HH:mm>` (personId present only for gated visitors) — and threads it through the bridge (`dispatchOnce` → `managerSpawn`) to the manager `POST /spawn` body as `name`. `/spawn` validates it with `validateUserTitle` and, for `role=public` only, writes it into `UserTitleStore` so it occupies the operator-rename tier and wins over `ai-title`. Admin (`/rc-spawn`) and WhatsApp titling are unchanged. Observability: every public spawn logs `[spawn] role=public … title="…"` (or `title=missing`); the manager's row builder emits `[public-title] sessionId=… unexpected titleSource=<ai|null>` on the next list read for any public row that did not resolve from the user tier.
2286
2289
 
@@ -2331,6 +2334,21 @@ snapping back to the data root; the hash never reaches the server and `/data`
2331
2334
  has no client router, so the channel is isolated. `path=` is cleared at the
2332
2335
  root for a clean URL.
2333
2336
 
2337
+ **`/data` search — locate-in-files link and clear button (Task 791).** Every
2338
+ search hit is a `:FileArtifact` backed by a physical file, so each result card
2339
+ whose `relativePath` is a non-empty string carries a **locate link** (folder
2340
+ icon + containing folder; root-level files show `data`). Clicking it clears the
2341
+ active search (query, results, error, chip) and navigates the file browser to
2342
+ that folder via the same `path` state + `#path=` hash contract above, so the
2343
+ file appears among its siblings and a reload restores the place. The link is a
2344
+ sibling of the clickable card, so it never triggers the row's download. Hits
2345
+ without a usable `relativePath` render no link; one
2346
+ `console.warn('[data-search] op=locate-link-missing nodeId=…')` per result set
2347
+ surfaces the index gap, and each click logs
2348
+ `[data-search] op=locate nodeId=… folder=…`. The search bar shows an **× clear
2349
+ button** while it holds text — clicking empties the input, clears results
2350
+ (restoring the file-browser body), and refocuses the input.
2351
+
2334
2352
  ### Browser / device-browser
2335
2353
 
2336
2354
  | Mount | Purpose |
@@ -2444,7 +2462,7 @@ authoritative. This section names the surfaces and what backs each.
2444
2462
  | `+ New session` button | Opens `NewSessionModal`, which POSTs `{channel, permissionMode, model, initialMessage}` to `/api/admin/claude-sessions`. | `claude-sessions.ts` |
2445
2463
  | Mode trigger | Per-`(accountId, userId)` `SpawnPreference` for `permissionMode` and `model`; persists across reload, tab, device. | `session-defaults.ts` |
2446
2464
  | Nav rows (Chat / People / Agents / Projects / Tasks / Artefacts) | People, Agents, Tasks open the artefact-pane Graph filtered to the matching label. Chat selects the active conversation. Artefacts swaps the list to editable documents. | `graph-search.ts`, `graph-subgraph.ts`, `sidebar-artefacts.ts` |
2447
- | Sessions list (Active / Archived / All) | Live row store driven by SSE; manual reconcile button on the segmented control re-fetches the full id set. | `/claude-sessions/events`, `/claude-sessions` |
2465
+ | Sessions list (Active / Archived / All) | Live row store driven by SSE; manual reconcile button on the segmented control re-fetches the full id set. Every resumable row (not `resumable === false` public rows) carries two launch actions (Task 800): the claude.ai/code resume (`ExternalLink`) and a chat-launch (`MessageSquare`) that opens `/chat?session=<full sessionId>` — the admin webchat pointed at that exact session; sending there resumes a stopped session with the webchat channel bound to that id (see `admin-webchat-native-channel.md`, "Session-targeted mode"). At the ≤720 px drawer breakpoint each row stacks into two lines — dot + title + id/stamp, then the action icons — with a divider between rows and actions at full opacity (the desktop hover-gated 0.5 opacity never resolves on touch). | `/claude-sessions/events`, `/claude-sessions` |
2448
2466
  | Channel reader nav rows (WhatsApp / Telegram) | One conditional nav row **per interactive channel that has ≥1 admin session** (Task 738). Each row carries its brand glyph (WhatsApp `#25D366`, Telegram `#229ED9`); a channel with no admin session shows no row, and no install ever shows an always-empty "No conversations" row. The channel list loads **once on sidebar mount** (the per-channel counts must be known before the nav renders), so a failed load shows one muted, non-clickable line instead of channel rows. Clicking a channel row lists that channel's admin conversations; each conversation row shows a **display name** resolved by precedence `operatorName ?? whatsappName ?? senderId ?? title` (Task 747): the bound `Person givenName familyName` when a `senderId`→`userId` binding exists, else the persisted WhatsApp display name (`pushName`, read from the latest `:Message:WhatsAppMessage.senderName`), else the raw `senderId`, else the agent title; the agent session title is the hover tooltip only. Under the name each row shows a **last-message-time breadcrumb** (`conv-timestamp`, same markup as the Sessions rows) formatted from the row's `lastMessageAt` (the last parseable turn's `ts`); a session with no parseable turn shows no time, never "Invalid Date". A click on a conversation **opens its transcript on the home surface**: on `/` it selects in place, and from any other route (`/graph`, `/data`, `/browser`) it navigates to `/?wa=<sessionId>&projectDir=<dir>`, which the root shell hydrates on mount (then strips the query so a later refresh does not re-pin a closed conversation). Server logs `[wa-reader] op=operator-name-fallback senderId=… source=whatsapp-pushname` when the pushName fallback fires and `[wa-reader] op=conversations count=<n> withTimestamp=<m>` per list build; the client logs `[admin-ui] wa-open route=… via=<in-place\|navigate> …` and `[admin-ui] wa-hydrate route=/ …`. | `/whatsapp-reader/conversations` |
2449
2467
  | Channel transcript (`<Transcript>`) | Reads one session's JSONL over SSE (`/whatsapp-reader/stream`) and renders both sides plus tool calls — the turns claude.ai/code hides because channel inbound is stamped `isMeta`. Every turn shows its time-of-day (HH:MM from the turn's `ts`; a null/unparseable `ts` shows no time, never "Invalid Date"). `tool-call`/`tool-result` turns render as **collapsed cards** (chevron + label + time, default collapsed, expandable per card; one card's state never affects another) so the human↔agent text is not buried in JSON; the three conversation kinds always render in full. The thread **follows the tail**: it opens at the newest turn and pins to the bottom on each live append **only while the operator is already within 32 px of the bottom** — a scroll up suppresses the jump so reading history is never yanked. While the operator is scrolled up a **jump-to-bottom control** (`.wa-jump`, bottom-right of the viewport) appears; clicking it scrolls to the newest turn and re-arms follow-tail, and it hides again at the bottom (Task 747). The thread scrolls inside its grid cell (header/sidebar/footer fixed). The stream sends a 20 s heartbeat so an idle Cloudflare tunnel does not idle-drop, tags each frame with a byte-offset `id:`, and resumes from the client's `Last-Event-ID` on reconnect (no duplicate backlog); the client clears the "Stream disconnected" banner on reopen and latches it only on a terminal CLOSED state. The thread also interleaves a collapsed `⚙ directive injected (N B)` row per turn (Task 746), sorted by timestamp just before the turn it informed; expanding one fetches the exact stored `prompt-optimiser-directive` bytes for that turn. The entries are listed by `GET /whatsapp-reader/directives?sessionId=` and the bytes served by `GET /whatsapp-reader/directive?sessionId=&name=`, both admin-gated and account-scoped; a missing store degrades to no rows. | `/whatsapp-reader/stream`, `/whatsapp-reader/directives`, `/whatsapp-reader/directive` |
2450
2468
  | Conversations row hover actions | Inline rename, archive, delete, JSONL view / download per row. The historical `.conversations-modal` CSS block exists in `globals.css` but is no longer mounted from any TSX — Sidebar.tsx now owns every per-row affordance directly. | `claude-sessions.ts` |
@@ -53,7 +53,9 @@ Task 500 — **admin session management moved entirely to claude's own interface
53
53
 
54
54
  **Row title resolution.** Both the sidebar (`/sidebar-sessions`) and the manager's own row payload resolve a row's title in the same order: operator rename → Claude Code `ai-title` → first non-CLI user message → 8-char sessionId prefix. The operator-rename tier is the on-disk `<accountDir>/session-titles.json` (the manager's `UserTitleStore`), keyed by the CC sessionId — the sidebar reads that same file, so a write to the store lights up both surfaces with one write.
55
55
 
56
- **Task 785 — `/chat` empty-state greeting panel.** While the admin webchat has no conversation JSONL yet (`GET /api/webchat/session` → `projectDir:null`), `app/chat/page.tsx` renders a "What's up next, {givenName}?" greeting (given name = first whitespace token of the admin session's `userName`) above two read-only lists from `GET /api/webchat/greeting` (`server/routes/webchat-greeting.ts`, `requireAdminSession`-gated, `accountId`-scoped): the next 5 upcoming `:Event` rows (`eventStatus IN ['scheduled','due']`, future `COALESCE(nextRun, startDate)`, soonest first) and the outstanding `:Task` rows (`status IN ['pending','active','running']`, 5 shown + `+N more`). Read failure returns HTTP 200 `{ ok: false }` and the page shows the headline alone — the panel never blocks the composer. Logs: `[webchat:greeting] op=read account=<id8> events=<n> tasks=<n> ms=<n>` / `op=read-failed reason=…`; client warns `[admin-ui] greeting-unavailable …`. The full webchat architecture lives in `.docs/admin-webchat-native-channel.md`.
56
+ **Task 785 — `/chat` empty-state greeting panel.** While the admin webchat has no conversation JSONL yet (`GET /api/webchat/session` → `projectDir:null`), `app/chat/page.tsx` renders a "What's up next, {givenName}?" greeting (given name = first whitespace token of the admin session's `userName`) above two read-only lists from `GET /api/webchat/greeting` (`server/routes/webchat-greeting.ts`, `requireAdminSession`-gated, `accountId`-scoped): the next 5 upcoming `:Event` rows (`eventStatus IN ['scheduled','due']`, future `COALESCE(nextRun, startDate)`, soonest first) and the outstanding `:Task` rows (`status IN ['pending','active','running']`, 5 shown + `+N more`). Read failure returns HTTP 200 `{ ok: false }` and the page shows the headline alone — the panel never blocks the composer. **Task 792** adds a third section, **Your specialists**: the account's installed roster — every `*.md` under `data/accounts/<accountId>/specialists/agents/`, core and `--`-prefixed premium files alike — shown by frontmatter `name` + `summary` (fallback `description`), empty dir → "No specialists installed". The roster read (`app/lib/claude-agent/specialist-roster.ts`) is isolated from the graph fallback: malformed files are skipped (`op=specialist-skipped file=<name> reason=<…>`), a whole-roster failure degrades to `specialists: []` inside the `ok: true` payload (`op=specialists-read-failed`). Logs: `[webchat:greeting] op=read account=<id8> events=<n> tasks=<n> specialists=<n> ms=<n>` / `op=read-failed reason=…`; client warns `[admin-ui] greeting-unavailable …`. The full webchat architecture lives in `.docs/admin-webchat-native-channel.md`.
57
+
58
+ **Task 799 — `/chat` Claude-desktop transcript presentation.** The admin webchat keeps the shared `Transcript` shell (stream, follow-tail) but injects a /chat-only item renderer via the component's optional `renderItems` prop: `renderChatTimeline` in `app/chat/transcript-render.tsx`. Presentation: operator turns render as a right-aligned grey bubble with only the message text (no label, no per-turn time); all agent output renders as plain prose (the reply-document filename line stays, as prose); a maximal consecutive run of `tool-call`/`tool-result` turns renders as one collapsed grey one-liner ("Used N tools ›") whose expansion shows every call and result payload — a lone call still gets the one-liner, and prose or a directive row ends a run. The WhatsApp reader (`/whatsapp`) omits the prop and keeps the default `renderTimeline`, so its rendering is unchanged; both presentations are test-pinned (`app/whatsapp/__tests__/Transcript-*.test.tsx` unmodified, `app/chat/__tests__/transcript-render.test.tsx` new).
57
59
 
58
60
  **Task 624 — maxy title for public sessions.** A `role=public` webchat spawn never produces a useful Claude Code `ai-title` (an anonymous one-line visitor turn), so every public row would otherwise read identically. The webchat route (`chat.ts`) composes a deterministic title — `Web · <senderId[:8]>[ · <personId>] · <UTC YYYY-MM-DD HH:mm>` (personId present only for gated visitors) — and threads it through the bridge (`dispatchOnce` → `managerSpawn`) to the manager `POST /spawn` body as `name`. `/spawn` validates it with `validateUserTitle` and, for `role=public` only, writes it into `UserTitleStore` so it occupies the operator-rename tier and wins over `ai-title`. Admin (`/rc-spawn`) and WhatsApp titling are unchanged. Observability: every public spawn logs `[spawn] role=public … title="…"` (or `title=missing`); the manager's row builder emits `[public-title] sessionId=… unexpected titleSource=<ai|null>` on the next list read for any public row that did not resolve from the user tier.
59
61
 
@@ -104,6 +106,21 @@ snapping back to the data root; the hash never reaches the server and `/data`
104
106
  has no client router, so the channel is isolated. `path=` is cleared at the
105
107
  root for a clean URL.
106
108
 
109
+ **`/data` search — locate-in-files link and clear button (Task 791).** Every
110
+ search hit is a `:FileArtifact` backed by a physical file, so each result card
111
+ whose `relativePath` is a non-empty string carries a **locate link** (folder
112
+ icon + containing folder; root-level files show `data`). Clicking it clears the
113
+ active search (query, results, error, chip) and navigates the file browser to
114
+ that folder via the same `path` state + `#path=` hash contract above, so the
115
+ file appears among its siblings and a reload restores the place. The link is a
116
+ sibling of the clickable card, so it never triggers the row's download. Hits
117
+ without a usable `relativePath` render no link; one
118
+ `console.warn('[data-search] op=locate-link-missing nodeId=…')` per result set
119
+ surfaces the index gap, and each click logs
120
+ `[data-search] op=locate nodeId=… folder=…`. The search bar shows an **× clear
121
+ button** while it holds text — clicking empties the input, clears results
122
+ (restoring the file-browser body), and refocuses the input.
123
+
107
124
  ### Browser / device-browser
108
125
 
109
126
  | Mount | Purpose |
@@ -217,7 +234,7 @@ authoritative. This section names the surfaces and what backs each.
217
234
  | `+ New session` button | Opens `NewSessionModal`, which POSTs `{channel, permissionMode, model, initialMessage}` to `/api/admin/claude-sessions`. | `claude-sessions.ts` |
218
235
  | Mode trigger | Per-`(accountId, userId)` `SpawnPreference` for `permissionMode` and `model`; persists across reload, tab, device. | `session-defaults.ts` |
219
236
  | Nav rows (Chat / People / Agents / Projects / Tasks / Artefacts) | People, Agents, Tasks open the artefact-pane Graph filtered to the matching label. Chat selects the active conversation. Artefacts swaps the list to editable documents. | `graph-search.ts`, `graph-subgraph.ts`, `sidebar-artefacts.ts` |
220
- | Sessions list (Active / Archived / All) | Live row store driven by SSE; manual reconcile button on the segmented control re-fetches the full id set. | `/claude-sessions/events`, `/claude-sessions` |
237
+ | Sessions list (Active / Archived / All) | Live row store driven by SSE; manual reconcile button on the segmented control re-fetches the full id set. Every resumable row (not `resumable === false` public rows) carries two launch actions (Task 800): the claude.ai/code resume (`ExternalLink`) and a chat-launch (`MessageSquare`) that opens `/chat?session=<full sessionId>` — the admin webchat pointed at that exact session; sending there resumes a stopped session with the webchat channel bound to that id (see `admin-webchat-native-channel.md`, "Session-targeted mode"). At the ≤720 px drawer breakpoint each row stacks into two lines — dot + title + id/stamp, then the action icons — with a divider between rows and actions at full opacity (the desktop hover-gated 0.5 opacity never resolves on touch). | `/claude-sessions/events`, `/claude-sessions` |
221
238
  | Channel reader nav rows (WhatsApp / Telegram) | One conditional nav row **per interactive channel that has ≥1 admin session** (Task 738). Each row carries its brand glyph (WhatsApp `#25D366`, Telegram `#229ED9`); a channel with no admin session shows no row, and no install ever shows an always-empty "No conversations" row. The channel list loads **once on sidebar mount** (the per-channel counts must be known before the nav renders), so a failed load shows one muted, non-clickable line instead of channel rows. Clicking a channel row lists that channel's admin conversations; each conversation row shows a **display name** resolved by precedence `operatorName ?? whatsappName ?? senderId ?? title` (Task 747): the bound `Person givenName familyName` when a `senderId`→`userId` binding exists, else the persisted WhatsApp display name (`pushName`, read from the latest `:Message:WhatsAppMessage.senderName`), else the raw `senderId`, else the agent title; the agent session title is the hover tooltip only. Under the name each row shows a **last-message-time breadcrumb** (`conv-timestamp`, same markup as the Sessions rows) formatted from the row's `lastMessageAt` (the last parseable turn's `ts`); a session with no parseable turn shows no time, never "Invalid Date". A click on a conversation **opens its transcript on the home surface**: on `/` it selects in place, and from any other route (`/graph`, `/data`, `/browser`) it navigates to `/?wa=<sessionId>&projectDir=<dir>`, which the root shell hydrates on mount (then strips the query so a later refresh does not re-pin a closed conversation). Server logs `[wa-reader] op=operator-name-fallback senderId=… source=whatsapp-pushname` when the pushName fallback fires and `[wa-reader] op=conversations count=<n> withTimestamp=<m>` per list build; the client logs `[admin-ui] wa-open route=… via=<in-place\|navigate> …` and `[admin-ui] wa-hydrate route=/ …`. | `/whatsapp-reader/conversations` |
222
239
  | Channel transcript (`<Transcript>`) | Reads one session's JSONL over SSE (`/whatsapp-reader/stream`) and renders both sides plus tool calls — the turns claude.ai/code hides because channel inbound is stamped `isMeta`. Every turn shows its time-of-day (HH:MM from the turn's `ts`; a null/unparseable `ts` shows no time, never "Invalid Date"). `tool-call`/`tool-result` turns render as **collapsed cards** (chevron + label + time, default collapsed, expandable per card; one card's state never affects another) so the human↔agent text is not buried in JSON; the three conversation kinds always render in full. The thread **follows the tail**: it opens at the newest turn and pins to the bottom on each live append **only while the operator is already within 32 px of the bottom** — a scroll up suppresses the jump so reading history is never yanked. While the operator is scrolled up a **jump-to-bottom control** (`.wa-jump`, bottom-right of the viewport) appears; clicking it scrolls to the newest turn and re-arms follow-tail, and it hides again at the bottom (Task 747). The thread scrolls inside its grid cell (header/sidebar/footer fixed). The stream sends a 20 s heartbeat so an idle Cloudflare tunnel does not idle-drop, tags each frame with a byte-offset `id:`, and resumes from the client's `Last-Event-ID` on reconnect (no duplicate backlog); the client clears the "Stream disconnected" banner on reopen and latches it only on a terminal CLOSED state. The thread also interleaves a collapsed `⚙ directive injected (N B)` row per turn (Task 746), sorted by timestamp just before the turn it informed; expanding one fetches the exact stored `prompt-optimiser-directive` bytes for that turn. The entries are listed by `GET /whatsapp-reader/directives?sessionId=` and the bytes served by `GET /whatsapp-reader/directive?sessionId=&name=`, both admin-gated and account-scoped; a missing store degrades to no rows. | `/whatsapp-reader/stream`, `/whatsapp-reader/directives`, `/whatsapp-reader/directive` |
223
240
  | Conversations row hover actions | Inline rename, archive, delete, JSONL view / download per row. The historical `.conversations-modal` CSS block exists in `globals.css` but is no longer mounted from any TSX — Sidebar.tsx now owns every per-row affordance directly. | `claude-sessions.ts` |
@@ -39,7 +39,7 @@ Plugins are installed and managed through conversation. You can add marketplace
39
39
 
40
40
  ## Roles
41
41
 
42
- {{productName}} ships twelve roles it can dispatch for specific tasks — like members of your team. You don't need to configure or manage them — {{productName}} decides when to use each role and handles everything automatically. You may see activity like "Dispatching personal-assistant..." in the chat timeline when this happens.
42
+ {{productName}} ships thirteen roles it can dispatch for specific tasks — like members of your team. You don't need to configure or manage them — {{productName}} decides when to use each role and handles everything automatically. You may see activity like "Dispatching personal-assistant..." in the chat timeline when this happens.
43
43
 
44
44
  The catalogue below is what the platform ships. It is not evidence of what is installed on the current account. For the live install set on this account, ask {{productName}} to call `capabilities-here`.
45
45
 
@@ -50,6 +50,7 @@ The catalogue below is what the platform ships. It is not evidence of what is in
50
50
  | Coding Assistant | Runs shell commands, drives git repositories, and reads or edits code on your behalf — the specialist you reach for when the work belongs in a developer terminal. |
51
51
  | Compiled Truth Rewriter | Recomputes a node's compiledTruth (and public twin where applicable) from its 90-day timeline plus optional operator hints. |
52
52
  | Content Producer | Produces visual output from your graph: generates images, renders pages to PDF, and hosts static websites you upload as a zip. |
53
+ | Data Manager | Keeps the account data directory organised consistently with the graph ontology, pairing every file move with a database-operator reference update. |
53
54
  | Database Operator | Executes graph writes on admin's behalf when delegated via the Task tool — admin names each write, the specialist runs it. |
54
55
  | Librarian | Owns foreground ingest of documents, conversation transcripts, and external archives into the memory graph. |
55
56
  | Personal Assistant | Handles the operational tasks you'd give a personal assistant: scheduling meetings, managing your platform settings, connecting messaging channels, and completing browser-based tasks on your behalf. |
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAU3B,OAAO,EAgBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAoBzB,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgFhE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AA+MD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAu8DpD"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAU3B,OAAO,EAgBL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAqBzB,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgFhE,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,cAAc,EAAE,cAAc,CAAA;IAC9B;;;6BAGyB;IACzB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAoND;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAi+DpD"}
@@ -27,11 +27,12 @@ import { buildWaChannelMcpServers, buildWaChannelArgv, waChannelMcpConfigPath, i
27
27
  import { buildWebchatChannelMcpServers, buildWebchatChannelArgv, webchatChannelMcpConfigPath } from './webchat-channel-mcp.js';
28
28
  import { randomUUID } from 'node:crypto';
29
29
  import { execFileSync } from 'node:child_process';
30
- import { buildRcChildEnv } from './rc-daemon.js';
30
+ import { buildRcChildEnv, reapplyAdminLevers } from './rc-daemon.js';
31
31
  import { spawnClaudeSession, stopSession, writeInputToPty, isLive, onPtyExit, livePtyCount, liveSessionIds, getPtyTrackerForTests, livePidForSession, priorExitedCountForSession, PERMISSION_MODES, openFdCount, registerRcSpawnPty, } from './pty-spawner.js';
32
32
  import { writeScopeRecord, removeScopeRecord } from './scope-record.js';
33
33
  import { getScopeMainPid, defaultProcessSignals, defaultSystemctlRunner } from './systemd-scope.js';
34
34
  import { readSidecar, updateSidecar, appendBridgeId, writeSidecar } from './session-sidecar.js';
35
+ import { resolveSettingsPermissionMode } from './settings-permission-mode.js';
35
36
  import { emitRcLife } from './rc-life.js';
36
37
  import { readJsonlSession } from './jsonl-enumerator.js';
37
38
  import { watchInputSubmission, countUserEntries } from './input-postcondition.js';
@@ -473,6 +474,10 @@ export function buildHttpApp(deps) {
473
474
  model: null,
474
475
  permissionMode: sidecar?.permissionMode ?? null,
475
476
  effectivePermissionMode: sidecar?.effectivePermissionMode ?? null,
477
+ // Pre-index spawn return: no watcher row yet (or a senderId-less one).
478
+ // 'idle' mirrors the fs-watcher's default for a pidfile without a
479
+ // busy stamp; the row's real status takes over on the next read.
480
+ activity: row?.status ?? 'idle',
476
481
  };
477
482
  }
478
483
  /** Task 260 — single payload builder. Both live and archived rows
@@ -566,6 +571,7 @@ export function buildHttpApp(deps) {
566
571
  model,
567
572
  permissionMode: row.permissionMode,
568
573
  effectivePermissionMode: row.effectivePermissionMode,
574
+ activity: row.status,
569
575
  };
570
576
  }
571
577
  app.post('/public-spawn', async (c) => {
@@ -1529,6 +1535,16 @@ export function buildHttpApp(deps) {
1529
1535
  });
1530
1536
  });
1531
1537
  app.get('/healthz', (c) => c.json({ ok: true, sessions: livePtyCount() }));
1538
+ // Task 797 — /chat composer settings write-through. The UI server persists
1539
+ // the lever to account.json, then calls this so settings.json picks it up
1540
+ // for the next spawn (the boot-time merge, run on demand). No session gate,
1541
+ // like every manager route: the manager binds loopback-only, so the trust
1542
+ // boundary is the host, not the route.
1543
+ app.post('/reapply-levers', (c) => {
1544
+ const result = reapplyAdminLevers(deps.accountDir, deps.claudeConfigDir, deps.logger);
1545
+ deps.logger(`[manager] reapply-levers model=${result.model ?? 'unset'} effortLevel=${result.effortLevel ?? 'unset'}`);
1546
+ return c.json({ ok: true, ...result });
1547
+ });
1532
1548
  // Task 702 — process-truth liveness. The union of owned live PTYs and
1533
1549
  // reattached survivor scopes (status=detached). The dashboard dot, the
1534
1550
  // /rc-spawn reconcile, and the standing reconciler all read this instead of
@@ -1837,12 +1853,17 @@ export function buildHttpApp(deps) {
1837
1853
  name: name ?? 'none',
1838
1854
  existingJsonl: existingJsonlPath ?? 'none',
1839
1855
  });
1856
+ // Task 798 — the mode this session actually runs under. rc-spawn argv
1857
+ // carries no --permission-mode, so the binary resolves
1858
+ // settings.json permissions.defaultMode (else 'default'); mirror that
1859
+ // resolution for the classification sidecar and the lifeline.
1860
+ const settingsPermissionMode = resolveSettingsPermissionMode(deps.claudeConfigDir);
1840
1861
  // Step 2 — the exact claude argv (the inner command). The systemd-run
1841
1862
  // wrap is composed by the spawnPty adapter; logging the inner argv
1842
1863
  // here is enough for an operator to reproduce by hand. The wrapped
1843
1864
  // argv is fully reconstructible from this line + the spawn adapter
1844
1865
  // source (Task 250 / 556).
1845
- deps.logger(`[rc-spawn] op=argv unitToken=${unitToken} cwd=${deps.spawnCwd} argv=${JSON.stringify([deps.claudeBin, ...argv])}`);
1866
+ deps.logger(`[rc-spawn] op=argv unitToken=${unitToken} cwd=${deps.spawnCwd} permissionMode=${settingsPermissionMode} argv=${JSON.stringify([deps.claudeBin, ...argv])}`);
1846
1867
  emitRcLife(deps.logger, 'argv', 'rc-spawn', 'node-pty', rcLifeMode, unitToken, {
1847
1868
  cwd: deps.spawnCwd,
1848
1869
  argv: JSON.stringify([deps.claudeBin, ...argv]),
@@ -1935,7 +1956,11 @@ export function buildHttpApp(deps) {
1935
1956
  channel: classifyChannel,
1936
1957
  url: null,
1937
1958
  startedAt: new Date().toISOString(),
1938
- permissionMode: null,
1959
+ // Task 798 — settings-resolved (rc-spawn has no operator mode
1960
+ // choice); the /chat chip renders this. effectivePermissionMode
1961
+ // stays null: the Task 278 tail is auto-only and rc-spawn
1962
+ // passes no --debug=auto-mode.
1963
+ permissionMode: settingsPermissionMode,
1939
1964
  effectivePermissionMode: null,
1940
1965
  model: null,
1941
1966
  hidden: false,