total-recall-brain 3.44.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 (502) hide show
  1. package/bin/total-recall.mjs +10 -6
  2. package/docs/ARCHITECTURE.md +10 -7
  3. package/docs/reference/cli-reference.md +13 -8
  4. package/frontend/dist/assets/index-BRYE1jmv.css +1 -0
  5. package/frontend/dist/assets/index-D1goIPjC.js +5598 -0
  6. package/frontend/dist/index.html +2 -2
  7. package/frontend/dist/sw.js +5 -4
  8. package/frontend/src/App.tsx +185 -238
  9. package/frontend/src/api/auth-inventory.ts +62 -0
  10. package/frontend/src/api/memory.ts +13 -8
  11. package/frontend/src/api/plugin-credentials.ts +23 -0
  12. package/frontend/src/api/plugins.ts +37 -53
  13. package/frontend/src/api/workspace-drawers.ts +97 -0
  14. package/frontend/src/components/BrainSelector.tsx +9 -3
  15. package/frontend/src/components/plugins/PluginPanel.tsx +83 -42
  16. package/frontend/src/components/plugins/PluginSettings.tsx +10 -20
  17. package/frontend/src/components/plugins/PluginWorkspace.tsx +367 -0
  18. package/frontend/src/components/plugins/ScopedPluginCommands.tsx +142 -0
  19. package/frontend/src/components/plugins/plugin-frame.ts +44 -33
  20. package/frontend/src/components/plugins/scoped-plugin-operations.ts +28 -0
  21. package/frontend/src/components/workspace/DrawerChat.tsx +110 -0
  22. package/frontend/src/components/workspace/DrawerLayout.tsx +196 -0
  23. package/frontend/src/components/workspace/DrawerMarkup.tsx +49 -0
  24. package/frontend/src/components/workspace/PluginChunkLibrary.tsx +92 -0
  25. package/frontend/src/components/workspace/PluginHome.tsx +76 -0
  26. package/frontend/src/components/workspace/WorkspaceDrawers.tsx +96 -0
  27. package/frontend/src/components/workspace/WorkspacePage.tsx +95 -0
  28. package/frontend/src/components/workspace/usePluginDesign.ts +38 -0
  29. package/frontend/src/index.css +409 -136
  30. package/frontend/src/pages/HelpPage.tsx +15 -46
  31. package/frontend/src/pages/MemoryPage.tsx +19 -36
  32. package/frontend/src/pages/SettingsPage.tsx +1 -1
  33. package/metadata.plugin.schema.json +53 -227
  34. package/package.json +1 -1
  35. package/scaffold/.agent/skills/plugin/SKILL.md +13 -11
  36. package/scaffold/.agent/skills/plugin/evals/README.md +14 -21
  37. package/scaffold/.agent/skills/plugin/evals/cases/01-fabricated-seed.mjs +15 -18
  38. package/scaffold/.agent/skills/plugin/evals/cases/02-reassuring-default.mjs +19 -24
  39. package/scaffold/.agent/skills/plugin/evals/cases/03-declared-template.mjs +12 -20
  40. package/scaffold/.agent/skills/plugin/evals/cases/04-home-collects-credential.mjs +35 -0
  41. package/scaffold/.agent/skills/plugin/evals/cases/05-host-leak-in-scaffold.mjs +8 -28
  42. package/scaffold/.agent/skills/plugin/evals/cases/06-correct-plugin.mjs +85 -47
  43. package/scaffold/.agent/skills/plugin/evals/run.mjs +17 -18
  44. package/scaffold/.agent/skills/plugin/prompts/05-credentials.md +4 -4
  45. package/scaffold/.agent/skills/plugin/prompts/07-scaffold.md +2 -2
  46. package/scaffold/.agent/skills/plugin/prompts/08-verify.md +4 -4
  47. package/scaffold/.agent/skills/plugin/references/anti-patterns.md +2 -2
  48. package/scaffold/.agent/skills/plugin/references/generative-home.md +38 -0
  49. package/scaffold/.agent/skills/plugin/references/scaffold.md +5 -5
  50. package/scaffold/.agent/skills/plugin/references/surfaces.md +13 -4
  51. package/scaffold/.agent/skills/plugin/scripts/record.mjs +75 -153
  52. package/scaffold/.agent/skills/plugin/subagents/plugin-reviewer.md +4 -4
  53. package/scaffold/.agent/skills/total-recall/plugins/auth/DESIGN.md +76 -0
  54. package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +3 -1
  55. package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +20 -15
  56. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +7 -7
  57. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +2 -1
  58. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +13 -51
  59. package/scaffold/.agent/skills/total-recall/plugins/auth/src/cli-secret.mjs +20 -1
  60. package/scaffold/.agent/skills/total-recall/plugins/auth/src/secrets-store.mjs +12 -1
  61. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/access-overview.md +17 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/agent-login.md +20 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/baseline-audit.md +22 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-repository-binding.md +17 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-store-maintenance.md +17 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-password.md +18 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-sessions.md +18 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/endpoint-probe.md +23 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/google-sign-in.md +21 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/mesh-machines.md +16 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/passkey-enrollment.md +21 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/registered-brains.md +16 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/scoped-access-keys.md +17 -0
  74. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/secret-inventory.md +25 -0
  75. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/signing-key-rotation.md +22 -0
  76. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +375 -0
  77. package/scaffold/.agent/skills/total-recall/plugins/automations/BRICK.md +7 -0
  78. package/scaffold/.agent/skills/total-recall/plugins/automations/DESIGN.md +53 -0
  79. package/scaffold/.agent/skills/total-recall/plugins/automations/LICENSE +21 -0
  80. package/scaffold/.agent/skills/total-recall/plugins/automations/README.md +66 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/automations/adapters.mjs +247 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/automations/capability/index.mjs +16 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/automations/cli.mjs +130 -0
  84. package/{src/core/plugin-cron.mjs → scaffold/.agent/skills/total-recall/plugins/automations/cron.mjs} +1 -3
  85. package/scaffold/.agent/skills/total-recall/plugins/automations/inventory.mjs +88 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +7661 -0
  87. package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +36 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +151 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/automations/scheduler.mjs +246 -0
  90. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/automations.js +2 -0
  91. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/control-ledger.md +42 -0
  92. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/local-inventory-triage.md +17 -0
  93. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/pending-control.md +39 -0
  94. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/run-evidence.md +41 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/schedule-vs-run-evidence.md +17 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/source-coverage.md +41 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/home.js +278 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/code-quality/DESIGN.md +53 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +23 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +5 -3
  101. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +61 -7
  102. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/report-data.mjs +40 -14
  103. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/report.mjs +15 -40
  104. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +7 -7
  105. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +2 -1
  106. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +40 -40
  107. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/config.md +15 -0
  108. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/detect.md +15 -0
  109. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/gate.md +15 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/init.md +15 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/report.md +17 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/run.md +17 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/snapshot.md +15 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +55 -23
  115. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/home.mjs +214 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/DESIGN.md +146 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +7 -7
  118. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +2 -1
  119. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +51 -34
  120. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +1 -1
  121. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/create.md +35 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/history.md +35 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/library.md +49 -0
  124. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/list.md +42 -0
  125. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/promote.md +40 -0
  126. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/read.md +25 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/remove.md +26 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/rollback.md +26 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/show.md +53 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/status.md +40 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test-path.md +38 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test.md +46 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/update.md +32 -0
  134. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/home.js +533 -0
  135. package/scaffold/.agent/skills/total-recall/plugins/embeddings/DESIGN.md +110 -0
  136. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +7 -7
  137. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +2 -1
  138. package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +13 -10
  139. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/benchmark.md +49 -0
  140. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/coverage.md +53 -0
  141. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/models.md +43 -0
  142. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/pull.md +41 -0
  143. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/status.md +59 -0
  144. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/home.js +353 -0
  145. package/scaffold/.agent/skills/total-recall/plugins/git/DESIGN.md +31 -0
  146. package/scaffold/.agent/skills/total-recall/plugins/git/README.md +136 -0
  147. package/scaffold/.agent/skills/total-recall/plugins/{git-sentinel → git}/cli.mjs +140 -24
  148. package/scaffold/.agent/skills/total-recall/plugins/{git-sentinel → git}/package-lock.json +9 -9
  149. package/scaffold/.agent/skills/total-recall/plugins/{git-sentinel → git}/package.json +4 -2
  150. package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +151 -0
  151. package/scaffold/.agent/skills/total-recall/plugins/git/src/lib/context.mjs +94 -0
  152. package/scaffold/.agent/skills/total-recall/plugins/git/src/lib/phase3-spec-support.mjs +50 -0
  153. package/scaffold/.agent/skills/total-recall/plugins/git/src/lib/runtime.mjs +40 -0
  154. package/scaffold/.agent/skills/total-recall/plugins/git/src/lib/spec-support.mjs +51 -0
  155. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/_support.mjs +195 -0
  156. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/auth.mjs +201 -0
  157. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/bisect.mjs +40 -0
  158. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/cli-meta.mjs +159 -0
  159. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit-memory.mjs +54 -0
  160. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit.mjs +46 -0
  161. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/fleet.mjs +174 -0
  162. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/force-push.mjs +58 -0
  163. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/group.mjs +119 -0
  164. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/handoff.mjs +59 -0
  165. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/message.mjs +22 -0
  166. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/resolve.mjs +60 -0
  167. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/rules.mjs +81 -0
  168. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/secret-firewall.mjs +92 -0
  169. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/undo.mjs +156 -0
  170. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/unmerged.mjs +182 -0
  171. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/why.mjs +16 -0
  172. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/change-comparison.md +27 -0
  173. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/commit-identity.md +22 -0
  174. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/create-worktree.md +25 -0
  175. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/registered-worktrees.md +22 -0
  176. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/remove-worktree.md +23 -0
  177. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/repository-ledger.md +25 -0
  178. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/unmerged-work.md +22 -0
  179. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/upstream-divergence.md +17 -0
  180. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-conflict-triage.md +17 -0
  181. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-terminal.md +22 -0
  182. package/scaffold/.agent/skills/total-recall/plugins/git/ui/home.js +273 -0
  183. package/scaffold/.agent/skills/total-recall/plugins/mesh/DESIGN.md +35 -0
  184. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +4 -5
  185. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +9 -3
  186. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +7 -7
  187. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +2 -1
  188. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +37 -39
  189. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +5 -3
  190. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/active-device-dispatch.md +22 -0
  191. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-probe.md +25 -0
  192. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-server.md +22 -0
  193. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/credential-readiness.md +23 -0
  194. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/elected-leader.md +22 -0
  195. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/enrollment-key.md +22 -0
  196. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/file-receipt.md +25 -0
  197. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-execution.md +23 -0
  198. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-presence.md +23 -0
  199. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/interactive-ssh.md +22 -0
  200. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/local-enrollment.md +23 -0
  201. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/mesh-policy.md +23 -0
  202. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/network-atlas.md +25 -0
  203. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-roster.md +26 -0
  204. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-selection-proof.md +17 -0
  205. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/owner-observations.md +23 -0
  206. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/peer-path.md +23 -0
  207. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/pinned-leader.md +24 -0
  208. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/reachability-evidence-ladder.md +17 -0
  209. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/recorded-login.md +23 -0
  210. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/remote-execution.md +22 -0
  211. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/secret-grants.md +26 -0
  212. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/{card.js → home.js} +93 -22
  213. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/DESIGN.md +86 -0
  214. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/README.md +44 -9
  215. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/BRICK.md +1 -1
  216. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/index.mjs +18 -6
  217. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +128 -24
  218. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +7 -7
  219. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +3 -2
  220. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +188 -34
  221. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/skills/meta-harness/SKILL.md +17 -3
  222. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/adoption.mjs +2 -2
  223. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/alerts.mjs +3 -3
  224. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +92 -18
  225. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/chat.mjs +80 -0
  226. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/control.mjs +145 -0
  227. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +42 -21
  228. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch-request.mjs +4 -2
  229. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +33 -9
  230. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/documentation.mjs +55 -11
  231. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/executor.mjs +26 -4
  232. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/hermes.mjs +29 -1
  233. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/index.mjs +1 -1
  234. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/included-usage.mjs +1 -1
  235. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/jobs.mjs +84 -0
  236. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +3 -12
  237. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/maintenance.mjs +17 -0
  238. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/mcp-server.mjs +228 -0
  239. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/process-manager.mjs +25 -2
  240. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/reasoning.mjs +1 -1
  241. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/remote-operation.mjs +5 -1
  242. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/review.mjs +34 -3
  243. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/reviews.mjs +25 -0
  244. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +1 -1
  245. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/session/claude.mjs +319 -0
  246. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/session/codex.mjs +387 -0
  247. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/session/result.mjs +67 -0
  248. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/session/resume.mjs +373 -0
  249. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/session/run.mjs +223 -0
  250. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/session-jobs.mjs +72 -0
  251. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/setup.mjs +6 -3
  252. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/termination.mjs +16 -12
  253. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/threads.mjs +32 -1
  254. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/usage-queue.mjs +1 -1
  255. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/verify-ssss.mjs +3 -3
  256. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +285 -40
  257. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worktree.mjs +76 -9
  258. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/adapter-docs-freshness.md +16 -0
  259. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/chat-handoff.md +26 -0
  260. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/fleet-maintenance.md +21 -0
  261. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/harness-inventory.md +21 -0
  262. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-access.md +18 -0
  263. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-usage-verification.md +15 -0
  264. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/independent-review.md +17 -0
  265. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/managed-execution.md +20 -0
  266. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/official-documentation.md +18 -0
  267. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/quota-recovery.md +21 -0
  268. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/review-routing-decision.md +16 -0
  269. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/route-work.md +18 -0
  270. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/routing-evidence.md +18 -0
  271. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/run-ledger.md +18 -0
  272. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/home.js +198 -0
  273. package/scaffold/.agent/skills/total-recall/plugins/openwiki/DESIGN.md +75 -0
  274. package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +2 -0
  275. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +64 -32
  276. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +7 -7
  277. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +2 -1
  278. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +10 -44
  279. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +5 -4
  280. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +3 -4
  281. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +23 -18
  282. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +8 -3
  283. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh-diagnostics.mjs +44 -0
  284. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +123 -113
  285. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +3 -5
  286. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +21 -47
  287. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +17 -6
  288. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/auto-refresh.md +18 -0
  289. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/bootstrap-pages.md +18 -0
  290. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generate-wiki.md +21 -0
  291. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generator-settings.md +18 -0
  292. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/host-probe.md +18 -0
  293. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/ingest-preview.md +18 -0
  294. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-hygiene.md +21 -0
  295. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-topology.md +19 -0
  296. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/passage-search.md +19 -0
  297. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/propagation-plan.md +18 -0
  298. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/provider-credentials.md +18 -0
  299. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/refresh-report.md +18 -0
  300. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/task-evidence.md +22 -0
  301. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/upstream-record.md +18 -0
  302. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/watch-upstream.md +18 -0
  303. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/wiki-atlas.md +19 -0
  304. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +261 -513
  305. package/scaffold/.agent/skills/total-recall/plugins/security/DESIGN.md +84 -0
  306. package/scaffold/.agent/skills/total-recall/plugins/security/README.md +4 -2
  307. package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +7 -19
  308. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +7 -7
  309. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +2 -3
  310. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +19 -52
  311. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/device-evidence.md +21 -0
  312. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/evidence-desk.md +18 -0
  313. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/guided-device-review.md +17 -0
  314. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/host-and-network.md +21 -0
  315. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/https-headers.md +17 -0
  316. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/mesh-coverage.md +18 -0
  317. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/private-security-tools.md +16 -0
  318. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/single-origin-header-check.md +17 -0
  319. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/source-review.md +21 -0
  320. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/ssh-permission-plan.md +17 -0
  321. package/scaffold/.agent/skills/total-recall/plugins/security/ui/home.js +283 -0
  322. package/scaffold/.agent/skills/total-recall/plugins/ssss/DESIGN.md +93 -0
  323. package/scaffold/.agent/skills/total-recall/plugins/ssss/package-lock.json +2 -2
  324. package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +2 -1
  325. package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +5 -3
  326. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/conformance.md +26 -0
  327. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/registry.md +37 -0
  328. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/repair.md +42 -0
  329. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/scaffold.md +33 -0
  330. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/status.md +43 -0
  331. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validate.md +34 -0
  332. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validation-diagnostics.md +17 -0
  333. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/workspace-registry-preflight.md +17 -0
  334. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/home.js +348 -0
  335. package/scaffold/.agent/skills/total-recall/references/operations.md +3 -1
  336. package/src/cli/agent.mjs +1 -1
  337. package/src/cli/api.mjs +3 -3
  338. package/src/cli/brief.mjs +3 -0
  339. package/src/cli/command.mjs +41 -2
  340. package/src/cli/config.mjs +16 -0
  341. package/src/cli/connect.mjs +2 -7
  342. package/src/cli/dream.mjs +93 -69
  343. package/src/cli/harness.mjs +4 -4
  344. package/src/cli/help.mjs +1 -1
  345. package/src/cli/init.mjs +0 -25
  346. package/src/cli/lessons.mjs +51 -0
  347. package/src/cli/memory-plugin.mjs +1 -1
  348. package/src/cli/plugin/chunks.mjs +145 -0
  349. package/src/cli/plugin/copies.mjs +64 -14
  350. package/src/cli/plugin/create.mjs +30 -59
  351. package/src/cli/plugin/index.mjs +31 -16
  352. package/src/cli/plugin/install.mjs +10 -15
  353. package/src/cli/plugin/remove.mjs +1 -1
  354. package/src/cli/plugin/search.mjs +2 -2
  355. package/src/cli/preflight.mjs +19 -6
  356. package/src/cli/proposals.mjs +1 -1
  357. package/src/cli/recall.mjs +66 -23
  358. package/src/cli/remember.mjs +3 -14
  359. package/src/cli/server.mjs +18 -0
  360. package/src/cli/setup.mjs +2 -9
  361. package/src/cli/start.mjs +1 -0
  362. package/src/cli/startup.mjs +19 -0
  363. package/src/cli/task.mjs +9 -2
  364. package/src/cli/update.mjs +6 -2
  365. package/src/core/access-ledger.mjs +78 -0
  366. package/src/core/agent-manager.mjs +2 -2
  367. package/src/core/app-deploy/design-tokens.mjs +14 -9
  368. package/src/core/app-deploy/ui-elements.mjs +1 -1
  369. package/src/core/brain-locate.mjs +15 -0
  370. package/src/core/brain-registry.mjs +5 -0
  371. package/src/core/brain-updates.mjs +35 -11
  372. package/src/core/claude-hooks.mjs +3 -1
  373. package/src/core/cleanup-task.mjs +15 -0
  374. package/src/core/cli-commands.mjs +2 -0
  375. package/src/core/cli-maintenance.mjs +4 -1
  376. package/src/core/cli-semantic-index.mjs +23 -3
  377. package/src/core/context-compiler.mjs +20 -0
  378. package/src/core/daemon-control.mjs +5 -1
  379. package/src/core/daemon-loop.mjs +39 -62
  380. package/src/core/dashboard-bundle.mjs +261 -0
  381. package/src/core/default-plugins.mjs +1 -1
  382. package/src/core/dream.mjs +33 -105
  383. package/src/core/ensure-dependencies.mjs +152 -0
  384. package/src/core/fast-recall.mjs +2 -2
  385. package/src/core/field-evaluation.mjs +23 -0
  386. package/src/core/gate-mode.mjs +1 -1
  387. package/src/core/harness-hooks.mjs +14 -2
  388. package/src/core/lesson-hooks.mjs +74 -0
  389. package/src/core/lesson-memory.mjs +24 -0
  390. package/src/core/lesson-sessions.mjs +52 -0
  391. package/src/core/lessons.mjs +96 -0
  392. package/src/core/memory-brain.mjs +30 -8
  393. package/src/core/meta-harness.mjs +2 -2
  394. package/src/core/optimizer.mjs +66 -165
  395. package/src/core/plugin-activation.mjs +63 -20
  396. package/src/core/plugin-contracts/{card.mjs → manifest.mjs} +26 -57
  397. package/src/core/plugin-contracts/startup-check.mjs +49 -0
  398. package/src/core/plugin-contracts/ui.mjs +9 -3
  399. package/src/core/plugin-distribution.mjs +6 -6
  400. package/src/core/plugin-lifecycle.mjs +58 -0
  401. package/src/core/plugin-loader.mjs +21 -8
  402. package/src/core/plugin-runner.mjs +21 -10
  403. package/src/core/plugin-runtime.mjs +40 -1
  404. package/src/core/plugin-startup-checks.mjs +44 -0
  405. package/src/core/plugin-state.mjs +19 -5
  406. package/src/core/plugin-store.mjs +64 -33
  407. package/src/core/post-mortem.mjs +52 -36
  408. package/src/core/preflight-gate.mjs +23 -2
  409. package/src/core/project-id.mjs +15 -5
  410. package/src/core/proposal-applier.mjs +31 -2
  411. package/src/core/repo-sync.mjs +4 -6
  412. package/src/core/required-plugins.mjs +57 -10
  413. package/src/core/rule-length.mjs +23 -0
  414. package/src/core/runtime.mjs +1 -1
  415. package/src/core/scheduler.mjs +35 -43
  416. package/src/core/schema.mjs +3 -2
  417. package/src/core/search.mjs +4 -3
  418. package/src/core/server-service.mjs +148 -0
  419. package/src/core/session-watcher.mjs +19 -1
  420. package/src/core/skill-gap.mjs +16 -0
  421. package/src/core/ssss-kernel-bridge.mjs +32 -4
  422. package/src/core/ssss-operation-service.mjs +1 -0
  423. package/src/core/startup-health.mjs +34 -4
  424. package/src/core/surface.mjs +65 -54
  425. package/src/core/task-executors.mjs +54 -106
  426. package/src/core/testing/plugin-fixture.mjs +22 -21
  427. package/src/core/throttled-fetch.mjs +25 -18
  428. package/src/core/ui-chunk-choice.mjs +77 -0
  429. package/src/core/ui-chunk.registry.json +23 -0
  430. package/src/core/ui-chunks.mjs +434 -0
  431. package/src/core/validated-write.mjs +1 -0
  432. package/src/core/vault-cache.mjs +58 -59
  433. package/src/core/vector-field.mjs +134 -192
  434. package/src/core/workspace-compositions.mjs +151 -0
  435. package/src/core/workspace-drawers.mjs +79 -0
  436. package/src/server/api.mjs +4 -27
  437. package/src/server/index.mjs +28 -21
  438. package/src/server/invoke-core-child.mjs +24 -0
  439. package/src/server/invoke-core-operations.mjs +102 -0
  440. package/src/server/memory-events.mjs +31 -0
  441. package/src/server/plugin-brain-targets.mjs +89 -0
  442. package/src/server/rest.mjs +2 -0
  443. package/src/server/route-inventory.mjs +3 -2
  444. package/src/server/route-manifest.json +47 -55
  445. package/src/server/routes/_shared.mjs +7 -14
  446. package/src/server/routes/brains.mjs +29 -62
  447. package/src/server/routes/context.mjs +0 -41
  448. package/src/server/routes/dashboard.mjs +26 -0
  449. package/src/server/routes/invoke.mjs +26 -1
  450. package/src/server/routes/plugins.mjs +154 -45
  451. package/src/server/routes/ssss.mjs +0 -169
  452. package/src/server/routes/system.mjs +0 -15
  453. package/src/server/routes/tasks.mjs +0 -26
  454. package/src/server/routes/ui-chunks.mjs +192 -0
  455. package/src/server/routes/vault.mjs +2 -23
  456. package/frontend/dist/assets/index-DD4qONvH.js +0 -5607
  457. package/frontend/dist/assets/index-DtwsDyFM.css +0 -1
  458. package/frontend/src/components/plugins/card/CardEngine.tsx +0 -108
  459. package/frontend/src/components/plugins/card/CardScenes.tsx +0 -103
  460. package/frontend/src/components/plugins/card/ExecutionPicker.tsx +0 -64
  461. package/frontend/src/components/plugins/card/args.ts +0 -28
  462. package/frontend/src/components/plugins/card/card.css +0 -32
  463. package/frontend/src/components/plugins/card/cli-line.ts +0 -13
  464. package/frontend/src/components/plugins/card/contract.ts +0 -91
  465. package/frontend/src/components/plugins/card/format.ts +0 -49
  466. package/frontend/src/components/plugins/card/runner-context.ts +0 -11
  467. package/frontend/src/components/plugins/card/runner.tsx +0 -43
  468. package/frontend/src/components/plugins/card/theme.ts +0 -35
  469. package/frontend/src/components/plugins/card/use-source.ts +0 -22
  470. package/frontend/src/components/plugins/card/widgets.tsx +0 -94
  471. package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +0 -23
  472. package/frontend/src/pages/PluginsPage.tsx +0 -1719
  473. package/scaffold/.agent/skills/plugin/evals/cases/04-card-collects-credential.mjs +0 -47
  474. package/scaffold/.agent/skills/plugin/prompts/06-card.md +0 -46
  475. package/scaffold/.agent/skills/plugin/references/card.md +0 -90
  476. package/scaffold/.agent/skills/plugin/subagents/card-designer.md +0 -60
  477. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +0 -67
  478. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +0 -1179
  479. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +0 -32
  480. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +0 -588
  481. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +0 -575
  482. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/DESIGN.md +0 -32
  483. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +0 -482
  484. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/README.md +0 -53
  485. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/plugin.json +0 -129
  486. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/DESIGN.md +0 -100
  487. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/card.js +0 -637
  488. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +0 -217
  489. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/DESIGN.md +0 -32
  490. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +0 -1276
  491. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +0 -45
  492. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +0 -1401
  493. package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +0 -4
  494. package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +0 -41
  495. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +0 -396
  496. package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +0 -98
  497. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/DESIGN.md +0 -15
  498. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/card.js +0 -182
  499. package/src/core/append-log.mjs +0 -131
  500. package/src/core/plugin-tasks.mjs +0 -173
  501. package/templates/onboarding-interview.md +0 -82
  502. /package/scaffold/.agent/skills/total-recall/plugins/{git-sentinel → git}/LICENSE +0 -0
