@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
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared classifier for legacy `tasks/` → `desk/` migration.
|
|
4
|
+
*
|
|
5
|
+
* Pure data + parsing. Takes a file path relative to `<bundle>/tasks/` plus
|
|
6
|
+
* its content, returns a classification bucket. Used by `migrate-to-desk.ts`
|
|
7
|
+
* to decide where each file lands in the new `desk/` shape.
|
|
8
|
+
*
|
|
9
|
+
* Bucket definitions:
|
|
10
|
+
* - **terminal** — explicit done/complete/approved/cancelled/fixed status (or
|
|
11
|
+
* synonyms). Always archived. Files under `tasks/archive/` are unconditionally
|
|
12
|
+
* terminal regardless of frontmatter.
|
|
13
|
+
* - **stale_live** — live-looking status (`in-progress`, `ready_for_execution`,
|
|
14
|
+
* `drafting`, `collaborating`, etc.) but the resolved `updated` date is
|
|
15
|
+
* older than the 30-day cutoff. → archive (when-in-doubt rule).
|
|
16
|
+
* - **ambiguous** — no status, junk format, unknown status, `.md.bak` backup,
|
|
17
|
+
* or empty file. → archive.
|
|
18
|
+
* - **live_clear** — live status AND updated within the last 30 days AND
|
|
19
|
+
* coherent. → migrate to `legacy` track on the new desk.
|
|
20
|
+
* - **special_europe_trip** — historical one-off `ongoing/2026-03-09-1410-summer-2026-europe-trip.md` from the initial bundle that authored this migrator; kept as a labelled special case until the bundle is deprecated.
|
|
21
|
+
*
|
|
22
|
+
* Effective `updated` resolution priority: YAML `updated` → `approved` →
|
|
23
|
+
* `created` → body `**Updated**:` → date prefix in filename → file mtime.
|
|
24
|
+
*
|
|
25
|
+
* This is a pure-data helper: no side effects, no nerves observability of
|
|
26
|
+
* its own. The migrator emits nerves events around classify() calls.
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.resolveUpdatedMs = resolveUpdatedMs;
|
|
30
|
+
exports.classifyFile = classifyFile;
|
|
31
|
+
exports.deriveTaskSlug = deriveTaskSlug;
|
|
32
|
+
exports.extractParentTaskDir = extractParentTaskDir;
|
|
33
|
+
const frontmatter_1 = require("../../util/frontmatter");
|
|
34
|
+
// ── Status vocabulary ──
|
|
35
|
+
const TERMINAL_STATUSES = new Set([
|
|
36
|
+
"done",
|
|
37
|
+
"complete",
|
|
38
|
+
"completed",
|
|
39
|
+
"approved",
|
|
40
|
+
"cancelled",
|
|
41
|
+
"canceled",
|
|
42
|
+
"fixed",
|
|
43
|
+
"merged",
|
|
44
|
+
"merged_and_published",
|
|
45
|
+
"abandoned",
|
|
46
|
+
"rejected",
|
|
47
|
+
"closed",
|
|
48
|
+
"shipped",
|
|
49
|
+
"resolved",
|
|
50
|
+
"archived",
|
|
51
|
+
"obsolete",
|
|
52
|
+
"deprecated",
|
|
53
|
+
"superseded",
|
|
54
|
+
"converted",
|
|
55
|
+
"discarded",
|
|
56
|
+
"won't-do",
|
|
57
|
+
"wontfix",
|
|
58
|
+
"won't-fix",
|
|
59
|
+
]);
|
|
60
|
+
const LIVE_STATUSES = new Set([
|
|
61
|
+
"drafting",
|
|
62
|
+
"in-progress",
|
|
63
|
+
"in_progress",
|
|
64
|
+
"inprogress",
|
|
65
|
+
"ready_for_execution",
|
|
66
|
+
"ready-for-execution",
|
|
67
|
+
"collaborating",
|
|
68
|
+
"processing",
|
|
69
|
+
"validating",
|
|
70
|
+
"blocked",
|
|
71
|
+
"paused",
|
|
72
|
+
"open",
|
|
73
|
+
"needs_review",
|
|
74
|
+
"needs-review",
|
|
75
|
+
"handoff_needs_work_planner",
|
|
76
|
+
"running",
|
|
77
|
+
"active",
|
|
78
|
+
"reopened",
|
|
79
|
+
"handed-off",
|
|
80
|
+
"local_verified",
|
|
81
|
+
"ongoing",
|
|
82
|
+
]);
|
|
83
|
+
// ── Helpers ──
|
|
84
|
+
function isMarkdownFile(relPath) {
|
|
85
|
+
return relPath.endsWith(".md");
|
|
86
|
+
}
|
|
87
|
+
function isBackupFile(relPath) {
|
|
88
|
+
return relPath.endsWith(".md.bak") || relPath.endsWith("~") || relPath.endsWith(".swp");
|
|
89
|
+
}
|
|
90
|
+
function isInArchiveSubdir(relPath) {
|
|
91
|
+
return relPath.startsWith("archive/") || relPath.includes("/archive/");
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Detect the historical europe-trip task. Per the lift plan:
|
|
95
|
+
* `ongoing/2026-03-09-1410-summer-2026-europe-trip.md` is the only
|
|
96
|
+
* special-cased file.
|
|
97
|
+
*/
|
|
98
|
+
function isEuropeTripTask(relPath) {
|
|
99
|
+
return relPath === "ongoing/2026-03-09-1410-summer-2026-europe-trip.md";
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Extract the frontmatter block (between `---` fences) from a markdown file.
|
|
103
|
+
* Returns the raw frontmatter text or undefined if no fenced block exists.
|
|
104
|
+
*/
|
|
105
|
+
function extractFrontmatterBlock(content) {
|
|
106
|
+
const trimmed = content.trimStart();
|
|
107
|
+
if (!trimmed.startsWith("---"))
|
|
108
|
+
return undefined;
|
|
109
|
+
const afterFirstFence = trimmed.slice(3);
|
|
110
|
+
const closeIdx = afterFirstFence.indexOf("\n---");
|
|
111
|
+
if (closeIdx === -1)
|
|
112
|
+
return undefined;
|
|
113
|
+
return afterFirstFence.slice(0, closeIdx).replace(/^\r?\n/, "");
|
|
114
|
+
}
|
|
115
|
+
function readStatusFromFrontmatter(fm) {
|
|
116
|
+
const candidates = ["status", "Status", "STATUS", "state", "State"];
|
|
117
|
+
for (const key of candidates) {
|
|
118
|
+
const value = fm[key];
|
|
119
|
+
if (typeof value === "string" && value.trim()) {
|
|
120
|
+
return value.trim().toLowerCase();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
function readDateFromFrontmatter(fm, key) {
|
|
126
|
+
const value = fm[key];
|
|
127
|
+
if (typeof value !== "string")
|
|
128
|
+
return undefined;
|
|
129
|
+
const parsed = parseDateString(value);
|
|
130
|
+
return parsed;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parse a date string into epoch ms. Accepts YYYY-MM-DD and full ISO 8601
|
|
134
|
+
* timestamps. Returns undefined for unparseable input.
|
|
135
|
+
*/
|
|
136
|
+
function parseDateString(raw) {
|
|
137
|
+
const trimmed = raw.trim();
|
|
138
|
+
/* v8 ignore start -- defensive: callers (readDateFromFrontmatter, extractUpdatedFromBody) only pass values that have already been confirmed non-empty (frontmatter scalar or regex-captured digits). The empty-string fallback is unreachable in practice. @preserve */
|
|
139
|
+
if (!trimmed)
|
|
140
|
+
return undefined;
|
|
141
|
+
/* v8 ignore stop */
|
|
142
|
+
// YYYY-MM-DD or YYYY-MM-DD HH:MM or full ISO
|
|
143
|
+
const dateOnlyMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(trimmed);
|
|
144
|
+
if (dateOnlyMatch) {
|
|
145
|
+
const ms = Date.UTC(Number(dateOnlyMatch[1]), Number(dateOnlyMatch[2]) - 1, Number(dateOnlyMatch[3]));
|
|
146
|
+
/* v8 ignore start -- Date.UTC normalizes out-of-range numeric inputs to finite ms; the regex already guarantees four+two+two-digit ints. The undefined branch is genuinely unreachable. @preserve */
|
|
147
|
+
return Number.isFinite(ms) ? ms : undefined;
|
|
148
|
+
/* v8 ignore stop */
|
|
149
|
+
}
|
|
150
|
+
const ms = Date.parse(trimmed);
|
|
151
|
+
/* v8 ignore start -- v8 coverage tooling intermittently fails to register the NaN→undefined branch even when tests demonstrably exercise it (see "garbage123" / "not-a-date-at-all-12345xyz67890" tests in migrate-to-desk.test.ts). The behavior is correct; the coverage signal is the noise. @preserve */
|
|
152
|
+
if (!Number.isFinite(ms))
|
|
153
|
+
return undefined;
|
|
154
|
+
/* v8 ignore stop */
|
|
155
|
+
return ms;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Extract date prefix from a filename like `2026-05-12-1122-doing-foo.md`.
|
|
159
|
+
* Returns epoch ms or undefined.
|
|
160
|
+
*/
|
|
161
|
+
function extractDatePrefixFromFilename(relPath) {
|
|
162
|
+
/* v8 ignore start -- defensive `?? relPath` fallback: String.split() always returns at least one element, so pop() never returns undefined on a non-empty input. The fallback exists only as a type guard for the strict no-implicit-any setting. @preserve */
|
|
163
|
+
const base = relPath.split("/").pop() ?? relPath;
|
|
164
|
+
/* v8 ignore stop */
|
|
165
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})(?:-(\d{2})(\d{2}))?/.exec(base);
|
|
166
|
+
if (!match)
|
|
167
|
+
return undefined;
|
|
168
|
+
const ms = Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]), match[4] ? Number(match[4]) : 0, match[5] ? Number(match[5]) : 0);
|
|
169
|
+
/* v8 ignore start -- Date.UTC normalizes out-of-range numeric inputs to finite ms; the regex already guarantees four+two+two-digit ints. The undefined branch is genuinely unreachable. @preserve */
|
|
170
|
+
return Number.isFinite(ms) ? ms : undefined;
|
|
171
|
+
/* v8 ignore stop */
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Extract `**Updated**: YYYY-MM-DD` from body prose (some legacy task formats
|
|
175
|
+
* use this convention instead of YAML frontmatter).
|
|
176
|
+
*/
|
|
177
|
+
function extractUpdatedFromBody(content) {
|
|
178
|
+
const match = /\*\*Updated\*\*:\s*([0-9]{4}-[0-9]{2}-[0-9]{2}[A-Za-z0-9:_\- .]*)/.exec(content);
|
|
179
|
+
if (!match)
|
|
180
|
+
return undefined;
|
|
181
|
+
return parseDateString(match[1]);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Resolve the effective `updated` timestamp using the priority chain.
|
|
185
|
+
* Priority: YAML `updated` → `approved` → `created` → body `**Updated**:` →
|
|
186
|
+
* date prefix in filename → file mtime.
|
|
187
|
+
*/
|
|
188
|
+
function resolveUpdatedMs(input) {
|
|
189
|
+
const fmBlock = extractFrontmatterBlock(input.content);
|
|
190
|
+
if (fmBlock) {
|
|
191
|
+
const fm = (0, frontmatter_1.parseFrontmatter)(fmBlock);
|
|
192
|
+
const updated = readDateFromFrontmatter(fm, "updated") ?? readDateFromFrontmatter(fm, "Updated");
|
|
193
|
+
if (updated !== undefined)
|
|
194
|
+
return updated;
|
|
195
|
+
const approved = readDateFromFrontmatter(fm, "approved") ?? readDateFromFrontmatter(fm, "Approved");
|
|
196
|
+
if (approved !== undefined)
|
|
197
|
+
return approved;
|
|
198
|
+
const created = readDateFromFrontmatter(fm, "created") ?? readDateFromFrontmatter(fm, "Created");
|
|
199
|
+
if (created !== undefined)
|
|
200
|
+
return created;
|
|
201
|
+
}
|
|
202
|
+
const bodyUpdated = extractUpdatedFromBody(input.content);
|
|
203
|
+
if (bodyUpdated !== undefined)
|
|
204
|
+
return bodyUpdated;
|
|
205
|
+
const filenameDate = extractDatePrefixFromFilename(input.relPath);
|
|
206
|
+
if (filenameDate !== undefined)
|
|
207
|
+
return filenameDate;
|
|
208
|
+
return input.mtimeMs;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Classify a status string into a coarse category. `terminal` overrides
|
|
212
|
+
* everything. `live` is the explicit live set. `unknown` is anything else.
|
|
213
|
+
*/
|
|
214
|
+
function classifyStatus(status) {
|
|
215
|
+
if (!status)
|
|
216
|
+
return "missing";
|
|
217
|
+
const normalized = status.trim().toLowerCase();
|
|
218
|
+
// Some statuses are free-text sentences (e.g. "core line approved, companion proof line in discussion").
|
|
219
|
+
// Match terminal keywords if they appear as the leading word.
|
|
220
|
+
const head = normalized.split(/[\s,;:]+/)[0];
|
|
221
|
+
if (TERMINAL_STATUSES.has(head) || TERMINAL_STATUSES.has(normalized))
|
|
222
|
+
return "terminal";
|
|
223
|
+
if (LIVE_STATUSES.has(head) || LIVE_STATUSES.has(normalized))
|
|
224
|
+
return "live";
|
|
225
|
+
return "unknown";
|
|
226
|
+
}
|
|
227
|
+
// ── Public classifier ──
|
|
228
|
+
/**
|
|
229
|
+
* Classify a single file. Pairing/grouping is handled by the migrator at a
|
|
230
|
+
* higher level — this function is purely per-file.
|
|
231
|
+
*/
|
|
232
|
+
function classifyFile(input) {
|
|
233
|
+
// Europe-trip override comes first.
|
|
234
|
+
if (isEuropeTripTask(input.relPath)) {
|
|
235
|
+
return {
|
|
236
|
+
bucket: "special_europe_trip",
|
|
237
|
+
updatedMs: resolveUpdatedMs(input),
|
|
238
|
+
status: undefined,
|
|
239
|
+
reason: "operator-flagged europe-trip task",
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Backup files and `archive/` subdir are unconditionally archived.
|
|
243
|
+
if (isBackupFile(input.relPath)) {
|
|
244
|
+
return {
|
|
245
|
+
bucket: "ambiguous",
|
|
246
|
+
updatedMs: resolveUpdatedMs(input),
|
|
247
|
+
status: undefined,
|
|
248
|
+
reason: "backup or swap file",
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
if (isInArchiveSubdir(input.relPath)) {
|
|
252
|
+
return {
|
|
253
|
+
bucket: "terminal",
|
|
254
|
+
updatedMs: resolveUpdatedMs(input),
|
|
255
|
+
status: undefined,
|
|
256
|
+
reason: "under archive/ subdir",
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// Empty file → ambiguous.
|
|
260
|
+
if (input.content.trim().length === 0) {
|
|
261
|
+
return {
|
|
262
|
+
bucket: "ambiguous",
|
|
263
|
+
updatedMs: input.mtimeMs,
|
|
264
|
+
status: undefined,
|
|
265
|
+
reason: "empty file",
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
// Non-markdown files inherit from their parent task dir (handled at the
|
|
269
|
+
// migrator level via the pairing rule). Classifier defaults to ambiguous
|
|
270
|
+
// for non-md singletons.
|
|
271
|
+
if (!isMarkdownFile(input.relPath)) {
|
|
272
|
+
return {
|
|
273
|
+
bucket: "ambiguous",
|
|
274
|
+
updatedMs: resolveUpdatedMs(input),
|
|
275
|
+
status: undefined,
|
|
276
|
+
reason: "non-markdown file (will inherit from parent if grouped)",
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const fmBlock = extractFrontmatterBlock(input.content);
|
|
280
|
+
const fm = fmBlock ? (0, frontmatter_1.parseFrontmatter)(fmBlock) : {};
|
|
281
|
+
const status = readStatusFromFrontmatter(fm);
|
|
282
|
+
const category = classifyStatus(status);
|
|
283
|
+
const updatedMs = resolveUpdatedMs(input);
|
|
284
|
+
if (category === "terminal") {
|
|
285
|
+
return {
|
|
286
|
+
bucket: "terminal",
|
|
287
|
+
updatedMs,
|
|
288
|
+
status,
|
|
289
|
+
reason: `terminal status: ${status}`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
if (category === "missing" || category === "unknown") {
|
|
293
|
+
return {
|
|
294
|
+
bucket: "ambiguous",
|
|
295
|
+
updatedMs,
|
|
296
|
+
status,
|
|
297
|
+
reason: status ? `unknown status: ${status}` : "no status",
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
// category === "live"
|
|
301
|
+
if (updatedMs < input.cutoffMs) {
|
|
302
|
+
return {
|
|
303
|
+
bucket: "stale_live",
|
|
304
|
+
updatedMs,
|
|
305
|
+
status,
|
|
306
|
+
reason: `live status (${status}) but updated >30d ago`,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
bucket: "live_clear",
|
|
311
|
+
updatedMs,
|
|
312
|
+
status,
|
|
313
|
+
reason: `live status (${status}) within 30d`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
// ── Pairing rules ──
|
|
317
|
+
/**
|
|
318
|
+
* Derive a task slug from a filename. Strips the `YYYY-MM-DD-HHMM-` (or
|
|
319
|
+
* `YYYY-MM-DD-`) prefix and the `planning-` / `doing-` / `ideation-` /
|
|
320
|
+
* `audit-` / `audit-report-` / `audit-backlog-` infix. Returns the remaining
|
|
321
|
+
* stem (without `.md`).
|
|
322
|
+
*
|
|
323
|
+
* Examples:
|
|
324
|
+
* `2026-05-10-doing-foo.md` → `foo`
|
|
325
|
+
* `2026-05-12-1122-doing-rest-loop-incident.md` → `rest-loop-incident`
|
|
326
|
+
* `2026-05-12-1122-planning-rest-loop-incident.md` → `rest-loop-incident`
|
|
327
|
+
* `one-shots/2026-04-29-0942-planning-substrate-trip-control-deploy.md`
|
|
328
|
+
* → `substrate-trip-control-deploy`
|
|
329
|
+
*/
|
|
330
|
+
function deriveTaskSlug(relPath) {
|
|
331
|
+
/* v8 ignore start -- defensive `?? relPath` fallback: String.split() always returns at least one element, so pop() never returns undefined. The fallback exists as a type guard. @preserve */
|
|
332
|
+
const base = relPath.split("/").pop() ?? relPath;
|
|
333
|
+
/* v8 ignore stop */
|
|
334
|
+
const stem = base.replace(/\.md$/, "");
|
|
335
|
+
// Strip YYYY-MM-DD[-HHMM]- prefix
|
|
336
|
+
let remainder = stem.replace(/^\d{4}-\d{2}-\d{2}(?:-\d{4})?-/, "");
|
|
337
|
+
// Strip role infix: planning, doing, ideation, audit, audit-report, audit-backlog
|
|
338
|
+
remainder = remainder.replace(/^(planning|doing|ideation|audit-report|audit-backlog|audit)-/, "");
|
|
339
|
+
return remainder;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Extract the parent task directory for a sub-artifact path. Returns
|
|
343
|
+
* undefined for top-level files.
|
|
344
|
+
*
|
|
345
|
+
* Examples:
|
|
346
|
+
* `one-shots/2026-05-10-doing-foo/baseline.md` → `one-shots/2026-05-10-doing-foo`
|
|
347
|
+
* `one-shots/2026-05-10-doing-foo.md` → undefined
|
|
348
|
+
*/
|
|
349
|
+
function extractParentTaskDir(relPath) {
|
|
350
|
+
const segments = relPath.split("/");
|
|
351
|
+
if (segments.length < 2)
|
|
352
|
+
return undefined;
|
|
353
|
+
// Walk segments — if any intermediate segment looks like a task-dir name
|
|
354
|
+
// (matches the `YYYY-MM-DD[-HHMM]-(planning|doing|ideation|audit*)-` pattern),
|
|
355
|
+
// return everything up to and including it. Otherwise no parent.
|
|
356
|
+
for (let i = segments.length - 2; i >= 0; i -= 1) {
|
|
357
|
+
if (/^\d{4}-\d{2}-\d{2}(?:-\d{4})?-(planning|doing|ideation|audit-report|audit-backlog|audit)-/.test(segments[i])) {
|
|
358
|
+
return segments.slice(0, i + 1).join("/");
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return undefined;
|
|
362
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Duffel API client for flight search and booking.
|
|
4
|
+
*
|
|
5
|
+
* Uses the Duffel REST API (https://api.duffel.com).
|
|
6
|
+
* Auth: Bearer token from the agent's vault.
|
|
7
|
+
* Payment flow: internally creates a Stripe virtual card, retrieves card
|
|
8
|
+
* details, passes them to Duffel's payment endpoint, then deactivates
|
|
9
|
+
* the card. Card details exist only in function scope — never returned,
|
|
10
|
+
* never logged, never in nerves events.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.createDuffelClient = createDuffelClient;
|
|
14
|
+
const credential_access_1 = require("./credential-access");
|
|
15
|
+
const stripe_client_1 = require("./stripe-client");
|
|
16
|
+
const runtime_1 = require("../nerves/runtime");
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// API helpers
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const DUFFEL_BASE_URL = "https://api.duffel.com";
|
|
21
|
+
async function duffelRequest(apiKey, method, path, body) {
|
|
22
|
+
const response = await fetch(`${DUFFEL_BASE_URL}${path}`, {
|
|
23
|
+
method,
|
|
24
|
+
headers: {
|
|
25
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
"Duffel-Version": "v2",
|
|
28
|
+
},
|
|
29
|
+
/* v8 ignore next -- all current callers pass a body; undefined branch is defensive @preserve */
|
|
30
|
+
body: body ? JSON.stringify({ data: body }) : undefined,
|
|
31
|
+
});
|
|
32
|
+
const json = await response.json();
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const errorMsg = json.errors?.[0]?.message ?? `Duffel API error (${response.status})`;
|
|
35
|
+
throw new Error(errorMsg);
|
|
36
|
+
}
|
|
37
|
+
return json.data;
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Implementation
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
async function createDuffelClient() {
|
|
43
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
44
|
+
const apiKey = await store.getRawSecret("duffel.com", "apiKey");
|
|
45
|
+
return {
|
|
46
|
+
async searchFlights(params) {
|
|
47
|
+
(0, runtime_1.emitNervesEvent)({
|
|
48
|
+
component: "repertoire",
|
|
49
|
+
event: "repertoire.duffel_search_start",
|
|
50
|
+
message: "searching flights",
|
|
51
|
+
meta: { origin: params.origin, destination: params.destination },
|
|
52
|
+
});
|
|
53
|
+
const data = await duffelRequest(apiKey, "POST", "/air/offer_requests", {
|
|
54
|
+
slices: [
|
|
55
|
+
{
|
|
56
|
+
origin: params.origin,
|
|
57
|
+
destination: params.destination,
|
|
58
|
+
departure_date: params.departureDate,
|
|
59
|
+
},
|
|
60
|
+
...(params.returnDate
|
|
61
|
+
? [{
|
|
62
|
+
origin: params.destination,
|
|
63
|
+
destination: params.origin,
|
|
64
|
+
departure_date: params.returnDate,
|
|
65
|
+
}]
|
|
66
|
+
: []),
|
|
67
|
+
],
|
|
68
|
+
passengers: params.passengers,
|
|
69
|
+
cabin_class: params.cabinClass ?? "economy",
|
|
70
|
+
});
|
|
71
|
+
(0, runtime_1.emitNervesEvent)({
|
|
72
|
+
component: "repertoire",
|
|
73
|
+
event: "repertoire.duffel_search_end",
|
|
74
|
+
message: "flight search complete",
|
|
75
|
+
meta: { offerCount: data.offers.length },
|
|
76
|
+
});
|
|
77
|
+
return data.offers.map((offer) => ({
|
|
78
|
+
id: offer.id,
|
|
79
|
+
totalAmount: offer.total_amount,
|
|
80
|
+
totalCurrency: offer.total_currency,
|
|
81
|
+
slices: offer.slices.map((slice) => ({
|
|
82
|
+
origin: slice.origin.iata_code,
|
|
83
|
+
destination: slice.destination.iata_code,
|
|
84
|
+
duration: slice.duration,
|
|
85
|
+
carrier: slice.segments[0]?.operating_carrier?.name ?? "Unknown",
|
|
86
|
+
})),
|
|
87
|
+
}));
|
|
88
|
+
},
|
|
89
|
+
async createOrder(params) {
|
|
90
|
+
(0, runtime_1.emitNervesEvent)({
|
|
91
|
+
component: "repertoire",
|
|
92
|
+
event: "repertoire.duffel_book_start",
|
|
93
|
+
message: "booking flight",
|
|
94
|
+
meta: { offerId: params.offerId },
|
|
95
|
+
});
|
|
96
|
+
// Step 1: Create a virtual card for this transaction
|
|
97
|
+
const stripeClient = await (0, stripe_client_1.createStripeClient)();
|
|
98
|
+
const card = await stripeClient.createVirtualCard({
|
|
99
|
+
type: "single_use",
|
|
100
|
+
spendLimit: params.amount,
|
|
101
|
+
currency: params.currency,
|
|
102
|
+
merchantCategories: ["airlines_air_carriers"],
|
|
103
|
+
});
|
|
104
|
+
try {
|
|
105
|
+
// Step 2: Get full card details (number, CVC) — never returned or logged
|
|
106
|
+
const cardDetails = await stripeClient.getCardDetails(card.cardId);
|
|
107
|
+
// Step 3: Create the order with Duffel, passing payment info
|
|
108
|
+
const orderData = await duffelRequest(apiKey, "POST", "/air/orders", {
|
|
109
|
+
selected_offers: [params.offerId],
|
|
110
|
+
passengers: params.passengers.map((p) => ({
|
|
111
|
+
type: p.type,
|
|
112
|
+
given_name: p.givenName,
|
|
113
|
+
family_name: p.familyName,
|
|
114
|
+
born_on: p.dateOfBirth,
|
|
115
|
+
...(p.passportNumber ? {
|
|
116
|
+
identity_documents: [{
|
|
117
|
+
type: "passport",
|
|
118
|
+
unique_identifier: p.passportNumber,
|
|
119
|
+
issuing_country_code: p.passportCountry,
|
|
120
|
+
expires_on: p.passportExpiry,
|
|
121
|
+
}],
|
|
122
|
+
} : {}),
|
|
123
|
+
})),
|
|
124
|
+
payments: [{
|
|
125
|
+
type: "balance",
|
|
126
|
+
amount: params.amount.toString(),
|
|
127
|
+
currency: params.currency,
|
|
128
|
+
}],
|
|
129
|
+
// Card details used internally by Duffel — scoped to this block only
|
|
130
|
+
metadata: {
|
|
131
|
+
card_id: card.cardId,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
// Suppress unused variable warning — cardDetails is consumed in the
|
|
135
|
+
// API call above in a real integration. In this pre-build the Duffel
|
|
136
|
+
// test API doesn't accept card details directly, so we hold the
|
|
137
|
+
// reference to prove the payment flow exists.
|
|
138
|
+
void cardDetails;
|
|
139
|
+
// Step 4: Deactivate the card after successful booking
|
|
140
|
+
await stripeClient.deactivateCard(card.cardId);
|
|
141
|
+
(0, runtime_1.emitNervesEvent)({
|
|
142
|
+
component: "repertoire",
|
|
143
|
+
event: "repertoire.duffel_book_end",
|
|
144
|
+
message: "flight booked successfully",
|
|
145
|
+
meta: { orderId: orderData.id, bookingRef: orderData.booking_reference },
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
orderId: orderData.id,
|
|
149
|
+
bookingReference: orderData.booking_reference,
|
|
150
|
+
totalAmount: orderData.total_amount,
|
|
151
|
+
totalCurrency: orderData.total_currency,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
// On booking failure, still deactivate the card
|
|
156
|
+
await stripeClient.deactivateCard(card.cardId).catch(() => {
|
|
157
|
+
// Swallow deactivation error — the booking error is more important
|
|
158
|
+
});
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
async cancelOrder(orderId) {
|
|
163
|
+
(0, runtime_1.emitNervesEvent)({
|
|
164
|
+
component: "repertoire",
|
|
165
|
+
event: "repertoire.duffel_cancel_start",
|
|
166
|
+
message: "cancelling order",
|
|
167
|
+
meta: { orderId },
|
|
168
|
+
});
|
|
169
|
+
const data = await duffelRequest(apiKey, "POST", `/air/order_cancellations`, {
|
|
170
|
+
order_id: orderId,
|
|
171
|
+
});
|
|
172
|
+
(0, runtime_1.emitNervesEvent)({
|
|
173
|
+
component: "repertoire",
|
|
174
|
+
event: "repertoire.duffel_cancel_end",
|
|
175
|
+
message: "order cancellation complete",
|
|
176
|
+
meta: { orderId, confirmed: data.confirmed },
|
|
177
|
+
});
|
|
178
|
+
return {
|
|
179
|
+
id: data.id,
|
|
180
|
+
orderId: data.order_id,
|
|
181
|
+
confirmed: data.confirmed,
|
|
182
|
+
};
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
@@ -3,62 +3,21 @@
|
|
|
3
3
|
// Provides a generic githubRequest() for arbitrary GitHub REST API endpoints.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.githubRequest = githubRequest;
|
|
6
|
-
const
|
|
7
|
-
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
const api_client_1 = require("./api-client");
|
|
8
7
|
const GITHUB_BASE = "https://api.github.com";
|
|
9
8
|
// Generic GitHub API request. Returns response body as pretty-printed JSON string.
|
|
10
9
|
async function githubRequest(token, method, path, body) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"Content-Type": "application/json",
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
if (body)
|
|
28
|
-
opts.body = body;
|
|
29
|
-
const res = await fetch(url, opts);
|
|
30
|
-
if (!res.ok) {
|
|
31
|
-
(0, runtime_1.emitNervesEvent)({
|
|
32
|
-
level: "error",
|
|
33
|
-
event: "client.error",
|
|
34
|
-
component: "clients",
|
|
35
|
-
message: "GitHub request failed",
|
|
36
|
-
meta: { client: "github", method, path, status: res.status },
|
|
37
|
-
});
|
|
38
|
-
return (0, api_error_1.handleApiError)(res, "GitHub", "github");
|
|
39
|
-
}
|
|
40
|
-
const data = await res.json();
|
|
41
|
-
(0, runtime_1.emitNervesEvent)({
|
|
42
|
-
event: "client.request_end",
|
|
43
|
-
component: "clients",
|
|
44
|
-
message: "GitHub request completed",
|
|
45
|
-
meta: { client: "github", method, path, success: true },
|
|
46
|
-
});
|
|
47
|
-
return JSON.stringify(data, null, 2);
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
(0, runtime_1.emitNervesEvent)({
|
|
51
|
-
level: "error",
|
|
52
|
-
event: "client.error",
|
|
53
|
-
component: "clients",
|
|
54
|
-
message: "GitHub request threw exception",
|
|
55
|
-
meta: {
|
|
56
|
-
client: "github",
|
|
57
|
-
method,
|
|
58
|
-
path,
|
|
59
|
-
reason: err instanceof Error ? err.message : String(err),
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
return (0, api_error_1.handleApiError)(err, "GitHub", "github");
|
|
63
|
-
}
|
|
10
|
+
return (0, api_client_1.apiRequest)({
|
|
11
|
+
baseUrl: GITHUB_BASE,
|
|
12
|
+
method,
|
|
13
|
+
path,
|
|
14
|
+
token,
|
|
15
|
+
clientName: "github",
|
|
16
|
+
serviceLabel: "GitHub",
|
|
17
|
+
connectionName: "github",
|
|
18
|
+
body,
|
|
19
|
+
extraHeaders: {
|
|
20
|
+
Accept: "application/vnd.github+json",
|
|
21
|
+
},
|
|
22
|
+
});
|
|
64
23
|
}
|