@ouro.bot/cli 0.1.0-alpha.74 → 0.1.0-alpha.741
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/LICENSE +21 -0
- package/README.md +154 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/bluebubbles-host +264 -0
- package/changelog.json +4730 -16
- package/deploy/unraid/Dockerfile +43 -0
- package/deploy/unraid/README.txt +1623 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +37 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +200 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +1796 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +520 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +24 -0
- package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
- package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +18 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +3 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +3 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +3 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +21 -0
- package/deploy/unraid/sanctuary.xml +25 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +348 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +874 -43
- package/dist/heart/agent-entry.js +190 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +950 -0
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +477 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +382 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +128 -129
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1759 -331
- package/dist/heart/cross-chat-delivery.js +8 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +185 -3
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +832 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8692 -0
- package/dist/heart/daemon/cli-help.js +710 -0
- package/dist/heart/daemon/cli-parse.js +2714 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +777 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
- package/dist/heart/daemon/container-healthcheck.js +94 -0
- package/dist/heart/daemon/container-runtime.js +84 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +156 -0
- package/dist/heart/daemon/container-spec-auditor.js +156 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +41 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2144
- package/dist/heart/daemon/daemon-entry.js +930 -10
- package/dist/heart/daemon/daemon-health.js +186 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +1698 -88
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1755 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +79 -10
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +45 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +624 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +47 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/runtime-mode.js +13 -2
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2365 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1624 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +985 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +126 -0
- package/dist/heart/daemon/sense-manager.js +689 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +338 -0
- package/dist/heart/daemon/supercronic-supervisor.js +267 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +255 -43
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +121 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +653 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
- package/dist/heart/identity.js +184 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +156 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +218 -0
- package/dist/heart/private-runtime/policy.js +214 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +89 -0
- package/dist/heart/provider-ping.js +265 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +173 -60
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +34 -38
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/providers/openai-compatible.js +177 -0
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +607 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +22 -4
- package/dist/heart/session-activity.js +90 -24
- package/dist/heart/session-events.js +1300 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +368 -0
- package/dist/heart/streaming.js +604 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +11 -7
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +340 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +480 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +889 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +58 -0
- package/dist/mailroom/core.js +803 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +384 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +292 -0
- package/dist/mailroom/search-cache.js +513 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +24 -2
- package/dist/mind/context.js +273 -111
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +227 -0
- package/dist/mind/pending.js +13 -8
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1067 -172
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +379 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/coverage/source-scanner.js +4 -4
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +293 -9
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +159 -0
- package/dist/nerves/runtime.js +17 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1045 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +218 -30
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +166 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +242 -14
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +812 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +259 -20
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +143 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +67 -1095
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +459 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +881 -0
- package/dist/repertoire/tools-shell.js +133 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +355 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +353 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +276 -79
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +130 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +628 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +926 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3839 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +100 -0
- package/dist/senses/cli.js +621 -321
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1075 -176
- package/dist/senses/private-runtime-worker.js +741 -0
- package/dist/senses/private-runtime.js +1212 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/sanctuary-grounding.js +118 -0
- package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
- package/dist/senses/sanctuary-health-acceptance-probe.js +772 -0
- package/dist/senses/sanctuary-health-runner.js +146 -0
- package/dist/senses/sanctuary-health.js +447 -0
- package/dist/senses/sanctuary-interactive-control.js +306 -0
- package/dist/senses/sanctuary-runtime.js +206 -0
- package/dist/senses/shared-turn.js +432 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +515 -217
- package/dist/senses/telegram-approval-runtime.js +526 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-client.js +1471 -0
- package/dist/senses/telegram-entry.js +80 -0
- package/dist/senses/telegram.js +1232 -0
- package/dist/senses/trust-gate.js +104 -9
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5081 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8129 -0
- package/package.json +71 -12
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1180
- package/dist/senses/debug-activity.js +0 -148
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -480
- package/subagents/README.md +0 -7
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unraidToolDefinitions = exports.SANCTUARY_SYSTEM_QUERY = exports.SANCTUARY_NOTIFICATIONS_QUERY = exports.SANCTUARY_DISKS_QUERY = exports.SANCTUARY_STORAGE_QUERY = exports.SANCTUARY_CONTAINER_LOGS_QUERY = exports.SANCTUARY_CONTAINERS_QUERY = void 0;
|
|
4
|
+
exports.normalizeDockerStatus = normalizeDockerStatus;
|
|
5
|
+
exports.createUnraidReadTools = createUnraidReadTools;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const runtime_1 = require("../nerves/runtime");
|
|
8
|
+
const unraid_client_1 = require("./unraid-client");
|
|
9
|
+
exports.SANCTUARY_CONTAINERS_QUERY = `query SanctuaryContainers {
|
|
10
|
+
docker { containers(skipCache: true) { id names state status autoStart } }
|
|
11
|
+
}`;
|
|
12
|
+
exports.SANCTUARY_CONTAINER_LOGS_QUERY = `query SanctuaryContainerLogs($id: PrefixedID!, $tail: Int!) {
|
|
13
|
+
docker { logs(id: $id, tail: $tail) { containerId lines { timestamp message } cursor } }
|
|
14
|
+
}`;
|
|
15
|
+
exports.SANCTUARY_STORAGE_QUERY = `query SanctuaryStorage {
|
|
16
|
+
vars { id }
|
|
17
|
+
array { state capacity { kilobytes { used free total } } }
|
|
18
|
+
shares { id name used free size }
|
|
19
|
+
}`;
|
|
20
|
+
exports.SANCTUARY_DISKS_QUERY = `query SanctuaryDisks {
|
|
21
|
+
disks { id name smartStatus temperature }
|
|
22
|
+
array { parityCheckStatus { status date duration errors progress correcting paused running } }
|
|
23
|
+
}`;
|
|
24
|
+
exports.SANCTUARY_NOTIFICATIONS_QUERY = `query SanctuaryNotifications {
|
|
25
|
+
notifications { list(filter: {type: UNREAD, offset: 0, limit: 100}) { id timestamp importance title subject description type } }
|
|
26
|
+
}`;
|
|
27
|
+
exports.SANCTUARY_SYSTEM_QUERY = `query SanctuarySystem {
|
|
28
|
+
vars { id name version }
|
|
29
|
+
info { time os { uptime } versions { core { unraid api } } }
|
|
30
|
+
array { state }
|
|
31
|
+
}`;
|
|
32
|
+
function utf8Bytes(value) { return Buffer.byteLength(value, "utf8"); }
|
|
33
|
+
function identifier(value, label, maxBytes = 128) {
|
|
34
|
+
if (typeof value !== "string" || value.length === 0 || utf8Bytes(value) > maxBytes || value.includes("\uFFFD")) {
|
|
35
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", `${label} is invalid`);
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function display(value, maxBytes) {
|
|
40
|
+
if (typeof value !== "string")
|
|
41
|
+
return { value: "", truncated: true };
|
|
42
|
+
const bytes = Buffer.from(value, "utf8");
|
|
43
|
+
if (bytes.length <= maxBytes)
|
|
44
|
+
return { value, truncated: false };
|
|
45
|
+
let prefix = bytes.subarray(0, maxBytes - 3).toString("utf8");
|
|
46
|
+
while (prefix.endsWith("\uFFFD"))
|
|
47
|
+
prefix = prefix.slice(0, -1);
|
|
48
|
+
return { value: `${prefix}...`, truncated: true };
|
|
49
|
+
}
|
|
50
|
+
const DURATION = "(?:Less than a second|About a (?:minute|hour|day|week|month|year)|(?:[1-9][0-9]*) (?:seconds?|minutes?|hours?|days?|weeks?|months?|years?))";
|
|
51
|
+
const RUNNING = new RegExp(`^Up ${DURATION}(?: \\((?:healthy|unhealthy|health: starting)\\))?$`, "u");
|
|
52
|
+
const EXITED = new RegExp(`^Exited \\((0|[1-9][0-9]*)\\) ${DURATION} ago$`, "u");
|
|
53
|
+
const RESTARTING = new RegExp(`^Restarting \\((0|[1-9][0-9]*)\\) ${DURATION} ago$`, "u");
|
|
54
|
+
function exitCode(match) {
|
|
55
|
+
const value = Number(match[1]);
|
|
56
|
+
return Number.isSafeInteger(value) && value >= 0 && value <= 4_294_967_295 ? value : null;
|
|
57
|
+
}
|
|
58
|
+
function normalizeDockerStatus(structuredState, status) {
|
|
59
|
+
if (typeof status !== "string")
|
|
60
|
+
return { state: "unknown", exitCode: null, degraded: true };
|
|
61
|
+
const state = typeof structuredState === "string" ? structuredState.toUpperCase() : "";
|
|
62
|
+
if (state === "RUNNING" && RUNNING.test(status))
|
|
63
|
+
return { state: "running", exitCode: null, degraded: false };
|
|
64
|
+
const exited = status.match(EXITED);
|
|
65
|
+
if (state === "EXITED" && exited) {
|
|
66
|
+
const code = exitCode(exited);
|
|
67
|
+
return code === null ? { state: "unknown", exitCode: null, degraded: true } : { state: "exited", exitCode: code, degraded: false };
|
|
68
|
+
}
|
|
69
|
+
const restarting = status.match(RESTARTING);
|
|
70
|
+
if ((state === "RUNNING" || state === "EXITED") && restarting) {
|
|
71
|
+
const code = exitCode(restarting);
|
|
72
|
+
return code === null ? { state: "unknown", exitCode: null, degraded: true } : { state: "restarting", exitCode: code, degraded: false };
|
|
73
|
+
}
|
|
74
|
+
return { state: "unknown", exitCode: null, degraded: true };
|
|
75
|
+
}
|
|
76
|
+
function numberOrNull(value) {
|
|
77
|
+
const number = typeof value === "bigint" ? Number(value) : typeof value === "string" && /^-?[0-9]+$/u.test(value) ? Number(value) : value;
|
|
78
|
+
return typeof number === "number" && Number.isSafeInteger(number) && number >= 0 ? number : null;
|
|
79
|
+
}
|
|
80
|
+
function percent(used, free) {
|
|
81
|
+
if (used === null || free === null || used + free === 0)
|
|
82
|
+
return null;
|
|
83
|
+
return Number(((used / (used + free)) * 100).toFixed(2));
|
|
84
|
+
}
|
|
85
|
+
function record(value, label) {
|
|
86
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
87
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", `${label} is invalid`);
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
function array(value, label) {
|
|
91
|
+
if (!Array.isArray(value))
|
|
92
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", `${label} is invalid`);
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
function fail(error) {
|
|
96
|
+
const normalized = error instanceof unraid_client_1.UnraidClientError
|
|
97
|
+
? error
|
|
98
|
+
: new unraid_client_1.UnraidClientError("invalid_response", error instanceof Error ? error.message : String(error));
|
|
99
|
+
return { ok: false, error: { code: normalized.code, message: normalized.message, degraded: true } };
|
|
100
|
+
}
|
|
101
|
+
function containerName(names) {
|
|
102
|
+
const values = array(names, "container names");
|
|
103
|
+
if (values.length !== 1)
|
|
104
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", "container names are ambiguous");
|
|
105
|
+
return identifier(values[0], "container name").replace(/^\//u, "");
|
|
106
|
+
}
|
|
107
|
+
function mapContainers(data) {
|
|
108
|
+
const docker = record(data.docker, "docker response");
|
|
109
|
+
const raw = array(docker.containers, "container list");
|
|
110
|
+
const truncated = raw.length > 200;
|
|
111
|
+
const containers = raw.slice(0, 200).map((entry) => {
|
|
112
|
+
const item = record(entry, "container");
|
|
113
|
+
const id = unraid_client_1.UnraidClient.assertPrefixedId(identifier(item.id, "container id", 256));
|
|
114
|
+
const name = containerName(item.names);
|
|
115
|
+
const shownStatus = display(item.status, 256);
|
|
116
|
+
const normalized = normalizeDockerStatus(item.state, shownStatus.value);
|
|
117
|
+
return {
|
|
118
|
+
id,
|
|
119
|
+
name,
|
|
120
|
+
autostart: typeof item.autoStart === "boolean" ? item.autoStart : false,
|
|
121
|
+
...normalized,
|
|
122
|
+
degraded: normalized.degraded || shownStatus.truncated || typeof item.autoStart !== "boolean",
|
|
123
|
+
status: shownStatus.value,
|
|
124
|
+
};
|
|
125
|
+
}).sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));
|
|
126
|
+
return { containers, truncated };
|
|
127
|
+
}
|
|
128
|
+
function validTimestamp(value) {
|
|
129
|
+
if (typeof value !== "string" || utf8Bytes(value) > 64 || !/(?:Z|[+-][0-9]{2}:[0-9]{2})$/u.test(value))
|
|
130
|
+
return null;
|
|
131
|
+
const time = Date.parse(value);
|
|
132
|
+
return Number.isFinite(time) ? new Date(time).toISOString() : null;
|
|
133
|
+
}
|
|
134
|
+
function liveSourceIdentityDigest(value) {
|
|
135
|
+
const prefixedId = identifier(value, "server identity", 129);
|
|
136
|
+
if (!/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(prefixedId))
|
|
137
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", "server identity is invalid");
|
|
138
|
+
return (0, node_crypto_1.createHash)("sha256").update(prefixedId).digest("hex");
|
|
139
|
+
}
|
|
140
|
+
function createUnraidReadTools(client) {
|
|
141
|
+
const listContainers = async () => {
|
|
142
|
+
try {
|
|
143
|
+
const data = await client.read(exports.SANCTUARY_CONTAINERS_QUERY, {});
|
|
144
|
+
return { ok: true, data: mapContainers(data) };
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return fail(error);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
listContainers,
|
|
152
|
+
async getContainerLogs(args) {
|
|
153
|
+
try {
|
|
154
|
+
const wanted = identifier(args.container, "container argument");
|
|
155
|
+
if (!Number.isInteger(args.tailLines) || args.tailLines < 1 || args.tailLines > 200)
|
|
156
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", "tailLines must be an integer from 1 to 200");
|
|
157
|
+
const listed = await listContainers();
|
|
158
|
+
if (!listed.ok)
|
|
159
|
+
return listed;
|
|
160
|
+
const matches = listed.data.containers.filter((container) => container.name === wanted);
|
|
161
|
+
if (matches.length === 0)
|
|
162
|
+
return { ok: false, error: { code: "not_found", message: `container '${wanted}' was not found`, degraded: true } };
|
|
163
|
+
if (matches.length !== 1)
|
|
164
|
+
return { ok: false, error: { code: "ambiguous", message: `container '${wanted}' is ambiguous`, degraded: true } };
|
|
165
|
+
const target = matches[0];
|
|
166
|
+
const data = await client.read(exports.SANCTUARY_CONTAINER_LOGS_QUERY, { id: target.id, tail: args.tailLines });
|
|
167
|
+
const logs = record(record(data.docker, "docker response").logs, "container logs");
|
|
168
|
+
if (logs.containerId !== target.id)
|
|
169
|
+
throw new unraid_client_1.UnraidClientError("invalid_response", "container log identity drifted");
|
|
170
|
+
const text = array(logs.lines, "container log lines").map((line) => display(record(line, "log line").message, 1_000_000).value).join("\n");
|
|
171
|
+
const originalBytes = utf8Bytes(text);
|
|
172
|
+
const suffix = Buffer.from(text, "utf8").subarray(Math.max(0, originalBytes - 65_536)).toString("utf8").replace(/^\uFFFD/u, "");
|
|
173
|
+
const returnedBytes = utf8Bytes(suffix);
|
|
174
|
+
return { ok: true, data: { container: { id: target.id, name: target.name }, text: suffix, originalBytes, returnedBytes, truncated: returnedBytes < originalBytes } };
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return fail(error);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
async getStorage() {
|
|
181
|
+
try {
|
|
182
|
+
const data = await client.read(exports.SANCTUARY_STORAGE_QUERY, {});
|
|
183
|
+
const sourceIdentityDigest = liveSourceIdentityDigest(record(data.vars, "vars").id);
|
|
184
|
+
const arrayRecord = record(data.array, "array");
|
|
185
|
+
const kb = record(record(arrayRecord.capacity, "array capacity").kilobytes, "array capacity kilobytes");
|
|
186
|
+
const usedKb = numberOrNull(kb.used);
|
|
187
|
+
const freeKb = numberOrNull(kb.free);
|
|
188
|
+
const usedBytes = usedKb === null ? null : usedKb * 1024;
|
|
189
|
+
const freeBytes = freeKb === null ? null : freeKb * 1024;
|
|
190
|
+
const state = display(arrayRecord.state, 128);
|
|
191
|
+
const rawShares = array(data.shares, "shares");
|
|
192
|
+
const truncated = rawShares.length > 256;
|
|
193
|
+
const shares = rawShares.slice(0, 256).map((entry) => {
|
|
194
|
+
const item = record(entry, "share");
|
|
195
|
+
const name = identifier(item.name, "share name");
|
|
196
|
+
const used = numberOrNull(item.used);
|
|
197
|
+
const free = numberOrNull(item.free);
|
|
198
|
+
return { name, usedBytes: used, freeBytes: free, usedPercent: percent(used, free), degraded: used === null || free === null };
|
|
199
|
+
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
200
|
+
return { ok: true, data: { sourceIdentityDigest, array: { state: state.value, usedBytes, freeBytes, usedPercent: percent(usedBytes, freeBytes), degraded: state.truncated || usedBytes === null || freeBytes === null }, shares, truncated } };
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return fail(error);
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
async getDisks() {
|
|
207
|
+
try {
|
|
208
|
+
const data = await client.read(exports.SANCTUARY_DISKS_QUERY, {});
|
|
209
|
+
const rawDisks = array(data.disks, "disks");
|
|
210
|
+
const truncated = rawDisks.length > 64;
|
|
211
|
+
const disks = rawDisks.slice(0, 64).map((entry) => {
|
|
212
|
+
const item = record(entry, "disk");
|
|
213
|
+
const id = identifier(item.id, "disk id");
|
|
214
|
+
const name = identifier(item.name, "disk name");
|
|
215
|
+
const smartRaw = typeof item.smartStatus === "string" ? item.smartStatus.toLowerCase() : "";
|
|
216
|
+
const smart = smartRaw === "passed" ? "passed" : smartRaw === "failed" ? "failed" : "unknown";
|
|
217
|
+
const temperatureC = typeof item.temperature === "number" && Number.isFinite(item.temperature) ? item.temperature : null;
|
|
218
|
+
return { id, name, smart, temperatureC, degraded: smart === "unknown" || temperatureC === null };
|
|
219
|
+
}).sort((a, b) => a.name.localeCompare(b.name) || a.id.localeCompare(b.id));
|
|
220
|
+
const parityRaw = record(record(data.array, "array").parityCheckStatus, "parity status");
|
|
221
|
+
const completedAt = validTimestamp(parityRaw.date);
|
|
222
|
+
const errors = numberOrNull(parityRaw.errors);
|
|
223
|
+
const result = errors === 0 && typeof parityRaw.status === "string" && /complete|success/i.test(parityRaw.status) ? "success" : errors !== null && errors > 0 ? "failed" : "unknown";
|
|
224
|
+
const elapsedMs = completedAt ? Date.now() - Date.parse(completedAt) : null;
|
|
225
|
+
const ageHours = elapsedMs !== null && elapsedMs >= 0 ? elapsedMs / 3_600_000 : null;
|
|
226
|
+
return { ok: true, data: { disks, parity: { result, completedAt, ageHours, degraded: result === "unknown" || completedAt === null || ageHours === null }, truncated } };
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
return fail(error);
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
async getNotifications() {
|
|
233
|
+
try {
|
|
234
|
+
const data = await client.read(exports.SANCTUARY_NOTIFICATIONS_QUERY, {});
|
|
235
|
+
const raw = array(record(data.notifications, "notifications").list, "notification list");
|
|
236
|
+
const truncated = raw.length > 100;
|
|
237
|
+
const unacknowledged = raw.slice(0, 100).map((entry) => {
|
|
238
|
+
const item = record(entry, "notification");
|
|
239
|
+
const id = identifier(item.id, "notification id");
|
|
240
|
+
const createdAt = validTimestamp(item.timestamp);
|
|
241
|
+
const importance = typeof item.importance === "string" ? item.importance.toLowerCase() : "";
|
|
242
|
+
const severity = importance === "info" || importance === "warning" || importance === "error" ? importance : "unknown";
|
|
243
|
+
const title = display(item.title, 160);
|
|
244
|
+
const subject = display(item.subject, 250);
|
|
245
|
+
const description = display(item.description, 250);
|
|
246
|
+
const summary = display([subject.value, description.value].filter(Boolean).join("\n"), 500);
|
|
247
|
+
return { id, createdAt, severity, title: title.value, summary: summary.value, degraded: !createdAt || severity === "unknown" || title.truncated || subject.truncated || description.truncated || summary.truncated };
|
|
248
|
+
}).sort((a, b) => {
|
|
249
|
+
if (a.createdAt && b.createdAt)
|
|
250
|
+
return b.createdAt.localeCompare(a.createdAt);
|
|
251
|
+
if (a.createdAt)
|
|
252
|
+
return -1;
|
|
253
|
+
if (b.createdAt)
|
|
254
|
+
return 1;
|
|
255
|
+
return a.id.localeCompare(b.id);
|
|
256
|
+
});
|
|
257
|
+
return { ok: true, data: { unacknowledged, truncated } };
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return fail(error);
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
async getSystem() {
|
|
264
|
+
try {
|
|
265
|
+
const data = await client.read(exports.SANCTUARY_SYSTEM_QUERY, {});
|
|
266
|
+
const vars = record(data.vars, "vars");
|
|
267
|
+
const info = record(data.info, "info");
|
|
268
|
+
const versions = record(record(info.versions, "versions").core, "core versions");
|
|
269
|
+
const sourceIdentityDigest = liveSourceIdentityDigest(vars.id);
|
|
270
|
+
const name = display(vars.name, 128);
|
|
271
|
+
const unraid = display(versions.unraid ?? vars.version, 128);
|
|
272
|
+
const api = display(versions.api, 128);
|
|
273
|
+
const state = display(record(data.array, "array").state, 128);
|
|
274
|
+
const uptimeSeconds = numberOrNull(record(info.os, "os").uptime);
|
|
275
|
+
return { ok: true, data: { sourceIdentityDigest, serverName: name.value, unraidVersion: unraid.value, apiVersion: api.value, arrayState: state.value, uptimeSeconds, degraded: name.truncated || unraid.truncated || api.truncated || state.truncated || uptimeSeconds === null } };
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return fail(error);
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const emptyParameters = { type: "object", properties: {}, additionalProperties: false };
|
|
284
|
+
function missingRuntime() {
|
|
285
|
+
return JSON.stringify({ ok: false, error: { code: "invalid_response", message: "Sanctuary runtime is unavailable", degraded: true } });
|
|
286
|
+
}
|
|
287
|
+
function readDefinition(name, description, method) {
|
|
288
|
+
return {
|
|
289
|
+
tool: { type: "function", function: { name, description, parameters: emptyParameters } },
|
|
290
|
+
handler: async (_args, ctx) => JSON.stringify(ctx?.sanctuary ? await ctx.sanctuary[method]() : JSON.parse(missingRuntime())),
|
|
291
|
+
riskProfile: { mutates: "none", risk: "low" },
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
exports.unraidToolDefinitions = [
|
|
295
|
+
readDefinition("unraid_list_containers", "List bounded Sanctuary Docker container status.", "listContainers"),
|
|
296
|
+
{
|
|
297
|
+
tool: {
|
|
298
|
+
type: "function",
|
|
299
|
+
function: {
|
|
300
|
+
name: "unraid_get_container_logs",
|
|
301
|
+
description: "Read the recent bounded log suffix for one exact Sanctuary container name.",
|
|
302
|
+
parameters: {
|
|
303
|
+
type: "object",
|
|
304
|
+
properties: {
|
|
305
|
+
container: { type: "string" },
|
|
306
|
+
tailLines: { type: "integer", minimum: 1, maximum: 200 },
|
|
307
|
+
},
|
|
308
|
+
required: ["container", "tailLines"],
|
|
309
|
+
additionalProperties: false,
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
handler: async (args, ctx) => JSON.stringify(ctx?.sanctuary
|
|
314
|
+
? await ctx.sanctuary.getContainerLogs({ container: String(args.container), tailLines: Number(args.tailLines) })
|
|
315
|
+
: JSON.parse(missingRuntime())),
|
|
316
|
+
riskProfile: { mutates: "none", risk: "low" },
|
|
317
|
+
},
|
|
318
|
+
readDefinition("unraid_get_storage", "Read bounded Sanctuary array and share capacity health.", "getStorage"),
|
|
319
|
+
readDefinition("unraid_get_disks", "Read bounded Sanctuary disk SMART, temperature, and parity health.", "getDisks"),
|
|
320
|
+
readDefinition("unraid_get_notifications", "Read bounded unacknowledged Sanctuary notifications.", "getNotifications"),
|
|
321
|
+
readDefinition("unraid_get_system", "Read bounded Sanctuary system and version health.", "getSystem"),
|
|
322
|
+
{
|
|
323
|
+
tool: {
|
|
324
|
+
type: "function",
|
|
325
|
+
function: {
|
|
326
|
+
name: "unraid_restart_container",
|
|
327
|
+
description: "Propose restarting one exact existing allowlisted Sanctuary container. Execution requires human approval.",
|
|
328
|
+
parameters: {
|
|
329
|
+
type: "object",
|
|
330
|
+
properties: { container: { type: "string" } },
|
|
331
|
+
required: ["container"],
|
|
332
|
+
additionalProperties: false,
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
handler: async (args, ctx) => JSON.stringify(ctx?.sanctuary
|
|
337
|
+
? await ctx.sanctuary.restartContainer({ container: String(args.container) })
|
|
338
|
+
: JSON.parse(missingRuntime())),
|
|
339
|
+
riskProfile: { mutates: "external_side_effect", risk: "high", reason: "restarts one existing allowlisted Docker container" },
|
|
340
|
+
approvalPolicy: () => ({
|
|
341
|
+
kind: "required",
|
|
342
|
+
policyId: "sanctuary.unraid.restart.v1",
|
|
343
|
+
actionClass: "unraid.container.restart",
|
|
344
|
+
requiresSoleCall: true,
|
|
345
|
+
}),
|
|
346
|
+
},
|
|
347
|
+
];
|
|
348
|
+
(0, runtime_1.emitNervesEvent)({
|
|
349
|
+
component: "repertoire",
|
|
350
|
+
event: "repertoire.unraid_tools_loaded",
|
|
351
|
+
message: "typed Unraid tools loaded",
|
|
352
|
+
meta: { operations: 6 },
|
|
353
|
+
});
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.userProfileToolDefinitions = void 0;
|
|
4
|
+
const user_profile_1 = require("./user-profile");
|
|
5
|
+
const credential_access_1 = require("./credential-access");
|
|
6
|
+
const runtime_1 = require("../nerves/runtime");
|
|
7
|
+
function requireFamilyContext(ctx) {
|
|
8
|
+
if (!ctx?.context?.friend?.id) {
|
|
9
|
+
return "no friend context — cannot access user profile.";
|
|
10
|
+
}
|
|
11
|
+
if (ctx.context.friend.trustLevel !== "family") {
|
|
12
|
+
return "user profile access requires family trust level.";
|
|
13
|
+
}
|
|
14
|
+
return { friendId: ctx.context.friend.id };
|
|
15
|
+
}
|
|
16
|
+
exports.userProfileToolDefinitions = [
|
|
17
|
+
{
|
|
18
|
+
tool: {
|
|
19
|
+
type: "function",
|
|
20
|
+
function: {
|
|
21
|
+
name: "user_profile_store",
|
|
22
|
+
description: "Store or update user profile fields (legal name, DOB, passport, etc.) in the agent's vault. Fields are merged with any existing profile. Requires family trust level.",
|
|
23
|
+
parameters: {
|
|
24
|
+
type: "object",
|
|
25
|
+
properties: {
|
|
26
|
+
fields: {
|
|
27
|
+
type: "string",
|
|
28
|
+
description: 'JSON object with profile fields to store/update. Keys: legalName, dateOfBirth, gender, nationality, passport, driverLicense, email, phone, addresses, loyaltyPrograms, preferences, emergencyContact.',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ["fields"],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
handler: async (args, ctx) => {
|
|
36
|
+
(0, runtime_1.emitNervesEvent)({
|
|
37
|
+
component: "repertoire",
|
|
38
|
+
event: "repertoire.tool_user_profile_store",
|
|
39
|
+
message: "user_profile_store invoked",
|
|
40
|
+
meta: { tool: "user_profile_store" },
|
|
41
|
+
});
|
|
42
|
+
const guard = requireFamilyContext(ctx);
|
|
43
|
+
if (typeof guard === "string")
|
|
44
|
+
return guard;
|
|
45
|
+
let fields;
|
|
46
|
+
try {
|
|
47
|
+
fields = JSON.parse(args.fields);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return "invalid JSON in fields parameter.";
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
54
|
+
await (0, user_profile_1.updateUserProfileFields)(guard.friendId, fields, store);
|
|
55
|
+
return `profile fields stored for ${guard.friendId}.`;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
/* v8 ignore next -- defensive: updateUserProfileFields errors are always Error instances @preserve */
|
|
59
|
+
return `failed to store profile: ${err instanceof Error ? err.message : String(err)}`;
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
summaryKeys: ["fields"],
|
|
63
|
+
riskProfile: { mutates: "durable_state_write", risk: "high", reason: "stores user profile vault fields" },
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
tool: {
|
|
67
|
+
type: "function",
|
|
68
|
+
function: {
|
|
69
|
+
name: "user_profile_get",
|
|
70
|
+
description: "Retrieve a specific field from a user's profile. Only returns the requested field, never the full profile. Requires family trust level.",
|
|
71
|
+
parameters: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: {
|
|
74
|
+
field: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "The profile field to retrieve: legalName, dateOfBirth, gender, nationality, passport, driverLicense, email, phone, addresses, loyaltyPrograms, preferences, emergencyContact.",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
required: ["field"],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
handler: async (args, ctx) => {
|
|
84
|
+
(0, runtime_1.emitNervesEvent)({
|
|
85
|
+
component: "repertoire",
|
|
86
|
+
event: "repertoire.tool_user_profile_get",
|
|
87
|
+
message: "user_profile_get invoked",
|
|
88
|
+
meta: { tool: "user_profile_get", field: args.field },
|
|
89
|
+
});
|
|
90
|
+
const guard = requireFamilyContext(ctx);
|
|
91
|
+
if (typeof guard === "string")
|
|
92
|
+
return guard;
|
|
93
|
+
try {
|
|
94
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
95
|
+
const value = await (0, user_profile_1.getUserProfileField)(guard.friendId, args.field, store);
|
|
96
|
+
if (value === undefined) {
|
|
97
|
+
return `field "${args.field}" is not set on the profile.`;
|
|
98
|
+
}
|
|
99
|
+
/* v8 ignore next -- platform-dependent v8 branch counting on ternary @preserve */
|
|
100
|
+
return typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
/* v8 ignore next -- defensive: getUserProfileField errors are always Error instances @preserve */
|
|
104
|
+
return `failed to get profile field: ${err instanceof Error ? err.message : String(err)}`;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
summaryKeys: ["field"],
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
tool: {
|
|
111
|
+
type: "function",
|
|
112
|
+
function: {
|
|
113
|
+
name: "user_profile_delete",
|
|
114
|
+
description: "Delete a user's entire profile from the vault. This is irreversible. Requires family trust level.",
|
|
115
|
+
parameters: {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
handler: async (_args, ctx) => {
|
|
122
|
+
(0, runtime_1.emitNervesEvent)({
|
|
123
|
+
component: "repertoire",
|
|
124
|
+
event: "repertoire.tool_user_profile_delete",
|
|
125
|
+
message: "user_profile_delete invoked",
|
|
126
|
+
meta: { tool: "user_profile_delete" },
|
|
127
|
+
});
|
|
128
|
+
const guard = requireFamilyContext(ctx);
|
|
129
|
+
if (typeof guard === "string")
|
|
130
|
+
return guard;
|
|
131
|
+
try {
|
|
132
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
133
|
+
const deleted = await (0, user_profile_1.deleteUserProfile)(guard.friendId, store);
|
|
134
|
+
return deleted
|
|
135
|
+
? `profile deleted for ${guard.friendId}.`
|
|
136
|
+
: `no profile found for ${guard.friendId}.`;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
/* v8 ignore next -- defensive: deleteUserProfile errors are always Error instances @preserve */
|
|
140
|
+
return `failed to delete profile: ${err instanceof Error ? err.message : String(err)}`;
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
summaryKeys: [],
|
|
144
|
+
riskProfile: { mutates: "durable_state_write", risk: "high", reason: "deletes user profile vault item" },
|
|
145
|
+
},
|
|
146
|
+
];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.vaultToolDefinitions = void 0;
|
|
4
|
+
const identity_1 = require("../heart/identity");
|
|
5
|
+
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
exports.vaultToolDefinitions = [
|
|
7
|
+
{
|
|
8
|
+
tool: {
|
|
9
|
+
type: "function",
|
|
10
|
+
function: {
|
|
11
|
+
name: "vault_setup",
|
|
12
|
+
description: "Set up the agent's credential vault. Creates a Bitwarden account on the configured Vaultwarden server. One-time operation — idempotent if vault already exists.",
|
|
13
|
+
parameters: {
|
|
14
|
+
type: "object",
|
|
15
|
+
properties: {},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
handler: async () => {
|
|
20
|
+
const agentName = (0, identity_1.getAgentName)();
|
|
21
|
+
(0, runtime_1.emitNervesEvent)({
|
|
22
|
+
component: "repertoire",
|
|
23
|
+
event: "repertoire.vault_tool_call",
|
|
24
|
+
message: "vault_setup invoked",
|
|
25
|
+
meta: { tool: "vault_setup", agentName },
|
|
26
|
+
});
|
|
27
|
+
return [
|
|
28
|
+
"Vault setup is human-required.",
|
|
29
|
+
"",
|
|
30
|
+
"Why I cannot do it here:",
|
|
31
|
+
" Creating or unlocking a vault requires secret entry that must stay out of agent context.",
|
|
32
|
+
"",
|
|
33
|
+
"Do this in a terminal:",
|
|
34
|
+
` ouro vault create --agent ${agentName}`,
|
|
35
|
+
` ouro vault unlock --agent ${agentName}`,
|
|
36
|
+
].join("\n");
|
|
37
|
+
},
|
|
38
|
+
summaryKeys: [],
|
|
39
|
+
},
|
|
40
|
+
];
|