@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,361 @@
|
|
|
1
|
+
import { open, readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/** Journal silence after which activity is labelled stale rather than current. */
|
|
4
|
+
export const ACTIVITY_STALE_SECONDS = 90;
|
|
5
|
+
/** Journal silence after which an unfinished phase is labelled stalled. */
|
|
6
|
+
export const ACTIVITY_STALL_SECONDS = 300;
|
|
7
|
+
/** Bytes read from the end of a journal for activity. */
|
|
8
|
+
export const JOURNAL_TAIL_BYTES = 96 * 1024;
|
|
9
|
+
/** Bytes read from the start of a journal for session metadata. */
|
|
10
|
+
export const JOURNAL_HEAD_BYTES = 128 * 1024;
|
|
11
|
+
/** Stop reasons that mean the assistant finished its turn instead of continuing. */
|
|
12
|
+
const TURN_END_REASONS = {
|
|
13
|
+
stop: true,
|
|
14
|
+
endTurn: true,
|
|
15
|
+
end_turn: true,
|
|
16
|
+
stop_sequence: true,
|
|
17
|
+
length: true,
|
|
18
|
+
max_tokens: true,
|
|
19
|
+
content_filter: true,
|
|
20
|
+
aborted: true,
|
|
21
|
+
cancelled: true,
|
|
22
|
+
};
|
|
23
|
+
const file = (target, verb, past) => ({
|
|
24
|
+
active: `${verb} ${target ?? "a file"}`,
|
|
25
|
+
done: `${past} ${target ?? "a file"}`,
|
|
26
|
+
});
|
|
27
|
+
const TOOL_PROFILES = {
|
|
28
|
+
read: { phase: "researching", describe: target => file(target, "Reading", "Read") },
|
|
29
|
+
grep: { phase: "researching", describe: () => ({ active: "Searching the codebase", done: "Searched the codebase" }) },
|
|
30
|
+
glob: { phase: "researching", describe: () => ({ active: "Finding matching files", done: "Found matching files" }) },
|
|
31
|
+
web_search: { phase: "researching", describe: () => ({ active: "Researching sources", done: "Researched sources" }) },
|
|
32
|
+
fetch: { phase: "researching", describe: () => ({ active: "Fetching a source", done: "Fetched a source" }) },
|
|
33
|
+
lsp: { phase: "researching", describe: target => file(target, "Inspecting", "Inspected") },
|
|
34
|
+
skill: { phase: "researching", describe: () => ({ active: "Loading skill guidance", done: "Loaded skill guidance" }) },
|
|
35
|
+
edit: { phase: "editing", describe: target => file(target, "Editing", "Edited") },
|
|
36
|
+
write: { phase: "editing", describe: target => file(target, "Writing", "Wrote") },
|
|
37
|
+
multi_edit: { phase: "editing", describe: target => file(target, "Editing", "Edited") },
|
|
38
|
+
ast_edit: { phase: "editing", describe: target => file(target, "Rewriting", "Rewrote") },
|
|
39
|
+
bash: { phase: "running", describe: () => ({ active: "Running a command", done: "Ran a command" }) },
|
|
40
|
+
eval: { phase: "running", describe: () => ({ active: "Running a script", done: "Ran a script" }) },
|
|
41
|
+
debug: { phase: "running", describe: () => ({ active: "Debugging", done: "Debugged" }) },
|
|
42
|
+
browser: { phase: "running", describe: () => ({ active: "Driving a browser", done: "Drove a browser" }) },
|
|
43
|
+
todo: { phase: "planning", describe: () => ({ active: "Updating the plan", done: "Updated the plan" }) },
|
|
44
|
+
task: { phase: "delegating", describe: target => ({ active: `Delegating to ${target ?? "a subagent"}`, done: `Delegated to ${target ?? "a subagent"}` }) },
|
|
45
|
+
agent: { phase: "delegating", describe: target => ({ active: `Delegating to ${target ?? "a subagent"}`, done: `Delegated to ${target ?? "a subagent"}` }) },
|
|
46
|
+
hub: { phase: "delegating", describe: () => ({ active: "Coordinating agents", done: "Coordinated agents" }) },
|
|
47
|
+
ask: { phase: "waiting", describe: () => ({ active: "Waiting for your input", done: "Asked for your input" }) },
|
|
48
|
+
reviewer: { phase: "reviewing", describe: target => file(target, "Reviewing", "Reviewed") },
|
|
49
|
+
security_reviewer: { phase: "reviewing", describe: target => file(target, "Reviewing", "Reviewed") },
|
|
50
|
+
verifier: { phase: "reviewing", describe: target => file(target, "Verifying", "Verified") },
|
|
51
|
+
scout: { phase: "researching", describe: target => file(target, "Scouting", "Scouted") },
|
|
52
|
+
};
|
|
53
|
+
const PATH_ARGUMENTS = ["path", "file", "file_path", "filename", "target", "notebook"];
|
|
54
|
+
const LABEL_ARGUMENTS = ["agent", "name"];
|
|
55
|
+
const TEST_COMMAND = /\b(vitest|jest|pytest|mocha|playwright|npm (run )?test|bun test|yarn test|pnpm test|go test|cargo test|ctest)\b/;
|
|
56
|
+
const BUILD_COMMAND = /\b(tsc|build|make|gradle|cmake|npm run build|cargo build|go build)\b/;
|
|
57
|
+
const INSTALL_COMMAND = /\b(npm|pnpm|yarn|bun|pip|uv|apt|dnf|brew|pacman)\b[^\n]{0,40}\b(install|add|i|sync)\b/;
|
|
58
|
+
/** Classify a shell command by intent; the command text itself is never surfaced. */
|
|
59
|
+
function bashDescription(command) {
|
|
60
|
+
const text = cleanLine(command);
|
|
61
|
+
if (!text)
|
|
62
|
+
return { active: "Running a command", done: "Ran a command" };
|
|
63
|
+
if (TEST_COMMAND.test(text))
|
|
64
|
+
return { active: "Running tests", done: "Ran tests" };
|
|
65
|
+
if (BUILD_COMMAND.test(text))
|
|
66
|
+
return { active: "Building the project", done: "Built the project" };
|
|
67
|
+
if (INSTALL_COMMAND.test(text))
|
|
68
|
+
return { active: "Installing dependencies", done: "Installed dependencies" };
|
|
69
|
+
if (/\bgit\b/.test(text))
|
|
70
|
+
return { active: "Running git", done: "Ran git" };
|
|
71
|
+
return { active: "Running a command", done: "Ran a command" };
|
|
72
|
+
}
|
|
73
|
+
function asRecord(value) {
|
|
74
|
+
return typeof value === "object" && value !== null ? value : undefined;
|
|
75
|
+
}
|
|
76
|
+
function cleanLine(value) {
|
|
77
|
+
if (typeof value !== "string")
|
|
78
|
+
return undefined;
|
|
79
|
+
const cleaned = value
|
|
80
|
+
.split(/\r?\n/, 1)[0]
|
|
81
|
+
?.replace(/[\x00-\x1F\x7F]/g, "")
|
|
82
|
+
.replace(/\s+/g, " ")
|
|
83
|
+
.trim();
|
|
84
|
+
return cleaned || undefined;
|
|
85
|
+
}
|
|
86
|
+
function timestampMs(value) {
|
|
87
|
+
if (typeof value === "number")
|
|
88
|
+
return Number.isFinite(value) ? value : undefined;
|
|
89
|
+
if (typeof value !== "string")
|
|
90
|
+
return undefined;
|
|
91
|
+
const parsed = Date.parse(value);
|
|
92
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
93
|
+
}
|
|
94
|
+
/** Keep the tail of a long path so the file name stays readable. */
|
|
95
|
+
function shortenPath(value, width = 44) {
|
|
96
|
+
if (value.length <= width)
|
|
97
|
+
return value;
|
|
98
|
+
const parts = value.split("/").filter(Boolean);
|
|
99
|
+
let tail = parts.at(-1) ?? value;
|
|
100
|
+
for (let index = parts.length - 2; index >= 0; index -= 1) {
|
|
101
|
+
const next = `${parts[index]}/${tail}`;
|
|
102
|
+
if (next.length > width - 2)
|
|
103
|
+
break;
|
|
104
|
+
tail = next;
|
|
105
|
+
}
|
|
106
|
+
return tail === value ? `${value.slice(0, width - 1)}…` : `…/${tail}`;
|
|
107
|
+
}
|
|
108
|
+
function safeToolName(name) {
|
|
109
|
+
return name.replace(/[^A-Za-z0-9_.:-]/g, "").slice(0, 28) || "tool";
|
|
110
|
+
}
|
|
111
|
+
/** The one safe argument a tool call may contribute: a path or a target name. */
|
|
112
|
+
function toolTarget(name, args) {
|
|
113
|
+
if (!args)
|
|
114
|
+
return undefined;
|
|
115
|
+
const keys = name === "task" || name === "agent" ? LABEL_ARGUMENTS : PATH_ARGUMENTS;
|
|
116
|
+
for (const key of keys) {
|
|
117
|
+
const value = cleanLine(args[key]);
|
|
118
|
+
if (!value)
|
|
119
|
+
continue;
|
|
120
|
+
return keys === LABEL_ARGUMENTS ? value.slice(0, 32) : shortenPath(value);
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
/** Map one tool call to a phase and a safe one-line description. */
|
|
125
|
+
export function describeToolActivity(name, args, completed) {
|
|
126
|
+
if (name === "bash") {
|
|
127
|
+
const description = bashDescription(args?.command);
|
|
128
|
+
return { phase: "running", label: completed ? description.done : description.active };
|
|
129
|
+
}
|
|
130
|
+
const profile = TOOL_PROFILES[name];
|
|
131
|
+
if (!profile) {
|
|
132
|
+
const label = safeToolName(name);
|
|
133
|
+
return { phase: "running", label: completed ? `Finished ${label}` : `Running ${label}` };
|
|
134
|
+
}
|
|
135
|
+
const description = profile.describe(toolTarget(name, args));
|
|
136
|
+
return { phase: profile.phase, label: completed ? description.done : description.active };
|
|
137
|
+
}
|
|
138
|
+
/** Read a bounded slice of a journal: `head` bytes from the start or the end. */
|
|
139
|
+
async function readJournalSlice(source, maxBytes, fromEnd) {
|
|
140
|
+
let handle;
|
|
141
|
+
try {
|
|
142
|
+
handle = await open(source, "r");
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const size = (await handle.stat()).size;
|
|
149
|
+
if (size === 0)
|
|
150
|
+
return "";
|
|
151
|
+
const length = Math.min(size, maxBytes);
|
|
152
|
+
const start = fromEnd ? size - length : 0;
|
|
153
|
+
const buffer = Buffer.allocUnsafe(length);
|
|
154
|
+
let filled = 0;
|
|
155
|
+
while (filled < length) {
|
|
156
|
+
const read = await handle.read(buffer, filled, length - filled, start + filled);
|
|
157
|
+
if (read.bytesRead <= 0)
|
|
158
|
+
break;
|
|
159
|
+
filled += read.bytesRead;
|
|
160
|
+
}
|
|
161
|
+
let text = buffer.subarray(0, filled).toString("utf8");
|
|
162
|
+
if (fromEnd && length < size) {
|
|
163
|
+
const newline = text.indexOf("\n");
|
|
164
|
+
text = newline === -1 ? "" : text.slice(newline + 1);
|
|
165
|
+
}
|
|
166
|
+
return text;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
await handle.close();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** Read the head of a journal as text, for session metadata. */
|
|
176
|
+
export function readJournalHead(source, maxBytes = JOURNAL_HEAD_BYTES) {
|
|
177
|
+
return readJournalSlice(source, maxBytes, false);
|
|
178
|
+
}
|
|
179
|
+
/** Parse complete JSONL entries from the tail of a journal. */
|
|
180
|
+
export async function readJournalTail(source, maxBytes = JOURNAL_TAIL_BYTES) {
|
|
181
|
+
const text = await readJournalSlice(source, maxBytes, true);
|
|
182
|
+
if (!text)
|
|
183
|
+
return [];
|
|
184
|
+
const entries = [];
|
|
185
|
+
for (const line of text.split("\n")) {
|
|
186
|
+
const trimmed = line.trim();
|
|
187
|
+
if (!trimmed || trimmed[0] !== "{")
|
|
188
|
+
continue;
|
|
189
|
+
try {
|
|
190
|
+
entries.push(JSON.parse(trimmed));
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// A partially written final line must not hide the entries before it.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return entries;
|
|
197
|
+
}
|
|
198
|
+
/** Journals in a session directory, oldest first; compaction sidecars are skipped. */
|
|
199
|
+
export async function listSessionJournals(sessionDir) {
|
|
200
|
+
let names;
|
|
201
|
+
try {
|
|
202
|
+
names = (await readdir(sessionDir, { withFileTypes: true }))
|
|
203
|
+
.filter(entry => entry.isFile() && entry.name.endsWith(".jsonl") && !entry.name.startsWith("__"))
|
|
204
|
+
.map(entry => entry.name);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
return names.sort().map(name => join(sessionDir, name));
|
|
210
|
+
}
|
|
211
|
+
/** Compact age such as `12s`, `4m`, `3h`, `2d`. */
|
|
212
|
+
export function compactAge(seconds) {
|
|
213
|
+
if (seconds === undefined)
|
|
214
|
+
return "unknown";
|
|
215
|
+
if (seconds < 60)
|
|
216
|
+
return `${seconds}s`;
|
|
217
|
+
if (seconds < 3600)
|
|
218
|
+
return `${Math.floor(seconds / 60)}m`;
|
|
219
|
+
if (seconds < 86400)
|
|
220
|
+
return `${Math.floor(seconds / 3600)}h`;
|
|
221
|
+
return `${Math.floor(seconds / 86400)}d`;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* One-line activity label for any hub surface.
|
|
225
|
+
*
|
|
226
|
+
* Stale and stalled activity is labelled instead of presented as current, so a
|
|
227
|
+
* reader can never mistake an old journal for live work.
|
|
228
|
+
*/
|
|
229
|
+
export function activitySummary(activity) {
|
|
230
|
+
if (!activity)
|
|
231
|
+
return "No recent activity";
|
|
232
|
+
if (activity.phase === "stalled")
|
|
233
|
+
return `${activity.label} · stalled`;
|
|
234
|
+
if (activity.stale && activity.phase !== "waiting")
|
|
235
|
+
return `${activity.label} · stale`;
|
|
236
|
+
return activity.label;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Derive the current activity from journal entries.
|
|
240
|
+
*
|
|
241
|
+
* Only the newest conversational entries matter: a tool call without a result
|
|
242
|
+
* means work is in flight, a completed turn means the agent is waiting for
|
|
243
|
+
* input, and anything else means the next response is being produced.
|
|
244
|
+
*/
|
|
245
|
+
export function deriveSessionActivity(entries, options = {}) {
|
|
246
|
+
const now = options.now ?? Date.now();
|
|
247
|
+
const pending = new Map();
|
|
248
|
+
let updatedAt = options.fallbackUpdatedAt ?? 0;
|
|
249
|
+
let phaseStartedAt;
|
|
250
|
+
let conversationSeen = false;
|
|
251
|
+
let awaitingInput = false;
|
|
252
|
+
let lastTool;
|
|
253
|
+
for (const rawEntry of entries) {
|
|
254
|
+
const entry = asRecord(rawEntry);
|
|
255
|
+
if (!entry)
|
|
256
|
+
continue;
|
|
257
|
+
const at = timestampMs(entry.timestamp) ?? timestampMs(entry.updatedAt);
|
|
258
|
+
if (at !== undefined && at > updatedAt)
|
|
259
|
+
updatedAt = at;
|
|
260
|
+
if (entry.type !== "message")
|
|
261
|
+
continue;
|
|
262
|
+
const message = asRecord(entry.message);
|
|
263
|
+
if (!message)
|
|
264
|
+
continue;
|
|
265
|
+
const role = message.role;
|
|
266
|
+
conversationSeen = true;
|
|
267
|
+
if (role === "toolResult") {
|
|
268
|
+
const id = typeof message.toolCallId === "string" ? message.toolCallId : undefined;
|
|
269
|
+
const call = id ? pending.get(id) : undefined;
|
|
270
|
+
if (id)
|
|
271
|
+
pending.delete(id);
|
|
272
|
+
lastTool = call
|
|
273
|
+
? { name: call.name, args: call.args, completed: true }
|
|
274
|
+
: { name: typeof message.toolName === "string" ? message.toolName : "tool", completed: true };
|
|
275
|
+
awaitingInput = false;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (role === "user") {
|
|
279
|
+
awaitingInput = false;
|
|
280
|
+
lastTool = undefined;
|
|
281
|
+
if (at !== undefined)
|
|
282
|
+
phaseStartedAt = at;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (role !== "assistant")
|
|
286
|
+
continue;
|
|
287
|
+
const content = Array.isArray(message.content) ? message.content : [];
|
|
288
|
+
let calledTool = false;
|
|
289
|
+
for (const rawPart of content) {
|
|
290
|
+
const part = asRecord(rawPart);
|
|
291
|
+
if (part?.type !== "toolCall")
|
|
292
|
+
continue;
|
|
293
|
+
const name = typeof part.name === "string" ? part.name : "tool";
|
|
294
|
+
const args = asRecord(part.arguments);
|
|
295
|
+
const id = typeof part.id === "string" ? part.id : undefined;
|
|
296
|
+
if (id)
|
|
297
|
+
pending.set(id, { name, args });
|
|
298
|
+
lastTool = { name, args, completed: false };
|
|
299
|
+
calledTool = true;
|
|
300
|
+
}
|
|
301
|
+
const stopReason = typeof message.stopReason === "string" ? message.stopReason : undefined;
|
|
302
|
+
awaitingInput = !calledTool && (stopReason === undefined || TURN_END_REASONS[stopReason] === true);
|
|
303
|
+
if (at !== undefined && (!awaitingInput || phaseStartedAt === undefined))
|
|
304
|
+
phaseStartedAt = at;
|
|
305
|
+
}
|
|
306
|
+
const resolvedUpdatedAt = updatedAt > 0 ? updatedAt : undefined;
|
|
307
|
+
const ageSeconds = resolvedUpdatedAt === undefined ? undefined : Math.max(0, Math.floor((now - resolvedUpdatedAt) / 1000));
|
|
308
|
+
const stale = ageSeconds !== undefined && ageSeconds >= ACTIVITY_STALE_SECONDS;
|
|
309
|
+
if (!conversationSeen) {
|
|
310
|
+
return {
|
|
311
|
+
phase: "unknown",
|
|
312
|
+
label: "No recent activity",
|
|
313
|
+
running: false,
|
|
314
|
+
awaitingInput: false,
|
|
315
|
+
updatedAt: resolvedUpdatedAt,
|
|
316
|
+
ageSeconds,
|
|
317
|
+
phaseStartedAt,
|
|
318
|
+
stale,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const inFlight = [...pending.values()].at(-1);
|
|
322
|
+
let phase;
|
|
323
|
+
let label;
|
|
324
|
+
let running = false;
|
|
325
|
+
let tool;
|
|
326
|
+
if (inFlight) {
|
|
327
|
+
const described = describeToolActivity(inFlight.name, inFlight.args, false);
|
|
328
|
+
phase = described.phase;
|
|
329
|
+
label = described.label;
|
|
330
|
+
tool = inFlight.name;
|
|
331
|
+
running = true;
|
|
332
|
+
}
|
|
333
|
+
else if (awaitingInput) {
|
|
334
|
+
phase = "waiting";
|
|
335
|
+
label = "Waiting for input";
|
|
336
|
+
}
|
|
337
|
+
else if (lastTool?.completed) {
|
|
338
|
+
const described = describeToolActivity(lastTool.name, lastTool.args, true);
|
|
339
|
+
phase = described.phase;
|
|
340
|
+
label = described.label;
|
|
341
|
+
tool = lastTool.name;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
phase = "planning";
|
|
345
|
+
label = "Producing the next response";
|
|
346
|
+
}
|
|
347
|
+
if (!awaitingInput && ageSeconds !== undefined && ageSeconds >= ACTIVITY_STALL_SECONDS)
|
|
348
|
+
phase = "stalled";
|
|
349
|
+
return {
|
|
350
|
+
phase,
|
|
351
|
+
label,
|
|
352
|
+
tool,
|
|
353
|
+
running,
|
|
354
|
+
awaitingInput,
|
|
355
|
+
updatedAt: resolvedUpdatedAt,
|
|
356
|
+
ageSeconds,
|
|
357
|
+
phaseStartedAt,
|
|
358
|
+
stale,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=session-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-activity.js","sourceRoot":"","sources":["../../../src/omp/session-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type SessionControlAction = "detach" | "pause-admission" | "cancel-workflow" | "terminate-session" | "stop-daemon";
|
|
2
|
+
export interface SessionControlState {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
owner: string;
|
|
5
|
+
revision: number;
|
|
6
|
+
actionKeys: string[];
|
|
7
|
+
admission: "open" | "paused" | "cancelled";
|
|
8
|
+
}
|
|
9
|
+
export declare function applySessionControl(state: SessionControlState, action: SessionControlAction, request: {
|
|
10
|
+
owner: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
expectedRevision: number;
|
|
13
|
+
idempotencyKey: string;
|
|
14
|
+
}): {
|
|
15
|
+
state: SessionControlState;
|
|
16
|
+
repeated: boolean;
|
|
17
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ContractError, OwnershipError } from "../core/errors.js";
|
|
2
|
+
export function applySessionControl(state, action, request) {
|
|
3
|
+
if (request.sessionId !== state.sessionId)
|
|
4
|
+
throw new OwnershipError("Session target does not match");
|
|
5
|
+
if (request.owner !== state.owner)
|
|
6
|
+
throw new OwnershipError("Only the current session owner may control the workflow");
|
|
7
|
+
if (request.expectedRevision !== state.revision)
|
|
8
|
+
throw new ContractError("Session control revision is stale");
|
|
9
|
+
if (state.actionKeys.includes(request.idempotencyKey))
|
|
10
|
+
return { state, repeated: true };
|
|
11
|
+
const nextAdmission = action === "pause-admission" ? "paused" : action === "cancel-workflow" ? "cancelled" : state.admission;
|
|
12
|
+
return { state: { ...state, revision: state.revision + 1, actionKeys: [...state.actionKeys, request.idempotencyKey], admission: nextAdmission }, repeated: false };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=session-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-controls.js","sourceRoot":"","sources":["../../../src/omp/session-controls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGlE,MAAM,UAAU,mBAAmB,CAAC,KAA0B,EAAE,MAA4B,EAAE,OAA+F;IAC3L,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAAE,MAAM,IAAI,cAAc,CAAC,+BAA+B,CAAC,CAAC;IACrG,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAAE,MAAM,IAAI,cAAc,CAAC,yDAAyD,CAAC,CAAC;IACvH,IAAI,OAAO,CAAC,gBAAgB,KAAK,KAAK,CAAC,QAAQ;QAAE,MAAM,IAAI,aAAa,CAAC,mCAAmC,CAAC,CAAC;IAC9G,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxF,MAAM,aAAa,GAAG,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7H,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACrK,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export interface TmuxLaunchEnvironment {
|
|
2
|
+
env?: NodeJS.ProcessEnv;
|
|
3
|
+
stdinIsTTY?: boolean;
|
|
4
|
+
stdoutIsTTY?: boolean;
|
|
5
|
+
args?: string[];
|
|
6
|
+
}
|
|
7
|
+
/** Whether `omb` should own this interactive terminal through tmux. */
|
|
8
|
+
export declare function shouldLaunchOmbInTmux(options?: TmuxLaunchEnvironment): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Stable per-project session name so subsequent `omb` calls reconnect safely.
|
|
11
|
+
* A session id creates an additional durable session in the same project.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ombSessionName(cwd: string, sessionId?: string): string;
|
|
14
|
+
/** Resolve an executable on `$PATH`, or an explicit path when it contains a slash. */
|
|
15
|
+
export declare function findOnPath(bin: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
16
|
+
export interface OmbAttachLaunch {
|
|
17
|
+
spawned: boolean;
|
|
18
|
+
/** Attach command, always returned so a UI can offer it for copying. */
|
|
19
|
+
command: string;
|
|
20
|
+
terminal?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface OmbSessionConsole {
|
|
23
|
+
code: number;
|
|
24
|
+
text: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Lines of history kept for the window an OMB session runs in.
|
|
28
|
+
*
|
|
29
|
+
* tmux defaults to 2000 lines, which a long OMP chat scrolls past in one
|
|
30
|
+
* sitting: the pane then drops the messages the operator needs to review and
|
|
31
|
+
* neither the wheel binding nor copy-mode can bring them back. `history-limit`
|
|
32
|
+
* is a window option, so it is set on the session's own window — every other
|
|
33
|
+
* tmux session keeps the limit its owner configured.
|
|
34
|
+
*/
|
|
35
|
+
export declare const OMB_SESSION_HISTORY_LIMIT = 100000;
|
|
36
|
+
/**
|
|
37
|
+
* Raise one Bizar-owned session's window history limit. Idempotent, so attach
|
|
38
|
+
* paths run it too: a session created before the limit was raised must not stay
|
|
39
|
+
* capped at 2000 lines for the rest of its life.
|
|
40
|
+
*/
|
|
41
|
+
export declare function raiseOmbSessionHistory(session: string, cwd?: string, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
42
|
+
/** Capture a bounded, plain-text view of one Bizar-owned session's active pane. */
|
|
43
|
+
export declare function captureOmbSessionConsole(session: string, cwd?: string, env?: NodeJS.ProcessEnv, lines?: number): Promise<OmbSessionConsole>;
|
|
44
|
+
/** Send literal composer text followed by Enter to one Bizar-owned session. */
|
|
45
|
+
export declare function sendOmbSessionInput(session: string, input: string, cwd?: string, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
46
|
+
/**
|
|
47
|
+
* Open one Bizar-owned session in a new terminal emulator window. The daemon
|
|
48
|
+
* and hub run without a controlling TTY, so attaching means handing the attach
|
|
49
|
+
* command to a terminal we spawn; when no emulator exists the caller still
|
|
50
|
+
* receives the exact command to run by hand. Attaching is also where a session
|
|
51
|
+
* created before the history limit was raised is repaired, because an operator
|
|
52
|
+
* attaching to a long-running chat is the one who needs its scrollback.
|
|
53
|
+
*/
|
|
54
|
+
export declare function openOmbSessionInTerminal(session: string, env?: NodeJS.ProcessEnv): Promise<OmbAttachLaunch>;
|
|
55
|
+
/** Open a fixed Bizar CLI command in a new terminal emulator window. */
|
|
56
|
+
export declare function openCommandInTerminal(command: string, env?: NodeJS.ProcessEnv): OmbAttachLaunch;
|
|
57
|
+
/** Apply the launcher mouse preference to one exact Bizar-owned session. */
|
|
58
|
+
export declare function setOmbSessionMouse(session: string, enabled: boolean, cwd?: string, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
59
|
+
/** Rename one exact Bizar-owned tmux session. */
|
|
60
|
+
export declare function renameOmbSession(session: string, nextName: string, cwd?: string, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
61
|
+
/**
|
|
62
|
+
* Whether the multiplexer still hosts this exact session.
|
|
63
|
+
*
|
|
64
|
+
* `unknown` means the multiplexer could not be run at all, so a missing row
|
|
65
|
+
* must never be read as a session that is gone: a caller that reports a kill
|
|
66
|
+
* has to say which of the two it proved.
|
|
67
|
+
*/
|
|
68
|
+
export declare function ombSessionLiveness(session: string, cwd?: string, env?: NodeJS.ProcessEnv): Promise<"live" | "gone" | "unknown">;
|
|
69
|
+
/** Kill one exact Bizar-owned tmux session after the caller has confirmed it. */
|
|
70
|
+
export declare function deleteOmbSession(session: string, cwd?: string, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
71
|
+
/** Hide an unhosted journal record that has no tmux session left to kill. */
|
|
72
|
+
export declare function forgetOmbSession(session: string, env?: NodeJS.ProcessEnv): number;
|
|
73
|
+
/** Attach to an existing Bizar session, switching the current tmux client when nested. */
|
|
74
|
+
export declare function attachOmbSession(session: string, cwd?: string, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Launch OMP from the shell boundary. OMP starts inside tmux before it probes
|
|
77
|
+
* the terminal; no second OMP process is handed the same raw terminal during
|
|
78
|
+
* startup.
|
|
79
|
+
*/
|
|
80
|
+
export declare function launchOmb(cwd: string, args: string[], env?: NodeJS.ProcessEnv, sessionId?: string): Promise<number>;
|
|
81
|
+
/**
|
|
82
|
+
* Create or refresh a Bizar-owned session without attaching a client. The
|
|
83
|
+
* dashboard uses this so a browser can start background work; the session
|
|
84
|
+
* gets the same durability and input options as an interactive `omb` launch.
|
|
85
|
+
*/
|
|
86
|
+
export declare function createOmbSession(cwd: string, args: string[], env?: NodeJS.ProcessEnv, sessionId?: string): Promise<{
|
|
87
|
+
name: string;
|
|
88
|
+
code: number;
|
|
89
|
+
}>;
|