@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831
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/assets/sanctuary-host-launcher.sh +16 -0
- package/changelog.json +5308 -16
- package/deploy/unraid/Dockerfile +54 -0
- package/deploy/unraid/README.txt +2983 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
- package/deploy/unraid/docker-man-template-xml.cjs +105 -0
- package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
- package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
- package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
- package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
- package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
- package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-authority-installation.json +36 -0
- package/deploy/unraid/sanctuary-authority-service.sh +30 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +66 -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/mcp/media-mcp.mjs +795 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
- package/deploy/unraid/sanctuary.xml +28 -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 +360 -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 +386 -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 +798 -40
- package/dist/heart/agent-entry.js +252 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +960 -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 +18 -0
- package/dist/heart/attachments/sources/telegram.js +71 -0
- package/dist/heart/attachments/store.js +132 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +478 -0
- package/dist/heart/awaiting/await-alert.js +148 -0
- package/dist/heart/awaiting/await-expiry.js +143 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +149 -0
- package/dist/heart/awaiting/await-runtime-state.js +111 -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 +44 -18
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +174 -131
- package/dist/heart/context-loss-gauntlet.js +387 -0
- package/dist/heart/context-loss-sentinel.js +1157 -0
- package/dist/heart/core.js +2169 -581
- package/dist/heart/cross-chat-delivery.js +9 -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 +854 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8822 -0
- package/dist/heart/daemon/cli-help.js +716 -0
- package/dist/heart/daemon/cli-parse.js +2771 -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 +112 -0
- package/dist/heart/daemon/container-runtime.js +97 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
- package/dist/heart/daemon/container-spec-auditor.js +229 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2349
- package/dist/heart/daemon/daemon-entry.js +930 -11
- 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 +2084 -105
- 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 +65 -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 +733 -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 +2654 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
- package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
- package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
- package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
- package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
- package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
- package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
- package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
- package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
- package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
- package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
- package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
- package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
- package/dist/heart/daemon/sanctuary-package-management.js +103 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
- package/dist/heart/daemon/sense-manager.js +699 -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 +339 -0
- package/dist/heart/daemon/supercronic-supervisor.js +282 -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 +138 -54
- 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 +1430 -0
- package/dist/heart/frontend-approval-runtime.js +506 -0
- package/dist/heart/frontend-journal.js +215 -0
- package/dist/heart/frontend-session-service.js +237 -0
- package/dist/heart/frontend-socket-client.js +164 -0
- package/dist/heart/frontend-socket.js +400 -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 +196 -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 +356 -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 +129 -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 +231 -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 +158 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +221 -0
- package/dist/heart/private-runtime/policy.js +252 -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 +96 -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 +92 -24
- package/dist/heart/session-events.js +1504 -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-redaction-repair-cli-main.js +31 -0
- package/dist/heart/session-redaction-repair.js +552 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +183 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +618 -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 +382 -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 +482 -0
- package/dist/heart/turn-execution-lease.js +30 -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-Cyv4mw3Y.js +1 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +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 +309 -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 +199 -3
- package/dist/mind/pending.js +36 -10
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1050 -189
- 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 +564 -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 +174 -32
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +159 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +221 -15
- 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 +811 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +427 -139
- package/dist/repertoire/mcp-tools.js +124 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/relationship-authorization.js +322 -0
- package/dist/repertoire/shell-sessions.js +134 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +170 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +322 -0
- package/dist/repertoire/tools-awaiting.js +575 -0
- package/dist/repertoire/tools-base.js +77 -1138
- 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 +575 -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 +485 -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-sanctuary-host.js +202 -0
- package/dist/repertoire/tools-session.js +1133 -0
- package/dist/repertoire/tools-shell.js +149 -0
- package/dist/repertoire/tools-steward-policy.js +119 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +369 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-telegram-contacts.js +37 -0
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +531 -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 +494 -148
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +339 -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/acp-server.js +386 -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 +3841 -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.js +604 -320
- 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 +1115 -204
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1517 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/root-host-approval-port.js +345 -0
- package/dist/senses/root-host-approval-runtime.js +393 -0
- package/dist/senses/sanctuary-authority-resident.js +102 -0
- package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
- package/dist/senses/sanctuary-full-visibility-contract.js +302 -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 +774 -0
- package/dist/senses/sanctuary-health-runner.js +100 -0
- package/dist/senses/sanctuary-health.js +408 -0
- package/dist/senses/sanctuary-install-state-contract.js +126 -0
- package/dist/senses/sanctuary-interactive-control.js +410 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +340 -0
- package/dist/senses/sanctuary-sab.js +85 -0
- package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
- package/dist/senses/shared-turn.js +772 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +519 -218
- package/dist/senses/telegram-admission.js +718 -0
- package/dist/senses/telegram-approval-runtime.js +793 -0
- package/dist/senses/telegram-attachments.js +186 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-authority-transport.js +231 -0
- package/dist/senses/telegram-client.js +1749 -0
- package/dist/senses/telegram-effect-adapter.js +896 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram.js +2324 -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 +5031 -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 +8138 -0
- package/package.json +72 -13
- 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 -260
- package/dist/heart/daemon/ouro-version-manager.js +0 -171
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/obligations.js +0 -191
- 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 -1181
- package/dist/senses/debug-activity.js +0 -154
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -525
- 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
package/dist/nerves/index.js
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DEFAULT_MAX_GENERATIONS = exports.DEFAULT_MAX_LOG_SIZE_BYTES = void 0;
|
|
3
37
|
exports.createTraceId = createTraceId;
|
|
4
38
|
exports.ensureTraceId = ensureTraceId;
|
|
5
39
|
exports.createFanoutSink = createFanoutSink;
|
|
@@ -7,18 +41,44 @@ exports.formatTerminalEntry = formatTerminalEntry;
|
|
|
7
41
|
exports.registerSpinnerHooks = registerSpinnerHooks;
|
|
8
42
|
exports.createTerminalSink = createTerminalSink;
|
|
9
43
|
exports.createStderrSink = createStderrSink;
|
|
44
|
+
exports.rotateIfNeeded = rotateIfNeeded;
|
|
10
45
|
exports.createNdjsonFileSink = createNdjsonFileSink;
|
|
11
46
|
exports.registerGlobalLogSink = registerGlobalLogSink;
|
|
12
47
|
exports.createLogger = createLogger;
|
|
13
48
|
const fs_1 = require("fs");
|
|
14
49
|
const path_1 = require("path");
|
|
15
50
|
const crypto_1 = require("crypto");
|
|
51
|
+
const zlib = __importStar(require("zlib"));
|
|
52
|
+
// NOTE: runtime.ts imports `createLogger` and `ensureTraceId` from this file.
|
|
53
|
+
// The cycle is safe in CommonJS because runtime.ts only uses those values
|
|
54
|
+
// lazily inside `getRuntimeLogger()`, and we only call `emitNervesEvent` from
|
|
55
|
+
// inside `rotateIfNeeded` — never at module top level.
|
|
56
|
+
const runtime_1 = require("./runtime");
|
|
57
|
+
const redact_1 = require("./redact");
|
|
16
58
|
const LEVEL_PRIORITY = {
|
|
17
59
|
debug: 10,
|
|
18
60
|
info: 20,
|
|
19
61
|
warn: 30,
|
|
20
62
|
error: 40,
|
|
21
63
|
};
|
|
64
|
+
function fsyncFileAndDirectory(filePath) {
|
|
65
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
66
|
+
const fileDescriptor = (0, fs_1.openSync)(filePath, "r");
|
|
67
|
+
try {
|
|
68
|
+
(0, fs_1.fsyncSync)(fileDescriptor);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
(0, fs_1.closeSync)(fileDescriptor);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const directoryDescriptor = (0, fs_1.openSync)((0, path_1.dirname)(filePath), "r");
|
|
75
|
+
try {
|
|
76
|
+
(0, fs_1.fsyncSync)(directoryDescriptor);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
(0, fs_1.closeSync)(directoryDescriptor);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
22
82
|
const GLOBAL_SINKS_KEY = Symbol.for("ouroboros.nerves.global-sinks");
|
|
23
83
|
function resolveGlobalSinks() {
|
|
24
84
|
const scope = globalThis;
|
|
@@ -82,7 +142,10 @@ function registerSpinnerHooks(pause, resume) {
|
|
|
82
142
|
_pauseSpinner = pause;
|
|
83
143
|
_resumeSpinner = resume;
|
|
84
144
|
}
|
|
85
|
-
function createTerminalSink(write = (chunk) =>
|
|
145
|
+
function createTerminalSink(write = (chunk) => { try {
|
|
146
|
+
process.stderr.write(chunk);
|
|
147
|
+
}
|
|
148
|
+
catch { /* EPIPE: daemon detached, no terminal */ } }, colorize = true) {
|
|
86
149
|
return (entry) => {
|
|
87
150
|
_pauseSpinner?.();
|
|
88
151
|
const line = formatTerminalEntry(entry);
|
|
@@ -96,27 +159,241 @@ function createTerminalSink(write = (chunk) => process.stderr.write(chunk), colo
|
|
|
96
159
|
_resumeSpinner?.();
|
|
97
160
|
};
|
|
98
161
|
}
|
|
99
|
-
function createStderrSink(write
|
|
162
|
+
function createStderrSink(write) {
|
|
100
163
|
return createTerminalSink(write);
|
|
101
164
|
}
|
|
102
|
-
|
|
165
|
+
exports.DEFAULT_MAX_LOG_SIZE_BYTES = 25 * 1024 * 1024; // 25 MB per active stream
|
|
166
|
+
exports.DEFAULT_MAX_GENERATIONS = 5; // keep 5 gzipped historical generations
|
|
167
|
+
const DEFAULT_ROTATION_CHECK_INTERVAL_BYTES = 1024 * 1024; // ~1MB between stat checks
|
|
168
|
+
/** Internal: compute the gzipped generation path for a given ndjson file. */
|
|
169
|
+
function generationGzPath(base, ext, n) {
|
|
170
|
+
return ext === ".ndjson" ? `${base}.${n}.ndjson.gz` : `${base}.${n}.gz`;
|
|
171
|
+
}
|
|
172
|
+
/** Internal: compute the legacy uncompressed generation path for a given file. */
|
|
173
|
+
function generationPlainPath(base, ext, n) {
|
|
174
|
+
return ext === ".ndjson" ? `${base}.${n}.ndjson` : `${base}.${n}`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Rotate a log file in place.
|
|
178
|
+
*
|
|
179
|
+
* Scheme (25 MB × 5 gzipped generations by default):
|
|
180
|
+
* active : foo.ndjson
|
|
181
|
+
* newest gen : foo.1.ndjson.gz
|
|
182
|
+
* oldest gen : foo.5.ndjson.gz (dropped on next rotation)
|
|
183
|
+
*
|
|
184
|
+
* Legacy tolerance: uncompressed `foo.1.ndjson` / `foo.2.ndjson` files from the
|
|
185
|
+
* old scheme are treated as the corresponding generation and gzipped on first
|
|
186
|
+
* rotation.
|
|
187
|
+
*
|
|
188
|
+
* Concurrent-writer safety: the active file is renamed (inode stays alive for
|
|
189
|
+
* any open writer fd) then gzipped at the renamed path. An active writer
|
|
190
|
+
* continues writing to its original fd; on the next write cycle it sees the
|
|
191
|
+
* old path is missing and creates a fresh file.
|
|
192
|
+
*
|
|
193
|
+
* Backwards-compatible signature: passing a `number` as the second argument
|
|
194
|
+
* (the old API) is still accepted and interpreted as `maxSizeBytes`.
|
|
195
|
+
*/
|
|
196
|
+
function rotateIfNeeded(filePath, optionsOrMaxSize) {
|
|
197
|
+
const options = typeof optionsOrMaxSize === "number"
|
|
198
|
+
? { maxSizeBytes: optionsOrMaxSize }
|
|
199
|
+
: optionsOrMaxSize ?? {};
|
|
200
|
+
const maxSizeBytes = options.maxSizeBytes ?? exports.DEFAULT_MAX_LOG_SIZE_BYTES;
|
|
201
|
+
const maxGenerations = options.maxGenerations ?? exports.DEFAULT_MAX_GENERATIONS;
|
|
202
|
+
const compress = options.compress ?? true;
|
|
203
|
+
let size;
|
|
204
|
+
try {
|
|
205
|
+
size = (0, fs_1.statSync)(filePath).size;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
if (size < maxSizeBytes)
|
|
211
|
+
return false;
|
|
212
|
+
const ext = filePath.endsWith(".ndjson") ? ".ndjson" : "";
|
|
213
|
+
const base = ext ? filePath.slice(0, -ext.length) : filePath;
|
|
214
|
+
const traceId = (0, crypto_1.randomUUID)();
|
|
215
|
+
(0, runtime_1.emitNervesEvent)({
|
|
216
|
+
component: "nerves",
|
|
217
|
+
event: "nerves.rotation_start",
|
|
218
|
+
trace_id: traceId,
|
|
219
|
+
message: "rotating log file",
|
|
220
|
+
meta: { path: filePath, currentSize: size, threshold: maxSizeBytes, generation: 1 },
|
|
221
|
+
});
|
|
222
|
+
let completed = false;
|
|
223
|
+
try {
|
|
224
|
+
// Step 1: drop / shift existing generations starting from the oldest.
|
|
225
|
+
// For each slot N (maxGenerations..2), find whatever occupies slot (N-1)
|
|
226
|
+
// (as .gz or legacy uncompressed) and move it to slot N. Slot N occupants
|
|
227
|
+
// get overwritten (oldest is dropped). Non-existent slots are skipped.
|
|
228
|
+
for (let n = maxGenerations; n >= 2; n--) {
|
|
229
|
+
const destGz = generationGzPath(base, ext, n);
|
|
230
|
+
const srcGz = generationGzPath(base, ext, n - 1);
|
|
231
|
+
const srcPlain = generationPlainPath(base, ext, n - 1);
|
|
232
|
+
// Drop whatever currently occupies the destination slot (oldest generation).
|
|
233
|
+
if ((0, fs_1.existsSync)(destGz)) {
|
|
234
|
+
(0, fs_1.unlinkSync)(destGz);
|
|
235
|
+
}
|
|
236
|
+
const destPlain = generationPlainPath(base, ext, n);
|
|
237
|
+
if ((0, fs_1.existsSync)(destPlain)) {
|
|
238
|
+
(0, fs_1.unlinkSync)(destPlain);
|
|
239
|
+
}
|
|
240
|
+
// Prefer moving .gz → .gz (cheap rename).
|
|
241
|
+
if ((0, fs_1.existsSync)(srcGz)) {
|
|
242
|
+
(0, fs_1.renameSync)(srcGz, destGz);
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
// Legacy migration: if a plain .ndjson generation file exists from the
|
|
246
|
+
// old scheme, read it, gzip it into the destination slot, and delete
|
|
247
|
+
// the plain source.
|
|
248
|
+
if ((0, fs_1.existsSync)(srcPlain)) {
|
|
249
|
+
if (compress) {
|
|
250
|
+
const buf = (0, fs_1.readFileSync)(srcPlain);
|
|
251
|
+
const compressed = zlib.gzipSync(buf);
|
|
252
|
+
(0, fs_1.writeFileSync)(destGz, compressed);
|
|
253
|
+
(0, fs_1.unlinkSync)(srcPlain);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// compress=false: just rename
|
|
257
|
+
(0, fs_1.renameSync)(srcPlain, destPlain);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Step 2: rename the active file to the generation-1 plain path. The
|
|
262
|
+
// active writer keeps its open fd; the file path now points elsewhere.
|
|
263
|
+
const plain1 = generationPlainPath(base, ext, 1);
|
|
264
|
+
// If a stale .1 plain path exists (e.g. a previous compress=false run),
|
|
265
|
+
// remove it so the rename can claim the slot cleanly.
|
|
266
|
+
if ((0, fs_1.existsSync)(plain1)) {
|
|
267
|
+
(0, fs_1.unlinkSync)(plain1);
|
|
268
|
+
}
|
|
269
|
+
fsyncFileAndDirectory(filePath);
|
|
270
|
+
(0, fs_1.renameSync)(filePath, plain1);
|
|
271
|
+
// Step 3: gzip (or keep plain) the renamed file into the .1 generation.
|
|
272
|
+
if (compress) {
|
|
273
|
+
const gz1 = generationGzPath(base, ext, 1);
|
|
274
|
+
// Remove any lingering .1.ndjson.gz to avoid "file exists" on write.
|
|
275
|
+
if ((0, fs_1.existsSync)(gz1)) {
|
|
276
|
+
(0, fs_1.unlinkSync)(gz1);
|
|
277
|
+
}
|
|
278
|
+
const buf = (0, fs_1.readFileSync)(plain1);
|
|
279
|
+
const compressed = zlib.gzipSync(buf);
|
|
280
|
+
(0, fs_1.writeFileSync)(gz1, compressed);
|
|
281
|
+
fsyncFileAndDirectory(gz1);
|
|
282
|
+
(0, fs_1.unlinkSync)(plain1);
|
|
283
|
+
}
|
|
284
|
+
fsyncFileAndDirectory(compress ? generationGzPath(base, ext, 1) : plain1);
|
|
285
|
+
completed = true;
|
|
286
|
+
(0, runtime_1.emitNervesEvent)({
|
|
287
|
+
component: "nerves",
|
|
288
|
+
event: "nerves.rotation_end",
|
|
289
|
+
trace_id: traceId,
|
|
290
|
+
message: "log rotation complete",
|
|
291
|
+
meta: { path: filePath, compressedPath: compress ? generationGzPath(base, ext, 1) : plain1, bytesFreed: size },
|
|
292
|
+
});
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
/* v8 ignore next -- defensive: completed=true only reached after the try block's return @preserve */
|
|
297
|
+
if (!completed) {
|
|
298
|
+
/* v8 ignore next -- defensive: fs ops throw real Errors @preserve */
|
|
299
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
300
|
+
(0, runtime_1.emitNervesEvent)({
|
|
301
|
+
component: "nerves",
|
|
302
|
+
event: "nerves.rotation_error",
|
|
303
|
+
trace_id: traceId,
|
|
304
|
+
level: "error",
|
|
305
|
+
message: "log rotation failed",
|
|
306
|
+
meta: { path: filePath, error: reason },
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
throw err;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function createNdjsonFileSink(filePath, optionsOrMaxSize) {
|
|
103
313
|
(0, fs_1.mkdirSync)((0, path_1.dirname)(filePath), { recursive: true });
|
|
314
|
+
const options = typeof optionsOrMaxSize === "number"
|
|
315
|
+
? { maxSizeBytes: optionsOrMaxSize }
|
|
316
|
+
: optionsOrMaxSize ?? {};
|
|
317
|
+
const rotationCheckInterval = options.rotationCheckIntervalBytes ?? DEFAULT_ROTATION_CHECK_INTERVAL_BYTES;
|
|
318
|
+
const verbose = process.env.OURO_LOG_VERBOSE === "1";
|
|
104
319
|
const queue = [];
|
|
105
320
|
let flushing = false;
|
|
321
|
+
let bytesSinceCheck = 0;
|
|
322
|
+
let enqueued = 0;
|
|
323
|
+
let completed = 0;
|
|
324
|
+
let appendFailure = null;
|
|
325
|
+
const barriers = [];
|
|
326
|
+
function settleBarriers() {
|
|
327
|
+
const ready = barriers.filter((barrier) => barrier.target <= completed);
|
|
328
|
+
if (ready.length === 0)
|
|
329
|
+
return;
|
|
330
|
+
for (const barrier of ready)
|
|
331
|
+
barriers.splice(barriers.indexOf(barrier), 1);
|
|
332
|
+
if (appendFailure) {
|
|
333
|
+
for (const barrier of ready)
|
|
334
|
+
barrier.reject(appendFailure);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
fsyncFileAndDirectory(filePath);
|
|
339
|
+
for (const barrier of ready)
|
|
340
|
+
barrier.resolve();
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
344
|
+
appendFailure = failure;
|
|
345
|
+
for (const barrier of ready)
|
|
346
|
+
barrier.reject(failure);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
106
349
|
function flush() {
|
|
107
350
|
if (flushing || queue.length === 0)
|
|
108
351
|
return;
|
|
109
352
|
flushing = true;
|
|
110
353
|
const line = queue.shift();
|
|
111
|
-
|
|
354
|
+
const checkBeforeAppend = bytesSinceCheck >= rotationCheckInterval;
|
|
355
|
+
const checkAfterAppend = checkBeforeAppend || line.length >= rotationCheckInterval;
|
|
356
|
+
if (checkBeforeAppend) {
|
|
357
|
+
bytesSinceCheck = 0;
|
|
358
|
+
try {
|
|
359
|
+
rotateIfNeeded(filePath, options);
|
|
360
|
+
}
|
|
361
|
+
catch (rotationError) {
|
|
362
|
+
appendFailure ??= rotationError instanceof Error ? rotationError : new Error(String(rotationError));
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
(0, fs_1.appendFile)(filePath, line, "utf8", (error) => {
|
|
366
|
+
completed += 1;
|
|
367
|
+
if (error)
|
|
368
|
+
appendFailure ??= error;
|
|
369
|
+
if (checkAfterAppend) {
|
|
370
|
+
try {
|
|
371
|
+
fsyncFileAndDirectory(filePath);
|
|
372
|
+
rotateIfNeeded(filePath, options);
|
|
373
|
+
}
|
|
374
|
+
catch (rotationError) {
|
|
375
|
+
appendFailure ??= rotationError instanceof Error ? rotationError : new Error(String(rotationError));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
settleBarriers();
|
|
112
379
|
flushing = false;
|
|
113
380
|
flush();
|
|
114
381
|
});
|
|
115
382
|
}
|
|
116
|
-
|
|
117
|
-
|
|
383
|
+
const sink = ((entry) => {
|
|
384
|
+
const line = verbose
|
|
385
|
+
? `${JSON.stringify(entry)}\n`
|
|
386
|
+
: `${(0, redact_1.redactString)(JSON.stringify((0, redact_1.redactLogEntry)(entry)))}\n`;
|
|
387
|
+
bytesSinceCheck += line.length;
|
|
388
|
+
enqueued += 1;
|
|
389
|
+
queue.push(line);
|
|
118
390
|
flush();
|
|
119
|
-
};
|
|
391
|
+
});
|
|
392
|
+
sink.barrier = () => new Promise((resolve, reject) => {
|
|
393
|
+
barriers.push({ target: enqueued, resolve, reject });
|
|
394
|
+
settleBarriers();
|
|
395
|
+
});
|
|
396
|
+
return sink;
|
|
120
397
|
}
|
|
121
398
|
function registerGlobalLogSink(sink) {
|
|
122
399
|
globalSinks.add(sink);
|
|
@@ -138,9 +415,10 @@ function createLogger(options = {}) {
|
|
|
138
415
|
const configuredLevel = options.level ?? "info";
|
|
139
416
|
const sinks = options.sinks ?? [createStderrSink()];
|
|
140
417
|
const sink = createFanoutSink(sinks);
|
|
418
|
+
const durableSinks = sinks.filter((candidate) => "barrier" in candidate && typeof candidate.barrier === "function");
|
|
141
419
|
const now = options.now ?? (() => new Date());
|
|
142
|
-
function emit(level, entry) {
|
|
143
|
-
if (!shouldEmit(configuredLevel, level)) {
|
|
420
|
+
function emit(level, entry, force = false) {
|
|
421
|
+
if (!force && !shouldEmit(configuredLevel, level)) {
|
|
144
422
|
return;
|
|
145
423
|
}
|
|
146
424
|
const payload = {
|
|
@@ -160,5 +438,11 @@ function createLogger(options = {}) {
|
|
|
160
438
|
info: (entry) => emit("info", entry),
|
|
161
439
|
warn: (entry) => emit("warn", entry),
|
|
162
440
|
error: (entry) => emit("error", entry),
|
|
441
|
+
durabilityBarrier: async () => {
|
|
442
|
+
if (durableSinks.length === 0)
|
|
443
|
+
throw new Error("No durable Nerves sink is configured");
|
|
444
|
+
await Promise.all(durableSinks.map((durableSink) => durableSink.barrier()));
|
|
445
|
+
},
|
|
446
|
+
emitDurable: (level, entry) => emit(level, entry, true),
|
|
163
447
|
};
|
|
164
448
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Nerves observation layer — shared typed readers for runtime state.
|
|
4
|
+
*
|
|
5
|
+
* This module re-exports domain types that multiple consumers need
|
|
6
|
+
* (Mailbox, CLI, agent tools) so they don't maintain parallel type universes.
|
|
7
|
+
*
|
|
8
|
+
* The Mailbox UI consumes these through the HTTP API, but the same
|
|
9
|
+
* observation functions back CLI commands and future native clients.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/* v8 ignore start — module-level observability event */
|
|
13
|
+
const runtime_1 = require("./runtime");
|
|
14
|
+
(0, runtime_1.emitNervesEvent)({
|
|
15
|
+
component: "nerves",
|
|
16
|
+
event: "nerves.observation_loaded",
|
|
17
|
+
message: "observation layer loaded",
|
|
18
|
+
meta: {},
|
|
19
|
+
});
|
|
20
|
+
/* v8 ignore stop */
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SENSITIVE_PATTERNS = exports.SENSITIVE_KEYS = void 0;
|
|
4
|
+
exports.redactMeta = redactMeta;
|
|
5
|
+
exports.redactString = redactString;
|
|
6
|
+
exports.redactLogEntry = redactLogEntry;
|
|
7
|
+
/**
|
|
8
|
+
* Lowercase key names that trigger structured redaction.
|
|
9
|
+
* Matched case-insensitively against meta object keys.
|
|
10
|
+
*/
|
|
11
|
+
exports.SENSITIVE_KEYS = new Set([
|
|
12
|
+
"password",
|
|
13
|
+
"secret",
|
|
14
|
+
"token",
|
|
15
|
+
"accesstoken",
|
|
16
|
+
"refreshtoken",
|
|
17
|
+
"clientsecret",
|
|
18
|
+
"apikey",
|
|
19
|
+
"oauthaccesstoken",
|
|
20
|
+
"authorization",
|
|
21
|
+
"cookie",
|
|
22
|
+
"set-cookie",
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* Regex patterns for string-level fallback redaction.
|
|
26
|
+
* Applied in order; each match is replaced with `[REDACTED:name]`.
|
|
27
|
+
*/
|
|
28
|
+
exports.SENSITIVE_PATTERNS = [
|
|
29
|
+
{ name: "anthropic_key", pattern: /sk-ant-[A-Za-z0-9_-]+/g },
|
|
30
|
+
{ name: "openai_key", pattern: /sk-proj-[A-Za-z0-9_-]+/g },
|
|
31
|
+
{ name: "bearer_token", pattern: /Bearer [A-Za-z0-9\-_.]+/g },
|
|
32
|
+
{ name: "api_key_assignment", pattern: /api[_-]?key[=:]\s*["']?[A-Za-z0-9\-_.]+/g },
|
|
33
|
+
{ name: "url_token", pattern: /[?&](?:token|key|api_key|access_token)=[A-Za-z0-9\-_.%]+/g },
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Deep-clone meta and replace values at sensitive keys with `[REDACTED:key_name]`.
|
|
37
|
+
* Recurses into nested objects. Case-insensitive key matching.
|
|
38
|
+
*/
|
|
39
|
+
function redactMeta(meta) {
|
|
40
|
+
const result = {};
|
|
41
|
+
for (const key of Object.keys(meta)) {
|
|
42
|
+
const value = meta[key];
|
|
43
|
+
if (exports.SENSITIVE_KEYS.has(key.toLowerCase())) {
|
|
44
|
+
result[key] = `[REDACTED:${key}]`;
|
|
45
|
+
}
|
|
46
|
+
else if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
47
|
+
result[key] = redactMeta(value);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
result[key] = value;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Apply all regex patterns to a string, replacing matches with `[REDACTED:pattern_name]`.
|
|
57
|
+
*/
|
|
58
|
+
function redactString(text) {
|
|
59
|
+
let result = text;
|
|
60
|
+
for (const { name, pattern } of exports.SENSITIVE_PATTERNS) {
|
|
61
|
+
// Reset lastIndex for global regexes reused across calls
|
|
62
|
+
pattern.lastIndex = 0;
|
|
63
|
+
result = result.replace(pattern, `[REDACTED:${name}]`);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Full redaction pipeline: redact meta (structured keys), then redact message (regex patterns).
|
|
69
|
+
* Returns a new LogEvent -- never mutates the input.
|
|
70
|
+
*/
|
|
71
|
+
function redactLogEntry(entry) {
|
|
72
|
+
const redactedMeta = redactMeta(entry.meta);
|
|
73
|
+
const redactedMessage = redactString(entry.message);
|
|
74
|
+
return {
|
|
75
|
+
...entry,
|
|
76
|
+
meta: redactedMeta,
|
|
77
|
+
message: redactedMessage,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
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.runNervesReviewCli = runNervesReviewCli;
|
|
37
|
+
const path = __importStar(require("node:path"));
|
|
38
|
+
const identity_1 = require("../../heart/identity");
|
|
39
|
+
const core_1 = require("./core");
|
|
40
|
+
function parseArgs(argv) {
|
|
41
|
+
const args = { process: core_1.DEFAULT_NERVES_PROCESS, json: false, help: false };
|
|
42
|
+
for (let i = 0; i < argv.length; i++) {
|
|
43
|
+
const token = argv[i];
|
|
44
|
+
const next = argv[i + 1];
|
|
45
|
+
switch (token) {
|
|
46
|
+
case "--help":
|
|
47
|
+
case "-h":
|
|
48
|
+
args.help = true;
|
|
49
|
+
break;
|
|
50
|
+
case "--process":
|
|
51
|
+
if (next)
|
|
52
|
+
args.process = next;
|
|
53
|
+
i++;
|
|
54
|
+
break;
|
|
55
|
+
case "--agent":
|
|
56
|
+
if (next)
|
|
57
|
+
args.agent = next;
|
|
58
|
+
i++;
|
|
59
|
+
break;
|
|
60
|
+
case "--component":
|
|
61
|
+
if (next)
|
|
62
|
+
args.componentSubstring = next;
|
|
63
|
+
i++;
|
|
64
|
+
break;
|
|
65
|
+
case "--event":
|
|
66
|
+
if (next)
|
|
67
|
+
args.eventSubstring = next;
|
|
68
|
+
i++;
|
|
69
|
+
break;
|
|
70
|
+
case "--level":
|
|
71
|
+
if (next)
|
|
72
|
+
args.level = next;
|
|
73
|
+
i++;
|
|
74
|
+
break;
|
|
75
|
+
case "--since":
|
|
76
|
+
if (next)
|
|
77
|
+
args.since = next;
|
|
78
|
+
i++;
|
|
79
|
+
break;
|
|
80
|
+
case "--limit":
|
|
81
|
+
if (next) {
|
|
82
|
+
const parsed = Number.parseInt(next, 10);
|
|
83
|
+
if (Number.isFinite(parsed) && parsed > 0)
|
|
84
|
+
args.limit = parsed;
|
|
85
|
+
}
|
|
86
|
+
i++;
|
|
87
|
+
break;
|
|
88
|
+
case "--json":
|
|
89
|
+
args.json = true;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return args;
|
|
94
|
+
}
|
|
95
|
+
function printHelp() {
|
|
96
|
+
// eslint-disable-next-line no-console -- meta-tooling
|
|
97
|
+
console.log([
|
|
98
|
+
"usage: ouro nerves-review [options]",
|
|
99
|
+
"",
|
|
100
|
+
"Tail the agent's nerves ndjson and filter recent events. Read-only.",
|
|
101
|
+
"",
|
|
102
|
+
"options:",
|
|
103
|
+
` --process <name> log stream to read (default: ${core_1.DEFAULT_NERVES_PROCESS})`,
|
|
104
|
+
" --agent <name> agent bundle to read from (default: current)",
|
|
105
|
+
" --component <substr> filter by component substring (case-insensitive)",
|
|
106
|
+
" --event <substr> filter by event-name substring (case-insensitive)",
|
|
107
|
+
" --level <level> filter by exact level (debug|info|warn|error)",
|
|
108
|
+
" --since <duration> only events newer than e.g. 5m, 2h, 1d",
|
|
109
|
+
" --limit <N> cap returned events (default: 50)",
|
|
110
|
+
" --json output one JSON object per line",
|
|
111
|
+
].join("\n"));
|
|
112
|
+
}
|
|
113
|
+
function runNervesReviewCli(argv) {
|
|
114
|
+
const args = parseArgs(argv);
|
|
115
|
+
if (args.help) {
|
|
116
|
+
printHelp();
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
let sinceMs;
|
|
120
|
+
if (args.since) {
|
|
121
|
+
const parsed = (0, core_1.parseDuration)(args.since);
|
|
122
|
+
if (parsed === null) {
|
|
123
|
+
// eslint-disable-next-line no-console -- meta-tooling
|
|
124
|
+
console.error(`nerves-review: --since '${args.since}' is not a valid duration (e.g. 5m, 2h, 1d)`);
|
|
125
|
+
return 2;
|
|
126
|
+
}
|
|
127
|
+
sinceMs = parsed;
|
|
128
|
+
}
|
|
129
|
+
const logsDir = (0, identity_1.getAgentDaemonLogsDir)(args.agent);
|
|
130
|
+
const filePath = path.join(logsDir, `${args.process}.ndjson`);
|
|
131
|
+
const filter = {
|
|
132
|
+
componentSubstring: args.componentSubstring,
|
|
133
|
+
eventSubstring: args.eventSubstring,
|
|
134
|
+
level: args.level,
|
|
135
|
+
sinceMs,
|
|
136
|
+
limit: args.limit,
|
|
137
|
+
nowMs: Date.now(),
|
|
138
|
+
};
|
|
139
|
+
const entries = (0, core_1.reviewNerveEvents)(filePath, filter);
|
|
140
|
+
if (entries.length === 0) {
|
|
141
|
+
// eslint-disable-next-line no-console -- meta-tooling
|
|
142
|
+
console.log(`(no matching nerves events in ${filePath})`);
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
if (args.json) {
|
|
147
|
+
// eslint-disable-next-line no-console -- meta-tooling
|
|
148
|
+
console.log(entry.raw);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// eslint-disable-next-line no-console -- meta-tooling
|
|
152
|
+
console.log((0, core_1.formatNerveEntry)(entry));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return 0;
|
|
156
|
+
}
|