@orkestrel/scaffold 0.0.94 → 0.0.96
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/dist/bin/main.js +9 -9
- package/dist/bin/main.js.map +1 -1
- package/dist/host/claude/agents/orkestrel.md +52 -52
- package/dist/host/guides/agent.md +244 -38
- package/dist/host/guides/browser.md +2371 -2510
- package/dist/host/guides/codec.md +2 -2
- package/dist/host/guides/mcp.md +182 -100
- package/dist/host/guides/msg.md +14 -22
- package/dist/host/guides/ollama.md +172 -11
- package/dist/host/guides/server.md +122 -37
- package/dist/host/guides/test.md +26 -20
- package/dist/host/guides/toolbox.md +47 -40
- package/dist/host/manifest.json +11 -47
- package/dist/host/scripts/codex.sh +0 -0
- package/dist/host/scripts/cursor.sh +0 -0
- package/dist/host/scripts/deps.sh +0 -0
- package/dist/host/scripts/ollama.sh +0 -0
- package/dist/src/core/index.cjs +9 -9
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.js +9 -9
- package/dist/src/core/index.js.map +1 -1
- package/package.json +9 -9
|
@@ -70,7 +70,7 @@ In a guard table a `Shape` cell holds the type the guard narrows to.
|
|
|
70
70
|
| ---------------------- | -------- | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
71
71
|
| `isWorkflowLineage` | function | `WorkflowLineage` | Narrows an unknown value to a valid alternating workflow lineage. |
|
|
72
72
|
| `isAgentFunction` | function | `AgentFunction` | Narrows an unknown callable to Toolbox's frozen contextual agent adapter metadata. |
|
|
73
|
-
| `isColumnPrimitive` |
|
|
73
|
+
| `isColumnPrimitive` | const | `ColumnPrimitive` | Narrows an unknown value to a `ColumnPrimitive`. |
|
|
74
74
|
| `isColumnSpec` | function | `ColumnSpec` | Narrows an unknown value to a `ColumnSpec`. |
|
|
75
75
|
| `isDatabaseDefinition` | function | `DatabaseDefinition` | Narrows an unknown value to a `DatabaseDefinition` — a non-empty `id` and `driver`, a `tables` record whose every value is `{ columns: record of valid ColumnSpec }`, plus optional `primary`, `indexes`, and finite `version` schema configuration. The boundary guard a `DefinitionStoreInterface` applies to an untrusted persisted blob before trusting it as a definition (never an `as`). |
|
|
76
76
|
|
|
@@ -191,41 +191,41 @@ A `Shape` cell holds the constant's declared type.
|
|
|
191
191
|
|
|
192
192
|
A `Shape` cell holds an interface's data members as bare names in braces, `?` marking an optional member and `plus` introducing its call-signature members, and a type alias's own type literal with a union's arms escaped as `\|`.
|
|
193
193
|
|
|
194
|
-
| Type | Kind | Shape | Summary
|
|
195
|
-
| -------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
196
|
-
| `TaskDraft` | interface | `{ id?, name?, description?, behavior?, retries?, timeout? }` | Represents a draft task — a `TaskDefinition` (`@orkestrel/workflow`) with optional `id` and `name`.
|
|
197
|
-
| `PhaseDraft` | interface | `{ id?, name?, description?, tasks, concurrency?, bail? }` | Represents a draft phase — a `PhaseDefinition` (`@orkestrel/workflow`) with optional `id` and `name` and `TaskDraft` tasks.
|
|
198
|
-
| `WorkflowDraft` | interface | `{ id?, name?, description?, phases, bail? }` | Represents a draft workflow — a `WorkflowDefinition` (`@orkestrel/workflow`) with optional `id` and `name` at the workflow, phase, and task levels.
|
|
199
|
-
| `WorkflowStep` | interface | `{ name }` | Represents one flat step — `{ name }` — the building block of a `WorkflowSteps` blob.
|
|
200
|
-
| `WorkflowSteps` | interface | `{ name?, steps }` | Represents the flat authoring blob `createWorkflowTool` advertises — `{ name?, steps }` — the simplest surface a small model can fill.
|
|
201
|
-
| `WorkflowToolResult` | interface | `{ status, count, durable?, fault? }` | Represents the JSON-safe run summary returned by `createWorkflowTool`.
|
|
202
|
-
| `WorkflowLineage` | type | `readonly string[]` | Represents one immutable workflow/agent call chain — strictly alternating tags, each unique, beginning with a workflow tag.
|
|
203
|
-
| `WorkflowAgents` | type | `Readonly<Record<string, AgentInterface>>` | Represents raw live agents keyed by the workflow function names that invoke them.
|
|
204
|
-
| `AgentFunction` | type | `WorkflowFunction & { category, lineage }` | Represents a contextual agent adapter carrying immutable metadata for Toolbox composition.
|
|
205
|
-
| `AgentFunctionOptions` | interface | `{ runner?, lineage?, functions?, agents?, store? }` | Represents the options for `createAgentFunction` — the opt-in adapter that wraps a live `AgentInterface` (`@orkestrel/agent`) as an `AgentFunction` with immutable lineage metadata and optional nested-workflow composition.
|
|
206
|
-
| `WorkflowToolOptions` | interface | `{ lineage?, functions?, agents?, store? }` | Represents the options for `createWorkflowTool` and `createWorkflowFunctions` — lineage-aware composition of opaque leaves, raw agents, and native workflow persistence.
|
|
207
|
-
| `WorkspaceToolOptions` | interface | `{ name?, description?, manager?, store? }` | Represents the options for `createWorkspaceTool` — either a caller-built `WorkspaceManagerInterface` to drive directly, or a `WorkspaceStoreInterface` the tool constructs a fresh manager over; neither given constructs a manager over `@orkestrel/workspace`'s in-memory store.
|
|
208
|
-
| `WorkspaceOperation` | type | `{ operation: 'read', path } \| { operation: 'list' } \| { operation: 'has', path } \| { operation: 'search', query, regex?, sensitive?, limit? } \| { operation: 'replace', query, replacement, regex?, sensitive?, limit? } \| { operation: 'write', path, content } \| { operation: 'splice', path, content, fromLine, fromColumn, toLine, toColumn } \| { operation: 'prepend', path, content } \| { operation: 'append', path, content } \| { operation: 'move', from, to } \| { operation: 'remove', path } \| { operation: 'workspaces' } \| { operation: 'switch', id }` | Represents one operation an agent invokes through `createWorkspaceTool` — a flat, descriptive tagged union over the workspace edit, read, and navigation actions, discriminated by the `operation` literal (a discriminant is named for its axis — the action being performed — never `kind`).
|
|
209
|
-
| `AgentToolOptions` | interface | `{ name?, description?, provider?, tools?, system?, depth?, ancestry?, store? }` | Represents the options for `createAgentTool` — the sub-agent delegation defaults, the nesting-depth / cycle guard bookkeeping, and the advertised tool overrides.
|
|
210
|
-
| `AgentToolArguments` | interface | `{ task, provider?, tools?, system? }` | Represents the flat args `createAgentTool` accepts — a delegated `task` plus the minimal optional `AgentJobInput` (`@orkestrel/agent`) fields a caller may override per-call.
|
|
211
|
-
| `ToolboxErrorCode` | type | `'TOOL' \| 'DEPTH' \| 'DEADLOCK' \| 'EXPIRE' \| 'ANSWER' \| 'DATABASE' \| 'RELATION'` | Represents the machine-readable code a thrown `ToolboxError` carries — a thrown, typed, code-bearing error, never a `{ error }` return.
|
|
212
|
-
| `DescribeToolArguments` | interface | `{ name }` | Represents the flat args `createDescribeTool` accepts — the registered tool `name` whose full `description` a model wants back.
|
|
213
|
-
| `PromptToolOptions` | interface | `{ manager, from, name?, description? }` | Represents the options for `createPromptTool` — the live `TerminalManagerInterface` (`@orkestrel/terminal`) to `ask` through, the terminal name `from`, and the advertised tool overrides.
|
|
214
|
-
| `AnswerToolOptions` | interface | `{ manager, to, name?, description? }` | Represents the options for `createAnswerTool` — the live `TerminalManagerInterface` (`@orkestrel/terminal`) to list / answer prompts through, the terminal name `to`, and the advertised tool overrides.
|
|
215
|
-
| `ColumnPrimitive` | type | `'string' \| 'integer' \| 'number' \| 'boolean'` | Represents one column's declared primitive — a shorthand, or `integer` for a whole-number `number`.
|
|
216
|
-
| `ColumnSpec` | type | `ColumnPrimitive \| { primitive, optional? }` | Represents one table column's spec — either a bare `ColumnPrimitive` shorthand, or `{ primitive, optional }` when the column may be absent from a row.
|
|
217
|
-
| `TableSpec` | type | `Readonly<Record<string, { columns }>>` | Represents a database's table layout — one entry per table, each a flat map of column name to `ColumnSpec`. The small-model-facing DSL `expandTables` compiles into an `@orkestrel/database` `TableMap`.
|
|
218
|
-
| `DatabaseDefinition` | interface | `{ id, driver, tables, primary?, indexes?, version? }` | Represents one database's config-only definition — an `id`, a `driver`, and a `TableSpec`, with optional `primary`, `indexes`, and `version` schema configuration.
|
|
219
|
-
| `DatabaseDefinitionRow` | interface | `{ id, definition }` | Represents one opaque persisted row — the shape a definition-row-backed `TableInterface` store reads/writes; `definition` is narrowed with `isDatabaseDefinition` on read.
|
|
220
|
-
| `DefinitionStoreInterface` | interface | `{} plus get, set, delete` | Represents the point-access persistence seam for `DatabaseDefinition` configs — the twin of `@orkestrel/terminal`'s `TerminalStoreInterface`, storing a database's config-only blueprint rather than a live handle. Every primitive is async; `delete` of an absent id is a no-op.
|
|
221
|
-
| `DatabaseQueryInput` | interface | `{ conditions?, order?, limit?, offset? }` | Represents the serialized wire query a database-tool call carries — the parsed form of `queryShape`, which `normalizeQuery` normalizes into a live `@orkestrel/database` `QueryInput`.
|
|
222
|
-
| `ClampedQuery` | interface | `{ query, limit }` | Represents the probe query and effective row limit `clampQuery` returns.
|
|
223
|
-
| `DatabaseToolOptions` | interface | `{ name?, description?, databases?, store?, drivers?, generator?, limit?, timeout?, readonly? }` | Represents the options for `createDatabaseTool` — the live handles, definition store, driver registry, key generator, row cap, timeout, and readonly gate the tool composes.
|
|
224
|
-
| `RelationToolOptions` | interface | `{ name?, description?, managers, limit?, depth? }` | Represents the options for `createRelationTool` — the required live `RelationManagerInterface` registry a call addresses, the row cap, and the `include` depth cap.
|
|
225
|
-
| `InferToolOptions` | interface | `{ name?, description? }` | Represents the options for `createInferTool` — advertised name and description overrides only; `format` and `enum` are runtime call arguments (see `inferToolShape`), not construction-time options, because a model chooses them per call.
|
|
226
|
-
| `EndpointHandler` | type | `(args: Readonly<Record<string, unknown
|
|
227
|
-
| `EndpointDefinition` | interface | `{ name, description, samples, execute }` | Represents one concrete endpoint `createEndpointTool` wraps as an LLM-callable `ToolInterface` — the advertised identity, a non-empty set of example values its `parameters` are inferred from, and the local handler that runs a call.
|
|
228
|
-
| `EndpointToolOptions` | interface | `{ format?, enum?, validate? }` | Represents the construction-time tuning for `createEndpointTool` — the inferred `parameters` schema's `format` and `enum` constraints, and whether that same schema is enforced at `execute` time.
|
|
194
|
+
| Type | Kind | Shape | Summary |
|
|
195
|
+
| -------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
196
|
+
| `TaskDraft` | interface | `{ id?, name?, description?, behavior?, retries?, timeout? }` | Represents a draft task — a `TaskDefinition` (`@orkestrel/workflow`) with optional `id` and `name`. |
|
|
197
|
+
| `PhaseDraft` | interface | `{ id?, name?, description?, tasks, concurrency?, bail? }` | Represents a draft phase — a `PhaseDefinition` (`@orkestrel/workflow`) with optional `id` and `name` and `TaskDraft` tasks. |
|
|
198
|
+
| `WorkflowDraft` | interface | `{ id?, name?, description?, phases, bail? }` | Represents a draft workflow — a `WorkflowDefinition` (`@orkestrel/workflow`) with optional `id` and `name` at the workflow, phase, and task levels. |
|
|
199
|
+
| `WorkflowStep` | interface | `{ name }` | Represents one flat step — `{ name }` — the building block of a `WorkflowSteps` blob. |
|
|
200
|
+
| `WorkflowSteps` | interface | `{ name?, steps }` | Represents the flat authoring blob `createWorkflowTool` advertises — `{ name?, steps }` — the simplest surface a small model can fill. |
|
|
201
|
+
| `WorkflowToolResult` | interface | `{ status, count, durable?, fault? }` | Represents the JSON-safe run summary returned by `createWorkflowTool`. |
|
|
202
|
+
| `WorkflowLineage` | type | `readonly string[]` | Represents one immutable workflow/agent call chain — strictly alternating tags, each unique, beginning with a workflow tag. |
|
|
203
|
+
| `WorkflowAgents` | type | `Readonly<Record<string, AgentInterface>>` | Represents raw live agents keyed by the workflow function names that invoke them. |
|
|
204
|
+
| `AgentFunction` | type | `WorkflowFunction & { category, lineage }` | Represents a contextual agent adapter carrying immutable metadata for Toolbox composition. |
|
|
205
|
+
| `AgentFunctionOptions` | interface | `{ runner?, lineage?, functions?, agents?, store? }` | Represents the options for `createAgentFunction` — the opt-in adapter that wraps a live `AgentInterface` (`@orkestrel/agent`) as an `AgentFunction` with immutable lineage metadata and optional nested-workflow composition. |
|
|
206
|
+
| `WorkflowToolOptions` | interface | `{ lineage?, functions?, agents?, store? }` | Represents the options for `createWorkflowTool` and `createWorkflowFunctions` — lineage-aware composition of opaque leaves, raw agents, and native workflow persistence. |
|
|
207
|
+
| `WorkspaceToolOptions` | interface | `{ name?, description?, manager?, store? }` | Represents the options for `createWorkspaceTool` — either a caller-built `WorkspaceManagerInterface` to drive directly, or a `WorkspaceStoreInterface` the tool constructs a fresh manager over; neither given constructs a manager over `@orkestrel/workspace`'s in-memory store. |
|
|
208
|
+
| `WorkspaceOperation` | type | `{ operation: 'read', path } \| { operation: 'list' } \| { operation: 'has', path } \| { operation: 'search', query, regex?, sensitive?, limit? } \| { operation: 'replace', query, replacement, regex?, sensitive?, limit? } \| { operation: 'write', path, content } \| { operation: 'splice', path, content, fromLine, fromColumn, toLine, toColumn } \| { operation: 'prepend', path, content } \| { operation: 'append', path, content } \| { operation: 'move', from, to } \| { operation: 'remove', path } \| { operation: 'workspaces' } \| { operation: 'switch', id }` | Represents one operation an agent invokes through `createWorkspaceTool` — a flat, descriptive tagged union over the workspace edit, read, and navigation actions, discriminated by the `operation` literal (a discriminant is named for its axis — the action being performed — never `kind`). |
|
|
209
|
+
| `AgentToolOptions` | interface | `{ name?, description?, provider?, tools?, system?, depth?, ancestry?, store? }` | Represents the options for `createAgentTool` — the sub-agent delegation defaults, the nesting-depth / cycle guard bookkeeping, and the advertised tool overrides. |
|
|
210
|
+
| `AgentToolArguments` | interface | `{ task, provider?, tools?, system? }` | Represents the flat args `createAgentTool` accepts — a delegated `task` plus the minimal optional `AgentJobInput` (`@orkestrel/agent`) fields a caller may override per-call. |
|
|
211
|
+
| `ToolboxErrorCode` | type | `'TOOL' \| 'DEPTH' \| 'DEADLOCK' \| 'EXPIRE' \| 'ANSWER' \| 'DATABASE' \| 'RELATION'` | Represents the machine-readable code a thrown `ToolboxError` carries — a thrown, typed, code-bearing error, never a `{ error }` return. |
|
|
212
|
+
| `DescribeToolArguments` | interface | `{ name }` | Represents the flat args `createDescribeTool` accepts — the registered tool `name` whose full `description` a model wants back. |
|
|
213
|
+
| `PromptToolOptions` | interface | `{ manager, from, name?, description? }` | Represents the options for `createPromptTool` — the live `TerminalManagerInterface` (`@orkestrel/terminal`) to `ask` through, the terminal name `from`, and the advertised tool overrides. |
|
|
214
|
+
| `AnswerToolOptions` | interface | `{ manager, to, name?, description? }` | Represents the options for `createAnswerTool` — the live `TerminalManagerInterface` (`@orkestrel/terminal`) to list / answer prompts through, the terminal name `to`, and the advertised tool overrides. |
|
|
215
|
+
| `ColumnPrimitive` | type | `'string' \| 'integer' \| 'number' \| 'boolean'` | Represents one column's declared primitive — a shorthand, or `integer` for a whole-number `number`. |
|
|
216
|
+
| `ColumnSpec` | type | `ColumnPrimitive \| { primitive, optional? }` | Represents one table column's spec — either a bare `ColumnPrimitive` shorthand, or `{ primitive, optional }` when the column may be absent from a row. |
|
|
217
|
+
| `TableSpec` | type | `Readonly<Record<string, { columns }>>` | Represents a database's table layout — one entry per table, each a flat map of column name to `ColumnSpec`. The small-model-facing DSL `expandTables` compiles into an `@orkestrel/database` `TableMap`. |
|
|
218
|
+
| `DatabaseDefinition` | interface | `{ id, driver, tables, primary?, indexes?, version? }` | Represents one database's config-only definition — an `id`, a `driver`, and a `TableSpec`, with optional `primary`, `indexes`, and `version` schema configuration. |
|
|
219
|
+
| `DatabaseDefinitionRow` | interface | `{ id, definition }` | Represents one opaque persisted row — the shape a definition-row-backed `TableInterface` store reads/writes; `definition` is narrowed with `isDatabaseDefinition` on read. |
|
|
220
|
+
| `DefinitionStoreInterface` | interface | `{} plus get, set, delete` | Represents the point-access persistence seam for `DatabaseDefinition` configs — the twin of `@orkestrel/terminal`'s `TerminalStoreInterface`, storing a database's config-only blueprint rather than a live handle. Every primitive is async; `delete` of an absent id is a no-op. |
|
|
221
|
+
| `DatabaseQueryInput` | interface | `{ conditions?, order?, limit?, offset? }` | Represents the serialized wire query a database-tool call carries — the parsed form of `queryShape`, which `normalizeQuery` normalizes into a live `@orkestrel/database` `QueryInput`. |
|
|
222
|
+
| `ClampedQuery` | interface | `{ query, limit }` | Represents the probe query and effective row limit `clampQuery` returns. |
|
|
223
|
+
| `DatabaseToolOptions` | interface | `{ name?, description?, databases?, store?, drivers?, generator?, limit?, timeout?, readonly? }` | Represents the options for `createDatabaseTool` — the live handles, definition store, driver registry, key generator, row cap, timeout, and readonly gate the tool composes. |
|
|
224
|
+
| `RelationToolOptions` | interface | `{ name?, description?, managers, limit?, depth? }` | Represents the options for `createRelationTool` — the required live `RelationManagerInterface` registry a call addresses, the row cap, and the `include` depth cap. |
|
|
225
|
+
| `InferToolOptions` | interface | `{ name?, description? }` | Represents the options for `createInferTool` — advertised name and description overrides only; `format` and `enum` are runtime call arguments (see `inferToolShape`), not construction-time options, because a model chooses them per call. |
|
|
226
|
+
| `EndpointHandler` | type | `(args: Readonly<Record<string, unknown>>, context: ToolContext) => Promise<unknown> \| unknown` | Represents the handler `EndpointDefinition.execute` implements — it mirrors `@orkestrel/tool`'s `ToolOptions.execute` signature exactly, so `createEndpointTool` forwards the execution context it receives to the handler unchanged and a handler that reads `context.signal` observes the caller's cancellation. |
|
|
227
|
+
| `EndpointDefinition` | interface | `{ name, description, samples, execute }` | Represents one concrete endpoint `createEndpointTool` wraps as an LLM-callable `ToolInterface` — the advertised identity, a non-empty set of example values its `parameters` are inferred from, and the local handler that runs a call. |
|
|
228
|
+
| `EndpointToolOptions` | interface | `{ format?, enum?, validate? }` | Represents the construction-time tuning for `createEndpointTool` — the inferred `parameters` schema's `format` and `enum` constraints, and whether that same schema is enforced at `execute` time. |
|
|
229
229
|
|
|
230
230
|
### Server routes
|
|
231
231
|
|
|
@@ -337,7 +337,7 @@ Before shape branching or property reads, the handler snapshots untrusted `args`
|
|
|
337
337
|
|
|
338
338
|
11. **`ToolboxError` owns Toolbox boundary failures; upstream errors own genuine domain failures.** It carries a machine-readable `ToolboxErrorCode` and an optional `context` and is always thrown, never returned as `{ error }`: `TOOL` covers malformed authoring, missing tool bindings, invalid tool/agent JSON, and the other package-owned resolution/configuration guards; `DEPTH` covers Toolbox workflow/agent nesting refusal; the remaining codes retain their terminal/database/relation meanings. A genuine error thrown by an executed tool passes through unchanged. The native workflow runner's genuine `WorkflowError` also passes through unchanged, including `TRANSITION` for an unresolved named run; Toolbox never invents invalid workflow `TOOL`/`DEPTH` codes and never relabels runner errors. `WorkspaceError` similarly retains its upstream domain ownership. An in-process direct call can inspect typed codes/context; `ToolManagerInterface.execute` flattens the error to its message.
|
|
339
339
|
|
|
340
|
-
12. **The workflow-function adapters are opt-in and exact at the JSON boundary.** `createToolFunction(tools, name)` resolves the live tool, awaits `tool.execute(controller.input)
|
|
340
|
+
12. **The workflow-function adapters are opt-in and exact at the JSON boundary.** `createToolFunction(tools, name)` resolves the live tool, awaits `tool.execute(controller.input, { signal: controller.signal })` — the execution context carries the running task's own cancellation, so a handler that reads `context.signal` observes the run's cancellation rather than an uncancellable stand-in — then deep-gates the unknown return through `parseJSONValue`; a missing binding or non-JSON result throws `ToolboxError('TOOL')`, while a genuine tool throw passes through by identity. It rejects `name === WORKFLOW_TOOL_NAME` at construction so the reserved live workflow tool cannot be adapted back into a workflow registry. `createAgentFunction(agent, options?)` returns a frozen `AgentFunction` with frozen category/lineage metadata. It starts `agent.generate({ signal: controller.signal })` synchronously after any runner-bound tool installation, using Agent's native per-run cancellation seam: an already-aborted signal starts no provider call, and cancellation settles as a partial result. The full `AgentResult` is projected through Agent-owned `agentResultToJSON`; malformed structural results become `ToolboxError('TOOL')`. With a runner, an already-running real agent is rejected before its workflow-tool binding can be replaced, so another Toolbox branch observes the running state. Genuine agent/provider errors retain identity.
|
|
341
341
|
|
|
342
342
|
13. **The lean `summary` / full `description` split, and `createDescribeTool`'s expansion seam.** `createWorkflowTool`, `createWorkspaceTool`, and `createAgentTool` each set `ToolInterface.summary` (`@orkestrel/tool`) to a frozen one-sentence constant (`WORKFLOW_TOOL_SUMMARY` / `WORKSPACE_TOOL_SUMMARY` / `AGENT_TOOL_SUMMARY`) alongside their unchanged full teaching `description`; `ToolManagerInterface.definitions()` advertises `summary ?? description`, so a model sees the lean text by default. `createDescribeTool(tools)` is the on-demand expansion: given a registered `name`, it looks the tool up through `tools.tool(name)` and returns its full `tool.description` (falling back to `tool.summary`, then a placeholder, when a tool has neither) — never truncated, never re-derived. Each summary's text points the model at `describe('<name>')` for the full schema.
|
|
343
343
|
|
|
@@ -349,7 +349,7 @@ Before shape branching or property reads, the handler snapshots untrusted `args`
|
|
|
349
349
|
|
|
350
350
|
17. **`'records'` / `'find'` / `'links'` truncate against a configured cap, never silently.** `createDatabaseTool`'s `'records'` (cap: `DatabaseToolOptions.limit`, default `DATABASE_TOOL_LIMIT`) and `createRelationTool`'s `'find'` / `'links'` (cap: `RelationToolOptions.limit`, default `RELATION_TOOL_LIMIT`) each probe one row past the effective limit (`clampQuery` for the database tool; `resolveLimit` plus the same probe for `'find'`) to detect truncation without a separate count round trip, returning `{ rows, count, truncated, limit }` (`'links'`: `{ keys, count, truncated, limit }`) — `truncated` is `true` exactly when storage held more than `limit` matching rows/keys. A caller's own `query.limit` / `limit` can only lower the effective cap, never raise it past the configured ceiling.
|
|
351
351
|
|
|
352
|
-
18. **A typed upstream failure re-surfaces in-process as a typed `ToolboxError`, never passes through raw.** `createDatabaseTool` catches a `@orkestrel/database` `DatabaseError` and re-throws a typed `DATABASE` `ToolboxError` carrying the original `DatabaseErrorCode` in `context.code` (`inferDatabaseCode`); `createRelationTool` does the same for a `@orkestrel/relation` `RelationError` → `RELATION` (`inferRelationCode`, checked first) and, underneath it, a `DatabaseError` → `DATABASE` (mirroring the database tool's own mapping) — so an in-process catch or direct `tool.execute(args)` call sees exactly one of `TOOL` (this tool's own guards: malformed args, unknown manager/model/database/driver), `RELATION`, or `DATABASE`, never an unwrapped upstream error. A `ToolboxError` already thrown by this tool's own guards passes through unwrapped (never re-mapped a second time). A `ToolManagerInterface.execute` registry caller does not receive that code or context; it receives only the flattened message string.
|
|
352
|
+
18. **A typed upstream failure re-surfaces in-process as a typed `ToolboxError`, never passes through raw.** `createDatabaseTool` catches a `@orkestrel/database` `DatabaseError` and re-throws a typed `DATABASE` `ToolboxError` carrying the original `DatabaseErrorCode` in `context.code` (`inferDatabaseCode`); `createRelationTool` does the same for a `@orkestrel/relation` `RelationError` → `RELATION` (`inferRelationCode`, checked first) and, underneath it, a `DatabaseError` → `DATABASE` (mirroring the database tool's own mapping) — so an in-process catch or direct `tool.execute(args, context)` call sees exactly one of `TOOL` (this tool's own guards: malformed args, unknown manager/model/database/driver), `RELATION`, or `DATABASE`, never an unwrapped upstream error. A `ToolboxError` already thrown by this tool's own guards passes through unwrapped (never re-mapped a second time). A `ToolManagerInterface.execute` registry caller does not receive that code or context; it receives only the flattened message string.
|
|
353
353
|
|
|
354
354
|
19. **`DatabaseToolOptions.readonly` gates every mutating operation up front.** When `true`, `createDatabaseTool` throws a typed `TOOL` `ToolboxError` for `'create'` / `'add'` / `'set'` / `'update'` / `'remove'` / `'destroy'` before resolving a database or touching storage — the non-mutating operations (`'tables'` / `'get'` / `'records'` / `'count'` / `'aggregate'`) are unaffected. The exported `DATABASE_TOOL_MUTATIONS` membership list is a runtime-frozen readonly array, so a consumer cannot mutate it to bypass this gate. There is no equivalent gate on `createRelationTool` — its `'link'` / `'unlink'` writes are ungated (relation-tool callers rely on the underlying database's own access controls, if any).
|
|
355
355
|
|
|
@@ -359,7 +359,7 @@ Before shape branching or property reads, the handler snapshots untrusted `args`
|
|
|
359
359
|
|
|
360
360
|
22. **`createDatabaseTool` durability and ownership are narrower than they look.** A lazily re-minted database over the default in-memory driver yields an empty database — only the `DatabaseDefinition` schema persists in `store`, never rows; durable rows need a persistent driver factory registered in `DatabaseToolOptions.drivers`. A cached live database is never evolved in place. To adopt a new target `version`, create a new database id backed by a versioned persistent driver, or close the old tool lifecycle and construct a new tool whose stored definition carries the new schema metadata and stamp. `'destroy'` closes whatever handle is cached for the id, including an embedder-supplied `DatabaseToolOptions.databases` handle — the embedder relinquishes that handle's lifecycle to this tool for any id it wires in. `timeout`, when present, must be a nonnegative safe integer and is validated when the tool is constructed. Its fresh abort signal is passed only to `records`, `count`, `aggregate`, `add`, `set`, `update`, and `remove`, whose current table APIs accept operation options; it does not bound store resolution, construction, schema inspection, `get`, or `close`, and is not an outer deadline. The tool assumes the single-writer, non-reentrant model `@orkestrel/database` itself assumes — concurrent tool calls against one id are not serialized by this tool. Unlike `'records'` / `'find'` / `'links'`, `'get'` is uncapped by `DatabaseToolOptions.limit` (bounded only by the caller's `key` array size).
|
|
361
361
|
|
|
362
|
-
23. **`createEndpointTool` enforces its advertised inferred schema through a normalizing parse by default (`@orkestrel/contract`'s `schemaToShape`), with an explicit `validate: false` opt-out.** `parameters` is inferred once at construction (`samplesToSchema` and `schemaToObject` over `definition.samples`, tuned by `EndpointToolOptions.format`/`enum`) — the same object-rooted schema is compiled once (`schemaToShape` → `createContract`) into the contract the tool's `execute` `parse`s every call's `args` through before `definition.execute` runs. The parse coerces a scalar to its inferred type where the house parsers coerce (a number to/from a numeric string, a boolean from `'1'`/`'0'`/`'true'`/`'false'`/`1`/`0`) — `definition.execute` receives the coerced values (for example `7` sent for a string slot arrives as `'7'`), not the raw call args. A call whose `args` fails to parse into a record — a required key missing, or a value not coercible to its slot's type — throws a typed `TOOL` `ToolboxError` carrying the compiled contract's structured `explain` faults (through `contract.explain(args)`), and `definition.execute` is never called. Beyond that coercion, enforcement is structural: required keys, `enum` membership, and numeric bounds — `format` annotations (`email`, `date-time`, `uuid`, `uri`, ...) are never asserted, mirroring `@orkestrel/contract`'s own widening-only law for `schemaToShape` (a `format: true`-tuned endpoint still accepts a non-conforming string in that slot); a key outside the closed inferred schema is silently dropped, not rejected — `@orkestrel/contract`'s own `parse` grants that same leniency to any closed object. `EndpointToolOptions.validate: false` disables that enforcement: the tool's `execute` calls `definition.execute
|
|
362
|
+
23. **`createEndpointTool` enforces its advertised inferred schema through a normalizing parse by default (`@orkestrel/contract`'s `schemaToShape`), with an explicit `validate: false` opt-out.** `parameters` is inferred once at construction (`samplesToSchema` and `schemaToObject` over `definition.samples`, tuned by `EndpointToolOptions.format`/`enum`) — the same object-rooted schema is compiled once (`schemaToShape` → `createContract`) into the contract the tool's `execute` `parse`s every call's `args` through before `definition.execute` runs. The parse coerces a scalar to its inferred type where the house parsers coerce (a number to/from a numeric string, a boolean from `'1'`/`'0'`/`'true'`/`'false'`/`1`/`0`) — `definition.execute` receives the coerced values (for example `7` sent for a string slot arrives as `'7'`), not the raw call args. A call whose `args` fails to parse into a record — a required key missing, or a value not coercible to its slot's type — throws a typed `TOOL` `ToolboxError` carrying the compiled contract's structured `explain` faults (through `contract.explain(args)`), and `definition.execute` is never called. Beyond that coercion, enforcement is structural: required keys, `enum` membership, and numeric bounds — `format` annotations (`email`, `date-time`, `uuid`, `uri`, ...) are never asserted, mirroring `@orkestrel/contract`'s own widening-only law for `schemaToShape` (a `format: true`-tuned endpoint still accepts a non-conforming string in that slot); a key outside the closed inferred schema is silently dropped, not rejected — `@orkestrel/contract`'s own `parse` grants that same leniency to any closed object. `EndpointToolOptions.validate: false` disables that enforcement: the tool's `execute` calls `definition.execute` with the model-supplied `args` exactly as received, never re-parsed, coerced, or checked against the advertised schema. The execution context the tool's `execute` receives reaches `definition.execute` unchanged whether or not that enforcement runs, so a handler that reads `context.signal` observes the caller's cancellation. `createInferTool`'s own call args are, as before, always validated against `inferToolShape` (a hand-written shape) regardless — it is the schema inference's caller, not an inferred schema's consumer. `createEndpointTool`'s and `createInferTool`'s inferred schemas surface sample-derived strings verbatim (property names, and enum entries when opted in), so treat sample data intended for schema inference as untrusted content whenever the resulting schema will be advertised to other agents. `createInferTool`'s optional `candidates` call arg is the opposite seam: it checks values against the same call's freshly inferred schema (compiled per-call, because the schema itself is derived from that call's `samples`) and returns a uniform `{ index, valid, coercible, faults? }` entry per candidate. `valid` is a strict `.is` guard verdict, not a normalizing `.parse` — `7` against an inferred string slot is invalid (no coercion), where the same value would be silently coerced to `'7'` by `createEndpointTool`'s enforcement. `coercible` (`checker.parse(candidate) !== undefined`) answers that separate question directly — would `createEndpointTool`'s default enforcement admit this value — and, by the house parse/guard round-trip, is always `true` on a `valid: true` entry. Because `@orkestrel/contract`'s `.explain` mirrors `.parse`'s leniency, not `.is`'s strictness, a strictly-invalid but coercible candidate (`7` against a string slot) yields `{ valid: false, coercible: true, faults: [] }` — empty faults, because the mismatch normalization would silently fix is not one `.explain` reports; `faults` populates only for a non-coercible mismatch (`coercible: false`). `checker.is` / `.parse` / `.explain` are total over JSON-safe input — a JSON-safe hostile candidate (a `__proto__`-carrying object, deep nesting) reaches each of them and yields a bounded, non-throwing per-candidate verdict; a non-JSON-safe candidate (a throwing-getter `Proxy`) never reaches the checker — it fails the outer `args` parse and rejects the whole call as a `TOOL` error, with no per-candidate verdict. `candidates` is uncapped in count (any array length is accepted), but each individual check is bounded (`.explain`'s fault list and the checker's own schema are both bounded by the inference limits already governing `samples`), so the total per-call cost is linear in `candidates.length`.
|
|
363
363
|
|
|
364
364
|
24. **The terminal seam speaks whole forms, and `@orkestrel/form` owns their shape.** `promptToolShape` bounds a call to `{ to, schema }` and `answerToolShape`'s `'answer'` arm to `{ id, values }`, each of `schema` and `values` admitted only as exact JSON — Toolbox does not restate the form schema as a second contract. `createPromptTool` then hands `schema` to `parseForm`; a refusal (an unknown control, a duplicate field name, a `'select'` / `'checkbox'` field without usable choices, any other schema fault) throws a typed `TOOL` `ToolboxError` and nothing parks, so a malformed schema can never become a form nobody can answer. A parsed schema becomes a live form through `createForm` and is passed to `manager.ask(from, to, form)`, whose settled `FormValues` is the tool's return value — one record keyed by field name, however many fields the form declared. `createAnswerTool` narrows `values` with `isFormValues` before `manager.answer`, so a non-form payload is refused as `TOOL` rather than reaching the parked form. Expiry reaches one code from either side: a `TerminalError('EXPIRE')` from the broker and a `FormError('ABANDONED')` from the form itself both re-surface as `EXPIRE`, so a caller branches on Toolbox's own code and never on which layer timed the form out. A failed apply carries the manager's `TerminalAnswerError` through: `context.reason` is `'unknown'` / `'rejected'` / `'target'`, and a `'rejected'` apply also carries the per-field `errors` in `context.errors` so the asking side can name which field failed.
|
|
365
365
|
|
|
@@ -420,7 +420,7 @@ const store = createMemoryWorkflowStore()
|
|
|
420
420
|
const runner = createWorkflowRunner()
|
|
421
421
|
const tool = createWorkflowTool(definition, runner, { store })
|
|
422
422
|
|
|
423
|
-
const summary = await tool.execute({}) // native runner checkpoints through `store`
|
|
423
|
+
const summary = await tool.execute({}, { signal: new AbortController().signal }) // native runner checkpoints through `store`
|
|
424
424
|
// summary: { status: 'completed', count: 1, durable: true }
|
|
425
425
|
const snapshot = await store.get('ingest')
|
|
426
426
|
const restored = snapshot === undefined ? undefined : createRestoredWorkflow(snapshot)
|
|
@@ -1006,6 +1006,13 @@ const result = await tools.execute({
|
|
|
1006
1006
|
// `{ validate: false }` as the second argument to `createEndpointTool` for raw passthrough.
|
|
1007
1007
|
```
|
|
1008
1008
|
|
|
1009
|
+
The handler takes the caller's execution context as its second parameter, the same one a
|
|
1010
|
+
`@orkestrel/tool` handler takes. `createEndpointTool` forwards that context unchanged whichever way
|
|
1011
|
+
it handled the args — parsed against the inferred schema, or passed through raw under
|
|
1012
|
+
`{ validate: false }` — so a handler that reads `context.signal` observes the caller's cancellation.
|
|
1013
|
+
The preceding fence declares `args` alone, which still satisfies `EndpointHandler`: a handler reads
|
|
1014
|
+
the signal only where it has cancellable work to abandon.
|
|
1015
|
+
|
|
1009
1016
|
## Tests
|
|
1010
1017
|
|
|
1011
1018
|
- [`tests/guides.test.ts`](../tests/guides.test.ts) — the `## Surface` ↔ `src/core` and `src/server` bijection (value and type exports, spanning both barrels), this guide's `## Patterns` fences resolving to real exports (per-specifier) with resolving imports, the `DefinitionStoreInterface` and `DatabaseResolver` method bijections, and the equality gate: every `Summary` cell against its declaration's description paragraph, the titled `Authoring and running a workflow through the tool with a real ToolManager` fence against the `@example` block of that title (pinned so the titled pair cannot be retired silently), and the README pitch against this guide's tagline. It also runs the flagship fences and asserts the values their comments claim.
|
package/dist/host/manifest.json
CHANGED
|
@@ -496,7 +496,7 @@
|
|
|
496
496
|
"storage": "claude/agents/orkestrel.md",
|
|
497
497
|
"destination": ".claude/agents/orkestrel.md",
|
|
498
498
|
"executable": false,
|
|
499
|
-
"digest": "
|
|
499
|
+
"digest": "9a127e46e981c2d7fa8347d5e01c0c96205be566279e91923e1967094cca6029"
|
|
500
500
|
},
|
|
501
501
|
{
|
|
502
502
|
"storage": "claude/agents/planner.md",
|
|
@@ -850,7 +850,7 @@
|
|
|
850
850
|
"storage": "guides/agent.md",
|
|
851
851
|
"destination": "guides/agent.md",
|
|
852
852
|
"executable": false,
|
|
853
|
-
"digest": "
|
|
853
|
+
"digest": "f43f24eafb1583396abb5ee9d2b056923e02cc53e29f18064d6f5bf9017c014e"
|
|
854
854
|
},
|
|
855
855
|
{
|
|
856
856
|
"storage": "guides/brief.md",
|
|
@@ -862,7 +862,7 @@
|
|
|
862
862
|
"storage": "guides/browser.md",
|
|
863
863
|
"destination": "guides/browser.md",
|
|
864
864
|
"executable": false,
|
|
865
|
-
"digest": "
|
|
865
|
+
"digest": "41892754ac63c9344555f53fb8b2118bb2ece1ec79b4d4594077e8a77e1cb3a2"
|
|
866
866
|
},
|
|
867
867
|
{
|
|
868
868
|
"storage": "guides/budget.md",
|
|
@@ -874,7 +874,7 @@
|
|
|
874
874
|
"storage": "guides/codec.md",
|
|
875
875
|
"destination": "guides/codec.md",
|
|
876
876
|
"executable": false,
|
|
877
|
-
"digest": "
|
|
877
|
+
"digest": "8cb147a47eb934fc811e5a41e55f69f8610b42c1dadd46b2d44279ba4278ce78"
|
|
878
878
|
},
|
|
879
879
|
{
|
|
880
880
|
"storage": "guides/console.md",
|
|
@@ -952,7 +952,7 @@
|
|
|
952
952
|
"storage": "guides/mcp.md",
|
|
953
953
|
"destination": "guides/mcp.md",
|
|
954
954
|
"executable": false,
|
|
955
|
-
"digest": "
|
|
955
|
+
"digest": "e66a9a0c81f3734a56db229f111f9c4ee26bfa99fa12b3dd8a8aea04016a26ac"
|
|
956
956
|
},
|
|
957
957
|
{
|
|
958
958
|
"storage": "guides/middleware.md",
|
|
@@ -964,7 +964,7 @@
|
|
|
964
964
|
"storage": "guides/msg.md",
|
|
965
965
|
"destination": "guides/msg.md",
|
|
966
966
|
"executable": false,
|
|
967
|
-
"digest": "
|
|
967
|
+
"digest": "335777be8e8f515f521a016ed7d7b1d3e165f083b2fe22fbd12d67eb9231b3cd"
|
|
968
968
|
},
|
|
969
969
|
{
|
|
970
970
|
"storage": "guides/ndjson.md",
|
|
@@ -976,7 +976,7 @@
|
|
|
976
976
|
"storage": "guides/ollama.md",
|
|
977
977
|
"destination": "guides/ollama.md",
|
|
978
978
|
"executable": false,
|
|
979
|
-
"digest": "
|
|
979
|
+
"digest": "53134e4f0a914c7bfc7fd0490dda362dbfb3327e917b5b6c1ddc89c3911a9323"
|
|
980
980
|
},
|
|
981
981
|
{
|
|
982
982
|
"storage": "guides/pool.md",
|
|
@@ -1054,7 +1054,7 @@
|
|
|
1054
1054
|
"storage": "guides/server.md",
|
|
1055
1055
|
"destination": "guides/server.md",
|
|
1056
1056
|
"executable": false,
|
|
1057
|
-
"digest": "
|
|
1057
|
+
"digest": "25bbe9def89dcdcce6eb2b0226f4703bac7afc7706cc9074fce6816a94664f5a"
|
|
1058
1058
|
},
|
|
1059
1059
|
{
|
|
1060
1060
|
"storage": "guides/sqlite.md",
|
|
@@ -1096,7 +1096,7 @@
|
|
|
1096
1096
|
"storage": "guides/test.md",
|
|
1097
1097
|
"destination": "guides/test.md",
|
|
1098
1098
|
"executable": false,
|
|
1099
|
-
"digest": "
|
|
1099
|
+
"digest": "56d10ea64af7a6fdd756ee37c2f78cdb229a8cca58077c2f2c33f8ffc02c19b2"
|
|
1100
1100
|
},
|
|
1101
1101
|
{
|
|
1102
1102
|
"storage": "guides/timeout.md",
|
|
@@ -1114,7 +1114,7 @@
|
|
|
1114
1114
|
"storage": "guides/toolbox.md",
|
|
1115
1115
|
"destination": "guides/toolbox.md",
|
|
1116
1116
|
"executable": false,
|
|
1117
|
-
"digest": "
|
|
1117
|
+
"digest": "80f9f6c95dafddd02a2fa59856a1af70e55fa2f7f74fe857e551b4d2249e98d4"
|
|
1118
1118
|
},
|
|
1119
1119
|
{
|
|
1120
1120
|
"storage": "guides/websocket.md",
|
|
@@ -1312,13 +1312,6 @@
|
|
|
1312
1312
|
"scaffold"
|
|
1313
1313
|
]
|
|
1314
1314
|
},
|
|
1315
|
-
{
|
|
1316
|
-
"name": "Failure",
|
|
1317
|
-
"owners": [
|
|
1318
|
-
"contract",
|
|
1319
|
-
"msg"
|
|
1320
|
-
]
|
|
1321
|
-
},
|
|
1322
1315
|
{
|
|
1323
1316
|
"name": "Finding",
|
|
1324
1317
|
"owners": [
|
|
@@ -1501,13 +1494,6 @@
|
|
|
1501
1494
|
"supervisor"
|
|
1502
1495
|
]
|
|
1503
1496
|
},
|
|
1504
|
-
{
|
|
1505
|
-
"name": "Result",
|
|
1506
|
-
"owners": [
|
|
1507
|
-
"contract",
|
|
1508
|
-
"msg"
|
|
1509
|
-
]
|
|
1510
|
-
},
|
|
1511
1497
|
{
|
|
1512
1498
|
"name": "Row",
|
|
1513
1499
|
"owners": [
|
|
@@ -1593,13 +1579,6 @@
|
|
|
1593
1579
|
"server"
|
|
1594
1580
|
]
|
|
1595
1581
|
},
|
|
1596
|
-
{
|
|
1597
|
-
"name": "Success",
|
|
1598
|
-
"owners": [
|
|
1599
|
-
"contract",
|
|
1600
|
-
"msg"
|
|
1601
|
-
]
|
|
1602
|
-
},
|
|
1603
1582
|
{
|
|
1604
1583
|
"name": "Supervisor",
|
|
1605
1584
|
"owners": [
|
|
@@ -1771,7 +1750,6 @@
|
|
|
1771
1750
|
{
|
|
1772
1751
|
"name": "decodeBase64",
|
|
1773
1752
|
"owners": [
|
|
1774
|
-
"browser",
|
|
1775
1753
|
"codec",
|
|
1776
1754
|
"msg"
|
|
1777
1755
|
]
|
|
@@ -1797,13 +1775,6 @@
|
|
|
1797
1775
|
"msg"
|
|
1798
1776
|
]
|
|
1799
1777
|
},
|
|
1800
|
-
{
|
|
1801
|
-
"name": "encodeBase64",
|
|
1802
|
-
"owners": [
|
|
1803
|
-
"browser",
|
|
1804
|
-
"codec"
|
|
1805
|
-
]
|
|
1806
|
-
},
|
|
1807
1778
|
{
|
|
1808
1779
|
"name": "encodeUTF8",
|
|
1809
1780
|
"owners": [
|
|
@@ -1974,13 +1945,6 @@
|
|
|
1974
1945
|
"supervisor"
|
|
1975
1946
|
]
|
|
1976
1947
|
},
|
|
1977
|
-
{
|
|
1978
|
-
"name": "isRecord",
|
|
1979
|
-
"owners": [
|
|
1980
|
-
"contract",
|
|
1981
|
-
"msg"
|
|
1982
|
-
]
|
|
1983
|
-
},
|
|
1984
1948
|
{
|
|
1985
1949
|
"name": "isStage",
|
|
1986
1950
|
"owners": [
|
|
@@ -2144,5 +2108,5 @@
|
|
|
2144
2108
|
]
|
|
2145
2109
|
}
|
|
2146
2110
|
],
|
|
2147
|
-
"digest": "
|
|
2111
|
+
"digest": "fe0bc8e58df9b675840871884af8db3b3390a38024e12fe2ef342f160a62931c"
|
|
2148
2112
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/src/core/index.cjs
CHANGED
|
@@ -4,7 +4,7 @@ let _orkestrel_template = require("@orkestrel/template");
|
|
|
4
4
|
let _orkestrel_emitter = require("@orkestrel/emitter");
|
|
5
5
|
var package_default = {
|
|
6
6
|
name: "@orkestrel/scaffold",
|
|
7
|
-
version: "0.0.
|
|
7
|
+
version: "0.0.96",
|
|
8
8
|
description: "Scaffold workspaces with commands: new, audit, repair, catalog, and overwrite.",
|
|
9
9
|
keywords: [
|
|
10
10
|
"audit",
|
|
@@ -95,27 +95,27 @@ var package_default = {
|
|
|
95
95
|
"prepublishOnly": "npm run format:check && npm run lint:check && npm run check && npm run build && npm test && npm run test:templates && npm run test:distribution -- --mode release"
|
|
96
96
|
},
|
|
97
97
|
dependencies: {
|
|
98
|
-
"@orkestrel/console": "^0.0.
|
|
98
|
+
"@orkestrel/console": "^0.0.16",
|
|
99
99
|
"@orkestrel/contract": "^0.0.19",
|
|
100
|
-
"@orkestrel/emitter": "^0.0.
|
|
100
|
+
"@orkestrel/emitter": "^0.0.12",
|
|
101
101
|
"@orkestrel/markdown": "^0.0.17",
|
|
102
|
-
"@orkestrel/process": "^0.0.
|
|
103
|
-
"@orkestrel/template": "^0.0.
|
|
102
|
+
"@orkestrel/process": "^0.0.15",
|
|
103
|
+
"@orkestrel/template": "^0.0.10"
|
|
104
104
|
},
|
|
105
105
|
devDependencies: {
|
|
106
106
|
"@microsoft/api-extractor": "^7.59.4",
|
|
107
|
-
"@orkestrel/browser": "^0.0.
|
|
107
|
+
"@orkestrel/browser": "^0.0.27",
|
|
108
108
|
"@orkestrel/guide": "^0.0.24",
|
|
109
109
|
"@orkestrel/html": "^0.0.12",
|
|
110
|
-
"@orkestrel/probe": "^0.0.
|
|
111
|
-
"@orkestrel/test": "^0.0.
|
|
110
|
+
"@orkestrel/probe": "^0.0.22",
|
|
111
|
+
"@orkestrel/test": "^0.0.25",
|
|
112
112
|
"@types/node": "^26.6.4",
|
|
113
113
|
"@vitest/browser-playwright": "^4.1.11",
|
|
114
114
|
"oxfmt": "^0.72.0",
|
|
115
115
|
"oxlint": "^1.87.0",
|
|
116
116
|
"playwright": "^1.63.0",
|
|
117
117
|
"typescript": "^6.0.3",
|
|
118
|
-
"vite": "^8.3.
|
|
118
|
+
"vite": "^8.3.3",
|
|
119
119
|
"vitest": "^4.1.11"
|
|
120
120
|
},
|
|
121
121
|
engines: { "node": ">=22.18.0" }
|