open-multi-agent-kit 0.96.2 → 0.97.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 +16 -0
- package/README.md +4 -2
- package/dist/core/agent-session.d.ts +9 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -7
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/attachment-store.d.ts +39 -0
- package/dist/core/attachment-store.d.ts.map +1 -0
- package/dist/core/attachment-store.js +81 -0
- package/dist/core/attachment-store.js.map +1 -0
- package/dist/core/command-safety.d.ts +8 -0
- package/dist/core/command-safety.d.ts.map +1 -1
- package/dist/core/command-safety.js +140 -14
- package/dist/core/command-safety.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +6 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +35 -1
- package/dist/core/compaction/compaction.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-v2-cache-keys.d.ts +3 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-keys.js +2 -0
- package/dist/core/context-budget-v2-cache-keys.js.map +1 -1
- package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -1
- package/dist/core/context-budget-v2-plan-cache-keys.js +3 -0
- package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -1
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
- package/dist/core/context-budget-v2-planner.js +2 -1
- package/dist/core/context-budget-v2-planner.js.map +1 -1
- package/dist/core/context-budget-v2-scoring.d.ts +17 -0
- package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
- package/dist/core/context-budget-v2-scoring.js +25 -8
- package/dist/core/context-budget-v2-scoring.js.map +1 -1
- package/dist/core/context-budget-v2-selection.d.ts +2 -2
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
- package/dist/core/context-budget-v2-selection.js +18 -1
- package/dist/core/context-budget-v2-selection.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +17 -0
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js +15 -0
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/extensions/builtin/command-safety-gate.d.ts +3 -1
- package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -1
- package/dist/core/extensions/builtin/command-safety-gate.js +7 -0
- package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -1
- package/dist/core/extensions/types.d.ts +12 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-registry.d.ts +8 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +71 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/package-doctor-source-scan.d.ts +9 -0
- package/dist/core/package-doctor-source-scan.d.ts.map +1 -1
- package/dist/core/package-doctor-source-scan.js +77 -4
- package/dist/core/package-doctor-source-scan.js.map +1 -1
- package/dist/core/prompt-attachment.d.ts +51 -0
- package/dist/core/prompt-attachment.d.ts.map +1 -0
- package/dist/core/prompt-attachment.js +186 -0
- package/dist/core/prompt-attachment.js.map +1 -0
- package/dist/core/provider-resilience.d.ts +28 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +50 -0
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/provider-retry.d.ts +1 -1
- package/dist/core/provider-retry.d.ts.map +1 -1
- package/dist/core/provider-retry.js +1 -1
- package/dist/core/provider-retry.js.map +1 -1
- package/dist/core/provider-usage.d.ts.map +1 -1
- package/dist/core/provider-usage.js +68 -2
- package/dist/core/provider-usage.js.map +1 -1
- package/dist/core/reasoning-router-promotion.d.ts +84 -0
- package/dist/core/reasoning-router-promotion.d.ts.map +1 -0
- package/dist/core/reasoning-router-promotion.js +92 -0
- package/dist/core/reasoning-router-promotion.js.map +1 -0
- package/dist/core/session-bash-service.d.ts.map +1 -1
- package/dist/core/session-bash-service.js +4 -3
- package/dist/core/session-bash-service.js.map +1 -1
- package/dist/core/session-termination.d.ts +1 -1
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +11 -2
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +3 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +13 -48
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -34
- package/dist/core/tools/read.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/attachment-strip.d.ts +21 -0
- package/dist/modes/interactive/components/attachment-strip.d.ts.map +1 -0
- package/dist/modes/interactive/components/attachment-strip.js +136 -0
- package/dist/modes/interactive/components/attachment-strip.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +6 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +26 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.js +12 -1
- package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +23 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +174 -53
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/compaction.md +1 -1
- package/docs/extensions.md +12 -3
- package/docs/index.md +4 -1
- package/docs/metrics.md +74 -2
- package/docs/provider-resilience.md +11 -0
- package/docs/usage.md +1 -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/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 +7 -7
- package/dist/core/tools/omp-pure-seams.d.ts +0 -41
- package/dist/core/tools/omp-pure-seams.d.ts.map +0 -1
- package/dist/core/tools/omp-pure-seams.js +0 -142
- package/dist/core/tools/omp-pure-seams.js.map +0 -1
- package/dist/core/tools/omp-seam-runtime.d.ts +0 -100
- package/dist/core/tools/omp-seam-runtime.d.ts.map +0 -1
- package/dist/core/tools/omp-seam-runtime.js +0 -40
- package/dist/core/tools/omp-seam-runtime.js.map +0 -1
package/docs/compaction.md
CHANGED
|
@@ -95,7 +95,7 @@ By default, compaction uses the active session model. Set `compaction.model` to
|
|
|
95
95
|
|
|
96
96
|
Every compaction and branch-summary LLM call flows through one choke point (`completeSummarization`):
|
|
97
97
|
|
|
98
|
-
- **Retries**: transient stream drops (`terminated`, socket close, 5xx, DNS/transport errors) follow the configured `retry` settings (`enabled`, `maxRetries`, `baseDelayMs`) with exponential backoff instead of failing the whole operation on the first attempt. Quota/billing
|
|
98
|
+
- **Retries**: transient stream drops (`terminated`, socket close, 5xx, DNS/transport errors) follow the configured `retry` settings (`enabled`, `maxRetries`, `baseDelayMs`) with exponential backoff instead of failing the whole operation on the first attempt. Quota/billing exhaustion on the summarization model triggers one pass through the resilience failover chain ([provider-resilience.md](provider-resilience.md)); only when every candidate is also quota-blocked does the run fail with a non-retryable `compaction.quota_exhausted` termination cause whose guidance suggests `/model`, setting `compaction.model`, or waiting for reset. Aborts are never retried. Retry progress is emitted as `summarization_retry_scheduled` / `summarization_retry_attempt_start` / `summarization_retry_finished` session events (surfaced in the TUI and RPC stream).
|
|
99
99
|
- **Isolation**: each summarization request runs with prompt caching disabled (`cacheRetention: "none"`) and a fresh routing `sessionId`, so summaries never write unusable provider cache entries or inherit interactive session affinity.
|
|
100
100
|
|
|
101
101
|
### How It Works
|
package/docs/extensions.md
CHANGED
|
@@ -505,15 +505,24 @@ The `systemPromptOptions` field gives extensions access to the same structured d
|
|
|
505
505
|
|
|
506
506
|
Inside `before_agent_start`, `event.systemPrompt` and `ctx.getSystemPrompt()` both reflect the chained system prompt as of the current handler. Later `before_agent_start` handlers can still modify it again.
|
|
507
507
|
|
|
508
|
-
#### agent_start / agent_end
|
|
508
|
+
#### agent_start / agent_end / agent_settled
|
|
509
509
|
|
|
510
|
-
|
|
510
|
+
`agent_start` and `agent_end` fire once per agent-loop attempt. When the session
|
|
511
|
+
retries a transient provider failure, the prompt produces several `agent_end`
|
|
512
|
+
events, so `agent_end` alone does not mark the end of the work.
|
|
513
|
+
|
|
514
|
+
`agent_settled` fires once, immediately after the `agent_end` that no retry
|
|
515
|
+
follows. Use it to release per-run state exactly once.
|
|
511
516
|
|
|
512
517
|
```typescript
|
|
513
518
|
omk.on("agent_start", async (_event, ctx) => {});
|
|
514
519
|
|
|
515
520
|
omk.on("agent_end", async (event, ctx) => {
|
|
516
|
-
// event.messages - messages from this
|
|
521
|
+
// event.messages - messages from this attempt; a retry may still follow
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
omk.on("agent_settled", async (event, ctx) => {
|
|
525
|
+
// No retry follows. Safe to clear activity, finalize queues, or release locks.
|
|
517
526
|
});
|
|
518
527
|
```
|
|
519
528
|
|
package/docs/index.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# OMK Documentation
|
|
2
2
|
|
|
3
|
-
OMK is a provider-neutral coding agent with multi-agent orchestration, durable harness controls, replayable sessions, SDK/RPC integration, and evidence-backed verification.
|
|
3
|
+
OMK is a provider-neutral coding agent with multi-agent orchestration, durable harness controls, replayable sessions, SDK/RPC integration, and evidence-backed verification. Extensions, skills, prompts, themes, and packages add workflows without changing the run contract.
|
|
4
|
+
|
|
5
|
+
OMK targets state-of-the-art quality as a CLI coding-agent harness. That target is not a claim of current leadership; see [Turn metrics and harness evaluation](metrics.md) for the qualification rules and current status.
|
|
4
6
|
|
|
5
7
|
## Quick start
|
|
6
8
|
|
|
@@ -59,6 +61,7 @@ For the full first-run flow, see [Quickstart](quickstart.md).
|
|
|
59
61
|
|
|
60
62
|
- [SDK and Session Control](sdk.md) - embed omk, reuse policy helpers, or inspect stored sessions from scripts.
|
|
61
63
|
- [Run Protocol and Durable Goals](run-protocol.md) - canonical run contracts and the durable-goal lifecycle.
|
|
64
|
+
- [Turn metrics and harness evaluation](metrics.md) - cost, latency, tool reliability, capability baselines, and comparative-claim rules.
|
|
62
65
|
- [RPC mode](rpc.md) - integrate over stdin/stdout JSONL.
|
|
63
66
|
- [JSON event stream mode](json.md) - print mode with structured events.
|
|
64
67
|
- [TUI components](tui.md) - build custom terminal UI for extensions.
|
package/docs/metrics.md
CHANGED
|
@@ -3,6 +3,76 @@
|
|
|
3
3
|
OMK records one JSON line per agent turn so harness changes can be measured
|
|
4
4
|
instead of guessed.
|
|
5
5
|
|
|
6
|
+
## CLI harness SOTA target
|
|
7
|
+
|
|
8
|
+
OMK targets state-of-the-art quality as a CLI coding-agent harness. **SOTA is
|
|
9
|
+
not verified.** This is a product target, not a statement that the current
|
|
10
|
+
release leads a benchmark or a named competitor cohort.
|
|
11
|
+
|
|
12
|
+
The target covers the harness layer:
|
|
13
|
+
|
|
14
|
+
| Dimension | Primary measure |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| Task success | solved tasks and pass rate |
|
|
17
|
+
| Cost efficiency | model cost and tokens per solved task |
|
|
18
|
+
| Latency | wall-clock p50/p95 per solved task |
|
|
19
|
+
| Context efficiency | input, cache, compaction, and tool-output tokens per solved task |
|
|
20
|
+
| Tool reliability | failure, retry, refusal, and intervention rates |
|
|
21
|
+
| Orchestration | critical-path time, useful concurrency, and duplicate work |
|
|
22
|
+
| Recovery | interrupted-run resume accuracy and repeated-run variance |
|
|
23
|
+
| Safety | policy violations, unauthorized effects, and false-positive blocks |
|
|
24
|
+
| Maintainability | complexity, module-size debt, and regression-gate health |
|
|
25
|
+
|
|
26
|
+
No single feature count or self-score establishes leadership. OMK reports a
|
|
27
|
+
dimension-specific result unless a preregistered aggregation defines an overall
|
|
28
|
+
score.
|
|
29
|
+
|
|
30
|
+
### Controlled comparison contract
|
|
31
|
+
|
|
32
|
+
A comparative harness run MUST hold the **same model**, **same provider** and
|
|
33
|
+
model configuration, **same task** and revision, **same budget**, equivalent
|
|
34
|
+
tool permissions, and comparable container, hardware, region, and concurrency
|
|
35
|
+
constant. The harness is the treatment variable. If a factor cannot be held
|
|
36
|
+
constant, the report must label the result non-comparative.
|
|
37
|
+
|
|
38
|
+
Every comparative report must include:
|
|
39
|
+
|
|
40
|
+
- the date, harness versions, and **named comparison cohort**, with its inclusion rule frozen before execution;
|
|
41
|
+
- immutable model, provider, container, environment, and configuration identities;
|
|
42
|
+
- the task manifest, seeds, public prompt or sanitized prompt digest, budgets, run order, and stop policy;
|
|
43
|
+
- sanitized per-task outcomes plus cost, token, latency, retry, and intervention data;
|
|
44
|
+
- the confidence interval, significance threshold, minimum effect, and statistical test chosen before inspecting the result;
|
|
45
|
+
- the exact commands and immutable manifests needed for **reproducible evidence**.
|
|
46
|
+
|
|
47
|
+
Use paired A/B measurements. Randomize or interleave pair order when provider or
|
|
48
|
+
machine drift can bias one side. Do not combine values produced by different
|
|
49
|
+
methods, working directories, task revisions, or warm/cold conditions. A
|
|
50
|
+
roadmap projection remains a hypothesis even when its inputs are measured.
|
|
51
|
+
|
|
52
|
+
### Evidence privacy
|
|
53
|
+
|
|
54
|
+
Benchmark evidence is private by default. Public artifacts may contain public
|
|
55
|
+
or synthetic task identifiers, version and image digests, allowlisted runtime
|
|
56
|
+
metadata, sanitized outcomes, and aggregate statistics. They must not contain
|
|
57
|
+
credentials, private prompts, proprietary source, raw tool arguments or output,
|
|
58
|
+
environment values, personal data, or absolute user paths.
|
|
59
|
+
|
|
60
|
+
Keep restricted raw evidence local or in an access-controlled store with an
|
|
61
|
+
explicit owner and retention period. Normalize paths, redact content, scan for
|
|
62
|
+
secrets and PII, and obtain human approval before publication. Digests and
|
|
63
|
+
public task manifests preserve reproducibility without disclosing restricted
|
|
64
|
+
content.
|
|
65
|
+
|
|
66
|
+
A public “SOTA,” “best,” “leading,” or “#1” claim requires a dated controlled
|
|
67
|
+
comparison that places OMK on the relevant quality/cost/latency frontier without
|
|
68
|
+
violating declared safety and regression floors. Until then, use “targets
|
|
69
|
+
state-of-the-art quality.”
|
|
70
|
+
|
|
71
|
+
[Harbor's Terminal-Bench runner](https://www.harborframework.com/docs/tutorials/running-terminal-bench)
|
|
72
|
+
and the [SWE-bench containerized harness](https://www.swebench.com/SWE-bench/api/harness/)
|
|
73
|
+
are reference evaluation surfaces. Their presence or a selected task list is
|
|
74
|
+
infrastructure, not a benchmark result.
|
|
75
|
+
|
|
6
76
|
This is separate from the two things that already existed:
|
|
7
77
|
|
|
8
78
|
| Surface | Purpose |
|
|
@@ -83,5 +153,7 @@ node scripts/tb-mini-suite.mjs --seed 7 # a different fixed subset
|
|
|
83
153
|
|
|
84
154
|
Selection is a pure function of (tasks directory, seed, size): the same inputs
|
|
85
155
|
always produce the same task list, which is the whole point of using it as a
|
|
86
|
-
regression gate.
|
|
87
|
-
model spend — it is deliberately not
|
|
156
|
+
regression gate. Selection alone is not a capability result. The scoring run
|
|
157
|
+
itself requires Docker, `harbor`, and real model spend — it is deliberately not
|
|
158
|
+
wired into `npm run check`. Any comparison produced from it must follow the
|
|
159
|
+
controlled comparison contract above.
|
|
@@ -6,6 +6,7 @@ OMK can recover an agent turn from provider failures that are unlikely to succee
|
|
|
6
6
|
- billing-cycle or quota exhaustion
|
|
7
7
|
- orphaned `tool_call_id` protocol errors
|
|
8
8
|
- transient transport and server failures
|
|
9
|
+
- gateway/upstream availability failures (5xx passthroughs, streams that end without a finish reason)
|
|
9
10
|
|
|
10
11
|
This is availability behavior, not a safety bypass. Provider safety policy and the user's configured model access remain authoritative.
|
|
11
12
|
|
|
@@ -53,6 +54,8 @@ A content/safety stop gets at most one automatic retry, including a retry that s
|
|
|
53
54
|
|
|
54
55
|
Recognized quota shapes include billing-cycle usage limits, `insufficient_quota`, exhausted balances, `GoUsageLimitError`, `FreeUsageLimitError`, and out-of-budget responses. These are classified as `provider.rate_limit`, even when a provider wraps them in HTTP 403.
|
|
55
56
|
|
|
57
|
+
Gateway/upstream availability failures — "503 Upstream request failed", "Endpoint is unavailable", or a stream that ended without a finish reason — are classified as `provider.network`: transport problems that heal by retry or model switch, never by transcript sanitization.
|
|
58
|
+
|
|
56
59
|
The default candidate order is:
|
|
57
60
|
|
|
58
61
|
1. `kimi-coding/k3`
|
|
@@ -63,6 +66,14 @@ The default candidate order is:
|
|
|
63
66
|
6. `modelstudio-maas/deepseek-v4-pro`
|
|
64
67
|
7. `kimi-coding/kimi-for-coding`
|
|
65
68
|
|
|
69
|
+
## Same-model route rotation
|
|
70
|
+
|
|
71
|
+
The same underlying model is often served by several provider routes (for example `openrouter/stealth/ox-alpha` and `opencode-go/ox-alpha-free`). When the active route fails with an upstream availability error, OMK rotates to another authenticated route of the same model family before touching the cross-model failover chain, so the retry lands on a live endpoint instead of hammering the dead one.
|
|
72
|
+
|
|
73
|
+
Routes already visited this turn and routes without configured authentication are excluded from rotation. Route rotation runs inside the normal retry budget; when no sibling route remains, the standard failover behavior applies.
|
|
74
|
+
|
|
75
|
+
Compaction summarization reuses the same chain: when the summarization model hits quota/billing exhaustion, the configured failover candidates are tried once each before the run fails with a non-retryable `compaction.quota_exhausted` termination cause. See [Compaction](compaction.md).
|
|
76
|
+
|
|
66
77
|
## Retry and termination events
|
|
67
78
|
|
|
68
79
|
Each provider attempt is journaled separately and emits `session_termination`. A retryable failure is attempt-level when an `auto_retry_start` event follows it. A recovered retry later emits a `completed` termination; an exhausted retry budget leaves the last provider failure as the final termination.
|
package/docs/usage.md
CHANGED
|
@@ -22,7 +22,7 @@ The editor can be replaced temporarily by built-in UI such as `/settings` or by
|
|
|
22
22
|
| File reference | Type `@` to fuzzy-search project files |
|
|
23
23
|
| Path completion | Press Tab to complete paths |
|
|
24
24
|
| Multi-line input | Shift+Enter, or Ctrl+Enter on Windows Terminal |
|
|
25
|
-
| Images | Paste with Ctrl+V
|
|
25
|
+
| Images | Paste with Ctrl+V (Alt+V on Windows) or drag into the terminal; pastes attach as preview chips above the editor and send with your next prompt |
|
|
26
26
|
| Skill/bash launcher | `!` opens skill completion; `!skill:name prompt` invokes a skill; `!omk <role-or-request>` routes through OMK role hubs |
|
|
27
27
|
| Shell command | `! command` runs and sends output to the model |
|
|
28
28
|
| Hidden shell command | `!! command` runs without sending output to the model |
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omk-extension-custom-provider-anthropic",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.97.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.97.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.97.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.97.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@earendil-works/gondolin": "0.12.0"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omk-extension-sandbox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.97.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.97.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sandbox-runtime": "0.0.26"
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omk-extension-with-deps",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.97.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omk-extension-with-deps",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.97.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"ms": "2.1.3"
|
|
12
12
|
},
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "open-multi-agent-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.97.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "open-multi-agent-kit",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.97.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"omk-agent-core": "^0.
|
|
13
|
-
"omk-ai": "^0.
|
|
14
|
-
"omk-tui": "^0.
|
|
12
|
+
"omk-agent-core": "^0.97.0",
|
|
13
|
+
"omk-ai": "^0.97.0",
|
|
14
|
+
"omk-tui": "^0.97.0",
|
|
15
15
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
16
16
|
"canonicalize": "4.0.0",
|
|
17
17
|
"chalk": "5.6.2",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"typebox": "1.3.11",
|
|
28
28
|
"undici": "8.10.0",
|
|
29
29
|
"yaml": "2.9.0",
|
|
30
|
-
"omk-adaptorch-wpl": "^0.
|
|
31
|
-
"omk-protocol": "^0.
|
|
30
|
+
"omk-adaptorch-wpl": "^0.97.0",
|
|
31
|
+
"omk-protocol": "^0.97.0"
|
|
32
32
|
},
|
|
33
33
|
"optionalDependencies": {
|
|
34
34
|
"@mariozechner/clipboard": "0.3.9"
|
|
@@ -1285,19 +1285,19 @@
|
|
|
1285
1285
|
}
|
|
1286
1286
|
},
|
|
1287
1287
|
"node_modules/omk-adaptorch-wpl": {
|
|
1288
|
-
"version": "0.
|
|
1289
|
-
"resolved": "https://registry.npmjs.org/omk-adaptorch-wpl/-/omk-adaptorch-wpl-0.
|
|
1288
|
+
"version": "0.97.0",
|
|
1289
|
+
"resolved": "https://registry.npmjs.org/omk-adaptorch-wpl/-/omk-adaptorch-wpl-0.97.0.tgz",
|
|
1290
1290
|
"license": "MIT",
|
|
1291
1291
|
"engines": {
|
|
1292
1292
|
"node": ">=22.19.0"
|
|
1293
1293
|
}
|
|
1294
1294
|
},
|
|
1295
1295
|
"node_modules/omk-agent-core": {
|
|
1296
|
-
"version": "0.
|
|
1297
|
-
"resolved": "https://registry.npmjs.org/omk-agent-core/-/omk-agent-core-0.
|
|
1296
|
+
"version": "0.97.0",
|
|
1297
|
+
"resolved": "https://registry.npmjs.org/omk-agent-core/-/omk-agent-core-0.97.0.tgz",
|
|
1298
1298
|
"license": "MIT",
|
|
1299
1299
|
"dependencies": {
|
|
1300
|
-
"omk-ai": "^0.
|
|
1300
|
+
"omk-ai": "^0.97.0",
|
|
1301
1301
|
"ignore": "7.0.6",
|
|
1302
1302
|
"typebox": "1.3.11",
|
|
1303
1303
|
"yaml": "2.9.0"
|
|
@@ -1307,8 +1307,8 @@
|
|
|
1307
1307
|
}
|
|
1308
1308
|
},
|
|
1309
1309
|
"node_modules/omk-ai": {
|
|
1310
|
-
"version": "0.
|
|
1311
|
-
"resolved": "https://registry.npmjs.org/omk-ai/-/omk-ai-0.
|
|
1310
|
+
"version": "0.97.0",
|
|
1311
|
+
"resolved": "https://registry.npmjs.org/omk-ai/-/omk-ai-0.97.0.tgz",
|
|
1312
1312
|
"license": "MIT",
|
|
1313
1313
|
"dependencies": {
|
|
1314
1314
|
"@anthropic-ai/sdk": "0.91.1",
|
|
@@ -1330,16 +1330,16 @@
|
|
|
1330
1330
|
}
|
|
1331
1331
|
},
|
|
1332
1332
|
"node_modules/omk-protocol": {
|
|
1333
|
-
"version": "0.
|
|
1334
|
-
"resolved": "https://registry.npmjs.org/omk-protocol/-/omk-protocol-0.
|
|
1333
|
+
"version": "0.97.0",
|
|
1334
|
+
"resolved": "https://registry.npmjs.org/omk-protocol/-/omk-protocol-0.97.0.tgz",
|
|
1335
1335
|
"license": "MIT",
|
|
1336
1336
|
"engines": {
|
|
1337
1337
|
"node": ">=22.19.0"
|
|
1338
1338
|
}
|
|
1339
1339
|
},
|
|
1340
1340
|
"node_modules/omk-tui": {
|
|
1341
|
-
"version": "0.
|
|
1342
|
-
"resolved": "https://registry.npmjs.org/omk-tui/-/omk-tui-0.
|
|
1341
|
+
"version": "0.97.0",
|
|
1342
|
+
"resolved": "https://registry.npmjs.org/omk-tui/-/omk-tui-0.97.0.tgz",
|
|
1343
1343
|
"license": "MIT",
|
|
1344
1344
|
"dependencies": {
|
|
1345
1345
|
"get-east-asian-width": "1.6.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "open-multi-agent-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.97.0",
|
|
4
4
|
"description": "OMK (Open Multi-Agent Kit) coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"omkConfig": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
],
|
|
33
33
|
"scripts": {
|
|
34
34
|
"clean": "shx rm -rf dist",
|
|
35
|
-
"build": "node ./scripts/link-workspace-deps.mjs && tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && npm run copy-assets",
|
|
35
|
+
"build": "node ./scripts/link-workspace-deps.mjs && tsgo -p tsconfig.build.json && node ../../scripts/prune-dist-orphans.mjs . && shx chmod +x dist/cli.js && npm run copy-assets",
|
|
36
36
|
"build:binary": "npm --prefix ../tui run build && npm --prefix ../ai run build && npm --prefix ../agent run build && npm run build && bun build --compile ./dist/bun/cli.js ./src/utils/image-resize-worker.ts --outfile dist/omk && npm run copy-binary-assets",
|
|
37
37
|
"copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/",
|
|
38
38
|
"copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/assets && shx cp src/modes/interactive/assets/*.png dist/assets/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/",
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"link-workspace-deps": "node ./scripts/link-workspace-deps.mjs"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"omk-agent-core": "^0.
|
|
46
|
-
"omk-ai": "^0.
|
|
47
|
-
"omk-tui": "^0.
|
|
45
|
+
"omk-agent-core": "^0.97.0",
|
|
46
|
+
"omk-ai": "^0.97.0",
|
|
47
|
+
"omk-tui": "^0.97.0",
|
|
48
48
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
49
49
|
"canonicalize": "4.0.0",
|
|
50
50
|
"chalk": "5.6.2",
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"typebox": "1.3.11",
|
|
61
61
|
"undici": "8.10.0",
|
|
62
62
|
"yaml": "2.9.0",
|
|
63
|
-
"omk-adaptorch-wpl": "^0.
|
|
64
|
-
"omk-protocol": "^0.
|
|
63
|
+
"omk-adaptorch-wpl": "^0.97.0",
|
|
64
|
+
"omk-protocol": "^0.97.0"
|
|
65
65
|
},
|
|
66
66
|
"overrides": {
|
|
67
67
|
"rimraf": "6.1.2",
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/** Error categories raised by the OMP pure-seam loader. */
|
|
2
|
-
export type OmpSeamsErrorCode = "DISABLED" | "VENDOR_NOT_FOUND" | "INVALID_SEAM";
|
|
3
|
-
/** Typed error thrown by {@link loadOmpPureSeams}. */
|
|
4
|
-
export declare class OmpSeamsError extends Error {
|
|
5
|
-
readonly code: OmpSeamsErrorCode;
|
|
6
|
-
constructor(code: OmpSeamsErrorCode, message: string);
|
|
7
|
-
}
|
|
8
|
-
/** The validated set of pure oh-my-pi seams (data/proposal-only). */
|
|
9
|
-
export interface OmpPureSeams {
|
|
10
|
-
planRead(input: unknown): unknown;
|
|
11
|
-
presentRead(plan: unknown, file: unknown): unknown;
|
|
12
|
-
planSearch(input: unknown): unknown;
|
|
13
|
-
presentSearch(plan: unknown, matches: unknown, sourceDigests?: unknown): unknown;
|
|
14
|
-
parseHashlineProposal(text: string): unknown;
|
|
15
|
-
hashProposalLine(text: string): Promise<string>;
|
|
16
|
-
hashProposalSource(text: string): Promise<string>;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Returns true unless the seams feature is explicitly disabled
|
|
20
|
-
* (OMK_OMP_SEAMS === "0"). Enabled by default per ADR-OMP-009.
|
|
21
|
-
* Reads `process.env` when no record is supplied.
|
|
22
|
-
*/
|
|
23
|
-
export declare function isOmpSeamsEnabled(env?: Record<string, string | undefined>): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Walks up from `startDir` (inclusive) looking for a `vendor/oh-my-pi`
|
|
26
|
-
* directory that contains the pure read seam marker file. Returns the absolute
|
|
27
|
-
* vendor directory path, or `undefined` when none is found within the level cap.
|
|
28
|
-
*/
|
|
29
|
-
export declare function resolveOmpVendorDir(startDir: string): string | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* Loads and validates the three pure seam modules from the vendored oh-my-pi
|
|
32
|
-
* tree and returns a frozen {@link OmpPureSeams} record. Throws
|
|
33
|
-
* {@link OmpSeamsError} with code DISABLED when the feature is off,
|
|
34
|
-
* VENDOR_NOT_FOUND when the vendor tree cannot be located, or INVALID_SEAM when
|
|
35
|
-
* any expected export is missing or not a function.
|
|
36
|
-
*/
|
|
37
|
-
export declare function loadOmpPureSeams(options?: {
|
|
38
|
-
vendorDir?: string;
|
|
39
|
-
env?: Record<string, string | undefined>;
|
|
40
|
-
}): Promise<OmpPureSeams>;
|
|
41
|
-
//# sourceMappingURL=omp-pure-seams.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"omp-pure-seams.d.ts","sourceRoot":"","sources":["../../../src/core/tools/omp-pure-seams.ts"],"names":[],"mappings":"AAiBA,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAEjF,sDAAsD;AACtD,qBAAa,aAAc,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAEjC,YAAY,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAInD;CACD;AAED,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAClC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACnD,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACjF,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAGnF;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWxE;AAwBD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACzC,GAAG,OAAO,CAAC,YAAY,CAAC,CAqExB","sourcesContent":["/**\n * Flag-gated loader for the vendored oh-my-pi \"pure\" read/search/hashline seams.\n *\n * These seams are pure data/proposal-only functions (planning + presentation +\n * hashline parsing). They do NOT touch edit/write/file-mutation paths. The\n * loader is enabled by default and opts out via OMK_OMP_SEAMS=0 (ADR-OMP-009);\n * when disabled it throws DISABLED and tool behavior falls back to the\n * pre-seam implementation byte-identically.\n *\n * The file is erasable TypeScript: no `enum`, no parameter properties, no `as`,\n * no non-null assertions, no `any` annotations, and no runtime dependencies\n * beyond the Node.js standard library.\n */\nimport { existsSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\n/** Error categories raised by the OMP pure-seam loader. */\nexport type OmpSeamsErrorCode = \"DISABLED\" | \"VENDOR_NOT_FOUND\" | \"INVALID_SEAM\";\n\n/** Typed error thrown by {@link loadOmpPureSeams}. */\nexport class OmpSeamsError extends Error {\n\treadonly code: OmpSeamsErrorCode;\n\n\tconstructor(code: OmpSeamsErrorCode, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"OmpSeamsError\";\n\t\tthis.code = code;\n\t}\n}\n\n/** The validated set of pure oh-my-pi seams (data/proposal-only). */\nexport interface OmpPureSeams {\n\tplanRead(input: unknown): unknown;\n\tpresentRead(plan: unknown, file: unknown): unknown;\n\tplanSearch(input: unknown): unknown;\n\tpresentSearch(plan: unknown, matches: unknown, sourceDigests?: unknown): unknown;\n\tparseHashlineProposal(text: string): unknown;\n\thashProposalLine(text: string): Promise<string>;\n\thashProposalSource(text: string): Promise<string>;\n}\n\n/**\n * Returns true unless the seams feature is explicitly disabled\n * (OMK_OMP_SEAMS === \"0\"). Enabled by default per ADR-OMP-009.\n * Reads `process.env` when no record is supplied.\n */\nexport function isOmpSeamsEnabled(env?: Record<string, string | undefined>): boolean {\n\tconst source: Record<string, string | undefined> = env ?? process.env;\n\treturn source.OMK_OMP_SEAMS !== \"0\";\n}\n\nconst VENDOR_SEGMENT = join(\"vendor\", \"oh-my-pi\");\nconst VENDOR_MARKER = join(VENDOR_SEGMENT, \"packages\", \"coding-agent\", \"src\", \"pure\", \"read.ts\");\nconst MAX_WALK_UP_LEVELS = 8;\n\n/**\n * Walks up from `startDir` (inclusive) looking for a `vendor/oh-my-pi`\n * directory that contains the pure read seam marker file. Returns the absolute\n * vendor directory path, or `undefined` when none is found within the level cap.\n */\nexport function resolveOmpVendorDir(startDir: string): string | undefined {\n\tlet dir = isAbsolute(startDir) ? startDir : resolve(startDir);\n\tfor (let level = 0; level <= MAX_WALK_UP_LEVELS; level += 1) {\n\t\tif (existsSync(join(dir, VENDOR_MARKER))) {\n\t\t\treturn join(dir, VENDOR_SEGMENT);\n\t\t}\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn undefined;\n}\n\n// --- internal narrowing helpers (no `as`; type guards carry the signatures) ---\n\ntype SeamFn = (...args: never[]) => unknown;\ntype SeamAsyncStrFn = (...args: never[]) => Promise<string>;\n\nfunction isSeamFn(member: unknown): member is SeamFn {\n\treturn typeof member === \"function\";\n}\n\nfunction isSeamAsyncStrFn(member: unknown): member is SeamAsyncStrFn {\n\treturn typeof member === \"function\";\n}\n\nfunction expectFn<T extends SeamFn>(member: unknown, guard: (m: unknown) => m is T, name: string): T {\n\tif (guard(member)) return member;\n\tthrow new OmpSeamsError(\"INVALID_SEAM\", `OMP seam missing or non-function: ${name}`);\n}\n\nconst READ_SEAM = join(\"packages\", \"coding-agent\", \"src\", \"pure\", \"read.ts\");\nconst SEARCH_SEAM = join(\"packages\", \"coding-agent\", \"src\", \"pure\", \"search.ts\");\nconst PROPOSAL_SEAM = join(\"packages\", \"hashline\", \"src\", \"proposal.ts\");\n\n/**\n * Loads and validates the three pure seam modules from the vendored oh-my-pi\n * tree and returns a frozen {@link OmpPureSeams} record. Throws\n * {@link OmpSeamsError} with code DISABLED when the feature is off,\n * VENDOR_NOT_FOUND when the vendor tree cannot be located, or INVALID_SEAM when\n * any expected export is missing or not a function.\n */\nexport async function loadOmpPureSeams(options?: {\n\tvendorDir?: string;\n\tenv?: Record<string, string | undefined>;\n}): Promise<OmpPureSeams> {\n\tconst env: Record<string, string | undefined> = options?.env ?? process.env;\n\tif (!isOmpSeamsEnabled(env)) {\n\t\tthrow new OmpSeamsError(\n\t\t\t\"DISABLED\",\n\t\t\t\"OMP pure seams are disabled (OMK_OMP_SEAMS=0; unset or set to any other value to enable).\",\n\t\t);\n\t}\n\n\tlet vendorDir: string | undefined = options?.vendorDir ?? env.OMK_OMP_VENDOR_DIR;\n\tif (!vendorDir) {\n\t\tconst moduleUrl = new URL(\".\", import.meta.url);\n\t\tif (moduleUrl.protocol !== \"file:\") {\n\t\t\tthrow new OmpSeamsError(\n\t\t\t\t\"VENDOR_NOT_FOUND\",\n\t\t\t\t\"OMP vendor dir was not provided and the module is not a file URL.\",\n\t\t\t);\n\t\t}\n\t\tconst found = resolveOmpVendorDir(fileURLToPath(moduleUrl));\n\t\tif (!found) {\n\t\t\tthrow new OmpSeamsError(\n\t\t\t\t\"VENDOR_NOT_FOUND\",\n\t\t\t\t\"OMP vendor dir not found by walking up from the module directory.\",\n\t\t\t);\n\t\t}\n\t\tvendorDir = found;\n\t}\n\tif (!existsSync(vendorDir)) {\n\t\tthrow new OmpSeamsError(\"VENDOR_NOT_FOUND\", `OMP vendor dir does not exist: ${vendorDir}`);\n\t}\n\n\tconst readUrl = pathToFileURL(join(vendorDir, READ_SEAM)).href;\n\tconst searchUrl = pathToFileURL(join(vendorDir, SEARCH_SEAM)).href;\n\tconst proposalUrl = pathToFileURL(join(vendorDir, PROPOSAL_SEAM)).href;\n\n\tconst readMod = await import(readUrl);\n\tconst searchMod = await import(searchUrl);\n\tconst proposalMod = await import(proposalUrl);\n\n\t// Validate every expected member up front so the INVALID_SEAM error lists\n\t// ALL missing/non-function exports, not just the first one encountered.\n\tconst expected: ReadonlyArray<readonly [unknown, string]> = [\n\t\t[readMod.planRead, \"planRead\"],\n\t\t[readMod.presentRead, \"presentRead\"],\n\t\t[searchMod.planSearch, \"planSearch\"],\n\t\t[searchMod.presentSearch, \"presentSearch\"],\n\t\t[proposalMod.parseHashlineProposal, \"parseHashlineProposal\"],\n\t\t[proposalMod.hashProposalLine, \"hashProposalLine\"],\n\t\t[proposalMod.hashProposalSource, \"hashProposalSource\"],\n\t];\n\tconst missing: string[] = [];\n\tfor (const [member, name] of expected) {\n\t\tif (typeof member !== \"function\") missing.push(name);\n\t}\n\tif (missing.length > 0) {\n\t\tthrow new OmpSeamsError(\"INVALID_SEAM\", `OMP seams missing or non-function: ${missing.join(\", \")}`);\n\t}\n\n\tconst rec: OmpPureSeams = {\n\t\tplanRead: expectFn(readMod.planRead, isSeamFn, \"planRead\"),\n\t\tpresentRead: expectFn(readMod.presentRead, isSeamFn, \"presentRead\"),\n\t\tplanSearch: expectFn(searchMod.planSearch, isSeamFn, \"planSearch\"),\n\t\tpresentSearch: expectFn(searchMod.presentSearch, isSeamFn, \"presentSearch\"),\n\t\tparseHashlineProposal: expectFn(proposalMod.parseHashlineProposal, isSeamFn, \"parseHashlineProposal\"),\n\t\thashProposalLine: expectFn(proposalMod.hashProposalLine, isSeamAsyncStrFn, \"hashProposalLine\"),\n\t\thashProposalSource: expectFn(proposalMod.hashProposalSource, isSeamAsyncStrFn, \"hashProposalSource\"),\n\t};\n\tObject.freeze(rec);\n\treturn rec;\n}\n"]}
|