total-recall-brain 3.45.0 → 3.46.1

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 (363) hide show
  1. package/bin/total-recall.mjs +7 -2
  2. package/frontend/dist/assets/index-BRYE1jmv.css +1 -0
  3. package/frontend/dist/assets/index-D1goIPjC.js +5598 -0
  4. package/frontend/dist/index.html +2 -2
  5. package/frontend/dist/sw.js +5 -4
  6. package/frontend/src/App.tsx +183 -236
  7. package/frontend/src/api/auth-inventory.ts +62 -0
  8. package/frontend/src/api/memory.ts +13 -8
  9. package/frontend/src/api/plugin-credentials.ts +23 -0
  10. package/frontend/src/api/plugins.ts +37 -53
  11. package/frontend/src/api/workspace-drawers.ts +97 -0
  12. package/frontend/src/components/BrainSelector.tsx +9 -3
  13. package/frontend/src/components/plugins/PluginPanel.tsx +83 -42
  14. package/frontend/src/components/plugins/PluginSettings.tsx +10 -20
  15. package/frontend/src/components/plugins/PluginWorkspace.tsx +367 -0
  16. package/frontend/src/components/plugins/ScopedPluginCommands.tsx +142 -0
  17. package/frontend/src/components/plugins/plugin-frame.ts +44 -33
  18. package/frontend/src/components/plugins/scoped-plugin-operations.ts +28 -0
  19. package/frontend/src/components/workspace/DrawerChat.tsx +110 -0
  20. package/frontend/src/components/workspace/DrawerLayout.tsx +196 -0
  21. package/frontend/src/components/workspace/DrawerMarkup.tsx +49 -0
  22. package/frontend/src/components/workspace/PluginChunkLibrary.tsx +92 -0
  23. package/frontend/src/components/workspace/PluginHome.tsx +76 -0
  24. package/frontend/src/components/workspace/WorkspaceDrawers.tsx +96 -0
  25. package/frontend/src/components/workspace/WorkspacePage.tsx +95 -0
  26. package/frontend/src/components/workspace/usePluginDesign.ts +38 -0
  27. package/frontend/src/index.css +409 -136
  28. package/frontend/src/pages/HelpPage.tsx +15 -46
  29. package/frontend/src/pages/MemoryPage.tsx +19 -36
  30. package/frontend/src/pages/SettingsPage.tsx +1 -1
  31. package/metadata.plugin.schema.json +53 -227
  32. package/package.json +1 -1
  33. package/scaffold/.agent/skills/plugin/SKILL.md +13 -11
  34. package/scaffold/.agent/skills/plugin/evals/README.md +14 -21
  35. package/scaffold/.agent/skills/plugin/evals/cases/01-fabricated-seed.mjs +15 -18
  36. package/scaffold/.agent/skills/plugin/evals/cases/02-reassuring-default.mjs +19 -24
  37. package/scaffold/.agent/skills/plugin/evals/cases/03-declared-template.mjs +12 -20
  38. package/scaffold/.agent/skills/plugin/evals/cases/04-home-collects-credential.mjs +35 -0
  39. package/scaffold/.agent/skills/plugin/evals/cases/05-host-leak-in-scaffold.mjs +8 -28
  40. package/scaffold/.agent/skills/plugin/evals/cases/06-correct-plugin.mjs +85 -47
  41. package/scaffold/.agent/skills/plugin/evals/run.mjs +17 -18
  42. package/scaffold/.agent/skills/plugin/prompts/05-credentials.md +4 -4
  43. package/scaffold/.agent/skills/plugin/prompts/07-scaffold.md +2 -2
  44. package/scaffold/.agent/skills/plugin/prompts/08-verify.md +4 -4
  45. package/scaffold/.agent/skills/plugin/references/anti-patterns.md +2 -2
  46. package/scaffold/.agent/skills/plugin/references/generative-home.md +38 -0
  47. package/scaffold/.agent/skills/plugin/references/scaffold.md +5 -5
  48. package/scaffold/.agent/skills/plugin/references/surfaces.md +13 -4
  49. package/scaffold/.agent/skills/plugin/scripts/record.mjs +75 -153
  50. package/scaffold/.agent/skills/plugin/subagents/plugin-reviewer.md +4 -4
  51. package/scaffold/.agent/skills/total-recall/plugins/auth/DESIGN.md +76 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +3 -1
  53. package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +20 -15
  54. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +6 -6
  55. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +2 -1
  56. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +13 -51
  57. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/access-overview.md +17 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/agent-login.md +20 -0
  59. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/baseline-audit.md +22 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-repository-binding.md +17 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-store-maintenance.md +17 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-password.md +18 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-sessions.md +18 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/endpoint-probe.md +23 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/google-sign-in.md +21 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/mesh-machines.md +16 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/passkey-enrollment.md +21 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/registered-brains.md +16 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/scoped-access-keys.md +17 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/secret-inventory.md +25 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/signing-key-rotation.md +22 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +375 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/automations/{ui/DESIGN.md → DESIGN.md} +32 -21
  74. package/scaffold/.agent/skills/total-recall/plugins/automations/adapters.mjs +17 -1
  75. package/scaffold/.agent/skills/total-recall/plugins/automations/cli.mjs +10 -1
  76. package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +6 -6
  77. package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +4 -3
  78. package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +11 -27
  79. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/automations.js +2 -2
  80. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/control-ledger.md +42 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/local-inventory-triage.md +17 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/pending-control.md +39 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/run-evidence.md +41 -0
  84. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/schedule-vs-run-evidence.md +17 -0
  85. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/source-coverage.md +41 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/{card.js → home.js} +32 -27
  87. package/scaffold/.agent/skills/total-recall/plugins/code-quality/DESIGN.md +53 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +23 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +4 -2
  90. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +4 -2
  91. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -6
  92. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +2 -1
  93. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +40 -40
  94. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/config.md +15 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/detect.md +15 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/gate.md +15 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/init.md +15 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/report.md +17 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/run.md +17 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/snapshot.md +15 -0
  101. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +55 -23
  102. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/home.mjs +214 -0
  103. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/DESIGN.md +146 -0
  104. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -6
  105. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +2 -1
  106. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +51 -34
  107. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +1 -1
  108. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/create.md +35 -0
  109. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/history.md +35 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/library.md +49 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/list.md +42 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/promote.md +40 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/read.md +25 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/remove.md +26 -0
  115. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/rollback.md +26 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/show.md +53 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/status.md +40 -0
  118. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test-path.md +38 -0
  119. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test.md +46 -0
  120. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/update.md +32 -0
  121. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/home.js +533 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/embeddings/DESIGN.md +110 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -6
  124. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +2 -1
  125. package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +13 -10
  126. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/benchmark.md +49 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/coverage.md +53 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/models.md +43 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/pull.md +41 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/status.md +59 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/home.js +353 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/git/DESIGN.md +31 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/git/README.md +25 -1
  134. package/scaffold/.agent/skills/total-recall/plugins/git/cli.mjs +5 -1
  135. package/scaffold/.agent/skills/total-recall/plugins/git/package-lock.json +6 -6
  136. package/scaffold/.agent/skills/total-recall/plugins/git/package.json +2 -1
  137. package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +17 -27
  138. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit-memory.mjs +30 -6
  139. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/fleet.mjs +24 -6
  140. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/secret-firewall.mjs +33 -7
  141. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/undo.mjs +29 -5
  142. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/unmerged.mjs +182 -0
  143. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/change-comparison.md +27 -0
  144. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/commit-identity.md +22 -0
  145. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/create-worktree.md +25 -0
  146. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/registered-worktrees.md +22 -0
  147. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/remove-worktree.md +23 -0
  148. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/repository-ledger.md +25 -0
  149. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/unmerged-work.md +22 -0
  150. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/upstream-divergence.md +17 -0
  151. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-conflict-triage.md +17 -0
  152. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-terminal.md +22 -0
  153. package/scaffold/.agent/skills/total-recall/plugins/git/ui/home.js +273 -0
  154. package/scaffold/.agent/skills/total-recall/plugins/mesh/DESIGN.md +35 -0
  155. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +4 -5
  156. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +9 -3
  157. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +6 -6
  158. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +2 -1
  159. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +37 -39
  160. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +5 -3
  161. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/active-device-dispatch.md +22 -0
  162. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-probe.md +25 -0
  163. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-server.md +22 -0
  164. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/credential-readiness.md +23 -0
  165. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/elected-leader.md +22 -0
  166. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/enrollment-key.md +22 -0
  167. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/file-receipt.md +25 -0
  168. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-execution.md +23 -0
  169. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-presence.md +23 -0
  170. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/interactive-ssh.md +22 -0
  171. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/local-enrollment.md +23 -0
  172. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/mesh-policy.md +23 -0
  173. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/network-atlas.md +25 -0
  174. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-roster.md +26 -0
  175. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-selection-proof.md +17 -0
  176. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/owner-observations.md +23 -0
  177. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/peer-path.md +23 -0
  178. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/pinned-leader.md +24 -0
  179. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/reachability-evidence-ladder.md +17 -0
  180. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/recorded-login.md +23 -0
  181. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/remote-execution.md +22 -0
  182. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/secret-grants.md +26 -0
  183. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/{card.js → home.js} +93 -22
  184. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/DESIGN.md +86 -0
  185. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/README.md +19 -0
  186. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +5 -1
  187. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +6 -6
  188. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +2 -1
  189. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +43 -22
  190. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/chat.mjs +80 -0
  191. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/adapter-docs-freshness.md +16 -0
  192. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/chat-handoff.md +26 -0
  193. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/fleet-maintenance.md +21 -0
  194. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/harness-inventory.md +21 -0
  195. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-access.md +18 -0
  196. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-usage-verification.md +15 -0
  197. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/independent-review.md +17 -0
  198. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/managed-execution.md +20 -0
  199. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/official-documentation.md +18 -0
  200. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/quota-recovery.md +21 -0
  201. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/review-routing-decision.md +16 -0
  202. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/route-work.md +18 -0
  203. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/routing-evidence.md +18 -0
  204. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/run-ledger.md +18 -0
  205. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/home.js +198 -0
  206. package/scaffold/.agent/skills/total-recall/plugins/openwiki/DESIGN.md +75 -0
  207. package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +2 -0
  208. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +17 -14
  209. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +6 -6
  210. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +2 -1
  211. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +10 -44
  212. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +5 -4
  213. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +3 -4
  214. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +23 -18
  215. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +8 -3
  216. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +6 -3
  217. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +3 -5
  218. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +21 -47
  219. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +17 -6
  220. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/auto-refresh.md +18 -0
  221. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/bootstrap-pages.md +18 -0
  222. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generate-wiki.md +21 -0
  223. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generator-settings.md +18 -0
  224. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/host-probe.md +18 -0
  225. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/ingest-preview.md +18 -0
  226. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-hygiene.md +21 -0
  227. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-topology.md +19 -0
  228. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/passage-search.md +19 -0
  229. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/propagation-plan.md +18 -0
  230. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/provider-credentials.md +18 -0
  231. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/refresh-report.md +18 -0
  232. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/task-evidence.md +22 -0
  233. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/upstream-record.md +18 -0
  234. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/watch-upstream.md +18 -0
  235. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/wiki-atlas.md +19 -0
  236. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +261 -513
  237. package/scaffold/.agent/skills/total-recall/plugins/security/DESIGN.md +84 -0
  238. package/scaffold/.agent/skills/total-recall/plugins/security/README.md +4 -2
  239. package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +7 -19
  240. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -6
  241. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +2 -3
  242. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +19 -52
  243. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/device-evidence.md +21 -0
  244. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/evidence-desk.md +18 -0
  245. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/guided-device-review.md +17 -0
  246. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/host-and-network.md +21 -0
  247. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/https-headers.md +17 -0
  248. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/mesh-coverage.md +18 -0
  249. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/private-security-tools.md +16 -0
  250. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/single-origin-header-check.md +17 -0
  251. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/source-review.md +21 -0
  252. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/ssh-permission-plan.md +17 -0
  253. package/scaffold/.agent/skills/total-recall/plugins/security/ui/home.js +283 -0
  254. package/scaffold/.agent/skills/total-recall/plugins/ssss/DESIGN.md +93 -0
  255. package/scaffold/.agent/skills/total-recall/plugins/ssss/package-lock.json +2 -2
  256. package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +2 -1
  257. package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +5 -3
  258. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/conformance.md +26 -0
  259. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/registry.md +37 -0
  260. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/repair.md +42 -0
  261. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/scaffold.md +33 -0
  262. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/status.md +43 -0
  263. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validate.md +34 -0
  264. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validation-diagnostics.md +17 -0
  265. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/workspace-registry-preflight.md +17 -0
  266. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/home.js +348 -0
  267. package/scaffold/.agent/skills/total-recall/references/operations.md +2 -0
  268. package/src/cli/api.mjs +3 -3
  269. package/src/cli/brief.mjs +3 -0
  270. package/src/cli/config.mjs +16 -0
  271. package/src/cli/connect.mjs +2 -7
  272. package/src/cli/plugin/chunks.mjs +145 -0
  273. package/src/cli/plugin/create.mjs +24 -52
  274. package/src/cli/plugin/index.mjs +20 -9
  275. package/src/cli/setup.mjs +2 -9
  276. package/src/cli/start.mjs +1 -0
  277. package/src/cli/startup.mjs +18 -0
  278. package/src/core/app-deploy/design-tokens.mjs +14 -9
  279. package/src/core/app-deploy/ui-elements.mjs +1 -1
  280. package/src/core/brain-registry.mjs +5 -0
  281. package/src/core/brain-updates.mjs +5 -1
  282. package/src/core/daemon-control.mjs +5 -1
  283. package/src/core/dashboard-bundle.mjs +261 -0
  284. package/src/core/default-plugin-refresh.mjs +39 -0
  285. package/src/core/ensure-dependencies.mjs +19 -15
  286. package/src/core/memory-brain.mjs +30 -8
  287. package/src/core/plugin-activation.mjs +63 -20
  288. package/src/core/plugin-contracts/{card.mjs → manifest.mjs} +23 -57
  289. package/src/core/plugin-contracts/startup-check.mjs +49 -0
  290. package/src/core/plugin-contracts/ui.mjs +9 -3
  291. package/src/core/plugin-distribution.mjs +6 -6
  292. package/src/core/plugin-lifecycle.mjs +58 -0
  293. package/src/core/plugin-loader.mjs +9 -5
  294. package/src/core/plugin-runner.mjs +21 -10
  295. package/src/core/plugin-startup-checks.mjs +44 -0
  296. package/src/core/plugin-state.mjs +19 -5
  297. package/src/core/plugin-store.mjs +30 -11
  298. package/src/core/project-id.mjs +15 -5
  299. package/src/core/required-plugins.mjs +31 -6
  300. package/src/core/schema.mjs +2 -0
  301. package/src/core/ssss-operation-service.mjs +1 -0
  302. package/src/core/startup-health.mjs +28 -3
  303. package/src/core/testing/plugin-fixture.mjs +22 -21
  304. package/src/core/throttled-fetch.mjs +25 -18
  305. package/src/core/ui-chunk-choice.mjs +77 -0
  306. package/src/core/ui-chunk.registry.json +23 -0
  307. package/src/core/ui-chunks.mjs +434 -0
  308. package/src/core/vault-cache.mjs +58 -59
  309. package/src/core/workspace-compositions.mjs +151 -0
  310. package/src/core/workspace-drawers.mjs +79 -0
  311. package/src/server/api.mjs +4 -27
  312. package/src/server/index.mjs +28 -21
  313. package/src/server/memory-events.mjs +31 -0
  314. package/src/server/plugin-brain-targets.mjs +89 -0
  315. package/src/server/rest.mjs +2 -0
  316. package/src/server/route-inventory.mjs +3 -2
  317. package/src/server/route-manifest.json +52 -4
  318. package/src/server/routes/_shared.mjs +7 -14
  319. package/src/server/routes/brains.mjs +29 -44
  320. package/src/server/routes/dashboard.mjs +26 -0
  321. package/src/server/routes/plugins.mjs +154 -45
  322. package/src/server/routes/ui-chunks.mjs +192 -0
  323. package/frontend/dist/assets/index-DACh1dhx.js +0 -5613
  324. package/frontend/dist/assets/index-DtwsDyFM.css +0 -1
  325. package/frontend/src/components/plugins/card/CardEngine.tsx +0 -108
  326. package/frontend/src/components/plugins/card/CardScenes.tsx +0 -103
  327. package/frontend/src/components/plugins/card/ExecutionPicker.tsx +0 -64
  328. package/frontend/src/components/plugins/card/args.ts +0 -28
  329. package/frontend/src/components/plugins/card/card.css +0 -32
  330. package/frontend/src/components/plugins/card/cli-line.ts +0 -13
  331. package/frontend/src/components/plugins/card/contract.ts +0 -91
  332. package/frontend/src/components/plugins/card/format.ts +0 -49
  333. package/frontend/src/components/plugins/card/runner-context.ts +0 -11
  334. package/frontend/src/components/plugins/card/runner.tsx +0 -43
  335. package/frontend/src/components/plugins/card/theme.ts +0 -35
  336. package/frontend/src/components/plugins/card/use-source.ts +0 -22
  337. package/frontend/src/components/plugins/card/widgets.tsx +0 -94
  338. package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +0 -23
  339. package/frontend/src/pages/PluginsPage.tsx +0 -1719
  340. package/scaffold/.agent/skills/plugin/evals/cases/04-card-collects-credential.mjs +0 -47
  341. package/scaffold/.agent/skills/plugin/prompts/06-card.md +0 -46
  342. package/scaffold/.agent/skills/plugin/references/card.md +0 -90
  343. package/scaffold/.agent/skills/plugin/subagents/card-designer.md +0 -60
  344. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +0 -67
  345. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +0 -1179
  346. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +0 -32
  347. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +0 -588
  348. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +0 -575
  349. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/DESIGN.md +0 -32
  350. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +0 -482
  351. package/scaffold/.agent/skills/total-recall/plugins/git/ui/DESIGN.md +0 -100
  352. package/scaffold/.agent/skills/total-recall/plugins/git/ui/card.js +0 -637
  353. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +0 -217
  354. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/DESIGN.md +0 -32
  355. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +0 -1276
  356. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +0 -45
  357. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +0 -1401
  358. package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +0 -4
  359. package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +0 -41
  360. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +0 -396
  361. package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +0 -98
  362. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/DESIGN.md +0 -15
  363. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/card.js +0 -182
@@ -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"