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
@@ -1,4 +0,0 @@
1
- import fs from 'node:fs';
2
- const card = fs.readFileSync(new URL('../ui/card.js', import.meta.url), 'utf8');
3
- // The host runs each interface from a standalone Blob module; bundle the shared class.
4
- fs.writeFileSync(new URL('../ui/panel.js', import.meta.url), `${card}\nclass SecurityPanel extends SecuritySecurityCard {}\nif (!customElements.get('security-panel')) customElements.define('security-panel', SecurityPanel);\n`);
@@ -1,41 +0,0 @@
1
- # DESIGN.md — Security Plugin (Tin Foil)
2
-
3
- ## Brand Identity & Aesthetic
4
- - **Brand Name**: Tin Foil
5
- - **Wordmark**: `[TIN//FOIL]`
6
- - **Theme**: Crimson and Obsidian Host Hardening Console
7
- - **Tone**: Deterministic, vigilant, fail-closed, precise
8
-
9
- ## Design Tokens
10
-
11
- The card face defines and consumes these custom properties:
12
-
13
- ```css
14
- :host {
15
- --face-bg: #180d11;
16
- --face-bg-subtle: #251017;
17
- --face-bg-surface: #11070a;
18
- --face-bg-table: #0d0508;
19
- --face-bg-code: #0a0406;
20
- --face-accent: #f43f5e;
21
- --face-accent-hover: rgba(244, 63, 94, 0.22);
22
- --face-accent-glow: rgba(244, 63, 94, 0.35);
23
- --face-border-subtle: rgba(244, 63, 94, 0.28);
24
- --face-border-faint: rgba(244, 63, 94, 0.2);
25
- --face-border-cell: rgba(244, 63, 94, 0.15);
26
- --face-border-alert: rgba(244, 63, 94, 0.25);
27
- --face-text: #f1f5f9;
28
- --face-text-heading: #fecdd3;
29
- --face-text-muted: #fda4af;
30
- --face-text-cell: #f8fafc;
31
- --face-text-desc: #cbd5e1;
32
- --face-danger: #fb7185;
33
- --face-warning: #fca5a5;
34
- }
35
- ```
36
-
37
- ## System Integration
38
- - The face binds `--text-primary` with fallback to `var(--face-text)`.
39
- - The face binds `--border` with fallback to `var(--face-accent-glow)`.
40
- - All clickable elements enforce a minimum height of 44px for touch ergonomics.
41
- - Reduced motion styles suppress animation when requested by system settings.
@@ -1,396 +0,0 @@
1
- export class SecuritySecurityCard extends HTMLElement {
2
- connectedCallback() {
3
- if (this.shadowRoot) return;
4
- const root = this.attachShadow({ mode: 'open' });
5
- root.innerHTML = `
6
- <style>
7
- :host {
8
- --face-bg: #180d11;
9
- --face-bg-subtle: #251017;
10
- --face-bg-surface: #11070a;
11
- --face-bg-table: #0d0508;
12
- --face-bg-code: #0a0406;
13
- --face-accent: #f43f5e;
14
- --face-accent-hover: rgba(244, 63, 94, 0.22);
15
- --face-accent-glow: rgba(244, 63, 94, 0.35);
16
- --face-border-subtle: rgba(244, 63, 94, 0.28);
17
- --face-border-faint: rgba(244, 63, 94, 0.2);
18
- --face-border-cell: rgba(244, 63, 94, 0.15);
19
- --face-border-alert: rgba(244, 63, 94, 0.25);
20
- --face-text: #f1f5f9;
21
- --face-text-heading: #fecdd3;
22
- --face-text-muted: #fda4af;
23
- --face-text-cell: #f8fafc;
24
- --face-text-desc: #cbd5e1;
25
- --face-danger: #fb7185;
26
- --face-warning: #fca5a5;
27
-
28
- display: block;
29
- font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
30
- color: var(--text-primary, var(--face-text));
31
- background: var(--face-bg);
32
- border: 1px solid var(--border, var(--face-accent-glow));
33
- border-radius: 10px;
34
- padding: 18px;
35
- box-shadow: 0 10px 28px rgba(0, 0, 0, 0.45);
36
- box-sizing: border-box;
37
- overflow: hidden;
38
- }
39
-
40
- header {
41
- display: flex;
42
- align-items: center;
43
- gap: 12px;
44
- margin-bottom: 12px;
45
- }
46
-
47
- .brand-icon {
48
- width: 32px;
49
- height: 38px;
50
- color: var(--face-accent);
51
- flex-shrink: 0;
52
- }
53
-
54
- .title-block {
55
- display: flex;
56
- flex-direction: column;
57
- gap: 2px;
58
- }
59
-
60
- h2 {
61
- margin: 0;
62
- font-size: 16px;
63
- font-weight: 700;
64
- letter-spacing: 0.03em;
65
- text-transform: uppercase;
66
- color: var(--face-text-heading);
67
- }
68
-
69
- p.desc {
70
- margin: 0 0 14px 0;
71
- color: var(--face-text-muted);
72
- font-size: 12px;
73
- line-height: 1.5;
74
- }
75
-
76
- nav {
77
- display: flex;
78
- gap: 6px;
79
- flex-wrap: wrap;
80
- margin-top: 8px;
81
- }
82
-
83
- nav:first-of-type {
84
- margin-top: 0;
85
- }
86
-
87
- button, input, select {
88
- min-height: 44px;
89
- border: 1px solid var(--face-border-subtle);
90
- border-radius: 6px;
91
- padding: 8px 12px;
92
- background: var(--face-bg-subtle);
93
- color: var(--face-text);
94
- font-size: 11px;
95
- font-weight: 600;
96
- letter-spacing: 0.02em;
97
- box-sizing: border-box;
98
- }
99
-
100
- button {
101
- cursor: pointer;
102
- text-transform: uppercase;
103
- transition: background 0.15s ease, border-color 0.15s ease;
104
- }
105
-
106
- button:hover {
107
- background: var(--face-accent-hover);
108
- border-color: var(--face-accent);
109
- }
110
-
111
- button:active {
112
- transform: translateY(1px);
113
- }
114
-
115
- button:disabled, input:disabled, select:disabled {
116
- opacity: 0.5;
117
- cursor: not-allowed;
118
- }
119
-
120
- input {
121
- min-width: 0;
122
- flex: 1;
123
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
124
- background: var(--face-bg-surface);
125
- }
126
-
127
- input:focus, select:focus {
128
- border-color: var(--face-accent);
129
- outline: none;
130
- box-shadow: 0 0 0 1px var(--face-accent-glow);
131
- }
132
-
133
- select {
134
- background: var(--face-bg-surface);
135
- cursor: pointer;
136
- }
137
-
138
- #state {
139
- margin: 14px 0 8px 0;
140
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
141
- font-size: 11px;
142
- font-weight: 700;
143
- color: var(--face-danger);
144
- background: var(--face-bg-surface);
145
- padding: 6px 10px;
146
- border-radius: 4px;
147
- border: 1px solid var(--face-border-faint);
148
- }
149
-
150
- .scroll {
151
- overflow-x: auto;
152
- margin-bottom: 10px;
153
- border-radius: 6px;
154
- border: 1px solid var(--face-border-faint);
155
- }
156
-
157
- table {
158
- width: 100%;
159
- border-collapse: collapse;
160
- font-size: 11px;
161
- background: var(--face-bg-table);
162
- }
163
-
164
- th {
165
- background: var(--face-bg-subtle);
166
- color: var(--face-text-heading);
167
- font-weight: 700;
168
- text-transform: uppercase;
169
- letter-spacing: 0.04em;
170
- padding: 8px 10px;
171
- border-bottom: 1px solid var(--face-border-subtle);
172
- text-align: left;
173
- }
174
-
175
- td {
176
- padding: 8px 10px;
177
- text-align: left;
178
- border-bottom: 1px solid var(--face-border-cell);
179
- vertical-align: top;
180
- color: var(--face-text-cell);
181
- }
182
-
183
- td:first-child {
184
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
185
- font-weight: 600;
186
- color: var(--face-text-muted);
187
- }
188
-
189
- td:last-child {
190
- line-height: 1.45;
191
- color: var(--face-text-desc);
192
- }
193
-
194
- pre {
195
- background: var(--face-bg-code);
196
- border: 1px solid var(--face-border-faint);
197
- border-radius: 6px;
198
- padding: 8px 10px;
199
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
200
- font-size: 10.5px;
201
- line-height: 1.45;
202
- color: var(--face-danger);
203
- white-space: pre-wrap;
204
- overflow-wrap: anywhere;
205
- max-height: 160px;
206
- overflow-y: auto;
207
- margin: 0;
208
- }
209
-
210
- #device-review {
211
- background: var(--face-bg-surface);
212
- border: 1px solid var(--face-border-alert);
213
- border-radius: 6px;
214
- padding: 10px;
215
- margin-top: 10px;
216
- }
217
-
218
- #device-review p {
219
- margin: 0 0 8px 0;
220
- font-size: 11px;
221
- color: var(--face-warning);
222
- }
223
-
224
- #device-checks label {
225
- display: block;
226
- margin-bottom: 8px;
227
- }
228
-
229
- #device-checks label p {
230
- margin: 0 0 4px 0;
231
- font-size: 11px;
232
- color: var(--face-text-heading);
233
- font-weight: 600;
234
- }
235
-
236
- @media (prefers-reduced-motion: reduce) {
237
- button, input, select {
238
- transition: none !important;
239
- }
240
- }
241
- </style>
242
-
243
- <header>
244
- <svg class="brand-icon" viewBox="0 0 32 38" fill="none" aria-hidden="true">
245
- <path d="M16 2 29 8v11c0 8-7 14-13 17C10 33 3 27 3 19V8Z" stroke="currentColor" stroke-width="2"/>
246
- <path d="m9 19 5 5 10-12" stroke="currentColor" stroke-width="2"/>
247
- </svg>
248
- <div class="title-block">
249
- <h2>Security Assessments</h2>
250
- </div>
251
- </header>
252
-
253
- <p class="desc">Inspect this machine or your mesh. Review firewall, SSH, disk protection, and listening services with concrete remediation.</p>
254
-
255
- <nav>
256
- <button data-action="machine">This machine</button>
257
- <button data-action="fleet">Mesh fleet</button>
258
- <button data-action="plugins">Plugin audit</button>
259
- <button data-action="harden">Hardening plan</button>
260
- </nav>
261
-
262
- <nav>
263
- <input id="target" aria-label="Machine name" placeholder="Optional mesh machine name">
264
- <button id="selected">Audit selected</button>
265
- </nav>
266
-
267
- <nav>
268
- <input id="website" type="url" aria-label="Authorized HTTPS website" placeholder="https://your-site.example">
269
- <button id="probe">Check website</button>
270
- </nav>
271
-
272
- <nav>
273
- <input id="source" aria-label="Source directory" placeholder="Source directory">
274
- <button id="scan">Scan source</button>
275
- <button id="permissions">Repair SSH permissions</button>
276
- </nav>
277
-
278
- <nav>
279
- <select id="platform" aria-label="Device platform">
280
- <option value="ios">iPhone</option>
281
- <option value="ipados">iPad</option>
282
- <option value="android">Android</option>
283
- <option value="chromeos">Chromebook</option>
284
- <option value="chromeos-flex">ChromeOS Flex</option>
285
- <option value="windows">Windows</option>
286
- </select>
287
- <input id="device" aria-label="Device label" placeholder="Device label (no passwords)">
288
- <button id="review-device">Review device</button>
289
- </nav>
290
-
291
- <section id="device-review" hidden>
292
- <p>Manual device review — answers are your observations, not an automatic scan. Unknown checks remain unverified. Never enter passwords or recovery keys.</p>
293
- <div id="device-checks"></div>
294
- <button id="evaluate-device">Evaluate review</button>
295
- </section>
296
-
297
- <nav>
298
- <input id="android-serial" aria-label="Already authorized Android serial" placeholder="Already authorized Android serial">
299
- <button id="android-check">Read Android properties</button>
300
- </nav>
301
-
302
- <div id="state" role="status">Not audited</div>
303
-
304
- <div class="scroll">
305
- <table hidden>
306
- <thead>
307
- <tr><th>Check / machine</th><th>State</th><th>Remediation / coverage</th></tr>
308
- </thead>
309
- <tbody></tbody>
310
- </table>
311
- </div>
312
-
313
- <pre id="details"></pre>
314
- `;
315
-
316
- root.querySelectorAll('[data-action]').forEach(button => button.addEventListener('click', () => this.execute(button.dataset.action)));
317
- root.querySelector('#selected').addEventListener('click', () => {
318
- const target = root.querySelector('#target').value.trim();
319
- if (!target) { root.querySelector('#state').textContent = 'Enter a discovered machine name'; return; }
320
- this.execute('fleet', ['--target', target]);
321
- });
322
- root.querySelector('#probe').addEventListener('click', () => {
323
- const website = root.querySelector('#website').value.trim();
324
- try {
325
- const url = new URL(website);
326
- if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash) throw new Error();
327
- } catch { root.querySelector('#state').textContent = 'Enter an authorized HTTPS URL without credentials or query'; return; }
328
- this.execute('probe', ['--url', website]);
329
- });
330
- root.querySelector('#scan').addEventListener('click', () => {
331
- const source = root.querySelector('#source').value.trim();
332
- if (!source) { root.querySelector('#state').textContent = 'Enter a source directory'; return; }
333
- this.execute('scan', [source]);
334
- });
335
- root.querySelector('#permissions').addEventListener('click', () => this.execute('machine', ['--apply-permissions']));
336
- const resetReview = () => { root.querySelector('#device-review').hidden = true; root.querySelector('#device-checks').replaceChildren(); };
337
- root.querySelector('#platform').addEventListener('change', resetReview);
338
- root.querySelector('#device').addEventListener('input', resetReview);
339
- const identity = () => ['--platform', root.querySelector('#platform').value, '--device', root.querySelector('#device').value.trim()];
340
- root.querySelector('#review-device').addEventListener('click', () => this.execute('device', identity()));
341
- root.querySelector('#evaluate-device').addEventListener('click', () => {
342
- const observations = {};
343
- root.querySelectorAll('#device-checks select').forEach(select => { if (select.dataset.observedAt) observations[select.dataset.check] = { status: select.value, observedAt: select.dataset.observedAt }; });
344
- this.execute('device', [...identity(), '--answers-json', JSON.stringify(observations)]);
345
- });
346
- root.querySelector('#android-check').addEventListener('click', () => this.execute('android', ['--serial', root.querySelector('#android-serial').value.trim()]));
347
- }
348
-
349
- async execute(action, args = []) {
350
- const root = this.shadowRoot;
351
- const state = root.querySelector('#state');
352
- const details = root.querySelector('#details');
353
- root.querySelectorAll('button,input,select').forEach(button => { button.disabled = true; });
354
- state.textContent = 'Checking…';
355
- details.textContent = '';
356
- root.querySelector('tbody').replaceChildren();
357
- root.querySelector('table').hidden = true;
358
- try {
359
- if (!this.host?.run) throw new Error('Security runtime is unavailable');
360
- let response;
361
- try { response = await this.host.run(action, [...args, '--json']); }
362
- catch (error) {
363
- try { response = JSON.parse(error.message); } catch { throw error; }
364
- }
365
- const report = typeof response === 'string' ? JSON.parse(response) : typeof response?.output === 'string' ? JSON.parse(response.output) : response;
366
- if (!report || typeof report !== 'object') throw new Error('No audit report returned');
367
- if (report.status === 'failed') throw new Error(report.error);
368
- if (report.schema === 'security-device/v1' && !args.includes('--answers-json')) {
369
- const form = root.querySelector('#device-checks'); form.replaceChildren();
370
- for (const check of report.checks) {
371
- const label = document.createElement('label'); label.style.display = 'block';
372
- const title = document.createElement('p'); title.textContent = `${check.title}: ${check.remediation}`;
373
- const select = document.createElement('select'); select.dataset.check = check.id; select.setAttribute('aria-label', check.title);
374
- for (const [value, text] of [['unknown', 'Not checked'], ['secure', 'Reviewed — protection confirmed'], ['needs-attention', 'Needs attention']]) { const option = document.createElement('option'); option.value = value; option.textContent = text; select.append(option); }
375
- select.addEventListener('change', () => { select.dataset.observedAt = new Date().toISOString(); });
376
- label.append(title, select); form.append(label);
377
- }
378
- root.querySelector('#device-review').hidden = false;
379
- }
380
- state.textContent = `${report.status || (report.total_findings ? 'Findings require review' : 'Audit returned')} · ${report.timestamp || 'No observation timestamp supplied'}`;
381
- const rows = report.checks?.map(check => [check.id, check.state, check.remediation || check.reason || 'Observed']) || report.machines?.map(machine => [machine.hostname, machine.report?.status || machine.state, machine.reason || `${machine.report.coverage.observed}/${machine.report.coverage.total} checks observed`]) || [];
382
- if (rows.length) {
383
- root.querySelector('table').hidden = false;
384
- for (const row of rows) {
385
- const tr = document.createElement('tr');
386
- row.forEach(value => { const td = document.createElement('td'); td.textContent = value; tr.append(td); });
387
- root.querySelector('tbody').append(tr);
388
- }
389
- }
390
- details.textContent = JSON.stringify(report, null, 2);
391
- } catch (error) { state.textContent = 'Audit unavailable'; details.textContent = error.message; }
392
- finally { root.querySelectorAll('button,input,select').forEach(button => { button.disabled = false; }); }
393
- }
394
- }
395
-
396
- if (!customElements.get('tr-security-card')) customElements.define('tr-security-card', SecuritySecurityCard);
@@ -1,98 +0,0 @@
1
- export class SecuritySecurityCard extends HTMLElement {
2
- connectedCallback() {
3
- if (this.shadowRoot) return;
4
- const root = this.attachShadow({ mode: 'open' });
5
- root.innerHTML = `<style>
6
- :host{display:block;color:#edf3fa;background:#16222e;font:14px system-ui;border-radius:12px;padding:18px}header{display:flex;align-items:center;gap:12px}svg{width:32px;height:38px;color:#73d6bf}h2{margin:0;font-size:20px}p{color:#bbcad6;line-height:1.5}nav{display:flex;gap:8px;flex-wrap:wrap}button,input,select{min-height:44px;border:1px solid #71928e;border-radius:6px;padding:8px 12px;background:#213644;color:inherit}button{cursor:pointer}button:disabled{opacity:.5}input{min-width:0;flex:1}#state{margin:14px 0;color:#73d6bf}table{width:100%;border-collapse:collapse}td,th{padding:10px 6px;text-align:left;border-bottom:1px solid #3a4e5c;vertical-align:top}td:last-child{line-height:1.5}pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:360px;overflow:auto}.scroll{overflow:auto}
7
- </style><header><svg viewBox="0 0 32 38" fill="none" aria-hidden="true"><path d="M16 2 29 8v11c0 8-7 14-13 17C10 33 3 27 3 19V8Z" stroke="currentColor" stroke-width="2"/><path d="m9 19 5 5 10-12" stroke="currentColor" stroke-width="2"/></svg><h2>Security Assessments</h2></header>
8
- <p>Inspect this machine or your mesh. Review firewall, SSH, disk protection, and listening services with concrete remediation.</p>
9
- <nav><button data-action="machine">This machine</button><button data-action="fleet">Mesh fleet</button><button data-action="plugins">Plugin audit</button><button data-action="harden">Hardening plan</button></nav>
10
- <nav style="margin-top:10px"><input id="target" aria-label="Machine name" placeholder="Optional mesh machine name"><button id="selected">Audit selected</button></nav>
11
- <nav style="margin-top:10px"><input id="website" type="url" aria-label="Authorized HTTPS website" placeholder="https://your-site.example"><button id="probe">Check website</button></nav>
12
- <nav style="margin-top:10px"><input id="source" aria-label="Source directory" placeholder="Source directory"><button id="scan">Scan source</button><button id="permissions">Repair local SSH permissions</button></nav>
13
- <nav style="margin-top:10px"><select id="platform" aria-label="Device platform"><option value="ios">iPhone</option><option value="ipados">iPad</option><option value="android">Android</option><option value="chromeos">Chromebook</option><option value="chromeos-flex">ChromeOS Flex</option><option value="windows">Windows</option></select><input id="device" aria-label="Device label" placeholder="Device label (no passwords)"><button id="review-device">Review device</button></nav>
14
- <section id="device-review" hidden><p>Manual device review — answers are your observations, not an automatic scan. Unknown checks remain unverified. Never enter passwords or recovery keys.</p><div id="device-checks"></div><button id="evaluate-device">Evaluate review</button></section>
15
- <nav style="margin-top:10px"><input id="android-serial" aria-label="Already authorized Android serial" placeholder="Already authorized Android serial"><button id="android-check">Read Android properties</button></nav>
16
- <div id="state" role="status">Not audited</div><div class="scroll"><table hidden><thead><tr><th>Check / machine</th><th>State</th><th>Remediation / coverage</th></tr></thead><tbody></tbody></table></div><pre id="details"></pre>`;
17
- root.querySelectorAll('[data-action]').forEach(button => button.addEventListener('click', () => this.execute(button.dataset.action)));
18
- root.querySelector('#selected').addEventListener('click', () => {
19
- const target = root.querySelector('#target').value.trim();
20
- if (!target) { root.querySelector('#state').textContent = 'Enter a discovered machine name'; return; }
21
- this.execute('fleet', ['--target', target]);
22
- });
23
- root.querySelector('#probe').addEventListener('click', () => {
24
- const website = root.querySelector('#website').value.trim();
25
- try {
26
- const url = new URL(website);
27
- if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash) throw new Error();
28
- } catch { root.querySelector('#state').textContent = 'Enter an authorized HTTPS URL without credentials or query'; return; }
29
- this.execute('probe', ['--url', website]);
30
- });
31
- root.querySelector('#scan').addEventListener('click', () => {
32
- const source = root.querySelector('#source').value.trim();
33
- if (!source) { root.querySelector('#state').textContent = 'Enter a source directory'; return; }
34
- this.execute('scan', [source]);
35
- });
36
- root.querySelector('#permissions').addEventListener('click', () => this.execute('machine', ['--apply-permissions']));
37
- const resetReview = () => { root.querySelector('#device-review').hidden = true; root.querySelector('#device-checks').replaceChildren(); };
38
- root.querySelector('#platform').addEventListener('change', resetReview);
39
- root.querySelector('#device').addEventListener('input', resetReview);
40
- const identity = () => ['--platform', root.querySelector('#platform').value, '--device', root.querySelector('#device').value.trim()];
41
- root.querySelector('#review-device').addEventListener('click', () => this.execute('device', identity()));
42
- root.querySelector('#evaluate-device').addEventListener('click', () => {
43
- const observations = {};
44
- root.querySelectorAll('#device-checks select').forEach(select => { if (select.dataset.observedAt) observations[select.dataset.check] = { status: select.value, observedAt: select.dataset.observedAt }; });
45
- this.execute('device', [...identity(), '--answers-json', JSON.stringify(observations)]);
46
- });
47
- root.querySelector('#android-check').addEventListener('click', () => this.execute('android', ['--serial', root.querySelector('#android-serial').value.trim()]));
48
- }
49
- async execute(action, args = []) {
50
- const root = this.shadowRoot;
51
- const state = root.querySelector('#state');
52
- const details = root.querySelector('#details');
53
- root.querySelectorAll('button,input,select').forEach(button => { button.disabled = true; });
54
- state.textContent = 'Checking…';
55
- details.textContent = '';
56
- root.querySelector('tbody').replaceChildren();
57
- root.querySelector('table').hidden = true;
58
- try {
59
- if (!this.host?.run) throw new Error('Security runtime is unavailable');
60
- let response;
61
- try { response = await this.host.run(action, [...args, '--json']); }
62
- catch (error) {
63
- try { response = JSON.parse(error.message); } catch { throw error; }
64
- }
65
- const report = typeof response === 'string' ? JSON.parse(response) : typeof response?.output === 'string' ? JSON.parse(response.output) : response;
66
- if (!report || typeof report !== 'object') throw new Error('No audit report returned');
67
- if (report.status === 'failed') throw new Error(report.error);
68
- if (report.schema === 'security-device/v1' && !args.includes('--answers-json')) {
69
- const form = root.querySelector('#device-checks'); form.replaceChildren();
70
- for (const check of report.checks) {
71
- const label = document.createElement('label'); label.style.display = 'block';
72
- const title = document.createElement('p'); title.textContent = `${check.title}: ${check.remediation}`;
73
- const select = document.createElement('select'); select.dataset.check = check.id; select.setAttribute('aria-label', check.title);
74
- for (const [value, text] of [['unknown', 'Not checked'], ['secure', 'Reviewed — protection confirmed'], ['needs-attention', 'Needs attention']]) { const option = document.createElement('option'); option.value = value; option.textContent = text; select.append(option); }
75
- select.addEventListener('change', () => { select.dataset.observedAt = new Date().toISOString(); });
76
- label.append(title, select); form.append(label);
77
- }
78
- root.querySelector('#device-review').hidden = false;
79
- }
80
- state.textContent = `${report.status || (report.total_findings ? 'Findings require review' : 'Audit returned')} · ${report.timestamp || 'No observation timestamp supplied'}`;
81
- const rows = report.checks?.map(check => [check.id, check.state, check.remediation || check.reason || 'Observed']) || report.machines?.map(machine => [machine.hostname, machine.report?.status || machine.state, machine.reason || `${machine.report.coverage.observed}/${machine.report.coverage.total} checks observed`]) || [];
82
- if (rows.length) {
83
- root.querySelector('table').hidden = false;
84
- for (const row of rows) {
85
- const tr = document.createElement('tr');
86
- row.forEach(value => { const td = document.createElement('td'); td.textContent = value; tr.append(td); });
87
- root.querySelector('tbody').append(tr);
88
- }
89
- }
90
- details.textContent = JSON.stringify(report, null, 2);
91
- } catch (error) { state.textContent = 'Audit unavailable'; details.textContent = error.message; }
92
- finally { root.querySelectorAll('button,input,select').forEach(button => { button.disabled = false; }); }
93
- }
94
- }
95
- if (!customElements.get('tr-security-card')) customElements.define('tr-security-card', SecuritySecurityCard);
96
-
97
- class SecurityPanel extends SecuritySecurityCard {}
98
- if (!customElements.get('security-panel')) customElements.define('security-panel', SecurityPanel);
@@ -1,15 +0,0 @@
1
- # SSSS workbench
2
-
3
- Operators use this face to inspect an installation, verify a document or registry lock, and prepare a new project. The first screen shows the engine and spec versions alongside separate skill and scaffold results. A failure names the affected part and the last attempt.
4
-
5
- An amber spine connects the two installation layers to the engine identity. The verification controls are grouped by artifact, with a scrollable result below. This matches the work of examining a contract and its evidence. The scaffold action has its own path field and creates a new directory. Repair restores the selected brain's managed files and preserves its skill wrapper.
6
-
7
- The mark is a set of four offset strokes sharing a spine. The panel uses ink, parchment and amber with a monospace reading for file paths and integrity pins. A short movement on result changes draws attention to the current verdict and respects reduced motion.
8
-
9
- tokens:
10
- color: "#b98439"
11
- accent: "#f4c97a"
12
- font: "ibm-plex"
13
- density: "compact"
14
- radius: "sm"
15
- header: "ledger-rule"