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.
- package/bin/total-recall.mjs +7 -2
- package/frontend/dist/assets/index-BRYE1jmv.css +1 -0
- package/frontend/dist/assets/index-D1goIPjC.js +5598 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/dist/sw.js +5 -4
- package/frontend/src/App.tsx +183 -236
- package/frontend/src/api/auth-inventory.ts +62 -0
- package/frontend/src/api/memory.ts +13 -8
- package/frontend/src/api/plugin-credentials.ts +23 -0
- package/frontend/src/api/plugins.ts +37 -53
- package/frontend/src/api/workspace-drawers.ts +97 -0
- package/frontend/src/components/BrainSelector.tsx +9 -3
- package/frontend/src/components/plugins/PluginPanel.tsx +83 -42
- package/frontend/src/components/plugins/PluginSettings.tsx +10 -20
- package/frontend/src/components/plugins/PluginWorkspace.tsx +367 -0
- package/frontend/src/components/plugins/ScopedPluginCommands.tsx +142 -0
- package/frontend/src/components/plugins/plugin-frame.ts +44 -33
- package/frontend/src/components/plugins/scoped-plugin-operations.ts +28 -0
- package/frontend/src/components/workspace/DrawerChat.tsx +110 -0
- package/frontend/src/components/workspace/DrawerLayout.tsx +196 -0
- package/frontend/src/components/workspace/DrawerMarkup.tsx +49 -0
- package/frontend/src/components/workspace/PluginChunkLibrary.tsx +92 -0
- package/frontend/src/components/workspace/PluginHome.tsx +76 -0
- package/frontend/src/components/workspace/WorkspaceDrawers.tsx +96 -0
- package/frontend/src/components/workspace/WorkspacePage.tsx +95 -0
- package/frontend/src/components/workspace/usePluginDesign.ts +38 -0
- package/frontend/src/index.css +409 -136
- package/frontend/src/pages/HelpPage.tsx +15 -46
- package/frontend/src/pages/MemoryPage.tsx +19 -36
- package/frontend/src/pages/SettingsPage.tsx +1 -1
- package/metadata.plugin.schema.json +53 -227
- package/package.json +1 -1
- package/scaffold/.agent/skills/plugin/SKILL.md +13 -11
- package/scaffold/.agent/skills/plugin/evals/README.md +14 -21
- package/scaffold/.agent/skills/plugin/evals/cases/01-fabricated-seed.mjs +15 -18
- package/scaffold/.agent/skills/plugin/evals/cases/02-reassuring-default.mjs +19 -24
- package/scaffold/.agent/skills/plugin/evals/cases/03-declared-template.mjs +12 -20
- package/scaffold/.agent/skills/plugin/evals/cases/04-home-collects-credential.mjs +35 -0
- package/scaffold/.agent/skills/plugin/evals/cases/05-host-leak-in-scaffold.mjs +8 -28
- package/scaffold/.agent/skills/plugin/evals/cases/06-correct-plugin.mjs +85 -47
- package/scaffold/.agent/skills/plugin/evals/run.mjs +17 -18
- package/scaffold/.agent/skills/plugin/prompts/05-credentials.md +4 -4
- package/scaffold/.agent/skills/plugin/prompts/07-scaffold.md +2 -2
- package/scaffold/.agent/skills/plugin/prompts/08-verify.md +4 -4
- package/scaffold/.agent/skills/plugin/references/anti-patterns.md +2 -2
- package/scaffold/.agent/skills/plugin/references/generative-home.md +38 -0
- package/scaffold/.agent/skills/plugin/references/scaffold.md +5 -5
- package/scaffold/.agent/skills/plugin/references/surfaces.md +13 -4
- package/scaffold/.agent/skills/plugin/scripts/record.mjs +75 -153
- package/scaffold/.agent/skills/plugin/subagents/plugin-reviewer.md +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/auth/DESIGN.md +76 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +3 -1
- package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +20 -15
- package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +13 -51
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/access-overview.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/agent-login.md +20 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/baseline-audit.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-repository-binding.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-store-maintenance.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-password.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-sessions.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/endpoint-probe.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/google-sign-in.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/mesh-machines.md +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/passkey-enrollment.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/registered-brains.md +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/scoped-access-keys.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/secret-inventory.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/signing-key-rotation.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +375 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/{ui/DESIGN.md → DESIGN.md} +32 -21
- package/scaffold/.agent/skills/total-recall/plugins/automations/adapters.mjs +17 -1
- package/scaffold/.agent/skills/total-recall/plugins/automations/cli.mjs +10 -1
- package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +4 -3
- package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +11 -27
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/automations.js +2 -2
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/control-ledger.md +42 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/local-inventory-triage.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/pending-control.md +39 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/run-evidence.md +41 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/schedule-vs-run-evidence.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/source-coverage.md +41 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/{card.js → home.js} +32 -27
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/DESIGN.md +53 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +4 -2
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +4 -2
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +40 -40
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/config.md +15 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/detect.md +15 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/gate.md +15 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/init.md +15 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/report.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/run.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/snapshot.md +15 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +55 -23
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/home.mjs +214 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/DESIGN.md +146 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +51 -34
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/create.md +35 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/history.md +35 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/library.md +49 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/list.md +42 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/promote.md +40 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/read.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/remove.md +26 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/rollback.md +26 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/show.md +53 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/status.md +40 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test-path.md +38 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test.md +46 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/update.md +32 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/home.js +533 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/DESIGN.md +110 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +13 -10
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/benchmark.md +49 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/coverage.md +53 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/models.md +43 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/pull.md +41 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/status.md +59 -0
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/home.js +353 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/DESIGN.md +31 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/README.md +25 -1
- package/scaffold/.agent/skills/total-recall/plugins/git/cli.mjs +5 -1
- package/scaffold/.agent/skills/total-recall/plugins/git/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/git/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +17 -27
- package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit-memory.mjs +30 -6
- package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/fleet.mjs +24 -6
- package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/secret-firewall.mjs +33 -7
- package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/undo.mjs +29 -5
- package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/unmerged.mjs +182 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/change-comparison.md +27 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/commit-identity.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/create-worktree.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/registered-worktrees.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/remove-worktree.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/repository-ledger.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/unmerged-work.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/upstream-divergence.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-conflict-triage.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-terminal.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/home.js +273 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/DESIGN.md +35 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +4 -5
- package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +9 -3
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +37 -39
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +5 -3
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/active-device-dispatch.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-probe.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-server.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/credential-readiness.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/elected-leader.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/enrollment-key.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/file-receipt.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-execution.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-presence.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/interactive-ssh.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/local-enrollment.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/mesh-policy.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/network-atlas.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-roster.md +26 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-selection-proof.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/owner-observations.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/peer-path.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/pinned-leader.md +24 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/reachability-evidence-ladder.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/recorded-login.md +23 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/remote-execution.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/secret-grants.md +26 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/{card.js → home.js} +93 -22
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/DESIGN.md +86 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/README.md +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +5 -1
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +43 -22
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/chat.mjs +80 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/adapter-docs-freshness.md +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/chat-handoff.md +26 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/fleet-maintenance.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/harness-inventory.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-access.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-usage-verification.md +15 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/independent-review.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/managed-execution.md +20 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/official-documentation.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/quota-recovery.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/review-routing-decision.md +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/route-work.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/routing-evidence.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/run-ledger.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/home.js +198 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/DESIGN.md +75 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +2 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +17 -14
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +10 -44
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +5 -4
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +3 -4
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +23 -18
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +8 -3
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +6 -3
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +3 -5
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +21 -47
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +17 -6
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/auto-refresh.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/bootstrap-pages.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generate-wiki.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generator-settings.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/host-probe.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/ingest-preview.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-hygiene.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-topology.md +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/passage-search.md +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/propagation-plan.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/provider-credentials.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/refresh-report.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/task-evidence.md +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/upstream-record.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/watch-upstream.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/wiki-atlas.md +19 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +261 -513
- package/scaffold/.agent/skills/total-recall/plugins/security/DESIGN.md +84 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/README.md +4 -2
- package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +7 -19
- package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/security/package.json +2 -3
- package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +19 -52
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/device-evidence.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/evidence-desk.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/guided-device-review.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/host-and-network.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/https-headers.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/mesh-coverage.md +18 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/private-security-tools.md +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/single-origin-header-check.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/source-review.md +21 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/ssh-permission-plan.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/home.js +283 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/DESIGN.md +93 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/package-lock.json +2 -2
- package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +2 -1
- package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +5 -3
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/conformance.md +26 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/registry.md +37 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/repair.md +42 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/scaffold.md +33 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/status.md +43 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validate.md +34 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validation-diagnostics.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/workspace-registry-preflight.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/home.js +348 -0
- package/scaffold/.agent/skills/total-recall/references/operations.md +2 -0
- package/src/cli/api.mjs +3 -3
- package/src/cli/brief.mjs +3 -0
- package/src/cli/config.mjs +16 -0
- package/src/cli/connect.mjs +2 -7
- package/src/cli/plugin/chunks.mjs +145 -0
- package/src/cli/plugin/create.mjs +24 -52
- package/src/cli/plugin/index.mjs +20 -9
- package/src/cli/setup.mjs +2 -9
- package/src/cli/start.mjs +1 -0
- package/src/cli/startup.mjs +18 -0
- package/src/core/app-deploy/design-tokens.mjs +14 -9
- package/src/core/app-deploy/ui-elements.mjs +1 -1
- package/src/core/brain-registry.mjs +5 -0
- package/src/core/brain-updates.mjs +5 -1
- package/src/core/daemon-control.mjs +5 -1
- package/src/core/dashboard-bundle.mjs +261 -0
- package/src/core/default-plugin-refresh.mjs +39 -0
- package/src/core/ensure-dependencies.mjs +19 -15
- package/src/core/memory-brain.mjs +30 -8
- package/src/core/plugin-activation.mjs +63 -20
- package/src/core/plugin-contracts/{card.mjs → manifest.mjs} +23 -57
- package/src/core/plugin-contracts/startup-check.mjs +49 -0
- package/src/core/plugin-contracts/ui.mjs +9 -3
- package/src/core/plugin-distribution.mjs +6 -6
- package/src/core/plugin-lifecycle.mjs +58 -0
- package/src/core/plugin-loader.mjs +9 -5
- package/src/core/plugin-runner.mjs +21 -10
- package/src/core/plugin-startup-checks.mjs +44 -0
- package/src/core/plugin-state.mjs +19 -5
- package/src/core/plugin-store.mjs +30 -11
- package/src/core/project-id.mjs +15 -5
- package/src/core/required-plugins.mjs +31 -6
- package/src/core/schema.mjs +2 -0
- package/src/core/ssss-operation-service.mjs +1 -0
- package/src/core/startup-health.mjs +28 -3
- package/src/core/testing/plugin-fixture.mjs +22 -21
- package/src/core/throttled-fetch.mjs +25 -18
- package/src/core/ui-chunk-choice.mjs +77 -0
- package/src/core/ui-chunk.registry.json +23 -0
- package/src/core/ui-chunks.mjs +434 -0
- package/src/core/vault-cache.mjs +58 -59
- package/src/core/workspace-compositions.mjs +151 -0
- package/src/core/workspace-drawers.mjs +79 -0
- package/src/server/api.mjs +4 -27
- package/src/server/index.mjs +28 -21
- package/src/server/memory-events.mjs +31 -0
- package/src/server/plugin-brain-targets.mjs +89 -0
- package/src/server/rest.mjs +2 -0
- package/src/server/route-inventory.mjs +3 -2
- package/src/server/route-manifest.json +52 -4
- package/src/server/routes/_shared.mjs +7 -14
- package/src/server/routes/brains.mjs +29 -44
- package/src/server/routes/dashboard.mjs +26 -0
- package/src/server/routes/plugins.mjs +154 -45
- package/src/server/routes/ui-chunks.mjs +192 -0
- package/frontend/dist/assets/index-DACh1dhx.js +0 -5613
- package/frontend/dist/assets/index-DtwsDyFM.css +0 -1
- package/frontend/src/components/plugins/card/CardEngine.tsx +0 -108
- package/frontend/src/components/plugins/card/CardScenes.tsx +0 -103
- package/frontend/src/components/plugins/card/ExecutionPicker.tsx +0 -64
- package/frontend/src/components/plugins/card/args.ts +0 -28
- package/frontend/src/components/plugins/card/card.css +0 -32
- package/frontend/src/components/plugins/card/cli-line.ts +0 -13
- package/frontend/src/components/plugins/card/contract.ts +0 -91
- package/frontend/src/components/plugins/card/format.ts +0 -49
- package/frontend/src/components/plugins/card/runner-context.ts +0 -11
- package/frontend/src/components/plugins/card/runner.tsx +0 -43
- package/frontend/src/components/plugins/card/theme.ts +0 -35
- package/frontend/src/components/plugins/card/use-source.ts +0 -22
- package/frontend/src/components/plugins/card/widgets.tsx +0 -94
- package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +0 -23
- package/frontend/src/pages/PluginsPage.tsx +0 -1719
- package/scaffold/.agent/skills/plugin/evals/cases/04-card-collects-credential.mjs +0 -47
- package/scaffold/.agent/skills/plugin/prompts/06-card.md +0 -46
- package/scaffold/.agent/skills/plugin/references/card.md +0 -90
- package/scaffold/.agent/skills/plugin/subagents/card-designer.md +0 -60
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +0 -67
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +0 -1179
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +0 -32
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +0 -588
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +0 -575
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/DESIGN.md +0 -32
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +0 -482
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/DESIGN.md +0 -100
- package/scaffold/.agent/skills/total-recall/plugins/git/ui/card.js +0 -637
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +0 -217
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/DESIGN.md +0 -32
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +0 -1276
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +0 -45
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +0 -1401
- package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +0 -4
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +0 -41
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +0 -396
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +0 -98
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/DESIGN.md +0 -15
- package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/card.js +0 -182
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
const UPSTREAM = {
|
|
2
|
+
tracking: 'Tracking local upstream',
|
|
3
|
+
none: 'No upstream configured',
|
|
4
|
+
gone: 'Upstream missing',
|
|
5
|
+
detached: 'Detached HEAD',
|
|
6
|
+
unborn: 'No commits yet',
|
|
7
|
+
unknown: 'Upstream unknown',
|
|
8
|
+
error: 'Upstream check failed'
|
|
9
|
+
};
|
|
10
|
+
const AUDIT_COUNTS = {
|
|
11
|
+
unpushed: 'unpushedCommits', behind: 'behindCommits', conflicts: 'conflictedFiles',
|
|
12
|
+
staged: 'stagedFiles', unstaged: 'unstagedFiles', untracked: 'untrackedFiles',
|
|
13
|
+
dirty: 'totalDirty', stashes: 'stashCount'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function commandError(error) {
|
|
17
|
+
try {
|
|
18
|
+
const result = JSON.parse(error.message);
|
|
19
|
+
if (typeof result.error === 'string') return result.error;
|
|
20
|
+
} catch {}
|
|
21
|
+
return error?.message || 'The owner command failed.';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
class GitHome extends HTMLElement {
|
|
25
|
+
connectedCallback() {
|
|
26
|
+
if (this.shadowRoot) return;
|
|
27
|
+
const root = this.attachShadow({ mode: 'open' });
|
|
28
|
+
root.innerHTML = `
|
|
29
|
+
<style>
|
|
30
|
+
:host {
|
|
31
|
+
display:block; padding:var(--spacing-md,16px); color:var(--color-text,CanvasText);
|
|
32
|
+
background:var(--color-background,Canvas); border:1px solid var(--color-border,currentColor);
|
|
33
|
+
border-radius:var(--radius-md,6px); font:14px/1.55 var(--typography-body-font-family,system-ui,sans-serif);
|
|
34
|
+
}
|
|
35
|
+
* { box-sizing:border-box; min-width:0; }
|
|
36
|
+
h2,h3,p,dl { margin:0; }
|
|
37
|
+
h2 { font:600 clamp(1.55rem,5vw,2.1rem)/1.15 var(--typography-heading-font-family,Georgia,serif); }
|
|
38
|
+
h3 { font-size:1.05rem; }
|
|
39
|
+
.kicker { color:var(--color-accent,currentColor); letter-spacing:.1em; text-transform:uppercase; }
|
|
40
|
+
section { margin-top:var(--spacing-md,16px); padding-top:12px; border-top:1px solid var(--color-border,currentColor); }
|
|
41
|
+
.bar,.actions { display:flex; align-items:center; flex-wrap:wrap; gap:8px 16px; }
|
|
42
|
+
.bar { justify-content:space-between; }
|
|
43
|
+
.metrics { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,7rem),1fr)); gap:8px; margin:10px 0; }
|
|
44
|
+
.metrics div { padding:8px; background:var(--color-surface,Canvas); border-radius:var(--radius-md,6px); }
|
|
45
|
+
dd { margin:0; font:600 1.05rem var(--typography-mono-font-family,ui-monospace,monospace); font-variant-numeric:tabular-nums; }
|
|
46
|
+
dt,.note { color:var(--color-muted,currentColor); }
|
|
47
|
+
#conflicts[data-alert],#unpushed[data-alert],.error { color:var(--color-danger,currentColor); }
|
|
48
|
+
#last-commit,#audit-time { overflow-wrap:anywhere; }
|
|
49
|
+
#worktrees { padding:0; list-style:none; margin:8px 0; }
|
|
50
|
+
#worktrees li {
|
|
51
|
+
border-bottom:1px solid var(--color-border,currentColor); padding:8px 0;
|
|
52
|
+
display:flex; flex-wrap:wrap; align-items:center; gap:8px; justify-content:space-between;
|
|
53
|
+
}
|
|
54
|
+
#worktrees code { display:block; overflow-wrap:anywhere; }
|
|
55
|
+
button,input,select {
|
|
56
|
+
min-height:44px; border:1px solid var(--color-border,currentColor); border-radius:var(--radius-md,6px);
|
|
57
|
+
padding:6px 10px; font:inherit; color:inherit; background:var(--color-background,Canvas);
|
|
58
|
+
}
|
|
59
|
+
button { cursor:pointer; }
|
|
60
|
+
button:disabled { opacity:.65; cursor:default; }
|
|
61
|
+
button:focus-visible,input:focus-visible,select:focus-visible {
|
|
62
|
+
outline:2px solid var(--color-accent,currentColor); outline-offset:3px;
|
|
63
|
+
}
|
|
64
|
+
label { display:grid; gap:4px; }
|
|
65
|
+
.fields { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(100%,10rem),1fr)); gap:8px; margin:8px 0; }
|
|
66
|
+
fieldset { margin:12px 0 0; padding:12px; background:var(--color-surface,Canvas); border:1px solid var(--color-border,currentColor); }
|
|
67
|
+
#confirm-text { overflow-wrap:anywhere; margin-bottom:8px; }
|
|
68
|
+
pre { overflow:auto; max-height:16rem; white-space:pre-wrap; overflow-wrap:anywhere; }
|
|
69
|
+
</style>
|
|
70
|
+
<header class="bar">
|
|
71
|
+
<div><p class="kicker">Git</p><h2>Repository ledger</h2></div>
|
|
72
|
+
<button type="button" id="refresh">Refresh repository</button>
|
|
73
|
+
</header>
|
|
74
|
+
<section aria-labelledby="audit-heading">
|
|
75
|
+
<h3 id="audit-heading">Working tree audit</h3>
|
|
76
|
+
<p id="audit-state" role="status">Reading the repository…</p>
|
|
77
|
+
<dl class="metrics">
|
|
78
|
+
<div><dt>Unpushed</dt><dd id="unpushed">—</dd></div>
|
|
79
|
+
<div><dt>Behind</dt><dd id="behind">—</dd></div>
|
|
80
|
+
<div><dt>Conflicted</dt><dd id="conflicts">—</dd></div>
|
|
81
|
+
<div><dt>Staged</dt><dd id="staged">—</dd></div>
|
|
82
|
+
<div><dt>Unstaged</dt><dd id="unstaged">—</dd></div>
|
|
83
|
+
<div><dt>Untracked</dt><dd id="untracked">—</dd></div>
|
|
84
|
+
<div><dt>Dirty files</dt><dd id="dirty">—</dd></div>
|
|
85
|
+
<div><dt>Stashes</dt><dd id="stashes">—</dd></div>
|
|
86
|
+
</dl>
|
|
87
|
+
<p id="upstream" class="note"></p>
|
|
88
|
+
<p id="last-commit"></p>
|
|
89
|
+
<p id="audit-time" class="note"></p>
|
|
90
|
+
</section>
|
|
91
|
+
<section aria-labelledby="worktree-heading">
|
|
92
|
+
<h3 id="worktree-heading">Registered worktrees</h3>
|
|
93
|
+
<p id="worktree-state" role="status">Reading worktree registrations…</p>
|
|
94
|
+
<ul id="worktrees"></ul>
|
|
95
|
+
<div id="create" hidden>
|
|
96
|
+
<div class="fields">
|
|
97
|
+
<label>New worktree path<input id="path" required></label>
|
|
98
|
+
<label>Base ref<input id="base" placeholder="HEAD"></label>
|
|
99
|
+
</div>
|
|
100
|
+
<button type="button" id="plan-create">Review detached worktree</button>
|
|
101
|
+
</div>
|
|
102
|
+
<fieldset id="confirmation" hidden>
|
|
103
|
+
<legend id="confirm-title"></legend>
|
|
104
|
+
<p id="confirm-text"></p>
|
|
105
|
+
<div class="actions">
|
|
106
|
+
<button type="button" id="confirm"></button>
|
|
107
|
+
<button type="button" id="cancel">Cancel</button>
|
|
108
|
+
</div>
|
|
109
|
+
</fieldset>
|
|
110
|
+
<p id="action-status" role="status"></p>
|
|
111
|
+
</section>
|
|
112
|
+
<section id="changes" hidden aria-label="Diff statistics">
|
|
113
|
+
<button type="button" id="show-diff" aria-expanded="false" aria-controls="diff">Inspect changed files</button>
|
|
114
|
+
<div id="diff" hidden>
|
|
115
|
+
<div class="fields">
|
|
116
|
+
<label>Comparison<select id="diff-mode"><option value="working">Working tree</option><option value="staged">Staged changes</option></select></label>
|
|
117
|
+
<label>Base ref<input id="diff-base" placeholder="Default comparison"></label>
|
|
118
|
+
</div>
|
|
119
|
+
<button type="button" id="read-diff">Read diff stats</button>
|
|
120
|
+
<p id="diff-status" role="status"></p>
|
|
121
|
+
<pre id="diff-stat"></pre>
|
|
122
|
+
</div>
|
|
123
|
+
</section>`;
|
|
124
|
+
|
|
125
|
+
const field = id => root.getElementById(id);
|
|
126
|
+
const set = (id, text) => { field(id).textContent = text; };
|
|
127
|
+
const canRun = command => this.host?.operations?.includes(command);
|
|
128
|
+
const run = async (command, args = []) => {
|
|
129
|
+
if (!this.host?.run) throw new Error('The repository command runner is unavailable.');
|
|
130
|
+
return this.host.run(command, args);
|
|
131
|
+
};
|
|
132
|
+
let busy = false;
|
|
133
|
+
let pending;
|
|
134
|
+
|
|
135
|
+
field('create').hidden = !canRun('worktree-create');
|
|
136
|
+
field('changes').hidden = !canRun('diff');
|
|
137
|
+
|
|
138
|
+
const setBusy = value => {
|
|
139
|
+
busy = value;
|
|
140
|
+
for (const control of root.querySelectorAll('#refresh, #plan-create, #worktrees button')) control.disabled = value;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const ask = (command, args, target, base = '') => {
|
|
144
|
+
if (busy || !canRun(command)) return;
|
|
145
|
+
const creating = command === 'worktree-create';
|
|
146
|
+
pending = { command, args, trigger: root.activeElement };
|
|
147
|
+
set('confirm-title', creating ? 'Create a detached worktree?' : 'Remove this linked worktree?');
|
|
148
|
+
set('confirm-text', creating ? `${target} from ${base}` : `${target}. Git will refuse removal if it contains local changes.`);
|
|
149
|
+
set('confirm', creating ? 'Confirm creation' : 'Confirm removal');
|
|
150
|
+
field('confirmation').hidden = false;
|
|
151
|
+
field('confirm').focus();
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const paintAudit = report => {
|
|
155
|
+
for (const [id, key] of Object.entries(AUDIT_COUNTS)) {
|
|
156
|
+
const value = report?.[key];
|
|
157
|
+
set(id, Number.isSafeInteger(value) ? String(value) : '—');
|
|
158
|
+
field(id).toggleAttribute('data-alert', value > 0);
|
|
159
|
+
}
|
|
160
|
+
if (!report) {
|
|
161
|
+
set('audit-state', 'Repository audit unavailable.');
|
|
162
|
+
for (const id of ['upstream', 'last-commit', 'audit-time']) set(id, '');
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const branch = report.branch || UPSTREAM[report.headState] || 'Branch unknown';
|
|
166
|
+
const state = report.isClean === true ? 'Clean working tree' : report.isClean === false ? 'Changes in working tree' : 'Working tree state unknown';
|
|
167
|
+
const incomplete = Array.isArray(report.errors) && report.errors.length ? ' Some audit checks failed.' : '';
|
|
168
|
+
set('audit-state', `${branch} · ${state}.${incomplete}`);
|
|
169
|
+
const upstream = UPSTREAM[report.upstreamStatus] || 'Upstream unknown';
|
|
170
|
+
set('upstream', report.upstream ? `${upstream} ${report.upstream}.` : upstream);
|
|
171
|
+
set('last-commit', report.lastCommit || 'Latest commit unavailable.');
|
|
172
|
+
set('audit-time', report.timestamp ? `Observed ${report.timestamp}` : '');
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const paintWorktrees = result => {
|
|
176
|
+
field('worktrees').replaceChildren();
|
|
177
|
+
if (!result) { set('worktree-state', 'Worktree inventory unavailable.'); return; }
|
|
178
|
+
set('worktree-state', `${result.worktrees.length} registered.`);
|
|
179
|
+
result.worktrees.forEach((tree, index) => {
|
|
180
|
+
const row = document.createElement('li');
|
|
181
|
+
const label = document.createElement('div');
|
|
182
|
+
const name = document.createElement('strong');
|
|
183
|
+
const path = document.createElement('code');
|
|
184
|
+
const current = tree.path === result.current;
|
|
185
|
+
const branch = tree.branch?.replace(/^refs\/heads\//, '') || (tree.detached ? 'Detached' : 'Branch unknown');
|
|
186
|
+
const markers = [index === 0 && 'Main', current && 'Current', tree.locked && 'Locked', tree.prunable && 'Prunable'].filter(Boolean);
|
|
187
|
+
name.textContent = [branch, ...markers, tree.head?.slice(0, 12)].filter(Boolean).join(' · ');
|
|
188
|
+
path.textContent = tree.path;
|
|
189
|
+
label.append(name, path);
|
|
190
|
+
row.append(label);
|
|
191
|
+
if (canRun('worktree-remove') && index > 0 && !current && !tree.locked && !tree.prunable) {
|
|
192
|
+
const remove = document.createElement('button');
|
|
193
|
+
remove.type = 'button';
|
|
194
|
+
remove.textContent = 'Review removal';
|
|
195
|
+
remove.setAttribute('aria-label', `Review removal of ${tree.path}`);
|
|
196
|
+
remove.addEventListener('click', () => ask('worktree-remove', ['--', tree.path], tree.path));
|
|
197
|
+
row.append(remove);
|
|
198
|
+
}
|
|
199
|
+
field('worktrees').append(row);
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const refresh = async () => {
|
|
204
|
+
if (busy) return;
|
|
205
|
+
pending = undefined;
|
|
206
|
+
field('confirmation').hidden = true;
|
|
207
|
+
setBusy(true);
|
|
208
|
+
set('audit-state', 'Reading the repository…');
|
|
209
|
+
set('worktree-state', 'Reading worktree registrations…');
|
|
210
|
+
try {
|
|
211
|
+
await Promise.all([
|
|
212
|
+
run('audit').then(result => paintAudit(typeof result?.headState === 'string' ? result : null), () => paintAudit(null)),
|
|
213
|
+
run('worktree-list').then(result => paintWorktrees(result?.ok === true && Array.isArray(result.worktrees) ? result : null), () => paintWorktrees(null))
|
|
214
|
+
]);
|
|
215
|
+
} finally { setBusy(false); }
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
field('refresh').addEventListener('click', () => void refresh());
|
|
219
|
+
field('plan-create').addEventListener('click', () => {
|
|
220
|
+
const target = field('path').value;
|
|
221
|
+
if (!target.trim()) return;
|
|
222
|
+
const base = field('base').value.trim() || 'HEAD';
|
|
223
|
+
ask('worktree-create', ['--base', base, '--', target], target, base);
|
|
224
|
+
});
|
|
225
|
+
field('cancel').addEventListener('click', () => {
|
|
226
|
+
const trigger = pending?.trigger;
|
|
227
|
+
pending = undefined;
|
|
228
|
+
field('confirmation').hidden = true;
|
|
229
|
+
trigger?.focus();
|
|
230
|
+
});
|
|
231
|
+
field('confirm').addEventListener('click', async () => {
|
|
232
|
+
if (busy || !pending || !canRun(pending.command)) return;
|
|
233
|
+
const { command, args } = pending;
|
|
234
|
+
pending = undefined;
|
|
235
|
+
field('confirmation').hidden = true;
|
|
236
|
+
setBusy(true);
|
|
237
|
+
set('action-status', 'Running the confirmed worktree action…');
|
|
238
|
+
try {
|
|
239
|
+
const result = await run(command, args);
|
|
240
|
+
if (result?.ok !== true) throw new Error('Git did not confirm the requested worktree change.');
|
|
241
|
+
set('action-status', result.removed ? 'Linked worktree removed.' : 'Detached worktree created.');
|
|
242
|
+
if (command === 'worktree-create') {
|
|
243
|
+
field('path').value = '';
|
|
244
|
+
field('base').value = '';
|
|
245
|
+
}
|
|
246
|
+
} catch (error) { set('action-status', commandError(error)); }
|
|
247
|
+
finally { setBusy(false); await refresh(); field('refresh').focus(); }
|
|
248
|
+
});
|
|
249
|
+
field('show-diff').addEventListener('click', event => {
|
|
250
|
+
field('diff').hidden = !field('diff').hidden;
|
|
251
|
+
event.currentTarget.setAttribute('aria-expanded', String(!field('diff').hidden));
|
|
252
|
+
});
|
|
253
|
+
field('read-diff').addEventListener('click', async () => {
|
|
254
|
+
if (!canRun('diff') || field('read-diff').disabled) return;
|
|
255
|
+
const base = field('diff-base').value.trim();
|
|
256
|
+
const args = [...(field('diff-mode').value === 'staged' ? ['--cached'] : []), ...(base ? ['--base', base] : [])];
|
|
257
|
+
field('read-diff').disabled = true;
|
|
258
|
+
set('diff-status', 'Reading diff stats…');
|
|
259
|
+
set('diff-stat', '');
|
|
260
|
+
try {
|
|
261
|
+
const result = await run('diff', args);
|
|
262
|
+
if (typeof result?.diffStat !== 'string') throw new Error('Diff statistics unavailable.');
|
|
263
|
+
const outcome = result.diffStat ? 'Comparison complete.' : 'The selected comparison has no changes.';
|
|
264
|
+
set('diff-status', result.timestamp ? `${outcome} Observed ${result.timestamp}.` : outcome);
|
|
265
|
+
set('diff-stat', result.diffStat);
|
|
266
|
+
} catch (error) { set('diff-status', commandError(error)); }
|
|
267
|
+
finally { field('read-diff').disabled = false; }
|
|
268
|
+
});
|
|
269
|
+
void refresh();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (!customElements.get('tr-git-home')) customElements.define('tr-git-home', GitHome);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Mesh Network Atlas
|
|
3
|
+
description: A pine and slate field atlas for reading a private fleet.
|
|
4
|
+
colors:
|
|
5
|
+
background: "#14221e"
|
|
6
|
+
surface: "#1f322b"
|
|
7
|
+
text: "#edf8f0"
|
|
8
|
+
border: "#617e70"
|
|
9
|
+
muted: "#bfdbcc"
|
|
10
|
+
accent: "#bbefd2"
|
|
11
|
+
ok: "#a3e8b9"
|
|
12
|
+
warn: "#ffdf99"
|
|
13
|
+
danger: "#ffbcb2"
|
|
14
|
+
typography:
|
|
15
|
+
body:
|
|
16
|
+
fontFamily: "system-ui, sans-serif"
|
|
17
|
+
heading:
|
|
18
|
+
fontFamily: "Georgia, serif"
|
|
19
|
+
mono:
|
|
20
|
+
fontFamily: "ui-monospace, monospace"
|
|
21
|
+
spacing:
|
|
22
|
+
md: 16px
|
|
23
|
+
rounded:
|
|
24
|
+
md: 8px
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Mesh Network Atlas
|
|
28
|
+
|
|
29
|
+
Use the tone of a field atlas. The ink surface holds a persistent control strip and a quiet roster of machines. Use a serif title, plain sans-serif labels, and monospace for a verified address, command, or timing. Use warm warning colors only when an observation needs attention.
|
|
30
|
+
|
|
31
|
+
In Machines, let the roster and reachability ladder share a row at wide widths and stack in that order in a drawer. The ladder keeps control membership, path, login, and execution distinct. State words accompany any color or border changes. Separate recorded facts and their timestamps from current observations. A sleeping or offline device is different from a peer whose path failed a probe.
|
|
32
|
+
|
|
33
|
+
Flows, Placement, Boundary, and Join use the same map vocabulary. Give each source its own timestamp and unavailable state. The control strip distinguishes credential presence in Auth from a verified control API. Request fleet execution explicitly. The enrollment workflow hands key issuance to an interactive terminal.
|
|
34
|
+
|
|
35
|
+
Keep targets at least 44 pixels tall. Preserve keyboard focus on refresh, use a visible outline, and announce read failures through the status region. Layout changes need no animation. The [platform map](docs/MESH_PLATFORM.md) records what the current owner commands can observe.
|
|
@@ -24,25 +24,24 @@ Peers install it with `npx total-recall plugin install peer:<this-node>/mesh`.
|
|
|
24
24
|
## Features
|
|
25
25
|
|
|
26
26
|
- **Identifier**: `mesh`
|
|
27
|
-
- **Version**: 0.1.0
|
|
28
27
|
- **SSSS Category**: `mesh-nodes`
|
|
29
28
|
- **CLI Command**: `npx total-recall mesh`
|
|
30
|
-
- **UI**:
|
|
29
|
+
- **UI**: native Mesh Home, [owner design](DESIGN.md), and SSSS blocks under `ui/chunks/`.
|
|
31
30
|
- **API key**: paste it in the plugin UI (`save-token` event) or pipe it to `npx total-recall mesh token set --stdin`; stored as `HEADSCALE_API_KEY` in the secrets store
|
|
32
31
|
|
|
33
32
|
## Install and vendor
|
|
34
33
|
|
|
35
|
-
Install the full integration with `total-recall plugin install <git URL of this repository>`. The declared standalone artifact is the control and SSH helper capability under `capability/`. The manifest lists its exports and [the capability entry](capability/index.mjs) exposes them. A consumer integration guide and independent proof remain open.
|
|
34
|
+
Install the full integration with `total-recall plugin install <git URL of this repository>`. The declared standalone artifact is the control and SSH helper capability under `capability/`. The manifest lists its exports and [the capability entry](capability/index.mjs) exposes them. A consumer integration guide and independent proof remain open. Mesh Home, host routes, and Auth and grant integration belong to the installed plugin.
|
|
36
35
|
|
|
37
36
|
The [Mesh project tracker](docs/projects/in-progress/MESH_CARD/MESH_CARD_PROJECT_TRACKER.md) separates runtime transport and authorization work from card checks.
|
|
38
37
|
|
|
39
38
|
## Mesh screens and integration declarations
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
Mesh Home defines Machines, Flows, Placement, Boundary, and Join. Machines separates control membership, path checks, recorded login, and actual execution. Hardware cells retain their measurement dates. Failed or untested runtime probes remain unknown. Select **Verify fleet execution** to run `doctor`. Placement filters confirmed capabilities and includes the integration matrix declared in `plugin.json.mesh`.
|
|
42
41
|
|
|
43
42
|
`total-recall mesh view <machines|flows|placement|boundary|join> --json` reads fixed owner commands. Each source carries its command, attempt time and either data or an explicit error. `mesh.provides` references declared operations/runtime modules; `mesh.integrations` identifies each owner and the meaning of its evidence; `mesh.endpoints` identifies served peer routes. These are declarations, not primitive grants or proof every provider action works. Read-only views never perform enrollment, policy changes, grant edits, deployments or secret transfers.
|
|
44
43
|
|
|
45
|
-
The dashboard supplies frozen `host.operations`.
|
|
44
|
+
The dashboard supplies frozen `host.operations`. A read-only Home shows CLI handoffs for login administration and re-enrollment. A writable host can expose those declared actions with target-specific confirmation for re-enrollment. Enrollment key issuance stays in the interactive terminal. `mesh token-status --json` reports credential presence from Auth.
|
|
46
45
|
|
|
47
46
|
Auth's `host-secrets-store` runtime supplies the single host-store selector for control credentials and mesh-sync authentication. Project `AGENT_DIR`/`TR_BRAIN` cannot divert these reads. Native SSSS audit contention is serialized by the generic host; errors still fail closed. The corresponding source runtime must be installed; missing modules never select a fallback implementation.
|
|
48
47
|
|
|
@@ -46,15 +46,21 @@ export async function run(argv = []) {
|
|
|
46
46
|
if (!result.success) process.exitCode = 1;
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
+
if (sub === 'token-status' || (sub === 'token' && (!args[1] || args[1] === 'status'))) {
|
|
50
|
+
if (sub === 'token-status' && args.slice(1).some(arg => arg !== '--json')) {
|
|
51
|
+
throw new Error('token-status accepts only --json');
|
|
52
|
+
}
|
|
53
|
+
const meta = await findHeadscaleKeyMeta(brainDir);
|
|
54
|
+
const present = Boolean(meta?.set);
|
|
55
|
+
console.log(JSON.stringify(sub === 'token-status' ? { present } : { present, secretKey: 'HEADSCALE_API_KEY' }));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
49
58
|
if (sub === 'token') {
|
|
50
59
|
if (args[1] === 'set' && args.includes('--stdin')) {
|
|
51
60
|
const chunks = []; for await (const chunk of process.stdin) chunks.push(chunk);
|
|
52
61
|
const config = JSON.parse(process.env.TR_PLUGIN_CONFIG || '{}');
|
|
53
62
|
const at = args.indexOf('--url'); if (at >= 0) config.controlUrl = args[at + 1];
|
|
54
63
|
console.log(JSON.stringify(await saveCredential({ key: 'HEADSCALE_API_KEY', value: Buffer.concat(chunks).toString('utf8').trim(), configuration: config, brainDir: process.env.TR_SECRETS_BRAIN || brainDir })));
|
|
55
|
-
} else if (!args[1] || args[1] === 'status') {
|
|
56
|
-
const meta = await findHeadscaleKeyMeta(brainDir);
|
|
57
|
-
console.log(JSON.stringify({ present: !!meta?.set, secretKey: 'HEADSCALE_API_KEY' }));
|
|
58
64
|
} else throw new Error('token <status|set --stdin [--url URL]>');
|
|
59
65
|
return;
|
|
60
66
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tr-plugin-mesh",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "tr-plugin-mesh",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.3.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@gregiteen/ssss-cli": "0.14.5",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"jsdom": "^29.1.1",
|
|
17
17
|
"supertest": "^7.3.1",
|
|
18
|
-
"total-recall-brain": "3.
|
|
18
|
+
"total-recall-brain": "3.45.0",
|
|
19
19
|
"vitest": "^4.1.12"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
@@ -7177,9 +7177,9 @@
|
|
|
7177
7177
|
}
|
|
7178
7178
|
},
|
|
7179
7179
|
"node_modules/total-recall-brain": {
|
|
7180
|
-
"version": "3.
|
|
7181
|
-
"resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.
|
|
7182
|
-
"integrity": "sha512-
|
|
7180
|
+
"version": "3.45.0",
|
|
7181
|
+
"resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.45.0.tgz",
|
|
7182
|
+
"integrity": "sha512-HDYfROazZbsLHQsFPnlBcSpe1HL1QEi7JG8x/eNRUI06RxVQsZWl8LwBo2lTWjWRDrKmCy7BUmSXQDuWF3lrEw==",
|
|
7183
7183
|
"dev": true,
|
|
7184
7184
|
"license": "MIT",
|
|
7185
7185
|
"workspaces": [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tr-plugin-mesh",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Headscale and Tailscale SSH control-server mesh administration and node discovery",
|
|
6
6
|
"scripts": {
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"cli.mjs",
|
|
17
17
|
"plugin.json",
|
|
18
|
+
"DESIGN.md",
|
|
18
19
|
"README.md",
|
|
19
20
|
"LICENSE",
|
|
20
21
|
"ui/",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
|
|
3
3
|
"id": "mesh",
|
|
4
4
|
"name": "Headscale",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.3.0",
|
|
6
6
|
"description": "Control-server mesh administration, Tailscale SSH, and peer node discovery.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"requires": [
|
|
@@ -22,34 +22,6 @@
|
|
|
22
22
|
"url": "https://headscale.net"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
|
-
"card_face": {
|
|
26
|
-
"skin": "mesh-telemetry",
|
|
27
|
-
"theme": "vibrant",
|
|
28
|
-
"headline": "Mesh Control Deck",
|
|
29
|
-
"primary_color": "#2563eb",
|
|
30
|
-
"secondary_color": "#1e3a8a",
|
|
31
|
-
"accent_color": "#3b82f6",
|
|
32
|
-
"quick_actions": [
|
|
33
|
-
{
|
|
34
|
-
"subcommand": "status",
|
|
35
|
-
"label": "STATUS"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"subcommand": "nodes",
|
|
39
|
-
"label": "NODES"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"subcommand": "doctor",
|
|
43
|
-
"label": "DOCTOR"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"subcommand": "leader",
|
|
47
|
-
"label": "LEADER"
|
|
48
|
-
}
|
|
49
|
-
],
|
|
50
|
-
"touch_layout": "comfortable",
|
|
51
|
-
"interactive": true
|
|
52
|
-
},
|
|
53
25
|
"ssss_schemas": {
|
|
54
26
|
"categories": [
|
|
55
27
|
{
|
|
@@ -222,7 +194,8 @@
|
|
|
222
194
|
"name": "preauthkey",
|
|
223
195
|
"description": "Issue a secret enrollment key to an interactive terminal",
|
|
224
196
|
"effect": "write",
|
|
225
|
-
"output": "text"
|
|
197
|
+
"output": "text",
|
|
198
|
+
"sensitive_output": true
|
|
226
199
|
},
|
|
227
200
|
{
|
|
228
201
|
"name": "policy",
|
|
@@ -234,6 +207,12 @@
|
|
|
234
207
|
"description": "Mesh probe operation",
|
|
235
208
|
"effect": "read"
|
|
236
209
|
},
|
|
210
|
+
{
|
|
211
|
+
"name": "token-status",
|
|
212
|
+
"description": "Check whether Auth has a saved mesh credential",
|
|
213
|
+
"effect": "read",
|
|
214
|
+
"output": "json"
|
|
215
|
+
},
|
|
237
216
|
{
|
|
238
217
|
"name": "token",
|
|
239
218
|
"description": "Mesh token operation",
|
|
@@ -262,14 +241,40 @@
|
|
|
262
241
|
]
|
|
263
242
|
},
|
|
264
243
|
"ui": {
|
|
265
|
-
"design_tokens": "
|
|
244
|
+
"design_tokens": "DESIGN.md",
|
|
245
|
+
"home": "network",
|
|
266
246
|
"elements": [
|
|
247
|
+
{
|
|
248
|
+
"id": "network",
|
|
249
|
+
"kind": "panel",
|
|
250
|
+
"tag": "mesh-home",
|
|
251
|
+
"module": "ui/home.js",
|
|
252
|
+
"description": "Mesh network atlas",
|
|
253
|
+
"tokens": [
|
|
254
|
+
"color-background",
|
|
255
|
+
"color-surface",
|
|
256
|
+
"color-text",
|
|
257
|
+
"color-border",
|
|
258
|
+
"spacing-md",
|
|
259
|
+
"radius-md"
|
|
260
|
+
],
|
|
261
|
+
"optional_tokens": [
|
|
262
|
+
"color-muted",
|
|
263
|
+
"color-accent",
|
|
264
|
+
"color-ok",
|
|
265
|
+
"color-warn",
|
|
266
|
+
"color-danger",
|
|
267
|
+
"typography-body-font-family",
|
|
268
|
+
"typography-heading-font-family",
|
|
269
|
+
"typography-mono-font-family"
|
|
270
|
+
]
|
|
271
|
+
},
|
|
267
272
|
{
|
|
268
273
|
"id": "panel",
|
|
269
274
|
"kind": "panel",
|
|
270
275
|
"tag": "mesh-panel",
|
|
271
276
|
"module": "ui/panel.js",
|
|
272
|
-
"description": "Mesh
|
|
277
|
+
"description": "Mesh credential setup through Auth",
|
|
273
278
|
"events": [
|
|
274
279
|
"save-token"
|
|
275
280
|
],
|
|
@@ -287,13 +292,6 @@
|
|
|
287
292
|
"description": "Printed by `total-recall mesh token status --json`: { present, secretKey }"
|
|
288
293
|
}
|
|
289
294
|
}
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
"id": "card",
|
|
293
|
-
"kind": "card",
|
|
294
|
-
"tag": "tr-mesh-card",
|
|
295
|
-
"module": "ui/card.js",
|
|
296
|
-
"description": "Meshlink Card Face"
|
|
297
295
|
}
|
|
298
296
|
]
|
|
299
297
|
},
|
|
@@ -50,6 +50,8 @@ function printHelp() {
|
|
|
50
50
|
view <screen> Read Machines, Flows, Placement, Boundary or Join sources (--json)
|
|
51
51
|
doctor Probe reachability & compute capabilities across all nodes
|
|
52
52
|
nodes List mesh nodes and how to reach each one
|
|
53
|
+
token-status Read whether Auth has a saved mesh credential (--json)
|
|
54
|
+
token status Show credential presence and its Auth binding
|
|
53
55
|
ssh <node> [cmd…] Open a session using the node's recorded access
|
|
54
56
|
exec <node> <cmd…> Execute a command on a node non-interactively (--json)
|
|
55
57
|
leader [--json] Show the elected leader and its server port
|
|
@@ -226,7 +228,7 @@ export default async function meshCli(argv = []) {
|
|
|
226
228
|
error: null
|
|
227
229
|
};
|
|
228
230
|
nodeInfo.tested_runtimes = ['ollama', 'docker', 'node', 'git'];
|
|
229
|
-
nodeInfo.tested_harnesses = ['agy', 'claude', 'codex'
|
|
231
|
+
nodeInfo.tested_harnesses = ['agy', 'claude', 'codex'];
|
|
230
232
|
|
|
231
233
|
if (node.self) {
|
|
232
234
|
try {
|
|
@@ -239,7 +241,7 @@ export default async function meshCli(argv = []) {
|
|
|
239
241
|
nodeInfo.reachable = true;
|
|
240
242
|
} else if (resolved.complete) {
|
|
241
243
|
try {
|
|
242
|
-
const probeCmd = 'echo "agy=$(which agy 2>/dev/null) claude=$(which claude 2>/dev/null) codex=$(which codex 2>/dev/null)
|
|
244
|
+
const probeCmd = 'echo "agy=$(which agy 2>/dev/null) claude=$(which claude 2>/dev/null) codex=$(which codex 2>/dev/null) ollama=$(which ollama 2>/dev/null) docker=$(which docker 2>/dev/null) node=$(which node 2>/dev/null) git=$(which git 2>/dev/null)"';
|
|
243
245
|
const { execMeshCommand } = await import('../core/mesh.mjs');
|
|
244
246
|
// Cloud peers routinely need several seconds; a 4 s budget reported
|
|
245
247
|
// reachable machines as down.
|
|
@@ -250,7 +252,7 @@ export default async function meshCli(argv = []) {
|
|
|
250
252
|
for (const part of parts) {
|
|
251
253
|
const [k, v] = part.split('=');
|
|
252
254
|
if (v && v.trim()) {
|
|
253
|
-
if (
|
|
255
|
+
if (nodeInfo.tested_harnesses.includes(k)) {
|
|
254
256
|
nodeInfo.harnesses.push(k);
|
|
255
257
|
} else {
|
|
256
258
|
nodeInfo.runtimes.push(k);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: ui-chunk:chunk
|
|
3
|
+
title: Mesh dispatch receipt
|
|
4
|
+
description: Send a command to an explicit or freshly active device and inspect whether dispatch succeeded.
|
|
5
|
+
timestamp: "2026-11-08T09:10:00Z"
|
|
6
|
+
plugin: mesh
|
|
7
|
+
id: active-device-dispatch
|
|
8
|
+
intents: [send command to active device, dispatch mesh task, inspect dispatch result, run on selected machine]
|
|
9
|
+
surfaces: [page]
|
|
10
|
+
operations: [dispatch]
|
|
11
|
+
data: ["dispatch:/dispatched", "dispatch:/is_local", "dispatch:/timestamp"]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<style>
|
|
15
|
+
.mesh-dispatch { padding:var(--spacing-md); border-inline-start:3px solid var(--color-accent); background:var(--color-surface); }
|
|
16
|
+
.mesh-dispatch h2 { margin-top:0; }
|
|
17
|
+
.mesh-dispatch strong { color:var(--color-accent); }
|
|
18
|
+
</style>
|
|
19
|
+
<section class="mesh-dispatch">
|
|
20
|
+
<h2>Read where dispatch ran</h2>
|
|
21
|
+
<p>Supply an explicit target or let Mesh resolve a device from fresh presence. The receipt records whether the command dispatched and whether it ran <strong>locally or on a peer</strong>.</p>
|
|
22
|
+
</section>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: ui-chunk:chunk
|
|
3
|
+
title: Mesh control verification
|
|
4
|
+
description: Check the control API and local mesh network as independent observations.
|
|
5
|
+
timestamp: "2026-11-08T09:10:00Z"
|
|
6
|
+
plugin: mesh
|
|
7
|
+
id: control-probe
|
|
8
|
+
intents: [verify mesh control API, probe control server, troubleshoot Headscale API, check control plane health]
|
|
9
|
+
surfaces: [page, right]
|
|
10
|
+
operations: [probe]
|
|
11
|
+
data: ["probe:/control/verified", "probe:/control/state", "probe:/network_available"]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<style>
|
|
15
|
+
.mesh-probe { padding:var(--spacing-md); background:var(--color-surface); border-inline-start:3px solid var(--color-accent); }
|
|
16
|
+
.mesh-probe h2 { margin-top:0; }
|
|
17
|
+
.mesh-probe li + li { margin-top:.4em; }
|
|
18
|
+
</style>
|
|
19
|
+
<section class="mesh-probe">
|
|
20
|
+
<h2>Test the control API</h2>
|
|
21
|
+
<ul>
|
|
22
|
+
<li>Read whether the authenticated control API was verified.</li>
|
|
23
|
+
<li>Check local mesh network availability separately.</li>
|
|
24
|
+
</ul>
|
|
25
|
+
</section>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: ui-chunk:chunk
|
|
3
|
+
title: Recorded mesh control server
|
|
4
|
+
description: Check whether the local owner has a recorded provisioning target for the control server.
|
|
5
|
+
timestamp: "2026-11-08T09:10:00Z"
|
|
6
|
+
plugin: mesh
|
|
7
|
+
id: control-server
|
|
8
|
+
intents: [inspect mesh server provisioning, manage Headscale control server, check recorded server target, mesh server update]
|
|
9
|
+
surfaces: [page]
|
|
10
|
+
operations: [server]
|
|
11
|
+
data: ["server:/provisioned"]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<style>
|
|
15
|
+
.mesh-server { padding:var(--spacing-md); background:var(--color-surface); border:1px solid var(--color-border); }
|
|
16
|
+
.mesh-server h2 { margin-top:0; }
|
|
17
|
+
.mesh-server code { color:var(--color-accent); }
|
|
18
|
+
</style>
|
|
19
|
+
<section class="mesh-server">
|
|
20
|
+
<h2>Inspect the provisioning record</h2>
|
|
21
|
+
<p>Run <code>server status</code> for the recorded control-server target. Use the control probe to verify the service that is answering now.</p>
|
|
22
|
+
</section>
|