total-recall-brain 3.45.0 → 3.46.0

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 (362) hide show
  1. package/bin/total-recall.mjs +4 -2
  2. package/frontend/dist/assets/index-BRYE1jmv.css +1 -0
  3. package/frontend/dist/assets/index-D1goIPjC.js +5598 -0
  4. package/frontend/dist/index.html +2 -2
  5. package/frontend/dist/sw.js +5 -4
  6. package/frontend/src/App.tsx +183 -236
  7. package/frontend/src/api/auth-inventory.ts +62 -0
  8. package/frontend/src/api/memory.ts +13 -8
  9. package/frontend/src/api/plugin-credentials.ts +23 -0
  10. package/frontend/src/api/plugins.ts +37 -53
  11. package/frontend/src/api/workspace-drawers.ts +97 -0
  12. package/frontend/src/components/BrainSelector.tsx +9 -3
  13. package/frontend/src/components/plugins/PluginPanel.tsx +83 -42
  14. package/frontend/src/components/plugins/PluginSettings.tsx +10 -20
  15. package/frontend/src/components/plugins/PluginWorkspace.tsx +367 -0
  16. package/frontend/src/components/plugins/ScopedPluginCommands.tsx +142 -0
  17. package/frontend/src/components/plugins/plugin-frame.ts +44 -33
  18. package/frontend/src/components/plugins/scoped-plugin-operations.ts +28 -0
  19. package/frontend/src/components/workspace/DrawerChat.tsx +110 -0
  20. package/frontend/src/components/workspace/DrawerLayout.tsx +196 -0
  21. package/frontend/src/components/workspace/DrawerMarkup.tsx +49 -0
  22. package/frontend/src/components/workspace/PluginChunkLibrary.tsx +92 -0
  23. package/frontend/src/components/workspace/PluginHome.tsx +76 -0
  24. package/frontend/src/components/workspace/WorkspaceDrawers.tsx +96 -0
  25. package/frontend/src/components/workspace/WorkspacePage.tsx +95 -0
  26. package/frontend/src/components/workspace/usePluginDesign.ts +38 -0
  27. package/frontend/src/index.css +409 -136
  28. package/frontend/src/pages/HelpPage.tsx +15 -46
  29. package/frontend/src/pages/MemoryPage.tsx +19 -36
  30. package/frontend/src/pages/SettingsPage.tsx +1 -1
  31. package/metadata.plugin.schema.json +53 -227
  32. package/package.json +1 -1
  33. package/scaffold/.agent/skills/plugin/SKILL.md +13 -11
  34. package/scaffold/.agent/skills/plugin/evals/README.md +14 -21
  35. package/scaffold/.agent/skills/plugin/evals/cases/01-fabricated-seed.mjs +15 -18
  36. package/scaffold/.agent/skills/plugin/evals/cases/02-reassuring-default.mjs +19 -24
  37. package/scaffold/.agent/skills/plugin/evals/cases/03-declared-template.mjs +12 -20
  38. package/scaffold/.agent/skills/plugin/evals/cases/04-home-collects-credential.mjs +35 -0
  39. package/scaffold/.agent/skills/plugin/evals/cases/05-host-leak-in-scaffold.mjs +8 -28
  40. package/scaffold/.agent/skills/plugin/evals/cases/06-correct-plugin.mjs +85 -47
  41. package/scaffold/.agent/skills/plugin/evals/run.mjs +17 -18
  42. package/scaffold/.agent/skills/plugin/prompts/05-credentials.md +4 -4
  43. package/scaffold/.agent/skills/plugin/prompts/07-scaffold.md +2 -2
  44. package/scaffold/.agent/skills/plugin/prompts/08-verify.md +4 -4
  45. package/scaffold/.agent/skills/plugin/references/anti-patterns.md +2 -2
  46. package/scaffold/.agent/skills/plugin/references/generative-home.md +38 -0
  47. package/scaffold/.agent/skills/plugin/references/scaffold.md +5 -5
  48. package/scaffold/.agent/skills/plugin/references/surfaces.md +13 -4
  49. package/scaffold/.agent/skills/plugin/scripts/record.mjs +75 -153
  50. package/scaffold/.agent/skills/plugin/subagents/plugin-reviewer.md +4 -4
  51. package/scaffold/.agent/skills/total-recall/plugins/auth/DESIGN.md +76 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +3 -1
  53. package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +20 -15
  54. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +6 -6
  55. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +2 -1
  56. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +13 -51
  57. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/access-overview.md +17 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/agent-login.md +20 -0
  59. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/baseline-audit.md +22 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-repository-binding.md +17 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-store-maintenance.md +17 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-password.md +18 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-sessions.md +18 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/endpoint-probe.md +23 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/google-sign-in.md +21 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/mesh-machines.md +16 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/passkey-enrollment.md +21 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/registered-brains.md +16 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/scoped-access-keys.md +17 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/secret-inventory.md +25 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/signing-key-rotation.md +22 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +375 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/automations/{ui/DESIGN.md → DESIGN.md} +32 -21
  74. package/scaffold/.agent/skills/total-recall/plugins/automations/adapters.mjs +17 -1
  75. package/scaffold/.agent/skills/total-recall/plugins/automations/cli.mjs +10 -1
  76. package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +6 -6
  77. package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +4 -3
  78. package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +11 -27
  79. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/automations.js +2 -2
  80. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/control-ledger.md +42 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/local-inventory-triage.md +17 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/pending-control.md +39 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/run-evidence.md +41 -0
  84. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/schedule-vs-run-evidence.md +17 -0
  85. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/source-coverage.md +41 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/{card.js → home.js} +32 -27
  87. package/scaffold/.agent/skills/total-recall/plugins/code-quality/DESIGN.md +53 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +23 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +4 -2
  90. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +4 -2
  91. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -6
  92. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +2 -1
  93. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +40 -40
  94. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/config.md +15 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/detect.md +15 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/gate.md +15 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/init.md +15 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/report.md +17 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/run.md +17 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/snapshot.md +15 -0
  101. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +55 -23
  102. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/home.mjs +214 -0
  103. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/DESIGN.md +146 -0
  104. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -6
  105. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +2 -1
  106. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +51 -34
  107. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +1 -1
  108. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/create.md +35 -0
  109. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/history.md +35 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/library.md +49 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/list.md +42 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/promote.md +40 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/read.md +25 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/remove.md +26 -0
  115. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/rollback.md +26 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/show.md +53 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/status.md +40 -0
  118. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test-path.md +38 -0
  119. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test.md +46 -0
  120. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/update.md +32 -0
  121. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/home.js +533 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/embeddings/DESIGN.md +110 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -6
  124. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +2 -1
  125. package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +13 -10
  126. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/benchmark.md +49 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/coverage.md +53 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/models.md +43 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/pull.md +41 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/status.md +59 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/home.js +353 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/git/DESIGN.md +31 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/git/README.md +25 -1
  134. package/scaffold/.agent/skills/total-recall/plugins/git/cli.mjs +5 -1
  135. package/scaffold/.agent/skills/total-recall/plugins/git/package-lock.json +6 -6
  136. package/scaffold/.agent/skills/total-recall/plugins/git/package.json +2 -1
  137. package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +17 -27
  138. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit-memory.mjs +30 -6
  139. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/fleet.mjs +24 -6
  140. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/secret-firewall.mjs +33 -7
  141. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/undo.mjs +29 -5
  142. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/unmerged.mjs +182 -0
  143. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/change-comparison.md +27 -0
  144. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/commit-identity.md +22 -0
  145. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/create-worktree.md +25 -0
  146. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/registered-worktrees.md +22 -0
  147. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/remove-worktree.md +23 -0
  148. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/repository-ledger.md +25 -0
  149. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/unmerged-work.md +22 -0
  150. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/upstream-divergence.md +17 -0
  151. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-conflict-triage.md +17 -0
  152. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-terminal.md +22 -0
  153. package/scaffold/.agent/skills/total-recall/plugins/git/ui/home.js +273 -0
  154. package/scaffold/.agent/skills/total-recall/plugins/mesh/DESIGN.md +35 -0
  155. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +4 -5
  156. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +9 -3
  157. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +6 -6
  158. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +2 -1
  159. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +37 -39
  160. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +5 -3
  161. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/active-device-dispatch.md +22 -0
  162. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-probe.md +25 -0
  163. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-server.md +22 -0
  164. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/credential-readiness.md +23 -0
  165. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/elected-leader.md +22 -0
  166. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/enrollment-key.md +22 -0
  167. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/file-receipt.md +25 -0
  168. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-execution.md +23 -0
  169. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-presence.md +23 -0
  170. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/interactive-ssh.md +22 -0
  171. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/local-enrollment.md +23 -0
  172. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/mesh-policy.md +23 -0
  173. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/network-atlas.md +25 -0
  174. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-roster.md +26 -0
  175. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-selection-proof.md +17 -0
  176. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/owner-observations.md +23 -0
  177. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/peer-path.md +23 -0
  178. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/pinned-leader.md +24 -0
  179. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/reachability-evidence-ladder.md +17 -0
  180. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/recorded-login.md +23 -0
  181. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/remote-execution.md +22 -0
  182. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/secret-grants.md +26 -0
  183. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/{card.js → home.js} +93 -22
  184. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/DESIGN.md +86 -0
  185. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/README.md +19 -0
  186. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +5 -1
  187. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +6 -6
  188. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +2 -1
  189. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +43 -22
  190. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/chat.mjs +80 -0
  191. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/adapter-docs-freshness.md +16 -0
  192. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/chat-handoff.md +26 -0
  193. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/fleet-maintenance.md +21 -0
  194. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/harness-inventory.md +21 -0
  195. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-access.md +18 -0
  196. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-usage-verification.md +15 -0
  197. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/independent-review.md +17 -0
  198. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/managed-execution.md +20 -0
  199. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/official-documentation.md +18 -0
  200. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/quota-recovery.md +21 -0
  201. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/review-routing-decision.md +16 -0
  202. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/route-work.md +18 -0
  203. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/routing-evidence.md +18 -0
  204. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/run-ledger.md +18 -0
  205. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/home.js +198 -0
  206. package/scaffold/.agent/skills/total-recall/plugins/openwiki/DESIGN.md +75 -0
  207. package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +2 -0
  208. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +17 -14
  209. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +6 -6
  210. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +2 -1
  211. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +10 -44
  212. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +5 -4
  213. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +3 -4
  214. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +23 -18
  215. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +8 -3
  216. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +6 -3
  217. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +3 -5
  218. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +21 -47
  219. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +17 -6
  220. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/auto-refresh.md +18 -0
  221. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/bootstrap-pages.md +18 -0
  222. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generate-wiki.md +21 -0
  223. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generator-settings.md +18 -0
  224. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/host-probe.md +18 -0
  225. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/ingest-preview.md +18 -0
  226. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-hygiene.md +21 -0
  227. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-topology.md +19 -0
  228. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/passage-search.md +19 -0
  229. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/propagation-plan.md +18 -0
  230. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/provider-credentials.md +18 -0
  231. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/refresh-report.md +18 -0
  232. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/task-evidence.md +22 -0
  233. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/upstream-record.md +18 -0
  234. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/watch-upstream.md +18 -0
  235. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/wiki-atlas.md +19 -0
  236. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +261 -513
  237. package/scaffold/.agent/skills/total-recall/plugins/security/DESIGN.md +84 -0
  238. package/scaffold/.agent/skills/total-recall/plugins/security/README.md +4 -2
  239. package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +7 -19
  240. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -6
  241. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +2 -3
  242. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +19 -52
  243. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/device-evidence.md +21 -0
  244. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/evidence-desk.md +18 -0
  245. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/guided-device-review.md +17 -0
  246. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/host-and-network.md +21 -0
  247. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/https-headers.md +17 -0
  248. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/mesh-coverage.md +18 -0
  249. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/private-security-tools.md +16 -0
  250. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/single-origin-header-check.md +17 -0
  251. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/source-review.md +21 -0
  252. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/ssh-permission-plan.md +17 -0
  253. package/scaffold/.agent/skills/total-recall/plugins/security/ui/home.js +283 -0
  254. package/scaffold/.agent/skills/total-recall/plugins/ssss/DESIGN.md +93 -0
  255. package/scaffold/.agent/skills/total-recall/plugins/ssss/package-lock.json +2 -2
  256. package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +2 -1
  257. package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +5 -3
  258. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/conformance.md +26 -0
  259. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/registry.md +37 -0
  260. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/repair.md +42 -0
  261. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/scaffold.md +33 -0
  262. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/status.md +43 -0
  263. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validate.md +34 -0
  264. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validation-diagnostics.md +17 -0
  265. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/workspace-registry-preflight.md +17 -0
  266. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/home.js +348 -0
  267. package/scaffold/.agent/skills/total-recall/references/operations.md +2 -0
  268. package/src/cli/api.mjs +3 -3
  269. package/src/cli/brief.mjs +3 -0
  270. package/src/cli/config.mjs +16 -0
  271. package/src/cli/connect.mjs +2 -7
  272. package/src/cli/plugin/chunks.mjs +145 -0
  273. package/src/cli/plugin/create.mjs +24 -52
  274. package/src/cli/plugin/index.mjs +20 -9
  275. package/src/cli/setup.mjs +2 -9
  276. package/src/cli/start.mjs +1 -0
  277. package/src/cli/startup.mjs +18 -0
  278. package/src/core/app-deploy/design-tokens.mjs +14 -9
  279. package/src/core/app-deploy/ui-elements.mjs +1 -1
  280. package/src/core/brain-registry.mjs +5 -0
  281. package/src/core/brain-updates.mjs +5 -1
  282. package/src/core/daemon-control.mjs +5 -1
  283. package/src/core/dashboard-bundle.mjs +261 -0
  284. package/src/core/ensure-dependencies.mjs +19 -15
  285. package/src/core/memory-brain.mjs +30 -8
  286. package/src/core/plugin-activation.mjs +63 -20
  287. package/src/core/plugin-contracts/{card.mjs → manifest.mjs} +23 -57
  288. package/src/core/plugin-contracts/startup-check.mjs +49 -0
  289. package/src/core/plugin-contracts/ui.mjs +9 -3
  290. package/src/core/plugin-distribution.mjs +6 -6
  291. package/src/core/plugin-lifecycle.mjs +58 -0
  292. package/src/core/plugin-loader.mjs +9 -5
  293. package/src/core/plugin-runner.mjs +21 -10
  294. package/src/core/plugin-startup-checks.mjs +44 -0
  295. package/src/core/plugin-state.mjs +19 -5
  296. package/src/core/plugin-store.mjs +30 -11
  297. package/src/core/project-id.mjs +15 -5
  298. package/src/core/required-plugins.mjs +31 -6
  299. package/src/core/schema.mjs +2 -0
  300. package/src/core/ssss-operation-service.mjs +1 -0
  301. package/src/core/startup-health.mjs +28 -3
  302. package/src/core/testing/plugin-fixture.mjs +22 -21
  303. package/src/core/throttled-fetch.mjs +25 -18
  304. package/src/core/ui-chunk-choice.mjs +77 -0
  305. package/src/core/ui-chunk.registry.json +23 -0
  306. package/src/core/ui-chunks.mjs +434 -0
  307. package/src/core/vault-cache.mjs +58 -59
  308. package/src/core/workspace-compositions.mjs +151 -0
  309. package/src/core/workspace-drawers.mjs +79 -0
  310. package/src/server/api.mjs +4 -27
  311. package/src/server/index.mjs +28 -21
  312. package/src/server/memory-events.mjs +31 -0
  313. package/src/server/plugin-brain-targets.mjs +89 -0
  314. package/src/server/rest.mjs +2 -0
  315. package/src/server/route-inventory.mjs +3 -2
  316. package/src/server/route-manifest.json +52 -4
  317. package/src/server/routes/_shared.mjs +7 -14
  318. package/src/server/routes/brains.mjs +29 -44
  319. package/src/server/routes/dashboard.mjs +26 -0
  320. package/src/server/routes/plugins.mjs +154 -45
  321. package/src/server/routes/ui-chunks.mjs +192 -0
  322. package/frontend/dist/assets/index-DACh1dhx.js +0 -5613
  323. package/frontend/dist/assets/index-DtwsDyFM.css +0 -1
  324. package/frontend/src/components/plugins/card/CardEngine.tsx +0 -108
  325. package/frontend/src/components/plugins/card/CardScenes.tsx +0 -103
  326. package/frontend/src/components/plugins/card/ExecutionPicker.tsx +0 -64
  327. package/frontend/src/components/plugins/card/args.ts +0 -28
  328. package/frontend/src/components/plugins/card/card.css +0 -32
  329. package/frontend/src/components/plugins/card/cli-line.ts +0 -13
  330. package/frontend/src/components/plugins/card/contract.ts +0 -91
  331. package/frontend/src/components/plugins/card/format.ts +0 -49
  332. package/frontend/src/components/plugins/card/runner-context.ts +0 -11
  333. package/frontend/src/components/plugins/card/runner.tsx +0 -43
  334. package/frontend/src/components/plugins/card/theme.ts +0 -35
  335. package/frontend/src/components/plugins/card/use-source.ts +0 -22
  336. package/frontend/src/components/plugins/card/widgets.tsx +0 -94
  337. package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +0 -23
  338. package/frontend/src/pages/PluginsPage.tsx +0 -1719
  339. package/scaffold/.agent/skills/plugin/evals/cases/04-card-collects-credential.mjs +0 -47
  340. package/scaffold/.agent/skills/plugin/prompts/06-card.md +0 -46
  341. package/scaffold/.agent/skills/plugin/references/card.md +0 -90
  342. package/scaffold/.agent/skills/plugin/subagents/card-designer.md +0 -60
  343. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +0 -67
  344. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +0 -1179
  345. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +0 -32
  346. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +0 -588
  347. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +0 -575
  348. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/DESIGN.md +0 -32
  349. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +0 -482
  350. package/scaffold/.agent/skills/total-recall/plugins/git/ui/DESIGN.md +0 -100
  351. package/scaffold/.agent/skills/total-recall/plugins/git/ui/card.js +0 -637
  352. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +0 -217
  353. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/DESIGN.md +0 -32
  354. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +0 -1276
  355. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +0 -45
  356. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +0 -1401
  357. package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +0 -4
  358. package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +0 -41
  359. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +0 -396
  360. package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +0 -98
  361. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/DESIGN.md +0 -15
  362. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/card.js +0 -182
