@ouro.bot/cli 0.1.0-alpha.62 → 0.1.0-alpha.636
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/README.md +127 -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/changelog.json +4070 -13
- 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/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +266 -0
- package/dist/arc/packets.js +194 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/heart/active-work.js +831 -43
- package/dist/heart/agent-entry.js +69 -3
- 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 +479 -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 +377 -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 +322 -0
- package/dist/heart/config.js +114 -119
- package/dist/heart/core.js +914 -248
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +776 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +7468 -0
- package/dist/heart/daemon/cli-help.js +505 -0
- package/dist/heart/daemon/cli-parse.js +1554 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1700
- package/dist/heart/daemon/daemon-entry.js +485 -2
- package/dist/heart/daemon/daemon-health.js +176 -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 +905 -71
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +873 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -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 +89 -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 +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- 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 +14 -12
- 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 +463 -34
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +475 -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 +11 -3
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +493 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +22 -9
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -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 +229 -17
- 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/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
- 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 +37 -14
- package/dist/heart/identity.js +168 -57
- package/dist/heart/kept-notes.js +357 -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 +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -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 +31 -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 +418 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +319 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +756 -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 +656 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/orientation-frame.js +217 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +272 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +13 -4
- package/dist/heart/session-activity.js +48 -24
- package/dist/heart/session-events.js +1163 -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 +345 -0
- package/dist/heart/streaming.js +44 -27
- 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 +9 -5
- 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-description.js +143 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +389 -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 +426 -0
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-9-AxCxuB.js +61 -0
- package/dist/mailbox-ui/assets/index-CWzt267f.css +1 -0
- package/dist/mailbox-ui/index.html +15 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +715 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -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 +233 -0
- package/dist/mailroom/search-cache.js +334 -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 +14 -1
- package/dist/mind/context.js +251 -101
- package/dist/mind/desk-section.js +310 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -76
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +48 -4
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +162 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +6 -1
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1058 -146
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -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/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- 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 +152 -0
- package/dist/nerves/runtime.js +5 -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 +997 -0
- package/dist/repertoire/bundle-templates.js +72 -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 +197 -30
- package/dist/repertoire/coding/manager.js +163 -10
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +177 -7
- 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 +385 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +403 -0
- 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-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +57 -1082
- 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-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +227 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-mail.js +1975 -0
- package/dist/repertoire/tools-notes.js +438 -0
- package/dist/repertoire/tools-obligations.js +143 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +464 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +756 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +182 -0
- package/dist/repertoire/tools-surface.js +316 -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-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 +215 -103
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +116 -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} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2599 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles-meta-guard.js +40 -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 +240 -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 +517 -204
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +254 -22
- package/dist/senses/inner-dialog.js +488 -39
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +666 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +393 -0
- package/dist/senses/surface-tool.js +70 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +388 -98
- package/dist/senses/trust-gate.js +100 -5
- 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 +5079 -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 +53 -0
- package/package.json +42 -8
- package/skills/agent-commerce.md +106 -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 -351
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- 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 -1177
- package/dist/senses/debug-activity.js +0 -148
- 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,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getPluginsRoot = getPluginsRoot;
|
|
37
|
+
exports.getPluginDir = getPluginDir;
|
|
38
|
+
exports.getPluginSkillsDir = getPluginSkillsDir;
|
|
39
|
+
exports.listPlugins = listPlugins;
|
|
40
|
+
exports.listEnabledPlugins = listEnabledPlugins;
|
|
41
|
+
exports.listPluginSkills = listPluginSkills;
|
|
42
|
+
exports.loadPluginSkill = loadPluginSkill;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const identity_1 = require("../heart/identity");
|
|
46
|
+
const ouro_version_manager_1 = require("../heart/versioning/ouro-version-manager");
|
|
47
|
+
const runtime_1 = require("../nerves/runtime");
|
|
48
|
+
/**
|
|
49
|
+
* Plugin support for ouroboros (W5.2 of the worker-generalization extraction).
|
|
50
|
+
*
|
|
51
|
+
* Plugins are installed machine-locally at `~/.ouro-cli/plugins/<plugin-id>/`
|
|
52
|
+
* via `ouro plugin install` (W5.3). Each agent's bundle declares which plugins
|
|
53
|
+
* it has enabled via the `plugins[]` field in agent.json (W5.1).
|
|
54
|
+
*
|
|
55
|
+
* This module exposes the loader half: list installed plugins, list the skills
|
|
56
|
+
* a plugin provides, and load a specific plugin skill's body. Mirrors
|
|
57
|
+
* `src/repertoire/skills.ts` priority-chain pattern.
|
|
58
|
+
*
|
|
59
|
+
* Integration with prompt assembly (W5.4): `listPluginSkills(enabledPlugins)`
|
|
60
|
+
* is called from `src/mind/prompt.ts` alongside `listSkills()` so plugin
|
|
61
|
+
* skills appear in the agent's skill index via the same `load_skill` tool.
|
|
62
|
+
*/
|
|
63
|
+
/** ~/.ouro-cli/plugins/ — machine-scoped plugin install root. */
|
|
64
|
+
function getPluginsRoot(homeDir) {
|
|
65
|
+
return path.join((0, ouro_version_manager_1.getOuroCliHome)(homeDir), "plugins");
|
|
66
|
+
}
|
|
67
|
+
/** ~/.ouro-cli/plugins/<plugin-id>/ — install dir for a specific plugin. */
|
|
68
|
+
function getPluginDir(pluginId, homeDir) {
|
|
69
|
+
return path.join(getPluginsRoot(homeDir), pluginId);
|
|
70
|
+
}
|
|
71
|
+
/** ~/.ouro-cli/plugins/<plugin-id>/skills/ — the plugin's skill directory. */
|
|
72
|
+
function getPluginSkillsDir(pluginId, homeDir) {
|
|
73
|
+
return path.join(getPluginDir(pluginId, homeDir), "skills");
|
|
74
|
+
}
|
|
75
|
+
function listSkillDirNames(dir) {
|
|
76
|
+
// Industry-standard plugin skill layout: each skill is a directory under
|
|
77
|
+
// `skills/`, containing a `SKILL.md` (Claude Code + Copilot CLI convention;
|
|
78
|
+
// SKILL.md is the cross-vendor "agent skill" format with YAML frontmatter +
|
|
79
|
+
// markdown body). Older flat-file layouts (`skills/<name>.md`) are not part
|
|
80
|
+
// of the spec and not supported.
|
|
81
|
+
if (!fs.existsSync(dir))
|
|
82
|
+
return [];
|
|
83
|
+
return fs
|
|
84
|
+
.readdirSync(dir)
|
|
85
|
+
.filter((name) => {
|
|
86
|
+
const candidate = path.join(dir, name);
|
|
87
|
+
try {
|
|
88
|
+
if (!fs.statSync(candidate).isDirectory())
|
|
89
|
+
return false;
|
|
90
|
+
return fs.existsSync(path.join(candidate, "SKILL.md"));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
.sort();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* List installed plugins under ~/.ouro-cli/plugins/.
|
|
100
|
+
*
|
|
101
|
+
* Returns plugin IDs — directory names under the plugins root. Does NOT
|
|
102
|
+
* filter by enabled-for-this-agent; that's `listEnabledPlugins()`'s job.
|
|
103
|
+
*/
|
|
104
|
+
function listPlugins(homeDir) {
|
|
105
|
+
(0, runtime_1.emitNervesEvent)({
|
|
106
|
+
event: "plugins.list_start",
|
|
107
|
+
component: "repertoire",
|
|
108
|
+
message: "listing installed plugins",
|
|
109
|
+
meta: { operation: "listPlugins" },
|
|
110
|
+
});
|
|
111
|
+
const root = getPluginsRoot(homeDir);
|
|
112
|
+
if (!fs.existsSync(root)) {
|
|
113
|
+
(0, runtime_1.emitNervesEvent)({
|
|
114
|
+
event: "plugins.list_end",
|
|
115
|
+
component: "repertoire",
|
|
116
|
+
message: "no plugins root yet",
|
|
117
|
+
meta: { operation: "listPlugins", count: 0, root },
|
|
118
|
+
});
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const plugins = fs
|
|
122
|
+
.readdirSync(root)
|
|
123
|
+
.filter((name) => {
|
|
124
|
+
const fullPath = path.join(root, name);
|
|
125
|
+
try {
|
|
126
|
+
return fs.statSync(fullPath).isDirectory();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
.sort();
|
|
133
|
+
(0, runtime_1.emitNervesEvent)({
|
|
134
|
+
event: "plugins.list_end",
|
|
135
|
+
component: "repertoire",
|
|
136
|
+
message: "listed installed plugins",
|
|
137
|
+
meta: { operation: "listPlugins", count: plugins.length },
|
|
138
|
+
});
|
|
139
|
+
return plugins;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* List plugins this agent has enabled via agent.json `plugins[]`.
|
|
143
|
+
*
|
|
144
|
+
* Reads the agent config + filters to entries with `enabled: true` whose
|
|
145
|
+
* plugin directory actually exists under ~/.ouro-cli/plugins/. Returns
|
|
146
|
+
* the matched PluginConfig entries (not just IDs) so callers have access
|
|
147
|
+
* to source + version metadata.
|
|
148
|
+
*/
|
|
149
|
+
function listEnabledPlugins(homeDir) {
|
|
150
|
+
(0, runtime_1.emitNervesEvent)({
|
|
151
|
+
event: "plugins.list_enabled_start",
|
|
152
|
+
component: "repertoire",
|
|
153
|
+
message: "listing enabled plugins for agent",
|
|
154
|
+
meta: { operation: "listEnabledPlugins" },
|
|
155
|
+
});
|
|
156
|
+
const config = (0, identity_1.loadAgentConfig)();
|
|
157
|
+
const declared = config.plugins ?? [];
|
|
158
|
+
const installed = new Set(listPlugins(homeDir));
|
|
159
|
+
const enabled = declared.filter((p) => p.enabled && installed.has(p.id));
|
|
160
|
+
(0, runtime_1.emitNervesEvent)({
|
|
161
|
+
event: "plugins.list_enabled_end",
|
|
162
|
+
component: "repertoire",
|
|
163
|
+
message: "filtered to enabled + installed plugins",
|
|
164
|
+
meta: {
|
|
165
|
+
operation: "listEnabledPlugins",
|
|
166
|
+
declared: declared.length,
|
|
167
|
+
enabled: enabled.length,
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
return enabled;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* List skill names provided by the given enabled plugins.
|
|
174
|
+
*
|
|
175
|
+
* Walks each plugin's `skills/` directory using the industry-standard
|
|
176
|
+
* directory-per-skill layout (`skills/<name>/SKILL.md`). The SKILL.md
|
|
177
|
+
* convention is shared across Claude Code and Copilot CLI.
|
|
178
|
+
*
|
|
179
|
+
* Returns a deduplicated sorted list across all plugins. If two plugins
|
|
180
|
+
* declare a skill with the same name, the later-sorted plugin's skill wins
|
|
181
|
+
* (Set dedupe by name; callers concerned with collision can call this per
|
|
182
|
+
* plugin instead).
|
|
183
|
+
*/
|
|
184
|
+
function listPluginSkills(enabledPlugins, homeDir) {
|
|
185
|
+
(0, runtime_1.emitNervesEvent)({
|
|
186
|
+
event: "plugins.list_skills_start",
|
|
187
|
+
component: "repertoire",
|
|
188
|
+
message: "listing skills across enabled plugins",
|
|
189
|
+
meta: { operation: "listPluginSkills", pluginCount: enabledPlugins.length },
|
|
190
|
+
});
|
|
191
|
+
const all = [];
|
|
192
|
+
for (const plugin of enabledPlugins) {
|
|
193
|
+
const skillsDir = getPluginSkillsDir(plugin.id, homeDir);
|
|
194
|
+
const skills = listSkillDirNames(skillsDir);
|
|
195
|
+
all.push(...skills);
|
|
196
|
+
}
|
|
197
|
+
const deduped = [...new Set(all)].sort();
|
|
198
|
+
(0, runtime_1.emitNervesEvent)({
|
|
199
|
+
event: "plugins.list_skills_end",
|
|
200
|
+
component: "repertoire",
|
|
201
|
+
message: "listed plugin skills",
|
|
202
|
+
meta: {
|
|
203
|
+
operation: "listPluginSkills",
|
|
204
|
+
pluginCount: enabledPlugins.length,
|
|
205
|
+
skillCount: deduped.length,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
return deduped;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Load the body of a specific skill from a specific plugin.
|
|
212
|
+
*
|
|
213
|
+
* Resolves the industry-standard directory-per-skill layout:
|
|
214
|
+
* `skills/<skillName>/SKILL.md`. Throws if not found.
|
|
215
|
+
*/
|
|
216
|
+
function loadPluginSkill(pluginId, skillName, homeDir) {
|
|
217
|
+
(0, runtime_1.emitNervesEvent)({
|
|
218
|
+
event: "plugins.load_skill_start",
|
|
219
|
+
component: "repertoire",
|
|
220
|
+
message: "loading plugin skill",
|
|
221
|
+
meta: { operation: "loadPluginSkill", plugin: pluginId, skill: skillName },
|
|
222
|
+
});
|
|
223
|
+
const skillsDir = getPluginSkillsDir(pluginId, homeDir);
|
|
224
|
+
const skillPath = path.join(skillsDir, skillName, "SKILL.md");
|
|
225
|
+
if (!fs.existsSync(skillPath)) {
|
|
226
|
+
(0, runtime_1.emitNervesEvent)({
|
|
227
|
+
level: "error",
|
|
228
|
+
event: "plugins.load_skill_error",
|
|
229
|
+
component: "repertoire",
|
|
230
|
+
message: "plugin skill not found",
|
|
231
|
+
meta: {
|
|
232
|
+
operation: "loadPluginSkill",
|
|
233
|
+
plugin: pluginId,
|
|
234
|
+
skill: skillName,
|
|
235
|
+
checkedPath: skillPath,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
throw new Error(`plugin skill '${pluginId}:${skillName}' not found at ${skillPath}`);
|
|
239
|
+
}
|
|
240
|
+
const content = fs.readFileSync(skillPath, "utf-8");
|
|
241
|
+
(0, runtime_1.emitNervesEvent)({
|
|
242
|
+
event: "plugins.load_skill_end",
|
|
243
|
+
component: "repertoire",
|
|
244
|
+
message: "loaded plugin skill",
|
|
245
|
+
meta: {
|
|
246
|
+
operation: "loadPluginSkill",
|
|
247
|
+
plugin: pluginId,
|
|
248
|
+
skill: skillName,
|
|
249
|
+
path: skillPath,
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
return content;
|
|
253
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.spawnBackgroundShell = spawnBackgroundShell;
|
|
4
|
+
exports.getShellSession = getShellSession;
|
|
5
|
+
exports.listShellSessions = listShellSessions;
|
|
6
|
+
exports.tailShellSession = tailShellSession;
|
|
7
|
+
exports.resetShellSessions = resetShellSessions;
|
|
8
|
+
exports.detectDestructivePatterns = detectDestructivePatterns;
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
const runtime_1 = require("../nerves/runtime");
|
|
12
|
+
const sessions = new Map();
|
|
13
|
+
const MAX_OUTPUT_LINES = 200;
|
|
14
|
+
function spawnBackgroundShell(command) {
|
|
15
|
+
const id = (0, crypto_1.randomUUID)();
|
|
16
|
+
const proc = (0, child_process_1.spawn)("sh", ["-c", command], {
|
|
17
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
18
|
+
});
|
|
19
|
+
const session = {
|
|
20
|
+
process: proc,
|
|
21
|
+
info: {
|
|
22
|
+
id,
|
|
23
|
+
command,
|
|
24
|
+
status: "running",
|
|
25
|
+
exitCode: null,
|
|
26
|
+
pid: proc.pid,
|
|
27
|
+
startedAt: Date.now(),
|
|
28
|
+
output: [],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const appendOutput = (data) => {
|
|
32
|
+
const lines = data.toString().split("\n");
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
if (line.length > 0 || session.info.output.length > 0) {
|
|
35
|
+
session.info.output.push(line);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Keep only the last MAX_OUTPUT_LINES
|
|
39
|
+
if (session.info.output.length > MAX_OUTPUT_LINES) {
|
|
40
|
+
session.info.output = session.info.output.slice(-MAX_OUTPUT_LINES);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
proc.stdout?.on("data", appendOutput);
|
|
44
|
+
proc.stderr?.on("data", appendOutput);
|
|
45
|
+
proc.on("close", (code) => {
|
|
46
|
+
session.info.status = "exited";
|
|
47
|
+
session.info.exitCode = code;
|
|
48
|
+
(0, runtime_1.emitNervesEvent)({
|
|
49
|
+
component: "repertoire",
|
|
50
|
+
event: "repertoire.shell.process_exit",
|
|
51
|
+
message: "background shell process exited",
|
|
52
|
+
meta: { id, command, exitCode: code, pid: proc.pid },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
sessions.set(id, session);
|
|
56
|
+
(0, runtime_1.emitNervesEvent)({
|
|
57
|
+
component: "repertoire",
|
|
58
|
+
event: "repertoire.shell.spawn",
|
|
59
|
+
message: "spawned background shell session",
|
|
60
|
+
meta: { id, command, pid: proc.pid },
|
|
61
|
+
});
|
|
62
|
+
return { ...session.info };
|
|
63
|
+
}
|
|
64
|
+
function getShellSession(id) {
|
|
65
|
+
const session = sessions.get(id);
|
|
66
|
+
if (!session)
|
|
67
|
+
return undefined;
|
|
68
|
+
(0, runtime_1.emitNervesEvent)({
|
|
69
|
+
component: "repertoire",
|
|
70
|
+
event: "repertoire.shell.status_check",
|
|
71
|
+
message: "checked shell session status",
|
|
72
|
+
meta: { id, status: session.info.status, exitCode: session.info.exitCode },
|
|
73
|
+
});
|
|
74
|
+
return { ...session.info };
|
|
75
|
+
}
|
|
76
|
+
function listShellSessions() {
|
|
77
|
+
return Array.from(sessions.values()).map((s) => ({
|
|
78
|
+
id: s.info.id,
|
|
79
|
+
command: s.info.command,
|
|
80
|
+
status: s.info.status,
|
|
81
|
+
exitCode: s.info.exitCode,
|
|
82
|
+
pid: s.info.pid,
|
|
83
|
+
startedAt: s.info.startedAt,
|
|
84
|
+
output: [], // Don't include full output in listing
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
function tailShellSession(id, lines = 50) {
|
|
88
|
+
const session = sessions.get(id);
|
|
89
|
+
if (!session)
|
|
90
|
+
return undefined;
|
|
91
|
+
const tail = session.info.output.slice(-lines);
|
|
92
|
+
(0, runtime_1.emitNervesEvent)({
|
|
93
|
+
component: "repertoire",
|
|
94
|
+
event: "repertoire.shell.tail",
|
|
95
|
+
message: "tailed shell session output",
|
|
96
|
+
meta: { id, requestedLines: lines, returnedLines: tail.length },
|
|
97
|
+
});
|
|
98
|
+
return tail.join("\n");
|
|
99
|
+
}
|
|
100
|
+
/** Reset all sessions (for testing) */
|
|
101
|
+
function resetShellSessions() {
|
|
102
|
+
for (const session of sessions.values()) {
|
|
103
|
+
if (session.info.status === "running") {
|
|
104
|
+
session.process.kill();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
sessions.clear();
|
|
108
|
+
}
|
|
109
|
+
const DESTRUCTIVE_PATTERNS = [
|
|
110
|
+
{ name: "rm -rf root/home", regex: /rm\s+-rf\s+[/~]/ },
|
|
111
|
+
{ name: "git push --force", regex: /git\s+push\s+--force/ },
|
|
112
|
+
{ name: "git reset --hard", regex: /git\s+reset\s+--hard/ },
|
|
113
|
+
{ name: "git clean -f", regex: /git\s+clean\s+-f/ },
|
|
114
|
+
{ name: "git branch -D", regex: /git\s+branch\s+-D/ },
|
|
115
|
+
{ name: "fork bomb", regex: /:\(\)\s*\{/ },
|
|
116
|
+
{ name: "write to raw device", regex: />\s*\/dev\/sd/ },
|
|
117
|
+
{ name: "git checkout .", regex: /git\s+checkout\s+\./ },
|
|
118
|
+
{ name: "git stash drop", regex: /git\s+stash\s+drop/ },
|
|
119
|
+
];
|
|
120
|
+
/**
|
|
121
|
+
* Detect destructive patterns in a shell command.
|
|
122
|
+
* Returns list of matched pattern names. Empty array = safe.
|
|
123
|
+
* This is a friction layer, not a hard block.
|
|
124
|
+
*/
|
|
125
|
+
function detectDestructivePatterns(command) {
|
|
126
|
+
const matched = [];
|
|
127
|
+
for (const pattern of DESTRUCTIVE_PATTERNS) {
|
|
128
|
+
if (pattern.regex.test(command)) {
|
|
129
|
+
matched.push(pattern.name);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return matched;
|
|
133
|
+
}
|
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.getSkillsDir = getSkillsDir;
|
|
37
|
+
exports.getHarnessSkillsDir = getHarnessSkillsDir;
|
|
37
38
|
exports.listSkills = listSkills;
|
|
38
39
|
exports.loadSkill = loadSkill;
|
|
39
40
|
exports.getLoadedSkills = getLoadedSkills;
|
|
@@ -42,6 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
42
43
|
const path = __importStar(require("path"));
|
|
43
44
|
const identity_1 = require("../heart/identity");
|
|
44
45
|
const runtime_1 = require("../nerves/runtime");
|
|
46
|
+
const plugins_1 = require("./plugins");
|
|
45
47
|
// Skills live in {agentRoot}/skills/ directory
|
|
46
48
|
function getSkillsDir() {
|
|
47
49
|
return path.join((0, identity_1.getAgentRoot)(), "skills");
|
|
@@ -50,6 +52,10 @@ function getSkillsDir() {
|
|
|
50
52
|
function getProtocolMirrorDir() {
|
|
51
53
|
return path.join(getSkillsDir(), "protocols");
|
|
52
54
|
}
|
|
55
|
+
// Harness-level skills live in {repoRoot}/skills/ directory.
|
|
56
|
+
function getHarnessSkillsDir() {
|
|
57
|
+
return path.join((0, identity_1.getRepoRoot)(), "skills");
|
|
58
|
+
}
|
|
53
59
|
function listMarkdownBasenames(dir) {
|
|
54
60
|
if (!fs.existsSync(dir))
|
|
55
61
|
return [];
|
|
@@ -59,7 +65,7 @@ function listMarkdownBasenames(dir) {
|
|
|
59
65
|
.map((f) => path.basename(f, ".md"))
|
|
60
66
|
.sort();
|
|
61
67
|
}
|
|
62
|
-
//
|
|
68
|
+
// process-local store for loaded skills
|
|
63
69
|
const loadedSkills = [];
|
|
64
70
|
function listSkills() {
|
|
65
71
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -70,7 +76,14 @@ function listSkills() {
|
|
|
70
76
|
});
|
|
71
77
|
const baseSkills = listMarkdownBasenames(getSkillsDir());
|
|
72
78
|
const protocolMirrors = listMarkdownBasenames(getProtocolMirrorDir());
|
|
73
|
-
const
|
|
79
|
+
const harnessSkills = listMarkdownBasenames(getHarnessSkillsDir());
|
|
80
|
+
const pluginSkills = (0, plugins_1.listPluginSkills)((0, plugins_1.listEnabledPlugins)());
|
|
81
|
+
// Agent skills (base + protocol) come first; harness skills are fallback;
|
|
82
|
+
// plugin skills surface after harness skills. Set deduplicates by name —
|
|
83
|
+
// agent overrides harness overrides plugins.
|
|
84
|
+
const skills = [
|
|
85
|
+
...new Set([...baseSkills, ...protocolMirrors, ...harnessSkills, ...pluginSkills]),
|
|
86
|
+
].sort();
|
|
74
87
|
(0, runtime_1.emitNervesEvent)({
|
|
75
88
|
event: "repertoire.load_end",
|
|
76
89
|
component: "repertoire",
|
|
@@ -88,6 +101,7 @@ function loadSkill(skillName) {
|
|
|
88
101
|
});
|
|
89
102
|
const directSkillPath = path.join(getSkillsDir(), `${skillName}.md`);
|
|
90
103
|
const protocolMirrorPath = path.join(getProtocolMirrorDir(), `${skillName}.md`);
|
|
104
|
+
const harnessSkillPath = path.join(getHarnessSkillsDir(), `${skillName}.md`);
|
|
91
105
|
let resolvedPath = null;
|
|
92
106
|
// 1) Direct agent skill.
|
|
93
107
|
if (fs.existsSync(directSkillPath)) {
|
|
@@ -97,6 +111,35 @@ function loadSkill(skillName) {
|
|
|
97
111
|
else if (fs.existsSync(protocolMirrorPath)) {
|
|
98
112
|
resolvedPath = protocolMirrorPath;
|
|
99
113
|
}
|
|
114
|
+
// 3) Harness-level skill (ships with npm package).
|
|
115
|
+
else if (fs.existsSync(harnessSkillPath)) {
|
|
116
|
+
resolvedPath = harnessSkillPath;
|
|
117
|
+
}
|
|
118
|
+
// 4) Plugin skill fallback. Iterate enabled plugins; first match wins.
|
|
119
|
+
if (!resolvedPath) {
|
|
120
|
+
for (const plugin of (0, plugins_1.listEnabledPlugins)()) {
|
|
121
|
+
try {
|
|
122
|
+
const content = (0, plugins_1.loadPluginSkill)(plugin.id, skillName);
|
|
123
|
+
if (!loadedSkills.includes(skillName)) {
|
|
124
|
+
loadedSkills.push(skillName);
|
|
125
|
+
}
|
|
126
|
+
(0, runtime_1.emitNervesEvent)({
|
|
127
|
+
event: "repertoire.load_end",
|
|
128
|
+
component: "repertoire",
|
|
129
|
+
message: "loaded skill",
|
|
130
|
+
meta: {
|
|
131
|
+
operation: "loadSkill",
|
|
132
|
+
skill: skillName,
|
|
133
|
+
path: `plugin:${plugin.id}`,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
return content;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// try next plugin
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
100
143
|
if (!resolvedPath) {
|
|
101
144
|
(0, runtime_1.emitNervesEvent)({
|
|
102
145
|
level: "error",
|
|
@@ -106,12 +149,13 @@ function loadSkill(skillName) {
|
|
|
106
149
|
meta: {
|
|
107
150
|
operation: "loadSkill",
|
|
108
151
|
skill: skillName,
|
|
109
|
-
checkedPaths: [directSkillPath, protocolMirrorPath],
|
|
152
|
+
checkedPaths: [directSkillPath, protocolMirrorPath, harnessSkillPath],
|
|
110
153
|
},
|
|
111
154
|
});
|
|
112
155
|
throw new Error(`skill '${skillName}' not found in:\n` +
|
|
113
156
|
`- ${directSkillPath}\n` +
|
|
114
|
-
`- ${protocolMirrorPath}`
|
|
157
|
+
`- ${protocolMirrorPath}\n` +
|
|
158
|
+
`- ${harnessSkillPath}`);
|
|
115
159
|
}
|
|
116
160
|
const content = fs.readFileSync(resolvedPath, "utf-8");
|
|
117
161
|
if (!loadedSkills.includes(skillName)) {
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Thin wrapper around the Stripe Issuing API.
|
|
4
|
+
*
|
|
5
|
+
* Initializes with a restricted API key from the agent's vault.
|
|
6
|
+
* Card numbers are NEVER included in nerves events or log output.
|
|
7
|
+
* The `getCardDetails` method exists only for internal payment flows
|
|
8
|
+
* (e.g., passing card details to Duffel) — the returned data must
|
|
9
|
+
* never escape the calling function's scope.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createStripeClient = createStripeClient;
|
|
16
|
+
const stripe_1 = __importDefault(require("stripe"));
|
|
17
|
+
const credential_access_1 = require("./credential-access");
|
|
18
|
+
const runtime_1 = require("../nerves/runtime");
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Implementation
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
function toCardInfo(card) {
|
|
23
|
+
return {
|
|
24
|
+
cardId: card.id,
|
|
25
|
+
last4: card.last4,
|
|
26
|
+
status: card.status,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a Stripe client initialized with a restricted key from the vault.
|
|
31
|
+
*/
|
|
32
|
+
async function createStripeClient() {
|
|
33
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
34
|
+
const apiKey = await store.getRawSecret("stripe.com", "restrictedKey");
|
|
35
|
+
// StripeConstructor is a callable (not a class), cast the result
|
|
36
|
+
const stripe = (0, stripe_1.default)(apiKey);
|
|
37
|
+
return {
|
|
38
|
+
async createVirtualCard(opts) {
|
|
39
|
+
(0, runtime_1.emitNervesEvent)({
|
|
40
|
+
component: "repertoire",
|
|
41
|
+
event: "repertoire.stripe_card_create_start",
|
|
42
|
+
message: "creating virtual card",
|
|
43
|
+
meta: { type: opts.type, currency: opts.currency },
|
|
44
|
+
});
|
|
45
|
+
const spendingControls = {
|
|
46
|
+
spending_limits: [
|
|
47
|
+
{
|
|
48
|
+
amount: opts.spendLimit * 100, // Stripe uses cents
|
|
49
|
+
interval: opts.type === "single_use" ? "all_time" : "monthly",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
...(opts.merchantCategories
|
|
53
|
+
? { allowed_categories: opts.merchantCategories }
|
|
54
|
+
: {}),
|
|
55
|
+
};
|
|
56
|
+
const card = await stripe.issuing.cards.create({
|
|
57
|
+
type: "virtual",
|
|
58
|
+
currency: opts.currency,
|
|
59
|
+
spending_controls: spendingControls,
|
|
60
|
+
status: "active",
|
|
61
|
+
});
|
|
62
|
+
(0, runtime_1.emitNervesEvent)({
|
|
63
|
+
component: "repertoire",
|
|
64
|
+
event: "repertoire.stripe_card_create_end",
|
|
65
|
+
message: "virtual card created",
|
|
66
|
+
meta: { cardId: card.id, last4: card.last4 },
|
|
67
|
+
});
|
|
68
|
+
return toCardInfo(card);
|
|
69
|
+
},
|
|
70
|
+
async getCard(cardId) {
|
|
71
|
+
(0, runtime_1.emitNervesEvent)({
|
|
72
|
+
component: "repertoire",
|
|
73
|
+
event: "repertoire.stripe_card_get",
|
|
74
|
+
message: "retrieving card info",
|
|
75
|
+
meta: { cardId },
|
|
76
|
+
});
|
|
77
|
+
const card = await stripe.issuing.cards.retrieve(cardId);
|
|
78
|
+
return toCardInfo(card);
|
|
79
|
+
},
|
|
80
|
+
async updateCard(cardId, updates) {
|
|
81
|
+
(0, runtime_1.emitNervesEvent)({
|
|
82
|
+
component: "repertoire",
|
|
83
|
+
event: "repertoire.stripe_card_update",
|
|
84
|
+
message: "updating card",
|
|
85
|
+
meta: { cardId },
|
|
86
|
+
});
|
|
87
|
+
const card = await stripe.issuing.cards.update(cardId, updates);
|
|
88
|
+
return toCardInfo(card);
|
|
89
|
+
},
|
|
90
|
+
async deactivateCard(cardId) {
|
|
91
|
+
(0, runtime_1.emitNervesEvent)({
|
|
92
|
+
component: "repertoire",
|
|
93
|
+
event: "repertoire.stripe_card_deactivate",
|
|
94
|
+
message: "deactivating card",
|
|
95
|
+
meta: { cardId },
|
|
96
|
+
});
|
|
97
|
+
const card = await stripe.issuing.cards.update(cardId, { status: "canceled" });
|
|
98
|
+
return toCardInfo(card);
|
|
99
|
+
},
|
|
100
|
+
async listCards() {
|
|
101
|
+
(0, runtime_1.emitNervesEvent)({
|
|
102
|
+
component: "repertoire",
|
|
103
|
+
event: "repertoire.stripe_cards_list",
|
|
104
|
+
message: "listing cards",
|
|
105
|
+
meta: {},
|
|
106
|
+
});
|
|
107
|
+
const result = await stripe.issuing.cards.list();
|
|
108
|
+
return result.data.map(toCardInfo);
|
|
109
|
+
},
|
|
110
|
+
async getCardDetails(cardId) {
|
|
111
|
+
// This method retrieves sensitive card details for payment flows.
|
|
112
|
+
// The data must NEVER be logged, emitted, or returned to the model.
|
|
113
|
+
(0, runtime_1.emitNervesEvent)({
|
|
114
|
+
component: "repertoire",
|
|
115
|
+
event: "repertoire.stripe_card_details_get",
|
|
116
|
+
message: "retrieving card details for payment flow",
|
|
117
|
+
meta: { cardId },
|
|
118
|
+
});
|
|
119
|
+
const card = await stripe.issuing.cards.retrieve(cardId, {
|
|
120
|
+
expand: ["number", "cvc"],
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
cardId: card.id,
|
|
124
|
+
number: card.number,
|
|
125
|
+
cvc: card.cvc,
|
|
126
|
+
expMonth: card.exp_month,
|
|
127
|
+
expYear: card.exp_year,
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.okToolResult = okToolResult;
|
|
4
|
+
exports.frictionToolResult = frictionToolResult;
|
|
5
|
+
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
function okToolResult(tool, data) {
|
|
7
|
+
(0, runtime_1.emitNervesEvent)({
|
|
8
|
+
component: "tools",
|
|
9
|
+
event: "tool.structured_ok",
|
|
10
|
+
message: "tool returned structured result",
|
|
11
|
+
meta: { tool },
|
|
12
|
+
});
|
|
13
|
+
return JSON.stringify({ ok: true, tool, data }, null, 2);
|
|
14
|
+
}
|
|
15
|
+
function frictionToolResult(tool, friction) {
|
|
16
|
+
(0, runtime_1.emitNervesEvent)({
|
|
17
|
+
level: "warn",
|
|
18
|
+
component: "tools",
|
|
19
|
+
event: "tool.structured_friction",
|
|
20
|
+
message: "tool returned structured result",
|
|
21
|
+
meta: {
|
|
22
|
+
tool,
|
|
23
|
+
kind: friction.kind,
|
|
24
|
+
recoverability: friction.recoverability,
|
|
25
|
+
signature: friction.signature,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return JSON.stringify({ ok: false, tool, friction }, null, 2);
|
|
29
|
+
}
|