@openrig/cli 0.4.8 → 0.5.0
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/daemon/assets/claude-statusline-context.cjs +40 -8
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +0 -0
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +7 -4
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +68 -17
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +2 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +2 -1
- package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +1 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts +36 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +203 -3
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +12 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +24 -2
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/domain/agent-activity-store.d.ts +1 -0
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +2 -2
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.d.ts +33 -0
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -0
- package/daemon/dist/domain/claude-activity-hooks.js +60 -0
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.d.ts +30 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/bundle-assembler.js +31 -1
- package/daemon/dist/domain/context-packs/bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts +69 -14
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.js +263 -48
- package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts +2 -2
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.js +11 -0
- package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
- package/daemon/dist/domain/context-packs/ref-safety.d.ts +11 -0
- package/daemon/dist/domain/context-packs/ref-safety.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/ref-safety.js +46 -0
- package/daemon/dist/domain/context-packs/ref-safety.js.map +1 -0
- package/daemon/dist/domain/context-packs/token-estimate.d.ts +3 -0
- package/daemon/dist/domain/context-packs/token-estimate.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/token-estimate.js +5 -0
- package/daemon/dist/domain/context-packs/token-estimate.js.map +1 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts +14 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.js +26 -2
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/daemon/dist/domain/provider/claude-usage-reader.d.ts +44 -0
- package/daemon/dist/domain/provider/claude-usage-reader.d.ts.map +1 -0
- package/daemon/dist/domain/provider/claude-usage-reader.js +112 -0
- package/daemon/dist/domain/provider/claude-usage-reader.js.map +1 -0
- package/daemon/dist/domain/provider/codex-auth-reader.d.ts +18 -0
- package/daemon/dist/domain/provider/codex-auth-reader.d.ts.map +1 -0
- package/daemon/dist/domain/provider/codex-auth-reader.js +64 -0
- package/daemon/dist/domain/provider/codex-auth-reader.js.map +1 -0
- package/daemon/dist/domain/provider/host-usage-rollup.d.ts +51 -0
- package/daemon/dist/domain/provider/host-usage-rollup.d.ts.map +1 -0
- package/daemon/dist/domain/provider/host-usage-rollup.js +162 -0
- package/daemon/dist/domain/provider/host-usage-rollup.js.map +1 -0
- package/daemon/dist/domain/provider/provider-collect.d.ts +22 -0
- package/daemon/dist/domain/provider/provider-collect.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-collect.js +74 -0
- package/daemon/dist/domain/provider/provider-collect.js.map +1 -0
- package/daemon/dist/domain/provider/provider-policy.d.ts +38 -0
- package/daemon/dist/domain/provider/provider-policy.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-policy.js +76 -0
- package/daemon/dist/domain/provider/provider-policy.js.map +1 -0
- package/daemon/dist/domain/provider/provider-read-model.d.ts +28 -0
- package/daemon/dist/domain/provider/provider-read-model.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-read-model.js +68 -0
- package/daemon/dist/domain/provider/provider-read-model.js.map +1 -0
- package/daemon/dist/domain/provider/provider-service-impl.d.ts +26 -0
- package/daemon/dist/domain/provider/provider-service-impl.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-service-impl.js +83 -0
- package/daemon/dist/domain/provider/provider-service-impl.js.map +1 -0
- package/daemon/dist/domain/provider/provider-service.d.ts +33 -0
- package/daemon/dist/domain/provider/provider-service.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-service.js +6 -0
- package/daemon/dist/domain/provider/provider-service.js.map +1 -0
- package/daemon/dist/domain/provider/provider-signals.d.ts +76 -0
- package/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-signals.js +144 -0
- package/daemon/dist/domain/provider/provider-signals.js.map +1 -0
- package/daemon/dist/domain/provider/provider-types.d.ts +101 -0
- package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-types.js +7 -0
- package/daemon/dist/domain/provider/provider-types.js.map +1 -0
- package/daemon/dist/domain/provider/reactive-tap.d.ts +29 -0
- package/daemon/dist/domain/provider/reactive-tap.d.ts.map +1 -0
- package/daemon/dist/domain/provider/reactive-tap.js +80 -0
- package/daemon/dist/domain/provider/reactive-tap.js.map +1 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts +7 -23
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +3 -61
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +11 -0
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +43 -1
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +2 -11
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/scope/attestation-lineage.generated.d.ts +14 -0
- package/daemon/dist/domain/scope/attestation-lineage.generated.d.ts.map +1 -0
- package/daemon/dist/domain/scope/attestation-lineage.generated.js +26 -0
- package/daemon/dist/domain/scope/attestation-lineage.generated.js.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts +13 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.js +50 -10
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
- package/daemon/dist/domain/startup-validation.js +18 -54
- package/daemon/dist/domain/startup-validation.js.map +1 -1
- package/daemon/dist/domain/stream-store.d.ts +4 -0
- package/daemon/dist/domain/stream-store.d.ts.map +1 -1
- package/daemon/dist/domain/stream-store.js +15 -2
- package/daemon/dist/domain/stream-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +2 -9
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +1 -1
- package/daemon/dist/routes/context-packs.d.ts.map +1 -1
- package/daemon/dist/routes/context-packs.js +157 -75
- package/daemon/dist/routes/context-packs.js.map +1 -1
- package/daemon/dist/routes/provider.d.ts +3 -0
- package/daemon/dist/routes/provider.d.ts.map +1 -0
- package/daemon/dist/routes/provider.js +124 -0
- package/daemon/dist/routes/provider.js.map +1 -0
- package/daemon/dist/routes/scope-approve.d.ts.map +1 -1
- package/daemon/dist/routes/scope-approve.js +6 -3
- package/daemon/dist/routes/scope-approve.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +4 -1
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/stream.d.ts.map +1 -1
- package/daemon/dist/routes/stream.js +71 -1
- package/daemon/dist/routes/stream.js.map +1 -1
- package/daemon/dist/server.d.ts +3 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +5 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +21 -11
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/developing.md +39 -0
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
- package/daemon/specs/agents/development/qa/agent.yaml +1 -1
- package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -1
- package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
- package/daemon/specs/agents/research/analyst/agent.yaml +1 -1
- package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -1
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/shared/agent.yaml +6 -0
- package/daemon/specs/agents/shared/runtime/claude-activity-hooks.json +4 -0
- package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +1 -0
- package/dist/bin-wrapper.d.ts.map +1 -1
- package/dist/bin-wrapper.js +7 -0
- package/dist/bin-wrapper.js.map +1 -1
- package/dist/build-info.js +3 -3
- package/dist/commands/agent-image.d.ts.map +1 -1
- package/dist/commands/agent-image.js +2 -1
- package/dist/commands/agent-image.js.map +1 -1
- package/dist/commands/broadcast.d.ts.map +1 -1
- package/dist/commands/broadcast.js +37 -2
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/context.d.ts +2 -7
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +391 -213
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/provider.d.ts +4 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +218 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/ps.d.ts +7 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +34 -4
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +38 -8
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +48 -4
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +70 -11
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/stream.d.ts +1 -0
- package/dist/commands/stream.d.ts.map +1 -1
- package/dist/commands/stream.js +93 -0
- package/dist/commands/stream.js.map +1 -1
- package/dist/commands/tui.d.ts +4 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +29 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/walk.d.ts +19 -0
- package/dist/commands/walk.d.ts.map +1 -0
- package/dist/commands/walk.js +139 -0
- package/dist/commands/walk.js.map +1 -0
- package/dist/context-resolve.d.ts +14 -0
- package/dist/context-resolve.d.ts.map +1 -0
- package/dist/context-resolve.js +40 -0
- package/dist/context-resolve.js.map +1 -0
- package/dist/front-door.d.ts +31 -0
- package/dist/front-door.d.ts.map +1 -0
- package/dist/front-door.js +114 -0
- package/dist/front-door.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/attestation-lineage.d.ts +14 -0
- package/dist/lib/scope/attestation-lineage.d.ts.map +1 -0
- package/dist/lib/scope/attestation-lineage.js +34 -0
- package/dist/lib/scope/attestation-lineage.js.map +1 -0
- package/package.json +4 -2
- package/tui/dist/daemon-client.d.ts +56 -0
- package/tui/dist/daemon-client.d.ts.map +1 -0
- package/tui/dist/daemon-client.js +99 -0
- package/tui/dist/daemon-client.js.map +1 -0
- package/tui/dist/demo-data.d.ts +3 -0
- package/tui/dist/demo-data.d.ts.map +1 -0
- package/tui/dist/demo-data.js +52 -0
- package/tui/dist/demo-data.js.map +1 -0
- package/tui/dist/detail.d.ts +34 -0
- package/tui/dist/detail.d.ts.map +1 -0
- package/tui/dist/detail.js +47 -0
- package/tui/dist/detail.js.map +1 -0
- package/tui/dist/grammar.d.ts +3 -0
- package/tui/dist/grammar.d.ts.map +1 -0
- package/tui/dist/grammar.js +66 -0
- package/tui/dist/grammar.js.map +1 -0
- package/tui/dist/hydrate.d.ts +78 -0
- package/tui/dist/hydrate.d.ts.map +1 -0
- package/tui/dist/hydrate.js +294 -0
- package/tui/dist/hydrate.js.map +1 -0
- package/tui/dist/index.d.ts +12 -0
- package/tui/dist/index.d.ts.map +1 -0
- package/tui/dist/index.js +12 -0
- package/tui/dist/index.js.map +1 -0
- package/tui/dist/input.d.ts +21 -0
- package/tui/dist/input.d.ts.map +1 -0
- package/tui/dist/input.js +128 -0
- package/tui/dist/input.js.map +1 -0
- package/tui/dist/live.d.ts +20 -0
- package/tui/dist/live.d.ts.map +1 -0
- package/tui/dist/live.js +67 -0
- package/tui/dist/live.js.map +1 -0
- package/tui/dist/main.d.ts +3 -0
- package/tui/dist/main.d.ts.map +1 -0
- package/tui/dist/main.js +184 -0
- package/tui/dist/main.js.map +1 -0
- package/tui/dist/motion.d.ts +13 -0
- package/tui/dist/motion.d.ts.map +1 -0
- package/tui/dist/motion.js +31 -0
- package/tui/dist/motion.js.map +1 -0
- package/tui/dist/navigator.d.ts +21 -0
- package/tui/dist/navigator.d.ts.map +1 -0
- package/tui/dist/navigator.js +168 -0
- package/tui/dist/navigator.js.map +1 -0
- package/tui/dist/refresh.d.ts +3 -0
- package/tui/dist/refresh.d.ts.map +1 -0
- package/tui/dist/refresh.js +9 -0
- package/tui/dist/refresh.js.map +1 -0
- package/tui/dist/render.d.ts +21 -0
- package/tui/dist/render.d.ts.map +1 -0
- package/tui/dist/render.js +807 -0
- package/tui/dist/render.js.map +1 -0
- package/tui/dist/sections.d.ts +4 -0
- package/tui/dist/sections.d.ts.map +1 -0
- package/tui/dist/sections.js +19 -0
- package/tui/dist/sections.js.map +1 -0
- package/tui/dist/socket-server.d.ts +24 -0
- package/tui/dist/socket-server.d.ts.map +1 -0
- package/tui/dist/socket-server.js +85 -0
- package/tui/dist/socket-server.js.map +1 -0
- package/tui/dist/state.d.ts +51 -0
- package/tui/dist/state.d.ts.map +1 -0
- package/tui/dist/state.js +480 -0
- package/tui/dist/state.js.map +1 -0
- package/tui/dist/stylize.d.ts +4 -0
- package/tui/dist/stylize.d.ts.map +1 -0
- package/tui/dist/stylize.js +248 -0
- package/tui/dist/stylize.js.map +1 -0
- package/tui/dist/theme.d.ts +19 -0
- package/tui/dist/theme.d.ts.map +1 -0
- package/tui/dist/theme.js +86 -0
- package/tui/dist/theme.js.map +1 -0
- package/tui/dist/topology/canvas.d.ts +43 -0
- package/tui/dist/topology/canvas.d.ts.map +1 -0
- package/tui/dist/topology/canvas.js +131 -0
- package/tui/dist/topology/canvas.js.map +1 -0
- package/tui/dist/topology/fixture.d.ts +4 -0
- package/tui/dist/topology/fixture.d.ts.map +1 -0
- package/tui/dist/topology/fixture.js +71 -0
- package/tui/dist/topology/fixture.js.map +1 -0
- package/tui/dist/topology/glyphs.d.ts +21 -0
- package/tui/dist/topology/glyphs.d.ts.map +1 -0
- package/tui/dist/topology/glyphs.js +49 -0
- package/tui/dist/topology/glyphs.js.map +1 -0
- package/tui/dist/topology/graph-types.d.ts +39 -0
- package/tui/dist/topology/graph-types.d.ts.map +1 -0
- package/tui/dist/topology/graph-types.js +2 -0
- package/tui/dist/topology/graph-types.js.map +1 -0
- package/tui/dist/topology/layout.d.ts +52 -0
- package/tui/dist/topology/layout.d.ts.map +1 -0
- package/tui/dist/topology/layout.js +118 -0
- package/tui/dist/topology/layout.js.map +1 -0
- package/tui/dist/topology/render-graph.d.ts +8 -0
- package/tui/dist/topology/render-graph.d.ts.map +1 -0
- package/tui/dist/topology/render-graph.js +20 -0
- package/tui/dist/topology/render-graph.js.map +1 -0
- package/tui/dist/topology/runtime-marks.d.ts +53 -0
- package/tui/dist/topology/runtime-marks.d.ts.map +1 -0
- package/tui/dist/topology/runtime-marks.js +185 -0
- package/tui/dist/topology/runtime-marks.js.map +1 -0
- package/tui/dist/topology/styles/braille.d.ts +5 -0
- package/tui/dist/topology/styles/braille.d.ts.map +1 -0
- package/tui/dist/topology/styles/braille.js +84 -0
- package/tui/dist/topology/styles/braille.js.map +1 -0
- package/tui/dist/topology/styles/hatchet.d.ts +41 -0
- package/tui/dist/topology/styles/hatchet.d.ts.map +1 -0
- package/tui/dist/topology/styles/hatchet.js +146 -0
- package/tui/dist/topology/styles/hatchet.js.map +1 -0
- package/tui/dist/types.d.ts +362 -0
- package/tui/dist/types.d.ts.map +1 -0
- package/tui/dist/types.js +6 -0
- package/tui/dist/types.js.map +1 -0
- package/ui/dist/assets/{index-DkNi0RT8.js → index-Dv5VaLCN.js} +135 -135
- package/ui/dist/index.html +1 -1
- package/dist/commands/context-pack.d.ts +0 -4
- package/dist/commands/context-pack.d.ts.map +0 -1
- package/dist/commands/context-pack.js +0 -357
- package/dist/commands/context-pack.js.map +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { specDetailArrowsScroll } from "./state.js";
|
|
2
|
+
import { StringDecoder } from "node:string_decoder";
|
|
3
|
+
function parseText(text, final) {
|
|
4
|
+
const events = [];
|
|
5
|
+
let i = 0;
|
|
6
|
+
while (i < text.length) {
|
|
7
|
+
const ch = text[i] ?? "";
|
|
8
|
+
if (ch === "\x1b") {
|
|
9
|
+
if (i + 1 >= text.length && !final)
|
|
10
|
+
break;
|
|
11
|
+
if (text[i + 1] === "[") {
|
|
12
|
+
if (i + 2 >= text.length && !final)
|
|
13
|
+
break;
|
|
14
|
+
const code = text[i + 2];
|
|
15
|
+
if (code === "<") {
|
|
16
|
+
const tail = text.slice(i);
|
|
17
|
+
const match = tail.match(/^\x1b\[<(\d+);(\d+);(\d+)([Mm])/);
|
|
18
|
+
if (match) {
|
|
19
|
+
const button = Number(match[1]);
|
|
20
|
+
if (match[4] === "M" && (button & 3) !== 3 && button < 32)
|
|
21
|
+
events.push({ type: "mouse", button: button & 3, x: Number(match[2]), y: Number(match[3]) });
|
|
22
|
+
i += match[0].length;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (!final && /^\x1b\[<[0-9;]*$/.test(tail))
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
if ((code === "5" || code === "6") && i + 3 >= text.length && !final)
|
|
29
|
+
break;
|
|
30
|
+
if ((code === "5" || code === "6") && text[i + 3] === "~") {
|
|
31
|
+
const down = code === "6";
|
|
32
|
+
events.push({
|
|
33
|
+
type: "key",
|
|
34
|
+
key: down ? "pagedown" : "pageup",
|
|
35
|
+
action: { type: "content-scroll", delta: down ? 10 : -10 },
|
|
36
|
+
});
|
|
37
|
+
i += 4;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const key = code === "A" ? "up" : code === "B" ? "down" : code === "C" ? "right" : code === "D" ? "left" : null;
|
|
41
|
+
if (key) {
|
|
42
|
+
events.push({
|
|
43
|
+
type: "key",
|
|
44
|
+
key,
|
|
45
|
+
action: { type: "select", delta: key === "down" ? 1 : key === "up" ? -1 : 0 },
|
|
46
|
+
});
|
|
47
|
+
i += 3;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
events.push({ type: "key", key: "escape" });
|
|
52
|
+
i += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (ch === "\r" || ch === "\n") {
|
|
56
|
+
events.push({ type: "key", key: "enter", action: { type: "activate" } });
|
|
57
|
+
i += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (ch === "\x7f" || ch === "\b") {
|
|
61
|
+
events.push({ type: "key", key: "backspace" });
|
|
62
|
+
i += 1;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (ch >= " ")
|
|
66
|
+
events.push({ type: "char", ch });
|
|
67
|
+
i += 1;
|
|
68
|
+
}
|
|
69
|
+
return { events, remainder: text.slice(i) };
|
|
70
|
+
}
|
|
71
|
+
/** Stateful terminal-stream decoder: retains split escape sequences and uses
|
|
72
|
+
* Node's StringDecoder so UTF-8 code points survive arbitrary Buffer chunks. */
|
|
73
|
+
export function createInputDecoder() {
|
|
74
|
+
const utf8 = new StringDecoder("utf8");
|
|
75
|
+
let pending = "";
|
|
76
|
+
return {
|
|
77
|
+
write(bytes) {
|
|
78
|
+
pending += typeof bytes === "string" ? bytes : utf8.write(bytes);
|
|
79
|
+
const parsed = parseText(pending, false);
|
|
80
|
+
pending = parsed.remainder;
|
|
81
|
+
return parsed.events;
|
|
82
|
+
},
|
|
83
|
+
flush() {
|
|
84
|
+
const parsed = parseText(pending, true);
|
|
85
|
+
pending = parsed.remainder;
|
|
86
|
+
return parsed.events;
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Whole-buffer convenience used by tests and synthetic adapters. */
|
|
91
|
+
export function decodeInput(bytes) {
|
|
92
|
+
const decoder = createInputDecoder();
|
|
93
|
+
return [...decoder.write(bytes), ...decoder.flush()];
|
|
94
|
+
}
|
|
95
|
+
/** Test/automation helper: the SGR bytes a terminal emits for a left click at (x, y). */
|
|
96
|
+
export function sgrClick(x, y) {
|
|
97
|
+
return `\x1b[<0;${x};${y}M\x1b[<0;${x};${y}m`;
|
|
98
|
+
}
|
|
99
|
+
/** Resolve directional/Enter keys against the currently rendered pane. */
|
|
100
|
+
export function resolveKeyAction(event, state, screen, explorerCount) {
|
|
101
|
+
if (event.key === "left")
|
|
102
|
+
return { type: "focus", pane: "explorer" };
|
|
103
|
+
if (event.key === "right")
|
|
104
|
+
return screen.contentTargets.length > 0 ? { type: "focus", pane: "content" } : null;
|
|
105
|
+
if (event.key === "up" || event.key === "down") {
|
|
106
|
+
const delta = event.key === "down" ? 1 : -1;
|
|
107
|
+
// Founder fix: on a scrollable spec detail the body is the meaningful
|
|
108
|
+
// surface — reflexive ↑↓ scroll it (one line per press), whichever pane
|
|
109
|
+
// holds focus. Non-scrolling spec details and every other view fall through
|
|
110
|
+
// to the unchanged explorer-move / content-select behavior.
|
|
111
|
+
if (specDetailArrowsScroll(state))
|
|
112
|
+
return { type: "content-scroll", delta };
|
|
113
|
+
return state.focusedPane === "content"
|
|
114
|
+
? { type: "content-select", delta }
|
|
115
|
+
: { type: "select", delta, rowCount: explorerCount };
|
|
116
|
+
}
|
|
117
|
+
if (event.key === "enter") {
|
|
118
|
+
return state.focusedPane === "content"
|
|
119
|
+
? (screen.contentTargets[state.contentSelection]?.action ?? { type: "error", message: "nothing selected in content" })
|
|
120
|
+
: { type: "activate" };
|
|
121
|
+
}
|
|
122
|
+
return "action" in event ? event.action : null;
|
|
123
|
+
}
|
|
124
|
+
export const MOUSE_ENABLE = "\x1b[?1000h\x1b[?1006h";
|
|
125
|
+
export const MOUSE_DISABLE = "\x1b[?1006l\x1b[?1000l";
|
|
126
|
+
export const ALT_SCREEN_ON = "\x1b[?1049h\x1b[?25l";
|
|
127
|
+
export const ALT_SCREEN_OFF = "\x1b[?25h\x1b[?1049l";
|
|
128
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FleetSnapshot, LoadState, RowFlash } from "./types.js";
|
|
2
|
+
/** one-shot flash window (ms) — matches renderScreen's flashActive window */
|
|
3
|
+
export declare const FLASH_WINDOW_MS = 600;
|
|
4
|
+
export interface LiveRefreshDeps {
|
|
5
|
+
hydrate: () => Promise<FleetSnapshot>;
|
|
6
|
+
/** draw callback — invoked when the load lifecycle or data changes, so the
|
|
7
|
+
* in-flight frame is actually DRAWN at start and cleared on settle */
|
|
8
|
+
onFrame: () => void;
|
|
9
|
+
now: () => number;
|
|
10
|
+
}
|
|
11
|
+
export interface LiveRefresh {
|
|
12
|
+
/** run one refresh (single-flight); NEVER rejects — a failed hydrate
|
|
13
|
+
* releases in-flight, keeps the prior snapshot, and the next call retries */
|
|
14
|
+
refresh: () => Promise<void>;
|
|
15
|
+
snapshot: () => FleetSnapshot;
|
|
16
|
+
load: () => LoadState;
|
|
17
|
+
flashes: () => RowFlash[];
|
|
18
|
+
}
|
|
19
|
+
export declare function createLiveRefresh(deps: LiveRefreshDeps): LiveRefresh;
|
|
20
|
+
//# sourceMappingURL=live.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErE,6EAA6E;AAC7E,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC;0EACsE;IACtE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B;iFAC6E;IAC7E,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,aAAa,CAAC;IAC9B,IAAI,EAAE,MAAM,SAAS,CAAC;IACtB,OAAO,EAAE,MAAM,QAAQ,EAAE,CAAC;CAC3B;AAcD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAoCpE"}
|
package/tui/dist/live.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// S19 ROUND-5 (guard NOT-CLEAR at b92c2a58): the refresh OWNER — the one
|
|
2
|
+
// component that knows when a hydrate is actually IN FLIGHT and which seat
|
|
3
|
+
// produced fresh PANE OUTPUT between refreshes. renderScreen stays pure and
|
|
4
|
+
// consumes this state via RenderOptions; main.ts wires it to the terminal.
|
|
5
|
+
//
|
|
6
|
+
// Event identity (finding 2): the served `terminalActive` derives from tmux
|
|
7
|
+
// `#{window_activity}` (SeatActivityService), a timestamp tmux advances ONLY
|
|
8
|
+
// when the window receives output. A false→true transition is therefore
|
|
9
|
+
// impossible without real new pane output — an honest onset-after-silence
|
|
10
|
+
// event with zero false positives. Known substrate limit (flagged to guard):
|
|
11
|
+
// the projection serves only the derived boolean, not the raw timestamp, so
|
|
12
|
+
// output arriving while a seat is ALREADY active cannot re-trigger; onsets
|
|
13
|
+
// after the silence window are the observable events.
|
|
14
|
+
import { singleFlight } from "./refresh.js";
|
|
15
|
+
import { emptySnapshot } from "./state.js";
|
|
16
|
+
/** one-shot flash window (ms) — matches renderScreen's flashActive window */
|
|
17
|
+
export const FLASH_WINDOW_MS = 600;
|
|
18
|
+
/** walk the snapshot topology and key every agent's served pane-activity
|
|
19
|
+
* boolean by the SAME stable key its explorer row carries */
|
|
20
|
+
function paneActivity(snap) {
|
|
21
|
+
const map = new Map();
|
|
22
|
+
for (const host of snap.hosts)
|
|
23
|
+
for (const rig of host.rigs)
|
|
24
|
+
for (const pod of rig.pods)
|
|
25
|
+
for (const agent of pod.agents)
|
|
26
|
+
map.set(`agent:${host.name}/${rig.name}/${pod.name}/${agent.name}`, agent.paneActive);
|
|
27
|
+
return map;
|
|
28
|
+
}
|
|
29
|
+
export function createLiveRefresh(deps) {
|
|
30
|
+
let snapshot = emptySnapshot();
|
|
31
|
+
const load = { inFlight: false, settled: false };
|
|
32
|
+
let flashes = [];
|
|
33
|
+
const refresh = singleFlight(async () => {
|
|
34
|
+
load.inFlight = true;
|
|
35
|
+
deps.onFrame();
|
|
36
|
+
try {
|
|
37
|
+
const next = await deps.hydrate();
|
|
38
|
+
if (load.settled) {
|
|
39
|
+
// first hydrate is a LOAD, not fresh output — no flash; null (no
|
|
40
|
+
// signal) never flashes either: only a served false→true transition
|
|
41
|
+
const prev = paneActivity(snapshot);
|
|
42
|
+
const now = deps.now();
|
|
43
|
+
flashes = flashes.filter((f) => now - f.at < FLASH_WINDOW_MS);
|
|
44
|
+
for (const [key, active] of paneActivity(next))
|
|
45
|
+
if (active === true && prev.get(key) === false)
|
|
46
|
+
flashes.push({ key, at: now });
|
|
47
|
+
}
|
|
48
|
+
snapshot = next;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// rejection-release: the prior snapshot stays (nothing fabricated),
|
|
52
|
+
// in-flight clears below, and the next scheduled refresh retries
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
load.inFlight = false;
|
|
56
|
+
load.settled = true;
|
|
57
|
+
deps.onFrame();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
refresh,
|
|
62
|
+
snapshot: () => snapshot,
|
|
63
|
+
load: () => ({ ...load }),
|
|
64
|
+
flashes: () => [...flashes],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,wEAAwE;AACxE,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,sDAAsD;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAmBnC;6DAC6D;AAC7D,SAAS,YAAY,CAAC,IAAmB;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;YACzB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI;gBACxB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM;oBAC5B,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5D,IAAI,OAAO,GAAe,EAAE,CAAC;IAE7B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,iEAAiE;gBACjE,oEAAoE;gBACpE,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC;gBAC9D,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;oBAC5C,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;wBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,iEAAiE;QACnE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ;QACxB,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
package/tui/dist/main.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Entry: wires the four input adapters (command bar / keyboard / mouse /
|
|
3
|
+
// control socket) onto ONE instance-scoped view-state (PIN 1). tmux send-keys
|
|
4
|
+
// against this process is the drivability floor and needs no adapter at all —
|
|
5
|
+
// keystrokes ARE the keyboard adapter.
|
|
6
|
+
//
|
|
7
|
+
// openrig-tui [--instance <id>] [--socket <path>] [--url <daemon>] [--demo]
|
|
8
|
+
import { createViewState, computeExplorerRows, emptySnapshot } from "./state.js";
|
|
9
|
+
import { parseCommand } from "./grammar.js";
|
|
10
|
+
import { createInputDecoder, resolveKeyAction, MOUSE_ENABLE, MOUSE_DISABLE, ALT_SCREEN_ON, ALT_SCREEN_OFF } from "./input.js";
|
|
11
|
+
import { renderScreen } from "./render.js";
|
|
12
|
+
import { createStyle, detectColorMode } from "./theme.js";
|
|
13
|
+
import { stylizeLines } from "./stylize.js";
|
|
14
|
+
import { createControlSocket, defaultSocketPath } from "./socket-server.js";
|
|
15
|
+
import { demoSnapshot } from "./demo-data.js";
|
|
16
|
+
import { DaemonClient, launchNodeNotice } from "./daemon-client.js";
|
|
17
|
+
import { hydrateSnapshot } from "./hydrate.js";
|
|
18
|
+
import { createLiveRefresh } from "./live.js";
|
|
19
|
+
const REFRESH_MS = 5000;
|
|
20
|
+
function argOf(args, flag) {
|
|
21
|
+
const i = args.indexOf(flag);
|
|
22
|
+
return i >= 0 ? args[i + 1] : undefined;
|
|
23
|
+
}
|
|
24
|
+
async function run() {
|
|
25
|
+
const args = process.argv.slice(2);
|
|
26
|
+
const instanceId = argOf(args, "--instance") ?? "tui-1";
|
|
27
|
+
const demo = args.includes("--demo");
|
|
28
|
+
// --demo renders the labeled fixture; otherwise the §4.A reads hydrate the
|
|
29
|
+
// snapshot (honest-empty until the first read answers; failed reads surface
|
|
30
|
+
// as named readErrors in the status line, never fabricated content).
|
|
31
|
+
let snapshot = demo ? demoSnapshot() : emptySnapshot();
|
|
32
|
+
const view = createViewState({ instanceId, getSnapshot: () => snapshot });
|
|
33
|
+
const client = demo ? null : new DaemonClient({ baseUrl: argOf(args, "--url") });
|
|
34
|
+
let inputLine = "";
|
|
35
|
+
let lastScreen = null;
|
|
36
|
+
const inputDecoder = createInputDecoder();
|
|
37
|
+
const style = createStyle(args.includes("--no-color") ? "none" : detectColorMode());
|
|
38
|
+
// S19 round-5 (guard): the refresh OWNER (live.ts) carries the honest load
|
|
39
|
+
// lifecycle and the per-seat fresh-pane-output events; renderScreen stays
|
|
40
|
+
// pure and takes the clock + owner state as inputs. motionTimer keeps
|
|
41
|
+
// redrawing ONLY while the frame reports live motion (spinner or flash).
|
|
42
|
+
const reviewCache = new Map();
|
|
43
|
+
const live = client
|
|
44
|
+
? createLiveRefresh({ hydrate: () => hydrateSnapshot(client, reviewCache), onFrame: () => draw(), now: () => Date.now() })
|
|
45
|
+
: null;
|
|
46
|
+
let motionTimer = null;
|
|
47
|
+
function draw() {
|
|
48
|
+
const cols = process.stdout.columns ?? 120;
|
|
49
|
+
const rows = process.stdout.rows ?? 32;
|
|
50
|
+
const nowMs = Date.now();
|
|
51
|
+
if (live)
|
|
52
|
+
snapshot = live.snapshot();
|
|
53
|
+
const opts = { cols, rows, nowMs, colorMode: style.mode, ...(live ? { load: live.load(), rowFlashes: live.flashes() } : {}) };
|
|
54
|
+
lastScreen = renderScreen(view.get(), snapshot, opts, inputLine);
|
|
55
|
+
if (view.get().contentMaxOffset !== lastScreen.contentMaxOffset || view.get().contentTargetCount !== lastScreen.contentTargets.length) {
|
|
56
|
+
view.dispatch({ type: "layout", contentMaxOffset: lastScreen.contentMaxOffset, contentTargetCount: lastScreen.contentTargets.length });
|
|
57
|
+
lastScreen = renderScreen(view.get(), snapshot, opts, inputLine);
|
|
58
|
+
}
|
|
59
|
+
// styling is a zero-width post-pass over the tested plain layer — the
|
|
60
|
+
// hitMap coordinates always match what is on screen
|
|
61
|
+
process.stdout.write("\x1b[H" + stylizeLines(lastScreen, style).map((l) => "\x1b[2K" + l).join("\r\n"));
|
|
62
|
+
if (motionTimer)
|
|
63
|
+
clearTimeout(motionTimer);
|
|
64
|
+
motionTimer = lastScreen.motionActive ? setTimeout(draw, 120) : null;
|
|
65
|
+
}
|
|
66
|
+
const socketPath = argOf(args, "--socket") ?? defaultSocketPath(instanceId);
|
|
67
|
+
const socket = await createControlSocket({ socketPath, view, onMutation: draw });
|
|
68
|
+
let refreshTimer = null;
|
|
69
|
+
// Acts are drive-structure daemon WRITES (BR-8/BR-9) — executed here against
|
|
70
|
+
// the two existing contracts; the view-state is only told the outcome.
|
|
71
|
+
async function executeAct(action) {
|
|
72
|
+
if (!client) {
|
|
73
|
+
view.dispatch({ type: "notice", message: "demo mode: actions disabled" });
|
|
74
|
+
draw();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
if (action.act === "open-terminal") {
|
|
79
|
+
const result = await client.openTerminal(action.view);
|
|
80
|
+
view.dispatch({
|
|
81
|
+
type: "notice",
|
|
82
|
+
message: `terminal opened: ${action.view} (${result.opened.length} opened, ${result.absent.length} absent, ${result.degraded.length} degraded)`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const result = await client.launchNode(action.rigId, action.agent);
|
|
87
|
+
view.dispatch({ type: "notice", message: launchNodeNotice(action.agent, result) });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
view.dispatch({ type: "notice", message: err instanceof Error ? err.message : String(err) });
|
|
92
|
+
}
|
|
93
|
+
draw();
|
|
94
|
+
}
|
|
95
|
+
function perform(action) {
|
|
96
|
+
if (action.type === "act") {
|
|
97
|
+
view.dispatch({ type: "notice", message: `${action.act}…` });
|
|
98
|
+
void executeAct(action);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
view.dispatch(action);
|
|
102
|
+
}
|
|
103
|
+
async function shutdown() {
|
|
104
|
+
if (refreshTimer)
|
|
105
|
+
clearInterval(refreshTimer);
|
|
106
|
+
if (motionTimer)
|
|
107
|
+
clearTimeout(motionTimer);
|
|
108
|
+
process.stdout.write(MOUSE_DISABLE + ALT_SCREEN_OFF);
|
|
109
|
+
await socket.close();
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
process.on("SIGINT", () => void shutdown());
|
|
113
|
+
process.on("SIGTERM", () => void shutdown());
|
|
114
|
+
if (process.stdin.isTTY)
|
|
115
|
+
process.stdin.setRawMode(true);
|
|
116
|
+
function handleInput(events) {
|
|
117
|
+
for (const ev of events) {
|
|
118
|
+
if (ev.type === "char") {
|
|
119
|
+
if (ev.ch === "q" && inputLine === "") {
|
|
120
|
+
void shutdown();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (ev.ch === "f" && inputLine === "") {
|
|
124
|
+
view.dispatch({ type: "footer" });
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
inputLine += ev.ch;
|
|
128
|
+
}
|
|
129
|
+
else if (ev.type === "key" && ev.key === "backspace") {
|
|
130
|
+
inputLine = inputLine.slice(0, -1);
|
|
131
|
+
}
|
|
132
|
+
else if (ev.type === "key" && ev.key === "escape") {
|
|
133
|
+
inputLine = "";
|
|
134
|
+
}
|
|
135
|
+
else if (ev.type === "key" && ev.key === "enter") {
|
|
136
|
+
if (inputLine !== "") {
|
|
137
|
+
perform(parseCommand(inputLine, view.get().sections));
|
|
138
|
+
inputLine = "";
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
if (lastScreen) {
|
|
142
|
+
const action = resolveKeyAction(ev, view.get(), lastScreen, computeExplorerRows(view.get(), snapshot).length);
|
|
143
|
+
if (action)
|
|
144
|
+
perform(action);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (ev.type === "key" && "action" in ev) {
|
|
149
|
+
if (lastScreen) {
|
|
150
|
+
const action = resolveKeyAction(ev, view.get(), lastScreen, computeExplorerRows(view.get(), snapshot).length);
|
|
151
|
+
if (action)
|
|
152
|
+
perform(action);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (ev.type === "mouse" && lastScreen) {
|
|
156
|
+
const hit = lastScreen.hitMap.find((h) => h.y === ev.y && ev.x >= h.x1 && ev.x <= h.x2);
|
|
157
|
+
if (hit)
|
|
158
|
+
perform(hit.action);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
draw();
|
|
162
|
+
}
|
|
163
|
+
process.stdin.on("data", (bytes) => {
|
|
164
|
+
handleInput(inputDecoder.write(bytes));
|
|
165
|
+
});
|
|
166
|
+
process.stdin.on("end", () => {
|
|
167
|
+
handleInput(inputDecoder.flush());
|
|
168
|
+
});
|
|
169
|
+
process.stdout.write(ALT_SCREEN_ON + MOUSE_ENABLE);
|
|
170
|
+
// round-5 (guard): the FIRST terminal frame draws the honest in-flight
|
|
171
|
+
// state — the refresh starts after entering the alt screen, never before,
|
|
172
|
+
// so loading is VISIBLE instead of awaited behind a blank terminal
|
|
173
|
+
draw();
|
|
174
|
+
if (live) {
|
|
175
|
+
void live.refresh();
|
|
176
|
+
refreshTimer = setInterval(() => void live.refresh(), REFRESH_MS);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
run().catch((err) => {
|
|
180
|
+
process.stdout.write(MOUSE_DISABLE + ALT_SCREEN_OFF);
|
|
181
|
+
console.error(err instanceof Error ? err.message : err);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ColorMode } from "./theme.js";
|
|
2
|
+
/** the env kill-switch — any of the accepted flags disables ALL motion */
|
|
3
|
+
export declare function reducedMotion(env?: NodeJS.ProcessEnv): boolean;
|
|
4
|
+
/** loading spinner: braille frames (truecolor/256), line frames at 16-color,
|
|
5
|
+
* a STATIC dot under reduced motion — the state is still shown, honestly */
|
|
6
|
+
export declare function spinnerFrame(tick: number, mode: ColorMode, reduced: boolean): string;
|
|
7
|
+
/** tmux-style ONE-SHOT row flash: active only within the window; never under
|
|
8
|
+
* reduced motion */
|
|
9
|
+
export declare function flashActive(sinceMs: number, nowMs: number, durationMs?: number, reduced?: boolean): boolean;
|
|
10
|
+
/** quiet DETERMINATE block-bar — REAL fractions only; null/NaN renders
|
|
11
|
+
* nothing (a bar is a claim of measured progress, never fabricated) */
|
|
12
|
+
export declare function barCells(fraction: number | null, width: number): string;
|
|
13
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE3E;AAKD;4EAC4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAIpF;AAED;oBACoB;AACpB,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,SAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAGtG;AAED;uEACuE;AACvE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** the env kill-switch — any of the accepted flags disables ALL motion */
|
|
2
|
+
export function reducedMotion(env = process.env) {
|
|
3
|
+
return env["OPENRIG_REDUCED_MOTION"] === "1" || env["REDUCED_MOTION"] === "1" || env["NO_MOTION"] === "1";
|
|
4
|
+
}
|
|
5
|
+
const BRAILLE_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
6
|
+
const LINE_FRAMES = ["|", "/", "-", "\\"];
|
|
7
|
+
/** loading spinner: braille frames (truecolor/256), line frames at 16-color,
|
|
8
|
+
* a STATIC dot under reduced motion — the state is still shown, honestly */
|
|
9
|
+
export function spinnerFrame(tick, mode, reduced) {
|
|
10
|
+
if (reduced)
|
|
11
|
+
return "·";
|
|
12
|
+
const frames = mode === "16" || mode === "none" ? LINE_FRAMES : BRAILLE_FRAMES;
|
|
13
|
+
return frames[((tick % frames.length) + frames.length) % frames.length];
|
|
14
|
+
}
|
|
15
|
+
/** tmux-style ONE-SHOT row flash: active only within the window; never under
|
|
16
|
+
* reduced motion */
|
|
17
|
+
export function flashActive(sinceMs, nowMs, durationMs = 600, reduced = false) {
|
|
18
|
+
if (reduced)
|
|
19
|
+
return false;
|
|
20
|
+
return nowMs >= sinceMs && nowMs - sinceMs < durationMs;
|
|
21
|
+
}
|
|
22
|
+
/** quiet DETERMINATE block-bar — REAL fractions only; null/NaN renders
|
|
23
|
+
* nothing (a bar is a claim of measured progress, never fabricated) */
|
|
24
|
+
export function barCells(fraction, width) {
|
|
25
|
+
if (fraction == null || Number.isNaN(fraction))
|
|
26
|
+
return "";
|
|
27
|
+
const clamped = Math.min(Math.max(fraction, 0), 1);
|
|
28
|
+
const filled = Math.round(clamped * width);
|
|
29
|
+
return "█".repeat(filled) + "░".repeat(width - filled);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAOA,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO,GAAG,CAAC,wBAAwB,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC;AAC5G,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1E,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAE1C;4EAC4E;AAC5E,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAe,EAAE,OAAgB;IAC1E,IAAI,OAAO;QAAE,OAAO,GAAG,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;IAC/E,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC;AAC3E,CAAC;AAED;oBACoB;AACpB,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,KAAa,EAAE,UAAU,GAAG,GAAG,EAAE,OAAO,GAAG,KAAK;IAC3F,IAAI,OAAO;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,KAAK,IAAI,OAAO,IAAI,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;AAC1D,CAAC;AAED;uEACuE;AACvE,MAAM,UAAU,QAAQ,CAAC,QAAuB,EAAE,KAAa;IAC7D,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ExplorerRow, FleetSnapshot } from "./types.js";
|
|
2
|
+
import type { MarkSeg } from "./topology/runtime-marks.js";
|
|
3
|
+
export interface NavigatorMeta {
|
|
4
|
+
/** column (within the DISPLAY label) where this run begins */
|
|
5
|
+
start: number;
|
|
6
|
+
/** token segments — a run's own colors (status role; formerly the mark's
|
|
7
|
+
* bg channel) survive the paint layer through this channel (guard finding 2;
|
|
8
|
+
* round-4: rows may carry SEVERAL runs — status badge + right meta) */
|
|
9
|
+
segs: MarkSeg[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Display rows for the explorer pane — labels plus the seg-run channel
|
|
13
|
+
* (same order/length as `rows`; each row carries 0..n paint runs).
|
|
14
|
+
*/
|
|
15
|
+
export declare function navigatorDisplay(rows: ExplorerRow[], snap: FleetSnapshot, width: number): {
|
|
16
|
+
labels: string[];
|
|
17
|
+
metas: Array<NavigatorMeta[] | null>;
|
|
18
|
+
};
|
|
19
|
+
/** compat view (tests/callers that only need labels) */
|
|
20
|
+
export declare function navigatorLabels(rows: ExplorerRow[], snap: FleetSnapshot, width: number): string[];
|
|
21
|
+
//# sourceMappingURL=navigator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigator.d.ts","sourceRoot":"","sources":["../src/navigator.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAY,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AA+D3D,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd;;2EAEuE;IACvE,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AA6BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EAAE,EACnB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,GACZ;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAA;CAAE,CAI5D;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjG"}
|