@@ -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.
@@ -16,7 +18,7 @@ Publication/deployment use the owning push/deploy procedures when authorized. Sh
16
18
 
17
19
  Use `brain status` to check the current project and physical global storage. Preview `brain relocate-global <dir>` before adding `--apply`. The destination must be a new private directory outside Git on the same filesystem as home. The home skills path links to the relocated tree. Keep repository brains in their own directories.
18
20
 
19
- Run normal preflight from home for global orchestration. Pass a repository working directory when routing repository work through Meta Harness. Use `plugin copies` to audit old project copies of shared defaults. `--apply` deletes verified bundled matches. Add `--archive-stale` to retain differing older copies in the replacement archive and use the shared versions.
21
+ Run normal preflight from home for global orchestration. Pass a repository working directory when routing repository work through Metaharness. Use `plugin copies` to audit old project copies of shared defaults. `--apply` deletes verified bundled matches. Add `--archive-stale` to retain differing older copies in the replacement archive and use the shared versions.
20
22
 
21
23
  ## Optional developer API
22
24
 
package/src/cli/agent.mjs CHANGED
@@ -31,7 +31,7 @@ Options:
31
31
  --allow-unknown-auth Explicitly permit a harness without a verified login probe
32
32
 
33
33
  Auth:
34
- The Meta Harness owner probes login and resolves only adapter-declared credentials through auth.
34
+ The Metaharness owner probes login and resolves only adapter-declared credentials through auth.
35
35
 
