open-multi-agent-kit 0.99.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -1
- package/README.md +3 -3
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bundled-coding-agent.d.ts +10 -0
- package/dist/bun/register-bundled-coding-agent.d.ts.map +1 -0
- package/dist/bun/register-bundled-coding-agent.js +12 -0
- package/dist/bun/register-bundled-coding-agent.js.map +1 -0
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/neo-cli.d.ts +9 -0
- package/dist/commands/neo-cli.d.ts.map +1 -0
- package/dist/commands/neo-cli.js +61 -0
- package/dist/commands/neo-cli.js.map +1 -0
- package/dist/coordination/awareness.d.ts +32 -0
- package/dist/coordination/awareness.d.ts.map +1 -0
- package/dist/coordination/awareness.js +55 -0
- package/dist/coordination/awareness.js.map +1 -0
- package/dist/coordination/broker.d.ts +79 -0
- package/dist/coordination/broker.d.ts.map +1 -0
- package/dist/coordination/broker.js +195 -0
- package/dist/coordination/broker.js.map +1 -0
- package/dist/coordination/index.d.ts +16 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +16 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/integration.d.ts +59 -0
- package/dist/coordination/integration.d.ts.map +1 -0
- package/dist/coordination/integration.js +126 -0
- package/dist/coordination/integration.js.map +1 -0
- package/dist/coordination/operation.d.ts +106 -0
- package/dist/coordination/operation.d.ts.map +1 -0
- package/dist/coordination/operation.js +179 -0
- package/dist/coordination/operation.js.map +1 -0
- package/dist/coordination/resource.d.ts +33 -0
- package/dist/coordination/resource.d.ts.map +1 -0
- package/dist/coordination/resource.js +89 -0
- package/dist/coordination/resource.js.map +1 -0
- package/dist/coordination/session.d.ts +74 -0
- package/dist/coordination/session.d.ts.map +1 -0
- package/dist/coordination/session.js +143 -0
- package/dist/coordination/session.js.map +1 -0
- package/dist/coordination/types.d.ts +68 -0
- package/dist/coordination/types.d.ts.map +1 -0
- package/dist/coordination/types.js +26 -0
- package/dist/coordination/types.js.map +1 -0
- package/dist/core/agent-session.d.ts +29 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +135 -37
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bundled-skills.d.ts +4 -0
- package/dist/core/bundled-skills.d.ts.map +1 -0
- package/dist/core/bundled-skills.js +32 -0
- package/dist/core/bundled-skills.js.map +1 -0
- package/dist/core/cli-diagnostics.d.ts +6 -0
- package/dist/core/cli-diagnostics.d.ts.map +1 -0
- package/dist/core/cli-diagnostics.js +20 -0
- package/dist/core/cli-diagnostics.js.map +1 -0
- package/dist/core/compaction/control-state.d.ts +41 -0
- package/dist/core/compaction/control-state.d.ts.map +1 -0
- package/dist/core/compaction/control-state.js +85 -0
- package/dist/core/compaction/control-state.js.map +1 -0
- package/dist/core/compaction/fallback.d.ts +60 -0
- package/dist/core/compaction/fallback.d.ts.map +1 -0
- package/dist/core/compaction/fallback.js +117 -0
- package/dist/core/compaction/fallback.js.map +1 -0
- package/dist/core/compaction/index.d.ts +2 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +2 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/context-budget-headroom-candidates.d.ts +16 -1
- package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-candidates.js +31 -13
- package/dist/core/context-budget-headroom-candidates.js.map +1 -1
- package/dist/core/context-budget-headroom-types.d.ts +7 -1
- package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-types.js +0 -1
- package/dist/core/context-budget-headroom-types.js.map +1 -1
- package/dist/core/context-budget-headroom.d.ts +22 -0
- package/dist/core/context-budget-headroom.d.ts.map +1 -1
- package/dist/core/context-budget-headroom.js +46 -2
- package/dist/core/context-budget-headroom.js.map +1 -1
- package/dist/core/context-budget-v2-global-pass.d.ts +21 -0
- package/dist/core/context-budget-v2-global-pass.d.ts.map +1 -0
- package/dist/core/context-budget-v2-global-pass.js +203 -0
- package/dist/core/context-budget-v2-global-pass.js.map +1 -0
- package/dist/core/context-budget-v2-input-validation.d.ts +4 -0
- package/dist/core/context-budget-v2-input-validation.d.ts.map +1 -0
- package/dist/core/context-budget-v2-input-validation.js +79 -0
- package/dist/core/context-budget-v2-input-validation.js.map +1 -0
- package/dist/core/context-budget-v2-observability.d.ts +15 -0
- package/dist/core/context-budget-v2-observability.d.ts.map +1 -0
- package/dist/core/context-budget-v2-observability.js +35 -0
- package/dist/core/context-budget-v2-observability.js.map +1 -0
- package/dist/core/context-budget-v2-planned-items.d.ts +17 -0
- package/dist/core/context-budget-v2-planned-items.d.ts.map +1 -0
- package/dist/core/context-budget-v2-planned-items.js +59 -0
- package/dist/core/context-budget-v2-planned-items.js.map +1 -0
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
- package/dist/core/context-budget-v2-planner.js +69 -51
- package/dist/core/context-budget-v2-planner.js.map +1 -1
- package/dist/core/context-budget-v2-scoring.d.ts +7 -1
- package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
- package/dist/core/context-budget-v2-scoring.js.map +1 -1
- package/dist/core/context-budget-v2-selection.d.ts +22 -3
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
- package/dist/core/context-budget-v2-selection.js +41 -59
- package/dist/core/context-budget-v2-selection.js.map +1 -1
- package/dist/core/context-budget-v2-tiers.d.ts.map +1 -1
- package/dist/core/context-budget-v2-tiers.js +9 -42
- package/dist/core/context-budget-v2-tiers.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +14 -2
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js +6 -1
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/extensions/bundled-virtual-modules.d.ts +15 -0
- package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/bundled-virtual-modules.js +63 -0
- package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +2 -42
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +6 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +10 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/loadout-runtime.d.ts +2 -8
- package/dist/core/loadout-runtime.d.ts.map +1 -1
- package/dist/core/loadout-runtime.js.map +1 -1
- package/dist/core/mcp/client.d.ts +27 -6
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +80 -20
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +10 -1
- package/dist/core/mcp/manager.d.ts.map +1 -1
- package/dist/core/mcp/manager.js +68 -9
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/mcp/protocol.d.ts +9 -3
- package/dist/core/mcp/protocol.d.ts.map +1 -1
- package/dist/core/mcp/protocol.js +61 -15
- package/dist/core/mcp/protocol.js.map +1 -1
- package/dist/core/mcp/stdio-transport.d.ts +12 -1
- package/dist/core/mcp/stdio-transport.d.ts.map +1 -1
- package/dist/core/mcp/stdio-transport.js +30 -2
- package/dist/core/mcp/stdio-transport.js.map +1 -1
- package/dist/core/mcp-descriptor-injection.d.ts +26 -0
- package/dist/core/mcp-descriptor-injection.d.ts.map +1 -0
- package/dist/core/mcp-descriptor-injection.js +25 -0
- package/dist/core/mcp-descriptor-injection.js.map +1 -0
- package/dist/core/mcp-public-presets.d.ts +1 -3
- package/dist/core/mcp-public-presets.d.ts.map +1 -1
- package/dist/core/mcp-public-presets.js +3 -15
- package/dist/core/mcp-public-presets.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +24 -3
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/neo/catalog.d.ts +20 -0
- package/dist/core/neo/catalog.d.ts.map +1 -0
- package/dist/core/neo/catalog.js +50 -0
- package/dist/core/neo/catalog.js.map +1 -0
- package/dist/core/neo/setup.d.ts +3 -0
- package/dist/core/neo/setup.d.ts.map +1 -0
- package/dist/core/neo/setup.js +47 -0
- package/dist/core/neo/setup.js.map +1 -0
- package/dist/core/provider-default-models.d.ts +2 -0
- package/dist/core/provider-default-models.d.ts.map +1 -1
- package/dist/core/provider-default-models.js +2 -0
- package/dist/core/provider-default-models.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +2 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/provider-error-classification.d.ts +57 -0
- package/dist/core/provider-error-classification.d.ts.map +1 -0
- package/dist/core/provider-error-classification.js +103 -0
- package/dist/core/provider-error-classification.js.map +1 -0
- package/dist/core/provider-resilience.d.ts +10 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +36 -3
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/provider-usage-commandcode.d.ts +9 -0
- package/dist/core/provider-usage-commandcode.d.ts.map +1 -0
- package/dist/core/provider-usage-commandcode.js +198 -0
- package/dist/core/provider-usage-commandcode.js.map +1 -0
- package/dist/core/provider-usage-devin.d.ts +5 -3
- package/dist/core/provider-usage-devin.d.ts.map +1 -1
- package/dist/core/provider-usage-devin.js +15 -5
- package/dist/core/provider-usage-devin.js.map +1 -1
- package/dist/core/provider-usage-types.d.ts +1 -1
- package/dist/core/provider-usage-types.d.ts.map +1 -1
- package/dist/core/provider-usage-types.js.map +1 -1
- package/dist/core/provider-usage.d.ts.map +1 -1
- package/dist/core/provider-usage.js +6 -0
- package/dist/core/provider-usage.js.map +1 -1
- package/dist/core/reasoning-router-resolver.d.ts +7 -0
- package/dist/core/reasoning-router-resolver.d.ts.map +1 -1
- package/dist/core/reasoning-router-resolver.js +21 -3
- package/dist/core/reasoning-router-resolver.js.map +1 -1
- package/dist/core/reasoning-router-v4.d.ts +8 -5
- package/dist/core/reasoning-router-v4.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4.js +8 -5
- package/dist/core/reasoning-router-v4.js.map +1 -1
- package/dist/core/resource-admission.d.ts +36 -0
- package/dist/core/resource-admission.d.ts.map +1 -1
- package/dist/core/resource-admission.js +59 -0
- package/dist/core/resource-admission.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/run-usage-ledger.d.ts +47 -0
- package/dist/core/run-usage-ledger.d.ts.map +1 -0
- package/dist/core/run-usage-ledger.js +162 -0
- package/dist/core/run-usage-ledger.js.map +1 -0
- package/dist/core/run-usage-operation.d.ts +8 -0
- package/dist/core/run-usage-operation.d.ts.map +1 -0
- package/dist/core/run-usage-operation.js +12 -0
- package/dist/core/run-usage-operation.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-compaction-service.d.ts +15 -0
- package/dist/core/session-compaction-service.d.ts.map +1 -1
- package/dist/core/session-compaction-service.js +17 -4
- package/dist/core/session-compaction-service.js.map +1 -1
- package/dist/core/session-failure-cause.d.ts.map +1 -1
- package/dist/core/session-failure-cause.js +14 -5
- package/dist/core/session-failure-cause.js.map +1 -1
- package/dist/core/session-prompt-lifecycle.d.ts +6 -0
- package/dist/core/session-prompt-lifecycle.d.ts.map +1 -1
- package/dist/core/session-prompt-lifecycle.js +47 -2
- package/dist/core/session-prompt-lifecycle.js.map +1 -1
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +4 -2
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/subagent-lane-authority.d.ts +28 -0
- package/dist/core/subagent-lane-authority.d.ts.map +1 -0
- package/dist/core/subagent-lane-authority.js +119 -0
- package/dist/core/subagent-lane-authority.js.map +1 -0
- package/dist/core/subagent-lane-contract.d.ts +114 -0
- package/dist/core/subagent-lane-contract.d.ts.map +1 -0
- package/dist/core/subagent-lane-contract.js +18 -0
- package/dist/core/subagent-lane-contract.js.map +1 -0
- package/dist/core/subagent-lane-launcher.d.ts +3 -6
- package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
- package/dist/core/subagent-lane-launcher.js +53 -12
- package/dist/core/subagent-lane-launcher.js.map +1 -1
- package/dist/core/subagent-orchestration.d.ts +4 -17
- package/dist/core/subagent-orchestration.d.ts.map +1 -1
- package/dist/core/subagent-orchestration.js.map +1 -1
- package/dist/core/todo-runtime-state.d.ts +12 -0
- package/dist/core/todo-runtime-state.d.ts.map +1 -1
- package/dist/core/todo-runtime-state.js +23 -0
- package/dist/core/todo-runtime-state.js.map +1 -1
- package/dist/core/verified-run/broker.d.ts.map +1 -1
- package/dist/core/verified-run/broker.js +4 -1
- package/dist/core/verified-run/broker.js.map +1 -1
- package/dist/core/workload-permit-pool.d.ts +1 -1
- package/dist/core/workload-permit-pool.d.ts.map +1 -1
- package/dist/core/workload-permit-pool.js +3 -0
- package/dist/core/workload-permit-pool.js.map +1 -1
- package/dist/guardrails/strict-evidence-approval-adapter.d.ts +34 -0
- package/dist/guardrails/strict-evidence-approval-adapter.d.ts.map +1 -0
- package/dist/guardrails/strict-evidence-approval-adapter.js +70 -0
- package/dist/guardrails/strict-evidence-approval-adapter.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +11 -18
- package/dist/main.js.map +1 -1
- package/dist/metacognition/calibration-selective.d.ts +78 -0
- package/dist/metacognition/calibration-selective.d.ts.map +1 -0
- package/dist/metacognition/calibration-selective.js +161 -0
- package/dist/metacognition/calibration-selective.js.map +1 -0
- package/dist/metacognition/calibration.d.ts +62 -0
- package/dist/metacognition/calibration.d.ts.map +1 -0
- package/dist/metacognition/calibration.js +122 -0
- package/dist/metacognition/calibration.js.map +1 -0
- package/dist/metacognition/checkpoint.d.ts +60 -0
- package/dist/metacognition/checkpoint.d.ts.map +1 -0
- package/dist/metacognition/checkpoint.js +57 -0
- package/dist/metacognition/checkpoint.js.map +1 -0
- package/dist/metacognition/context7.d.ts +48 -0
- package/dist/metacognition/context7.d.ts.map +1 -0
- package/dist/metacognition/context7.js +154 -0
- package/dist/metacognition/context7.js.map +1 -0
- package/dist/metacognition/decision.d.ts +44 -0
- package/dist/metacognition/decision.d.ts.map +1 -0
- package/dist/metacognition/decision.js +111 -0
- package/dist/metacognition/decision.js.map +1 -0
- package/dist/metacognition/evaluation.d.ts +73 -0
- package/dist/metacognition/evaluation.d.ts.map +1 -0
- package/dist/metacognition/evaluation.js +97 -0
- package/dist/metacognition/evaluation.js.map +1 -0
- package/dist/metacognition/index.d.ts +31 -0
- package/dist/metacognition/index.d.ts.map +1 -0
- package/dist/metacognition/index.js +31 -0
- package/dist/metacognition/index.js.map +1 -0
- package/dist/metacognition/knowledge-action.d.ts +43 -0
- package/dist/metacognition/knowledge-action.d.ts.map +1 -0
- package/dist/metacognition/knowledge-action.js +60 -0
- package/dist/metacognition/knowledge-action.js.map +1 -0
- package/dist/metacognition/knowledge.d.ts +84 -0
- package/dist/metacognition/knowledge.d.ts.map +1 -0
- package/dist/metacognition/knowledge.js +165 -0
- package/dist/metacognition/knowledge.js.map +1 -0
- package/dist/metacognition/obligations.d.ts +82 -0
- package/dist/metacognition/obligations.d.ts.map +1 -0
- package/dist/metacognition/obligations.js +139 -0
- package/dist/metacognition/obligations.js.map +1 -0
- package/dist/metacognition/observation-validity.d.ts +83 -0
- package/dist/metacognition/observation-validity.d.ts.map +1 -0
- package/dist/metacognition/observation-validity.js +118 -0
- package/dist/metacognition/observation-validity.js.map +1 -0
- package/dist/metacognition/observe.d.ts +45 -0
- package/dist/metacognition/observe.d.ts.map +1 -0
- package/dist/metacognition/observe.js +59 -0
- package/dist/metacognition/observe.js.map +1 -0
- package/dist/metacognition/policy.d.ts +53 -0
- package/dist/metacognition/policy.d.ts.map +1 -0
- package/dist/metacognition/policy.js +155 -0
- package/dist/metacognition/policy.js.map +1 -0
- package/dist/metacognition/predictions.d.ts +78 -0
- package/dist/metacognition/predictions.d.ts.map +1 -0
- package/dist/metacognition/predictions.js +181 -0
- package/dist/metacognition/predictions.js.map +1 -0
- package/dist/metacognition/retrieval.d.ts +53 -0
- package/dist/metacognition/retrieval.d.ts.map +1 -0
- package/dist/metacognition/retrieval.js +170 -0
- package/dist/metacognition/retrieval.js.map +1 -0
- package/dist/metacognition/risk.d.ts +48 -0
- package/dist/metacognition/risk.d.ts.map +1 -0
- package/dist/metacognition/risk.js +165 -0
- package/dist/metacognition/risk.js.map +1 -0
- package/dist/metacognition/route-economics.d.ts +95 -0
- package/dist/metacognition/route-economics.d.ts.map +1 -0
- package/dist/metacognition/route-economics.js +110 -0
- package/dist/metacognition/route-economics.js.map +1 -0
- package/dist/metacognition/runtime-bridge.d.ts +54 -0
- package/dist/metacognition/runtime-bridge.d.ts.map +1 -0
- package/dist/metacognition/runtime-bridge.js +140 -0
- package/dist/metacognition/runtime-bridge.js.map +1 -0
- package/dist/metacognition/skills.d.ts +42 -0
- package/dist/metacognition/skills.d.ts.map +1 -0
- package/dist/metacognition/skills.js +220 -0
- package/dist/metacognition/skills.js.map +1 -0
- package/dist/metacognition/state.d.ts +110 -0
- package/dist/metacognition/state.d.ts.map +1 -0
- package/dist/metacognition/state.js +52 -0
- package/dist/metacognition/state.js.map +1 -0
- package/dist/metacognition/validation.d.ts +19 -0
- package/dist/metacognition/validation.d.ts.map +1 -0
- package/dist/metacognition/validation.js +58 -0
- package/dist/metacognition/validation.js.map +1 -0
- package/dist/metacognition/verification.d.ts +93 -0
- package/dist/metacognition/verification.d.ts.map +1 -0
- package/dist/metacognition/verification.js +132 -0
- package/dist/metacognition/verification.js.map +1 -0
- package/dist/metacognition/verifier.d.ts +49 -0
- package/dist/metacognition/verifier.d.ts.map +1 -0
- package/dist/metacognition/verifier.js +88 -0
- package/dist/metacognition/verifier.js.map +1 -0
- package/dist/modes/acp/acp-agent.d.ts +24 -0
- package/dist/modes/acp/acp-agent.d.ts.map +1 -0
- package/dist/modes/acp/acp-agent.js +133 -0
- package/dist/modes/acp/acp-agent.js.map +1 -0
- package/dist/modes/acp/acp-mode.d.ts +4 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +34 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/acp-session.d.ts +4 -0
- package/dist/modes/acp/acp-session.d.ts.map +1 -0
- package/dist/modes/acp/acp-session.js +76 -0
- package/dist/modes/acp/acp-session.js.map +1 -0
- package/dist/modes/acp/acp-transport.d.ts +5 -0
- package/dist/modes/acp/acp-transport.d.ts.map +1 -0
- package/dist/modes/acp/acp-transport.js +90 -0
- package/dist/modes/acp/acp-transport.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/observation/identity.d.ts +14 -0
- package/dist/observation/identity.d.ts.map +1 -0
- package/dist/observation/identity.js +29 -0
- package/dist/observation/identity.js.map +1 -0
- package/dist/observation/index.d.ts +13 -0
- package/dist/observation/index.d.ts.map +1 -0
- package/dist/observation/index.js +13 -0
- package/dist/observation/index.js.map +1 -0
- package/dist/observation/observe-mode.d.ts +46 -0
- package/dist/observation/observe-mode.d.ts.map +1 -0
- package/dist/observation/observe-mode.js +83 -0
- package/dist/observation/observe-mode.js.map +1 -0
- package/dist/observation/store.d.ts +53 -0
- package/dist/observation/store.d.ts.map +1 -0
- package/dist/observation/store.js +126 -0
- package/dist/observation/store.js.map +1 -0
- package/dist/observation/types.d.ts +72 -0
- package/dist/observation/types.d.ts.map +1 -0
- package/dist/observation/types.js +9 -0
- package/dist/observation/types.js.map +1 -0
- package/dist/observation/view.d.ts +39 -0
- package/dist/observation/view.d.ts.map +1 -0
- package/dist/observation/view.js +173 -0
- package/dist/observation/view.js.map +1 -0
- package/docs/audit-revalidation-2026-09-17.md +77 -0
- package/docs/devin-harness.md +33 -4
- package/docs/ecraf-normalization.md +83 -0
- package/docs/metacognition.md +51 -0
- package/docs/model-catalog-refresh.md +110 -1
- package/docs/models.md +1 -1
- package/docs/neo.md +134 -0
- package/docs/providers.md +125 -6
- package/docs/run-usage-ledger.md +56 -0
- package/docs/runtime-algorithms.md +151 -3
- package/docs/skills.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/adaptive-agent-runtime.ts +14 -1
- package/examples/extensions/subagent/graph-result.ts +48 -0
- package/examples/extensions/subagent/index.ts +246 -111
- package/examples/extensions/subagent/managed-process-tree.ts +42 -0
- package/examples/extensions/subagent/managed-process.test.ts +24 -0
- package/examples/extensions/subagent/managed-process.ts +93 -112
- package/examples/extensions/subagent/subagent-runtime-types.ts +17 -1
- package/examples/extensions/subagent/subagent-stream.ts +161 -0
- package/examples/extensions/terminal-browser/README.md +54 -0
- package/examples/extensions/terminal-browser/bridge-protocol.ts +29 -0
- package/examples/extensions/terminal-browser/bridge.ts +219 -0
- package/examples/extensions/terminal-browser/browser-surface.ts +288 -0
- package/examples/extensions/terminal-browser/index.ts +215 -0
- package/examples/extensions/terminal-browser/placeholders.ts +49 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +18 -18
- package/package.json +8 -7
- package/resources/neo/skills/omk-browser/SKILL.md +32 -0
- package/resources/neo/skills/omk-code-review/SKILL.md +24 -0
- package/resources/neo/skills/omk-computeruse/SKILL.md +34 -0
- package/resources/neo/skills/omk-mcp-setup/SKILL.md +48 -0
- package/resources/neo/skills/omk-research/SKILL.md +24 -0
- package/resources/neo/skills/omk-site/SKILL.md +28 -0
|
@@ -6,11 +6,12 @@ import {
|
|
|
6
6
|
spawn,
|
|
7
7
|
} from "node:child_process";
|
|
8
8
|
import type { Readable } from "node:stream";
|
|
9
|
+
import { processGroupState, signalProcessTree } from "./managed-process-tree.ts";
|
|
9
10
|
|
|
10
11
|
type ManagedChild = ChildProcessByStdio<null, Readable, Readable>;
|
|
11
12
|
type ManagedSpawnOptions = SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioPipe>;
|
|
12
13
|
|
|
13
|
-
export type ManagedProcessReason = "completed" | "cutoff" | "aborted" | "spawn-error";
|
|
14
|
+
export type ManagedProcessReason = "completed" | "cutoff" | "aborted" | "spawn-error" | "signal" | "callback-error";
|
|
14
15
|
|
|
15
16
|
export interface ManagedProcessCleanup {
|
|
16
17
|
readonly termSent: boolean;
|
|
@@ -25,6 +26,10 @@ export interface ManagedProcessResult {
|
|
|
25
26
|
readonly reason: ManagedProcessReason;
|
|
26
27
|
readonly elapsedMs: number;
|
|
27
28
|
readonly cleanup: ManagedProcessCleanup;
|
|
29
|
+
/** Snapshot at response time. False means the owner must retain its reservation. */
|
|
30
|
+
readonly terminationObserved: boolean;
|
|
31
|
+
/** Resolves only on confirmed termination or confirmed failure to start, never on a timeout. */
|
|
32
|
+
readonly settlement: Promise<void>;
|
|
28
33
|
readonly errorMessage?: string;
|
|
29
34
|
}
|
|
30
35
|
|
|
@@ -41,17 +46,13 @@ export interface RunManagedProcessOptions {
|
|
|
41
46
|
readonly spawnProcess?: (command: string, args: readonly string[], options: ManagedSpawnOptions) => ManagedChild;
|
|
42
47
|
}
|
|
43
48
|
|
|
44
|
-
const DEFAULT_TERMINATION_GRACE_MS = 1_500;
|
|
45
|
-
const DEFAULT_FORCE_SETTLE_MS = 2_000;
|
|
46
|
-
|
|
47
49
|
export async function runManagedProcess(options: RunManagedProcessOptions): Promise<ManagedProcessResult> {
|
|
48
|
-
const startedAtMs =
|
|
50
|
+
const startedAtMs = performance.now();
|
|
49
51
|
const processGroup = process.platform !== "win32";
|
|
50
52
|
if (options.signal?.aborted) return withoutChild("aborted", startedAtMs, processGroup);
|
|
51
|
-
const spawnProcess = options.spawnProcess ?? defaultSpawn;
|
|
52
53
|
let child: ManagedChild;
|
|
53
54
|
try {
|
|
54
|
-
child = spawnProcess(options.command, options.args, {
|
|
55
|
+
child = (options.spawnProcess ?? defaultSpawn)(options.command, options.args, {
|
|
55
56
|
cwd: options.cwd,
|
|
56
57
|
shell: false,
|
|
57
58
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -67,99 +68,114 @@ export async function runManagedProcess(options: RunManagedProcessOptions): Prom
|
|
|
67
68
|
);
|
|
68
69
|
}
|
|
69
70
|
const pid = child.pid ?? -1;
|
|
71
|
+
let confirmSettlement: () => void = () => {};
|
|
72
|
+
const settlement = new Promise<void>((resolve) => {
|
|
73
|
+
confirmSettlement = resolve;
|
|
74
|
+
});
|
|
70
75
|
|
|
71
76
|
return await new Promise<ManagedProcessResult>((resolve) => {
|
|
72
|
-
let
|
|
77
|
+
let responded = false;
|
|
78
|
+
let terminated = false;
|
|
79
|
+
let closeObserved = false;
|
|
80
|
+
let exitCode: number | null = null;
|
|
81
|
+
let processSignal: NodeJS.Signals | null = null;
|
|
73
82
|
let reason: ManagedProcessReason = "completed";
|
|
74
83
|
let errorMessage: string | undefined;
|
|
75
84
|
let termSent = false;
|
|
76
85
|
let killSent = false;
|
|
77
86
|
let cutoffTimer: NodeJS.Timeout | undefined;
|
|
78
87
|
let escalationTimer: NodeJS.Timeout | undefined;
|
|
79
|
-
let
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
|
|
88
|
+
let responseTimer: NodeJS.Timeout | undefined;
|
|
89
|
+
let observationTimer: NodeJS.Timeout | undefined;
|
|
90
|
+
|
|
91
|
+
const respond = (): void => {
|
|
92
|
+
if (responded) return;
|
|
93
|
+
responded = true;
|
|
94
|
+
if (cutoffTimer) clearTimeout(cutoffTimer);
|
|
95
|
+
if (responseTimer) clearTimeout(responseTimer);
|
|
85
96
|
options.signal?.removeEventListener("abort", onAbort);
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const settle = (exitCode: number | null, processSignal: NodeJS.Signals | null): void => {
|
|
89
|
-
if (settled) return;
|
|
90
|
-
settled = true;
|
|
91
|
-
cleanup();
|
|
92
97
|
child.stdout.destroy();
|
|
93
98
|
child.stderr.destroy();
|
|
94
99
|
resolve({
|
|
95
100
|
pid,
|
|
96
|
-
exitCode: normalizeExitCode(exitCode, reason),
|
|
101
|
+
exitCode: normalizeExitCode(exitCode, reason, processSignal, terminated),
|
|
97
102
|
signal: processSignal,
|
|
98
103
|
reason,
|
|
99
|
-
elapsedMs:
|
|
104
|
+
elapsedMs: performance.now() - startedAtMs,
|
|
100
105
|
cleanup: { termSent, killSent, processGroup },
|
|
106
|
+
terminationObserved: terminated,
|
|
107
|
+
settlement,
|
|
101
108
|
...(errorMessage === undefined ? {} : { errorMessage }),
|
|
102
109
|
});
|
|
103
110
|
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
111
|
+
const confirm = (): void => {
|
|
112
|
+
if (terminated) return;
|
|
113
|
+
terminated = true;
|
|
114
|
+
if (escalationTimer) clearTimeout(escalationTimer);
|
|
115
|
+
if (observationTimer) clearTimeout(observationTimer);
|
|
116
|
+
confirmSettlement();
|
|
117
|
+
respond();
|
|
118
|
+
};
|
|
119
|
+
const observe = (): void => {
|
|
120
|
+
if (terminated || !closeObserved) return;
|
|
121
|
+
if (processGroupState(pid) === "gone") {
|
|
122
|
+
confirm();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// After the cleanup deadline only observe: never send late signals to a reused PID.
|
|
126
|
+
observationTimer = setTimeout(observe, 25);
|
|
127
|
+
observationTimer.unref();
|
|
128
|
+
};
|
|
129
|
+
const startCleanup = (): void => {
|
|
130
|
+
if (terminated || termSent) return;
|
|
108
131
|
termSent = true;
|
|
109
132
|
signalProcessTree(child, "SIGTERM", processGroup);
|
|
110
|
-
const graceMs = Math.max(0, options.terminationGraceMs ??
|
|
133
|
+
const graceMs = Math.max(0, options.terminationGraceMs ?? 1_500);
|
|
111
134
|
escalationTimer = setTimeout(() => {
|
|
112
|
-
if (
|
|
135
|
+
if (terminated) return;
|
|
113
136
|
killSent = true;
|
|
114
137
|
signalProcessTree(child, "SIGKILL", processGroup);
|
|
115
138
|
}, graceMs);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
);
|
|
139
|
+
responseTimer = setTimeout(respond, graceMs + Math.max(1, options.forceSettleMs ?? 2_000));
|
|
140
|
+
};
|
|
141
|
+
const requestTermination = (nextReason: ManagedProcessReason): void => {
|
|
142
|
+
if (responded || terminated) return;
|
|
143
|
+
if (reason === "completed") reason = nextReason;
|
|
144
|
+
startCleanup();
|
|
120
145
|
};
|
|
121
|
-
|
|
122
146
|
function onAbort(): void {
|
|
123
147
|
requestTermination("aborted");
|
|
124
148
|
}
|
|
125
|
-
|
|
149
|
+
const deliver = (callback: ((chunk: string) => void) | undefined, chunk: string): void => {
|
|
150
|
+
if (responded || reason === "callback-error") return;
|
|
151
|
+
try {
|
|
152
|
+
callback?.(chunk);
|
|
153
|
+
} catch {
|
|
154
|
+
errorMessage = "process.output_callback_failed";
|
|
155
|
+
requestTermination("callback-error");
|
|
156
|
+
}
|
|
157
|
+
};
|
|
126
158
|
child.stdout.setEncoding("utf8");
|
|
127
159
|
child.stderr.setEncoding("utf8");
|
|
128
|
-
child.stdout.on("data", (chunk: string) => options.onStdout
|
|
129
|
-
child.stderr.on("data", (chunk: string) => options.onStderr
|
|
130
|
-
child.
|
|
131
|
-
if (
|
|
160
|
+
child.stdout.on("data", (chunk: string) => deliver(options.onStdout, chunk));
|
|
161
|
+
child.stderr.on("data", (chunk: string) => deliver(options.onStderr, chunk));
|
|
162
|
+
child.on("error", (error: Error) => {
|
|
163
|
+
if (terminated) return;
|
|
132
164
|
errorMessage = error.message;
|
|
133
|
-
|
|
165
|
+
if (pid < 1) {
|
|
166
|
+
reason = "spawn-error";
|
|
167
|
+
confirm();
|
|
168
|
+
} else requestTermination("spawn-error");
|
|
134
169
|
});
|
|
135
|
-
child.once("close", (code: number | null,
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (reason === "completed" && processGroupExists(pid)) {
|
|
143
|
-
if (cutoffTimer !== undefined) clearTimeout(cutoffTimer);
|
|
144
|
-
options.signal?.removeEventListener("abort", onAbort);
|
|
145
|
-
termSent = true;
|
|
146
|
-
signalProcessTree(child, "SIGTERM", processGroup);
|
|
147
|
-
const graceMs = Math.max(0, options.terminationGraceMs ?? DEFAULT_TERMINATION_GRACE_MS);
|
|
148
|
-
escalationTimer = setTimeout(() => {
|
|
149
|
-
if (processGroupExists(pid)) {
|
|
150
|
-
killSent = true;
|
|
151
|
-
signalProcessTree(child, "SIGKILL", processGroup);
|
|
152
|
-
}
|
|
153
|
-
settle(code, processSignal);
|
|
154
|
-
}, graceMs);
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
settle(code, processSignal);
|
|
170
|
+
child.once("close", (code: number | null, signal: NodeJS.Signals | null) => {
|
|
171
|
+
closeObserved = true;
|
|
172
|
+
exitCode = code;
|
|
173
|
+
processSignal = signal;
|
|
174
|
+
if (reason === "completed" && signal !== null) reason = "signal";
|
|
175
|
+
if (processGroupState(pid) !== "gone" && !responded) startCleanup();
|
|
176
|
+
observe();
|
|
158
177
|
});
|
|
159
|
-
|
|
160
|
-
if (options.cutoffMs > 0) {
|
|
161
|
-
cutoffTimer = setTimeout(() => requestTermination("cutoff"), options.cutoffMs);
|
|
162
|
-
}
|
|
178
|
+
if (options.cutoffMs > 0) cutoffTimer = setTimeout(() => requestTermination("cutoff"), options.cutoffMs);
|
|
163
179
|
if (options.signal?.aborted) onAbort();
|
|
164
180
|
else options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
165
181
|
});
|
|
@@ -176,8 +192,10 @@ function withoutChild(
|
|
|
176
192
|
exitCode: reason === "aborted" ? 130 : 1,
|
|
177
193
|
signal: null,
|
|
178
194
|
reason,
|
|
179
|
-
elapsedMs:
|
|
195
|
+
elapsedMs: performance.now() - startedAtMs,
|
|
180
196
|
cleanup: { termSent: false, killSent: false, processGroup },
|
|
197
|
+
terminationObserved: true,
|
|
198
|
+
settlement: Promise.resolve(),
|
|
181
199
|
...(errorMessage === undefined ? {} : { errorMessage }),
|
|
182
200
|
};
|
|
183
201
|
}
|
|
@@ -186,51 +204,14 @@ function defaultSpawn(command: string, args: readonly string[], options: Managed
|
|
|
186
204
|
return spawn(command, [...args], options);
|
|
187
205
|
}
|
|
188
206
|
|
|
189
|
-
function
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
function signalProcessTree(child: ManagedChild, signal: "SIGTERM" | "SIGKILL", processGroup: boolean): void {
|
|
200
|
-
const pid = child.pid;
|
|
201
|
-
if (pid === undefined) return;
|
|
202
|
-
if (process.platform === "win32") {
|
|
203
|
-
if (signal === "SIGKILL") {
|
|
204
|
-
try {
|
|
205
|
-
spawn("taskkill", ["/F", "/T", "/PID", String(pid)], {
|
|
206
|
-
detached: true,
|
|
207
|
-
stdio: "ignore",
|
|
208
|
-
windowsHide: true,
|
|
209
|
-
}).unref();
|
|
210
|
-
return;
|
|
211
|
-
} catch {
|
|
212
|
-
child.kill(signal);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
child.kill(signal);
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
try {
|
|
220
|
-
process.kill(processGroup ? -pid : pid, signal);
|
|
221
|
-
} catch {
|
|
222
|
-
try {
|
|
223
|
-
child.kill(signal);
|
|
224
|
-
} catch {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function normalizeExitCode(exitCode: number | null, reason: ManagedProcessReason): number {
|
|
231
|
-
if (exitCode !== null) return exitCode;
|
|
232
|
-
if (reason === "completed") return 0;
|
|
207
|
+
function normalizeExitCode(
|
|
208
|
+
exitCode: number | null,
|
|
209
|
+
reason: ManagedProcessReason,
|
|
210
|
+
signal: NodeJS.Signals | null,
|
|
211
|
+
terminated: boolean,
|
|
212
|
+
): number {
|
|
233
213
|
if (reason === "cutoff") return 124;
|
|
234
214
|
if (reason === "aborted") return 130;
|
|
235
|
-
return 1;
|
|
215
|
+
if (!terminated || signal !== null || reason !== "completed") return exitCode || 1;
|
|
216
|
+
return exitCode ?? 1;
|
|
236
217
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Message } from "omk-ai";
|
|
2
2
|
import type { AgentCheckpoint } from "./checkpoint-runtime.ts";
|
|
3
|
-
import type { ManagedProcessCleanup, ManagedProcessReason } from "./managed-process.ts";
|
|
3
|
+
import type { ManagedProcessCleanup, ManagedProcessReason, ManagedProcessResult } from "./managed-process.ts";
|
|
4
4
|
|
|
5
5
|
export interface UsageStats {
|
|
6
6
|
input: number;
|
|
@@ -47,6 +47,20 @@ export interface AgentDeadlineMetadata {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
export interface SingleResult {
|
|
50
|
+
nodeId?: string;
|
|
51
|
+
attemptId?: string;
|
|
52
|
+
dependencyDigests?: Readonly<Record<string, string>>;
|
|
53
|
+
process?: ManagedProcessResult;
|
|
54
|
+
stream?: {
|
|
55
|
+
stdoutBytes: number;
|
|
56
|
+
stderrBytes: number;
|
|
57
|
+
events: number;
|
|
58
|
+
messages: number;
|
|
59
|
+
stdoutDigest: string;
|
|
60
|
+
stderrDigest: string;
|
|
61
|
+
usageUnknown: boolean;
|
|
62
|
+
failure?: string;
|
|
63
|
+
};
|
|
50
64
|
agent: string;
|
|
51
65
|
agentSource: "user" | "project" | "unknown";
|
|
52
66
|
task: string;
|
|
@@ -68,6 +82,8 @@ export interface SubagentAttemptResult {
|
|
|
68
82
|
readonly reason: ManagedProcessReason;
|
|
69
83
|
readonly elapsedMs: number;
|
|
70
84
|
readonly cleanup: ManagedProcessCleanup;
|
|
85
|
+
readonly terminationObserved?: boolean;
|
|
86
|
+
readonly settlement?: Promise<void>;
|
|
71
87
|
};
|
|
72
88
|
}
|
|
73
89
|
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import type { Message } from "omk-ai";
|
|
3
|
+
import type { SingleResult } from "./subagent-runtime-types.ts";
|
|
4
|
+
|
|
5
|
+
export const SUBAGENT_OUTPUT_LIMITS = {
|
|
6
|
+
stdoutBytes: 8 * 1024 * 1024,
|
|
7
|
+
stderrBytes: 256 * 1024,
|
|
8
|
+
lineBytes: 1024 * 1024,
|
|
9
|
+
events: 20_000,
|
|
10
|
+
messages: 1024,
|
|
11
|
+
} as const;
|
|
12
|
+
|
|
13
|
+
function record(value: unknown): value is Record<string, unknown> {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function nonnegative(value: unknown): value is number {
|
|
18
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Bounds are per process attempt, including ignored events and incomplete lines. */
|
|
22
|
+
export function createSubagentStream(result: SingleResult, onMessage: () => void) {
|
|
23
|
+
let pending = "";
|
|
24
|
+
let terminal = false;
|
|
25
|
+
let assistantSeen = false;
|
|
26
|
+
const stdoutHash = createHash("sha256");
|
|
27
|
+
const stderrHash = createHash("sha256");
|
|
28
|
+
const stats = { stdoutBytes: 0, stderrBytes: 0, events: 0, messages: 0, usageUnknown: false };
|
|
29
|
+
let failure: string | undefined;
|
|
30
|
+
const fail = (reason: string): never => {
|
|
31
|
+
failure ??= reason;
|
|
32
|
+
throw new Error(failure);
|
|
33
|
+
};
|
|
34
|
+
const processLine = (line: string) => {
|
|
35
|
+
if (!line.trim()) return;
|
|
36
|
+
if (++stats.events > SUBAGENT_OUTPUT_LIMITS.events) fail("subagent.output.events_limit");
|
|
37
|
+
let event: unknown;
|
|
38
|
+
try {
|
|
39
|
+
event = JSON.parse(line);
|
|
40
|
+
} catch {
|
|
41
|
+
fail("subagent.stream.invalid_json");
|
|
42
|
+
}
|
|
43
|
+
if (!record(event) || typeof event.type !== "string") return fail("subagent.stream.invalid_event");
|
|
44
|
+
if (event.type === "prompt_settled") {
|
|
45
|
+
if (terminal) fail("subagent.stream.duplicate_terminal");
|
|
46
|
+
terminal = true;
|
|
47
|
+
if (event.outcome !== "completed") fail("subagent.stream.prompt_not_completed");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (event.type !== "message_end" && event.type !== "tool_result_end") return;
|
|
51
|
+
if (terminal) fail("subagent.stream.message_after_terminal");
|
|
52
|
+
const message = event.message;
|
|
53
|
+
if (!record(message) || typeof message.role !== "string") return fail("subagent.stream.invalid_message");
|
|
54
|
+
// The CLI also emits custom session and user messages, which are not assistant receipts.
|
|
55
|
+
if (message.role !== "assistant" && message.role !== "toolResult") return;
|
|
56
|
+
if (!Array.isArray(message.content)) return fail("subagent.stream.invalid_content");
|
|
57
|
+
for (const part of message.content) {
|
|
58
|
+
if (!record(part)) return fail("subagent.stream.invalid_content");
|
|
59
|
+
if (part.type === "text" || part.type === "thinking") {
|
|
60
|
+
if (typeof part[part.type] !== "string") fail("subagent.stream.invalid_content");
|
|
61
|
+
} else if (part.type === "toolCall") {
|
|
62
|
+
if (typeof part.name !== "string" || typeof part.id !== "string" || !record(part.arguments))
|
|
63
|
+
fail("subagent.stream.invalid_tool_call");
|
|
64
|
+
} else if (part.type === "image") {
|
|
65
|
+
if (typeof part.data !== "string" || typeof part.mimeType !== "string")
|
|
66
|
+
fail("subagent.stream.invalid_image");
|
|
67
|
+
} else fail("subagent.stream.invalid_content");
|
|
68
|
+
}
|
|
69
|
+
if (stats.messages >= SUBAGENT_OUTPUT_LIMITS.messages) fail("subagent.output.messages_limit");
|
|
70
|
+
if (message.role === "assistant") {
|
|
71
|
+
if (message.model !== undefined && typeof message.model !== "string") fail("subagent.stream.invalid_model");
|
|
72
|
+
if (message.errorMessage !== undefined && typeof message.errorMessage !== "string")
|
|
73
|
+
fail("subagent.stream.invalid_error");
|
|
74
|
+
if (
|
|
75
|
+
message.stopReason !== undefined &&
|
|
76
|
+
!["stop", "length", "toolUse", "error", "aborted"].includes(String(message.stopReason))
|
|
77
|
+
)
|
|
78
|
+
fail("subagent.stream.invalid_stop_reason");
|
|
79
|
+
const usage = message.usage;
|
|
80
|
+
if (usage === undefined) stats.usageUnknown = true;
|
|
81
|
+
else {
|
|
82
|
+
if (!record(usage) || !record(usage.cost)) return fail("subagent.stream.invalid_usage");
|
|
83
|
+
for (const key of ["input", "output", "cacheRead", "cacheWrite", "totalTokens"] as const) {
|
|
84
|
+
if (!nonnegative(usage[key])) fail("subagent.stream.invalid_usage");
|
|
85
|
+
}
|
|
86
|
+
for (const key of ["input", "output", "cacheRead", "cacheWrite", "total"] as const) {
|
|
87
|
+
if (!nonnegative(usage.cost[key])) fail("subagent.stream.invalid_usage");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
assistantSeen = true;
|
|
91
|
+
}
|
|
92
|
+
const msg = message as unknown as Message;
|
|
93
|
+
result.messages.push(msg);
|
|
94
|
+
stats.messages++;
|
|
95
|
+
if (msg.role === "assistant") {
|
|
96
|
+
result.usage.turns++;
|
|
97
|
+
if (msg.usage) {
|
|
98
|
+
result.usage.input += msg.usage.input;
|
|
99
|
+
result.usage.output += msg.usage.output;
|
|
100
|
+
result.usage.cacheRead += msg.usage.cacheRead;
|
|
101
|
+
result.usage.cacheWrite += msg.usage.cacheWrite;
|
|
102
|
+
result.usage.cost += msg.usage.cost.total;
|
|
103
|
+
result.usage.contextTokens = Math.max(result.usage.contextTokens, msg.usage.totalTokens);
|
|
104
|
+
if (Object.values(result.usage).some((value) => !nonnegative(value)))
|
|
105
|
+
fail("subagent.stream.usage_overflow");
|
|
106
|
+
}
|
|
107
|
+
result.model ??= msg.model;
|
|
108
|
+
if (msg.stopReason) result.stopReason = msg.stopReason;
|
|
109
|
+
if (msg.errorMessage) result.errorMessage = msg.errorMessage;
|
|
110
|
+
}
|
|
111
|
+
onMessage();
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
stdout(chunk: string) {
|
|
115
|
+
if (failure) throw new Error(failure);
|
|
116
|
+
stats.stdoutBytes += Buffer.byteLength(chunk, "utf8");
|
|
117
|
+
stdoutHash.update(chunk);
|
|
118
|
+
if (stats.stdoutBytes > SUBAGENT_OUTPUT_LIMITS.stdoutBytes) fail("subagent.output.stdout_limit");
|
|
119
|
+
let start = 0;
|
|
120
|
+
while (start < chunk.length) {
|
|
121
|
+
const newline = chunk.indexOf("\n", start);
|
|
122
|
+
const fragment = chunk.slice(start, newline < 0 ? undefined : newline);
|
|
123
|
+
if (
|
|
124
|
+
Buffer.byteLength(pending, "utf8") + Buffer.byteLength(fragment, "utf8") >
|
|
125
|
+
SUBAGENT_OUTPUT_LIMITS.lineBytes
|
|
126
|
+
)
|
|
127
|
+
fail("subagent.output.line_limit");
|
|
128
|
+
pending += fragment;
|
|
129
|
+
if (newline < 0) break;
|
|
130
|
+
const line = pending;
|
|
131
|
+
pending = "";
|
|
132
|
+
processLine(line);
|
|
133
|
+
start = newline + 1;
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
stderr(chunk: string) {
|
|
137
|
+
if (failure) throw new Error(failure);
|
|
138
|
+
stats.stderrBytes += Buffer.byteLength(chunk, "utf8");
|
|
139
|
+
stderrHash.update(chunk);
|
|
140
|
+
if (stats.stderrBytes > SUBAGENT_OUTPUT_LIMITS.stderrBytes) fail("subagent.output.stderr_limit");
|
|
141
|
+
result.stderr += chunk;
|
|
142
|
+
},
|
|
143
|
+
finish(requireReceipt: boolean) {
|
|
144
|
+
try {
|
|
145
|
+
if (!failure && pending.trim()) processLine(pending);
|
|
146
|
+
if (!failure && requireReceipt && !assistantSeen) fail("subagent.stream.missing_terminal_message");
|
|
147
|
+
} catch {
|
|
148
|
+
failure ??= "subagent.stream.callback_error";
|
|
149
|
+
} finally {
|
|
150
|
+
pending = "";
|
|
151
|
+
result.stream = {
|
|
152
|
+
...stats,
|
|
153
|
+
stdoutDigest: stdoutHash.digest("hex"),
|
|
154
|
+
stderrDigest: stderrHash.digest("hex"),
|
|
155
|
+
...(failure ? { failure } : {}),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return failure;
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# terminal-browser extension
|
|
2
|
+
|
|
3
|
+
Run a real browser inside the OMK terminal UI.
|
|
4
|
+
|
|
5
|
+
Port of the [terminal-browser Claude Code plugin](https://github.com/zenbu-labs/terminal-browser/tree/main/claude-code-plugin)
|
|
6
|
+
(MIT, zenbu-labs). OMK has no function-hooks/Pane API, so the pane is a
|
|
7
|
+
`ctx.ui.custom` overlay that renders kitty unicode placeholders; the
|
|
8
|
+
`terminal-browser claude-bridge` HTTP API is reused unchanged.
|
|
9
|
+
|
|
10
|
+
## Requirements
|
|
11
|
+
|
|
12
|
+
- `terminal-browser` CLI — `curl -fsSL https://terminal-browser.sh/install | bash` or `brew install terminal-browser`
|
|
13
|
+
- A terminal with kitty graphics protocol **and unicode placeholders**: ghostty, kitty, cmux, supacode, other libghostty terminals
|
|
14
|
+
- Interactive TUI mode (`omk`), not `-p`/RPC/JSON
|
|
15
|
+
- Not tmux/screen (multiplexers rewrite graphics escapes)
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
omk --extension ./examples/extensions/terminal-browser
|
|
21
|
+
# or copy this directory to ~/.omk/agent/extensions/terminal-browser for auto-load
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Command | Action |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `/browser example.com` | open pane at URL (https assumed) |
|
|
27
|
+
| `/browser http://localhost:3000` | open pane at local dev server |
|
|
28
|
+
| `/browser` | toggle close when open; open start page otherwise |
|
|
29
|
+
| `/browser close` | close pane |
|
|
30
|
+
| `ctrl+q` (in pane) | close pane |
|
|
31
|
+
|
|
32
|
+
LLM tools: `terminal_browser_open { url? }`, `terminal_browser_close`.
|
|
33
|
+
In-page control: `terminal-browser action ...` (agent-browser-compatible CLI).
|
|
34
|
+
"Send to agent" (ctrl+g in the browser) inserts selected text into the OMK editor.
|
|
35
|
+
|
|
36
|
+
## How it works
|
|
37
|
+
|
|
38
|
+
1. `terminal-browser claude-bridge launch` spawns a detached bridge child that
|
|
39
|
+
reports `{ port, token }` and serves HTTP on `127.0.0.1` (`bridge.ts`).
|
|
40
|
+
2. The bridge runs `terminal-browser open` with `PIXEL_EMBED`/`PIXEL_TTY`,
|
|
41
|
+
receives pixel frames, and writes kitty graphics to the TTY.
|
|
42
|
+
3. The overlay component (`browser-surface.ts`) prints unicode placeholder cells;
|
|
43
|
+
the terminal composites the browser pixels over them.
|
|
44
|
+
4. Input: SGR mouse + keys are translated to bridge `/input` events
|
|
45
|
+
(cell coordinates — the bridge scales to pixels).
|
|
46
|
+
5. Polling `/state` at 250ms while open (1.2s idle) refreshes title/URL/placed
|
|
47
|
+
and drains the agent-text inbox into the editor.
|
|
48
|
+
|
|
49
|
+
## Caveats
|
|
50
|
+
|
|
51
|
+
Upstream plugin caveats apply: 50fps cap, occasional redraw glitches (select
|
|
52
|
+
text to force repaint), mouse coordinates are cell-granular, and the bridge
|
|
53
|
+
makes loopback HTTP requests (OS may prompt for local-network access).
|
|
54
|
+
Override the binary with `TERMINAL_BROWSER_COMMAND`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire types for the terminal-browser claude-bridge HTTP API.
|
|
3
|
+
* Ported from https://github.com/zenbu-labs/terminal-browser (MIT, zenbu-labs).
|
|
4
|
+
* Kept dependency-free: extensions cannot assume node_modules availability.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export type Placed = { imageId: number; cols: number; rows: number };
|
|
8
|
+
|
|
9
|
+
export type BridgeState = {
|
|
10
|
+
placed: Placed | null;
|
|
11
|
+
title: string;
|
|
12
|
+
url: string | null;
|
|
13
|
+
alive: boolean;
|
|
14
|
+
error: string | null;
|
|
15
|
+
inbox: number;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type LaunchReport = { port: number; token: string } | { error: string; code: "tty" | "start" };
|
|
19
|
+
|
|
20
|
+
const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null;
|
|
21
|
+
|
|
22
|
+
export const isBridgeState = (value: unknown): value is BridgeState =>
|
|
23
|
+
isRecord(value) && typeof value.alive === "boolean" && "placed" in value;
|
|
24
|
+
|
|
25
|
+
export const isLaunchReport = (value: unknown): value is LaunchReport =>
|
|
26
|
+
isRecord(value) && (typeof value.port === "number" || typeof value.error === "string");
|
|
27
|
+
|
|
28
|
+
export const takenTexts = (value: unknown): string[] =>
|
|
29
|
+
isRecord(value) && Array.isArray(value.texts) ? value.texts.filter((t): t is string => typeof t === "string") : [];
|