@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550
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 +133 -19
- 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-bootstrap-drift.md +54 -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 +3555 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +58 -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/adapter.js +2 -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/background-operations.js +281 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +304 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +925 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +512 -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 +554 -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 +665 -0
- package/dist/heart/daemon/cli-exec.js +7565 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1590 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +775 -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 -1672
- package/dist/heart/daemon/daemon-entry.js +417 -2
- package/dist/heart/daemon/daemon-health.js +183 -0
- package/dist/heart/daemon/daemon-rollup.js +58 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +758 -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 +844 -0
- package/dist/heart/daemon/drift-detection.js +146 -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 +102 -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 +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/message-router.js +2 -2
- 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/process-manager.js +375 -33
- 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 +67 -16
- package/dist/heart/daemon/runtime-metadata.js +3 -31
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +353 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- 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 +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +162 -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 -1
- 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 +52 -117
- 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 +35 -12
- package/dist/heart/identity.js +200 -51
- 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 +195 -0
- package/dist/heart/mailbox/readers/agent-machine.js +382 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +362 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +651 -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 +683 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +255 -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-state.js +216 -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 +97 -13
- 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 +11 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1149 -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 +243 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- 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 +139 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +381 -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-BPr5vNuM.css +1 -0
- package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -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 +674 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +720 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +430 -0
- package/dist/mailroom/mbox-import.js +383 -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 +256 -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 +7 -1
- package/dist/mind/context.js +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +62 -75
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +30 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +4 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +995 -123
- 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/coverage/run-artifacts.js +1 -1
- 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 +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +816 -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 +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +111 -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 +396 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +362 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +15 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +47 -1075
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +142 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1857 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-session.js +750 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +108 -100
- 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 +561 -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/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 +2305 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- 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/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 +187 -0
- package/dist/senses/cli.js +520 -209
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +175 -21
- package/dist/senses/inner-dialog.js +330 -27
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +569 -182
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +248 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +38 -7
- 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 +101 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/subagent-installer.js +0 -166
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- 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 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /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/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,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PORKBUN_OPS_COMPATIBILITY_ALIAS = exports.PORKBUN_OPS_CREDENTIAL_PREFIX = void 0;
|
|
4
|
+
exports.isVaultItemTemplate = isVaultItemTemplate;
|
|
5
|
+
exports.normalizeVaultItemName = normalizeVaultItemName;
|
|
6
|
+
exports.normalizeVaultItemFieldName = normalizeVaultItemFieldName;
|
|
7
|
+
exports.vaultItemTemplateSecretFields = vaultItemTemplateSecretFields;
|
|
8
|
+
exports.normalizePorkbunOpsAccount = normalizePorkbunOpsAccount;
|
|
9
|
+
exports.porkbunOpsCredentialItemName = porkbunOpsCredentialItemName;
|
|
10
|
+
exports.porkbunOpsAccountFromItemName = porkbunOpsAccountFromItemName;
|
|
11
|
+
exports.requireVaultItemSecret = requireVaultItemSecret;
|
|
12
|
+
exports.PORKBUN_OPS_CREDENTIAL_PREFIX = "ops/registrars/porkbun/accounts";
|
|
13
|
+
exports.PORKBUN_OPS_COMPATIBILITY_ALIAS = "vault ops porkbun";
|
|
14
|
+
const VAULT_ITEM_NAME_FORBIDDEN = /[\r\n\t]/;
|
|
15
|
+
const VAULT_ITEM_FIELD_FORBIDDEN = /[\r\n\t=]/;
|
|
16
|
+
const PORKBUN_OPS_ACCOUNT_FORBIDDEN = /[\/\r\n\t]/;
|
|
17
|
+
function isVaultItemTemplate(value) {
|
|
18
|
+
return value === "porkbun-api";
|
|
19
|
+
}
|
|
20
|
+
function normalizeVaultItemName(item) {
|
|
21
|
+
const normalized = item?.trim() ?? "";
|
|
22
|
+
if (!normalized || VAULT_ITEM_NAME_FORBIDDEN.test(normalized) || normalized.startsWith("/") || normalized.endsWith("/")) {
|
|
23
|
+
throw new Error("Vault item name/path must be non-empty, relative, and free of control characters.");
|
|
24
|
+
}
|
|
25
|
+
return normalized;
|
|
26
|
+
}
|
|
27
|
+
function normalizeVaultItemFieldName(field) {
|
|
28
|
+
const normalized = field?.trim() ?? "";
|
|
29
|
+
if (!normalized || VAULT_ITEM_FIELD_FORBIDDEN.test(normalized)) {
|
|
30
|
+
throw new Error("Vault item field names must be non-empty and free of control characters or '='.");
|
|
31
|
+
}
|
|
32
|
+
return normalized;
|
|
33
|
+
}
|
|
34
|
+
function vaultItemTemplateSecretFields(_template) {
|
|
35
|
+
return ["apiKey", "secretApiKey"];
|
|
36
|
+
}
|
|
37
|
+
function normalizePorkbunOpsAccount(account) {
|
|
38
|
+
const normalized = account?.trim() ?? "";
|
|
39
|
+
if (!normalized || PORKBUN_OPS_ACCOUNT_FORBIDDEN.test(normalized)) {
|
|
40
|
+
throw new Error("Porkbun account must be a non-empty account label without slashes or control characters.");
|
|
41
|
+
}
|
|
42
|
+
return normalized;
|
|
43
|
+
}
|
|
44
|
+
function porkbunOpsCredentialItemName(account) {
|
|
45
|
+
return `${exports.PORKBUN_OPS_CREDENTIAL_PREFIX}/${normalizePorkbunOpsAccount(account)}`;
|
|
46
|
+
}
|
|
47
|
+
function porkbunOpsAccountFromItemName(itemName) {
|
|
48
|
+
const prefix = `${exports.PORKBUN_OPS_CREDENTIAL_PREFIX}/`;
|
|
49
|
+
return itemName.startsWith(prefix) ? itemName.slice(prefix.length) : undefined;
|
|
50
|
+
}
|
|
51
|
+
function requireVaultItemSecret(value, label) {
|
|
52
|
+
const trimmed = value.trim();
|
|
53
|
+
if (!trimmed)
|
|
54
|
+
throw new Error(`${label} cannot be blank`);
|
|
55
|
+
return trimmed;
|
|
56
|
+
}
|
package/dist/heart/delegation.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.decideDelegation = decideDelegation;
|
|
4
4
|
const runtime_1 = require("../nerves/runtime");
|
|
5
5
|
const CROSS_SESSION_TOOLS = new Set(["query_session", "send_message", "bridge_manage"]);
|
|
6
|
-
const FAST_PATH_TOOLS = new Set(["
|
|
6
|
+
const FAST_PATH_TOOLS = new Set(["settle"]);
|
|
7
7
|
const REFLECTION_PATTERN = /\b(think|reflect|ponder|surface|surfaces|surfaced|sit with|metaboli[sz]e)\b/i;
|
|
8
8
|
const CROSS_SESSION_PATTERN = /\b(other chat|other session|across chats?|across sessions?|keep .* aligned|relay|carry .* across)\b/i;
|
|
9
9
|
function hasExplicitReflection(ingressTexts) {
|
|
@@ -0,0 +1,189 @@
|
|
|
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.migrateHabitsFromTaskSystem = migrateHabitsFromTaskSystem;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
40
|
+
const habit_parser_1 = require("./habit-parser");
|
|
41
|
+
const habit_runtime_state_1 = require("./habit-runtime-state");
|
|
42
|
+
const parser_1 = require("../../repertoire/tasks/parser");
|
|
43
|
+
/** Fields that belong to the task system and should be stripped from migrated habits. */
|
|
44
|
+
const TASK_ONLY_FIELDS = new Set([
|
|
45
|
+
"type",
|
|
46
|
+
"category",
|
|
47
|
+
"requester",
|
|
48
|
+
"validator",
|
|
49
|
+
"scheduledAt",
|
|
50
|
+
"updated",
|
|
51
|
+
"depends_on",
|
|
52
|
+
"parent_task",
|
|
53
|
+
"artifacts",
|
|
54
|
+
]);
|
|
55
|
+
/** Regex matching the YYYY-MM-DD-HHMM- timestamp prefix in task filenames. */
|
|
56
|
+
const TIMESTAMP_PREFIX = /^\d{4}-\d{2}-\d{2}-\d{4}-/;
|
|
57
|
+
/** Map old task statuses to habit statuses. */
|
|
58
|
+
function mapStatus(taskStatus) {
|
|
59
|
+
if (taskStatus === "processing")
|
|
60
|
+
return "active";
|
|
61
|
+
if (taskStatus === "paused")
|
|
62
|
+
return "paused";
|
|
63
|
+
if (taskStatus === "done")
|
|
64
|
+
return null; // skip done habits
|
|
65
|
+
return "active"; // default to active for unknown statuses
|
|
66
|
+
}
|
|
67
|
+
/** Strip timestamp prefix from filename to get the slug name. */
|
|
68
|
+
function stripTimestampPrefix(filename) {
|
|
69
|
+
return filename.replace(TIMESTAMP_PREFIX, "");
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Migrate habit files from the old `tasks/habits/` location to the new `habits/` bundle root.
|
|
73
|
+
* - Strips timestamp prefix from filenames
|
|
74
|
+
* - Maps task statuses to habit statuses
|
|
75
|
+
* - Strips task-only frontmatter fields
|
|
76
|
+
* - Preserves body text
|
|
77
|
+
* - Skips done habits, README files, and already-migrated habits
|
|
78
|
+
* - No-op if `tasks/habits/` does not exist
|
|
79
|
+
*/
|
|
80
|
+
function migrateHabitsFromTaskSystem(bundleRoot) {
|
|
81
|
+
const oldHabitsDir = path.join(bundleRoot, "tasks", "habits");
|
|
82
|
+
if (!fs.existsSync(oldHabitsDir)) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
let files;
|
|
86
|
+
try {
|
|
87
|
+
files = fs.readdirSync(oldHabitsDir);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* v8 ignore next -- race condition: dir removed between existsSync and readdirSync @preserve */
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const mdFiles = files.filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
94
|
+
if (mdFiles.length === 0)
|
|
95
|
+
return;
|
|
96
|
+
const newHabitsDir = path.join(bundleRoot, "habits");
|
|
97
|
+
fs.mkdirSync(newHabitsDir, { recursive: true });
|
|
98
|
+
let migratedCount = 0;
|
|
99
|
+
for (const file of mdFiles) {
|
|
100
|
+
const slugName = stripTimestampPrefix(file);
|
|
101
|
+
const targetPath = path.join(newHabitsDir, slugName);
|
|
102
|
+
// Skip if already migrated
|
|
103
|
+
if (fs.existsSync(targetPath)) {
|
|
104
|
+
(0, runtime_1.emitNervesEvent)({
|
|
105
|
+
component: "daemon",
|
|
106
|
+
event: "daemon.habit_migration_skip",
|
|
107
|
+
message: "habit already exists at target, skipping",
|
|
108
|
+
meta: { file, targetPath },
|
|
109
|
+
});
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const sourcePath = path.join(oldHabitsDir, file);
|
|
113
|
+
let content;
|
|
114
|
+
try {
|
|
115
|
+
content = fs.readFileSync(sourcePath, "utf-8");
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
// Parse frontmatter and body
|
|
121
|
+
const lines = content.split(/\r?\n/);
|
|
122
|
+
if (lines[0]?.trim() !== "---")
|
|
123
|
+
continue;
|
|
124
|
+
const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
|
|
125
|
+
if (closing === -1)
|
|
126
|
+
continue;
|
|
127
|
+
const rawFrontmatter = lines.slice(1, closing).join("\n");
|
|
128
|
+
const body = lines.slice(closing + 1).join("\n").trim();
|
|
129
|
+
const frontmatter = (0, parser_1.parseFrontmatter)(rawFrontmatter);
|
|
130
|
+
// Check status — skip done habits
|
|
131
|
+
const rawStatus = typeof frontmatter.status === "string" ? frontmatter.status : "processing";
|
|
132
|
+
const habitStatus = mapStatus(rawStatus);
|
|
133
|
+
if (habitStatus === null) {
|
|
134
|
+
(0, runtime_1.emitNervesEvent)({
|
|
135
|
+
component: "daemon",
|
|
136
|
+
event: "daemon.habit_migration_skip",
|
|
137
|
+
message: "skipping done habit",
|
|
138
|
+
meta: { file, status: rawStatus },
|
|
139
|
+
});
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const legacyLastRun = typeof frontmatter.lastRun === "string" && frontmatter.lastRun !== "null"
|
|
143
|
+
? frontmatter.lastRun
|
|
144
|
+
: typeof frontmatter.last_run === "string" && frontmatter.last_run !== "null"
|
|
145
|
+
? frontmatter.last_run
|
|
146
|
+
: null;
|
|
147
|
+
// Build new frontmatter, stripping task-only fields
|
|
148
|
+
const newFrontmatter = {};
|
|
149
|
+
if (typeof frontmatter.title === "string")
|
|
150
|
+
newFrontmatter.title = frontmatter.title;
|
|
151
|
+
if (typeof frontmatter.cadence === "string")
|
|
152
|
+
newFrontmatter.cadence = frontmatter.cadence;
|
|
153
|
+
newFrontmatter.status = habitStatus;
|
|
154
|
+
newFrontmatter.created = typeof frontmatter.created === "string" ? frontmatter.created : "null";
|
|
155
|
+
// Add any other non-task fields from original
|
|
156
|
+
for (const [key, value] of Object.entries(frontmatter)) {
|
|
157
|
+
if (TASK_ONLY_FIELDS.has(key))
|
|
158
|
+
continue;
|
|
159
|
+
if (key === "lastRun" || key === "last_run")
|
|
160
|
+
continue;
|
|
161
|
+
if (key in newFrontmatter)
|
|
162
|
+
continue;
|
|
163
|
+
/* v8 ignore next -- dead code: status is caught by `key in newFrontmatter` above since newFrontmatter.status is always set @preserve */
|
|
164
|
+
if (key === "status")
|
|
165
|
+
continue; // already mapped
|
|
166
|
+
newFrontmatter[key] = value;
|
|
167
|
+
}
|
|
168
|
+
const rendered = (0, habit_parser_1.renderHabitFile)(newFrontmatter, body);
|
|
169
|
+
fs.writeFileSync(targetPath, rendered, "utf-8");
|
|
170
|
+
if (legacyLastRun) {
|
|
171
|
+
(0, habit_runtime_state_1.writeHabitLastRun)(bundleRoot, path.basename(slugName, ".md"), legacyLastRun);
|
|
172
|
+
}
|
|
173
|
+
migratedCount++;
|
|
174
|
+
(0, runtime_1.emitNervesEvent)({
|
|
175
|
+
component: "daemon",
|
|
176
|
+
event: "daemon.habit_migrated",
|
|
177
|
+
message: "migrated habit from task system",
|
|
178
|
+
meta: { from: sourcePath, to: targetPath },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (migratedCount > 0) {
|
|
182
|
+
(0, runtime_1.emitNervesEvent)({
|
|
183
|
+
component: "daemon",
|
|
184
|
+
event: "daemon.habit_migration_complete",
|
|
185
|
+
message: "habit migration complete",
|
|
186
|
+
meta: { bundleRoot, count: migratedCount },
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
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.parseHabitFile = parseHabitFile;
|
|
37
|
+
exports.renderHabitFile = renderHabitFile;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const parser_1 = require("../../repertoire/tasks/parser");
|
|
40
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
41
|
+
function isHabitStatus(value) {
|
|
42
|
+
return value === "active" || value === "paused";
|
|
43
|
+
}
|
|
44
|
+
function parseToolsField(raw) {
|
|
45
|
+
if (raw === undefined || raw === null)
|
|
46
|
+
return undefined;
|
|
47
|
+
// YAML dash-list: parseFrontmatter returns unknown[]
|
|
48
|
+
if (Array.isArray(raw)) {
|
|
49
|
+
return raw.filter((item) => typeof item === "string");
|
|
50
|
+
}
|
|
51
|
+
// Inline bracket format: parseFrontmatter returns string like "[a, b, c]"
|
|
52
|
+
if (typeof raw === "string" && raw.startsWith("[") && raw.endsWith("]")) {
|
|
53
|
+
const inner = raw.slice(1, -1);
|
|
54
|
+
if (inner.trim().length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
return inner.split(",").map((s) => s.trim()).filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
function extractFrontmatterAndBody(content) {
|
|
61
|
+
const lines = content.split(/\r?\n/);
|
|
62
|
+
if (lines[0]?.trim() !== "---") {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
|
|
66
|
+
if (closing === -1) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const rawFrontmatter = lines.slice(1, closing).join("\n");
|
|
70
|
+
const body = lines.slice(closing + 1).join("\n").trim();
|
|
71
|
+
return { frontmatter: (0, parser_1.parseFrontmatter)(rawFrontmatter), body };
|
|
72
|
+
}
|
|
73
|
+
function parseHabitFile(content, filePath) {
|
|
74
|
+
(0, runtime_1.emitNervesEvent)({
|
|
75
|
+
event: "daemon.habit_parse",
|
|
76
|
+
component: "daemon",
|
|
77
|
+
message: "parsing habit file",
|
|
78
|
+
meta: { filePath },
|
|
79
|
+
});
|
|
80
|
+
const stem = path.basename(filePath, ".md");
|
|
81
|
+
const parsed = extractFrontmatterAndBody(content);
|
|
82
|
+
if (!parsed) {
|
|
83
|
+
return {
|
|
84
|
+
name: stem,
|
|
85
|
+
title: stem,
|
|
86
|
+
cadence: null,
|
|
87
|
+
status: "active",
|
|
88
|
+
lastRun: null,
|
|
89
|
+
created: null,
|
|
90
|
+
tools: undefined,
|
|
91
|
+
body: content.trim(),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const { frontmatter, body } = parsed;
|
|
95
|
+
const rawTitle = frontmatter.title;
|
|
96
|
+
const title = typeof rawTitle === "string" && rawTitle.length > 0 ? rawTitle : stem;
|
|
97
|
+
const rawCadence = frontmatter.cadence;
|
|
98
|
+
const cadence = typeof rawCadence === "string" && rawCadence.length > 0 ? rawCadence : null;
|
|
99
|
+
const rawStatus = frontmatter.status;
|
|
100
|
+
const status = typeof rawStatus === "string" && isHabitStatus(rawStatus) ? rawStatus : "active";
|
|
101
|
+
const rawLastRun = frontmatter.lastRun ?? frontmatter.last_run;
|
|
102
|
+
const lastRun = typeof rawLastRun === "string" && rawLastRun.length > 0 ? rawLastRun : null;
|
|
103
|
+
const rawCreated = frontmatter.created;
|
|
104
|
+
const created = typeof rawCreated === "string" && rawCreated.length > 0 ? rawCreated : null;
|
|
105
|
+
const tools = parseToolsField(frontmatter.tools);
|
|
106
|
+
return {
|
|
107
|
+
name: stem,
|
|
108
|
+
title,
|
|
109
|
+
cadence,
|
|
110
|
+
status,
|
|
111
|
+
lastRun,
|
|
112
|
+
created,
|
|
113
|
+
tools,
|
|
114
|
+
body,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function formatFrontmatterValue(value) {
|
|
118
|
+
if (value === null || value === undefined)
|
|
119
|
+
return "null";
|
|
120
|
+
if (Array.isArray(value))
|
|
121
|
+
return `[${value.join(", ")}]`;
|
|
122
|
+
return String(value);
|
|
123
|
+
}
|
|
124
|
+
function renderHabitFile(frontmatter, body) {
|
|
125
|
+
(0, runtime_1.emitNervesEvent)({
|
|
126
|
+
event: "daemon.habit_render",
|
|
127
|
+
component: "daemon",
|
|
128
|
+
message: "rendering habit file",
|
|
129
|
+
meta: {},
|
|
130
|
+
});
|
|
131
|
+
const lines = ["---"];
|
|
132
|
+
for (const key of Object.keys(frontmatter)) {
|
|
133
|
+
lines.push(`${key}: ${formatFrontmatterValue(frontmatter[key])}`);
|
|
134
|
+
}
|
|
135
|
+
lines.push("---");
|
|
136
|
+
lines.push("");
|
|
137
|
+
lines.push(body.trim());
|
|
138
|
+
lines.push("");
|
|
139
|
+
return lines.join("\n");
|
|
140
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
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.readHabitLastRun = readHabitLastRun;
|
|
37
|
+
exports.applyHabitRuntimeState = applyHabitRuntimeState;
|
|
38
|
+
exports.writeHabitLastRun = writeHabitLastRun;
|
|
39
|
+
exports.recordHabitRun = recordHabitRun;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const json_store_1 = require("../../arc/json-store");
|
|
43
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
44
|
+
function habitRuntimeStateDir(agentRoot) {
|
|
45
|
+
return path.join(agentRoot, "state", "habits");
|
|
46
|
+
}
|
|
47
|
+
function isNonEmptyString(value) {
|
|
48
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
49
|
+
}
|
|
50
|
+
function stripLegacyLastRunFromDefinition(definitionPath) {
|
|
51
|
+
const content = fs.readFileSync(definitionPath, "utf-8");
|
|
52
|
+
const lines = content.split(/\r?\n/);
|
|
53
|
+
if (lines[0]?.trim() !== "---")
|
|
54
|
+
return;
|
|
55
|
+
const closing = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
|
|
56
|
+
if (closing === -1)
|
|
57
|
+
return;
|
|
58
|
+
const frontmatterLines = lines.slice(1, closing);
|
|
59
|
+
const filtered = frontmatterLines.filter((line) => !/^\s*lastRun\s*:/.test(line) && !/^\s*last_run\s*:/.test(line));
|
|
60
|
+
if (filtered.length === frontmatterLines.length)
|
|
61
|
+
return;
|
|
62
|
+
const nextContent = ["---", ...filtered, "---", ...lines.slice(closing + 1)].join("\n");
|
|
63
|
+
fs.writeFileSync(definitionPath, nextContent, "utf-8");
|
|
64
|
+
}
|
|
65
|
+
function readHabitLastRun(agentRoot, habitName) {
|
|
66
|
+
const record = (0, json_store_1.readJsonFile)(habitRuntimeStateDir(agentRoot), habitName);
|
|
67
|
+
return isNonEmptyString(record?.lastRun) ? record.lastRun : null;
|
|
68
|
+
}
|
|
69
|
+
function applyHabitRuntimeState(agentRoot, habit) {
|
|
70
|
+
const runtimeLastRun = readHabitLastRun(agentRoot, habit.name);
|
|
71
|
+
if (runtimeLastRun === null)
|
|
72
|
+
return habit;
|
|
73
|
+
return { ...habit, lastRun: runtimeLastRun };
|
|
74
|
+
}
|
|
75
|
+
function writeHabitLastRun(agentRoot, habitName, lastRun, updatedAt = lastRun) {
|
|
76
|
+
const record = {
|
|
77
|
+
schemaVersion: 1,
|
|
78
|
+
name: habitName,
|
|
79
|
+
lastRun,
|
|
80
|
+
updatedAt,
|
|
81
|
+
};
|
|
82
|
+
(0, json_store_1.writeJsonFile)(habitRuntimeStateDir(agentRoot), habitName, record);
|
|
83
|
+
(0, runtime_1.emitNervesEvent)({
|
|
84
|
+
component: "daemon",
|
|
85
|
+
event: "daemon.habit_runtime_state_write",
|
|
86
|
+
message: "wrote habit runtime state",
|
|
87
|
+
meta: { agentRoot, habitName, lastRun, updatedAt },
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function recordHabitRun(agentRoot, habitName, lastRun, options = {}) {
|
|
91
|
+
writeHabitLastRun(agentRoot, habitName, lastRun);
|
|
92
|
+
if (!options.definitionPath)
|
|
93
|
+
return;
|
|
94
|
+
try {
|
|
95
|
+
stripLegacyLastRunFromDefinition(options.definitionPath);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Missing/deleted habit files should never block runtime-state recording.
|
|
99
|
+
}
|
|
100
|
+
}
|