36
36
  Available Harnesses:
37
37
  agy, claude, codex, dsh, hermes, openclaw
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).`);
@@ -247,21 +247,59 @@ function existingTag(file, key) {
247
247
  try { return fs.readFileSync(file, 'utf8').match(new RegExp(`^// @${key} (.+)$`, 'm'))?.[1] || undefined; } catch { return undefined; }
248
248
  }
249
249
 
250
+ /** Where the background recompile records its outcome: <agentDir>/state and <agentDir>/logs. */
251
+ export function compileRecordPaths(isGlobal) {
252
+ const agentDir = path.dirname(resolveTargetDir(isGlobal));
253
+ return {
254
+ status: path.join(agentDir, 'state', 'command-compile.json'),
255
+ log: path.join(agentDir, 'logs', 'command-compile.log'),
256
+ };
257
+ }
258
+
259
+ // Runs in the detached child: compile, then record the exit code and output.
260
+ const COMPILE_RECORDER = `
261
+ const { spawnSync } = require('node:child_process');
262
+ const fs = require('node:fs');
263
+ const [cli, layer, statusFile, logFile] = process.argv.slice(1);
264
+ const startedAt = new Date().toISOString();
265
+ const r = spawnSync(process.execPath, [cli, 'compile', layer], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
266
+ const code = r.status === null ? 1 : r.status;
267
+ fs.writeFileSync(logFile, (r.stdout || '') + (r.stderr || '') + (r.error ? String(r.error) + '\\n' : ''));
268
+ const record = { ok: code === 0, code, signal: r.signal || null, layer, startedAt, finishedAt: new Date().toISOString(), log: logFile };
269
+ fs.writeFileSync(statusFile + '.tmp', JSON.stringify(record, null, 2));
270
+ fs.renameSync(statusFile + '.tmp', statusFile);
271
+ `;
272
+
250
273
  /**
251
274
  * Composable instructions: the surfaces list every command, so any change to
252
275
  * the command set recompiles them (project layer, or every project for global).
276
+ * A global compile takes minutes, so it runs in the background; its exit code and
277
+ * output are recorded, and the next `command` call reports a failure.
253
278
  */
