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