@ouro.bot/cli 0.1.0-alpha.48 → 0.1.0-alpha.480
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 +132 -19
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -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 +3061 -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 +857 -0
- 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 +426 -0
- package/dist/heart/background-operations.js +234 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -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 +110 -128
- package/dist/heart/core.js +745 -227
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +490 -0
- package/dist/heart/daemon/agent-discovery.js +79 -3
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/agentic-repair.js +216 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +640 -0
- package/dist/heart/daemon/cli-exec.js +6933 -0
- package/dist/heart/daemon/cli-help.js +487 -0
- package/dist/heart/daemon/cli-parse.js +1527 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +561 -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 -1616
- package/dist/heart/daemon/daemon-entry.js +345 -3
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +677 -58
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +486 -0
- package/dist/heart/daemon/health-monitor.js +92 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +25 -5
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/message-router.js +2 -2
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- 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 +214 -0
- 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 +73 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +178 -37
- 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 +109 -4
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +264 -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 +149 -10
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +62 -0
- 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 +3 -3
- 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 +201 -66
- 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/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/outlook/outlook-http-hooks.js +66 -0
- package/dist/heart/outlook/outlook-http-response.js +7 -0
- package/dist/heart/outlook/outlook-http-routes.js +244 -0
- package/dist/heart/outlook/outlook-http-static.js +99 -0
- package/dist/heart/outlook/outlook-http-transport.js +116 -0
- package/dist/heart/outlook/outlook-http.js +99 -0
- package/dist/heart/outlook/outlook-read.js +31 -0
- package/dist/heart/outlook/outlook-types.js +27 -0
- package/dist/heart/outlook/outlook-view.js +195 -0
- package/dist/heart/outlook/readers/agent-machine.js +359 -0
- package/dist/heart/outlook/readers/continuity-readers.js +332 -0
- package/dist/heart/outlook/readers/mail.js +362 -0
- package/dist/heart/outlook/readers/runtime-readers.js +644 -0
- package/dist/heart/outlook/readers/sessions.js +232 -0
- package/dist/heart/outlook/readers/shared.js +111 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +255 -0
- package/dist/heart/provider-credentials.js +424 -0
- package/dist/heart/provider-failover.js +266 -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 +193 -55
- package/dist/heart/providers/azure.js +103 -12
- package/dist/heart/providers/error-classification.js +63 -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 +29 -7
- package/dist/heart/providers/openai-codex.js +62 -38
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +260 -0
- package/dist/heart/sense-truth.js +11 -4
- package/dist/heart/session-activity.js +190 -0
- package/dist/heart/session-events.js +855 -0
- package/dist/heart/session-transcript.js +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +36 -27
- package/dist/heart/sync.js +332 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +361 -0
- package/dist/heart/turn-coordinator.js +24 -1
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +425 -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 +5 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +558 -0
- package/dist/mailroom/core.js +658 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +400 -0
- package/dist/mailroom/mbox-import.js +341 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +197 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +7 -1
- package/dist/mind/context.js +132 -93
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +74 -93
- 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/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +38 -1
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- 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 +66 -7
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +978 -169
- 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 +84 -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/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/outlook-ui/assets/index-CPfhbn13.js +61 -0
- package/dist/outlook-ui/index.html +15 -0
- 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 +774 -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 +255 -0
- package/dist/repertoire/mcp-manager.js +305 -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 +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +37 -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 +44 -740
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +141 -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 +105 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +896 -0
- package/dist/repertoire/tools-notes.js +376 -0
- package/dist/repertoire/tools-session.js +746 -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-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +144 -113
- 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/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 +73 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +7 -3
- package/dist/senses/{bluebubbles.js → bluebubbles/index.js} +705 -116
- 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/replay.js +129 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -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 +605 -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 +83 -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 +516 -211
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +97 -17
- package/dist/senses/inner-dialog.js +404 -14
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +232 -0
- package/dist/senses/pipeline.js +533 -72
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +205 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +413 -163
- package/dist/senses/trust-gate.js +5 -5
- package/package.json +37 -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/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/debug-activity.js +0 -127
- 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,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Thin wrapper around the Stripe Issuing API.
|
|
4
|
+
*
|
|
5
|
+
* Initializes with a restricted API key from the agent's vault.
|
|
6
|
+
* Card numbers are NEVER included in nerves events or log output.
|
|
7
|
+
* The `getCardDetails` method exists only for internal payment flows
|
|
8
|
+
* (e.g., passing card details to Duffel) — the returned data must
|
|
9
|
+
* never escape the calling function's scope.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createStripeClient = createStripeClient;
|
|
16
|
+
const stripe_1 = __importDefault(require("stripe"));
|
|
17
|
+
const credential_access_1 = require("./credential-access");
|
|
18
|
+
const runtime_1 = require("../nerves/runtime");
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Implementation
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
function toCardInfo(card) {
|
|
23
|
+
return {
|
|
24
|
+
cardId: card.id,
|
|
25
|
+
last4: card.last4,
|
|
26
|
+
status: card.status,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a Stripe client initialized with a restricted key from the vault.
|
|
31
|
+
*/
|
|
32
|
+
async function createStripeClient() {
|
|
33
|
+
const store = (0, credential_access_1.getCredentialStore)();
|
|
34
|
+
const apiKey = await store.getRawSecret("stripe.com", "restrictedKey");
|
|
35
|
+
// StripeConstructor is a callable (not a class), cast the result
|
|
36
|
+
const stripe = (0, stripe_1.default)(apiKey);
|
|
37
|
+
return {
|
|
38
|
+
async createVirtualCard(opts) {
|
|
39
|
+
(0, runtime_1.emitNervesEvent)({
|
|
40
|
+
component: "repertoire",
|
|
41
|
+
event: "repertoire.stripe_card_create_start",
|
|
42
|
+
message: "creating virtual card",
|
|
43
|
+
meta: { type: opts.type, currency: opts.currency },
|
|
44
|
+
});
|
|
45
|
+
const spendingControls = {
|
|
46
|
+
spending_limits: [
|
|
47
|
+
{
|
|
48
|
+
amount: opts.spendLimit * 100, // Stripe uses cents
|
|
49
|
+
interval: opts.type === "single_use" ? "all_time" : "monthly",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
...(opts.merchantCategories
|
|
53
|
+
? { allowed_categories: opts.merchantCategories }
|
|
54
|
+
: {}),
|
|
55
|
+
};
|
|
56
|
+
const card = await stripe.issuing.cards.create({
|
|
57
|
+
type: "virtual",
|
|
58
|
+
currency: opts.currency,
|
|
59
|
+
spending_controls: spendingControls,
|
|
60
|
+
status: "active",
|
|
61
|
+
});
|
|
62
|
+
(0, runtime_1.emitNervesEvent)({
|
|
63
|
+
component: "repertoire",
|
|
64
|
+
event: "repertoire.stripe_card_create_end",
|
|
65
|
+
message: "virtual card created",
|
|
66
|
+
meta: { cardId: card.id, last4: card.last4 },
|
|
67
|
+
});
|
|
68
|
+
return toCardInfo(card);
|
|
69
|
+
},
|
|
70
|
+
async getCard(cardId) {
|
|
71
|
+
(0, runtime_1.emitNervesEvent)({
|
|
72
|
+
component: "repertoire",
|
|
73
|
+
event: "repertoire.stripe_card_get",
|
|
74
|
+
message: "retrieving card info",
|
|
75
|
+
meta: { cardId },
|
|
76
|
+
});
|
|
77
|
+
const card = await stripe.issuing.cards.retrieve(cardId);
|
|
78
|
+
return toCardInfo(card);
|
|
79
|
+
},
|
|
80
|
+
async updateCard(cardId, updates) {
|
|
81
|
+
(0, runtime_1.emitNervesEvent)({
|
|
82
|
+
component: "repertoire",
|
|
83
|
+
event: "repertoire.stripe_card_update",
|
|
84
|
+
message: "updating card",
|
|
85
|
+
meta: { cardId },
|
|
86
|
+
});
|
|
87
|
+
const card = await stripe.issuing.cards.update(cardId, updates);
|
|
88
|
+
return toCardInfo(card);
|
|
89
|
+
},
|
|
90
|
+
async deactivateCard(cardId) {
|
|
91
|
+
(0, runtime_1.emitNervesEvent)({
|
|
92
|
+
component: "repertoire",
|
|
93
|
+
event: "repertoire.stripe_card_deactivate",
|
|
94
|
+
message: "deactivating card",
|
|
95
|
+
meta: { cardId },
|
|
96
|
+
});
|
|
97
|
+
const card = await stripe.issuing.cards.update(cardId, { status: "canceled" });
|
|
98
|
+
return toCardInfo(card);
|
|
99
|
+
},
|
|
100
|
+
async listCards() {
|
|
101
|
+
(0, runtime_1.emitNervesEvent)({
|
|
102
|
+
component: "repertoire",
|
|
103
|
+
event: "repertoire.stripe_cards_list",
|
|
104
|
+
message: "listing cards",
|
|
105
|
+
meta: {},
|
|
106
|
+
});
|
|
107
|
+
const result = await stripe.issuing.cards.list();
|
|
108
|
+
return result.data.map(toCardInfo);
|
|
109
|
+
},
|
|
110
|
+
async getCardDetails(cardId) {
|
|
111
|
+
// This method retrieves sensitive card details for payment flows.
|
|
112
|
+
// The data must NEVER be logged, emitted, or returned to the model.
|
|
113
|
+
(0, runtime_1.emitNervesEvent)({
|
|
114
|
+
component: "repertoire",
|
|
115
|
+
event: "repertoire.stripe_card_details_get",
|
|
116
|
+
message: "retrieving card details for payment flow",
|
|
117
|
+
meta: { cardId },
|
|
118
|
+
});
|
|
119
|
+
const card = await stripe.issuing.cards.retrieve(cardId, {
|
|
120
|
+
expand: ["number", "cvc"],
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
cardId: card.id,
|
|
124
|
+
number: card.number,
|
|
125
|
+
cvc: card.cvc,
|
|
126
|
+
expMonth: card.exp_month,
|
|
127
|
+
expYear: card.exp_year,
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -7,14 +7,21 @@ exports.boardDeps = boardDeps;
|
|
|
7
7
|
exports.boardSessions = boardSessions;
|
|
8
8
|
const runtime_1 = require("../../nerves/runtime");
|
|
9
9
|
const transitions_1 = require("./transitions");
|
|
10
|
-
const
|
|
10
|
+
const BOARD_ACTIVE_ORDER = [
|
|
11
11
|
"blocked",
|
|
12
12
|
"processing",
|
|
13
13
|
"collaborating",
|
|
14
14
|
"drafting",
|
|
15
15
|
"validating",
|
|
16
16
|
"paused",
|
|
17
|
+
];
|
|
18
|
+
const BOARD_TERMINAL_ORDER = [
|
|
17
19
|
"done",
|
|
20
|
+
"cancelled",
|
|
21
|
+
];
|
|
22
|
+
const BOARD_STATUS_ORDER = [
|
|
23
|
+
...BOARD_ACTIVE_ORDER,
|
|
24
|
+
...BOARD_TERMINAL_ORDER,
|
|
18
25
|
];
|
|
19
26
|
function compactName(task) {
|
|
20
27
|
const suffix = task.stem.replace(/^\d{4}-\d{2}-\d{2}-\d{4}-/, "");
|
|
@@ -29,6 +36,7 @@ function groupByStatus(tasks) {
|
|
|
29
36
|
paused: [],
|
|
30
37
|
blocked: [],
|
|
31
38
|
done: [],
|
|
39
|
+
cancelled: [],
|
|
32
40
|
};
|
|
33
41
|
for (const task of tasks) {
|
|
34
42
|
grouped[task.status].push(compactName(task));
|
|
@@ -59,8 +67,26 @@ function activeSessionLines(tasks) {
|
|
|
59
67
|
});
|
|
60
68
|
return active.map((task) => task.stem).sort();
|
|
61
69
|
}
|
|
70
|
+
function activeBridgeLines(tasks) {
|
|
71
|
+
return tasks
|
|
72
|
+
.filter((task) => typeof task.frontmatter.active_bridge === "string" && String(task.frontmatter.active_bridge).trim())
|
|
73
|
+
.map((task) => `${task.stem} -> ${String(task.frontmatter.active_bridge).trim()}`)
|
|
74
|
+
.sort();
|
|
75
|
+
}
|
|
76
|
+
function buildHealthLine(issues) {
|
|
77
|
+
if (issues.length === 0)
|
|
78
|
+
return "health: clean";
|
|
79
|
+
const liveCount = issues.filter((i) => i.category === "live").length;
|
|
80
|
+
const migrationCount = issues.filter((i) => i.category === "migration").length;
|
|
81
|
+
const parts = [];
|
|
82
|
+
if (liveCount > 0)
|
|
83
|
+
parts.push(`${liveCount} live`);
|
|
84
|
+
if (migrationCount > 0)
|
|
85
|
+
parts.push(`${migrationCount} migration`);
|
|
86
|
+
return `health: ${parts.join(", ")}`;
|
|
87
|
+
}
|
|
62
88
|
function actionRequired(index, byStatus) {
|
|
63
|
-
const actions =
|
|
89
|
+
const actions = index.issues.map((issue) => `${issue.code}: ${issue.description} [${issue.target}]`);
|
|
64
90
|
if (byStatus.blocked.length > 0) {
|
|
65
91
|
actions.push(`blocked tasks: ${byStatus.blocked.join(", ")}`);
|
|
66
92
|
}
|
|
@@ -77,14 +103,19 @@ function buildTaskBoard(index) {
|
|
|
77
103
|
meta: { taskCount: index.tasks.length },
|
|
78
104
|
});
|
|
79
105
|
const byStatus = groupByStatus(index.tasks);
|
|
80
|
-
const
|
|
106
|
+
const activeCounts = BOARD_ACTIVE_ORDER.map((status) => `${status}:${byStatus[status].length}`).join(" ");
|
|
81
107
|
const processing = byStatus.processing.length > 0 ? `\n processing: ${byStatus.processing.join(", ")}` : "";
|
|
82
108
|
const blocked = byStatus.blocked.length > 0 ? `\n blocked: ${byStatus.blocked.join(", ")}` : "";
|
|
83
|
-
const
|
|
109
|
+
const terminalParts = BOARD_TERMINAL_ORDER
|
|
110
|
+
.filter((status) => byStatus[status].length > 0)
|
|
111
|
+
.map((status) => `${status}:${byStatus[status].length}`);
|
|
112
|
+
const terminalLine = terminalParts.length > 0 ? `\n terminal: ${terminalParts.join(" ")}` : "";
|
|
113
|
+
const healthLine = `\n ${buildHealthLine(index.issues)}`;
|
|
114
|
+
const compact = `[Tasks] ${activeCounts}${processing}${blocked}${terminalLine}${healthLine}`;
|
|
84
115
|
const fullLines = [];
|
|
85
116
|
for (const status of BOARD_STATUS_ORDER) {
|
|
86
117
|
const names = byStatus[status];
|
|
87
|
-
if (status === "done" && names.length === 0)
|
|
118
|
+
if ((status === "done" || status === "cancelled") && names.length === 0)
|
|
88
119
|
continue;
|
|
89
120
|
fullLines.push(`## ${status}`);
|
|
90
121
|
fullLines.push(names.length > 0 ? names.map((name) => `- ${name}`).join("\n") : "- (none)");
|
|
@@ -99,13 +130,20 @@ function buildTaskBoard(index) {
|
|
|
99
130
|
fullLines.push("## active sessions");
|
|
100
131
|
fullLines.push(active.map((line) => `- ${line}`).join("\n"));
|
|
101
132
|
}
|
|
133
|
+
const activeBridges = activeBridgeLines(index.tasks);
|
|
134
|
+
if (activeBridges.length > 0) {
|
|
135
|
+
fullLines.push("## active bridges");
|
|
136
|
+
fullLines.push(activeBridges.map((line) => `- ${line}`).join("\n"));
|
|
137
|
+
}
|
|
102
138
|
return {
|
|
103
139
|
compact,
|
|
104
140
|
full: fullLines.join("\n\n"),
|
|
105
141
|
byStatus,
|
|
142
|
+
issues: index.issues,
|
|
106
143
|
actionRequired: actionRequired(index, byStatus),
|
|
107
144
|
unresolvedDependencies: unresolved,
|
|
108
145
|
activeSessions: active,
|
|
146
|
+
activeBridges,
|
|
109
147
|
};
|
|
110
148
|
}
|
|
111
149
|
function boardStatus(board, status) {
|
|
@@ -0,0 +1,182 @@
|
|
|
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.addKindToLegacyCard = addKindToLegacyCard;
|
|
37
|
+
exports.applyFixes = applyFixes;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
41
|
+
const scanner_1 = require("./scanner");
|
|
42
|
+
const parser_1 = require("./parser");
|
|
43
|
+
function issueId(issue) {
|
|
44
|
+
return `${issue.code}:${issue.target}`;
|
|
45
|
+
}
|
|
46
|
+
function addKindToLegacyCard(root, issue) {
|
|
47
|
+
(0, runtime_1.emitNervesEvent)({
|
|
48
|
+
event: "repertoire.fix_apply_start",
|
|
49
|
+
component: "repertoire",
|
|
50
|
+
message: "adding kind: task to legacy card",
|
|
51
|
+
meta: { target: issue.target },
|
|
52
|
+
});
|
|
53
|
+
const filePath = path.join(root, issue.target);
|
|
54
|
+
if (!fs.existsSync(filePath))
|
|
55
|
+
return false;
|
|
56
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
57
|
+
const frontmatter = (0, scanner_1.tryExtractFrontmatter)(content);
|
|
58
|
+
if (!frontmatter)
|
|
59
|
+
return false;
|
|
60
|
+
// Add kind: task to frontmatter
|
|
61
|
+
frontmatter.kind = "task";
|
|
62
|
+
// Extract body (everything after the second ---)
|
|
63
|
+
const lines = content.split(/\r?\n/);
|
|
64
|
+
const firstDelim = lines.findIndex((line) => line.trim() === "---");
|
|
65
|
+
const secondDelim = lines.findIndex((line, idx) => idx > firstDelim && line.trim() === "---");
|
|
66
|
+
const body = lines.slice(secondDelim + 1).join("\n").replace(/^\n/, "");
|
|
67
|
+
const rendered = (0, parser_1.renderTaskFile)(frontmatter, body);
|
|
68
|
+
fs.writeFileSync(filePath, rendered, "utf-8");
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
function applySingleFix(root, issue) {
|
|
72
|
+
switch (issue.code) {
|
|
73
|
+
case "schema-missing-kind":
|
|
74
|
+
return addKindToLegacyCard(root, issue);
|
|
75
|
+
default:
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function applyFixes(options, root) {
|
|
80
|
+
(0, runtime_1.emitNervesEvent)({
|
|
81
|
+
event: "repertoire.fix_start",
|
|
82
|
+
component: "repertoire",
|
|
83
|
+
message: `applying fixes in ${options.mode} mode`,
|
|
84
|
+
meta: { mode: options.mode, root },
|
|
85
|
+
});
|
|
86
|
+
(0, scanner_1.clearTaskScanCache)();
|
|
87
|
+
const index = (0, scanner_1.scanTasks)(root);
|
|
88
|
+
const issues = index.issues;
|
|
89
|
+
if (options.mode === "dry-run") {
|
|
90
|
+
(0, runtime_1.emitNervesEvent)({
|
|
91
|
+
event: "repertoire.fix_complete",
|
|
92
|
+
component: "repertoire",
|
|
93
|
+
message: "dry-run complete, no changes made",
|
|
94
|
+
meta: { issueCount: issues.length },
|
|
95
|
+
});
|
|
96
|
+
const health = issues.length === 0 ? "clean" : buildHealthSummary(issues);
|
|
97
|
+
return {
|
|
98
|
+
applied: [],
|
|
99
|
+
remaining: issues,
|
|
100
|
+
skipped: [],
|
|
101
|
+
health,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (options.mode === "single") {
|
|
105
|
+
const targetId = options.issueId ?? "";
|
|
106
|
+
const match = issues.find((i) => issueId(i) === targetId);
|
|
107
|
+
if (!match) {
|
|
108
|
+
(0, runtime_1.emitNervesEvent)({
|
|
109
|
+
event: "repertoire.fix_complete",
|
|
110
|
+
component: "repertoire",
|
|
111
|
+
message: "single fix: issue not found",
|
|
112
|
+
meta: { issueId: targetId },
|
|
113
|
+
});
|
|
114
|
+
const health = issues.length === 0 ? "clean" : buildHealthSummary(issues);
|
|
115
|
+
return {
|
|
116
|
+
applied: [],
|
|
117
|
+
remaining: issues,
|
|
118
|
+
skipped: [],
|
|
119
|
+
health,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const success = applySingleFix(root, match);
|
|
123
|
+
(0, scanner_1.clearTaskScanCache)();
|
|
124
|
+
const afterIndex = (0, scanner_1.scanTasks)(root);
|
|
125
|
+
const afterIssues = afterIndex.issues;
|
|
126
|
+
const health = afterIssues.length === 0 ? "clean" : buildHealthSummary(afterIssues);
|
|
127
|
+
(0, runtime_1.emitNervesEvent)({
|
|
128
|
+
event: "repertoire.fix_complete",
|
|
129
|
+
component: "repertoire",
|
|
130
|
+
message: `single fix ${success ? "applied" : "failed"}`,
|
|
131
|
+
meta: { issueId: targetId, success },
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
applied: success ? [match] : [],
|
|
135
|
+
remaining: afterIssues,
|
|
136
|
+
skipped: success ? [] : [match],
|
|
137
|
+
health,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// safe mode: apply all safe-confidence fixes
|
|
141
|
+
const applied = [];
|
|
142
|
+
const skipped = [];
|
|
143
|
+
for (const issue of issues) {
|
|
144
|
+
if (issue.confidence !== "safe") {
|
|
145
|
+
skipped.push(issue);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const success = applySingleFix(root, issue);
|
|
149
|
+
if (success) {
|
|
150
|
+
applied.push(issue);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
skipped.push(issue);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
(0, scanner_1.clearTaskScanCache)();
|
|
157
|
+
const afterIndex = (0, scanner_1.scanTasks)(root);
|
|
158
|
+
const afterIssues = afterIndex.issues;
|
|
159
|
+
const health = afterIssues.length === 0 ? "clean" : buildHealthSummary(afterIssues);
|
|
160
|
+
(0, runtime_1.emitNervesEvent)({
|
|
161
|
+
event: "repertoire.fix_complete",
|
|
162
|
+
component: "repertoire",
|
|
163
|
+
message: `safe fixes complete: ${applied.length} applied, ${skipped.length} skipped`,
|
|
164
|
+
meta: { applied: applied.length, skipped: skipped.length },
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
applied,
|
|
168
|
+
remaining: afterIssues,
|
|
169
|
+
skipped,
|
|
170
|
+
health,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function buildHealthSummary(issues) {
|
|
174
|
+
const liveCount = issues.filter((i) => i.category === "live").length;
|
|
175
|
+
const migrationCount = issues.filter((i) => i.category === "migration").length;
|
|
176
|
+
const parts = [];
|
|
177
|
+
if (liveCount > 0)
|
|
178
|
+
parts.push(`${liveCount} live`);
|
|
179
|
+
if (migrationCount > 0)
|
|
180
|
+
parts.push(`${migrationCount} migration`);
|
|
181
|
+
return parts.join(", ");
|
|
182
|
+
}
|
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createTaskModule = createTaskModule;
|
|
36
37
|
exports.getTaskModule = getTaskModule;
|
|
37
38
|
exports.resetTaskModule = resetTaskModule;
|
|
38
39
|
const fs = __importStar(require("fs"));
|
|
@@ -40,6 +41,7 @@ const path = __importStar(require("path"));
|
|
|
40
41
|
const config_1 = require("../../heart/config");
|
|
41
42
|
const runtime_1 = require("../../nerves/runtime");
|
|
42
43
|
const board_1 = require("./board");
|
|
44
|
+
const fix_1 = require("./fix");
|
|
43
45
|
const lifecycle_1 = require("./lifecycle");
|
|
44
46
|
const parser_1 = require("./parser");
|
|
45
47
|
const scanner_1 = require("./scanner");
|
|
@@ -66,8 +68,12 @@ function removeRuntimeFrontmatter(frontmatter) {
|
|
|
66
68
|
return clean;
|
|
67
69
|
}
|
|
68
70
|
class FileTaskModule {
|
|
71
|
+
root;
|
|
72
|
+
constructor(root = (0, scanner_1.getTaskRoot)()) {
|
|
73
|
+
this.root = root;
|
|
74
|
+
}
|
|
69
75
|
scan() {
|
|
70
|
-
return (0, scanner_1.scanTasks)(
|
|
76
|
+
return (0, scanner_1.scanTasks)(this.root);
|
|
71
77
|
}
|
|
72
78
|
getBoard() {
|
|
73
79
|
return (0, board_1.buildTaskBoard)(this.scan());
|
|
@@ -93,10 +99,11 @@ class FileTaskModule {
|
|
|
93
99
|
const collection = (0, transitions_1.canonicalCollectionForTaskType)(type);
|
|
94
100
|
const stem = `${formatStemTimestamp()}-${(0, config_1.slugify)(input.title).slice(0, 64) || "task"}`;
|
|
95
101
|
const filename = `${stem}.md`;
|
|
96
|
-
const root =
|
|
102
|
+
const root = this.root;
|
|
97
103
|
const filePath = path.join(root, collection, filename);
|
|
98
104
|
const today = formatDate();
|
|
99
105
|
const frontmatter = {
|
|
106
|
+
kind: "task",
|
|
100
107
|
type,
|
|
101
108
|
category: input.category || "infrastructure",
|
|
102
109
|
title: input.title,
|
|
@@ -108,13 +115,18 @@ class FileTaskModule {
|
|
|
108
115
|
lastRun: input.lastRun ?? null,
|
|
109
116
|
created: today,
|
|
110
117
|
updated: today,
|
|
111
|
-
child_tasks: [],
|
|
112
118
|
artifacts: [],
|
|
113
119
|
};
|
|
114
120
|
if (type === "one-shot") {
|
|
115
121
|
frontmatter.parent_task = null;
|
|
116
122
|
frontmatter.depends_on = [];
|
|
117
123
|
}
|
|
124
|
+
if (input.activeBridge && input.activeBridge.trim()) {
|
|
125
|
+
frontmatter.active_bridge = input.activeBridge.trim();
|
|
126
|
+
}
|
|
127
|
+
if (Array.isArray(input.bridgeSessions) && input.bridgeSessions.length > 0) {
|
|
128
|
+
frontmatter.bridge_sessions = input.bridgeSessions.filter((value) => typeof value === "string" && value.trim());
|
|
129
|
+
}
|
|
118
130
|
const content = (0, parser_1.renderTaskFile)(frontmatter, input.body);
|
|
119
131
|
const validation = (0, middleware_1.validateWrite)(filePath, content);
|
|
120
132
|
if (!validation.ok) {
|
|
@@ -125,6 +137,21 @@ class FileTaskModule {
|
|
|
125
137
|
(0, scanner_1.clearTaskScanCache)();
|
|
126
138
|
return filePath;
|
|
127
139
|
}
|
|
140
|
+
bindBridge(name, input) {
|
|
141
|
+
const task = this.getTask(name);
|
|
142
|
+
if (!task) {
|
|
143
|
+
return { ok: false, reason: `task not found: ${name}` };
|
|
144
|
+
}
|
|
145
|
+
const content = fs.readFileSync(task.path, "utf-8");
|
|
146
|
+
const parsed = (0, parser_1.parseTaskFile)(content, task.path);
|
|
147
|
+
const frontmatter = removeRuntimeFrontmatter(parsed.frontmatter);
|
|
148
|
+
frontmatter.active_bridge = input.bridgeId.trim();
|
|
149
|
+
frontmatter.bridge_sessions = input.sessionRefs.filter((value) => value.trim().length > 0);
|
|
150
|
+
frontmatter.updated = formatDate();
|
|
151
|
+
fs.writeFileSync(task.path, (0, parser_1.renderTaskFile)(frontmatter, parsed.body), "utf-8");
|
|
152
|
+
(0, scanner_1.clearTaskScanCache)();
|
|
153
|
+
return { ok: true, path: task.path };
|
|
154
|
+
}
|
|
128
155
|
updateStatus(name, toStatus) {
|
|
129
156
|
const normalized = (0, transitions_1.normalizeTaskStatus)(toStatus);
|
|
130
157
|
if (!normalized) {
|
|
@@ -171,6 +198,9 @@ class FileTaskModule {
|
|
|
171
198
|
}
|
|
172
199
|
return (0, middleware_1.validateSpawn)(task, spawnType);
|
|
173
200
|
}
|
|
201
|
+
fix(options) {
|
|
202
|
+
return (0, fix_1.applyFixes)(options, this.root);
|
|
203
|
+
}
|
|
174
204
|
detectStale(thresholdDays) {
|
|
175
205
|
return (0, lifecycle_1.detectStaleTasks)(this.scan(), thresholdDays);
|
|
176
206
|
}
|
|
@@ -191,9 +221,12 @@ class FileTaskModule {
|
|
|
191
221
|
}
|
|
192
222
|
}
|
|
193
223
|
let taskModule = null;
|
|
224
|
+
function createTaskModule(root = (0, scanner_1.getTaskRoot)()) {
|
|
225
|
+
return new FileTaskModule(root);
|
|
226
|
+
}
|
|
194
227
|
function getTaskModule() {
|
|
195
228
|
if (!taskModule) {
|
|
196
|
-
taskModule =
|
|
229
|
+
taskModule = createTaskModule();
|
|
197
230
|
}
|
|
198
231
|
return taskModule;
|
|
199
232
|
}
|
|
@@ -48,7 +48,7 @@ function archiveCompletedTasks(index) {
|
|
|
48
48
|
const archived = [];
|
|
49
49
|
const failures = [];
|
|
50
50
|
for (const task of index.tasks) {
|
|
51
|
-
if (task.status !== "done")
|
|
51
|
+
if (task.status !== "done" && task.status !== "cancelled")
|
|
52
52
|
continue;
|
|
53
53
|
const archiveDir = path.join(index.root, "archive", task.collection);
|
|
54
54
|
const archiveFile = path.join(archiveDir, task.name);
|
|
@@ -73,7 +73,7 @@ function detectStaleTasks(index, thresholdDays, now = new Date()) {
|
|
|
73
73
|
const updated = Date.parse(task.updated);
|
|
74
74
|
if (Number.isNaN(updated))
|
|
75
75
|
return false;
|
|
76
|
-
if (task.status === "done")
|
|
76
|
+
if (task.status === "done" || task.status === "cancelled")
|
|
77
77
|
return false;
|
|
78
78
|
return updated < staleCutoffMs;
|
|
79
79
|
});
|
|
@@ -96,8 +96,6 @@ function collectionFromPath(taskPath, type) {
|
|
|
96
96
|
return "one-shots";
|
|
97
97
|
if (parts.includes("ongoing"))
|
|
98
98
|
return "ongoing";
|
|
99
|
-
if (parts.includes("habits"))
|
|
100
|
-
return "habits";
|
|
101
99
|
return (0, transitions_1.canonicalCollectionForTaskType)(type);
|
|
102
100
|
}
|
|
103
101
|
function parseTaskFile(content, filePath) {
|
|
@@ -138,6 +136,9 @@ function parseTaskFile(content, filePath) {
|
|
|
138
136
|
_isCanonicalFilename: (0, transitions_1.isCanonicalTaskFilename)(name),
|
|
139
137
|
},
|
|
140
138
|
body: parsed.body,
|
|
139
|
+
hasWorkDir: false,
|
|
140
|
+
workDirFiles: [],
|
|
141
|
+
derivedChildren: [],
|
|
141
142
|
};
|
|
142
143
|
}
|
|
143
144
|
function formatFrontmatterValue(value) {
|