@polderlabs/bizar-omp 0.6.2 → 0.6.4
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 +54 -0
- package/dist/cli/agents.d.ts +1 -0
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +11 -0
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/omb-commands.d.ts +30 -0
- package/dist/cli/omb-commands.d.ts.map +1 -0
- package/dist/cli/omb-commands.js +109 -0
- package/dist/cli/omb-commands.js.map +1 -0
- package/dist/cli/omb-daemon.d.ts +1 -0
- package/dist/cli/omb-daemon.d.ts.map +1 -1
- package/dist/cli/omb-daemon.js +15 -1
- package/dist/cli/omb-daemon.js.map +1 -1
- package/dist/cli/omb-dashboard.d.ts +1 -1
- package/dist/cli/omb-dashboard.d.ts.map +1 -1
- package/dist/cli/omb-dashboard.js +2 -1
- package/dist/cli/omb-dashboard.js.map +1 -1
- package/dist/cli/omb-runtime.d.ts +42 -0
- package/dist/cli/omb-runtime.d.ts.map +1 -0
- package/dist/cli/omb-runtime.js +507 -0
- package/dist/cli/omb-runtime.js.map +1 -0
- package/dist/cli/omb-tray.d.ts +3 -0
- package/dist/cli/omb-tray.d.ts.map +1 -0
- package/dist/cli/omb-tray.js +44 -0
- package/dist/cli/omb-tray.js.map +1 -0
- package/dist/cli/omb.js +8 -33
- package/dist/cli/omb.js.map +1 -1
- package/dist/omp/daemon.d.ts +1 -0
- package/dist/omp/daemon.d.ts.map +1 -1
- package/dist/omp/daemon.js +1 -1
- package/dist/omp/daemon.js.map +1 -1
- package/dist/omp/omb-sessions.d.ts +24 -0
- package/dist/omp/omb-sessions.d.ts.map +1 -1
- package/dist/omp/omb-sessions.js +30 -12
- package/dist/omp/omb-sessions.js.map +1 -1
- package/dist/omp/tmux.d.ts +18 -0
- package/dist/omp/tmux.d.ts.map +1 -1
- package/dist/omp/tmux.js +131 -4
- package/dist/omp/tmux.js.map +1 -1
- package/dist/omp/tray.d.ts +2 -0
- package/dist/omp/tray.d.ts.map +1 -1
- package/dist/omp/tray.js +30 -4
- package/dist/omp/tray.js.map +1 -1
- package/dist/src/cli/agents-ink.d.ts +25 -0
- package/dist/src/cli/agents-ink.js +517 -0
- package/dist/src/cli/agents-ink.js.map +1 -0
- package/dist/src/cli/agents.d.ts +14 -0
- package/dist/src/cli/agents.js +197 -0
- package/dist/src/cli/agents.js.map +1 -0
- package/dist/src/cli/directory-selector.d.ts +60 -0
- package/dist/src/cli/directory-selector.js +208 -0
- package/dist/src/cli/directory-selector.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +41 -0
- package/dist/src/cli/doctor.js +31 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/install.d.ts +129 -0
- package/dist/src/cli/install.js +164 -0
- package/dist/src/cli/install.js.map +1 -0
- package/dist/src/cli/main.d.ts +2 -0
- package/dist/src/cli/main.js +117 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/migrate.d.ts +18 -0
- package/dist/src/cli/migrate.js +14 -0
- package/dist/src/cli/migrate.js.map +1 -0
- package/dist/src/cli/omb-commands.d.ts +29 -0
- package/dist/src/cli/omb-commands.js +107 -0
- package/dist/src/cli/omb-commands.js.map +1 -0
- package/dist/src/cli/omb-daemon.d.ts +2 -0
- package/dist/src/cli/omb-daemon.js +135 -0
- package/dist/src/cli/omb-daemon.js.map +1 -0
- package/dist/src/cli/omb-dashboard.d.ts +12 -0
- package/dist/src/cli/omb-dashboard.js +113 -0
- package/dist/src/cli/omb-dashboard.js.map +1 -0
- package/dist/src/cli/omb-invocation.d.ts +8 -0
- package/dist/src/cli/omb-invocation.js +41 -0
- package/dist/src/cli/omb-invocation.js.map +1 -0
- package/dist/src/cli/omb-runtime.d.ts +41 -0
- package/dist/src/cli/omb-runtime.js +371 -0
- package/dist/src/cli/omb-runtime.js.map +1 -0
- package/dist/src/cli/omb-tray.d.ts +2 -0
- package/dist/src/cli/omb-tray.js +38 -0
- package/dist/src/cli/omb-tray.js.map +1 -0
- package/dist/src/cli/omb.d.ts +2 -0
- package/dist/src/cli/omb.js +31 -0
- package/dist/src/cli/omb.js.map +1 -0
- package/dist/src/cli/omp-theme.d.ts +17 -0
- package/dist/src/cli/omp-theme.js +22 -0
- package/dist/src/cli/omp-theme.js.map +1 -0
- package/dist/src/cli/process.d.ts +6 -0
- package/dist/src/cli/process.js +54 -0
- package/dist/src/cli/process.js.map +1 -0
- package/dist/src/cli/run.d.ts +2 -0
- package/dist/src/cli/run.js +5 -0
- package/dist/src/cli/run.js.map +1 -0
- package/dist/src/cli/setup-ui.d.ts +37 -0
- package/dist/src/cli/setup-ui.js +90 -0
- package/dist/src/cli/setup-ui.js.map +1 -0
- package/dist/src/core/acceptance.d.ts +32 -0
- package/dist/src/core/acceptance.js +87 -0
- package/dist/src/core/acceptance.js.map +1 -0
- package/dist/src/core/errors.d.ts +20 -0
- package/dist/src/core/errors.js +30 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/evidence.d.ts +10 -0
- package/dist/src/core/evidence.js +35 -0
- package/dist/src/core/evidence.js.map +1 -0
- package/dist/src/core/policies.d.ts +10 -0
- package/dist/src/core/policies.js +60 -0
- package/dist/src/core/policies.js.map +1 -0
- package/dist/src/core/recovery.d.ts +6 -0
- package/dist/src/core/recovery.js +56 -0
- package/dist/src/core/recovery.js.map +1 -0
- package/dist/src/core/transitions.d.ts +13 -0
- package/dist/src/core/transitions.js +59 -0
- package/dist/src/core/transitions.js.map +1 -0
- package/dist/src/core/types.d.ts +256 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/extension.d.ts +60 -0
- package/dist/src/extension.js +538 -0
- package/dist/src/extension.js.map +1 -0
- package/dist/src/index.d.ts +29 -0
- package/dist/src/index.js +30 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/omp/autonomous-settings.d.ts +14 -0
- package/dist/src/omp/autonomous-settings.js +65 -0
- package/dist/src/omp/autonomous-settings.js.map +1 -0
- package/dist/src/omp/capabilities.d.ts +23 -0
- package/dist/src/omp/capabilities.js +6 -0
- package/dist/src/omp/capabilities.js.map +1 -0
- package/dist/src/omp/compatibility.d.ts +30 -0
- package/dist/src/omp/compatibility.js +34 -0
- package/dist/src/omp/compatibility.js.map +1 -0
- package/dist/src/omp/completion.d.ts +7 -0
- package/dist/src/omp/completion.js +10 -0
- package/dist/src/omp/completion.js.map +1 -0
- package/dist/src/omp/config.d.ts +10 -0
- package/dist/src/omp/config.js +14 -0
- package/dist/src/omp/config.js.map +1 -0
- package/dist/src/omp/context.d.ts +15 -0
- package/dist/src/omp/context.js +3 -0
- package/dist/src/omp/context.js.map +1 -0
- package/dist/src/omp/daemon-service.d.ts +25 -0
- package/dist/src/omp/daemon-service.js +483 -0
- package/dist/src/omp/daemon-service.js.map +1 -0
- package/dist/src/omp/daemon.d.ts +48 -0
- package/dist/src/omp/daemon.js +194 -0
- package/dist/src/omp/daemon.js.map +1 -0
- package/dist/src/omp/dashboard-html.d.ts +3 -0
- package/dist/src/omp/dashboard-html.js +419 -0
- package/dist/src/omp/dashboard-html.js.map +1 -0
- package/dist/src/omp/dispatch-admission.d.ts +2 -0
- package/dist/src/omp/dispatch-admission.js +12 -0
- package/dist/src/omp/dispatch-admission.js.map +1 -0
- package/dist/src/omp/integration-recovery.d.ts +10 -0
- package/dist/src/omp/integration-recovery.js +18 -0
- package/dist/src/omp/integration-recovery.js.map +1 -0
- package/dist/src/omp/isolation-policy.d.ts +14 -0
- package/dist/src/omp/isolation-policy.js +9 -0
- package/dist/src/omp/isolation-policy.js.map +1 -0
- package/dist/src/omp/lifecycle.d.ts +14 -0
- package/dist/src/omp/lifecycle.js +14 -0
- package/dist/src/omp/lifecycle.js.map +1 -0
- package/dist/src/omp/memory.d.ts +16 -0
- package/dist/src/omp/memory.js +4 -0
- package/dist/src/omp/memory.js.map +1 -0
- package/dist/src/omp/model-role-assignment.d.ts +296 -0
- package/dist/src/omp/model-role-assignment.js +559 -0
- package/dist/src/omp/model-role-assignment.js.map +1 -0
- package/dist/src/omp/model-roles.d.ts +19 -0
- package/dist/src/omp/model-roles.js +6 -0
- package/dist/src/omp/model-roles.js.map +1 -0
- package/dist/src/omp/omb-sessions.d.ts +122 -0
- package/dist/src/omp/omb-sessions.js +512 -0
- package/dist/src/omp/omb-sessions.js.map +1 -0
- package/dist/src/omp/omb-settings.d.ts +35 -0
- package/dist/src/omp/omb-settings.js +104 -0
- package/dist/src/omp/omb-settings.js.map +1 -0
- package/dist/src/omp/result-reconciliation.d.ts +2 -0
- package/dist/src/omp/result-reconciliation.js +9 -0
- package/dist/src/omp/result-reconciliation.js.map +1 -0
- package/dist/src/omp/rpc.d.ts +67 -0
- package/dist/src/omp/rpc.js +4 -0
- package/dist/src/omp/rpc.js.map +1 -0
- package/dist/src/omp/run-log.d.ts +25 -0
- package/dist/src/omp/run-log.js +24 -0
- package/dist/src/omp/run-log.js.map +1 -0
- package/dist/src/omp/session-activity.d.ts +70 -0
- package/dist/src/omp/session-activity.js +361 -0
- package/dist/src/omp/session-activity.js.map +1 -0
- package/dist/src/omp/session-controls.d.ts +17 -0
- package/dist/src/omp/session-controls.js +14 -0
- package/dist/src/omp/session-controls.js.map +1 -0
- package/dist/src/omp/tmux.d.ts +89 -0
- package/dist/src/omp/tmux.js +445 -0
- package/dist/src/omp/tmux.js.map +1 -0
- package/dist/src/omp/tray-icons.d.ts +5 -0
- package/dist/src/omp/tray-icons.js +78 -0
- package/dist/src/omp/tray-icons.js.map +1 -0
- package/dist/src/omp/tray.d.ts +23 -0
- package/dist/src/omp/tray.js +167 -0
- package/dist/src/omp/tray.js.map +1 -0
- package/dist/src/services/budget.d.ts +19 -0
- package/dist/src/services/budget.js +10 -0
- package/dist/src/services/budget.js.map +1 -0
- package/dist/src/services/candidate-local.d.ts +13 -0
- package/dist/src/services/candidate-local.js +15 -0
- package/dist/src/services/candidate-local.js.map +1 -0
- package/dist/src/services/candidates.d.ts +20 -0
- package/dist/src/services/candidates.js +100 -0
- package/dist/src/services/candidates.js.map +1 -0
- package/dist/src/services/evidence-bundle.d.ts +17 -0
- package/dist/src/services/evidence-bundle.js +21 -0
- package/dist/src/services/evidence-bundle.js.map +1 -0
- package/dist/src/services/inspector.d.ts +11 -0
- package/dist/src/services/inspector.js +6 -0
- package/dist/src/services/inspector.js.map +1 -0
- package/dist/src/services/lessons.d.ts +13 -0
- package/dist/src/services/lessons.js +11 -0
- package/dist/src/services/lessons.js.map +1 -0
- package/dist/src/services/projection.d.ts +21 -0
- package/dist/src/services/projection.js +10 -0
- package/dist/src/services/projection.js.map +1 -0
- package/dist/src/services/readiness.d.ts +4 -0
- package/dist/src/services/readiness.js +35 -0
- package/dist/src/services/readiness.js.map +1 -0
- package/dist/src/services/recipes.d.ts +15 -0
- package/dist/src/services/recipes.js +42 -0
- package/dist/src/services/recipes.js.map +1 -0
- package/dist/src/services/recovery.d.ts +19 -0
- package/dist/src/services/recovery.js +9 -0
- package/dist/src/services/recovery.js.map +1 -0
- package/dist/src/services/review.d.ts +15 -0
- package/dist/src/services/review.js +9 -0
- package/dist/src/services/review.js.map +1 -0
- package/dist/src/storage/journal-recovery.d.ts +10 -0
- package/dist/src/storage/journal-recovery.js +33 -0
- package/dist/src/storage/journal-recovery.js.map +1 -0
- package/dist/src/storage/journal.d.ts +12 -0
- package/dist/src/storage/journal.js +82 -0
- package/dist/src/storage/journal.js.map +1 -0
- package/dist/src/storage/migrations.d.ts +22 -0
- package/dist/src/storage/migrations.js +107 -0
- package/dist/src/storage/migrations.js.map +1 -0
- package/dist/src/storage/repository-identity.d.ts +11 -0
- package/dist/src/storage/repository-identity.js +67 -0
- package/dist/src/storage/repository-identity.js.map +1 -0
- package/dist/src/storage/resources.d.ts +66 -0
- package/dist/src/storage/resources.js +148 -0
- package/dist/src/storage/resources.js.map +1 -0
- package/dist/src/tools/evidence.d.ts +8 -0
- package/dist/src/tools/evidence.js +9 -0
- package/dist/src/tools/evidence.js.map +1 -0
- package/dist/src/tools/integrate.d.ts +13 -0
- package/dist/src/tools/integrate.js +90 -0
- package/dist/src/tools/integrate.js.map +1 -0
- package/dist/src/tools/result.d.ts +9 -0
- package/dist/src/tools/result.js +2 -0
- package/dist/src/tools/result.js.map +1 -0
- package/dist/src/tools/verify.d.ts +13 -0
- package/dist/src/tools/verify.js +61 -0
- package/dist/src/tools/verify.js.map +1 -0
- package/dist/src/tools/workflow.d.ts +8 -0
- package/dist/src/tools/workflow.js +65 -0
- package/dist/src/tools/workflow.js.map +1 -0
- package/dist/src/workflows/direct.d.ts +9 -0
- package/dist/src/workflows/direct.js +2 -0
- package/dist/src/workflows/direct.js.map +1 -0
- package/dist/src/workflows/implement.d.ts +2 -0
- package/dist/src/workflows/implement.js +4 -0
- package/dist/src/workflows/implement.js.map +1 -0
- package/dist/src/workflows/plan.d.ts +17 -0
- package/dist/src/workflows/plan.js +6 -0
- package/dist/src/workflows/plan.js.map +1 -0
- package/dist/src/workflows/research.d.ts +15 -0
- package/dist/src/workflows/research.js +2 -0
- package/dist/src/workflows/research.js.map +1 -0
- package/dist/src/workflows/review.d.ts +15 -0
- package/dist/src/workflows/review.js +2 -0
- package/dist/src/workflows/review.js.map +1 -0
- package/dist/src/workflows/verify.d.ts +9 -0
- package/dist/src/workflows/verify.js +2 -0
- package/dist/src/workflows/verify.js.map +1 -0
- package/dist/tests/acceptance.test.d.ts +1 -0
- package/dist/tests/acceptance.test.js +27 -0
- package/dist/tests/acceptance.test.js.map +1 -0
- package/dist/tests/agents.test.d.ts +1 -0
- package/dist/tests/agents.test.js +369 -0
- package/dist/tests/agents.test.js.map +1 -0
- package/dist/tests/candidates.test.d.ts +1 -0
- package/dist/tests/candidates.test.js +60 -0
- package/dist/tests/candidates.test.js.map +1 -0
- package/dist/tests/core.test.d.ts +1 -0
- package/dist/tests/core.test.js +39 -0
- package/dist/tests/core.test.js.map +1 -0
- package/dist/tests/daemon.test.d.ts +1 -0
- package/dist/tests/daemon.test.js +157 -0
- package/dist/tests/daemon.test.js.map +1 -0
- package/dist/tests/dashboard.test.d.ts +1 -0
- package/dist/tests/dashboard.test.js +414 -0
- package/dist/tests/dashboard.test.js.map +1 -0
- package/dist/tests/directory-selector.test.d.ts +1 -0
- package/dist/tests/directory-selector.test.js +93 -0
- package/dist/tests/directory-selector.test.js.map +1 -0
- package/dist/tests/doctor.test.d.ts +1 -0
- package/dist/tests/doctor.test.js +32 -0
- package/dist/tests/doctor.test.js.map +1 -0
- package/dist/tests/install.test.d.ts +1 -0
- package/dist/tests/install.test.js +101 -0
- package/dist/tests/install.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +1 -0
- package/dist/tests/integration.test.js +49 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/journal.test.d.ts +1 -0
- package/dist/tests/journal.test.js +50 -0
- package/dist/tests/journal.test.js.map +1 -0
- package/dist/tests/model-role-assignment.test.d.ts +1 -0
- package/dist/tests/model-role-assignment.test.js +294 -0
- package/dist/tests/model-role-assignment.test.js.map +1 -0
- package/dist/tests/omb-runtime.test.d.ts +1 -0
- package/dist/tests/omb-runtime.test.js +554 -0
- package/dist/tests/omb-runtime.test.js.map +1 -0
- package/dist/tests/omb-session-actions.test.d.ts +1 -0
- package/dist/tests/omb-session-actions.test.js +191 -0
- package/dist/tests/omb-session-actions.test.js.map +1 -0
- package/dist/tests/omb-settings.test.d.ts +1 -0
- package/dist/tests/omb-settings.test.js +82 -0
- package/dist/tests/omb-settings.test.js.map +1 -0
- package/dist/tests/omp-contract.test.d.ts +1 -0
- package/dist/tests/omp-contract.test.js +362 -0
- package/dist/tests/omp-contract.test.js.map +1 -0
- package/dist/tests/process.test.d.ts +1 -0
- package/dist/tests/process.test.js +12 -0
- package/dist/tests/process.test.js.map +1 -0
- package/dist/tests/psmux-windows.test.d.ts +1 -0
- package/dist/tests/psmux-windows.test.js +105 -0
- package/dist/tests/psmux-windows.test.js.map +1 -0
- package/dist/tests/recovery.test.d.ts +1 -0
- package/dist/tests/recovery.test.js +9 -0
- package/dist/tests/recovery.test.js.map +1 -0
- package/dist/tests/resources.test.d.ts +1 -0
- package/dist/tests/resources.test.js +55 -0
- package/dist/tests/resources.test.js.map +1 -0
- package/dist/tests/session-activity.test.d.ts +1 -0
- package/dist/tests/session-activity.test.js +159 -0
- package/dist/tests/session-activity.test.js.map +1 -0
- package/dist/tests/setup-ui.test.d.ts +1 -0
- package/dist/tests/setup-ui.test.js +37 -0
- package/dist/tests/setup-ui.test.js.map +1 -0
- package/dist/tests/storage-integrity.test.d.ts +1 -0
- package/dist/tests/storage-integrity.test.js +88 -0
- package/dist/tests/storage-integrity.test.js.map +1 -0
- package/dist/tests/tmux.test.d.ts +1 -0
- package/dist/tests/tmux.test.js +239 -0
- package/dist/tests/tmux.test.js.map +1 -0
- package/dist/tests/tray.test.d.ts +1 -0
- package/dist/tests/tray.test.js +37 -0
- package/dist/tests/tray.test.js.map +1 -0
- package/dist/tests/verification.test.d.ts +1 -0
- package/dist/tests/verification.test.js +61 -0
- package/dist/tests/verification.test.js.map +1 -0
- package/dist/tests/workflow-features.test.d.ts +1 -0
- package/dist/tests/workflow-features.test.js +82 -0
- package/dist/tests/workflow-features.test.js.map +1 -0
- package/dist/tests/workflow-safety.test.d.ts +1 -0
- package/dist/tests/workflow-safety.test.js +57 -0
- package/dist/tests/workflow-safety.test.js.map +1 -0
- package/docs/compatibility/baseline.json +1 -1
- package/docs/releases/0.6.2.md +2 -2
- package/docs/releases/0.6.3.md +27 -0
- package/docs/releases/0.6.4.md +25 -0
- package/package.json +1 -1
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { statSync } from "node:fs";
|
|
4
|
+
import { basename, join } from "node:path";
|
|
5
|
+
import { clearOmbSessionDeleted, findLastOmbSession, isOmbSessionName, markOmbSessionDeleted, ombSessionBoundNames, ombSessionDir, resolveMultiplexerBin } from "./omb-sessions.js";
|
|
6
|
+
import { loadOmbSettings } from "./omb-settings.js";
|
|
7
|
+
const NON_INTERACTIVE_FLAGS = new Set(["-p", "--print", "--export"]);
|
|
8
|
+
const NON_INTERACTIVE_MODES = new Set(["json", "rpc", "rpc-ui", "acp"]);
|
|
9
|
+
function modeOf(args) {
|
|
10
|
+
const index = args.indexOf("--mode");
|
|
11
|
+
if (index >= 0)
|
|
12
|
+
return args[index + 1];
|
|
13
|
+
const inline = args.find(arg => arg.startsWith("--mode="));
|
|
14
|
+
return inline?.slice("--mode=".length);
|
|
15
|
+
}
|
|
16
|
+
/** Whether `omb` should own this interactive terminal through tmux. */
|
|
17
|
+
export function shouldLaunchOmbInTmux(options = {}) {
|
|
18
|
+
const env = options.env ?? process.env;
|
|
19
|
+
const args = options.args ?? process.argv.slice(2);
|
|
20
|
+
if (env.TMUX || env.TMUX_PANE || env.BIZAR_OMP_NO_TMUX === "1")
|
|
21
|
+
return false;
|
|
22
|
+
if (options.stdinIsTTY !== true || options.stdoutIsTTY !== true)
|
|
23
|
+
return false;
|
|
24
|
+
if (args.some(arg => NON_INTERACTIVE_FLAGS.has(arg)) || NON_INTERACTIVE_MODES.has(modeOf(args) ?? ""))
|
|
25
|
+
return false;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stable per-project session name so subsequent `omb` calls reconnect safely.
|
|
30
|
+
* A session id creates an additional durable session in the same project.
|
|
31
|
+
*/
|
|
32
|
+
export function ombSessionName(cwd, sessionId) {
|
|
33
|
+
const label = basename(cwd).replace(/[^A-Za-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 24) || "project";
|
|
34
|
+
const digest = createHash("sha256").update(cwd).digest("hex").slice(0, 10);
|
|
35
|
+
const normalizedSessionId = sessionId?.trim().replace(/[^A-Za-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 20) || "";
|
|
36
|
+
const suffix = normalizedSessionId ? `-${normalizedSessionId}` : "";
|
|
37
|
+
return `bizar-${label}-${digest}${suffix}`.slice(0, 63);
|
|
38
|
+
}
|
|
39
|
+
function exitCode(code, signal) {
|
|
40
|
+
if (code !== null)
|
|
41
|
+
return code;
|
|
42
|
+
return signal ? 1 : 1;
|
|
43
|
+
}
|
|
44
|
+
/** Node reports an unresolvable spawn target as ENOENT (or EINVAL for .cmd shims). */
|
|
45
|
+
function isMissingBinaryError(error) {
|
|
46
|
+
const code = error?.code;
|
|
47
|
+
return code === "ENOENT" || code === "EINVAL";
|
|
48
|
+
}
|
|
49
|
+
function runTmux(command, args, cwd, env) {
|
|
50
|
+
const child = spawn(command, args, { cwd, env, stdio: "ignore" });
|
|
51
|
+
const closed = Promise.withResolvers();
|
|
52
|
+
child.once("error", closed.reject);
|
|
53
|
+
child.once("close", (code, signal) => closed.resolve(exitCode(code, signal)));
|
|
54
|
+
return closed.promise;
|
|
55
|
+
}
|
|
56
|
+
function readTmux(command, args, cwd, env) {
|
|
57
|
+
const child = spawn(command, args, { cwd, env, stdio: ["ignore", "pipe", "ignore"] });
|
|
58
|
+
let output = "";
|
|
59
|
+
child.stdout?.setEncoding("utf8");
|
|
60
|
+
child.stdout?.on("data", chunk => { output += chunk; });
|
|
61
|
+
const closed = Promise.withResolvers();
|
|
62
|
+
child.once("error", closed.reject);
|
|
63
|
+
child.once("close", (code, signal) => closed.resolve({ code: exitCode(code, signal), output }));
|
|
64
|
+
return closed.promise;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Stop the parent's stdin read loop before handing the TTY to an inherit
|
|
68
|
+
* child. On Windows a flowing stdin with no data listener (the state an ink
|
|
69
|
+
* unmount can leave behind) consumes console input records, so a psmux
|
|
70
|
+
* attach sharing the console never sees keystrokes. Pausing only stops this
|
|
71
|
+
* process from reading; the inherit child keeps full access. The attached
|
|
72
|
+
* client restores terminal state itself, so nothing is restored here.
|
|
73
|
+
*/
|
|
74
|
+
function quiesceStdinForHandoff() {
|
|
75
|
+
if (process.stdin.isTTY === true && !process.stdin.isPaused())
|
|
76
|
+
process.stdin.pause();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Apply the standard Bizar options to a Bizar-owned session: respawn dead
|
|
80
|
+
* panes, remain-on-exit off, window history limit, mouse preference, and the
|
|
81
|
+
* private root table so Ctrl-D/C detach the client without sending exit or
|
|
82
|
+
* interrupt input into OMP. The tmux host remains alive for background work,
|
|
83
|
+
* and the normal Ctrl-B prefix still enters tmux's standard prefix table.
|
|
84
|
+
*/
|
|
85
|
+
async function prepareOmbSession(tmux, omp, session, cwd, childEnv, mouseScrolling) {
|
|
86
|
+
// Keep the respawn opportunity below for stale sessions, but do not leave
|
|
87
|
+
// remain-on-exit enabled: when OMP really exits, tmux should remove the
|
|
88
|
+
// pane/session instead of showing a permanent "Pane is dead" screen.
|
|
89
|
+
// Detaching the client leaves OMP alive, so durable work is unaffected.
|
|
90
|
+
const pane = await readTmux(tmux, ["list-panes", "-t", `${session}:0.0`, "-F", "#{pane_dead}"], cwd, childEnv);
|
|
91
|
+
if (pane.code !== 0)
|
|
92
|
+
return pane.code;
|
|
93
|
+
if (pane.output.trim() === "1") {
|
|
94
|
+
const respawned = await runTmux(tmux, ["respawn-pane", "-k", "-t", `${session}:0.0`, omp, "--session-dir", ombSessionDir(session, childEnv), "--continue"], cwd, childEnv);
|
|
95
|
+
if (respawned !== 0)
|
|
96
|
+
return respawned;
|
|
97
|
+
}
|
|
98
|
+
// Repair sessions created by older Bizar versions that enabled this option.
|
|
99
|
+
const remainOnExitOff = await runTmux(tmux, ["set-option", "-t", session, "remain-on-exit", "off"], cwd, childEnv);
|
|
100
|
+
if (remainOnExitOff !== 0)
|
|
101
|
+
return remainOnExitOff;
|
|
102
|
+
// Keep the conversation reviewable: the pane's history is the only scrollback
|
|
103
|
+
// an OMP session has, and the tmux default holds minutes of a live chat.
|
|
104
|
+
const historyRaised = await runTmux(tmux, sessionHistoryArgs(session), cwd, childEnv);
|
|
105
|
+
if (historyRaised !== 0)
|
|
106
|
+
return historyRaised;
|
|
107
|
+
// tmux must own wheel events so the terminal scrolls the pane instead of
|
|
108
|
+
// translating them into up/down input for OMP's prompt-history editor.
|
|
109
|
+
const mouseEnabled = await runTmux(tmux, ["set-option", "-t", session, "mouse", mouseScrolling ? "on" : "off"], cwd, childEnv);
|
|
110
|
+
if (mouseEnabled !== 0)
|
|
111
|
+
return mouseEnabled;
|
|
112
|
+
// Keep pointer events inside the Bizar-owned key table. Without these
|
|
113
|
+
// explicit bindings, tmux consumes wheel/click events while an OMP
|
|
114
|
+
// alternate-screen overlay is active, so Advisor never receives them; when
|
|
115
|
+
// the main OMP screen is active, the wheel should scroll tmux's pane.
|
|
116
|
+
// psmux ignores persistent key-table assignment (and its #583 `set-option`
|
|
117
|
+
// quirk eats dash-leading values), so skip the binds there; real tmux keeps
|
|
118
|
+
// them.
|
|
119
|
+
const psmuxMode = process.platform === "win32" && tmux === resolveMultiplexerBin();
|
|
120
|
+
if (!psmuxMode) {
|
|
121
|
+
const keyTable = `${session}-bizar-root`;
|
|
122
|
+
const bindWheelUp = await runTmux(tmux, ["bind-key", "-T", keyTable, "WheelUpPane", "if-shell", "-F", "#{alternate_on}", "send-keys -M", "copy-mode -e; send-keys -M"], cwd, childEnv);
|
|
123
|
+
const bindWheelDown = await runTmux(tmux, ["bind-key", "-T", keyTable, "WheelDownPane", "if-shell", "-F", "#{alternate_on}", "send-keys -M", "send-keys -M"], cwd, childEnv);
|
|
124
|
+
const bindMouseDown = await runTmux(tmux, ["bind-key", "-T", keyTable, "MouseDown1Pane", "if-shell", "-F", "#{alternate_on}", "send-keys -M", "select-pane"], cwd, childEnv);
|
|
125
|
+
const bindMouseDrag = await runTmux(tmux, ["bind-key", "-T", keyTable, "MouseDrag1Pane", "if-shell", "-F", "#{alternate_on}", "send-keys -M", "copy-mode -e; send-keys -M"], cwd, childEnv);
|
|
126
|
+
const bindMouseUp = await runTmux(tmux, ["bind-key", "-T", keyTable, "MouseUp1Pane", "if-shell", "-F", "#{alternate_on}", "send-keys -M", ""], cwd, childEnv);
|
|
127
|
+
const bindDetach = await runTmux(tmux, ["bind-key", "-T", keyTable, "C-d", "detach-client"], cwd, childEnv);
|
|
128
|
+
if (bindDetach !== 0)
|
|
129
|
+
return bindDetach;
|
|
130
|
+
const bindInterruptDetach = await runTmux(tmux, ["bind-key", "-T", keyTable, "C-c", "detach-client"], cwd, childEnv);
|
|
131
|
+
if (bindInterruptDetach !== 0)
|
|
132
|
+
return bindInterruptDetach;
|
|
133
|
+
const bindPrefix = await runTmux(tmux, ["bind-key", "-T", keyTable, "C-b", "switch-client", "-T", "prefix"], cwd, childEnv);
|
|
134
|
+
if (bindPrefix !== 0)
|
|
135
|
+
return bindPrefix;
|
|
136
|
+
return runTmux(tmux, ["set-option", "-t", session, "key-table", keyTable], cwd, childEnv);
|
|
137
|
+
}
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
async function launchInTmux(tmux, omp, session, cwd, args, env, mouseScrolling, sessionDir) {
|
|
141
|
+
const childEnv = { ...env, BIZAR_OMP_NO_TMUX: "1" };
|
|
142
|
+
const hasSession = await runTmux(tmux, ["has-session", "-t", session], cwd, childEnv);
|
|
143
|
+
if (hasSession !== 0) {
|
|
144
|
+
const created = await runTmux(tmux, ["new-session", "-d", "-s", session, "-c", cwd, omp, "--session-dir", sessionDir, ...args], cwd, childEnv);
|
|
145
|
+
if (created !== 0) {
|
|
146
|
+
// A concurrent `omb` may have created the stable session between the
|
|
147
|
+
// probe and create calls. Continue only when that race is proven safe.
|
|
148
|
+
const racedIntoExisting = await runTmux(tmux, ["has-session", "-t", session], cwd, childEnv);
|
|
149
|
+
if (racedIntoExisting !== 0)
|
|
150
|
+
return created;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const prepared = await prepareOmbSession(tmux, omp, session, cwd, childEnv, mouseScrolling);
|
|
154
|
+
if (prepared !== 0)
|
|
155
|
+
return prepared;
|
|
156
|
+
quiesceStdinForHandoff();
|
|
157
|
+
const client = spawn(tmux, ["attach-session", "-t", session], { cwd, env: childEnv, stdio: "inherit" });
|
|
158
|
+
const closed = Promise.withResolvers();
|
|
159
|
+
client.once("error", closed.reject);
|
|
160
|
+
client.once("close", (code, signal) => closed.resolve(exitCode(code, signal)));
|
|
161
|
+
return closed.promise;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Terminal emulators that can host an interactive attach, in preference order.
|
|
165
|
+
* `$BIZAR_TERMINAL` overrides the list; `xfce4-terminal` takes the command as
|
|
166
|
+
* one argument while the rest expect `-e <argv>`.
|
|
167
|
+
*/
|
|
168
|
+
const TERMINAL_COMMANDS = [
|
|
169
|
+
{ bin: "x-terminal-emulator", args: command => ["-e", "sh", "-lc", command] },
|
|
170
|
+
{ bin: "gnome-terminal", args: command => ["--", "sh", "-lc", command] },
|
|
171
|
+
{ bin: "konsole", args: command => ["-e", "sh", "-lc", command] },
|
|
172
|
+
{ bin: "xfce4-terminal", args: command => [command], single: true },
|
|
173
|
+
{ bin: "alacritty", args: command => ["-e", "sh", "-lc", command] },
|
|
174
|
+
{ bin: "kitty", args: command => ["sh", "-lc", command] },
|
|
175
|
+
{ bin: "foot", args: command => ["sh", "-lc", command] },
|
|
176
|
+
{ bin: "wezterm", args: command => ["start", "--", "sh", "-lc", command] },
|
|
177
|
+
{ bin: "xterm", args: command => ["-e", "sh", "-lc", command] },
|
|
178
|
+
];
|
|
179
|
+
/** Resolve an executable on `$PATH`, or an explicit path when it contains a slash. */
|
|
180
|
+
export function findOnPath(bin, env = process.env) {
|
|
181
|
+
if (bin.includes("/")) {
|
|
182
|
+
try {
|
|
183
|
+
const stat = statSync(bin);
|
|
184
|
+
return stat.isFile() && (stat.mode & 0o111) !== 0 ? bin : undefined;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const dir of (env.PATH || "").split(":").filter(Boolean)) {
|
|
191
|
+
const candidate = join(dir, bin);
|
|
192
|
+
try {
|
|
193
|
+
const stat = statSync(candidate);
|
|
194
|
+
if (stat.isFile() && (stat.mode & 0o111) !== 0)
|
|
195
|
+
return candidate;
|
|
196
|
+
}
|
|
197
|
+
catch { /* keep searching */ }
|
|
198
|
+
}
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
const SESSION_CONSOLE_MAX_LINES = 1_000;
|
|
202
|
+
const SESSION_CONSOLE_MAX_CHARS = 128 * 1024;
|
|
203
|
+
const SESSION_INPUT_MAX_BYTES = 16 * 1024;
|
|
204
|
+
/**
|
|
205
|
+
* Lines of history kept for the window an OMB session runs in.
|
|
206
|
+
*
|
|
207
|
+
* tmux defaults to 2000 lines, which a long OMP chat scrolls past in one
|
|
208
|
+
* sitting: the pane then drops the messages the operator needs to review and
|
|
209
|
+
* neither the wheel binding nor copy-mode can bring them back. `history-limit`
|
|
210
|
+
* is a window option, so it is set on the session's own window — every other
|
|
211
|
+
* tmux session keeps the limit its owner configured.
|
|
212
|
+
*/
|
|
213
|
+
export const OMB_SESSION_HISTORY_LIMIT = 100_000;
|
|
214
|
+
function sessionHistoryArgs(session) {
|
|
215
|
+
return ["set-option", "-w", "-t", `${session}:0`, "history-limit", String(OMB_SESSION_HISTORY_LIMIT)];
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Raise one Bizar-owned session's window history limit. Idempotent, so attach
|
|
219
|
+
* paths run it too: a session created before the limit was raised must not stay
|
|
220
|
+
* capped at 2000 lines for the rest of its life.
|
|
221
|
+
*/
|
|
222
|
+
export async function raiseOmbSessionHistory(session, cwd = process.cwd(), env = process.env) {
|
|
223
|
+
if (!isOmbSessionName(session))
|
|
224
|
+
return 2;
|
|
225
|
+
return runTmux(resolveMultiplexerBin(env), sessionHistoryArgs(session), cwd, { ...env, BIZAR_OMP_NO_TMUX: "1" });
|
|
226
|
+
}
|
|
227
|
+
function cleanTerminalText(value) {
|
|
228
|
+
return value
|
|
229
|
+
.replace(/\u001B\][^\u0007]*(?:\u0007|\u001B\\)/g, "")
|
|
230
|
+
.replace(/\u001B(?:\[[0-?]*[ -/]*[@-~]|[@-_])/g, "")
|
|
231
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001A\u001C-\u001F\u007F]/g, "")
|
|
232
|
+
.replace(/[ \t]+$/gm, "")
|
|
233
|
+
.replace(/\n{4,}/g, "\n\n\n")
|
|
234
|
+
.trimEnd();
|
|
235
|
+
}
|
|
236
|
+
/** Capture a bounded, plain-text view of one Bizar-owned session's active pane. */
|
|
237
|
+
export async function captureOmbSessionConsole(session, cwd = process.cwd(), env = process.env, lines = 500) {
|
|
238
|
+
if (!isOmbSessionName(session))
|
|
239
|
+
return { code: 2, text: "" };
|
|
240
|
+
const requestedLines = Number.isFinite(lines) ? Math.floor(lines) : 500;
|
|
241
|
+
const boundedLines = Math.max(1, Math.min(SESSION_CONSOLE_MAX_LINES, requestedLines));
|
|
242
|
+
const result = await readTmux(resolveMultiplexerBin(env), ["capture-pane", "-p", "-S", `-${boundedLines}`, "-t", `${session}:0.0`], cwd, { ...env, BIZAR_OMP_NO_TMUX: "1" });
|
|
243
|
+
const text = cleanTerminalText(result.output);
|
|
244
|
+
return { code: result.code, text: text.slice(-SESSION_CONSOLE_MAX_CHARS) };
|
|
245
|
+
}
|
|
246
|
+
/** Send literal composer text followed by Enter to one Bizar-owned session. */
|
|
247
|
+
export async function sendOmbSessionInput(session, input, cwd = process.cwd(), env = process.env) {
|
|
248
|
+
if (!isOmbSessionName(session) || !input.trim() || input.includes("\u0000") || Buffer.byteLength(input) > SESSION_INPUT_MAX_BYTES)
|
|
249
|
+
return 2;
|
|
250
|
+
const tmux = resolveMultiplexerBin(env);
|
|
251
|
+
const childEnv = { ...env, BIZAR_OMP_NO_TMUX: "1" };
|
|
252
|
+
const sent = await runTmux(tmux, ["send-keys", "-t", `${session}:0.0`, "-l", "--", input], cwd, childEnv);
|
|
253
|
+
if (sent !== 0)
|
|
254
|
+
return sent;
|
|
255
|
+
return runTmux(tmux, ["send-keys", "-t", `${session}:0.0`, "Enter"], cwd, childEnv);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Open one Bizar-owned session in a new terminal emulator window. The daemon
|
|
259
|
+
* and hub run without a controlling TTY, so attaching means handing the attach
|
|
260
|
+
* command to a terminal we spawn; when no emulator exists the caller still
|
|
261
|
+
* receives the exact command to run by hand. Attaching is also where a session
|
|
262
|
+
* created before the history limit was raised is repaired, because an operator
|
|
263
|
+
* attaching to a long-running chat is the one who needs its scrollback.
|
|
264
|
+
*/
|
|
265
|
+
export async function openOmbSessionInTerminal(session, env = process.env) {
|
|
266
|
+
// Names come from tmux; keep the shell command single-quoted and refuse
|
|
267
|
+
// anything outside the character set Bizar ever generates.
|
|
268
|
+
if (!isOmbSessionName(session) || !/^[A-Za-z0-9_.-]+$/.test(session))
|
|
269
|
+
return { spawned: false, command: "" };
|
|
270
|
+
// Best effort: a session that cannot take the option is attached to anyway so
|
|
271
|
+
// the operator still sees why the attach failed.
|
|
272
|
+
try {
|
|
273
|
+
await raiseOmbSessionHistory(session, process.cwd(), env);
|
|
274
|
+
}
|
|
275
|
+
catch { /* attach proceeds */ }
|
|
276
|
+
const multiplexer = resolveMultiplexerBin(env).replace(/'/g, "'\\''");
|
|
277
|
+
const command = `'${multiplexer}' attach-session -t '${session}'`;
|
|
278
|
+
return openCommandInTerminal(command, env);
|
|
279
|
+
}
|
|
280
|
+
/** Open a fixed Bizar CLI command in a new terminal emulator window. */
|
|
281
|
+
export function openCommandInTerminal(command, env = process.env) {
|
|
282
|
+
if (!command.trim() || /[\r\n]/.test(command))
|
|
283
|
+
return { spawned: false, command: "" };
|
|
284
|
+
const override = env.BIZAR_TERMINAL?.trim();
|
|
285
|
+
const candidates = override
|
|
286
|
+
? [{ bin: override, args: (value) => ["-e", "sh", "-lc", value] }, ...TERMINAL_COMMANDS]
|
|
287
|
+
: TERMINAL_COMMANDS;
|
|
288
|
+
for (const candidate of candidates) {
|
|
289
|
+
const resolved = findOnPath(candidate.bin, env);
|
|
290
|
+
if (!resolved)
|
|
291
|
+
continue;
|
|
292
|
+
const child = spawn(resolved, candidate.args(command), {
|
|
293
|
+
detached: true,
|
|
294
|
+
stdio: "ignore",
|
|
295
|
+
env: { ...env, BIZAR_OMP_NO_TMUX: "1" },
|
|
296
|
+
});
|
|
297
|
+
child.once("error", () => { });
|
|
298
|
+
child.unref();
|
|
299
|
+
return { spawned: true, command, terminal: resolved };
|
|
300
|
+
}
|
|
301
|
+
return { spawned: false, command };
|
|
302
|
+
}
|
|
303
|
+
/** Apply the launcher mouse preference to one exact Bizar-owned session. */
|
|
304
|
+
export function setOmbSessionMouse(session, enabled, cwd = process.cwd(), env = process.env) {
|
|
305
|
+
if (!isOmbSessionName(session))
|
|
306
|
+
return Promise.resolve(2);
|
|
307
|
+
return runTmux(resolveMultiplexerBin(env), ["set-option", "-t", session, "mouse", enabled ? "on" : "off"], cwd, {
|
|
308
|
+
...env,
|
|
309
|
+
BIZAR_OMP_NO_TMUX: "1",
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/** Rename one exact Bizar-owned tmux session. */
|
|
313
|
+
export function renameOmbSession(session, nextName, cwd = process.cwd(), env = process.env) {
|
|
314
|
+
if (!isOmbSessionName(session) || !isOmbSessionName(nextName))
|
|
315
|
+
return Promise.resolve(2);
|
|
316
|
+
return runTmux(resolveMultiplexerBin(env), ["rename-session", "-t", session, nextName], cwd, {
|
|
317
|
+
...env,
|
|
318
|
+
BIZAR_OMP_NO_TMUX: "1",
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Whether the multiplexer still hosts this exact session.
|
|
323
|
+
*
|
|
324
|
+
* `unknown` means the multiplexer could not be run at all, so a missing row
|
|
325
|
+
* must never be read as a session that is gone: a caller that reports a kill
|
|
326
|
+
* has to say which of the two it proved.
|
|
327
|
+
*/
|
|
328
|
+
export async function ombSessionLiveness(session, cwd = process.cwd(), env = process.env) {
|
|
329
|
+
try {
|
|
330
|
+
const result = await readTmux(resolveMultiplexerBin(env), ["list-sessions", "-F", "#{session_name}"], cwd, { ...env, BIZAR_OMP_NO_TMUX: "1" });
|
|
331
|
+
return result.output.split("\n").some(line => line.trim() === session) ? "live" : "gone";
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return "unknown";
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** Kill one exact Bizar-owned tmux session after the caller has confirmed it. */
|
|
338
|
+
export async function deleteOmbSession(session, cwd = process.cwd(), env = process.env) {
|
|
339
|
+
if (!isOmbSessionName(session))
|
|
340
|
+
return 2;
|
|
341
|
+
const childEnv = { ...env, BIZAR_OMP_NO_TMUX: "1" };
|
|
342
|
+
// A renamed session journals into the directory it was started with, so read
|
|
343
|
+
// the pane binding while the session still exists.
|
|
344
|
+
const bound = await ombSessionBoundNames(session, cwd, childEnv);
|
|
345
|
+
const code = await runTmux(resolveMultiplexerBin(env), ["kill-session", "-t", session], cwd, childEnv);
|
|
346
|
+
// A session the multiplexer still hosts is not deleted, and its journal must
|
|
347
|
+
// not be tombstoned: hiding a live session's journal would drop it from the
|
|
348
|
+
// hub while it keeps running, with no row left to open it again.
|
|
349
|
+
if (code !== 0 && await ombSessionLiveness(session, cwd, childEnv) === "live")
|
|
350
|
+
return code;
|
|
351
|
+
// Deletion outlives the tmux binding. The row the user removed came from one
|
|
352
|
+
// of these journals, so every directory behind this session is tombstoned:
|
|
353
|
+
// when tmux has already lost the session, its journal must not come back as a
|
|
354
|
+
// row that cannot be opened.
|
|
355
|
+
const tombstoned = [session, ...bound].every(name => markOmbSessionDeleted(name, env));
|
|
356
|
+
return tombstoned ? 0 : code || 1;
|
|
357
|
+
}
|
|
358
|
+
/** Hide an unhosted journal record that has no tmux session left to kill. */
|
|
359
|
+
export function forgetOmbSession(session, env = process.env) {
|
|
360
|
+
if (!isOmbSessionName(session))
|
|
361
|
+
return 2;
|
|
362
|
+
return markOmbSessionDeleted(session, env) ? 0 : 1;
|
|
363
|
+
}
|
|
364
|
+
/** Attach to an existing Bizar session, switching the current tmux client when nested. */
|
|
365
|
+
export function attachOmbSession(session, cwd = process.cwd(), env = process.env) {
|
|
366
|
+
const tmux = resolveMultiplexerBin(env);
|
|
367
|
+
const args = env.TMUX || env.TMUX_PANE
|
|
368
|
+
? ["switch-client", "-t", session]
|
|
369
|
+
: ["attach-session", "-t", session];
|
|
370
|
+
quiesceStdinForHandoff();
|
|
371
|
+
const child = spawn(tmux, args, { cwd, env: { ...env, BIZAR_OMP_NO_TMUX: "1" }, stdio: "inherit" });
|
|
372
|
+
return new Promise((resolve, reject) => {
|
|
373
|
+
// A missing multiplexer degrades to a nonzero exit like a failed attach;
|
|
374
|
+
// any other spawn failure (EACCES, EPERM, ...) is still a hard error.
|
|
375
|
+
child.once("error", (error) => {
|
|
376
|
+
if (isMissingBinaryError(error))
|
|
377
|
+
resolve(1);
|
|
378
|
+
else
|
|
379
|
+
reject(error);
|
|
380
|
+
});
|
|
381
|
+
child.once("close", (code, signal) => resolve(exitCode(code, signal)));
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Launch OMP from the shell boundary. OMP starts inside tmux before it probes
|
|
386
|
+
* the terminal; no second OMP process is handed the same raw terminal during
|
|
387
|
+
* startup.
|
|
388
|
+
*/
|
|
389
|
+
export async function launchOmb(cwd, args, env = process.env, sessionId) {
|
|
390
|
+
const useTmux = shouldLaunchOmbInTmux({
|
|
391
|
+
args,
|
|
392
|
+
env,
|
|
393
|
+
stdinIsTTY: process.stdin.isTTY === true,
|
|
394
|
+
stdoutIsTTY: process.stdout.isTTY === true,
|
|
395
|
+
});
|
|
396
|
+
const tmux = resolveMultiplexerBin(env);
|
|
397
|
+
const omp = env.BIZAR_OMP_BIN || "omp";
|
|
398
|
+
const settings = loadOmbSettings(env);
|
|
399
|
+
const lastSession = useTmux && !sessionId && settings.autoAttachLatest ? await findLastOmbSession(cwd, env) : undefined;
|
|
400
|
+
const session = lastSession?.name ?? ombSessionName(cwd, sessionId);
|
|
401
|
+
if (useTmux) {
|
|
402
|
+
try {
|
|
403
|
+
clearOmbSessionDeleted(session, env);
|
|
404
|
+
return await launchInTmux(tmux, omp, session, cwd, args, env, settings.mouseScrolling, ombSessionDir(session, env));
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
// No tmux-compatible multiplexer installed (spawn ENOENT): run OMP
|
|
408
|
+
// directly rather than failing hosts that simply lack psmux/tmux.
|
|
409
|
+
if (!isMissingBinaryError(error))
|
|
410
|
+
throw error;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
quiesceStdinForHandoff();
|
|
414
|
+
const child = spawn(omp, args, { cwd, env, stdio: "inherit" });
|
|
415
|
+
const closed = Promise.withResolvers();
|
|
416
|
+
child.once("error", closed.reject);
|
|
417
|
+
child.once("close", (code, signal) => closed.resolve(exitCode(code, signal)));
|
|
418
|
+
return closed.promise;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Create or refresh a Bizar-owned session without attaching a client. The
|
|
422
|
+
* dashboard uses this so a browser can start background work; the session
|
|
423
|
+
* gets the same durability and input options as an interactive `omb` launch.
|
|
424
|
+
*/
|
|
425
|
+
export async function createOmbSession(cwd, args, env = process.env, sessionId) {
|
|
426
|
+
const tmux = resolveMultiplexerBin(env);
|
|
427
|
+
const omp = env.BIZAR_OMP_BIN || "omp";
|
|
428
|
+
const settings = loadOmbSettings(env);
|
|
429
|
+
const session = ombSessionName(cwd, sessionId);
|
|
430
|
+
clearOmbSessionDeleted(session, env);
|
|
431
|
+
const childEnv = { ...env, BIZAR_OMP_NO_TMUX: "1" };
|
|
432
|
+
const hasSession = await runTmux(tmux, ["has-session", "-t", session], cwd, childEnv);
|
|
433
|
+
if (hasSession !== 0) {
|
|
434
|
+
const created = await runTmux(tmux, ["new-session", "-d", "-s", session, "-c", cwd, omp, "--session-dir", ombSessionDir(session, env), ...args], cwd, childEnv);
|
|
435
|
+
if (created !== 0) {
|
|
436
|
+
// A concurrent creator may have raced the probe; reuse only when the
|
|
437
|
+
// session now exists, exactly like the interactive launcher.
|
|
438
|
+
const racedIntoExisting = await runTmux(tmux, ["has-session", "-t", session], cwd, childEnv);
|
|
439
|
+
if (racedIntoExisting !== 0)
|
|
440
|
+
return { name: session, code: created };
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return { name: session, code: await prepareOmbSession(tmux, omp, session, cwd, childEnv, settings.mouseScrolling) };
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=tmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../../src/omp/tmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { deflateSync } from "node:zlib";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { daemonStateDir } from "./daemon.js";
|
|
5
|
+
function crc32(value) {
|
|
6
|
+
let crc = 0xffffffff;
|
|
7
|
+
for (const byte of value) {
|
|
8
|
+
crc ^= byte;
|
|
9
|
+
for (let bit = 0; bit < 8; bit++)
|
|
10
|
+
crc = (crc >>> 1) ^ (0xedb88320 & -(crc & 1));
|
|
11
|
+
}
|
|
12
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
13
|
+
}
|
|
14
|
+
function chunk(type, data) {
|
|
15
|
+
const name = Buffer.from(type, "ascii");
|
|
16
|
+
const body = Buffer.concat([name, data]);
|
|
17
|
+
const output = Buffer.alloc(12 + data.length);
|
|
18
|
+
output.writeUInt32BE(data.length, 0);
|
|
19
|
+
body.copy(output, 4);
|
|
20
|
+
output.writeUInt32BE(crc32(body), 8 + data.length);
|
|
21
|
+
return output;
|
|
22
|
+
}
|
|
23
|
+
/** Generate a tiny dependency-free Bizar mark for native tray backends. */
|
|
24
|
+
function createPng() {
|
|
25
|
+
const size = 32;
|
|
26
|
+
const rows = Buffer.alloc(size * (size * 4 + 1));
|
|
27
|
+
for (let y = 0; y < size; y++) {
|
|
28
|
+
const row = y * (size * 4 + 1);
|
|
29
|
+
rows[row] = 0;
|
|
30
|
+
for (let x = 0; x < size; x++) {
|
|
31
|
+
const pixel = row + 1 + x * 4;
|
|
32
|
+
const inside = (x - 15.5) ** 2 + (y - 15.5) ** 2 < 13 ** 2;
|
|
33
|
+
rows[pixel] = inside ? 38 : 22;
|
|
34
|
+
rows[pixel + 1] = inside ? 197 : 27;
|
|
35
|
+
rows[pixel + 2] = inside ? 145 : 36;
|
|
36
|
+
rows[pixel + 3] = 255;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const header = Buffer.alloc(13);
|
|
40
|
+
header.writeUInt32BE(size, 0);
|
|
41
|
+
header.writeUInt32BE(size, 4);
|
|
42
|
+
header[8] = 8;
|
|
43
|
+
header[9] = 6;
|
|
44
|
+
return Buffer.concat([
|
|
45
|
+
Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]),
|
|
46
|
+
chunk("IHDR", header),
|
|
47
|
+
chunk("IDAT", deflateSync(rows)),
|
|
48
|
+
chunk("IEND", Buffer.alloc(0)),
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
function createIco(png) {
|
|
52
|
+
const header = Buffer.alloc(22);
|
|
53
|
+
header.writeUInt16LE(0, 0);
|
|
54
|
+
header.writeUInt16LE(1, 2);
|
|
55
|
+
header.writeUInt16LE(1, 4);
|
|
56
|
+
header[6] = 32;
|
|
57
|
+
header[7] = 32;
|
|
58
|
+
header[8] = 0;
|
|
59
|
+
header[9] = 0;
|
|
60
|
+
header.writeUInt16LE(1, 10);
|
|
61
|
+
header.writeUInt16LE(32, 12);
|
|
62
|
+
header.writeUInt32LE(png.length, 14);
|
|
63
|
+
header.writeUInt32LE(22, 18);
|
|
64
|
+
return Buffer.concat([header, png]);
|
|
65
|
+
}
|
|
66
|
+
export function trayIconPaths(env = process.env) {
|
|
67
|
+
const directory = daemonStateDir(env);
|
|
68
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
69
|
+
const png = join(directory, "bizar-tray.png");
|
|
70
|
+
const ico = join(directory, "bizar-tray.ico");
|
|
71
|
+
if (!existsSync(png) || !existsSync(ico)) {
|
|
72
|
+
const image = createPng();
|
|
73
|
+
writeFileSync(png, image, { mode: 0o600 });
|
|
74
|
+
writeFileSync(ico, createIco(image), { mode: 0o600 });
|
|
75
|
+
}
|
|
76
|
+
return { png, ico };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=tray-icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tray-icons.js","sourceRoot":"","sources":["../../../src/omp/tray-icons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MenuItem } from "@trayjs/trayjs";
|
|
2
|
+
export interface TrayInfo {
|
|
3
|
+
pid: number;
|
|
4
|
+
startedAt: number;
|
|
5
|
+
}
|
|
6
|
+
export interface TrayStatus {
|
|
7
|
+
state: "running" | "stopped" | "stale" | "unsupported";
|
|
8
|
+
tray?: TrayInfo;
|
|
9
|
+
}
|
|
10
|
+
export interface TrayService {
|
|
11
|
+
ready: Promise<void>;
|
|
12
|
+
closed: Promise<void>;
|
|
13
|
+
close(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare const trayLockPath: (env?: NodeJS.ProcessEnv) => string;
|
|
16
|
+
export declare const trayLogPath: (env?: NodeJS.ProcessEnv) => string;
|
|
17
|
+
export declare function readTrayStatus(env?: NodeJS.ProcessEnv): TrayStatus;
|
|
18
|
+
export declare function trayMenuItems(env?: NodeJS.ProcessEnv): Promise<MenuItem[]>;
|
|
19
|
+
/** Run the native tray in the foreground. Unsupported hosts return cleanly. */
|
|
20
|
+
export declare function runTrayService(env?: NodeJS.ProcessEnv): Promise<TrayService | undefined>;
|
|
21
|
+
export declare function startTray(env?: NodeJS.ProcessEnv): Promise<TrayInfo | undefined>;
|
|
22
|
+
export declare function stopTray(env?: NodeJS.ProcessEnv): Promise<boolean>;
|
|
23
|
+
export declare function runTrayForeground(env?: NodeJS.ProcessEnv): Promise<number>;
|