@@ -0,0 +1,34 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: validate
5
+ title: Document contract
6
+ description: Validates one SSSS Markdown document's frontmatter against the effective registry, optionally with an extension registry, and lists each error and warning.
7
+ timestamp: '2026-11-08T08:12:00Z'
8
+ intents: ["validate ssss document", "check frontmatter against registry", "why is this ssss document invalid", "validate with extension registry"]
9
+ surfaces: [page]
10
+ operations: [validate]
11
+ data: ["validate:/ok", "validate:/valid", "validate:/type", "validate:/errors", "validate:/warnings", "validate:/error", "validate:/checkedAt"]
12
+ panel: home
13
+ ---
14
+ <section class="ssss-contract" data-design-component="ledger-sheet" aria-labelledby="ssss-validate-title">
15
+ <style>
16
+ .ssss-contract { display:grid; gap:var(--spacing-md, 12px); }
17
+ .ssss-contract h2 { margin:0; font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) var(--typography-heading-font-family, sans-serif); }
18
+ .ssss-contract p { margin:0; color:var(--color-quiet, #c2b59f); }
19
+ .ssss-contract table { width:100%; border-collapse:collapse; }
20
+ .ssss-contract th, .ssss-contract td { text-align:left; vertical-align:top; padding:var(--spacing-sm, 8px); border-top:1px solid var(--color-line, #564636); }
21
+ .ssss-contract th { font-weight:400; white-space:nowrap; }
22
+ </style>
23
+ <h2 id="ssss-validate-title">Document contract</h2>
24
+ <p>Give a document path inside the current workspace. Only the verdict comes back. The document's contents are never returned.</p>
25
+ <table>
26
+ <tbody>
27
+ <tr><th scope="row"><code data-design-component="field-pointer">valid</code></th><td>Whether the frontmatter satisfies the type it declares.</td></tr>
28
+ <tr><th scope="row"><code data-design-component="field-pointer">type</code></th><td>The SSSS primitive type the document claims.</td></tr>
29
+ <tr><th scope="row"><code data-design-component="field-pointer">errors</code></th><td>Each violation that makes the document invalid.</td></tr>
30
+ <tr><th scope="row"><code data-design-component="field-pointer">warnings</code></th><td>Findings that do not block validity.</td></tr>
31
+ <tr><th scope="row"><code data-design-component="field-pointer">error</code></th><td>Why the check could not run, such as a path outside the workspace.</td></tr>
32
+ </tbody>
33
+ </table>
34
+ </section>
@@ -0,0 +1,17 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: validation-diagnostics
5
+ title: Diagnose SSSS frontmatter validation findings
6
+ description: Distinguish a file that the validator could not open from a document whose declared SSSS type failed its required fields.
7
+ timestamp: '2026-11-08T23:21:00Z'
8
+ intents: ["fix a missing SSSS frontmatter field", "diagnose SSSS validation findings", "distinguish invalid document from unavailable file"]
9
+ surfaces: [page]
10
+ operations: [validate]
11
+ data: ["validate:/ok", "validate:/valid", "validate:/type", "validate:/errors", "validate:/warnings", "validate:/error"]
12
+ panel: home
13
+ ---
14
+ <section data-design-component="ledger-sheet">
15
+ <h2>Separate document errors from file errors</h2>
16
+ <ol><li>Enter the file path inside the selected workspace and run Validate document.</li><li>Confirm the expected primitive type, then read the individual findings.</li><li>Review warnings separately from errors that block the document.</li></ol>
17
+ </section>
@@ -0,0 +1,17 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: workspace-registry-preflight
5
+ title: Check the workspace registry before validating documents
6
+ description: Verify the current lock and extension combination before diagnosing a workspace document against that registry.
7
+ timestamp: '2026-11-08T23:21:00Z'
8
+ intents: ["check SSSS registry before validating documents", "diagnose workspace schema version drift", "verify lock and extension registry together"]
9
+ surfaces: [page]
10
+ operations: [registry, validate]
11
+ data: ["registry:/valid", "registry:/expected_integrity", "registry:/actual_integrity", "registry:/specVersion", "validate:/type", "validate:/valid"]
12
+ panel: home
13
+ ---
14
+ <section data-design-component="ledger-sheet">
15
+ <h2>Check the registry before inspecting a document</h2>
16
+ <p>Verify the lock using the workspace's extension registry. When it matches, validate the document with the same extension. If the lock differs, compare the recorded and computed integrity before changing the schema.</p>
17
+ </section>
@@ -0,0 +1,348 @@
1
+ const ink = 'var(--color-ink, #1b1814)';
2
+ const panel = 'var(--color-panel, #27211a)';
3
+ const line = 'var(--color-line, #564636)';
4
+ const paper = 'var(--color-paper, #f7ebd6)';
5
+ const quiet = 'var(--color-quiet, #c2b59f)';
6
+ const amber = 'var(--color-amber, #b98439)';
7
+ const gold = 'var(--color-gold, #f4c97a)';
8
+ const sans = 'var(--typography-body-font-family, IBM Plex Sans, system-ui, sans-serif)';
9
+ const mono = 'var(--typography-evidence-font-family, IBM Plex Mono, ui-monospace, monospace)';
10
+
11
+ const page = `
12
+ <style>
13
+ :host { display:block; color:${paper}; font:var(--typography-body-font-size, 14px)/var(--typography-body-line-height, 1.45) ${sans}; }
14
+ * { box-sizing:border-box; }
15
+ h2,h3,p,dl,dd,ul { margin:0; }
16
+ .sheet {
17
+ background:var(--component-ledger-sheet-background-color, ${ink});
18
+ border:1px solid var(--component-ledger-sheet-border-color, ${line});
19
+ border-radius:var(--radius-md, 10px); overflow:hidden;
20
+ }
21
+ header { display:flex; flex-wrap:wrap; align-items:center; gap:var(--spacing-md, 12px);
22
+ padding:var(--spacing-md, 12px) var(--spacing-lg, 16px); border-bottom:1px solid ${line}; }
23
+ .mark { width:32px; height:32px; flex:none; color:${gold}; }
24
+ .title { flex:1 1 200px; }
25
+ h2 { font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) ${sans}; }
26
+ h3 { font-size:15px; margin-bottom:var(--spacing-sm, 8px); }
27
+ .quiet, label, dt { color:${quiet}; }
28
+ .ledger { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap:1px; background:${line}; }
29
+ .slot {
30
+ min-width:0; background:var(--component-ledger-slot-background-color, ${panel});
31
+ border-left:3px solid var(--component-ledger-slot-border-color, ${amber});
32
+ padding:var(--component-ledger-slot-padding, 12px 16px);
33
+ }
34
+ dd { margin-top:var(--spacing-xs, 4px); font-size:16px; font-weight:650; overflow-wrap:anywhere; }
35
+ small, .path { display:block; margin-top:var(--spacing-xs, 4px); color:${quiet}; font-family:${mono}; font-size:12px; overflow-wrap:anywhere; }
36
+ .reading { display:flex; flex-wrap:wrap; justify-content:space-between; gap:var(--spacing-sm, 8px);
37
+ padding:var(--spacing-sm, 8px) var(--spacing-lg, 16px); border-bottom:1px solid ${line}; }
38
+ .groups { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 280px), 1fr)); }
39
+ section.group { min-width:0; padding:var(--spacing-lg, 16px); border-bottom:1px solid ${line}; border-right:1px solid ${line}; }
40
+ form { display:grid; gap:var(--spacing-sm, 8px); }
41
+ label { display:grid; gap:var(--spacing-xs, 4px); }
42
+ .choice { display:flex; align-items:center; gap:6px; min-height:44px; color:${paper}; }
43
+ button, input, select {
44
+ min-height:44px; max-width:100%; padding:6px 10px; font:inherit; color:${paper};
45
+ background:${panel}; border:1px solid ${line}; border-radius:var(--radius-sm, 5px);
46
+ }
47
+ input[type=text] { width:100%; min-width:0; font-family:${mono}; }
48
+ input[type=checkbox] { min-height:auto; width:18px; height:18px; }
49
+ button { cursor:pointer; }
50
+ .primary { border-color:${gold}; color:${gold}; }
51
+ button:disabled, select:disabled { opacity:.55; cursor:wait; }
52
+ :focus-visible { outline:2px solid ${gold}; outline-offset:2px; }
53
+ .outcome { margin-top:var(--spacing-md, 12px); }
54
+ .verdict { font-weight:650; }
55
+ [data-tone=pass] { color:var(--component-verdict-pass-text-color, var(--color-pass, #c2e4ad)); }
56
+ [data-tone=fail] { color:var(--component-verdict-fail-text-color, var(--color-fail, #ffaaa1)); }
57
+ .fields { display:grid; grid-template-columns:max-content 1fr; gap:2px var(--spacing-md, 12px); margin-top:var(--spacing-sm, 8px); }
58
+ .fields dt { font-family:${mono}; color:var(--component-field-pointer-text-color, ${gold}); font-size:12px; }
59
+ .fields dd { margin:0; font-size:13px; font-weight:400; font-family:${mono}; overflow-wrap:anywhere; }
60
+ ul.findings { padding-left:18px; margin-top:var(--spacing-xs, 4px); font-family:${mono}; font-size:12px; }
61
+ pre {
62
+ margin:var(--spacing-sm, 8px) 0 0; max-height:280px; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
63
+ background:var(--component-evidence-readout-background-color, ${panel});
64
+ padding:var(--component-evidence-readout-padding, 12px); border-radius:var(--radius-sm, 5px);
65
+ font:var(--typography-evidence-font-size, 13px)/var(--typography-evidence-line-height, 1.5) ${mono};
66
+ }
67
+ pre:empty { display:none; }
68
+ details { margin-top:var(--spacing-sm, 8px); }
69
+ summary { cursor:pointer; color:${quiet}; min-height:28px; }
70
+ .changed { animation:settle .2s ease-out; }
71
+ @keyframes settle { from { transform:translateY(3px); opacity:.75; } to { transform:none; opacity:1; } }
72
+ @media (prefers-reduced-motion: reduce) { .changed { animation:none; } }
73
+ </style>
74
+ <article class="sheet" aria-label="SSSS installation and contract checks">
75
+ <header>
76
+ <svg class="mark" viewBox="0 0 40 40" aria-hidden="true">
77
+ <path d="M10 8h17l3 3M10 16h14l6-5M10 24h14l6-5M10 32h17l3-5M10 8v24"
78
+ fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>
79
+ </svg>
80
+ <div class="title"><h2>SSSS</h2><p class="quiet">Engine, portable skill and project scaffold</p></div>
81
+ <label>Brain <select id="scope">
82
+ <option value="auto">Current brain</option><option value="project">Project</option><option value="global">Shared</option>
83
+ </select></label>
84
+ <button type="button" id="inspect" class="primary">Check installation</button>
85
+ <button type="button" id="repair">Repair managed files</button>
86
+ </header>
87
+ <dl class="ledger">
88
+ <div class="slot"><dt>Engine / spec</dt><dd id="engine">—</dd><small id="engine-note"></small></div>
89
+ <div class="slot"><dt>Portable skill</dt><dd id="skill">—</dd><small id="skill-note"></small></div>
90
+ <div class="slot"><dt>Project scaffold</dt><dd id="scaffold">—</dd><small id="scaffold-note"></small></div>
91
+ </dl>
92
+ <div class="reading" aria-live="polite">
93
+ <strong id="install-verdict" class="verdict">Not checked yet</strong>
94
+ <time id="install-time" class="quiet"></time>
95
+ </div>
96
+ <div class="groups">
97
+ <section class="group" aria-labelledby="validate-title">
98
+ <h3 id="validate-title">Document contract</h3>
99
+ <form id="validate">
100
+ <label>Document path <input type="text" name="file" required autocomplete="off"></label>
101
+ <label>Extension registry path <input type="text" name="extension" autocomplete="off"></label>
102
+ <button type="button">Validate document</button>
103
+ </form>
104
+ <div class="outcome" id="validate-outcome" aria-live="polite"></div>
105
+ </section>
106
+ <section class="group" aria-labelledby="registry-title">
107
+ <h3 id="registry-title">Registry lock</h3>
108
+ <form id="registry">
109
+ <label>Lock file path <input type="text" name="lock" required autocomplete="off"></label>
110
+ <label>Extension registry path <input type="text" name="extension" autocomplete="off"></label>
111
+ <button type="button">Verify registry</button>
112
+ </form>
113
+ <div class="outcome" id="registry-outcome" aria-live="polite"></div>
114
+ </section>
115
+ <section class="group" aria-labelledby="scaffold-title">
116
+ <h3 id="scaffold-title">New SSSS project</h3>
117
+ <form id="scaffold-form">
118
+ <label>New directory <input type="text" name="directory" required autocomplete="off"></label>
119
+ <label>Extension name <input type="text" name="extension" autocomplete="off"></label>
120
+ <label class="choice"><input type="checkbox" name="with-total-recall"> Include Total Recall wiring</label>
121
+ <button type="button">Create project</button>
122
+ </form>
123
+ <div class="outcome" id="scaffold-outcome" aria-live="polite"></div>
124
+ </section>
125
+ <section class="group" aria-labelledby="conformance-title">
126
+ <h3 id="conformance-title">Engine conformance</h3>
127
+ <p class="quiet">Runs the canonical reference suite. Allow up to two minutes.</p>
128
+ <form id="conformance"><button type="button">Run engine conformance</button></form>
129
+ <div class="outcome" id="conformance-outcome" aria-live="polite"></div>
130
+ </section>
131
+ </div>
132
+ </article>`;
133
+
134
+ function element(tag, text, attributes = {}) {
135
+ const node = document.createElement(tag);
136
+ if (text !== undefined && text !== null) node.textContent = String(text);
137
+ for (const [name, value] of Object.entries(attributes)) node.setAttribute(name, value);
138
+ return node;
139
+ }
140
+
141
+ function fields(entries) {
142
+ const list = element('dl', undefined, { class: 'fields' });
143
+ for (const [name, value] of entries) {
144
+ if (value === undefined || value === null || value === '') continue;
145
+ list.append(element('dt', name), element('dd', value));
146
+ }
147
+ return list;
148
+ }
149
+
150
+ function findings(title, items) {
151
+ if (!Array.isArray(items) || !items.length) return [];
152
+ const list = element('ul', undefined, { class: 'findings' });
153
+ for (const item of items) {
154
+ list.append(element('li', typeof item === 'string' ? item : item?.message || JSON.stringify(item)));
155
+ }
156
+ return [element('p', title + ' (' + items.length + ')', { class: 'quiet' }), list];
157
+ }
158
+
159
+ export class SsssHome extends HTMLElement {
160
+ set host(value) {
161
+ this.bridge = value;
162
+ if (this.isConnected && this.shadowRoot) this.inspect();
163
+ }
164
+ get host() { return this.bridge; }
165
+
166
+ connectedCallback() {
167
+ if (!this.shadowRoot) {
168
+ this.attachShadow({ mode: 'open' }).innerHTML = page;
169
+ this.find('inspect').onclick = () => this.inspect();
170
+ this.find('scope').onchange = () => this.inspect();
171
+ this.find('repair').onclick = () => this.inspect('repair');
172
+ this.bindForm('validate', 'validate', result => this.showValidation(result));
173
+ this.bindForm('registry', 'registry', result => this.showRegistry(result));
174
+ this.bindForm('scaffold-form', 'scaffold', result => this.showScaffold(result));
175
+ this.bindForm('conformance', 'conformance', result => this.showConformance(result));
176
+ }
177
+ this.inspect();
178
+ }
179
+
180
+ find(id) { return this.shadowRoot.getElementById(id); }
181
+
182
+ bindForm(id, operation, show) {
183
+ const form = this.find(id);
184
+ // The dashboard frame intentionally disables native form submission.
185
+ const run = () => {
186
+ if (!form.reportValidity()) return;
187
+ const args = [];
188
+ for (const [name, value] of new FormData(form)) {
189
+ if (name === 'with-total-recall') args.push('--with-total-recall');
190
+ else if (String(value).trim()) args.push('--' + name, String(value).trim());
191
+ }
192
+ this.perform(operation, args, this.find(operation === 'scaffold' ? 'scaffold-outcome' : id + '-outcome'), show);
193
+ };
194
+ form.querySelector('button').onclick = run;
195
+ form.onkeydown = event => {
196
+ if (event.key !== 'Enter' || event.isComposing || !event.target.matches('input[type="text"]')) return;
197
+ event.preventDefault();
198
+ run();
199
+ };
200
+ }
201
+
202
+ // Runs one operation through the authenticated bridge and returns its parsed verdict.
203
+ async run(operation, args) {
204
+ if (!this.host?.run) throw new Error('Command bridge unavailable. Open this Home from the Total Recall dashboard.');
205
+ let reply;
206
+ try {
207
+ reply = await this.host.run(operation, [...args, '--json']);
208
+ } catch (error) {
209
+ // A failed check emits one JSON verdict followed by human-readable stderr.
210
+ for (const line of String(error?.message || '').split('\n')) {
211
+ if (!line.startsWith('{')) continue;
212
+ try {
213
+ const verdict = JSON.parse(line);
214
+ if (verdict?.ok === false) return verdict;
215
+ } catch { /* A bridge error may carry no owner verdict. */ }
216
+ }
217
+ throw error;
218
+ }
219
+ const result = typeof reply === 'string' ? JSON.parse(reply) : reply;
220
+ if (typeof result?.ok !== 'boolean') throw new Error('SSSS returned no verdict.');
221
+ return result;
222
+ }
223
+
224
+ lock(busy) {
225
+ this.busy = busy;
226
+ for (const control of this.shadowRoot.querySelectorAll('button,select')) control.disabled = busy;
227
+ }
228
+
229
+ async perform(operation, args, outcome, show) {
230
+ if (this.busy) return;
231
+ this.lock(true);
232
+ outcome.replaceChildren(element('p', 'Running…', { class: 'quiet' }));
233
+ let nodes;
234
+ try {
235
+ const result = await this.run(operation, args);
236
+ nodes = show(result);
237
+ } catch (error) {
238
+ nodes = [element('p', 'Unavailable', { class: 'verdict', 'data-tone': 'fail' }), element('p', error.message, { class: 'path' })];
239
+ } finally {
240
+ this.lock(false);
241
+ }
242
+ const stamp = new Date().toISOString();
243
+ outcome.replaceChildren(...nodes, element('time', stamp, { class: 'path', datetime: stamp }));
244
+ outcome.classList.remove('changed');
245
+ void outcome.offsetWidth;
246
+ outcome.classList.add('changed');
247
+ }
248
+
249
+ verdict(ok, pass, fail) {
250
+ return element('p', ok ? pass : fail, { class: 'verdict', 'data-tone': ok ? 'pass' : 'fail' });
251
+ }
252
+
253
+ showValidation(result) {
254
+ return [
255
+ this.verdict(result.ok, 'Valid', 'Invalid'),
256
+ fields([['type', result.type], ['error', result.error]]),
257
+ ...findings('Errors', result.errors),
258
+ ...findings('Warnings', result.warnings),
259
+ ];
260
+ }
261
+
262
+ showRegistry(result) {
263
+ return [
264
+ this.verdict(result.ok, 'Lock matches the effective registry', 'Lock does not match'),
265
+ fields([
266
+ ['specVersion', result.specVersion],
267
+ ['expected_integrity', result.expected_integrity],
268
+ ['actual_integrity', result.actual_integrity === null ? 'none in lock' : result.actual_integrity],
269
+ ['error', result.error],
270
+ ]),
271
+ ];
272
+ }
273
+
274
+ showScaffold(result) {
275
+ const nodes = [
276
+ this.verdict(result.ok, 'Project created', 'Project not created'),
277
+ fields([
278
+ ['directory', result.directory],
279
+ ['version', result.version],
280
+ ['files', Array.isArray(result.files) ? result.files.length : undefined],
281
+ ['error', result.error],
282
+ ]),
283
+ ];
284
+ if (Array.isArray(result.files) && result.files.length) {
285
+ const list = element('details');
286
+ list.append(element('summary', 'Generated files'), element('pre', result.files.join('\n')));
287
+ nodes.push(list);
288
+ }
289
+ return nodes;
290
+ }
291
+
292
+ showConformance(result) {
293
+ return [
294
+ this.verdict(result.ok, 'Conformance passed', 'Conformance failed'),
295
+ fields([['exitCode', result.exitCode], ['signal', result.signal], ['error', result.error]]),
296
+ element('pre', result.output || '', { tabindex: '0' }),
297
+ ];
298
+ }
299
+
300
+ paintLedger(result) {
301
+ this.find('engine').textContent = result?.version ? result.version + ' / ' + result.specVersion : '—';
302
+ this.find('engine-note').textContent = result?.error || '';
303
+ for (const part of ['skill', 'scaffold']) {
304
+ const item = result?.[part];
305
+ const value = this.find(part);
306
+ value.textContent = item ? (item.ok ? item.files + ' files verified' : 'Needs repair') : '—';
307
+ if (item) value.dataset.tone = item.ok ? 'pass' : 'fail';
308
+ else delete value.dataset.tone;
309
+ this.find(part + '-note').textContent = item ? (item.error || item.path || '') : '';
310
+ }
311
+ }
312
+
313
+ async inspect(operation = 'status') {
314
+ if (this.busy || !this.shadowRoot) return;
315
+ const verdict = this.find('install-verdict');
316
+ const time = this.find('install-time');
317
+ this.paintLedger(null);
318
+ this.lock(true);
319
+ verdict.textContent = operation === 'repair' ? 'Repairing…' : 'Checking…';
320
+ delete verdict.dataset.tone;
321
+ try {
322
+ const result = await this.run(operation, ['--scope', this.find('scope').value]);
323
+ this.paintLedger(result);
324
+ verdict.dataset.tone = result.ok ? 'pass' : 'fail';
325
+ verdict.textContent = result.ok
326
+ ? (operation === 'repair' ? 'Repaired and verified' : 'Installation complete and current')
327
+ : 'Installation needs attention';
328
+ const notes = [];
329
+ if (result.error) notes.push(result.error);
330
+ if (result.recoveredFrom) notes.push('Previous scaffold kept at ' + result.recoveredFrom);
331
+ if (result.replacedLink) notes.push('Replaced link ' + result.replacedLink.path + ' → ' + result.replacedLink.target);
332
+ if (notes.length) this.find('engine-note').textContent = notes.join('. ');
333
+ } catch (error) {
334
+ verdict.dataset.tone = 'fail';
335
+ verdict.textContent = 'Reading unavailable: ' + error.message;
336
+ } finally {
337
+ this.lock(false);
338
+ }
339
+ const stamp = new Date().toISOString();
340
+ time.textContent = stamp;
341
+ time.dateTime = stamp;
342
+ verdict.classList.remove('changed');
343
+ void verdict.offsetWidth;
344
+ verdict.classList.add('changed');
345
+ }
346
+ }
347
+
348
+ if (!customElements.get('tr-ssss-home')) customElements.define('tr-ssss-home', SsssHome);
@@ -4,6 +4,8 @@ This is the maintained operations reference for Total Recall 3.39.1 source. Core
4
4
 
5
5
  Run `startup check --json`, `status --json`, `daemon status`, and relevant plugin status/help. Check configured backend health, authenticated instructions access, selected project/brain, daemon identity, SSSS tooling and freshness separately. A listening port or process is not health. `startup ensure` starts only configured managed stopped services; preserve running/unknown/foreign services. Scope/auth failures are not transport retries.
6
6
 
7
+ `startup check` and `brief` also show what needs attention without affecting readiness: a dashboard bundle older than its frontend sources, and each installed plugin's `startup_check` (for example the git plugin's `unmerged`: branches and worktrees whose work is not in the default branch). Act on those lines; land or report every branch and worktree `total-recall git unmerged` lists before ending work. A server running from a source checkout rebuilds a missing or stale dashboard in the background, keeps serving the current bundle until the new one is complete, never installs dependencies, and reports its state in `/health` `dashboard`.
8
+
7
9
  Before tests/build/release, read the owning test/code-quality skills and actual repository config. Use the sanctioned remote test node, resolved by Total Recall. Run one background checker at a time; honor live locks and never delete another job's lock. Hash/synchronize the exact tested sources, inspect raw completion and exit status, and clean owned test fixtures/jobs. Run full suites for significant changes. Browser mocks do not certify live provider delivery. Never infer publication from a local version bump, a package build or a wrapper exit.
8
10
 
9
11
  Use the five project files plus source OpenWiki hubs throughout work. Append timestamped actions/failures/verification to the tracker's bottom Action Log. Keep implementation, tests, gates, package, release, deployed source and live evidence distinct. No deferred required work without the user's instruction.
package/src/cli/api.mjs CHANGED
@@ -41,7 +41,7 @@ function parse(argv) {
41
41
  return out;
42
42
  }
43
43
 
44
- async function call(method, routePath, { query, data }) {
44
+ export async function callApi(method, routePath, { query = {}, data } = {}) {
45
45
  const { url, token } = brainConnection();
46
46
  const qs = new URLSearchParams(query).toString();
47
47
  const res = await fetch(`${url.replace(/\/$/, '')}${routePath}${qs ? `?${qs}` : ''}`, {
@@ -97,7 +97,7 @@ export default async function apiCli(argv = []) {
97
97
  console.error('Usage: total-recall api call <METHOD> </api/path> [--data json] [--query k=v]');
98
98
  process.exit(1);
99
99
  }
100
- return finish(await call(method, routePath, opts), opts);
100
+ return finish(await callApi(method, routePath, opts), opts);
101
101
  }
102
102
 
103
103
  const group = first;
@@ -121,7 +121,7 @@ export default async function apiCli(argv = []) {
121
121
  route.params.forEach((name, i) => {
122
122
  p = p.replace(`:${name}`, encodeURIComponent(rest[i]));
123
123
  });
124
- return finish(await call(route.method, p, opts), opts);
124
+ return finish(await callApi(route.method, p, opts), opts);
125
125
  }
126
126
 
127
127
  function finish(r, opts) {
package/src/cli/brief.mjs CHANGED
@@ -177,6 +177,9 @@ const { queryHarnessUsage } = await import('../core/meta-harness.mjs');
177
177
  const harnesses = await queryHarnessUsage().catch(() => []);
178
178
  const warnings = [];
179
179
  if (!runtime.ready) warnings.push('Shared runtime readiness failed or unknown: total-recall startup check --json.');
180
+ // Unfinished merges, a stale dashboard and other plugin startup checks.
181
+ const { startupFindings } = await import('./startup.mjs');
182
+ for (const line of startupFindings(runtime)) warnings.push(line);
180
183
  if (!project?.project_id) warnings.push('No project brain here (total-recall init) — memory, secrets and rules are global-only.');
181
184
  if (secrets.rotation_due && secrets.rotation_due !== 0) warnings.push(`Secrets overdue for rotation: ${secrets.rotation_due} (total-recall auth secret rotation-due).`);
182
185
  if (secrets.shared_values && secrets.shared_values !== 0) warnings.push(`Credential values reused across keys/apps: ${secrets.shared_values} group(s) (total-recall auth secret shared).`);
@@ -152,6 +152,8 @@ export default async function configCommand(args) {
152
152
  Commands:
153
153
  get [key] Retrieve the value of a configuration key. If key is omitted, lists all keys.
154
154
  set <key> <v> Set the value of a configuration key. Converts inputs to correct type.
155
+ drawer <right|bottom> Read a workspace drawer as JSON
156
+ drawer <right|bottom> --file <json> Save a workspace drawer configuration
155
157
 
156
158
  Options:
157
159
  --global Explicitly target the global brain configuration (~/.agent/)
@@ -177,6 +179,20 @@ export default async function configCommand(args) {
177
179
  return;
178
180
  }
179
181
 
182
+ if (command === 'drawer') {
183
+ const { readDrawerConfig, writeDrawerConfig } = await import('../core/workspace-drawers.mjs');
184
+ const [, edge, fileFlag, file] = remainingArgs;
185
+ if (!edge || (remainingArgs.length !== 2 && (remainingArgs.length !== 4 || fileFlag !== '--file' || !file))) {
186
+ throw new Error('Usage: total-recall config drawer <right|bottom> [--file <json>] [--global|--project]');
187
+ }
188
+ const brain = layer === 'auto' && process.env.TR_BRAIN ? path.resolve(process.env.TR_BRAIN) : resolveBrainDir(layer);
189
+ const current = readDrawerConfig(brain, edge);
190
+ if (file && fs.statSync(file).size > 512 * 1024) throw new Error('Drawer file exceeds 512 KiB.');
191
+ const result = file ? await writeDrawerConfig(brain, edge, JSON.parse(fs.readFileSync(file, 'utf8')), current.version) : current;
192
+ console.log(JSON.stringify(result, null, 2));
193
+ return;
194
+ }
195
+
180
196
  const brainDir = resolveBrainDir(layer);
181
197
  const configDir = path.join(brainDir, 'config');
182
198
  const securityPath = path.join(configDir, 'security.yml');
@@ -5,6 +5,7 @@ import { agentDir as configAgentDir, brainDir as configBrainDir, xdgConfigHome,
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { resolveAgentDir, getBothBrains, detectProjectBrain } from './agent-dir.mjs';
7
7
  import { discoverRepoSkills, projectSkillsAsCommands } from './skill-projection.mjs';
8
+ import { writeBrainConnection } from '../core/memory-brain.mjs';
8
9
 
9
10
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
11
  // Resolve templates dir relative to this file (src/cli/ → ../../templates/)
@@ -379,13 +380,7 @@ function readInstructions(cwd, agentDir) {
379
380
 
380
381
  function ensureBrainConfig(brainDir, opts) {
381
382
  if (!opts.brain) return null;
382
- const configDir = path.join(brainDir, 'config');
383
- fs.mkdirSync(configDir, { recursive: true });
384
- const config = { url: opts.brain };
385
- if (opts.token) config.token = opts.token;
386
- const filePath = path.join(configDir, 'brain.json');
387
- fs.writeFileSync(filePath, JSON.stringify(config, null, 2));
388
- return filePath;
383
+ return writeBrainConnection(brainDir, { url: opts.brain, token: opts.token || undefined });
389
384
  }
390
385
 
391
386
  function registerClient(brainDir, clientName, preset, projectionPath) {