open-multi-agent-kit 0.95.1 → 0.96.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 +37 -0
- package/README.md +16 -1
- package/dist/approvals/approval-receipt-store.d.ts +18 -0
- package/dist/approvals/approval-receipt-store.d.ts.map +1 -0
- package/dist/approvals/approval-receipt-store.js +194 -0
- package/dist/approvals/approval-receipt-store.js.map +1 -0
- package/dist/approvals/approval-receipt.d.ts +43 -0
- package/dist/approvals/approval-receipt.d.ts.map +1 -0
- package/dist/approvals/approval-receipt.js +208 -0
- package/dist/approvals/approval-receipt.js.map +1 -0
- package/dist/approvals/approval-verifier.d.ts +17 -0
- package/dist/approvals/approval-verifier.d.ts.map +1 -0
- package/dist/approvals/approval-verifier.js +23 -0
- package/dist/approvals/approval-verifier.js.map +1 -0
- package/dist/approvals/plannotator-approval-bridge.d.ts +58 -0
- package/dist/approvals/plannotator-approval-bridge.d.ts.map +1 -0
- package/dist/approvals/plannotator-approval-bridge.js +169 -0
- package/dist/approvals/plannotator-approval-bridge.js.map +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/commands/package-doctor-cli.d.ts +13 -0
- package/dist/commands/package-doctor-cli.d.ts.map +1 -0
- package/dist/commands/package-doctor-cli.js +80 -0
- package/dist/commands/package-doctor-cli.js.map +1 -0
- package/dist/commands/router-feedback-cli.d.ts +11 -0
- package/dist/commands/router-feedback-cli.d.ts.map +1 -0
- package/dist/commands/router-feedback-cli.js +99 -0
- package/dist/commands/router-feedback-cli.js.map +1 -0
- package/dist/commands/stats-cli.d.ts +20 -0
- package/dist/commands/stats-cli.d.ts.map +1 -0
- package/dist/commands/stats-cli.js +99 -0
- package/dist/commands/stats-cli.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +4 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +99 -31
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +624 -216
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +8 -2
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/transaction.d.ts +9 -0
- package/dist/core/compaction/transaction.d.ts.map +1 -1
- package/dist/core/compaction/transaction.js +17 -2
- package/dist/core/compaction/transaction.js.map +1 -1
- package/dist/core/context-budget-governor-v2.d.ts +1 -1
- package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
- package/dist/core/context-budget-governor-v2.js +1 -1
- package/dist/core/context-budget-governor-v2.js.map +1 -1
- package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
- package/dist/core/context-budget-system-prompt.js +18 -2
- package/dist/core/context-budget-system-prompt.js.map +1 -1
- package/dist/core/context-budget-v2-cache-disk.d.ts +109 -0
- package/dist/core/context-budget-v2-cache-disk.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-disk.js +343 -0
- package/dist/core/context-budget-v2-cache-disk.js.map +1 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts +22 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-keys.js +4 -4
- package/dist/core/context-budget-v2-cache-keys.js.map +1 -1
- package/dist/core/context-budget-v2-cache.d.ts +1 -0
- package/dist/core/context-budget-v2-cache.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache.js +1 -0
- package/dist/core/context-budget-v2-cache.js.map +1 -1
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
- package/dist/core/context-budget-v2-planner.js +17 -14
- package/dist/core/context-budget-v2-planner.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +1 -0
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +45 -22
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/mcp/client.d.ts +105 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +198 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/config.d.ts +23 -0
- package/dist/core/mcp/config.d.ts.map +1 -0
- package/dist/core/mcp/config.js +89 -0
- package/dist/core/mcp/config.js.map +1 -0
- package/dist/core/mcp/index.d.ts +15 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +15 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +84 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +173 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/protocol.d.ts +59 -0
- package/dist/core/mcp/protocol.d.ts.map +1 -0
- package/dist/core/mcp/protocol.js +103 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/stdio-transport.d.ts +63 -0
- package/dist/core/mcp/stdio-transport.d.ts.map +1 -0
- package/dist/core/mcp/stdio-transport.js +132 -0
- package/dist/core/mcp/stdio-transport.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +47 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +102 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/package-archive.d.ts +3 -0
- package/dist/core/package-archive.d.ts.map +1 -0
- package/dist/core/package-archive.js +161 -0
- package/dist/core/package-archive.js.map +1 -0
- package/dist/core/package-doctor-source-scan.d.ts +13 -0
- package/dist/core/package-doctor-source-scan.d.ts.map +1 -0
- package/dist/core/package-doctor-source-scan.js +124 -0
- package/dist/core/package-doctor-source-scan.js.map +1 -0
- package/dist/core/package-doctor.d.ts +41 -0
- package/dist/core/package-doctor.d.ts.map +1 -0
- package/dist/core/package-doctor.js +145 -0
- package/dist/core/package-doctor.js.map +1 -0
- package/dist/core/package-manager.d.ts +10 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +175 -42
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-manifest.d.ts +26 -0
- package/dist/core/package-manifest.d.ts.map +1 -0
- package/dist/core/package-manifest.js +85 -0
- package/dist/core/package-manifest.js.map +1 -0
- package/dist/core/pi-compat.d.ts +5 -0
- package/dist/core/pi-compat.d.ts.map +1 -0
- package/dist/core/pi-compat.js +18 -0
- package/dist/core/pi-compat.js.map +1 -0
- package/dist/core/provider-resilience.d.ts +7 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +11 -0
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/reasoning-router-bias.d.ts +10 -14
- package/dist/core/reasoning-router-bias.d.ts.map +1 -1
- package/dist/core/reasoning-router-bias.js +22 -15
- package/dist/core/reasoning-router-bias.js.map +1 -1
- package/dist/core/reasoning-router-v4.d.ts +9 -1
- package/dist/core/reasoning-router-v4.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4.js +20 -5
- package/dist/core/reasoning-router-v4.js.map +1 -1
- package/dist/core/redaction.d.ts +2 -5
- package/dist/core/redaction.d.ts.map +1 -1
- package/dist/core/redaction.js +14 -1
- package/dist/core/redaction.js.map +1 -1
- package/dist/core/repository-learning-scope.d.ts +10 -0
- package/dist/core/repository-learning-scope.d.ts.map +1 -0
- package/dist/core/repository-learning-scope.js +42 -0
- package/dist/core/repository-learning-scope.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +16 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/router-feedback-collector.d.ts +2 -1
- package/dist/core/router-feedback-collector.d.ts.map +1 -1
- package/dist/core/router-feedback-collector.js +2 -2
- package/dist/core/router-feedback-collector.js.map +1 -1
- package/dist/core/runtime-provenance.d.ts +54 -0
- package/dist/core/runtime-provenance.d.ts.map +1 -0
- package/dist/core/runtime-provenance.js +115 -0
- package/dist/core/runtime-provenance.js.map +1 -0
- package/dist/core/sandbox/backend.d.ts.map +1 -1
- package/dist/core/sandbox/backend.js +39 -21
- package/dist/core/sandbox/backend.js.map +1 -1
- package/dist/core/sandbox/default-policy.d.ts +4 -5
- package/dist/core/sandbox/default-policy.d.ts.map +1 -1
- package/dist/core/sandbox/default-policy.js +9 -11
- package/dist/core/sandbox/default-policy.js.map +1 -1
- package/dist/core/session-bash-runtime.d.ts +4 -4
- package/dist/core/session-bash-runtime.d.ts.map +1 -1
- package/dist/core/session-bash-runtime.js +6 -5
- package/dist/core/session-bash-runtime.js.map +1 -1
- package/dist/core/session-compaction-service.d.ts.map +1 -1
- package/dist/core/session-compaction-service.js +7 -7
- package/dist/core/session-compaction-service.js.map +1 -1
- package/dist/core/session-manager.d.ts +4 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +47 -7
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +7 -4
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -3
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-orchestration.d.ts.map +1 -1
- package/dist/core/subagent-orchestration.js +4 -2
- package/dist/core/subagent-orchestration.js.map +1 -1
- package/dist/core/system-prompt.d.ts +9 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +10 -4
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/diagnostics.d.ts.map +1 -1
- package/dist/core/tools/diagnostics.js +8 -2
- package/dist/core/tools/diagnostics.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +15 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/turn-metrics.d.ts +135 -0
- package/dist/core/turn-metrics.d.ts.map +1 -0
- package/dist/core/turn-metrics.js +261 -0
- package/dist/core/turn-metrics.js.map +1 -0
- package/dist/core/verified-bash-runtime.d.ts.map +1 -1
- package/dist/core/verified-bash-runtime.js +10 -4
- package/dist/core/verified-bash-runtime.js.map +1 -1
- package/dist/guardrails/evidence-protocol.d.ts +10 -0
- package/dist/guardrails/evidence-protocol.d.ts.map +1 -0
- package/dist/guardrails/evidence-protocol.js +34 -0
- package/dist/guardrails/evidence-protocol.js.map +1 -0
- package/dist/guardrails/evidence-system.d.ts +3 -1
- package/dist/guardrails/evidence-system.d.ts.map +1 -1
- package/dist/guardrails/evidence-system.js +22 -14
- package/dist/guardrails/evidence-system.js.map +1 -1
- package/dist/guardrails/replay-ledger-lock-owner.d.ts +7 -0
- package/dist/guardrails/replay-ledger-lock-owner.d.ts.map +1 -1
- package/dist/guardrails/replay-ledger-lock-owner.js +42 -1
- package/dist/guardrails/replay-ledger-lock-owner.js.map +1 -1
- package/dist/guardrails/replay-payload-hash.d.ts +6 -0
- package/dist/guardrails/replay-payload-hash.d.ts.map +1 -0
- package/dist/guardrails/replay-payload-hash.js +24 -0
- package/dist/guardrails/replay-payload-hash.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +18 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.js +2 -2
- package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +3 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +40 -12
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.d.ts +14 -2
- package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.js +106 -19
- package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +10 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +104 -17
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +1 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/types/evidence.d.ts +11 -3
- package/dist/types/evidence.d.ts.map +1 -1
- package/dist/types/evidence.js.map +1 -1
- package/docs/book-to-skill.md +79 -0
- package/docs/compaction.md +35 -3
- package/docs/containerization.md +14 -2
- package/docs/docs.json +16 -0
- package/docs/environment-variables.md +1 -1
- package/docs/extensions.md +75 -16
- package/docs/index.md +3 -0
- package/docs/mcp.md +97 -0
- package/docs/metrics.md +87 -0
- package/docs/models.md +12 -0
- package/docs/packages.md +25 -4
- package/docs/provider-resilience.md +37 -56
- package/docs/providers.md +5 -1
- package/docs/run-protocol.md +72 -0
- package/docs/sdk.md +40 -6
- package/docs/sessions.md +6 -0
- package/docs/settings.md +10 -7
- package/docs/skills.md +9 -1
- package/docs/usage.md +14 -4
- 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/plannotator-approval-bridge.ts +83 -0
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +21 -11
- package/examples/extensions/subagent/adaptive-agent-runtime.ts +9 -3
- package/examples/extensions/subagent/agents/planner.md +0 -2
- package/examples/extensions/subagent/agents/reviewer.md +0 -2
- package/examples/extensions/subagent/agents/scout.md +0 -2
- package/examples/extensions/subagent/agents/worker.md +0 -1
- package/examples/extensions/subagent/agents.test.ts +9 -0
- package/examples/extensions/subagent/agents.ts +11 -4
- package/examples/extensions/subagent/deadline-budget.test.ts +32 -0
- package/examples/extensions/subagent/deadline-budget.ts +25 -1
- package/examples/extensions/subagent/fixtures/fake-omk-json.mjs +10 -0
- package/examples/extensions/subagent/index.ts +234 -55
- package/examples/extensions/subagent/subagent-execution-policy.test.ts +27 -0
- package/examples/extensions/subagent/subagent-extension-smoke.test.ts +167 -2
- package/examples/extensions/subagent/workflow-graph.test.ts +80 -0
- package/examples/extensions/subagent/workflow-graph.ts +89 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +275 -439
- package/package.json +11 -8
package/docs/sdk.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
The SDK provides programmatic access to omk's agent capabilities. Use it to embed omk in other applications, build custom interfaces, or integrate with automated workflows.
|
|
6
6
|
|
|
7
7
|
**Example use cases:**
|
|
8
|
+
|
|
8
9
|
- Build a custom UI (web, desktop, mobile)
|
|
9
10
|
- Integrate agent capabilities into existing applications
|
|
10
11
|
- Create automated pipelines with agent reasoning
|
|
@@ -112,6 +113,7 @@ interface AgentSession {
|
|
|
112
113
|
thinkingLevel: ThinkingLevel;
|
|
113
114
|
messages: AgentMessage[];
|
|
114
115
|
isStreaming: boolean;
|
|
116
|
+
getSessionStats(): SessionStats;
|
|
115
117
|
|
|
116
118
|
// In-place tree navigation within the current session file
|
|
117
119
|
navigateTree(targetId: string, options?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string }): Promise<{ editorText?: string; cancelled: boolean }>;
|
|
@@ -128,6 +130,8 @@ interface AgentSession {
|
|
|
128
130
|
}
|
|
129
131
|
```
|
|
130
132
|
|
|
133
|
+
`getSessionStats()` returns message, token, and cost totals. Its `promptCache` field includes provider-eligible input tokens, provider hit rate (`cacheRead / (input + cacheRead + cacheWrite)`), stable-prefix characters, cache-key changes, boundary bypasses, and the last local break reason. These values diagnose cache-affinity changes; only provider-reported `cacheRead` proves a hit.
|
|
134
|
+
|
|
131
135
|
Session replacement APIs such as new-session, resume, fork, and import live on `AgentSessionRuntime`, not on `AgentSession`.
|
|
132
136
|
|
|
133
137
|
### createAgentSessionRuntime() and AgentSessionRuntime
|
|
@@ -212,6 +216,8 @@ const executor = new VerifiedEvidenceExecutor({ store, ledger });
|
|
|
212
216
|
|
|
213
217
|
`transcript_repaired`, `tool_timeout`, `tool_late_settlement`, and `workspace_mutation` use that ledger. A receipt at or before a later relevant workspace mutation is blocked by `EvidenceGate`.
|
|
214
218
|
|
|
219
|
+
New replay events declare `payloadHashAlgorithm: "jcs-rfc8785-v2"`; payload keys are canonicalized with RFC 8785 before SHA-256 hashing, and the algorithm identifier is part of the event-hash commitment. Existing events with no algorithm are verified with the original `json-stringify-v1` contract. Loading, appending to, replaying, or exporting a mixed ledger does not rewrite or relabel those legacy events. Unknown declared algorithms fail closed.
|
|
220
|
+
|
|
215
221
|
### Prompting and Message Queueing
|
|
216
222
|
|
|
217
223
|
`PromptOptions` controls prompt expansion, queueing behavior while streaming, and prompt preflight notifications:
|
|
@@ -250,6 +256,7 @@ await session.prompt("After you're done, also check X", { streamingBehavior: "fo
|
|
|
250
256
|
```
|
|
251
257
|
|
|
252
258
|
**Behavior:**
|
|
259
|
+
|
|
253
260
|
- **Extension commands** (e.g., `/mycommand`): Execute immediately, even during streaming. They manage their own LLM interaction via `omk.sendMessage()`.
|
|
254
261
|
- **File-based prompt templates** (from `.md` files): Expanded to their content before sending or queueing.
|
|
255
262
|
- **During streaming without `streamingBehavior`**: Throws an error. Use `steer()` or `followUp()` directly, or specify the option.
|
|
@@ -280,6 +287,8 @@ const state = session.agent.state;
|
|
|
280
287
|
// state.model: Model - current model
|
|
281
288
|
// state.thinkingLevel: ThinkingLevel - current thinking level
|
|
282
289
|
// state.systemPrompt: string - system prompt
|
|
290
|
+
// state.systemPromptCacheBoundary?: number - stable-prefix UTF-16 offset
|
|
291
|
+
// state.systemPromptCacheBoundaryBypass?: boolean - suppress explicit cache affinity/markers
|
|
283
292
|
// state.tools: AgentTool[] - available tools
|
|
284
293
|
// state.streamingMessage?: AgentMessage - current partial assistant message
|
|
285
294
|
// state.errorMessage?: string - latest assistant error
|
|
@@ -294,6 +303,8 @@ session.agent.state.tools = tools; // copies the top-level array
|
|
|
294
303
|
await session.agent.waitForIdle();
|
|
295
304
|
```
|
|
296
305
|
|
|
306
|
+
The cache boundary must be a positive safe integer no greater than `systemPrompt.length`. Missing, invalid, or bypassed boundaries suppress explicit stable-prefix cache metadata. Providers may still ignore valid metadata, so inspect provider usage before claiming a hit.
|
|
307
|
+
|
|
297
308
|
### Events
|
|
298
309
|
|
|
299
310
|
Subscribe to events to receive streaming output and lifecycle notifications.
|
|
@@ -365,6 +376,8 @@ session.subscribe((event) => {
|
|
|
365
376
|
});
|
|
366
377
|
```
|
|
367
378
|
|
|
379
|
+
`session_termination` is emitted per provider attempt, not only when the outer `prompt()` call stops. If `auto_retry_start` follows a retryable termination, wait for the recovered attempt; `session.lastTermination` is updated to the later `completed` result on success.
|
|
380
|
+
|
|
368
381
|
## Options Reference
|
|
369
382
|
|
|
370
383
|
### Directories
|
|
@@ -380,6 +393,7 @@ const { session } = await createAgentSession({
|
|
|
380
393
|
```
|
|
381
394
|
|
|
382
395
|
`cwd` is used by `DefaultResourceLoader` for:
|
|
396
|
+
|
|
383
397
|
- Project extensions (`.omk/extensions/`)
|
|
384
398
|
- Project skills:
|
|
385
399
|
- `.omk/skills/`
|
|
@@ -389,6 +403,7 @@ const { session } = await createAgentSession({
|
|
|
389
403
|
- Session directory naming
|
|
390
404
|
|
|
391
405
|
`agentDir` is used by `DefaultResourceLoader` for:
|
|
406
|
+
|
|
392
407
|
- Global extensions (`extensions/`)
|
|
393
408
|
- Global skills:
|
|
394
409
|
- `skills/` under `agentDir` (for example `~/.omk/agent/skills/`)
|
|
@@ -438,6 +453,7 @@ const { session } = await createAgentSession({
|
|
|
438
453
|
```
|
|
439
454
|
|
|
440
455
|
If no model is provided:
|
|
456
|
+
|
|
441
457
|
1. Tries to restore from session (if continuing)
|
|
442
458
|
2. Uses default from settings
|
|
443
459
|
3. Falls back to first available model
|
|
@@ -447,6 +463,7 @@ If no model is provided:
|
|
|
447
463
|
### API Keys and OAuth
|
|
448
464
|
|
|
449
465
|
API key resolution priority (handled by AuthStorage):
|
|
466
|
+
|
|
450
467
|
1. Runtime overrides (via `setRuntimeApiKey`, not persisted)
|
|
451
468
|
2. Stored credentials in `auth.json` (API keys or OAuth tokens)
|
|
452
469
|
3. Environment variables (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, etc.)
|
|
@@ -499,6 +516,8 @@ await loader.reload();
|
|
|
499
516
|
const { session } = await createAgentSession({ resourceLoader: loader });
|
|
500
517
|
```
|
|
501
518
|
|
|
519
|
+
OMK records a stable cache boundary before loaded context files, selected skill content, the date, and the working directory. A turn-level extension that replaces the built prompt bypasses explicit stable-prefix caching unless it returns the prompt unchanged. See [Compaction & Branch Summarization](compaction.md#context-reduction-and-prompt-caching) for provider behavior and diagnostics.
|
|
520
|
+
|
|
502
521
|
> See [examples/sdk/03-custom-prompt.ts](../examples/sdk/03-custom-prompt.ts)
|
|
503
522
|
|
|
504
523
|
### Tools
|
|
@@ -847,12 +866,14 @@ const { session } = await createAgentSession({
|
|
|
847
866
|
```
|
|
848
867
|
|
|
849
868
|
**Static factories:**
|
|
869
|
+
|
|
850
870
|
- `SettingsManager.create(cwd?, agentDir?)` - Load from files
|
|
851
871
|
- `SettingsManager.inMemory(settings?)` - No file I/O
|
|
852
872
|
|
|
853
873
|
**Project-specific settings:**
|
|
854
874
|
|
|
855
875
|
Settings load from two locations and merge:
|
|
876
|
+
|
|
856
877
|
1. Global: `~/.omk/agent/settings.json`
|
|
857
878
|
2. Project: `<cwd>/.omk/settings.json`
|
|
858
879
|
|
|
@@ -1120,12 +1141,14 @@ omk --mode rpc --no-session
|
|
|
1120
1141
|
See [RPC documentation](rpc.md) for the JSON protocol.
|
|
1121
1142
|
|
|
1122
1143
|
The SDK is preferred when:
|
|
1144
|
+
|
|
1123
1145
|
- You want type safety
|
|
1124
1146
|
- You're in the same Node.js process
|
|
1125
1147
|
- You need direct access to agent state
|
|
1126
1148
|
- You want to customize tools/extensions programmatically
|
|
1127
1149
|
|
|
1128
1150
|
RPC mode is preferred when:
|
|
1151
|
+
|
|
1129
1152
|
- You're integrating from another language
|
|
1130
1153
|
- You want process isolation
|
|
1131
1154
|
- You're building a language-agnostic client
|
|
@@ -1134,14 +1157,16 @@ RPC mode is preferred when:
|
|
|
1134
1157
|
|
|
1135
1158
|
Execution-bound evidence records a declared verification command and reported outcome between two artifact-set snapshots, then binds that record to a tamper-evident ledger. `VerifiedEvidenceExecutor` never executes the declared command. `executeVerifiedBash()` invokes caller-supplied `BashOperations`; `executeVerifiedLocalBash()` derives the shell identity and runner from OMK's built-in local backend.
|
|
1136
1159
|
|
|
1137
|
-
**Default path (opt-out):** when an AgentSession has a replay ledger (persisted sessions create one automatically), LLM-callable `bash` and interactive/RPC `executeBash` bind through `executeVerifiedBash` with `executor: "bash-tool"` and receipts under `<sessionFile>.evidence/receipts` (or `cwd/.omk/session-evidence/<goalId>/receipts` for ephemeral sessions). Session workspace scope is git-aware: inside a worktree, the receipt binds the toplevel plus
|
|
1160
|
+
**Default path (opt-out):** when an AgentSession has a replay ledger (persisted sessions create one automatically), LLM-callable `bash` and interactive/RPC `executeBash` bind through `executeVerifiedBash` with `executor: "bash-tool"` and receipts under `<sessionFile>.evidence/receipts` (or `cwd/.omk/session-evidence/<goalId>/receipts` for ephemeral sessions). Session workspace scope is git-aware: inside a worktree, the receipt binds the toplevel plus up to 32 sorted dirty file paths (1 s TTL). Git status expands ordinary untracked directories to files; untracked nested repositories remain outside the parent scope. Set `OMK_VERIFIED_BASH=0` to restore the legacy unverified path. Custom `createBashTool()` calls stay unverified unless the caller wraps operations with `createVerifiedBashOperations()`. CI still runs release-consistency through `executeVerifiedLocalBash()` with `executor: "ci-runner"`.
|
|
1138
1161
|
|
|
1139
|
-
**Default sandbox (opt-out):** session bash
|
|
1162
|
+
**Default sandbox (opt-out):** session bash defaults to `enforce`. Every built-in local spawn is wrapped by macOS `sandbox-exec` or Linux `bwrap`, writes are limited to the session workspace and OS temp directory, and network access is disabled. If the platform is unsupported or the backend is unavailable, the spawn fails closed with `sandbox.backend_missing`. Set `OMK_BASH_SANDBOX=audit` only for an unwrapped compatibility path that records each decision as a `sandbox_audit` replay event; set `OMK_BASH_SANDBOX=0` to disable the preflight entirely. Unknown values resolve to `enforce`.
|
|
1163
|
+
|
|
1164
|
+
This boundary applies to AgentSession's built-in local bash operations. Custom `createBashTool()` calls remain unsandboxed unless they receive a `sandboxPolicy`, and injected or remote `BashOperations` own their own isolation. The default workspace-write profile is not a read-confidentiality boundary or whole-process container; use [Containerization](containerization.md) when every tool and extension must be isolated.
|
|
1140
1165
|
|
|
1141
1166
|
### Recorded and invoked inputs
|
|
1142
1167
|
|
|
1143
1168
|
| Input | SDK behavior |
|
|
1144
|
-
|
|
1169
|
+
| ------- | -------------- |
|
|
1145
1170
|
| `request.command` (`EvidenceCommandDescriptor`) | Validates, hashes, and records the structured descriptor; never executes it |
|
|
1146
1171
|
| `request.executor` (`"bash-tool" \| "ci-runner" \| "mcp" \| "internal"`) | Records a label only |
|
|
1147
1172
|
| `request.workspaceScope` (`WorkspaceScope`) | Captures the selected artifact set before and after the callback |
|
|
@@ -1191,12 +1216,18 @@ Ledger and receipt publication are fail-closed but not one filesystem transactio
|
|
|
1191
1216
|
- **Ledger**: `ReplayLedgerManager` verifies an existing ledger on construction (sequence order, prev-hash chain, payload hash, event hash) and **fails closed** on any violation.
|
|
1192
1217
|
- **Store**: `EvidenceReceiptStore` uses an owner-only directory, symlink rejection, no-overwrite hard-link publication, and identity rechecks to detect observed path replacement. These checks assume same-UID path mutation is quiescent; they are **not** filesystem sandbox isolation.
|
|
1193
1218
|
|
|
1219
|
+
### Protocol-first semantic evaluation
|
|
1220
|
+
|
|
1221
|
+
New integrations should use `TaskSpec`, `ExecutionAttempt`, `Observation`, `EvaluationResult`, `RuntimeDecision`, and `WaiverRecord` from `omk-protocol`. `evaluateTask()` derives the semantic verdict from current observations; `reduceRuntimeDecision()` derives the next runtime action. See [Run Protocol v1](run-protocol.md) for the rules and current migration boundary.
|
|
1222
|
+
|
|
1223
|
+
`evidenceReceiptToObservation(receipt, attemptId)` validates the receipt core digest and emits immutable execution facts for protocol evaluation. It does not replace ledger, attestation, freshness, or sandbox checks.
|
|
1224
|
+
|
|
1194
1225
|
### Receipt policy
|
|
1195
1226
|
|
|
1196
|
-
`EvidenceGate` (default `receiptMode: "prefer"`) gates
|
|
1227
|
+
`EvidenceGate` (default `receiptMode: "prefer"`) gates the legacy `TaskContract` against its satisfied receipts. Pass `executor.createGateOptions()` so the gate resolves receipts, ledger events, and workspace fingerprints from the same store and ledger.
|
|
1197
1228
|
|
|
1198
1229
|
| Mode | Soft missing data | Tamper-grade mismatch | Legacy `hash` / `command` |
|
|
1199
|
-
|
|
1230
|
+
| ------ | ------------------- | ----------------------- | ---------------------------- |
|
|
1200
1231
|
| `strict` | blocked | blocked | n/a |
|
|
1201
1232
|
| `prefer` (default) | conditional | blocked | n/a |
|
|
1202
1233
|
| `legacy` | receipt checks skipped | receipt checks skipped | checked by legacy options (enabled by default) |
|
|
@@ -1207,7 +1238,9 @@ Tamper-grade mismatches include: receipt ID, goal, or claim mismatch; schema ver
|
|
|
1207
1238
|
|
|
1208
1239
|
`createGateOptions()` returns three resolvers bound to the executor's own store and ledger: `resolveReceipt` (read a stored receipt), `resolveLedgerEvent` (find a chain event by `seq`), and `captureWorkspaceFingerprint` (snapshot the selected artifact set). The gate validates every returned value.
|
|
1209
1240
|
|
|
1210
|
-
###
|
|
1241
|
+
### Legacy gate integration example
|
|
1242
|
+
|
|
1243
|
+
This compatibility path still uses mutable `TaskContract` evidence status and verdict fields. `TaskContractBuilder.setVerdict()` and `updateEvidenceStatus()` are deprecated for new integrations.
|
|
1211
1244
|
|
|
1212
1245
|
```typescript
|
|
1213
1246
|
import {
|
|
@@ -1308,6 +1341,7 @@ RunJournalStore, appendRunJournalRecordDurably, writeQuarantineBytesDurably,
|
|
|
1308
1341
|
classifySessionTermination, formatSessionTermination, SessionTerminationError
|
|
1309
1342
|
|
|
1310
1343
|
// Execution-bound evidence (optional, application-driven verification receipts)
|
|
1344
|
+
evidenceReceiptToObservation
|
|
1311
1345
|
EvidenceReceiptStore
|
|
1312
1346
|
ReplayLedgerManager
|
|
1313
1347
|
EvidenceGate
|
package/docs/sessions.md
CHANGED
|
@@ -19,6 +19,12 @@ Use `/session` in interactive mode to see the current session file, session ID,
|
|
|
19
19
|
|
|
20
20
|
For the JSONL file format and SessionManager API, see [Session Format](session-format.md).
|
|
21
21
|
|
|
22
|
+
## Retries and Termination Events
|
|
23
|
+
|
|
24
|
+
Each provider attempt writes its own `run_started`/`run_finished` journal pair and emits `session_termination`. A retryable termination is attempt-level when `auto_retry_start` follows it; consumers should not treat that event alone as the end of the outer `prompt()` call.
|
|
25
|
+
|
|
26
|
+
If a retry or failover succeeds, the later attempt emits `completed` and becomes `session.lastTermination`. If retry budget is exhausted, the last provider failure remains final. Quota and billing-cycle exhaustion are classified as `provider.rate_limit` and can switch through the configured provider-resilience chain before retrying. See [Provider Resilience](provider-resilience.md).
|
|
27
|
+
|
|
22
28
|
## Session Commands
|
|
23
29
|
|
|
24
30
|
| Command | Description |
|
package/docs/settings.md
CHANGED
|
@@ -17,7 +17,7 @@ Edit directly or use `/settings` for common options.
|
|
|
17
17
|
| --------- | ------ | --------- | ------------- |
|
|
18
18
|
| `defaultProvider` | string | - | Default provider (e.g., `"anthropic"`, `"openai"`) |
|
|
19
19
|
| `defaultModel` | string | - | Default model ID |
|
|
20
|
-
| `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"` |
|
|
20
|
+
| `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"`, `"ultra"` |
|
|
21
21
|
| `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
|
|
22
22
|
| `thinkingBudgets` | object | - | Custom token budgets per thinking level |
|
|
23
23
|
| `reasoningRouterLearning` | object | - | Opt-in v4 router learning bias (global settings file only) |
|
|
@@ -41,16 +41,16 @@ Edit directly or use `/settings` for common options.
|
|
|
41
41
|
```json
|
|
42
42
|
{
|
|
43
43
|
"reasoningRouterLearning": {
|
|
44
|
-
"enabled": false
|
|
45
|
-
"biasSnapshotPath": "~/.omk/agent/router-bias.json",
|
|
46
|
-
"feedbackLedgerPath": "~/.omk/agent/router-feedback.jsonl"
|
|
44
|
+
"enabled": false
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
```
|
|
50
48
|
|
|
49
|
+
This opt-in remains global-only, but its default data is isolated per repository or git worktree under `~/.omk/agent/router-feedback/repositories/<opaque-scope>/`. The scope is derived from the canonical worktree root and never stores the raw path. Set `biasSnapshotPath` or `feedbackLedgerPath` only when intentionally overriding that isolation with fixed paths.
|
|
50
|
+
|
|
51
51
|
#### adaptorchBridge
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Global-only, default-off lifecycle for a future v4 advisory source. The timeout, TTL, consult-budget, and circuit-breaker controls are wired, but the current transport is a no-op and cannot change the resolved level. A project-scope `.omk/settings.json` value is ignored by design.
|
|
54
54
|
|
|
55
55
|
```json
|
|
56
56
|
{
|
|
@@ -70,7 +70,8 @@ Advisory-only hint source for the v4 auto thinking-level resolver. Read from the
|
|
|
70
70
|
| --------- | ------ | --------- | ------------- |
|
|
71
71
|
| `theme` | string | `"dark"` | Theme name (`"dark"`, `"light"`, or custom) |
|
|
72
72
|
| `quietStartup` | boolean | `false` | Hide startup header |
|
|
73
|
-
| `collapseChangelog` | boolean | `
|
|
73
|
+
| `collapseChangelog` | boolean | `true` | Show condensed changelog after updates (set `false` for the full "What's New" block) |
|
|
74
|
+
| `footerSystemMetrics` | boolean | `false` | Show system-wide CPU/MEM usage in the footer stats line |
|
|
74
75
|
| `enableInstallTelemetry` | boolean | `true` | Send an anonymous install/update version ping after first install or changelog-detected updates. This does not control update checks |
|
|
75
76
|
| `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
|
|
76
77
|
| `treeFilterMode` | string | `"default"` | Default filter for `/tree`: `"default"`, `"no-tools"`, `"user-only"`, `"labeled-only"`, `"all"` |
|
|
@@ -156,7 +157,7 @@ This setting is global-only: `.omk/settings.json` cannot enable or disable it. U
|
|
|
156
157
|
| `agent.toolTimeoutMs` | number | `0` | Fallback tool execution timeout in milliseconds; `0` disables the fallback timer |
|
|
157
158
|
| `agent.toolTimeouts` | object | built-in defaults | Per-tool-name timeout overrides; `0` disables that tool's timer |
|
|
158
159
|
|
|
159
|
-
Built-in defaults are 30 seconds for `read`, `grep`, `find`, and `ls`; 60 seconds for `edit` and `write`; and 300 seconds for `bash`. Explicit `agent.toolTimeouts` entries override these defaults. Extension
|
|
160
|
+
Built-in defaults are 30 seconds for `read`, `grep`, `find`, and `ls`; 60 seconds for `edit` and `write`; and 300 seconds for `bash`. Explicit `agent.toolTimeouts` entries override these defaults. Extension tools may override settings per call with `resolveTimeoutMs(ctx)`; otherwise custom tools without a per-name value use `agent.toolTimeoutMs`. Timeout values must be integer milliseconds from `0` through `2147483647`.
|
|
160
161
|
|
|
161
162
|
```json
|
|
162
163
|
{
|
|
@@ -201,6 +202,8 @@ When a provider requests a retry delay longer than `retry.provider.maxRetryDelay
|
|
|
201
202
|
|
|
202
203
|
Keep `retry.provider.maxRetries` at `0` unless provider-level retries are explicitly needed. Setting it above `0` can make SDK/provider retries handle out-of-usage-limit errors before OMK sees them, which may block the agent until the provider quota resets in some circumstances.
|
|
203
204
|
|
|
205
|
+
At the agent level, recognized quota and billing-cycle failures are retryable so OMK can first switch to an authenticated `providerResilience.failoverCandidates` entry. If no candidate qualifies, normal retry backoff applies. See [Provider Resilience](provider-resilience.md).
|
|
206
|
+
|
|
204
207
|
```json
|
|
205
208
|
{
|
|
206
209
|
"retry": {
|
package/docs/skills.md
CHANGED
|
@@ -11,6 +11,7 @@ OMK implements the [Agent Skills standard](https://agentskills.io/specification)
|
|
|
11
11
|
## Table of Contents
|
|
12
12
|
|
|
13
13
|
- [Locations](#locations)
|
|
14
|
+
- [Optional Document Compiler](#optional-document-compiler)
|
|
14
15
|
- [How Skills Work](#how-skills-work)
|
|
15
16
|
- [Skill Commands](#skill-commands)
|
|
16
17
|
- [Skill Structure](#skill-structure)
|
|
@@ -42,6 +43,10 @@ Discovery rules:
|
|
|
42
43
|
|
|
43
44
|
Disable discovery with `--no-skills` (explicit `--skill` paths still load).
|
|
44
45
|
|
|
46
|
+
## Optional Document Compiler
|
|
47
|
+
|
|
48
|
+
Install [`omk-book-to-skill`](book-to-skill.md) to compile PDF, EPUB, DOCX, HTML, Markdown, text, RTF, MOBI, and AZW sources into generated skills. It is an optional OMK package, not a built-in skill, and keeps Python extractors outside OMK core.
|
|
49
|
+
|
|
45
50
|
### Using Skills from Other Harnesses
|
|
46
51
|
|
|
47
52
|
To use skills from Claude Code or OpenAI Codex, add their directories to settings:
|
|
@@ -88,7 +93,7 @@ Arguments after the command are appended after the skill content for the current
|
|
|
88
93
|
|
|
89
94
|
`!omk <role-or-request>` is a deterministic OMK hub router. Exact role aliases such as `frontend`, `backend`, `loop`, and `plan` select `omk-frontend`, `omk-backend-data`, `omk-loop`, and `omk-plan`; free-form prompts are scored against the same hub vocabulary and fall back to `omk-skills` when no role is clear.
|
|
90
95
|
|
|
91
|
-
In interactive mode, type `!` to open skill autocomplete. Selecting a skill inserts the explicit `!skill:name
|
|
96
|
+
In interactive mode, type `!` to open skill autocomplete. Selecting a skill inserts the explicit `!skill:name` form, and `!omk` is offered when the OMK skill hub index is available. Bash remains available as `! command`, and `!! command` runs bash without sending output to the model. If `!token` is not a known skill, it falls back to bash; use `! command` when a command name might collide with a skill. `!omk` is reserved for OMK hub routing and never falls through to bash.
|
|
92
97
|
|
|
93
98
|
Toggle skill commands via `/settings` in interactive mode or in `settings.json`:
|
|
94
99
|
|
|
@@ -173,11 +178,13 @@ Invalid: `PDF-Processing`, `-pdf`, `pdf--processing`
|
|
|
173
178
|
The description determines when the agent loads the skill. Be specific.
|
|
174
179
|
|
|
175
180
|
Good:
|
|
181
|
+
|
|
176
182
|
```yaml
|
|
177
183
|
description: Extracts text and tables from PDF files, fills PDF forms, and merges multiple PDFs. Use when working with PDF documents.
|
|
178
184
|
```
|
|
179
185
|
|
|
180
186
|
Poor:
|
|
187
|
+
|
|
181
188
|
```yaml
|
|
182
189
|
description: Helps with PDFs.
|
|
183
190
|
```
|
|
@@ -206,6 +213,7 @@ brave-search/
|
|
|
206
213
|
```
|
|
207
214
|
|
|
208
215
|
**SKILL.md:**
|
|
216
|
+
|
|
209
217
|
````markdown
|
|
210
218
|
---
|
|
211
219
|
name: brave-search
|
package/docs/usage.md
CHANGED
|
@@ -87,9 +87,19 @@ Precedence:
|
|
|
87
87
|
|
|
88
88
|
Resolved levels are clamped to the model's capabilities: models without `xhigh`/`max` are capped at their highest supported level, and models without reasoning support bypass the router entirely.
|
|
89
89
|
|
|
90
|
-
The v4 learning path is available only through the global `reasoningRouterLearning` setting and is off by default. When
|
|
90
|
+
The v4 learning path is available only through the global `reasoningRouterLearning` setting and is off by default. When enabled, `/think auto` loads one validated, session-pinned bias snapshot, applies a bounded `-2..2` ladder-step bias, and appends a privacy-safe record containing only bounded enums, booleans, and buckets. A later explicit `/think <level>` choice adds one directional `s1-override` record for the same decision. Project-local settings cannot enable the feature, and records never contain raw prompts, repository paths, diffs, session identifiers, provider payloads, tool output, or hook output.
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
Default ledgers and snapshots are isolated by an opaque hash of the canonical repository or git worktree root. Compile the current repository's accumulated records between sessions:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
omk router-feedback compile-bias --cwd /path/to/repository
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Compilation is deterministic. It creates a randomized same-directory temporary file exclusively, enforces POSIX mode `0600`, then atomically renames it over the snapshot; this is atomic replacement, not `fsync`-backed crash durability, and explicit output paths should use a trusted directory. Snapshot loading fails closed on malformed or internally inconsistent cells, including any nonzero bias backed by fewer than five strong records. A session pins either a snapshot or a miss on its first learning-enabled auto turn, so later compilations are observed only by sessions that have not yet attempted that load. Fixed `biasSnapshotPath` or `feedbackLedgerPath` session settings remain explicit compatibility overrides and can intentionally share state across repositories; pass matching `--out` or `--ledger` paths to the compiler when using them.
|
|
99
|
+
|
|
100
|
+
The ledger intentionally keeps causal buckets instead of free-form memories or raw trajectories. This follows CLIN's causal-abstraction approach ([arXiv:2310.10134](https://arxiv.org/abs/2310.10134)) and session-boundary updates from the Red Queen Gödel Machine ([arXiv:2606.26294](https://arxiv.org/abs/2606.26294)); CTIM-Rover found that repository-level episodic memories could add distracting noise and failed to improve its base coding agent ([arXiv:2505.23422](https://arxiv.org/abs/2505.23422)).
|
|
101
|
+
|
|
102
|
+
The Adaptorch advisory bridge is also global-only and default-off. Its timeout, TTL, consult-budget, and circuit-breaker lifecycle is wired, but the current advisory transport is a no-op and cannot change the router level.
|
|
93
103
|
|
|
94
104
|
## Message Queue
|
|
95
105
|
|
|
@@ -140,7 +150,7 @@ The doctor verifies the session's complete JSONL prefix, run journal, compaction
|
|
|
140
150
|
|
|
141
151
|
Session and journal bytes after the final newline are copied byte-for-byte to a `.quarantine-*` file before the original is atomically rewritten to its valid complete prefix. Opening a session uses the same complete-prefix rule; `SessionManager.getQuarantineReport()` reports any startup quarantine.
|
|
142
152
|
|
|
143
|
-
Each
|
|
153
|
+
Each agent attempt writes fsynced `run_started` and `run_finished` records to `<session>.runjournal`. An unclosed valid run is recorded as an inferred `process_crash` on the next startup. JSON/RPC emit `session_termination`; text and TUI errors include kind, provider/model, retryability, cause, run ID, and next action. Recovered retries therefore record the failed attempt and a later `completed` attempt.
|
|
144
154
|
|
|
145
155
|
## Context Files
|
|
146
156
|
|
|
@@ -242,7 +252,7 @@ cat README.md | omk -p "Summarize this text"
|
|
|
242
252
|
| `--provider <name>` | Provider, such as `anthropic`, `openai`, or `google` |
|
|
243
253
|
| `--model <pattern>` | Model pattern or ID; supports `provider/id` and optional `:<thinking>` |
|
|
244
254
|
| `--api-key <key>` | API key, overriding environment variables |
|
|
245
|
-
| `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
|
255
|
+
| `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, `ultra` |
|
|
246
256
|
| `--models <patterns>` | Comma-separated patterns for Ctrl+P cycling |
|
|
247
257
|
| `--list-models [search]` | List available models |
|
|
248
258
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omk-extension-custom-provider-anthropic",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.96.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omk-extension-custom-provider-anthropic",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.96.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "0.52.0"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omk-extension-gondolin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.96.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omk-extension-gondolin",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.96.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@earendil-works/gondolin": "0.12.0"
|
|
12
12
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import {
|
|
4
|
+
ApprovalReceiptStore,
|
|
5
|
+
type ExtensionAPI,
|
|
6
|
+
type ExtensionCommandContext,
|
|
7
|
+
type ExtensionContext,
|
|
8
|
+
PlannotatorApprovalBridge,
|
|
9
|
+
} from "open-multi-agent-kit";
|
|
10
|
+
|
|
11
|
+
interface LoadedPlan {
|
|
12
|
+
path: string;
|
|
13
|
+
content: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function loadWorkspacePlan(cwd: string, input: string): LoadedPlan {
|
|
17
|
+
const workspaceRoot = realpathSync(cwd);
|
|
18
|
+
const planPath = realpathSync(resolve(workspaceRoot, input));
|
|
19
|
+
const relativePath = relative(workspaceRoot, planPath);
|
|
20
|
+
if (!relativePath || relativePath === ".." || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath)) {
|
|
21
|
+
throw new Error("Plan must be a file inside the current workspace");
|
|
22
|
+
}
|
|
23
|
+
if (!statSync(planPath).isFile()) throw new Error("Plan must be a regular file");
|
|
24
|
+
return { path: relativePath.split(sep).join("/"), content: readFileSync(planPath, "utf8") };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default function plannotatorApprovalBridgeExtension(omk: ExtensionAPI): void {
|
|
28
|
+
let bridge: PlannotatorApprovalBridge | undefined;
|
|
29
|
+
|
|
30
|
+
function initializeBridge(ctx: ExtensionContext): void {
|
|
31
|
+
bridge?.dispose();
|
|
32
|
+
bridge = new PlannotatorApprovalBridge({
|
|
33
|
+
eventBus: omk.events,
|
|
34
|
+
store: new ApprovalReceiptStore(join(ctx.sessionManager.getSessionDir(), "approval-receipts")),
|
|
35
|
+
workspaceRoot: ctx.cwd,
|
|
36
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
37
|
+
interactive: ctx.mode === "tui" && ctx.hasUI,
|
|
38
|
+
requestTimeoutMs: 5_000,
|
|
39
|
+
onReceipt: (receipt, write) => {
|
|
40
|
+
omk.appendEntry("approval-receipt-v1", receipt);
|
|
41
|
+
ctx.ui.notify(
|
|
42
|
+
`Approval ${receipt.core.decision}; immutable receipt ${write.created ? "created" : "verified"}. No execution was started.`,
|
|
43
|
+
receipt.core.decision === "approved" ? "info" : "warning",
|
|
44
|
+
);
|
|
45
|
+
},
|
|
46
|
+
onError: () => ctx.ui.notify("Ignored an invalid or uncorrelated Plannotator event.", "warning"),
|
|
47
|
+
});
|
|
48
|
+
bridge.start();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
omk.on("session_start", async (_event, ctx) => initializeBridge(ctx));
|
|
52
|
+
omk.on("session_shutdown", async () => {
|
|
53
|
+
bridge?.dispose();
|
|
54
|
+
bridge = undefined;
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
omk.registerCommand("approval-review", {
|
|
58
|
+
description: "Review a workspace plan with Plannotator and persist a non-executing approval receipt",
|
|
59
|
+
handler: async (args: string, ctx: ExtensionCommandContext) => {
|
|
60
|
+
if (ctx.mode !== "tui" || !ctx.hasUI) {
|
|
61
|
+
ctx.ui.notify("Approval review requires interactive TUI mode.", "error");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (!bridge) initializeBridge(ctx);
|
|
65
|
+
const input = args.trim();
|
|
66
|
+
if (!input) {
|
|
67
|
+
ctx.ui.notify("Usage: /approval-review <workspace-relative-plan.md>", "warning");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const plan = loadWorkspacePlan(ctx.cwd, input);
|
|
72
|
+
const correlation = await bridge?.requestReview({ planPath: plan.path, planContent: plan.content });
|
|
73
|
+
if (!correlation) throw new Error("Approval bridge is unavailable");
|
|
74
|
+
ctx.ui.notify(
|
|
75
|
+
`Plannotator review opened (${correlation.reviewId}); waiting for an explicit decision.`,
|
|
76
|
+
"info",
|
|
77
|
+
);
|
|
78
|
+
} catch {
|
|
79
|
+
ctx.ui.notify("Approval review failed. Confirm the plan path and that Plannotator is loaded.", "error");
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omk-extension-sandbox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.96.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omk-extension-sandbox",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.96.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sandbox-runtime": "0.0.26"
|
|
12
12
|
}
|