@ouro.bot/cli 0.1.0-alpha.29 → 0.1.0-alpha.290
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 +188 -190
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
- package/changelog.json +1756 -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 +203 -0
- package/dist/arc/presence.js +185 -0
- package/dist/heart/active-work.js +832 -0
- package/dist/heart/agent-entry.js +37 -2
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +230 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +138 -0
- package/dist/heart/auth/auth-flow.js +456 -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 +147 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +304 -0
- package/dist/heart/config.js +63 -30
- package/dist/heart/core.js +669 -195
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +149 -0
- package/dist/heart/daemon/agent-discovery.js +79 -3
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +574 -0
- package/dist/heart/daemon/cli-exec.js +1932 -0
- package/dist/heart/daemon/cli-parse.js +762 -0
- package/dist/heart/daemon/cli-render.js +503 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1171
- package/dist/heart/daemon/daemon-entry.js +235 -3
- package/dist/heart/daemon/daemon-health.js +136 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +706 -57
- 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/inner-status.js +89 -0
- package/dist/heart/daemon/launchd.js +46 -9
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +105 -0
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- package/dist/heart/daemon/ouro-bot-entry.js +1 -1
- package/dist/heart/daemon/process-manager.js +180 -0
- package/dist/heart/daemon/pulse.js +463 -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 +101 -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 +72 -3
- 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 +307 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/thoughts.js +510 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/habits/habit-migration.js +181 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-scheduler.js +371 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +30 -120
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
- package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
- package/dist/heart/identity.js +163 -60
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +127 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/outlook/outlook-http.js +439 -0
- package/dist/heart/outlook/outlook-read.js +1618 -0
- package/dist/heart/outlook/outlook-render.js +1032 -0
- package/dist/heart/outlook/outlook-types.js +7 -0
- package/dist/heart/outlook/outlook-view.js +194 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-failover.js +88 -0
- package/dist/heart/provider-ping.js +162 -0
- package/dist/heart/providers/anthropic-token.js +163 -0
- package/dist/heart/providers/anthropic.js +169 -46
- package/dist/heart/providers/azure.js +98 -11
- package/dist/heart/providers/error-classification.js +63 -0
- package/dist/heart/providers/github-copilot.js +136 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +23 -5
- package/dist/heart/providers/openai-codex.js +33 -22
- package/dist/heart/session-activity.js +172 -0
- package/dist/heart/session-recall.js +216 -0
- package/dist/heart/start-of-turn-packet.js +339 -0
- package/dist/heart/streaming.js +36 -27
- package/dist/heart/sync.js +277 -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 +358 -0
- package/dist/heart/turn-coordinator.js +28 -0
- 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/{daemon → versioning}/ouro-path-installer.js +78 -35
- 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 +12 -2
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mind/associative-recall.js +126 -66
- package/dist/mind/bundle-manifest.js +8 -1
- package/dist/mind/context.js +125 -14
- package/dist/mind/{memory.js → diary.js} +68 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +14 -1
- package/dist/mind/friends/channel.js +56 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +37 -0
- package/dist/mind/friends/store-file.js +58 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +8 -0
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +76 -9
- package/dist/mind/prompt.js +885 -109
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit.js +1 -1
- package/dist/nerves/coverage/file-completeness.js +56 -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-Ck8agNeO.js +61 -0
- package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -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 +319 -0
- package/dist/repertoire/bundle-templates.js +72 -0
- package/dist/repertoire/bw-installer.js +79 -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 +149 -2
- 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 +515 -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 +375 -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 +14 -23
- 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 +28 -10
- 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 +11 -28
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +316 -0
- package/dist/repertoire/tools-base.js +45 -771
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-bridge.js +141 -0
- package/dist/repertoire/tools-bundle.js +978 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +182 -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-memory.js +347 -0
- package/dist/repertoire/tools-session.js +739 -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 +12 -62
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +110 -0
- package/dist/repertoire/tools.js +148 -130
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +118 -0
- package/dist/repertoire/vault-setup.js +241 -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} +143 -9
- package/dist/senses/bluebubbles/entry.js +13 -0
- package/dist/senses/bluebubbles/inbound-log.js +110 -0
- package/dist/senses/bluebubbles/index.js +1410 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +122 -70
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +29 -16
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/runtime-state.js +109 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -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 +595 -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 +1 -1
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +588 -246
- package/dist/senses/commands.js +65 -1
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +112 -19
- package/dist/senses/inner-dialog.js +633 -86
- package/dist/senses/pipeline.js +560 -0
- package/dist/senses/shared-turn.js +195 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams.js +664 -165
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +14 -7
- package/skills/agent-commerce.md +106 -0
- package/skills/browser-navigation.md +110 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +81 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/subagent-installer.js +0 -134
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -421
- package/dist/senses/debug-activity.js +0 -108
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -235
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -382
- /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-serpent.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,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Imperative snake-themed spinner for the CLI.
|
|
4
|
+
*
|
|
5
|
+
* Writes directly to stderr via setInterval — no React, no Ink.
|
|
6
|
+
* Features:
|
|
7
|
+
* - Ouroboros snake animation frames (serpent eating its own tail)
|
|
8
|
+
* - Elapsed time display
|
|
9
|
+
* - Stall detection with color interpolation: green -> amber (15s) -> red (45s)
|
|
10
|
+
* - Phrase rotation from agent.json phrase pools
|
|
11
|
+
* - Pause/resume for log coordination
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ImperativeSpinner = void 0;
|
|
15
|
+
const phrases_1 = require("../../mind/phrases");
|
|
16
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
17
|
+
// Ring spinner frames (growing/shrinking — option #6)
|
|
18
|
+
const SNAKE_FRAMES = [
|
|
19
|
+
"\u2219", // ∙ (small dot)
|
|
20
|
+
"\u25CB", // ○ (white circle)
|
|
21
|
+
"\u25CE", // ◎ (bullseye)
|
|
22
|
+
"\u25CF", // ● (black circle)
|
|
23
|
+
"\u25CE", // ◎ (bullseye)
|
|
24
|
+
"\u25CB", // ○ (white circle)
|
|
25
|
+
];
|
|
26
|
+
// ANSI color helpers — RGB escape sequences
|
|
27
|
+
const RGB_GREEN = "\x1b[38;2;46;204;64m"; // #2ecc40 — ouroboros green
|
|
28
|
+
const RGB_AMBER = "\x1b[38;2;243;156;18m"; // #f39c12
|
|
29
|
+
const RGB_RED = "\x1b[38;2;231;76;60m"; // #e74c3c
|
|
30
|
+
const DIM = "\x1b[2m";
|
|
31
|
+
const RESET = "\x1b[0m";
|
|
32
|
+
function stallColor(seconds) {
|
|
33
|
+
if (seconds >= 45)
|
|
34
|
+
return RGB_RED;
|
|
35
|
+
if (seconds >= 15)
|
|
36
|
+
return RGB_AMBER;
|
|
37
|
+
return RGB_GREEN;
|
|
38
|
+
}
|
|
39
|
+
function formatTime(seconds) {
|
|
40
|
+
const h = Math.floor(seconds / 3600);
|
|
41
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
42
|
+
const s = seconds % 60;
|
|
43
|
+
if (h > 0)
|
|
44
|
+
return `${h}h${m}m`;
|
|
45
|
+
if (m > 0)
|
|
46
|
+
return `${m}m${s}s`;
|
|
47
|
+
return `${s}s`;
|
|
48
|
+
}
|
|
49
|
+
class ImperativeSpinner {
|
|
50
|
+
frames = SNAKE_FRAMES;
|
|
51
|
+
frameIdx = 0;
|
|
52
|
+
iv = null;
|
|
53
|
+
phraseIv = null;
|
|
54
|
+
msg;
|
|
55
|
+
phrases = null;
|
|
56
|
+
lastPhrase = "";
|
|
57
|
+
stopped = false;
|
|
58
|
+
startTime = 0;
|
|
59
|
+
paused = false;
|
|
60
|
+
constructor(message = "working", phrases) {
|
|
61
|
+
this.msg = message;
|
|
62
|
+
if (phrases && phrases.length > 0)
|
|
63
|
+
this.phrases = phrases;
|
|
64
|
+
}
|
|
65
|
+
start() {
|
|
66
|
+
this.stopped = false;
|
|
67
|
+
this.paused = false;
|
|
68
|
+
this.startTime = Date.now();
|
|
69
|
+
process.stderr.write("\r\x1b[K");
|
|
70
|
+
this.render();
|
|
71
|
+
this.iv = setInterval(() => this.render(), 120);
|
|
72
|
+
if (this.phrases) {
|
|
73
|
+
this.phraseIv = setInterval(() => this.rotatePhrase(), 1500);
|
|
74
|
+
}
|
|
75
|
+
(0, runtime_1.emitNervesEvent)({
|
|
76
|
+
component: "senses",
|
|
77
|
+
event: "senses.spinner_start",
|
|
78
|
+
message: "imperative spinner started",
|
|
79
|
+
meta: { phrase: this.msg },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
render() {
|
|
83
|
+
/* v8 ignore next -- race guard: timer callback fires after stop() @preserve */
|
|
84
|
+
if (this.stopped || this.paused)
|
|
85
|
+
return;
|
|
86
|
+
const elapsed = Math.floor((Date.now() - this.startTime) / 1000);
|
|
87
|
+
const color = stallColor(elapsed);
|
|
88
|
+
const timeStr = formatTime(elapsed);
|
|
89
|
+
const frame = this.frames[this.frameIdx % this.frames.length];
|
|
90
|
+
process.stderr.write(`\r\x1b[K${color}${frame} ${this.msg}${RESET} ${DIM}${timeStr}${RESET} `);
|
|
91
|
+
this.frameIdx++;
|
|
92
|
+
}
|
|
93
|
+
rotatePhrase() {
|
|
94
|
+
/* v8 ignore next -- race guard: timer callback fires after stop() @preserve */
|
|
95
|
+
if (this.stopped)
|
|
96
|
+
return;
|
|
97
|
+
const next = (0, phrases_1.pickPhrase)(this.phrases, this.lastPhrase);
|
|
98
|
+
this.lastPhrase = next;
|
|
99
|
+
this.msg = next;
|
|
100
|
+
}
|
|
101
|
+
/* v8 ignore start -- pause/resume: exercised at runtime via log sink coordination @preserve */
|
|
102
|
+
pause() {
|
|
103
|
+
if (this.stopped)
|
|
104
|
+
return;
|
|
105
|
+
this.paused = true;
|
|
106
|
+
process.stderr.write("\r\x1b[K");
|
|
107
|
+
}
|
|
108
|
+
resume() {
|
|
109
|
+
if (this.stopped)
|
|
110
|
+
return;
|
|
111
|
+
this.paused = false;
|
|
112
|
+
this.render();
|
|
113
|
+
}
|
|
114
|
+
/* v8 ignore stop */
|
|
115
|
+
stop(ok) {
|
|
116
|
+
this.stopped = true;
|
|
117
|
+
if (this.iv) {
|
|
118
|
+
clearInterval(this.iv);
|
|
119
|
+
this.iv = null;
|
|
120
|
+
}
|
|
121
|
+
if (this.phraseIv) {
|
|
122
|
+
clearInterval(this.phraseIv);
|
|
123
|
+
this.phraseIv = null;
|
|
124
|
+
}
|
|
125
|
+
process.stderr.write("\r\x1b[K");
|
|
126
|
+
/* v8 ignore next -- ok parameter currently unused by callers @preserve */
|
|
127
|
+
if (ok)
|
|
128
|
+
process.stderr.write(`\x1b[32m\u2713\x1b[0m ${ok}\n`);
|
|
129
|
+
}
|
|
130
|
+
fail(msg) {
|
|
131
|
+
this.stop();
|
|
132
|
+
process.stderr.write(`\x1b[31m\u2717\x1b[0m ${msg}\n`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.ImperativeSpinner = ImperativeSpinner;
|
|
@@ -0,0 +1,101 @@
|
|
|
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.EnhancedSpinner = EnhancedSpinner;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const ink_1 = require("ink");
|
|
40
|
+
/**
|
|
41
|
+
* Enhanced spinner with ouroboros/snake-themed animation.
|
|
42
|
+
*
|
|
43
|
+
* Features:
|
|
44
|
+
* - Snake-themed animation frames (serpent eating its own tail)
|
|
45
|
+
* - Elapsed time display
|
|
46
|
+
* - Color interpolation: normal -> amber (>15s) -> red (>45s)
|
|
47
|
+
* - Output token counter during streaming
|
|
48
|
+
* - Phrase rotation (driven externally via props)
|
|
49
|
+
* - Reduced-motion: static text, no animation
|
|
50
|
+
*/
|
|
51
|
+
// Ouroboros brand palette
|
|
52
|
+
const OURO_GREEN = "#2ecc40";
|
|
53
|
+
const COLOR_AMBER = "#f39c12";
|
|
54
|
+
const COLOR_RED = "#e74c3c";
|
|
55
|
+
// Ouroboros snake-themed spinner frames
|
|
56
|
+
// The serpent cycles through eating its own tail
|
|
57
|
+
const SNAKE_FRAMES = [
|
|
58
|
+
"\u{1F40D}", // snake emoji
|
|
59
|
+
"\u25E0", // upper half circle
|
|
60
|
+
"\u25D4", // circle with upper right quadrant
|
|
61
|
+
"\u25D1", // circle with right half
|
|
62
|
+
"\u25D5", // circle with all but upper left quadrant
|
|
63
|
+
"\u25E1", // lower half circle
|
|
64
|
+
"\u25CB", // white circle (tail swallowed)
|
|
65
|
+
"\u25CF", // black circle (digesting)
|
|
66
|
+
];
|
|
67
|
+
// Static indicator for reduced-motion
|
|
68
|
+
const STATIC_INDICATOR = "\u2022"; // bullet
|
|
69
|
+
function formatTime(seconds) {
|
|
70
|
+
const h = Math.floor(seconds / 3600);
|
|
71
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
72
|
+
const s = seconds % 60;
|
|
73
|
+
if (h > 0)
|
|
74
|
+
return `${h}h${m}m`;
|
|
75
|
+
if (m > 0)
|
|
76
|
+
return `${m}m${s}s`;
|
|
77
|
+
return `${s}s`;
|
|
78
|
+
}
|
|
79
|
+
function stallColor(seconds) {
|
|
80
|
+
if (seconds >= 45)
|
|
81
|
+
return COLOR_RED;
|
|
82
|
+
if (seconds >= 15)
|
|
83
|
+
return COLOR_AMBER;
|
|
84
|
+
return OURO_GREEN;
|
|
85
|
+
}
|
|
86
|
+
function EnhancedSpinner({ elapsedSeconds, phrase, outputTokens, reducedMotion, }) {
|
|
87
|
+
const [frame, setFrame] = (0, react_1.useState)(0);
|
|
88
|
+
// Animate spinner (unless reduced-motion)
|
|
89
|
+
react_1.default.useEffect(() => {
|
|
90
|
+
if (reducedMotion)
|
|
91
|
+
return;
|
|
92
|
+
const iv = setInterval(() => {
|
|
93
|
+
setFrame(f => (f + 1) % SNAKE_FRAMES.length);
|
|
94
|
+
}, 120);
|
|
95
|
+
return () => clearInterval(iv);
|
|
96
|
+
}, [reducedMotion]);
|
|
97
|
+
const color = stallColor(elapsedSeconds);
|
|
98
|
+
const timeStr = formatTime(elapsedSeconds);
|
|
99
|
+
const indicator = reducedMotion ? STATIC_INDICATOR : SNAKE_FRAMES[frame % SNAKE_FRAMES.length];
|
|
100
|
+
return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { children: [(0, jsx_runtime_1.jsxs)(ink_1.Text, { color: color, children: [indicator, " "] }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: color, children: phrase }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: ` ${timeStr}` }), outputTokens !== undefined ? ((0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: ` ${outputTokens} tok` })) : null] }));
|
|
101
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatusLine = StatusLine;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const ink_1 = require("ink");
|
|
6
|
+
/**
|
|
7
|
+
* Persistent bottom status bar for the CLI TUI.
|
|
8
|
+
*
|
|
9
|
+
* Shows: model + provider, token usage, session time, context utilization,
|
|
10
|
+
* active tool name.
|
|
11
|
+
*
|
|
12
|
+
* Information-dense single line. Context usage color-coded:
|
|
13
|
+
* green (<60%), amber (60-80%), red (>80%).
|
|
14
|
+
*
|
|
15
|
+
* Ouroboros-themed: teal/green palette.
|
|
16
|
+
*/
|
|
17
|
+
// Ouroboros brand palette
|
|
18
|
+
const OURO_TEAL = "#4ec9b0";
|
|
19
|
+
const COLOR_GREEN = "#2ecc40";
|
|
20
|
+
const COLOR_AMBER = "#f39c12";
|
|
21
|
+
const COLOR_RED = "#e74c3c";
|
|
22
|
+
function formatTokens(n) {
|
|
23
|
+
if (n >= 1000)
|
|
24
|
+
return `${Math.round(n / 1000)}K`;
|
|
25
|
+
return String(n);
|
|
26
|
+
}
|
|
27
|
+
function formatTime(seconds) {
|
|
28
|
+
const h = Math.floor(seconds / 3600);
|
|
29
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
30
|
+
const s = seconds % 60;
|
|
31
|
+
if (h > 0)
|
|
32
|
+
return `${h}h${m}m`;
|
|
33
|
+
if (m > 0)
|
|
34
|
+
return `${m}m${s}s`;
|
|
35
|
+
return `${s}s`;
|
|
36
|
+
}
|
|
37
|
+
function contextColor(pct) {
|
|
38
|
+
if (pct >= 80)
|
|
39
|
+
return COLOR_RED;
|
|
40
|
+
if (pct >= 60)
|
|
41
|
+
return COLOR_AMBER;
|
|
42
|
+
return COLOR_GREEN;
|
|
43
|
+
}
|
|
44
|
+
function StatusLine({ model, provider, tokensUsed, tokensTotal, elapsedSeconds, contextPercent, activeTool, }) {
|
|
45
|
+
const tokenPct = tokensTotal > 0 ? Math.round((tokensUsed / tokensTotal) * 100) : 0;
|
|
46
|
+
const ctxPct = contextPercent ?? tokenPct;
|
|
47
|
+
const ctxColor = contextColor(ctxPct);
|
|
48
|
+
const segments = [
|
|
49
|
+
`${model} ${provider}`,
|
|
50
|
+
`${formatTokens(tokensUsed)}/${formatTokens(tokensTotal)} (${tokenPct}%)`,
|
|
51
|
+
formatTime(elapsedSeconds),
|
|
52
|
+
];
|
|
53
|
+
if (contextPercent !== undefined) {
|
|
54
|
+
segments.push(`ctx: ${ctxPct}%`);
|
|
55
|
+
}
|
|
56
|
+
if (activeTool) {
|
|
57
|
+
segments.push(activeTool);
|
|
58
|
+
}
|
|
59
|
+
return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { color: OURO_TEAL, dimColor: true, children: segments[0] }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: " | " }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: segments[1] }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: " | " }), (0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: segments[2] }), contextPercent !== undefined ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: " | " }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: ctxColor, children: `ctx: ${ctxPct}%` })] })) : null, activeTool ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { dimColor: true, children: " | " }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: OURO_TEAL, children: `[${activeTool}]` })] })) : null] }));
|
|
60
|
+
}
|