254
279
  export function recompileSurfaces(isGlobal) {
255
280
  if (process.env.TR_COMMAND_NO_COMPILE === '1' || !process.argv[1]) return;
256
281
  try {
257
- const child = spawn(process.execPath, [process.argv[1], 'compile', isGlobal ? '--global' : '--project'], { detached: true, stdio: 'ignore' });
282
+ const { status, log } = compileRecordPaths(isGlobal);
283
+ fs.mkdirSync(path.dirname(status), { recursive: true });
284
+ fs.mkdirSync(path.dirname(log), { recursive: true });
285
+ const child = spawn(process.execPath, ['-e', COMPILE_RECORDER, process.argv[1], isGlobal ? '--global' : '--project', status, log], { detached: true, stdio: 'ignore' });
258
286
  child.unref();
259
- console.log(' ⏳ Instruction surfaces recompiling in the background (command list updated).');
287
+ console.log(` ⏳ Instruction surfaces recompiling in the background (command list updated). Outcome: ${status}`);
260
288
  } catch (error) {
261
289
  console.warn(` ⚠️ Command saved, but surface recompile failed to start: ${error.message}`);
290
+ process.exitCode = 1;
262
291
  }
263
292
  }
264
293
 
294
+ /** Report a failed background recompile; returns the record when it failed. */
295
+ export function reportFailedCompile(isGlobal, out = console.warn) {
296
+ let record;
297
+ try { record = JSON.parse(fs.readFileSync(compileRecordPaths(isGlobal).status, 'utf8')); } catch { return null; }
298
+ if (record.ok) return null;
299
+ out(` ❌ The last instruction-surface recompile (${record.layer}, ${record.finishedAt}) failed with exit ${record.code}. Surfaces may not list current commands. Log: ${record.log}. Run 'total-recall compile ${record.layer}' to retry.`);
300
+ return record;
301
+ }
302
+
265
303
  /**
266
304
  * Register every `commands` entry of an installed plugin as a composable command.
267
305
  * A command that already exists and was generated from this plugin is refreshed;
@@ -319,6 +357,7 @@ export default async function commandCmd(rawArgs = []) {
319
357
 
320
358
  const action = cleanArgs[0];
321
359
  const name = cleanArgs[1];
360
+ if (process.env.TR_COMMAND_NO_COMPILE !== '1') reportFailedCompile(isGlobal);
322
361
 
323
362
  if (!action || action === '--help' || action === '-h') {
324
363
  printHelp();
@@ -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) {