@orkestrel/tool 0.0.1 → 0.0.2
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/src/core/index.cjs +407 -2
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +270 -3
- package/dist/src/core/index.d.ts +270 -3
- package/dist/src/core/index.js +396 -3
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/constants.d.ts +12 -0
- package/dist/src/server/factories.d.ts +44 -0
- package/dist/src/server/index.cjs +202 -0
- package/dist/src/server/index.cjs.map +1 -0
- package/dist/src/server/index.d.cts +3 -0
- package/dist/src/server/index.d.ts +3 -0
- package/dist/src/server/index.js +199 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/types.d.ts +60 -0
- package/package.json +28 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/core/constants.ts","../../../src/core/errors.ts","../../../src/core/shapers.ts","../../../src/core/helpers.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { WorkflowDefinition } from '@orkestrel/workflow'\nimport type { WorkflowSteps, WorkspaceOperation } from './types.js'\n\n// Tool-package constants — UPPER_SNAKE, `Object.freeze`d, every member exported (AGENTS §5).\n// The workflow tool's name/description/examples/depth-bound and the workspace tool's\n// name/description are OWNED here now — ported byte-faithfully from `@orkestrel/workflow` /\n// `@orkestrel/agent` ahead of the upstream cleanup that drops the authoring surface from those\n// packages (this package becomes the defining home). Only the net-new agent tool's constants\n// were already net-new to this package.\n\n/**\n * The name {@link import('./factories.js').createAgentTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n */\nexport const AGENT_TOOL_NAME = 'agent'\n\n/**\n * The maximum nesting depth a delegation chain (agent tool → sub-agent → agent tool → …) may\n * reach — the bound {@link import('./factories.js').createAgentTool}'s depth/cycle guard\n * enforces.\n *\n * @remarks\n * Deliberately a SEPARATE constant from {@link MAX_WORKFLOW_DEPTH} (rather than the two guards\n * sharing one reference): the two guards bound DIFFERENT chains (workflow nesting vs. agent\n * delegation) that happen to share a value today, and keeping this bound decoupled means a\n * future change to one never silently shifts the other. Same numeric value by convention, not\n * by shared reference.\n */\nexport const AGENT_TOOL_DEPTH = 8\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createAgentTool} advertises — a short guide\n * that teaches a model how to delegate a task to a sub-agent.\n *\n * @remarks\n * Mirrors {@link WORKFLOW_TOOL_DESCRIPTION} / `WORKSPACE_TOOL_DESCRIPTION`'s teaching style: names\n * the required `task` field, and documents the optional per-call `provider` / `tools` /\n * `system` overrides.\n */\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createAgentTool}\n * advertises in place of {@link AGENT_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const AGENT_TOOL_SUMMARY =\n\t\"Delegate a task to a sub-agent and return its result; each call runs one sub-agent turn to completion. Call describe('agent') for the optional provider/tools/system overrides.\"\n\nexport const AGENT_TOOL_DESCRIPTION = [\n\t'Delegate a task to a sub-agent and return its result. Every call runs ONE sub-agent turn to completion.',\n\t'',\n\t'Required:',\n\t' task - the instructions the sub-agent should carry out.',\n\t'Optional overrides (default to the values this tool was configured with):',\n\t' provider - the registry key of the model/provider the sub-agent runs against.',\n\t' tools - registry keys of the tools loaded into the sub-agent (replaces the default list, not merged).',\n\t\" system - a system prompt seeding the sub-agent's context (replaces the default).\",\n\t'Example:',\n\tJSON.stringify({\n\t\ttask: 'Summarize the attached notes in three bullet points.',\n\t}),\n].join('\\n')\n\n/**\n * The maximum nesting depth a workflow → agent → workflow chain may reach — the bound\n * {@link import('./factories.js').createAgentFunction} and\n * {@link import('./factories.js').createWorkflowTool}'s depth/cycle guards enforce.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`, whose engine no longer uses it — only the\n * tool-authoring guards this package now owns consume it). The limit lives in ONE place: an\n * agent-function-wrapped agent running at this depth can no longer author + run a NESTED\n * workflow through its bound workflow tool (that would be depth `MAX_WORKFLOW_DEPTH + 1`), so\n * the over-deep invocation is REJECTED (a typed `DEPTH` `WorkflowError` throw, `@orkestrel/workflow`).\n */\nexport const MAX_WORKFLOW_DEPTH = 8\n\n/**\n * The name {@link import('./factories.js').createWorkflowTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under, and the name\n * {@link import('./factories.js').createAgentFunction} binds the depth/cycle-aware workflow tool\n * under onto a wrapped agent's `context.tools`.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). The propagation seam's well-known key: when\n * `createAgentFunction`'s `runner` option is supplied, it adds a `createWorkflowTool`-built tool\n * under this name to the agent's `context.tools`, so it can author + run a NESTED workflow\n * (bounded by {@link MAX_WORKFLOW_DEPTH}).\n */\nexport const WORKFLOW_TOOL_NAME = 'workflow'\n\n/**\n * A complete FLAT authoring example — the PRIMARY way a small model authors a workflow through\n * {@link import('./factories.js').createWorkflowTool}: `{ name, steps: [{ name }] }`.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Each step becomes a one-task phase, in\n * order; a step's `name` is a REGISTERED behavior name (not a label) — the registry key its\n * task's `run` resolves against. The tool expands this\n * ({@link import('./helpers.js').expandSteps}) into a valid `WorkflowDefinition`\n * (`@orkestrel/workflow`). It is embedded VERBATIM in {@link WORKFLOW_TOOL_DESCRIPTION}.\n */\nexport const WORKFLOW_TOOL_FLAT_EXAMPLE: WorkflowSteps = Object.freeze({\n\tname: 'release',\n\tsteps: Object.freeze([Object.freeze({ name: 'compile' }), Object.freeze({ name: 'publish' })]),\n})\n\n/**\n * A minimal NESTED authoring example — the ADVANCED escape-hatch form a model may use instead of\n * the flat shape: a full `WorkflowDefinition` (`@orkestrel/workflow`).\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). The full four-level form, documented in\n * {@link WORKFLOW_TOOL_DESCRIPTION} as the advanced alternative. It is embedded VERBATIM.\n */\nexport const WORKFLOW_TOOL_NESTED_EXAMPLE: WorkflowDefinition = Object.freeze({\n\tid: 'release',\n\tname: 'Release',\n\tphases: Object.freeze([\n\t\tObject.freeze({\n\t\t\tid: 'build',\n\t\t\tname: 'Build',\n\t\t\ttasks: Object.freeze([\n\t\t\t\tObject.freeze({\n\t\t\t\t\tid: 'compile',\n\t\t\t\t\tname: 'Compile',\n\t\t\t\t\trun: 'compile',\n\t\t\t\t}),\n\t\t\t]),\n\t\t}),\n\t]),\n})\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createWorkflowTool} advertises — a multi-line\n * guide that teaches a small model how to author a complete workflow tree.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Presents the SIMPLE flat shape\n * (`{ name, steps: [{ name }] }`) as the PRIMARY way with one complete worked example\n * ({@link WORKFLOW_TOOL_FLAT_EXAMPLE}), names that a step's `name` is a REGISTERED name (not a\n * human label), and documents the full nested `WorkflowDefinition` as the ADVANCED form with a\n * minimal example ({@link WORKFLOW_TOOL_NESTED_EXAMPLE}). The `parameters` the tool advertises\n * are the FLAT shape's schema; the nested form is the documented escape-hatch (the tool accepts\n * both).\n */\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createWorkflowTool}\n * advertises in place of {@link WORKFLOW_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const WORKFLOW_TOOL_SUMMARY =\n\t\"Author and run a multi-phase workflow in one call — phases run in sequence, tasks within a phase run concurrently. Call describe('workflow') for the full authoring schema and examples.\"\n\nexport const WORKFLOW_TOOL_DESCRIPTION = [\n\t'Author and run a workflow (phases run sequentially, the tasks within a phase run concurrently) in one call.',\n\t'',\n\t'SIMPLEST way — a flat list of steps. Each step runs one registered behavior; steps run one after another:',\n\t' { \"name\": \"<workflow name>\", \"steps\": [ { \"name\": \"<registered name>\" }, ... ] }',\n\t'- a step\\'s \"name\" is a REGISTERED behavior name (a registry key), NOT a human label.',\n\t'- the top-level \"name\" (the workflow name) is optional. Ids are filled in for you.',\n\t'Example:',\n\tJSON.stringify(WORKFLOW_TOOL_FLAT_EXAMPLE),\n\t'',\n\t'ADVANCED — the full nested form, for multi-task phases or explicit ids. A workflow has phases; a phase has tasks; a task has a \"run\" (a registered behavior name):',\n\tJSON.stringify(WORKFLOW_TOOL_NESTED_EXAMPLE),\n\t'In the nested form you may omit any \"id\"/\"name\" and they are filled in positionally; a provided one is kept.',\n].join('\\n')\n\n/**\n * The name {@link import('./factories.js').createWorkspaceTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/agent`).\n */\nexport const WORKSPACE_TOOL_NAME = 'workspace'\n\n/**\n * A valid `WorkspaceOperation` (`@orkestrel/agent`) object — the canonical example embedded\n * VERBATIM in {@link WORKSPACE_TOOL_DESCRIPTION}.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/agent`). A `'write'` op (the most common authoring\n * action): create or overwrite `notes.txt` with `hello`. Frozen so it cannot be mutated in\n * place.\n */\nexport const WORKSPACE_TOOL_EXAMPLE: WorkspaceOperation = Object.freeze({\n\toperation: 'write',\n\tpath: 'notes.txt',\n\tcontent: 'hello',\n})\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createWorkspaceTool} advertises — a multi-line\n * guide that teaches a small model how to drive a workspace through the single\n * `operation`-keyed tool.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/agent`). Mirrors {@link WORKFLOW_TOOL_DESCRIPTION}'s\n * teaching style: names the `operation` discriminant field, enumerates all 13 operations with\n * their FLAT fields, gives a worked example for the common ones, and embeds\n * {@link WORKSPACE_TOOL_EXAMPLE} verbatim.\n */\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createWorkspaceTool}\n * advertises in place of {@link WORKSPACE_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const WORKSPACE_TOOL_SUMMARY =\n\t\"Read and edit files in a workspace — one operation per call (read, write, list, search, replace, splice, move, remove, plus workspace switching), chosen by the 'operation' field. Call describe('workspace') for the full operation list and fields.\"\n\nexport const WORKSPACE_TOOL_DESCRIPTION = [\n\t'Read and edit files in a workspace. Every call is ONE operation, chosen by the \"operation\" field.',\n\t'All file operations act on the ACTIVE workspace; use \"workspaces\" then \"switch\" to move between workspaces.',\n\t'',\n\t'Operations (each takes the fields listed):',\n\t'- read { \"operation\": \"read\", \"path\": \"<file>\" } — return the file\\'s text.',\n\t'- list { \"operation\": \"list\" } — list every file in the active workspace (path, state, size, lines, kind).',\n\t'- has { \"operation\": \"has\", \"path\": \"<file>\" } — whether the file exists.',\n\t'- search { \"operation\": \"search\", \"query\": \"<text>\", \"regex\"?: bool, \"exact\"?: bool, \"limit\"?: int } — find lines matching the query across all files.',\n\t'- replace { \"operation\": \"replace\", \"query\": \"<text>\", \"replacement\": \"<text>\", \"regex\"?: bool, \"exact\"?: bool, \"limit\"?: int } — replace matches across all files.',\n\t'- write { \"operation\": \"write\", \"path\": \"<file>\", \"content\": \"<text>\" } — create or overwrite the whole file.',\n\t'- splice { \"operation\": \"splice\", \"path\": \"<file>\", \"content\": \"<text>\", \"fromLine\": int, \"fromColumn\": int, \"toLine\": int, \"toColumn\": int } — replace a 1-based range (from inclusive, to exclusive) with content.',\n\t'- prepend { \"operation\": \"prepend\", \"path\": \"<file>\", \"content\": \"<text>\" } — add content to the start of the file.',\n\t'- append { \"operation\": \"append\", \"path\": \"<file>\", \"content\": \"<text>\" } — add content to the end of the file.',\n\t'- move { \"operation\": \"move\", \"from\": \"<file>\", \"to\": \"<file>\" } — rename / move a file.',\n\t'- remove { \"operation\": \"remove\", \"path\": \"<file>\" } — delete a file.',\n\t'- workspaces { \"operation\": \"workspaces\" } — list the workspaces you can switch between (each id, file count, active).',\n\t'- switch { \"operation\": \"switch\", \"id\": \"<id>\" } — make the workspace with that id active (ids come from \"workspaces\").',\n\t'',\n\t'Notes: lines and columns are 1-based (column 1 is the first character). \"regex\" defaults to false (a literal substring), \"exact\" defaults to true (case-sensitive). \"search\"/\"replace\"/\"splice\" act only on text files. Editing with no active workspace auto-creates one.',\n\t'',\n\t'Example — write a file:',\n\tJSON.stringify(WORKSPACE_TOOL_EXAMPLE),\n].join('\\n')\n\n/**\n * The name {@link import('./factories.js').createDescribeTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n *\n * @remarks\n * Net-new: pairs with the other three tools' lean {@link AGENT_TOOL_SUMMARY} /\n * {@link WORKFLOW_TOOL_SUMMARY} / {@link WORKSPACE_TOOL_SUMMARY} — a model that reads only the\n * advertised summary can call `describe` with that tool's registered name to get its full\n * teaching description back.\n */\nexport const DESCRIBE_TOOL_NAME = 'describe'\n\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createDescribeTool}\n * advertises — this tool needs no teaching of its own, so its summary and description are both\n * short.\n */\nexport const DESCRIBE_TOOL_SUMMARY = 'Return the full description of a named registered tool.'\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createDescribeTool} advertises.\n *\n * @remarks\n * Deliberately short — unlike the workflow / workspace / agent tools, this one has no authoring\n * schema or multi-step protocol to teach.\n */\nexport const DESCRIBE_TOOL_DESCRIPTION =\n\t'Return the full description of a registered tool by its name. Required: name - the registered tool name (see another tool listing for available names).'\n","import type { AgentToolErrorCode } from './types.js'\n\n// Tool-package errors — one error class per domain this package mints its own error for.\n// `@orkestrel/workflow`'s `WorkflowError` and `@orkestrel/agent`'s `WorkspaceError` already\n// cover the workflow tool + workspace tool's failure paths (imported and thrown as-is, never\n// duplicated here per §6). `createAgentTool` / `createDescribeTool` are net-new and none of\n// `@orkestrel/agent`'s error classes fit a pre-run validation / guard failure (`AgentJobError`\n// REQUIRES a settled partial `AgentResult` it cannot construct before a run starts;\n// `ConversationError` / `ProviderAbortError` / `WorkspaceError` are each scoped to an unrelated\n// domain) — so this package mints ONE typed error, `AgentToolError`, mirroring `WorkflowError`'s\n// exact shape (`code` + optional `context`) for the same reason: a thrown, machine-readable,\n// code-bearing error the tool-handler contract (AGENTS §14) requires, never a `{ error }`\n// return. `AgentToolError` is this package's general TOOL-CALL error — not scoped to agent\n// delegation alone — so `createDescribeTool` (a malformed call / an unknown tool name) reuses it\n// rather than minting a second class for the same `TOOL` misuse semantics.\n\n/**\n * Thrown by {@link import('./factories.js').createAgentTool}'s and\n * {@link import('./factories.js').createDescribeTool}'s handlers on every failure path — a\n * malformed / unresolvable call or an unknown tool name (`TOOL`), or a delegation that would\n * exceed the configured depth bound or re-enter an ancestor (`DEPTH`).\n *\n * @remarks\n * Carries a machine-readable `code` (see {@link import('./types.js').AgentToolErrorCode}) and\n * an optional `context` bag for structured diagnostics. The `ToolManagerInterface`\n * (`@orkestrel/agent`) isolates every throw into the canonical tool result's top-level `error`\n * (AGENTS §14) — nothing escapes the run.\n *\n * @example\n * ```ts\n * import { AgentToolError, isAgentToolError } from '@src/core'\n *\n * try {\n * \tthrow new AgentToolError('TOOL', 'task is required')\n * } catch (error) {\n * \tif (isAgentToolError(error)) console.log(error.code) // 'TOOL'\n * }\n * ```\n */\nexport class AgentToolError extends Error {\n\treadonly code: AgentToolErrorCode\n\treadonly context?: Readonly<Record<string, unknown>>\n\n\tconstructor(\n\t\tcode: AgentToolErrorCode,\n\t\tmessage: string,\n\t\tcontext?: Readonly<Record<string, unknown>>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'AgentToolError'\n\t\tthis.code = code\n\t\tthis.context = context\n\t}\n}\n\n/**\n * Type guard narrowing an unknown caught value to an {@link AgentToolError}.\n *\n * @param value - The value to test (typically a `catch` binding)\n * @returns `true` when `value` is an {@link AgentToolError}\n *\n * @example\n * ```ts\n * import { isAgentToolError } from '@src/core'\n *\n * try {\n * \t// ...\n * } catch (error) {\n * \tif (isAgentToolError(error)) console.log(error.code)\n * }\n * ```\n */\nexport function isAgentToolError(value: unknown): value is AgentToolError {\n\treturn value instanceof AgentToolError\n}\n","import {\n\tarrayShape,\n\tbooleanShape,\n\tintegerShape,\n\tliteralShape,\n\tobjectShape,\n\toptionalShape,\n\tstringShape,\n\tunionShape,\n} from '@orkestrel/contract'\n\n// Tool-package shapes — the shape VALUE each `create*Tool` factory (factories.ts) compiles into\n// the lockstep guard + parser + JSON Schema outputs (AGENTS §14). `agentToolShape` MUST agree\n// with the hand-written `AgentToolArguments` (types.ts), which is the source of truth.\n// `workflowStepsShape` / `workflowDraftShape` / `workspaceToolShape` are OWNED here now — ported\n// byte-faithfully from `@orkestrel/workflow` / `@orkestrel/agent` ahead of the upstream cleanup\n// that drops the authoring surface from those packages (this package becomes the defining home).\n\n/**\n * The shape of {@link import('./types.js').AgentToolArguments} —\n * {@link import('./factories.js').createAgentTool}'s advertised `parameters`.\n *\n * @remarks\n * `task` is the only required field (a non-empty string); `provider` / `tools` / `system`\n * are per-call overrides of the tool's own configured defaults.\n */\nexport const agentToolShape = objectShape({\n\ttask: stringShape({\n\t\tmin: 1,\n\t\tdescription: 'The instructions the sub-agent should carry out.',\n\t}),\n\tprovider: optionalShape(\n\t\tstringShape({\n\t\t\tmin: 1,\n\t\t\tdescription:\n\t\t\t\t'Registry key of the provider to run the sub-agent against (overrides the default).',\n\t\t}),\n\t),\n\ttools: optionalShape(\n\t\tarrayShape(stringShape({ min: 1 }), {\n\t\t\tdescription:\n\t\t\t\t'Registry keys of the tools loaded into the sub-agent (replaces the default list).',\n\t\t}),\n\t),\n\tsystem: optionalShape(\n\t\tstringShape({\n\t\t\tdescription: \"A system prompt seeding the sub-agent's context (overrides the default).\",\n\t\t}),\n\t),\n})\n\n/**\n * The shape of {@link import('./types.js').DescribeToolArguments} —\n * {@link import('./factories.js').createDescribeTool}'s advertised `parameters`.\n *\n * @remarks\n * `name` is the only field (a non-empty string) — the registered tool name to look up.\n */\nexport const describeToolShape = objectShape({\n\tname: stringShape({\n\t\tmin: 1,\n\t\tdescription: 'The registered name of the tool whose full description to return.',\n\t}),\n})\n\n// === Workflow draft / flat-steps shapes (OWNED here now, ported from `@orkestrel/workflow`)\n\n/**\n * The shape of a {@link import('./types.js').TaskDraft} — identical to a strict task shape\n * EXCEPT `id` and `name` are OPTIONAL.\n */\nexport const taskDraftShape = objectShape({\n\tid: optionalShape(stringShape({ min: 1, description: 'Task id; auto-filled when omitted.' })),\n\tname: optionalShape(\n\t\tstringShape({ min: 1, description: 'Task name; defaults to the id when omitted.' }),\n\t),\n\tdescription: optionalShape(stringShape({ description: 'Optional task description.' })),\n\trun: optionalShape(\n\t\tstringShape({\n\t\t\tmin: 1,\n\t\t\tdescription:\n\t\t\t\t'The registered behavior name to invoke (a registry key, not a label); omitted has no handler.',\n\t\t}),\n\t),\n\tretries: optionalShape(\n\t\tintegerShape({\n\t\t\tmin: 0,\n\t\t\tdescription:\n\t\t\t\t'Extra attempts after the first on failure; overrides the phase default. Omitted means none.',\n\t\t}),\n\t),\n\ttimeout: optionalShape(\n\t\tintegerShape({\n\t\t\tmin: 0,\n\t\t\tdescription:\n\t\t\t\t'Per-attempt deadline in milliseconds; overrides the phase default. Omitted means no deadline.',\n\t\t}),\n\t),\n})\n\n/**\n * The shape of a PHASE in a draft workflow — identical to a strict phase shape EXCEPT `id` and\n * `name` are OPTIONAL, and its tasks are {@link taskDraftShape}s.\n */\nexport const phaseDraftShape = objectShape({\n\tid: optionalShape(stringShape({ min: 1, description: 'Phase id; auto-filled when omitted.' })),\n\tname: optionalShape(\n\t\tstringShape({ min: 1, description: 'Phase name; defaults to the id when omitted.' }),\n\t),\n\tdescription: optionalShape(stringShape({ description: 'Optional phase description.' })),\n\ttasks: arrayShape(taskDraftShape, { description: 'The phase tasks; they run CONCURRENTLY.' }),\n\tconcurrency: optionalShape(\n\t\tintegerShape({\n\t\t\tmin: 1,\n\t\t\tdescription: 'Max tasks in flight at once (a resource throttle); omitted means unbounded.',\n\t\t}),\n\t),\n\tbail: optionalShape(\n\t\tliteralShape([true, false], {\n\t\t\tdescription: 'Per-phase failure-policy override; omitted inherits the workflow bail.',\n\t\t}),\n\t),\n})\n\n/**\n * The shape of a DRAFT workflow — identical to a strict workflow shape EXCEPT `id` and `name`\n * are OPTIONAL at all three levels (workflow / phase / task), so a small model can omit the six\n * identity strings and let the tool synthesize them positionally.\n *\n * @remarks\n * The lenient counterpart {@link import('./factories.js').createWorkflowDraftContract} compiles.\n * `run` stays required on the strict form; a provided `id` / `name` still has `minLength: 1` (so\n * an explicitly-empty `id: ''` is REJECTED, not auto-filled). After\n * {@link import('./helpers.js').completeDraft} fills the missing ids/names, the result is\n * validated against the STRICT `createWorkflowContract` (`@orkestrel/workflow`) gate before\n * running.\n */\nexport const workflowDraftShape = objectShape({\n\tid: optionalShape(stringShape({ min: 1, description: 'Workflow id; auto-filled when omitted.' })),\n\tname: optionalShape(\n\t\tstringShape({ min: 1, description: 'Workflow name; defaults to the id when omitted.' }),\n\t),\n\tdescription: optionalShape(stringShape({ description: 'Optional workflow description.' })),\n\tphases: arrayShape(phaseDraftShape, {\n\t\tdescription: 'The workflow phases; they run SEQUENTIALLY, in order.',\n\t}),\n\tbail: optionalShape(\n\t\tliteralShape([true, false], {\n\t\t\tdescription:\n\t\t\t\t'Failure policy: false (default) continues gracefully, true halts on the first failure.',\n\t\t}),\n\t),\n})\n\n/**\n * The shape of ONE flat step — `{ name }` — the building block of {@link workflowStepsShape}.\n *\n * @remarks\n * `name` is the REGISTERED behavior name the step runs (it becomes the task's `run`). The tool\n * expands each step into a one-task phase, in order ({@link import('./helpers.js').expandSteps}).\n */\nexport const stepShape = objectShape({\n\tname: stringShape({\n\t\tmin: 1,\n\t\tdescription: 'The registered behavior name this step runs (becomes the task run).',\n\t}),\n})\n\n/**\n * The FLAT authoring shape {@link import('./factories.js').createWorkflowTool} advertises as its\n * `parameters` — the simplest surface a small model can fill: `{ name?, steps: [{ name }] }`.\n *\n * @remarks\n * A deliberately-reduced surface: a flat ordered list of steps, each a `{ name }`. The tool\n * EXPANDS it ({@link import('./helpers.js').expandSteps}) into a full\n * {@link import('./types.js').WorkflowDefinition} — one one-task phase per step, in order —\n * then validates against the STRICT `createWorkflowContract` (`@orkestrel/workflow`) gate. The\n * full nested form is STILL accepted by the tool (it branches on the args' shape) and is\n * documented as the advanced escape-hatch in the tool's description — but THIS is what\n * `parameters` advertises.\n */\nexport const workflowStepsShape = objectShape({\n\tname: optionalShape(stringShape({ min: 1, description: 'Optional workflow name.' })),\n\tsteps: arrayShape(stepShape, {\n\t\tdescription: 'The ordered steps to run, one after another (each becomes a one-task phase).',\n\t}),\n})\n\n// === Workspace operation shape (OWNED here now, ported from `@orkestrel/agent`)\n\n/**\n * The shape of a {@link import('./types.js').WorkspaceOperation} — a descriptive tagged union\n * over the 13 workspace edit / read / navigation operations, discriminated by the `operation`\n * literal (never a bare `kind`; AGENTS §4.4). Each variant leads with its `operation`\n * discriminant then its FLAT fields, every field via `stringShape` / `optionalShape` /\n * `integerShape({ min: 1 })` / `booleanShape`, each carrying a strong field-level `description`.\n *\n * @remarks\n * The union compiles to an `anyOf` JSON Schema + a `unionOf` guard + a first-match parser\n * automatically ({@link import('./factories.js').createWorkspaceTool} types the result to the\n * hand-written {@link import('./types.js').WorkspaceOperation}). `limit` and the four `'splice'`\n * caret components are POSITIVE integers (`integerShape({ min: 1 })`); `regex` / `exact` are\n * `optionalShape(booleanShape(...))`. The two REGISTRY arms — `workspaces` (list the workspaces\n * the model can move between) and `switch` (re-point the active one by `id`) — let a model\n * DISCOVER then CHOOSE which workspace the edit / read arms target.\n */\nexport const workspaceToolShape = unionShape(\n\tobjectShape({\n\t\toperation: literalShape(['read'], { description: \"Read a whole text file's text by path.\" }),\n\t\tpath: stringShape({ description: 'The path of the file to read.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['list'], { description: 'List every file in the workspace.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['has'], { description: 'Check whether a file exists at the path.' }),\n\t\tpath: stringShape({ description: 'The path to check for.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['search'], {\n\t\t\tdescription: 'Search every text file for a query, returning each hit.',\n\t\t}),\n\t\tquery: stringShape({ description: 'The text (or regular-expression source) to search for.' }),\n\t\tregex: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription:\n\t\t\t\t\t'Treat the query as a regular expression. Defaults to false (a literal substring).',\n\t\t\t}),\n\t\t),\n\t\texact: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription: 'Match case-sensitively. Defaults to true (set false for case-insensitive).',\n\t\t\t}),\n\t\t),\n\t\tlimit: optionalShape(\n\t\t\tintegerShape({\n\t\t\t\tmin: 1,\n\t\t\t\tdescription: 'Stop after this many matches across all files. Omitted means unlimited.',\n\t\t\t}),\n\t\t),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['replace'], {\n\t\t\tdescription: 'Replace a query with a replacement across every text file.',\n\t\t}),\n\t\tquery: stringShape({ description: 'The text (or regular-expression source) to replace.' }),\n\t\treplacement: stringShape({ description: 'The text to substitute for each match.' }),\n\t\tregex: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription:\n\t\t\t\t\t'Treat the query as a regular expression. Defaults to false (a literal substring).',\n\t\t\t}),\n\t\t),\n\t\texact: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription: 'Match case-sensitively. Defaults to true (set false for case-insensitive).',\n\t\t\t}),\n\t\t),\n\t\tlimit: optionalShape(\n\t\t\tintegerShape({\n\t\t\t\tmin: 1,\n\t\t\t\tdescription: 'Stop after this many replacements across all files. Omitted means unlimited.',\n\t\t\t}),\n\t\t),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['write'], {\n\t\t\tdescription: 'Create or overwrite a whole file with content.',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the file to write.' }),\n\t\tcontent: stringShape({ description: 'The full new contents of the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['splice'], {\n\t\t\tdescription:\n\t\t\t\t'Replace a 1-based range of an existing text file (from inclusive, to exclusive) with content.',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the text file to edit.' }),\n\t\tcontent: stringShape({ description: 'The text to splice in place of the range.' }),\n\t\tfromLine: integerShape({\n\t\t\tmin: 1,\n\t\t\tdescription: 'The 1-based start line of the range (inclusive).',\n\t\t}),\n\t\tfromColumn: integerShape({\n\t\t\tmin: 1,\n\t\t\tdescription:\n\t\t\t\t'The 1-based start column of the range (inclusive; column 1 is the first character).',\n\t\t}),\n\t\ttoLine: integerShape({ min: 1, description: 'The 1-based end line of the range (exclusive).' }),\n\t\ttoColumn: integerShape({\n\t\t\tmin: 1,\n\t\t\tdescription: 'The 1-based end column of the range (exclusive).',\n\t\t}),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['prepend'], {\n\t\t\tdescription: 'Add content to the start of a file (creating it when absent).',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the file to prepend to.' }),\n\t\tcontent: stringShape({ description: 'The text to add at the start of the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['append'], {\n\t\t\tdescription: 'Add content to the end of a file (creating it when absent).',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the file to append to.' }),\n\t\tcontent: stringShape({ description: 'The text to add at the end of the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['move'], {\n\t\t\tdescription: 'Rename or move a file (overwriting an occupied target).',\n\t\t}),\n\t\tfrom: stringShape({ description: 'The current path of the file.' }),\n\t\tto: stringShape({ description: 'The new path for the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['remove'], { description: 'Delete a file from the workspace.' }),\n\t\tpath: stringShape({ description: 'The path of the file to remove.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['workspaces'], {\n\t\t\tdescription:\n\t\t\t\t'List the workspaces you can move between (each id, file count, and whether it is active), so you can pick an id to switch to.',\n\t\t}),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['switch'], {\n\t\t\tdescription:\n\t\t\t\t'Switch the active workspace to the one with this id (get ids from the \"workspaces\" operation). Edit and read operations then target it.',\n\t\t}),\n\t\tid: stringShape({\n\t\t\tdescription: 'The id of the workspace to make active (from the \"workspaces\" listing).',\n\t\t}),\n\t}),\n)\n","import type { WorkflowDefinition, WorkflowResult, WorkflowStatus } from '@orkestrel/workflow'\nimport type { PhaseDraft, TaskDraft, WorkflowDraft, WorkflowSteps } from './types.js'\n\n// Tool-package helpers — OWNED here now, ported byte-faithfully from `@orkestrel/workflow` ahead\n// of the upstream cleanup that drops the authoring surface from that package (this package\n// becomes the defining home for the workflow tool's lenient-authoring pipeline and its ancestry\n// tagging).\n\n/**\n * The ancestry identifier of a workflow in a run chain — `workflow:<id>`.\n *\n * @remarks\n * Namespacing keeps a workflow id and an {@link agentTag} agent name in ONE set without\n * collision, so re-entering a workflow OR an agent already in the chain is a single `includes`\n * check.\n *\n * @param id - The workflow definition's `id`\n * @returns The namespaced ancestry tag (`workflow:<id>`)\n */\nexport function workflowTag(id: string): string {\n\treturn `workflow:${id}`\n}\n\n/**\n * The ancestry identifier of an agent in a run chain — `agent:<name>`.\n *\n * @remarks\n * The agent counterpart of {@link workflowTag}: {@link import('./factories.js').createAgentFunction}\n * / {@link import('./factories.js').createWorkflowTool} guard against re-entering an agent or\n * workflow already in the chain (a typed `DEPTH` `WorkflowError`, `@orkestrel/workflow`). The\n * `agent:` namespace keeps it distinct from a same-string workflow id.\n *\n * @param name - The agent's identifier / registry name\n * @returns The namespaced ancestry tag (`agent:<name>`)\n */\nexport function agentTag(name: string): string {\n\treturn `agent:${name}`\n}\n\n/**\n * Build the plain success summary {@link import('./factories.js').createWorkflowTool} returns on\n * a completed run — the universal tool-handler contract (AGENTS §14): return a plain value on\n * success, appearing identically over BOTH the agent loop and MCP.\n *\n * @remarks\n * The summary is LEAN: the workflow's terminal `status` and the COUNT of settled task results —\n * enough for a caller / model to react without serializing the whole live tree. (It carries no\n * synthetic `id` / `name`: a tool handler has no call id; the `ToolManagerInterface`\n * (`@orkestrel/agent`) supplies the canonical envelope's identity.)\n *\n * @param result - The terminal `WorkflowResult` (`@orkestrel/workflow`) the run produced\n * @returns The plain success summary — `{ status, count }`\n */\nexport function workflowToolSummary(\n\tresult: WorkflowResult,\n): Readonly<{ status: WorkflowStatus; count: number }> {\n\treturn { status: result.status, count: result.results.length }\n}\n\n// === Draft completion + flat-steps expansion (the tool's LENIENT authoring surfaces)\n//\n// Pure, deterministic synthesis that turns a WIDENED authoring form into a strict\n// `WorkflowDefinition` (`@orkestrel/workflow`). They auto-fill only OMITTED identity (a provided\n// id/name is preserved verbatim; an explicitly-empty `id: ''` is rejected UPSTREAM by the draft\n// contract, never reached here), so a small model can author a complete tree without emitting\n// the six required `id`/`name` strings. The factory re-validates the result against the STRICT\n// `createWorkflowContract().is` gate before running (soundness).\n\n/**\n * Complete a {@link WorkflowDraft} into a strict {@link WorkflowDefinition} — synthesize any\n * MISSING `id` deterministically + positionally, and default any MISSING `name` to its\n * (now-resolved) `id`.\n *\n * @remarks\n * The positional id scheme is stable and human-legible: the workflow is `wf`, phase `i` is\n * `phase-<i>`, and task `j` of that phase is `<phaseId>-task-<j>` (so a provided phase id flows\n * into its tasks' synthesized ids). A PROVIDED `id` / `name` at any level is kept VERBATIM —\n * synthesis touches only the omitted ones. A missing `name` defaults to the resolved `id` (never\n * the other way round), so the result always has both. `run`, `description`, the per-phase\n * `concurrency` / `bail`, the per-task `retries` / `timeout`, and the workflow `bail` carry over\n * unchanged. The result is a complete {@link WorkflowDefinition}; the caller still validates it\n * against the STRICT contract.\n *\n * @param draft - The draft workflow (id/name optional at all three levels)\n * @returns A complete {@link WorkflowDefinition} with every id/name filled\n */\nexport function completeDraft(draft: WorkflowDraft): WorkflowDefinition {\n\tconst id = draft.id ?? 'wf'\n\treturn {\n\t\tid,\n\t\tname: draft.name ?? id,\n\t\t...(draft.description === undefined ? {} : { description: draft.description }),\n\t\tphases: draft.phases.map((phase, index) => completePhaseDraft(phase, index)),\n\t\t...(draft.bail === undefined ? {} : { bail: draft.bail }),\n\t}\n}\n\n/**\n * Complete one {@link PhaseDraft} into a strict phase definition — the per-phase step of\n * {@link completeDraft} (phase `index` → `phase-<index>` when its id is omitted).\n *\n * @param phase - The draft phase\n * @param index - The phase's positional index in the workflow\n * @returns A complete phase definition\n */\nexport function completePhaseDraft(\n\tphase: PhaseDraft,\n\tindex: number,\n): WorkflowDefinition['phases'][number] {\n\tconst id = phase.id ?? `phase-${index}`\n\treturn {\n\t\tid,\n\t\tname: phase.name ?? id,\n\t\t...(phase.description === undefined ? {} : { description: phase.description }),\n\t\ttasks: phase.tasks.map((task, taskIndex) => completeTaskDraft(task, id, taskIndex)),\n\t\t...(phase.concurrency === undefined ? {} : { concurrency: phase.concurrency }),\n\t\t...(phase.bail === undefined ? {} : { bail: phase.bail }),\n\t}\n}\n\n/**\n * Complete one {@link TaskDraft} into a strict task definition — the per-task leaf step of\n * {@link completeDraft} (task `index` of phase `<phaseId>` → `<phaseId>-task-<index>` when its id\n * is omitted).\n *\n * @param task - The draft task\n * @param phaseId - The (resolved) parent phase id, so the synthesized task id nests under it\n * @param index - The task's positional index within its phase\n * @returns A complete task definition\n */\nexport function completeTaskDraft(\n\ttask: TaskDraft,\n\tphaseId: string,\n\tindex: number,\n): WorkflowDefinition['phases'][number]['tasks'][number] {\n\tconst id = task.id ?? `${phaseId}-task-${index}`\n\treturn {\n\t\tid,\n\t\tname: task.name ?? id,\n\t\t...(task.description === undefined ? {} : { description: task.description }),\n\t\t...(task.run === undefined ? {} : { run: task.run }),\n\t\t...(task.retries === undefined ? {} : { retries: task.retries }),\n\t\t...(task.timeout === undefined ? {} : { timeout: task.timeout }),\n\t}\n}\n\n/**\n * Expand a flat {@link WorkflowSteps} blob into a strict {@link WorkflowDefinition} — each step\n * becomes a one-task phase, IN ORDER.\n *\n * @remarks\n * The expansion of the tool's ADVERTISED surface: the deliberately-reduced flat form. Each\n * {@link import('./types.js').WorkflowStep} maps to a phase holding exactly one task: the step's\n * `name` becomes the task's `run` (the behavior-registry key). Ids/names are auto-filled\n * positionally — it builds an ids-omitted {@link WorkflowDraft} and delegates to\n * {@link completeDraft}, so the two lenient surfaces share ONE synthesis path (step `i` → phase\n * `phase-<i>`, its task `phase-<i>-task-0`). The optional `name` becomes the workflow's `name`.\n * The result is a complete definition the caller validates against the STRICT contract before\n * running.\n *\n * @param flat - The flat steps blob (`{ name?, steps: [{ name }] }`)\n * @returns A complete {@link WorkflowDefinition} (one one-task phase per step)\n */\nexport function expandSteps(flat: WorkflowSteps): WorkflowDefinition {\n\treturn completeDraft({\n\t\t...(flat.name === undefined ? {} : { name: flat.name }),\n\t\tphases: flat.steps.map((step) => ({\n\t\t\ttasks: [{ run: step.name }],\n\t\t})),\n\t})\n}\n","import type { ContractInterface } from '@orkestrel/contract'\nimport type {\n\tAgentInterface,\n\tAgentRegistryInterface,\n\tToolInterface,\n\tToolManagerInterface,\n\tWorkspaceManagerInterface,\n} from '@orkestrel/agent'\nimport type {\n\tWorkflowDefinition,\n\tWorkflowFunction,\n\tWorkflowRunnerInterface,\n} from '@orkestrel/workflow'\nimport type {\n\tAgentFunctionOptions,\n\tAgentToolOptions,\n\tWorkflowDraft,\n\tWorkflowSteps,\n\tWorkflowToolOptions,\n\tWorkspaceOperation,\n\tWorkspaceToolOptions,\n} from './types.js'\nimport {\n\tcreateTool,\n\tcreateWorkspaceManager,\n\tisText,\n\trangeOf,\n\tWorkspaceError,\n} from '@orkestrel/agent'\nimport { createContract, schemaToParameters } from '@orkestrel/contract'\nimport { createWorkflowContract, WorkflowError } from '@orkestrel/workflow'\nimport {\n\tAGENT_TOOL_DEPTH,\n\tAGENT_TOOL_DESCRIPTION,\n\tAGENT_TOOL_NAME,\n\tAGENT_TOOL_SUMMARY,\n\tDESCRIBE_TOOL_DESCRIPTION,\n\tDESCRIBE_TOOL_NAME,\n\tDESCRIBE_TOOL_SUMMARY,\n\tMAX_WORKFLOW_DEPTH,\n\tWORKFLOW_TOOL_DESCRIPTION,\n\tWORKFLOW_TOOL_NAME,\n\tWORKFLOW_TOOL_SUMMARY,\n\tWORKSPACE_TOOL_DESCRIPTION,\n\tWORKSPACE_TOOL_NAME,\n\tWORKSPACE_TOOL_SUMMARY,\n} from './constants.js'\nimport { AgentToolError } from './errors.js'\nimport {\n\tagentTag,\n\tcompleteDraft,\n\texpandSteps,\n\tworkflowTag,\n\tworkflowToolSummary,\n} from './helpers.js'\nimport {\n\tagentToolShape,\n\tdescribeToolShape,\n\tworkflowDraftShape,\n\tworkflowStepsShape,\n\tworkspaceToolShape,\n} from './shapers.js'\n\n// This package's tool factories. `createWorkflowTool` / `createWorkspaceTool` OWN their full\n// handler logic now (ported byte-faithfully from `@orkestrel/workflow` / `@orkestrel/agent` ahead\n// of the upstream cleanup that drops the authoring surface from those packages) and additionally\n// layer a pluggable store slot on top; `createAgentTool` is net-new: sub-agent delegation over an\n// `AgentRegistryInterface`.\n\n/**\n * Wrap a registered tool as a {@link WorkflowFunction} (`@orkestrel/workflow`) — the OPT-IN\n * adapter that lets a `function`-form task run a `@orkestrel/agent` tool BY NAME.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Composes into a caller's\n * `WorkflowOptions.functions` registry like any other behavior\n * (`{ publish: createToolFunction(tools, 'publish') }`); the pure workflow runner has no\n * knowledge of tools itself. The returned function executes `name` against `tools` with the\n * task's `controller.input` as the call arguments, id-correlated to the task's own id. A\n * `ToolManagerInterface.execute` (`@orkestrel/agent`) NEVER throws (a handler throw is isolated\n * into `result.error`), so a failing tool is surfaced here as a THROWN `Error` carrying the\n * original message as `cause` — the leaf `fail`s, honouring `bail`. An UNREGISTERED tool name is\n * a programmer error (an explicit binding to a name that doesn't exist) — unlike the engine's\n * own silent auto-complete of an unresolved task handler, this THROWS a typed `TOOL`\n * `WorkflowError` (`@orkestrel/workflow`).\n *\n * @param tools - The `ToolManagerInterface` (`@orkestrel/agent`) the named tool is registered on\n * @param name - The registered tool's name\n * @returns A {@link WorkflowFunction} that runs the named tool\n *\n * @example\n * ```ts\n * import { createToolFunction } from '@src/core'\n * import { createToolManager } from '@orkestrel/agent'\n * import { createWorkflowRunner } from '@orkestrel/workflow'\n *\n * const tools = createToolManager()\n * tools.add(myPublishTool)\n * const runner = createWorkflowRunner()\n * await runner.execute(definition, { functions: { publish: createToolFunction(tools, 'publish') } })\n * ```\n */\nexport function createToolFunction(tools: ToolManagerInterface, name: string): WorkflowFunction {\n\treturn async (controller) => {\n\t\tconst tool = tools.tool(name)\n\t\tif (tool === undefined) {\n\t\t\tthrow new WorkflowError('TOOL', `tool '${name}' is not registered`, { tool: name })\n\t\t}\n\t\tconst result = await tools.execute({\n\t\t\tid: controller.task.id,\n\t\t\tname,\n\t\t\targuments: controller.input,\n\t\t})\n\t\t// A `tool` result NEVER throws — the manager isolates a handler throw into `result.error`.\n\t\t// Surface that as a task failure (so a failing tool `fail`s the leaf, honouring `bail`).\n\t\t// The manager already flattened the original throw to a string, so the message IS the\n\t\t// richest surviving detail — `cause` carries that same string, nothing deeper exists.\n\t\tif (result.error !== undefined) throw new Error(result.error, { cause: result.error })\n\t\treturn result.value\n\t}\n}\n\n/**\n * Wrap a live `AgentInterface` (`@orkestrel/agent`) as a {@link WorkflowFunction}\n * (`@orkestrel/workflow`) — the OPT-IN adapter that runs the agent to a settled result, folding\n * a nested workflow-authoring depth / cycle guard into its own closure.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Composes into a caller's\n * `WorkflowOptions.functions` registry like any other behavior; the pure workflow runner has no\n * knowledge of agents itself. Before running the agent, the depth/cycle guard REJECTS the call\n * (a THROWN typed `DEPTH` `WorkflowError`, which the leaf `fail`s) when running it would push a\n * nested chain past {@link import('./constants.js').MAX_WORKFLOW_DEPTH}, OR when this agent is\n * already an ancestor (a cycle). When {@link import('./types.js').AgentFunctionOptions.runner}\n * is supplied, the adapter BINDS a depth/cycle-aware {@link createWorkflowTool} onto the agent's\n * `context.tools` (the propagation seam) — closed over `depth` and the extended ancestry (the\n * tool itself computes `depth + 1` internally) — so the agent can author + run a NESTED workflow\n * through it; the wrapped default is the CURRENT task's own workflow id (used only on a no-args\n * tool call). The task's cancellation folds into the agent run: an already-aborted\n * `controller.signal` cancels the agent up front; otherwise a one-shot listener fires\n * `agent.abort(reason)` when the task cancels, removed in `finally`. `agent.generate()` resolves\n * a partial `AgentResult` on a cancel (never rejects), returned as the task's completed value.\n *\n * A bound agent is effectively SINGLE-RUN: `context.tools.add` binds one `ToolInterface` under\n * the fixed {@link import('./constants.js').WORKFLOW_TOOL_NAME}, and `agent.generate()` /\n * `agent.abort()` are per-agent state. Two CONCURRENT tasks sharing the SAME `agent` instance\n * race on that one tool binding (last-write-wins) and on generate/abort — give each concurrent\n * task its OWN agent instance.\n *\n * @param agent - The live `AgentInterface` to run\n * @param options - The nested-workflow binding + depth/cycle bookkeeping (see {@link import('./types.js').AgentFunctionOptions})\n * @returns A {@link WorkflowFunction} that runs `agent` to its settled result\n *\n * @example\n * ```ts\n * import { createAgentFunction } from '@src/core'\n * import { createWorkflowRunner } from '@orkestrel/workflow'\n *\n * const runner = createWorkflowRunner()\n * const review = createAgentFunction(myAgent, { runner })\n * await runner.execute(definition, { functions: { review } })\n * ```\n */\nexport function createAgentFunction(\n\tagent: AgentInterface,\n\toptions?: AgentFunctionOptions,\n): WorkflowFunction {\n\treturn async (controller) => {\n\t\tconst depth = options?.depth ?? 0\n\t\tconst ancestry = options?.ancestry ?? []\n\t\t// GUARD (before running the agent): running it would let it author + run a NESTED workflow\n\t\t// at `depth + 1`, so reject when that would exceed the bound, OR when this agent is already\n\t\t// an ancestor (a re-entry cycle). The throw becomes the leaf's typed `DEPTH` failure.\n\t\tif (depth + 1 > MAX_WORKFLOW_DEPTH) {\n\t\t\tthrow new WorkflowError('DEPTH', `agent '${agent.id}' exceeds max workflow depth`, {\n\t\t\t\tagent: agent.id,\n\t\t\t\tdepth,\n\t\t\t\tmax: MAX_WORKFLOW_DEPTH,\n\t\t\t})\n\t\t}\n\t\tconst tag = agentTag(agent.id)\n\t\tif (ancestry.includes(tag)) {\n\t\t\tthrow new WorkflowError('DEPTH', `agent '${agent.id}' is already an ancestor (cycle)`, {\n\t\t\t\tagent: agent.id,\n\t\t\t\tancestry: [...ancestry],\n\t\t\t})\n\t\t}\n\t\t// BIND the workflow tool so the agent can fan out into a nested workflow at `depth + 1` with\n\t\t// THIS agent added to the ancestry — the propagation across the agent/tool boundary (closed\n\t\t// over the tool at bind time, since a tool handler receives no ambient context). The current\n\t\t// task's own workflow id is the tool's WRAPPED default, used only on a no-args call.\n\t\tconst runner = options?.runner\n\t\tif (runner !== undefined) {\n\t\t\tconst workflowId = controller.task.phase.workflow.id\n\t\t\tconst wrapped: WorkflowDefinition = { id: workflowId, name: workflowId, phases: [] }\n\t\t\tagent.context.tools.add(\n\t\t\t\tcreateWorkflowTool(wrapped, runner, { depth, ancestry: [...ancestry, tag] }),\n\t\t\t)\n\t\t}\n\t\t// Fold the task's cancellation into the agent run: an already-aborted signal cancels the\n\t\t// agent up front; otherwise a one-shot listener fires `agent.abort(reason)` when the task\n\t\t// cancels. `generate()` RESOLVES a partial on a cancel (never rejects).\n\t\tconst signal = controller.signal\n\t\tconst onAbort = (): void => agent.abort(signal.reason)\n\t\tif (signal.aborted) {\n\t\t\tagent.abort(signal.reason)\n\t\t} else {\n\t\t\tsignal.addEventListener('abort', onAbort, { once: true })\n\t\t}\n\t\ttry {\n\t\t\treturn await agent.generate()\n\t\t} finally {\n\t\t\tsignal.removeEventListener('abort', onAbort)\n\t\t}\n\t}\n}\n\n/**\n * Compile the LENIENT workflow DRAFT contract — identical to `createWorkflowContract`\n * (`@orkestrel/workflow`) EXCEPT `id` and `name` are OPTIONAL at all three levels (workflow /\n * phase / task), so a small model can omit the six identity strings.\n *\n * @remarks\n * The widened authoring surface {@link createWorkflowTool} parses an authored blob through\n * before {@link import('./helpers.js').completeDraft} fills the missing ids/names. It does NOT\n * relax the canonical contract — `createWorkflowContract` (`@orkestrel/workflow`) stays\n * byte-for-byte unchanged and STRICT, and the completed draft is re-validated against THAT\n * strict gate before running (soundness preserved). A PROVIDED `id` / `name` still carries\n * `minLength: 1`, so an explicitly-empty `id: ''` is REJECTED (parses to `undefined`), never\n * auto-filled — keeping \"garbage\" distinct from \"omitted\". `run` stays optional (a plain name\n * string).\n *\n * @returns The compiled {@link import('./types.js').WorkflowDraft} contract\n *\n * @example\n * ```ts\n * import { createWorkflowDraftContract, completeDraft } from '@src/core'\n *\n * const draft = createWorkflowDraftContract()\n * const parsed = draft.parse({ phases: [{ tasks: [{ run: 'compile' }] }] })\n * const definition = parsed && completeDraft(parsed) // ids/names filled positionally\n * draft.parse({ id: '', phases: [] }) // undefined — an explicit empty id is rejected\n * ```\n */\nexport function createWorkflowDraftContract(): ContractInterface<WorkflowDraft> {\n\treturn createContract(workflowDraftShape)\n}\n\n/**\n * Wrap a {@link WorkflowDefinition} as an LLM-callable tool — it ADVERTISES the SIMPLE flat\n * authoring shape (`{ name?, steps: [{ name }] }`) as its `parameters` so even a small model can\n * author a complete tree, and its handler EXPANDS / COMPLETES the authored blob, validates it\n * against the STRICT contract, runs it through `runner`, and, when\n * {@link import('./types.js').WorkflowToolOptions.store} is supplied, PERSISTS each executed\n * workflow's final snapshot after the run settles.\n *\n * @remarks\n * A plain `ToolManagerInterface`-compatible tool (`@orkestrel/agent`), reproducing\n * `@orkestrel/workflow`'s former call contract exactly (flat / draft / full authoring forms, the\n * strict soundness gate, the depth/cycle guard). It is ALSO the propagation carrier\n * {@link createAgentFunction} binds onto a wrapped agent's `context.tools`: because a tool\n * handler receives ONLY the model-supplied `args` (no ambient context, no signal), the run's\n * depth + ancestry are CLOSED OVER at bind time via {@link import('./types.js').WorkflowToolOptions},\n * and the handler enforces the SAME depth / cycle guard itself before running the nested\n * workflow at `depth + 1` with the extended ancestry.\n *\n * **Widened authoring surface (additive — the canonical contract + runner stay STRICT and\n * unchanged).** A 2B model reliably CALLS the tool but cannot reliably emit the full four-level\n * nested {@link WorkflowDefinition} (six required `id`/`name` strings, an all-or-nothing tree).\n * So the tool ACCEPTS three authoring forms and converges them on the SAME strict\n * `createWorkflowContract` gate before running (soundness preserved):\n * - the FLAT shape `{ name?, steps: [{ name }] }` — the ADVERTISED `parameters` (the simplest\n * form, {@link import('./helpers.js').expandSteps}'d into one one-task phase per step);\n * - a nested DRAFT with any `id`/`name` OMITTED — {@link createWorkflowDraftContract}-parsed then\n * {@link import('./helpers.js').completeDraft}'d (missing ids synthesized positionally);\n * - the full nested {@link WorkflowDefinition} — the advanced escape-hatch, accepted as the draft\n * super-set.\n *\n * The universal tool-handler contract (AGENTS §14): returns the plain run summary\n * (`{ status, count }`) on success, THROWS a typed `WorkflowError` (`@orkestrel/workflow`) on\n * every failure path — malformed authored args (`TOOL`), or an over-deep / cyclic nested run\n * (`DEPTH`). The `ToolManagerInterface` isolates every throw into the canonical tool result's\n * top-level `error`, so nothing escapes the run. `options.depth` / `options.ancestry` are the\n * propagation carrier across a workflow → agent → workflow chain; `options.store` is this\n * package's ADDITION — the persisted snapshot is retrievable via the store afterwards (a caller\n * restores it through `@orkestrel/workflow`'s own `Workflow.restore` / store-backed factories).\n *\n * @param definition - The workflow the tool runs when called with no authored args\n * @param runner - The `WorkflowRunnerInterface` (`@orkestrel/workflow`) that executes the (nested) workflow\n * @param options - Depth/ancestry bookkeeping plus the optional durable store (see {@link import('./types.js').WorkflowToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').WORKFLOW_TOOL_NAME}) whose\n * `parameters` advertise the flat authoring schema\n *\n * @example\n * ```ts\n * import { createWorkflowTool } from '@src/core'\n * import { createWorkflowRunner, createMemoryWorkflowStore } from '@orkestrel/workflow'\n * import { createToolManager } from '@orkestrel/agent'\n *\n * const runner = createWorkflowRunner()\n * const store = createMemoryWorkflowStore()\n * const tool = createWorkflowTool(definition, runner, { store })\n * const tools = createToolManager()\n * tools.add(tool) // authored runs are now persisted to `store` on settle\n * ```\n */\nexport function createWorkflowTool(\n\tdefinition: WorkflowDefinition,\n\trunner: WorkflowRunnerInterface,\n\toptions?: WorkflowToolOptions,\n): ToolInterface {\n\tconst strict = createWorkflowContract()\n\tconst draft = createWorkflowDraftContract()\n\tconst steps: ContractInterface<WorkflowSteps> = createContract(workflowStepsShape)\n\tconst depth = options?.depth ?? 0\n\tconst ancestry = options?.ancestry ?? []\n\tconst store = options?.store\n\tconst parameters = schemaToParameters(steps.schema)\n\treturn createTool({\n\t\tname: WORKFLOW_TOOL_NAME,\n\t\tdescription: WORKFLOW_TOOL_DESCRIPTION,\n\t\tsummary: WORKFLOW_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\t// Branch on the authored args' SHAPE (no ambient context — a tool handler gets only\n\t\t\t// `args`): empty ⇒ the wrapped definition; a `steps` array ⇒ the FLAT form, parsed +\n\t\t\t// expanded; otherwise the nested DRAFT form, parsed + completed. A parse failure leaves\n\t\t\t// `target` undefined ⇒ the strict gate below throws `TOOL`.\n\t\t\tlet target: WorkflowDefinition | undefined\n\t\t\tif (Object.keys(args).length === 0) {\n\t\t\t\ttarget = definition\n\t\t\t} else if (Array.isArray(args.steps)) {\n\t\t\t\tconst flat = steps.parse(args)\n\t\t\t\ttarget = flat === undefined ? undefined : expandSteps(flat)\n\t\t\t} else {\n\t\t\t\tconst parsed = draft.parse(args)\n\t\t\t\ttarget = parsed === undefined ? undefined : completeDraft(parsed)\n\t\t\t}\n\t\t\t// The SOUNDNESS gate: whatever authoring form produced `target`, it must satisfy the\n\t\t\t// STRICT canonical contract before it runs — the leniency never reaches the runner.\n\t\t\tif (target === undefined || !strict.is(target)) {\n\t\t\t\tthrow new WorkflowError('TOOL', 'malformed workflow definition', {\n\t\t\t\t\tworkflow: definition.id,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (depth + 1 > MAX_WORKFLOW_DEPTH) {\n\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t'DEPTH',\n\t\t\t\t\t`nested workflow exceeds max depth ${MAX_WORKFLOW_DEPTH}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tworkflow: target.id,\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tmax: MAX_WORKFLOW_DEPTH,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst tag = workflowTag(target.id)\n\t\t\tif (ancestry.includes(tag)) {\n\t\t\t\tthrow new WorkflowError('DEPTH', `workflow '${target.id}' is already an ancestor (cycle)`, {\n\t\t\t\t\tworkflow: target.id,\n\t\t\t\t\tancestry: [...ancestry],\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst result = await runner.execute(target)\n\t\t\tif (store !== undefined) await store.set(result.workflow.snapshot())\n\t\t\treturn workflowToolSummary(result)\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable workspace-editing tool — it ADVERTISES the `operation`-discriminated\n * 13-op union ({@link import('./shapers.js').workspaceToolShape}) as its `parameters`, and its\n * handler PARSES the model-supplied args against that contract and DISPATCHES the matched\n * operation against the manager's ACTIVE workspace (the registry ops drive the manager itself),\n * returning the plain result (throwing a typed `WorkspaceError`, `@orkestrel/agent`, on\n * failure). EITHER drives a caller-supplied {@link WorkspaceToolOptions.manager} directly, OR\n * constructs a fresh `WorkspaceManagerInterface` (`@orkestrel/agent`) over\n * {@link import('./types.js').WorkspaceToolOptions.store} (via `@orkestrel/agent`'s\n * `createWorkspaceManager`); neither given constructs a manager backed by `@orkestrel/agent`'s\n * in-memory store default.\n *\n * @remarks\n * MANAGER-DRIVEN: every edit / read op (read / list / has / search / replace / write / splice /\n * prepend / append / move / remove) targets `manager.active`, so the model edits whichever\n * workspace is active and a host can re-point it (`WorkspaceManagerInterface.switch`) between\n * turns. Two REGISTRY ops make the model self-sufficient: `workspaces` LISTS the registered\n * workspaces (each `{ id, files, active }`) so it can discover an id, and `switch` re-points the\n * active workspace by id (lenient — an unknown id is a no-op reporting `switched: false`, never a\n * throw).\n *\n * NO-ACTIVE RULE (the ergonomic seam): a WRITING op (write / splice / prepend / append / move /\n * remove / replace) run when `manager.active` is `undefined` AUTO-CREATES + activates a default\n * workspace (`manager.add()`) so the model can just start writing; a pure-READ op (read / list /\n * has / search) against no active workspace returns the EMPTY result (`undefined` / `[]` /\n * `false`), never creating one and never throwing.\n *\n * The handler conforms to the universal tool-handler contract (AGENTS §14): it `contract.parse`s\n * the args, THROWS a `TOOL` `WorkspaceError` when no operation arm matched (a malformed / unknown\n * operation), else `switch`es on `op.operation` and RETURNS the plain result — letting a\n * `WorkspaceError` raised by the live workspace (`MODALITY` / `PATTERN` / `RANGE`) PROPAGATE\n * uncaught. The range edit is the FLAT `'splice'` op: its four flat caret integers are\n * reassembled into a `Range` (`@orkestrel/agent`) by `rangeOf` and fed to the workspace's ranged\n * `write`.\n *\n * @param options - `manager` (drive directly) OR `store` (build a manager over it); neither ⇒\n * an in-memory-backed manager (see {@link import('./types.js').WorkspaceToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').WORKSPACE_TOOL_NAME} by default)\n *\n * @example\n * ```ts\n * import { createWorkspaceTool } from '@src/core'\n * import { createToolManager } from '@orkestrel/agent'\n *\n * const tool = createWorkspaceTool() // in-memory workspace, no persistence\n * const tools = createToolManager()\n * tools.add(tool)\n * ```\n */\nexport function createWorkspaceTool(options?: WorkspaceToolOptions): ToolInterface {\n\tconst manager: WorkspaceManagerInterface =\n\t\toptions?.manager ??\n\t\tcreateWorkspaceManager(options?.store === undefined ? undefined : { store: options.store })\n\tconst contract: ContractInterface<WorkspaceOperation> = createContract(workspaceToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\treturn createTool({\n\t\tname: options?.name ?? WORKSPACE_TOOL_NAME,\n\t\tdescription: options?.description ?? WORKSPACE_TOOL_DESCRIPTION,\n\t\tsummary: WORKSPACE_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: (args) => {\n\t\t\tconst op = contract.parse(args)\n\t\t\tif (op === undefined) {\n\t\t\t\tthrow new WorkspaceError('TOOL', `unknown or malformed operation`, { args })\n\t\t\t}\n\t\t\t// Registry ops act on the MANAGER, not a workspace — handle them first.\n\t\t\tif (op.operation === 'workspaces') {\n\t\t\t\tconst activeId = manager.active?.id\n\t\t\t\treturn manager.workspaces().map((workspace) => ({\n\t\t\t\t\tid: workspace.id,\n\t\t\t\t\tfiles: workspace.count,\n\t\t\t\t\tactive: workspace.id === activeId,\n\t\t\t\t}))\n\t\t\t}\n\t\t\tif (op.operation === 'switch') {\n\t\t\t\tconst switched = manager.switch(op.id)\n\t\t\t\t// Lenient: an unknown id leaves `active` unchanged and reports `switched: false`.\n\t\t\t\treturn switched === undefined\n\t\t\t\t\t? { id: op.id, switched: false }\n\t\t\t\t\t: { id: switched.id, switched: true, files: switched.count }\n\t\t\t}\n\t\t\t// Edit / read ops target the ACTIVE workspace. A WRITING op ensures a target — auto-creating\n\t\t\t// + activating a default workspace when none is active (the no-active ergonomic seam) — while\n\t\t\t// a pure-READ op returns the empty result against no active workspace rather than creating one.\n\t\t\tconst active = manager.active\n\t\t\tswitch (op.operation) {\n\t\t\t\tcase 'read':\n\t\t\t\t\treturn active?.read(op.path)\n\t\t\t\tcase 'list':\n\t\t\t\t\treturn (active?.files() ?? []).map((file) => ({\n\t\t\t\t\t\tpath: file.path,\n\t\t\t\t\t\tstate: file.state,\n\t\t\t\t\t\tsize: file.size,\n\t\t\t\t\t\tlines: file.lines,\n\t\t\t\t\t\tkind: isText(file.content) ? 'text' : 'binary',\n\t\t\t\t\t}))\n\t\t\t\tcase 'has':\n\t\t\t\t\treturn active?.has(op.path) ?? false\n\t\t\t\tcase 'search':\n\t\t\t\t\treturn (\n\t\t\t\t\t\tactive?.search(op.query, { regex: op.regex, exact: op.exact, limit: op.limit }) ?? []\n\t\t\t\t\t)\n\t\t\t\tcase 'replace': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\treturn workspace.replace(op.query, op.replacement, {\n\t\t\t\t\t\tregex: op.regex,\n\t\t\t\t\t\texact: op.exact,\n\t\t\t\t\t\tlimit: op.limit,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tcase 'write': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.write(op.path, op.content)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'splice': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.write(\n\t\t\t\t\t\top.path,\n\t\t\t\t\t\top.content,\n\t\t\t\t\t\trangeOf(op.fromLine, op.fromColumn, op.toLine, op.toColumn),\n\t\t\t\t\t)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'prepend': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.prepend(op.path, op.content)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'append': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.append(op.path, op.content)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'move': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\treturn { from: op.from, to: op.to, moved: workspace.move(op.from, op.to) }\n\t\t\t\t}\n\t\t\t\tcase 'remove': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\treturn { path: op.path, removed: workspace.remove(op.path) }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable sub-agent delegation tool — resolves a live, seeded `AgentInterface`\n * from `registry` and runs it to completion for ONE delegated `task`.\n *\n * @remarks\n * The universal tool-handler contract (AGENTS §14): validates the call args against\n * {@link import('./shapers.js').agentToolShape}, assembles an `AgentJobInput` (`task` seeds the\n * sub-agent's conversation as a single `user` message; `provider` / `tools` / `system` fall\n * back to the tool's own {@link import('./types.js').AgentToolOptions} defaults), rehydrates the sub-agent via\n * `registry.build`, runs it with `agent.generate()`, and returns the settled\n * `AgentResult.content` string (the sub-agent's final text). A missing / unresolvable `provider`, or a malformed call, THROWS a typed `TOOL`\n * {@link import('./errors.js').AgentToolError}; a delegation that would exceed\n * {@link import('./constants.js').AGENT_TOOL_DEPTH}, or re-enter an already-delegated agent (a\n * cycle), THROWS a typed `DEPTH` {@link import('./errors.js').AgentToolError} — both isolated\n * by the `ToolManagerInterface` into the canonical tool result's top-level `error`.\n *\n * `AgentInterface` (`@orkestrel/agent`) exposes no teardown method — a bound sub-agent's\n * lifetime is the single `generate()` call this handler awaits; there is nothing to release\n * afterwards (unlike a store-backed resource, its state lives entirely in the resolved\n * `AgentContextInterface`, owned by the caller's registry).\n *\n * @param registry - The `AgentRegistryInterface` a delegated job resolves against (providers,\n * tools, authorities, schedulers, and the `build` rehydration seam)\n * @param options - Delegation defaults, depth/ancestry bookkeeping, and advertised overrides\n * (see {@link import('./types.js').AgentToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').AGENT_TOOL_NAME} by default)\n *\n * @example\n * ```ts\n * import { createAgentTool } from '@src/core'\n * import { createAgentRegistry, createToolManager } from '@orkestrel/agent'\n *\n * const registry = createAgentRegistry({ providers: { openai: myProvider } })\n * const tool = createAgentTool(registry, { provider: 'openai' })\n * const tools = createToolManager()\n * tools.add(tool) // a model can now delegate a task to a sub-agent\n * ```\n */\nexport function createAgentTool(\n\tregistry: AgentRegistryInterface,\n\toptions?: AgentToolOptions,\n): ToolInterface {\n\tconst contract = createContract(agentToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\tconst depth = options?.depth ?? 0\n\tconst ancestry = options?.ancestry ?? []\n\treturn createTool({\n\t\tname: options?.name ?? AGENT_TOOL_NAME,\n\t\tdescription: options?.description ?? AGENT_TOOL_DESCRIPTION,\n\t\tsummary: AGENT_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\tconst call = contract.parse(args)\n\t\t\tif (call === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'malformed agent-delegation call', { args })\n\t\t\t}\n\t\t\tconst provider = call.provider ?? options?.provider\n\t\t\tif (provider === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'no provider resolved for the delegated agent', {\n\t\t\t\t\ttask: call.task,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (depth + 1 > AGENT_TOOL_DEPTH) {\n\t\t\t\tthrow new AgentToolError(\n\t\t\t\t\t'DEPTH',\n\t\t\t\t\t`delegation exceeds max agent depth ${AGENT_TOOL_DEPTH}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tmax: AGENT_TOOL_DEPTH,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst tag = agentTag(provider)\n\t\t\tif (ancestry.includes(tag)) {\n\t\t\t\tthrow new AgentToolError('DEPTH', `agent '${provider}' is already an ancestor (cycle)`, {\n\t\t\t\t\tprovider,\n\t\t\t\t\tancestry: [...ancestry],\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst tools = call.tools ?? options?.tools\n\t\t\tconst system = call.system ?? options?.system\n\t\t\tconst agent = registry.build({\n\t\t\t\tprovider,\n\t\t\t\tmessages: [{ role: 'user', content: call.task }],\n\t\t\t\t...(system === undefined ? {} : { system }),\n\t\t\t\t...(tools === undefined ? {} : { tools }),\n\t\t\t})\n\t\t\tconst result = await agent.generate()\n\t\t\tif (options?.store !== undefined) {\n\t\t\t\tconst active = agent.context.conversations.active\n\t\t\t\tif (active !== undefined) await options.store.set(active.snapshot())\n\t\t\t}\n\t\t\treturn result.content\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable tool that returns the FULL `description` of another registered tool by\n * name — the counterpart to the lean `summary` the other tools in this package advertise\n * (`AGENT_TOOL_SUMMARY` / `WORKFLOW_TOOL_SUMMARY` / `WORKSPACE_TOOL_SUMMARY`).\n *\n * @remarks\n * `ToolManagerInterface.definitions()` (`@orkestrel/agent`) advertises `tool.summary ??\n * tool.description` — a lean one-sentence summary stands in for a tool's full teaching\n * description when `summary` is set, keeping the advertised tool list compact for a small model.\n * This tool is the on-demand expansion seam: given a registered tool's `name`, it looks the tool\n * up via `tools.tool(name)` and returns its full `description` (falling back to `summary` when a\n * tool has no `description` of its own, then a placeholder when it has neither).\n *\n * The universal tool-handler contract (AGENTS §14): validates the call args against\n * {@link import('./shapers.js').describeToolShape}, RETURNS the plain description string on\n * success, THROWS a typed `TOOL` {@link import('./errors.js').AgentToolError} on a malformed call\n * or an unknown tool name.\n *\n * @param tools - The `ToolManagerInterface` (`@orkestrel/agent`) whose registered tools this\n * tool can describe\n * @returns A `ToolInterface` (named {@link import('./constants.js').DESCRIBE_TOOL_NAME})\n *\n * @example\n * ```ts\n * import { createDescribeTool, createWorkflowTool } from '@src/core'\n * import { createToolManager } from '@orkestrel/agent'\n *\n * const tools = createToolManager()\n * tools.add(createWorkflowTool(definition, runner))\n * tools.add(createDescribeTool(tools))\n * const full = await tools.execute({ id: '1', name: 'describe', arguments: { name: 'workflow' } })\n * full.value // the workflow tool's full teaching description\n * ```\n */\nexport function createDescribeTool(tools: ToolManagerInterface): ToolInterface {\n\tconst contract = createContract(describeToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\treturn createTool({\n\t\tname: DESCRIBE_TOOL_NAME,\n\t\tdescription: DESCRIBE_TOOL_DESCRIPTION,\n\t\tsummary: DESCRIBE_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\tconst call = contract.parse(args)\n\t\t\tif (call === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'malformed describe call', { args })\n\t\t\t}\n\t\t\tconst tool = tools.tool(call.name)\n\t\t\tif (tool === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', `unknown tool '${call.name}'`, { name: call.name })\n\t\t\t}\n\t\t\treturn tool.description ?? tool.summary ?? '<no description>'\n\t\t},\n\t})\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/core/constants.ts","../../../src/core/errors.ts","../../../src/core/shapers.ts","../../../src/core/helpers.ts","../../../src/core/factories.ts"],"sourcesContent":["import type { WorkflowDefinition } from '@orkestrel/workflow'\nimport type { WorkflowSteps, WorkspaceOperation } from './types.js'\n\n// Tool-package constants — UPPER_SNAKE, `Object.freeze`d, every member exported (AGENTS §5).\n// The workflow tool's name/description/examples/depth-bound and the workspace tool's\n// name/description are OWNED here now — ported byte-faithfully from `@orkestrel/workflow` /\n// `@orkestrel/agent` ahead of the upstream cleanup that drops the authoring surface from those\n// packages (this package becomes the defining home). Only the net-new agent tool's constants\n// were already net-new to this package.\n\n/**\n * The name {@link import('./factories.js').createAgentTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n */\nexport const AGENT_TOOL_NAME = 'agent'\n\n/**\n * The maximum nesting depth a delegation chain (agent tool → sub-agent → agent tool → …) may\n * reach — the bound {@link import('./factories.js').createAgentTool}'s depth/cycle guard\n * enforces.\n *\n * @remarks\n * Deliberately a SEPARATE constant from {@link MAX_WORKFLOW_DEPTH} (rather than the two guards\n * sharing one reference): the two guards bound DIFFERENT chains (workflow nesting vs. agent\n * delegation) that happen to share a value today, and keeping this bound decoupled means a\n * future change to one never silently shifts the other. Same numeric value by convention, not\n * by shared reference.\n */\nexport const AGENT_TOOL_DEPTH = 8\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createAgentTool} advertises — a short guide\n * that teaches a model how to delegate a task to a sub-agent.\n *\n * @remarks\n * Mirrors {@link WORKFLOW_TOOL_DESCRIPTION} / `WORKSPACE_TOOL_DESCRIPTION`'s teaching style: names\n * the required `task` field, and documents the optional per-call `provider` / `tools` /\n * `system` overrides.\n */\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createAgentTool}\n * advertises in place of {@link AGENT_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const AGENT_TOOL_SUMMARY =\n\t\"Delegate a task to a sub-agent and return its result; each call runs one sub-agent turn to completion. Call describe('agent') for the optional provider/tools/system overrides.\"\n\nexport const AGENT_TOOL_DESCRIPTION = [\n\t'Delegate a task to a sub-agent and return its result. Every call runs ONE sub-agent turn to completion.',\n\t'',\n\t'Required:',\n\t' task - the instructions the sub-agent should carry out.',\n\t'Optional overrides (default to the values this tool was configured with):',\n\t' provider - the registry key of the model/provider the sub-agent runs against.',\n\t' tools - registry keys of the tools loaded into the sub-agent (replaces the default list, not merged).',\n\t\" system - a system prompt seeding the sub-agent's context (replaces the default).\",\n\t'Example:',\n\tJSON.stringify({\n\t\ttask: 'Summarize the attached notes in three bullet points.',\n\t}),\n].join('\\n')\n\n/**\n * The maximum nesting depth a workflow → agent → workflow chain may reach — the bound\n * {@link import('./factories.js').createAgentFunction} and\n * {@link import('./factories.js').createWorkflowTool}'s depth/cycle guards enforce.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`, whose engine no longer uses it — only the\n * tool-authoring guards this package now owns consume it). The limit lives in ONE place: an\n * agent-function-wrapped agent running at this depth can no longer author + run a NESTED\n * workflow through its bound workflow tool (that would be depth `MAX_WORKFLOW_DEPTH + 1`), so\n * the over-deep invocation is REJECTED (a typed `DEPTH` `WorkflowError` throw, `@orkestrel/workflow`).\n */\nexport const MAX_WORKFLOW_DEPTH = 8\n\n/**\n * The name {@link import('./factories.js').createWorkflowTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under, and the name\n * {@link import('./factories.js').createAgentFunction} binds the depth/cycle-aware workflow tool\n * under onto a wrapped agent's `context.tools`.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). The propagation seam's well-known key: when\n * `createAgentFunction`'s `runner` option is supplied, it adds a `createWorkflowTool`-built tool\n * under this name to the agent's `context.tools`, so it can author + run a NESTED workflow\n * (bounded by {@link MAX_WORKFLOW_DEPTH}).\n */\nexport const WORKFLOW_TOOL_NAME = 'workflow'\n\n/**\n * A complete FLAT authoring example — the PRIMARY way a small model authors a workflow through\n * {@link import('./factories.js').createWorkflowTool}: `{ name, steps: [{ name }] }`.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Each step becomes a one-task phase, in\n * order; a step's `name` is a REGISTERED behavior name (not a label) — the registry key its\n * task's `run` resolves against. The tool expands this\n * ({@link import('./helpers.js').expandSteps}) into a valid `WorkflowDefinition`\n * (`@orkestrel/workflow`). It is embedded VERBATIM in {@link WORKFLOW_TOOL_DESCRIPTION}.\n */\nexport const WORKFLOW_TOOL_FLAT_EXAMPLE: WorkflowSteps = Object.freeze({\n\tname: 'release',\n\tsteps: Object.freeze([Object.freeze({ name: 'compile' }), Object.freeze({ name: 'publish' })]),\n})\n\n/**\n * A minimal NESTED authoring example — the ADVANCED escape-hatch form a model may use instead of\n * the flat shape: a full `WorkflowDefinition` (`@orkestrel/workflow`).\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). The full four-level form, documented in\n * {@link WORKFLOW_TOOL_DESCRIPTION} as the advanced alternative. It is embedded VERBATIM.\n */\nexport const WORKFLOW_TOOL_NESTED_EXAMPLE: WorkflowDefinition = Object.freeze({\n\tid: 'release',\n\tname: 'Release',\n\tphases: Object.freeze([\n\t\tObject.freeze({\n\t\t\tid: 'build',\n\t\t\tname: 'Build',\n\t\t\ttasks: Object.freeze([\n\t\t\t\tObject.freeze({\n\t\t\t\t\tid: 'compile',\n\t\t\t\t\tname: 'Compile',\n\t\t\t\t\trun: 'compile',\n\t\t\t\t}),\n\t\t\t]),\n\t\t}),\n\t]),\n})\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createWorkflowTool} advertises — a multi-line\n * guide that teaches a small model how to author a complete workflow tree.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Presents the SIMPLE flat shape\n * (`{ name, steps: [{ name }] }`) as the PRIMARY way with one complete worked example\n * ({@link WORKFLOW_TOOL_FLAT_EXAMPLE}), names that a step's `name` is a REGISTERED name (not a\n * human label), and documents the full nested `WorkflowDefinition` as the ADVANCED form with a\n * minimal example ({@link WORKFLOW_TOOL_NESTED_EXAMPLE}). The `parameters` the tool advertises\n * are the FLAT shape's schema; the nested form is the documented escape-hatch (the tool accepts\n * both).\n */\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createWorkflowTool}\n * advertises in place of {@link WORKFLOW_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const WORKFLOW_TOOL_SUMMARY =\n\t\"Author and run a multi-phase workflow in one call — phases run in sequence, tasks within a phase run concurrently. Call describe('workflow') for the full authoring schema and examples.\"\n\nexport const WORKFLOW_TOOL_DESCRIPTION = [\n\t'Author and run a workflow (phases run sequentially, the tasks within a phase run concurrently) in one call.',\n\t'',\n\t'SIMPLEST way — a flat list of steps. Each step runs one registered behavior; steps run one after another:',\n\t' { \"name\": \"<workflow name>\", \"steps\": [ { \"name\": \"<registered name>\" }, ... ] }',\n\t'- a step\\'s \"name\" is a REGISTERED behavior name (a registry key), NOT a human label.',\n\t'- the top-level \"name\" (the workflow name) is optional. Ids are filled in for you.',\n\t'Example:',\n\tJSON.stringify(WORKFLOW_TOOL_FLAT_EXAMPLE),\n\t'',\n\t'ADVANCED — the full nested form, for multi-task phases or explicit ids. A workflow has phases; a phase has tasks; a task has a \"run\" (a registered behavior name):',\n\tJSON.stringify(WORKFLOW_TOOL_NESTED_EXAMPLE),\n\t'In the nested form you may omit any \"id\"/\"name\" and they are filled in positionally; a provided one is kept.',\n].join('\\n')\n\n/**\n * The name {@link import('./factories.js').createWorkspaceTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/agent`).\n */\nexport const WORKSPACE_TOOL_NAME = 'workspace'\n\n/**\n * A valid `WorkspaceOperation` (`@orkestrel/agent`) object — the canonical example embedded\n * VERBATIM in {@link WORKSPACE_TOOL_DESCRIPTION}.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/agent`). A `'write'` op (the most common authoring\n * action): create or overwrite `notes.txt` with `hello`. Frozen so it cannot be mutated in\n * place.\n */\nexport const WORKSPACE_TOOL_EXAMPLE: WorkspaceOperation = Object.freeze({\n\toperation: 'write',\n\tpath: 'notes.txt',\n\tcontent: 'hello',\n})\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createWorkspaceTool} advertises — a multi-line\n * guide that teaches a small model how to drive a workspace through the single\n * `operation`-keyed tool.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/agent`). Mirrors {@link WORKFLOW_TOOL_DESCRIPTION}'s\n * teaching style: names the `operation` discriminant field, enumerates all 13 operations with\n * their FLAT fields, gives a worked example for the common ones, and embeds\n * {@link WORKSPACE_TOOL_EXAMPLE} verbatim.\n */\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createWorkspaceTool}\n * advertises in place of {@link WORKSPACE_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const WORKSPACE_TOOL_SUMMARY =\n\t\"Read and edit files in a workspace — one operation per call (read, write, list, search, replace, splice, move, remove, plus workspace switching), chosen by the 'operation' field. Call describe('workspace') for the full operation list and fields.\"\n\nexport const WORKSPACE_TOOL_DESCRIPTION = [\n\t'Read and edit files in a workspace. Every call is ONE operation, chosen by the \"operation\" field.',\n\t'All file operations act on the ACTIVE workspace; use \"workspaces\" then \"switch\" to move between workspaces.',\n\t'',\n\t'Operations (each takes the fields listed):',\n\t'- read { \"operation\": \"read\", \"path\": \"<file>\" } — return the file\\'s text.',\n\t'- list { \"operation\": \"list\" } — list every file in the active workspace (path, state, size, lines, kind).',\n\t'- has { \"operation\": \"has\", \"path\": \"<file>\" } — whether the file exists.',\n\t'- search { \"operation\": \"search\", \"query\": \"<text>\", \"regex\"?: bool, \"exact\"?: bool, \"limit\"?: int } — find lines matching the query across all files.',\n\t'- replace { \"operation\": \"replace\", \"query\": \"<text>\", \"replacement\": \"<text>\", \"regex\"?: bool, \"exact\"?: bool, \"limit\"?: int } — replace matches across all files.',\n\t'- write { \"operation\": \"write\", \"path\": \"<file>\", \"content\": \"<text>\" } — create or overwrite the whole file.',\n\t'- splice { \"operation\": \"splice\", \"path\": \"<file>\", \"content\": \"<text>\", \"fromLine\": int, \"fromColumn\": int, \"toLine\": int, \"toColumn\": int } — replace a 1-based range (from inclusive, to exclusive) with content.',\n\t'- prepend { \"operation\": \"prepend\", \"path\": \"<file>\", \"content\": \"<text>\" } — add content to the start of the file.',\n\t'- append { \"operation\": \"append\", \"path\": \"<file>\", \"content\": \"<text>\" } — add content to the end of the file.',\n\t'- move { \"operation\": \"move\", \"from\": \"<file>\", \"to\": \"<file>\" } — rename / move a file.',\n\t'- remove { \"operation\": \"remove\", \"path\": \"<file>\" } — delete a file.',\n\t'- workspaces { \"operation\": \"workspaces\" } — list the workspaces you can switch between (each id, file count, active).',\n\t'- switch { \"operation\": \"switch\", \"id\": \"<id>\" } — make the workspace with that id active (ids come from \"workspaces\").',\n\t'',\n\t'Notes: lines and columns are 1-based (column 1 is the first character). \"regex\" defaults to false (a literal substring), \"exact\" defaults to true (case-sensitive). \"search\"/\"replace\"/\"splice\" act only on text files. Editing with no active workspace auto-creates one.',\n\t'',\n\t'Example — write a file:',\n\tJSON.stringify(WORKSPACE_TOOL_EXAMPLE),\n].join('\\n')\n\n/**\n * The name {@link import('./factories.js').createDescribeTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n *\n * @remarks\n * Net-new: pairs with the other three tools' lean {@link AGENT_TOOL_SUMMARY} /\n * {@link WORKFLOW_TOOL_SUMMARY} / {@link WORKSPACE_TOOL_SUMMARY} — a model that reads only the\n * advertised summary can call `describe` with that tool's registered name to get its full\n * teaching description back.\n */\nexport const DESCRIBE_TOOL_NAME = 'describe'\n\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createDescribeTool}\n * advertises — this tool needs no teaching of its own, so its summary and description are both\n * short.\n */\nexport const DESCRIBE_TOOL_SUMMARY = 'Return the full description of a named registered tool.'\n\n/**\n * The DESCRIPTION {@link import('./factories.js').createDescribeTool} advertises.\n *\n * @remarks\n * Deliberately short — unlike the workflow / workspace / agent tools, this one has no authoring\n * schema or multi-step protocol to teach.\n */\nexport const DESCRIBE_TOOL_DESCRIPTION =\n\t'Return the full description of a registered tool by its name. Required: name - the registered tool name (see another tool listing for available names).'\n\n/**\n * The name {@link import('./factories.js').createPromptTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n */\nexport const PROMPT_TOOL_NAME = 'ask'\n\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createPromptTool}\n * advertises in place of {@link PROMPT_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const PROMPT_TOOL_SUMMARY =\n\t\"Ask another terminal a question and BLOCK until it answers; the call resolves with the answered value. Call describe('ask') for the required fields.\"\n\nexport const PROMPT_TOOL_DESCRIPTION = [\n\t'Ask another terminal a question and block until it answers. This call does not return until the addressed terminal answers, or the prompt fails.',\n\t'',\n\t'Required:',\n\t' to - the terminal name to ask.',\n\t' form - the prompt kind: one of \"input\", \"password\", \"confirm\", \"select\", \"checkbox\", \"editor\".',\n\t' message - the question shown to the answering terminal.',\n\t'Optional:',\n\t' options - form-specific options (e.g. choices for \"select\"/\"checkbox\").',\n\t'A cycle (two terminals asking each other) or an expired prompt fails the call with a typed error.',\n\t'Example:',\n\tJSON.stringify({ to: 'reviewer', form: 'confirm', message: 'Approve the release?' }),\n].join('\\n')\n\n/**\n * The name {@link import('./factories.js').createAnswerTool} advertises by default — the key a\n * model calls and the `ToolManagerInterface` (`@orkestrel/agent`) registers under.\n */\nexport const ANSWER_TOOL_NAME = 'answer'\n\n/**\n * The lean {@link import('@orkestrel/agent').ToolInterface.summary} {@link import('./factories.js').createAnswerTool}\n * advertises in place of {@link ANSWER_TOOL_DESCRIPTION} — a `ToolManagerInterface.definitions()`\n * (`@orkestrel/agent`) advertises `summary ?? description`, so this one-sentence text stands in\n * for the full teaching description; the full text stays retrievable via\n * {@link import('./factories.js').createDescribeTool}.\n */\nexport const ANSWER_TOOL_SUMMARY =\n\t\"List prompts addressed to this terminal, or answer one by id. Call describe('answer') for the required fields.\"\n\nexport const ANSWER_TOOL_DESCRIPTION = [\n\t'List the prompts currently addressed to this terminal, or answer one of them by id. Every call is ONE operation, chosen by the \"operation\" field.',\n\t'',\n\t'Operations:',\n\t'- pending { \"operation\": \"pending\" } — list every prompt currently addressed to this terminal (id, form, message, options, time).',\n\t'- answer { \"operation\": \"answer\", \"id\": \"<prompt id>\", \"value\": <answer value> } — answer the prompt with that id; \"value\" must match the prompt\\'s form (a string for \"input\"/\"password\"/\"editor\", a boolean for \"confirm\", a choice for \"select\", an array of choices for \"checkbox\").',\n\t'Example — list pending prompts:',\n\tJSON.stringify({ operation: 'pending' }),\n\t'Example — answer one:',\n\tJSON.stringify({ operation: 'answer', id: 'abc123', value: true }),\n].join('\\n')\n","import type { AgentToolErrorCode } from './types.js'\n\n// Tool-package errors — one error class per domain this package mints its own error for.\n// `@orkestrel/workflow`'s `WorkflowError` and `@orkestrel/agent`'s `WorkspaceError` already\n// cover the workflow tool + workspace tool's failure paths (imported and thrown as-is, never\n// duplicated here per §6). `createAgentTool` / `createDescribeTool` are net-new and none of\n// `@orkestrel/agent`'s error classes fit a pre-run validation / guard failure (`AgentJobError`\n// REQUIRES a settled partial `AgentResult` it cannot construct before a run starts;\n// `ConversationError` / `ProviderAbortError` / `WorkspaceError` are each scoped to an unrelated\n// domain) — so this package mints ONE typed error, `AgentToolError`, mirroring `WorkflowError`'s\n// exact shape (`code` + optional `context`) for the same reason: a thrown, machine-readable,\n// code-bearing error the tool-handler contract (AGENTS §14) requires, never a `{ error }`\n// return. `AgentToolError` is this package's general TOOL-CALL error — not scoped to agent\n// delegation alone — so `createDescribeTool` (a malformed call / an unknown tool name) reuses it\n// rather than minting a second class for the same `TOOL` misuse semantics.\n\n/**\n * Thrown by {@link import('./factories.js').createAgentTool}'s and\n * {@link import('./factories.js').createDescribeTool}'s handlers on every failure path — a\n * malformed / unresolvable call or an unknown tool name (`TOOL`), a delegation that would\n * exceed the configured depth bound or re-enter an ancestor (`DEPTH`), a prompt cycle\n * (`DEADLOCK`), a prompt that expired before it was answered (`EXPIRE`), or an answer that\n * failed to apply (`ANSWER`) — the last three thrown by\n * {@link import('./factories.js').createPromptTool} / {@link import('./factories.js').createAnswerTool}.\n *\n * @remarks\n * Carries a machine-readable `code` (see {@link import('./types.js').AgentToolErrorCode}) and\n * an optional `context` bag for structured diagnostics. The `ToolManagerInterface`\n * (`@orkestrel/agent`) isolates every throw into the canonical tool result's top-level `error`\n * (AGENTS §14) — nothing escapes the run.\n *\n * @example\n * ```ts\n * import { AgentToolError, isAgentToolError } from '@src/core'\n *\n * try {\n * \tthrow new AgentToolError('TOOL', 'task is required')\n * } catch (error) {\n * \tif (isAgentToolError(error)) console.log(error.code) // 'TOOL'\n * }\n * ```\n */\nexport class AgentToolError extends Error {\n\treadonly code: AgentToolErrorCode\n\treadonly context?: Readonly<Record<string, unknown>>\n\n\tconstructor(\n\t\tcode: AgentToolErrorCode,\n\t\tmessage: string,\n\t\tcontext?: Readonly<Record<string, unknown>>,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'AgentToolError'\n\t\tthis.code = code\n\t\tthis.context = context\n\t}\n}\n\n/**\n * Type guard narrowing an unknown caught value to an {@link AgentToolError}.\n *\n * @param value - The value to test (typically a `catch` binding)\n * @returns `true` when `value` is an {@link AgentToolError}\n *\n * @example\n * ```ts\n * import { isAgentToolError } from '@src/core'\n *\n * try {\n * \t// ...\n * } catch (error) {\n * \tif (isAgentToolError(error)) console.log(error.code)\n * }\n * ```\n */\nexport function isAgentToolError(value: unknown): value is AgentToolError {\n\treturn value instanceof AgentToolError\n}\n","import {\n\tarrayShape,\n\tbooleanShape,\n\tintegerShape,\n\tliteralShape,\n\tobjectShape,\n\toptionalShape,\n\tstringShape,\n\tunionShape,\n} from '@orkestrel/contract'\n\n// === Prompt / answer shapes (createPromptTool / createAnswerTool call args)\n//\n// `validate` is DECLARATIVE-ONLY here — a `Validator` is a function and cannot cross a JSON\n// Schema / contract boundary, so `promptToolShape`'s inline `validate` field keeps only the\n// primitive (`boolean` / `number` / `string`) rule fields `ValidationRules`\n// (`@orkestrel/terminal`) accepts; `custom` (a bare `Validator`) is DROPPED — mirrors\n// `serializeValidationRules`'s own function-stripping (`@orkestrel/terminal`).\n\n/**\n * The shape of {@link import('./factories.js').createPromptTool}'s call arguments — `to` (the\n * terminal identity to address), `form` (which of the six {@link import('@orkestrel/terminal').PromptType}\n * forms to ask), `message`, an optional `timeout` override, and every per-form optional field\n * FLATTENED onto one object (mirrors `workspaceToolShape`'s flat-arm style, but a single shared\n * shape rather than a discriminated union — `form` alone does not vary the REQUIRED fields, only\n * which of the optional ones apply, so a flat shape stays faithful without duplicating `to` /\n * `message` / `timeout` across six near-identical arms).\n *\n * @remarks\n * `choices` backs `'select'` / `'checkbox'`; `default` backs `'input'` / `'confirm'` / `'select'`\n * (a string for the first two forms' text default, `'true'`/`'false'` string for confirm — the\n * contract layer cannot vary a field's type by a sibling field's value, so `default` stays a\n * string and the handler coerces per form); `mask` backs `'password'`; `min` / `max` backs\n * `'checkbox'`; `validate` (declarative only) backs the four text-shaped forms\n * (`'input'` / `'password'` / `'confirm'` / `'editor'`).\n */\nexport const promptToolShape = objectShape({\n\tto: stringShape({ min: 1, description: 'The terminal identity to address the prompt to.' }),\n\tform: literalShape(['input', 'password', 'confirm', 'select', 'checkbox', 'editor'], {\n\t\tdescription: 'Which prompt form to ask.',\n\t}),\n\tmessage: stringShape({ min: 1, description: \"The prompt's question.\" }),\n\tdefault: optionalShape(\n\t\tstringShape({\n\t\t\tdescription:\n\t\t\t\t\"The default answer if the responder submits blank — 'input' / 'editor' text, 'confirm' 'true'/'false', or a 'select' choice value.\",\n\t\t}),\n\t),\n\tchoices: optionalShape(\n\t\tarrayShape(\n\t\t\tobjectShape({\n\t\t\t\tname: stringShape({\n\t\t\t\t\tmin: 1,\n\t\t\t\t\tdescription: 'The choice label shown to the answering party.',\n\t\t\t\t}),\n\t\t\t\tvalue: stringShape({\n\t\t\t\t\tmin: 1,\n\t\t\t\t\tdescription: 'The value submitted when this choice is picked.',\n\t\t\t\t}),\n\t\t\t\tdescription: optionalShape(\n\t\t\t\t\tstringShape({ description: 'An optional one-line elaboration.' }),\n\t\t\t\t),\n\t\t\t}),\n\t\t\t{ description: \"The selectable choices for 'select' / 'checkbox'.\" },\n\t\t),\n\t),\n\tmask: optionalShape(\n\t\tstringShape({\n\t\t\tmin: 1,\n\t\t\tdescription: \"The mask character 'password' renders in place of input.\",\n\t\t}),\n\t),\n\tmin: optionalShape(\n\t\tintegerShape({ min: 0, description: \"The minimum number of 'checkbox' selections required.\" }),\n\t),\n\tmax: optionalShape(\n\t\tintegerShape({ min: 0, description: \"The maximum number of 'checkbox' selections allowed.\" }),\n\t),\n\tvalidate: optionalShape(\n\t\tobjectShape({\n\t\t\trequired: optionalShape(booleanShape({ description: 'Reject an empty (trimmed) input.' })),\n\t\t\tminimum: optionalShape(\n\t\t\t\tintegerShape({\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tdescription: 'Reject an input shorter than this many characters.',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tmaximum: optionalShape(\n\t\t\t\tintegerShape({\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tdescription: 'Reject an input longer than this many characters.',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tpattern: optionalShape(\n\t\t\t\tstringShape({\n\t\t\t\t\tdescription: 'Reject an input that fails this regular-expression source.',\n\t\t\t\t}),\n\t\t\t),\n\t\t\temail: optionalShape(booleanShape({ description: 'Require a valid email-address shape.' })),\n\t\t\turl: optionalShape(booleanShape({ description: 'Require a valid URL shape.' })),\n\t\t\tnumeric: optionalShape(booleanShape({ description: 'Require a numeric value.' })),\n\t\t\tinteger: optionalShape(booleanShape({ description: 'Require an integer value.' })),\n\t\t\talphanumeric: optionalShape(\n\t\t\t\tbooleanShape({ description: 'Require letters and digits only.' }),\n\t\t\t),\n\t\t}),\n\t),\n\ttimeout: optionalShape(\n\t\tintegerShape({ min: 0, description: 'Milliseconds to wait before the prompt expires.' }),\n\t),\n})\n\n/**\n * The shape of {@link import('./factories.js').createAnswerTool}'s call arguments — discriminated\n * by `operation`: `'pending'` lists the prompts addressed to this tool's terminal, `'answer'`\n * resolves one by `id` with a `value`.\n *\n * @remarks\n * `value`'s type varies by the ORIGINAL prompt's form (`string` for `'input'` / `'password'` /\n * `'select'` / `'editor'`, `boolean` for `'confirm'`, `readonly string[]` for `'checkbox'`) —\n * `unionShape(stringShape(), booleanShape(), arrayShape(stringShape()))` expresses that\n * union directly, so `value` is typed as the full `string | boolean | readonly string[]` union\n * here (no lossy string-only fallback needed).\n */\nexport const answerToolShape = unionShape(\n\tobjectShape({\n\t\toperation: literalShape(['pending'], {\n\t\t\tdescription: 'List the prompts currently addressed to this terminal.',\n\t\t}),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['answer'], { description: 'Answer one pending prompt by id.' }),\n\t\tid: stringShape({ min: 1, description: 'The id of the pending prompt to answer.' }),\n\t\tvalue: unionShape(\n\t\t\tstringShape({ description: 'A text / select / editor answer.' }),\n\t\t\tbooleanShape({ description: 'A confirm answer.' }),\n\t\t\tarrayShape(stringShape(), { description: 'A checkbox answer — the checked values.' }),\n\t\t),\n\t}),\n)\n\n// Tool-package shapes — the shape VALUE each `create*Tool` factory (factories.ts) compiles into\n// the lockstep guard + parser + JSON Schema outputs (AGENTS §14). `agentToolShape` MUST agree\n// with the hand-written `AgentToolArguments` (types.ts), which is the source of truth.\n// `workflowStepsShape` / `workflowDraftShape` / `workspaceToolShape` are OWNED here now — ported\n// byte-faithfully from `@orkestrel/workflow` / `@orkestrel/agent` ahead of the upstream cleanup\n// that drops the authoring surface from those packages (this package becomes the defining home).\n\n/**\n * The shape of {@link import('./types.js').AgentToolArguments} —\n * {@link import('./factories.js').createAgentTool}'s advertised `parameters`.\n *\n * @remarks\n * `task` is the only required field (a non-empty string); `provider` / `tools` / `system`\n * are per-call overrides of the tool's own configured defaults.\n */\nexport const agentToolShape = objectShape({\n\ttask: stringShape({\n\t\tmin: 1,\n\t\tdescription: 'The instructions the sub-agent should carry out.',\n\t}),\n\tprovider: optionalShape(\n\t\tstringShape({\n\t\t\tmin: 1,\n\t\t\tdescription:\n\t\t\t\t'Registry key of the provider to run the sub-agent against (overrides the default).',\n\t\t}),\n\t),\n\ttools: optionalShape(\n\t\tarrayShape(stringShape({ min: 1 }), {\n\t\t\tdescription:\n\t\t\t\t'Registry keys of the tools loaded into the sub-agent (replaces the default list).',\n\t\t}),\n\t),\n\tsystem: optionalShape(\n\t\tstringShape({\n\t\t\tdescription: \"A system prompt seeding the sub-agent's context (overrides the default).\",\n\t\t}),\n\t),\n})\n\n/**\n * The shape of {@link import('./types.js').DescribeToolArguments} —\n * {@link import('./factories.js').createDescribeTool}'s advertised `parameters`.\n *\n * @remarks\n * `name` is the only field (a non-empty string) — the registered tool name to look up.\n */\nexport const describeToolShape = objectShape({\n\tname: stringShape({\n\t\tmin: 1,\n\t\tdescription: 'The registered name of the tool whose full description to return.',\n\t}),\n})\n\n// === Workflow draft / flat-steps shapes (OWNED here now, ported from `@orkestrel/workflow`)\n\n/**\n * The shape of a {@link import('./types.js').TaskDraft} — identical to a strict task shape\n * EXCEPT `id` and `name` are OPTIONAL.\n */\nexport const taskDraftShape = objectShape({\n\tid: optionalShape(stringShape({ min: 1, description: 'Task id; auto-filled when omitted.' })),\n\tname: optionalShape(\n\t\tstringShape({ min: 1, description: 'Task name; defaults to the id when omitted.' }),\n\t),\n\tdescription: optionalShape(stringShape({ description: 'Optional task description.' })),\n\trun: optionalShape(\n\t\tstringShape({\n\t\t\tmin: 1,\n\t\t\tdescription:\n\t\t\t\t'The registered behavior name to invoke (a registry key, not a label); omitted has no handler.',\n\t\t}),\n\t),\n\tretries: optionalShape(\n\t\tintegerShape({\n\t\t\tmin: 0,\n\t\t\tdescription:\n\t\t\t\t'Extra attempts after the first on failure; overrides the phase default. Omitted means none.',\n\t\t}),\n\t),\n\ttimeout: optionalShape(\n\t\tintegerShape({\n\t\t\tmin: 0,\n\t\t\tdescription:\n\t\t\t\t'Per-attempt deadline in milliseconds; overrides the phase default. Omitted means no deadline.',\n\t\t}),\n\t),\n})\n\n/**\n * The shape of a PHASE in a draft workflow — identical to a strict phase shape EXCEPT `id` and\n * `name` are OPTIONAL, and its tasks are {@link taskDraftShape}s.\n */\nexport const phaseDraftShape = objectShape({\n\tid: optionalShape(stringShape({ min: 1, description: 'Phase id; auto-filled when omitted.' })),\n\tname: optionalShape(\n\t\tstringShape({ min: 1, description: 'Phase name; defaults to the id when omitted.' }),\n\t),\n\tdescription: optionalShape(stringShape({ description: 'Optional phase description.' })),\n\ttasks: arrayShape(taskDraftShape, { description: 'The phase tasks; they run CONCURRENTLY.' }),\n\tconcurrency: optionalShape(\n\t\tintegerShape({\n\t\t\tmin: 1,\n\t\t\tdescription: 'Max tasks in flight at once (a resource throttle); omitted means unbounded.',\n\t\t}),\n\t),\n\tbail: optionalShape(\n\t\tliteralShape([true, false], {\n\t\t\tdescription: 'Per-phase failure-policy override; omitted inherits the workflow bail.',\n\t\t}),\n\t),\n})\n\n/**\n * The shape of a DRAFT workflow — identical to a strict workflow shape EXCEPT `id` and `name`\n * are OPTIONAL at all three levels (workflow / phase / task), so a small model can omit the six\n * identity strings and let the tool synthesize them positionally.\n *\n * @remarks\n * The lenient counterpart {@link import('./factories.js').createWorkflowDraftContract} compiles.\n * `run` stays required on the strict form; a provided `id` / `name` still has `minLength: 1` (so\n * an explicitly-empty `id: ''` is REJECTED, not auto-filled). After\n * {@link import('./helpers.js').completeDraft} fills the missing ids/names, the result is\n * validated against the STRICT `createWorkflowContract` (`@orkestrel/workflow`) gate before\n * running.\n */\nexport const workflowDraftShape = objectShape({\n\tid: optionalShape(stringShape({ min: 1, description: 'Workflow id; auto-filled when omitted.' })),\n\tname: optionalShape(\n\t\tstringShape({ min: 1, description: 'Workflow name; defaults to the id when omitted.' }),\n\t),\n\tdescription: optionalShape(stringShape({ description: 'Optional workflow description.' })),\n\tphases: arrayShape(phaseDraftShape, {\n\t\tdescription: 'The workflow phases; they run SEQUENTIALLY, in order.',\n\t}),\n\tbail: optionalShape(\n\t\tliteralShape([true, false], {\n\t\t\tdescription:\n\t\t\t\t'Failure policy: false (default) continues gracefully, true halts on the first failure.',\n\t\t}),\n\t),\n})\n\n/**\n * The shape of ONE flat step — `{ name }` — the building block of {@link workflowStepsShape}.\n *\n * @remarks\n * `name` is the REGISTERED behavior name the step runs (it becomes the task's `run`). The tool\n * expands each step into a one-task phase, in order ({@link import('./helpers.js').expandSteps}).\n */\nexport const stepShape = objectShape({\n\tname: stringShape({\n\t\tmin: 1,\n\t\tdescription: 'The registered behavior name this step runs (becomes the task run).',\n\t}),\n})\n\n/**\n * The FLAT authoring shape {@link import('./factories.js').createWorkflowTool} advertises as its\n * `parameters` — the simplest surface a small model can fill: `{ name?, steps: [{ name }] }`.\n *\n * @remarks\n * A deliberately-reduced surface: a flat ordered list of steps, each a `{ name }`. The tool\n * EXPANDS it ({@link import('./helpers.js').expandSteps}) into a full\n * {@link import('./types.js').WorkflowDefinition} — one one-task phase per step, in order —\n * then validates against the STRICT `createWorkflowContract` (`@orkestrel/workflow`) gate. The\n * full nested form is STILL accepted by the tool (it branches on the args' shape) and is\n * documented as the advanced escape-hatch in the tool's description — but THIS is what\n * `parameters` advertises.\n */\nexport const workflowStepsShape = objectShape({\n\tname: optionalShape(stringShape({ min: 1, description: 'Optional workflow name.' })),\n\tsteps: arrayShape(stepShape, {\n\t\tdescription: 'The ordered steps to run, one after another (each becomes a one-task phase).',\n\t}),\n})\n\n// === Workspace operation shape (OWNED here now, ported from `@orkestrel/agent`)\n\n/**\n * The shape of a {@link import('./types.js').WorkspaceOperation} — a descriptive tagged union\n * over the 13 workspace edit / read / navigation operations, discriminated by the `operation`\n * literal (never a bare `kind`; AGENTS §4.4). Each variant leads with its `operation`\n * discriminant then its FLAT fields, every field via `stringShape` / `optionalShape` /\n * `integerShape({ min: 1 })` / `booleanShape`, each carrying a strong field-level `description`.\n *\n * @remarks\n * The union compiles to an `anyOf` JSON Schema + a `unionOf` guard + a first-match parser\n * automatically ({@link import('./factories.js').createWorkspaceTool} types the result to the\n * hand-written {@link import('./types.js').WorkspaceOperation}). `limit` and the four `'splice'`\n * caret components are POSITIVE integers (`integerShape({ min: 1 })`); `regex` / `exact` are\n * `optionalShape(booleanShape(...))`. The two REGISTRY arms — `workspaces` (list the workspaces\n * the model can move between) and `switch` (re-point the active one by `id`) — let a model\n * DISCOVER then CHOOSE which workspace the edit / read arms target.\n */\nexport const workspaceToolShape = unionShape(\n\tobjectShape({\n\t\toperation: literalShape(['read'], { description: \"Read a whole text file's text by path.\" }),\n\t\tpath: stringShape({ description: 'The path of the file to read.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['list'], { description: 'List every file in the workspace.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['has'], { description: 'Check whether a file exists at the path.' }),\n\t\tpath: stringShape({ description: 'The path to check for.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['search'], {\n\t\t\tdescription: 'Search every text file for a query, returning each hit.',\n\t\t}),\n\t\tquery: stringShape({ description: 'The text (or regular-expression source) to search for.' }),\n\t\tregex: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription:\n\t\t\t\t\t'Treat the query as a regular expression. Defaults to false (a literal substring).',\n\t\t\t}),\n\t\t),\n\t\texact: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription: 'Match case-sensitively. Defaults to true (set false for case-insensitive).',\n\t\t\t}),\n\t\t),\n\t\tlimit: optionalShape(\n\t\t\tintegerShape({\n\t\t\t\tmin: 1,\n\t\t\t\tdescription: 'Stop after this many matches across all files. Omitted means unlimited.',\n\t\t\t}),\n\t\t),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['replace'], {\n\t\t\tdescription: 'Replace a query with a replacement across every text file.',\n\t\t}),\n\t\tquery: stringShape({ description: 'The text (or regular-expression source) to replace.' }),\n\t\treplacement: stringShape({ description: 'The text to substitute for each match.' }),\n\t\tregex: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription:\n\t\t\t\t\t'Treat the query as a regular expression. Defaults to false (a literal substring).',\n\t\t\t}),\n\t\t),\n\t\texact: optionalShape(\n\t\t\tbooleanShape({\n\t\t\t\tdescription: 'Match case-sensitively. Defaults to true (set false for case-insensitive).',\n\t\t\t}),\n\t\t),\n\t\tlimit: optionalShape(\n\t\t\tintegerShape({\n\t\t\t\tmin: 1,\n\t\t\t\tdescription: 'Stop after this many replacements across all files. Omitted means unlimited.',\n\t\t\t}),\n\t\t),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['write'], {\n\t\t\tdescription: 'Create or overwrite a whole file with content.',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the file to write.' }),\n\t\tcontent: stringShape({ description: 'The full new contents of the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['splice'], {\n\t\t\tdescription:\n\t\t\t\t'Replace a 1-based range of an existing text file (from inclusive, to exclusive) with content.',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the text file to edit.' }),\n\t\tcontent: stringShape({ description: 'The text to splice in place of the range.' }),\n\t\tfromLine: integerShape({\n\t\t\tmin: 1,\n\t\t\tdescription: 'The 1-based start line of the range (inclusive).',\n\t\t}),\n\t\tfromColumn: integerShape({\n\t\t\tmin: 1,\n\t\t\tdescription:\n\t\t\t\t'The 1-based start column of the range (inclusive; column 1 is the first character).',\n\t\t}),\n\t\ttoLine: integerShape({ min: 1, description: 'The 1-based end line of the range (exclusive).' }),\n\t\ttoColumn: integerShape({\n\t\t\tmin: 1,\n\t\t\tdescription: 'The 1-based end column of the range (exclusive).',\n\t\t}),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['prepend'], {\n\t\t\tdescription: 'Add content to the start of a file (creating it when absent).',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the file to prepend to.' }),\n\t\tcontent: stringShape({ description: 'The text to add at the start of the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['append'], {\n\t\t\tdescription: 'Add content to the end of a file (creating it when absent).',\n\t\t}),\n\t\tpath: stringShape({ description: 'The path of the file to append to.' }),\n\t\tcontent: stringShape({ description: 'The text to add at the end of the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['move'], {\n\t\t\tdescription: 'Rename or move a file (overwriting an occupied target).',\n\t\t}),\n\t\tfrom: stringShape({ description: 'The current path of the file.' }),\n\t\tto: stringShape({ description: 'The new path for the file.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['remove'], { description: 'Delete a file from the workspace.' }),\n\t\tpath: stringShape({ description: 'The path of the file to remove.' }),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['workspaces'], {\n\t\t\tdescription:\n\t\t\t\t'List the workspaces you can move between (each id, file count, and whether it is active), so you can pick an id to switch to.',\n\t\t}),\n\t}),\n\tobjectShape({\n\t\toperation: literalShape(['switch'], {\n\t\t\tdescription:\n\t\t\t\t'Switch the active workspace to the one with this id (get ids from the \"workspaces\" operation). Edit and read operations then target it.',\n\t\t}),\n\t\tid: stringShape({\n\t\t\tdescription: 'The id of the workspace to make active (from the \"workspaces\" listing).',\n\t\t}),\n\t}),\n)\n","import type { WorkflowDefinition, WorkflowResult, WorkflowStatus } from '@orkestrel/workflow'\nimport type { PromptType } from '@orkestrel/terminal'\nimport type { AgentToolErrorCode } from './types.js'\nimport type { PhaseDraft, TaskDraft, WorkflowDraft, WorkflowSteps } from './types.js'\nimport { isTerminalError } from '@orkestrel/terminal'\n\n// Tool-package helpers — OWNED here now, ported byte-faithfully from `@orkestrel/workflow` ahead\n// of the upstream cleanup that drops the authoring surface from that package (this package\n// becomes the defining home for the workflow tool's lenient-authoring pipeline and its ancestry\n// tagging).\n\n/**\n * The ancestry identifier of a workflow in a run chain — `workflow:<id>`.\n *\n * @remarks\n * Namespacing keeps a workflow id and an {@link agentTag} agent name in ONE set without\n * collision, so re-entering a workflow OR an agent already in the chain is a single `includes`\n * check.\n *\n * @param id - The workflow definition's `id`\n * @returns The namespaced ancestry tag (`workflow:<id>`)\n */\nexport function workflowTag(id: string): string {\n\treturn `workflow:${id}`\n}\n\n/**\n * The ancestry identifier of an agent in a run chain — `agent:<name>`.\n *\n * @remarks\n * The agent counterpart of {@link workflowTag}: {@link import('./factories.js').createAgentFunction}\n * / {@link import('./factories.js').createWorkflowTool} guard against re-entering an agent or\n * workflow already in the chain (a typed `DEPTH` `WorkflowError`, `@orkestrel/workflow`). The\n * `agent:` namespace keeps it distinct from a same-string workflow id.\n *\n * @param name - The agent's identifier / registry name\n * @returns The namespaced ancestry tag (`agent:<name>`)\n */\nexport function agentTag(name: string): string {\n\treturn `agent:${name}`\n}\n\n/**\n * Build the plain success summary {@link import('./factories.js').createWorkflowTool} returns on\n * a completed run — the universal tool-handler contract (AGENTS §14): return a plain value on\n * success, appearing identically over BOTH the agent loop and MCP.\n *\n * @remarks\n * The summary is LEAN: the workflow's terminal `status` and the COUNT of settled task results —\n * enough for a caller / model to react without serializing the whole live tree. (It carries no\n * synthetic `id` / `name`: a tool handler has no call id; the `ToolManagerInterface`\n * (`@orkestrel/agent`) supplies the canonical envelope's identity.)\n *\n * @param result - The terminal `WorkflowResult` (`@orkestrel/workflow`) the run produced\n * @returns The plain success summary — `{ status, count }`\n */\nexport function workflowToolSummary(\n\tresult: WorkflowResult,\n): Readonly<{ status: WorkflowStatus; count: number }> {\n\treturn { status: result.status, count: result.results.length }\n}\n\n// === Draft completion + flat-steps expansion (the tool's LENIENT authoring surfaces)\n//\n// Pure, deterministic synthesis that turns a WIDENED authoring form into a strict\n// `WorkflowDefinition` (`@orkestrel/workflow`). They auto-fill only OMITTED identity (a provided\n// id/name is preserved verbatim; an explicitly-empty `id: ''` is rejected UPSTREAM by the draft\n// contract, never reached here), so a small model can author a complete tree without emitting\n// the six required `id`/`name` strings. The factory re-validates the result against the STRICT\n// `createWorkflowContract().is` gate before running (soundness).\n\n/**\n * Complete a {@link WorkflowDraft} into a strict {@link WorkflowDefinition} — synthesize any\n * MISSING `id` deterministically + positionally, and default any MISSING `name` to its\n * (now-resolved) `id`.\n *\n * @remarks\n * The positional id scheme is stable and human-legible: the workflow is `wf`, phase `i` is\n * `phase-<i>`, and task `j` of that phase is `<phaseId>-task-<j>` (so a provided phase id flows\n * into its tasks' synthesized ids). A PROVIDED `id` / `name` at any level is kept VERBATIM —\n * synthesis touches only the omitted ones. A missing `name` defaults to the resolved `id` (never\n * the other way round), so the result always has both. `run`, `description`, the per-phase\n * `concurrency` / `bail`, the per-task `retries` / `timeout`, and the workflow `bail` carry over\n * unchanged. The result is a complete {@link WorkflowDefinition}; the caller still validates it\n * against the STRICT contract.\n *\n * @param draft - The draft workflow (id/name optional at all three levels)\n * @returns A complete {@link WorkflowDefinition} with every id/name filled\n */\nexport function completeDraft(draft: WorkflowDraft): WorkflowDefinition {\n\tconst id = draft.id ?? 'wf'\n\treturn {\n\t\tid,\n\t\tname: draft.name ?? id,\n\t\t...(draft.description === undefined ? {} : { description: draft.description }),\n\t\tphases: draft.phases.map((phase, index) => completePhaseDraft(phase, index)),\n\t\t...(draft.bail === undefined ? {} : { bail: draft.bail }),\n\t}\n}\n\n/**\n * Complete one {@link PhaseDraft} into a strict phase definition — the per-phase step of\n * {@link completeDraft} (phase `index` → `phase-<index>` when its id is omitted).\n *\n * @param phase - The draft phase\n * @param index - The phase's positional index in the workflow\n * @returns A complete phase definition\n */\nexport function completePhaseDraft(\n\tphase: PhaseDraft,\n\tindex: number,\n): WorkflowDefinition['phases'][number] {\n\tconst id = phase.id ?? `phase-${index}`\n\treturn {\n\t\tid,\n\t\tname: phase.name ?? id,\n\t\t...(phase.description === undefined ? {} : { description: phase.description }),\n\t\ttasks: phase.tasks.map((task, taskIndex) => completeTaskDraft(task, id, taskIndex)),\n\t\t...(phase.concurrency === undefined ? {} : { concurrency: phase.concurrency }),\n\t\t...(phase.bail === undefined ? {} : { bail: phase.bail }),\n\t}\n}\n\n/**\n * Complete one {@link TaskDraft} into a strict task definition — the per-task leaf step of\n * {@link completeDraft} (task `index` of phase `<phaseId>` → `<phaseId>-task-<index>` when its id\n * is omitted).\n *\n * @param task - The draft task\n * @param phaseId - The (resolved) parent phase id, so the synthesized task id nests under it\n * @param index - The task's positional index within its phase\n * @returns A complete task definition\n */\nexport function completeTaskDraft(\n\ttask: TaskDraft,\n\tphaseId: string,\n\tindex: number,\n): WorkflowDefinition['phases'][number]['tasks'][number] {\n\tconst id = task.id ?? `${phaseId}-task-${index}`\n\treturn {\n\t\tid,\n\t\tname: task.name ?? id,\n\t\t...(task.description === undefined ? {} : { description: task.description }),\n\t\t...(task.run === undefined ? {} : { run: task.run }),\n\t\t...(task.retries === undefined ? {} : { retries: task.retries }),\n\t\t...(task.timeout === undefined ? {} : { timeout: task.timeout }),\n\t}\n}\n\n/**\n * Expand a flat {@link WorkflowSteps} blob into a strict {@link WorkflowDefinition} — each step\n * becomes a one-task phase, IN ORDER.\n *\n * @remarks\n * The expansion of the tool's ADVERTISED surface: the deliberately-reduced flat form. Each\n * {@link import('./types.js').WorkflowStep} maps to a phase holding exactly one task: the step's\n * `name` becomes the task's `run` (the behavior-registry key). Ids/names are auto-filled\n * positionally — it builds an ids-omitted {@link WorkflowDraft} and delegates to\n * {@link completeDraft}, so the two lenient surfaces share ONE synthesis path (step `i` → phase\n * `phase-<i>`, its task `phase-<i>-task-0`). The optional `name` becomes the workflow's `name`.\n * The result is a complete definition the caller validates against the STRICT contract before\n * running.\n *\n * @param flat - The flat steps blob (`{ name?, steps: [{ name }] }`)\n * @returns A complete {@link WorkflowDefinition} (one one-task phase per step)\n */\nexport function expandSteps(flat: WorkflowSteps): WorkflowDefinition {\n\treturn completeDraft({\n\t\t...(flat.name === undefined ? {} : { name: flat.name }),\n\t\tphases: flat.steps.map((step) => ({\n\t\t\ttasks: [{ run: step.name }],\n\t\t})),\n\t})\n}\n\n// === Terminal-tool answer coercion + error-code mapping (the tool's answer surface)\n\n/**\n * Normalize an LLM-supplied answer `value` to the type {@link PromptType} `form` expects, so a\n * caller that only ever emits strings can still answer a typed prompt.\n *\n * @remarks\n * `'confirm'` coerces to a `boolean` — a `boolean` passes through, and the strings `'true'` /\n * `'false'` (case-insensitively) map to it; any other string is truthy-coerced via\n * `Boolean(value)`. `'checkbox'` coerces to `readonly string[]` — an array passes through\n * (stringifying each entry), a comma-separated string splits + trims into one, and any other\n * single (non-comma) string becomes a one-item array. Every other form (`'input'` / `'password'`\n * / `'select'` / `'editor'`) coerces to a plain `string` — a string passes through verbatim; a\n * non-string, non-object scalar (`number` / `boolean`) stringifies via `String(value)`; an\n * object or array (no lossless string form) falls back to `''` rather than serializing garbage.\n * Pure and total — never throws.\n *\n * @param form - The {@link PromptType} the answer is being coerced FOR\n * @param value - The raw, LLM-supplied answer value\n * @returns The coerced answer — `boolean` for `'confirm'`, `readonly string[]` for `'checkbox'`,\n * `string` otherwise\n */\nexport function coerceAnswer(\n\tform: PromptType,\n\tvalue: unknown,\n): string | boolean | readonly string[] {\n\tif (form === 'confirm') {\n\t\tif (typeof value === 'boolean') return value\n\t\tif (typeof value === 'string') {\n\t\t\tconst lower = value.trim().toLowerCase()\n\t\t\tif (lower === 'true') return true\n\t\t\tif (lower === 'false') return false\n\t\t}\n\t\treturn Boolean(value)\n\t}\n\tif (form === 'checkbox') {\n\t\tif (Array.isArray(value)) return value.map((entry) => String(entry))\n\t\tif (typeof value === 'string') {\n\t\t\tif (value.includes(',')) return value.split(',').map((entry) => entry.trim())\n\t\t\treturn [value]\n\t\t}\n\t\treturn [String(value)]\n\t}\n\t// The remaining text-shaped forms ('input'/'password'/'select'/'editor').\n\tif (typeof value === 'string') return value\n\tif (typeof value === 'object' && value !== null) return ''\n\treturn String(value)\n}\n\n/**\n * Map a caught error to the {@link AgentToolErrorCode} the terminal-tool factory should throw\n * with — the pure classification step of that factory's error handling.\n *\n * @remarks\n * Narrows `error` with {@link isTerminalError} (`@orkestrel/terminal`) first: a non-`TerminalError`\n * value returns `undefined`, telling the caller this mapper does not apply (rethrow / handle\n * otherwise). For a genuine `TerminalError`, `'DEADLOCK'` maps to `'DEADLOCK'`, `'EXPIRE'` maps\n * to `'EXPIRE'`, and every other {@link import('@orkestrel/terminal').TerminalErrorCode}\n * (`'TARGET'`, `'CANCEL'`, `'DRIVER'`) maps to the generic `'TOOL'` code. The mapper only\n * classifies — the factory performs the actual throw.\n *\n * @param error - The value caught from a terminal-manager operation (`ask` / `answer` / …)\n * @returns The mapped {@link AgentToolErrorCode}, or `undefined` if `error` is not a `TerminalError`\n */\nexport function terminalToolCode(error: unknown): AgentToolErrorCode | undefined {\n\tif (!isTerminalError(error)) return undefined\n\tif (error.code === 'DEADLOCK') return 'DEADLOCK'\n\tif (error.code === 'EXPIRE') return 'EXPIRE'\n\treturn 'TOOL'\n}\n","import type { ContractInterface } from '@orkestrel/contract'\nimport type {\n\tAgentInterface,\n\tAgentRegistryInterface,\n\tToolInterface,\n\tToolManagerInterface,\n\tWorkspaceManagerInterface,\n} from '@orkestrel/agent'\nimport type {\n\tWorkflowDefinition,\n\tWorkflowFunction,\n\tWorkflowRunnerInterface,\n} from '@orkestrel/workflow'\nimport type {\n\tAgentFunctionOptions,\n\tAgentToolOptions,\n\tAnswerToolOptions,\n\tPromptToolOptions,\n\tWorkflowDraft,\n\tWorkflowSteps,\n\tWorkflowToolOptions,\n\tWorkspaceOperation,\n\tWorkspaceToolOptions,\n} from './types.js'\nimport {\n\tcreateTool,\n\tcreateWorkspaceManager,\n\tisText,\n\trangeOf,\n\tWorkspaceError,\n} from '@orkestrel/agent'\nimport { createContract, schemaToParameters } from '@orkestrel/contract'\nimport { isTerminalError } from '@orkestrel/terminal'\nimport { createWorkflowContract, WorkflowError } from '@orkestrel/workflow'\nimport {\n\tAGENT_TOOL_DEPTH,\n\tAGENT_TOOL_DESCRIPTION,\n\tAGENT_TOOL_NAME,\n\tAGENT_TOOL_SUMMARY,\n\tANSWER_TOOL_DESCRIPTION,\n\tANSWER_TOOL_NAME,\n\tANSWER_TOOL_SUMMARY,\n\tDESCRIBE_TOOL_DESCRIPTION,\n\tDESCRIBE_TOOL_NAME,\n\tDESCRIBE_TOOL_SUMMARY,\n\tMAX_WORKFLOW_DEPTH,\n\tPROMPT_TOOL_DESCRIPTION,\n\tPROMPT_TOOL_NAME,\n\tPROMPT_TOOL_SUMMARY,\n\tWORKFLOW_TOOL_DESCRIPTION,\n\tWORKFLOW_TOOL_NAME,\n\tWORKFLOW_TOOL_SUMMARY,\n\tWORKSPACE_TOOL_DESCRIPTION,\n\tWORKSPACE_TOOL_NAME,\n\tWORKSPACE_TOOL_SUMMARY,\n} from './constants.js'\nimport { AgentToolError } from './errors.js'\nimport {\n\tagentTag,\n\tcoerceAnswer,\n\tcompleteDraft,\n\texpandSteps,\n\tterminalToolCode,\n\tworkflowTag,\n\tworkflowToolSummary,\n} from './helpers.js'\nimport {\n\tagentToolShape,\n\tanswerToolShape,\n\tdescribeToolShape,\n\tpromptToolShape,\n\tworkflowDraftShape,\n\tworkflowStepsShape,\n\tworkspaceToolShape,\n} from './shapers.js'\n\n// This package's tool factories. `createWorkflowTool` / `createWorkspaceTool` OWN their full\n// handler logic now (ported byte-faithfully from `@orkestrel/workflow` / `@orkestrel/agent` ahead\n// of the upstream cleanup that drops the authoring surface from those packages) and additionally\n// layer a pluggable store slot on top; `createAgentTool` is net-new: sub-agent delegation over an\n// `AgentRegistryInterface`.\n\n/**\n * Wrap a registered tool as a {@link WorkflowFunction} (`@orkestrel/workflow`) — the OPT-IN\n * adapter that lets a `function`-form task run a `@orkestrel/agent` tool BY NAME.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Composes into a caller's\n * `WorkflowOptions.functions` registry like any other behavior\n * (`{ publish: createToolFunction(tools, 'publish') }`); the pure workflow runner has no\n * knowledge of tools itself. The returned function executes `name` against `tools` with the\n * task's `controller.input` as the call arguments, id-correlated to the task's own id. A\n * `ToolManagerInterface.execute` (`@orkestrel/agent`) NEVER throws (a handler throw is isolated\n * into `result.error`), so a failing tool is surfaced here as a THROWN `Error` carrying the\n * original message as `cause` — the leaf `fail`s, honouring `bail`. An UNREGISTERED tool name is\n * a programmer error (an explicit binding to a name that doesn't exist) — unlike the engine's\n * own silent auto-complete of an unresolved task handler, this THROWS a typed `TOOL`\n * `WorkflowError` (`@orkestrel/workflow`).\n *\n * @param tools - The `ToolManagerInterface` (`@orkestrel/agent`) the named tool is registered on\n * @param name - The registered tool's name\n * @returns A {@link WorkflowFunction} that runs the named tool\n *\n * @example\n * ```ts\n * import { createToolFunction } from '@src/core'\n * import { createToolManager } from '@orkestrel/agent'\n * import { createWorkflowRunner } from '@orkestrel/workflow'\n *\n * const tools = createToolManager()\n * tools.add(myPublishTool)\n * const runner = createWorkflowRunner()\n * await runner.execute(definition, { functions: { publish: createToolFunction(tools, 'publish') } })\n * ```\n */\nexport function createToolFunction(tools: ToolManagerInterface, name: string): WorkflowFunction {\n\treturn async (controller) => {\n\t\tconst tool = tools.tool(name)\n\t\tif (tool === undefined) {\n\t\t\tthrow new WorkflowError('TOOL', `tool '${name}' is not registered`, { tool: name })\n\t\t}\n\t\tconst result = await tools.execute({\n\t\t\tid: controller.task.id,\n\t\t\tname,\n\t\t\targuments: controller.input,\n\t\t})\n\t\t// A `tool` result NEVER throws — the manager isolates a handler throw into `result.error`.\n\t\t// Surface that as a task failure (so a failing tool `fail`s the leaf, honouring `bail`).\n\t\t// The manager already flattened the original throw to a string, so the message IS the\n\t\t// richest surviving detail — `cause` carries that same string, nothing deeper exists.\n\t\tif (result.error !== undefined) throw new Error(result.error, { cause: result.error })\n\t\treturn result.value\n\t}\n}\n\n/**\n * Wrap a live `AgentInterface` (`@orkestrel/agent`) as a {@link WorkflowFunction}\n * (`@orkestrel/workflow`) — the OPT-IN adapter that runs the agent to a settled result, folding\n * a nested workflow-authoring depth / cycle guard into its own closure.\n *\n * @remarks\n * OWNED here now (ported from `@orkestrel/workflow`). Composes into a caller's\n * `WorkflowOptions.functions` registry like any other behavior; the pure workflow runner has no\n * knowledge of agents itself. Before running the agent, the depth/cycle guard REJECTS the call\n * (a THROWN typed `DEPTH` `WorkflowError`, which the leaf `fail`s) when running it would push a\n * nested chain past {@link import('./constants.js').MAX_WORKFLOW_DEPTH}, OR when this agent is\n * already an ancestor (a cycle). When {@link import('./types.js').AgentFunctionOptions.runner}\n * is supplied, the adapter BINDS a depth/cycle-aware {@link createWorkflowTool} onto the agent's\n * `context.tools` (the propagation seam) — closed over `depth` and the extended ancestry (the\n * tool itself computes `depth + 1` internally) — so the agent can author + run a NESTED workflow\n * through it; the wrapped default is the CURRENT task's own workflow id (used only on a no-args\n * tool call). The task's cancellation folds into the agent run: an already-aborted\n * `controller.signal` cancels the agent up front; otherwise a one-shot listener fires\n * `agent.abort(reason)` when the task cancels, removed in `finally`. `agent.generate()` resolves\n * a partial `AgentResult` on a cancel (never rejects), returned as the task's completed value.\n *\n * A bound agent is effectively SINGLE-RUN: `context.tools.add` binds one `ToolInterface` under\n * the fixed {@link import('./constants.js').WORKFLOW_TOOL_NAME}, and `agent.generate()` /\n * `agent.abort()` are per-agent state. Two CONCURRENT tasks sharing the SAME `agent` instance\n * race on that one tool binding (last-write-wins) and on generate/abort — give each concurrent\n * task its OWN agent instance.\n *\n * @param agent - The live `AgentInterface` to run\n * @param options - The nested-workflow binding + depth/cycle bookkeeping (see {@link import('./types.js').AgentFunctionOptions})\n * @returns A {@link WorkflowFunction} that runs `agent` to its settled result\n *\n * @example\n * ```ts\n * import { createAgentFunction } from '@src/core'\n * import { createWorkflowRunner } from '@orkestrel/workflow'\n *\n * const runner = createWorkflowRunner()\n * const review = createAgentFunction(myAgent, { runner })\n * await runner.execute(definition, { functions: { review } })\n * ```\n */\nexport function createAgentFunction(\n\tagent: AgentInterface,\n\toptions?: AgentFunctionOptions,\n): WorkflowFunction {\n\treturn async (controller) => {\n\t\tconst depth = options?.depth ?? 0\n\t\tconst ancestry = options?.ancestry ?? []\n\t\t// GUARD (before running the agent): running it would let it author + run a NESTED workflow\n\t\t// at `depth + 1`, so reject when that would exceed the bound, OR when this agent is already\n\t\t// an ancestor (a re-entry cycle). The throw becomes the leaf's typed `DEPTH` failure.\n\t\tif (depth + 1 > MAX_WORKFLOW_DEPTH) {\n\t\t\tthrow new WorkflowError('DEPTH', `agent '${agent.id}' exceeds max workflow depth`, {\n\t\t\t\tagent: agent.id,\n\t\t\t\tdepth,\n\t\t\t\tmax: MAX_WORKFLOW_DEPTH,\n\t\t\t})\n\t\t}\n\t\tconst tag = agentTag(agent.id)\n\t\tif (ancestry.includes(tag)) {\n\t\t\tthrow new WorkflowError('DEPTH', `agent '${agent.id}' is already an ancestor (cycle)`, {\n\t\t\t\tagent: agent.id,\n\t\t\t\tancestry: [...ancestry],\n\t\t\t})\n\t\t}\n\t\t// BIND the workflow tool so the agent can fan out into a nested workflow at `depth + 1` with\n\t\t// THIS agent added to the ancestry — the propagation across the agent/tool boundary (closed\n\t\t// over the tool at bind time, since a tool handler receives no ambient context). The current\n\t\t// task's own workflow id is the tool's WRAPPED default, used only on a no-args call.\n\t\tconst runner = options?.runner\n\t\tif (runner !== undefined) {\n\t\t\tconst workflowId = controller.task.phase.workflow.id\n\t\t\tconst wrapped: WorkflowDefinition = { id: workflowId, name: workflowId, phases: [] }\n\t\t\tagent.context.tools.add(\n\t\t\t\tcreateWorkflowTool(wrapped, runner, { depth, ancestry: [...ancestry, tag] }),\n\t\t\t)\n\t\t}\n\t\t// Fold the task's cancellation into the agent run: an already-aborted signal cancels the\n\t\t// agent up front; otherwise a one-shot listener fires `agent.abort(reason)` when the task\n\t\t// cancels. `generate()` RESOLVES a partial on a cancel (never rejects).\n\t\tconst signal = controller.signal\n\t\tconst onAbort = (): void => agent.abort(signal.reason)\n\t\tif (signal.aborted) {\n\t\t\tagent.abort(signal.reason)\n\t\t} else {\n\t\t\tsignal.addEventListener('abort', onAbort, { once: true })\n\t\t}\n\t\ttry {\n\t\t\treturn await agent.generate()\n\t\t} finally {\n\t\t\tsignal.removeEventListener('abort', onAbort)\n\t\t}\n\t}\n}\n\n/**\n * Compile the LENIENT workflow DRAFT contract — identical to `createWorkflowContract`\n * (`@orkestrel/workflow`) EXCEPT `id` and `name` are OPTIONAL at all three levels (workflow /\n * phase / task), so a small model can omit the six identity strings.\n *\n * @remarks\n * The widened authoring surface {@link createWorkflowTool} parses an authored blob through\n * before {@link import('./helpers.js').completeDraft} fills the missing ids/names. It does NOT\n * relax the canonical contract — `createWorkflowContract` (`@orkestrel/workflow`) stays\n * byte-for-byte unchanged and STRICT, and the completed draft is re-validated against THAT\n * strict gate before running (soundness preserved). A PROVIDED `id` / `name` still carries\n * `minLength: 1`, so an explicitly-empty `id: ''` is REJECTED (parses to `undefined`), never\n * auto-filled — keeping \"garbage\" distinct from \"omitted\". `run` stays optional (a plain name\n * string).\n *\n * @returns The compiled {@link import('./types.js').WorkflowDraft} contract\n *\n * @example\n * ```ts\n * import { createWorkflowDraftContract, completeDraft } from '@src/core'\n *\n * const draft = createWorkflowDraftContract()\n * const parsed = draft.parse({ phases: [{ tasks: [{ run: 'compile' }] }] })\n * const definition = parsed && completeDraft(parsed) // ids/names filled positionally\n * draft.parse({ id: '', phases: [] }) // undefined — an explicit empty id is rejected\n * ```\n */\nexport function createWorkflowDraftContract(): ContractInterface<WorkflowDraft> {\n\treturn createContract(workflowDraftShape)\n}\n\n/**\n * Wrap a {@link WorkflowDefinition} as an LLM-callable tool — it ADVERTISES the SIMPLE flat\n * authoring shape (`{ name?, steps: [{ name }] }`) as its `parameters` so even a small model can\n * author a complete tree, and its handler EXPANDS / COMPLETES the authored blob, validates it\n * against the STRICT contract, runs it through `runner`, and, when\n * {@link import('./types.js').WorkflowToolOptions.store} is supplied, PERSISTS each executed\n * workflow's final snapshot after the run settles.\n *\n * @remarks\n * A plain `ToolManagerInterface`-compatible tool (`@orkestrel/agent`), reproducing\n * `@orkestrel/workflow`'s former call contract exactly (flat / draft / full authoring forms, the\n * strict soundness gate, the depth/cycle guard). It is ALSO the propagation carrier\n * {@link createAgentFunction} binds onto a wrapped agent's `context.tools`: because a tool\n * handler receives ONLY the model-supplied `args` (no ambient context, no signal), the run's\n * depth + ancestry are CLOSED OVER at bind time via {@link import('./types.js').WorkflowToolOptions},\n * and the handler enforces the SAME depth / cycle guard itself before running the nested\n * workflow at `depth + 1` with the extended ancestry.\n *\n * **Widened authoring surface (additive — the canonical contract + runner stay STRICT and\n * unchanged).** A 2B model reliably CALLS the tool but cannot reliably emit the full four-level\n * nested {@link WorkflowDefinition} (six required `id`/`name` strings, an all-or-nothing tree).\n * So the tool ACCEPTS three authoring forms and converges them on the SAME strict\n * `createWorkflowContract` gate before running (soundness preserved):\n * - the FLAT shape `{ name?, steps: [{ name }] }` — the ADVERTISED `parameters` (the simplest\n * form, {@link import('./helpers.js').expandSteps}'d into one one-task phase per step);\n * - a nested DRAFT with any `id`/`name` OMITTED — {@link createWorkflowDraftContract}-parsed then\n * {@link import('./helpers.js').completeDraft}'d (missing ids synthesized positionally);\n * - the full nested {@link WorkflowDefinition} — the advanced escape-hatch, accepted as the draft\n * super-set.\n *\n * The universal tool-handler contract (AGENTS §14): returns the plain run summary\n * (`{ status, count }`) on success, THROWS a typed `WorkflowError` (`@orkestrel/workflow`) on\n * every failure path — malformed authored args (`TOOL`), or an over-deep / cyclic nested run\n * (`DEPTH`). The `ToolManagerInterface` isolates every throw into the canonical tool result's\n * top-level `error`, so nothing escapes the run. `options.depth` / `options.ancestry` are the\n * propagation carrier across a workflow → agent → workflow chain; `options.store` is this\n * package's ADDITION — the persisted snapshot is retrievable via the store afterwards (a caller\n * restores it through `@orkestrel/workflow`'s own `Workflow.restore` / store-backed factories).\n *\n * @param definition - The workflow the tool runs when called with no authored args\n * @param runner - The `WorkflowRunnerInterface` (`@orkestrel/workflow`) that executes the (nested) workflow\n * @param options - Depth/ancestry bookkeeping plus the optional durable store (see {@link import('./types.js').WorkflowToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').WORKFLOW_TOOL_NAME}) whose\n * `parameters` advertise the flat authoring schema\n *\n * @example\n * ```ts\n * import { createWorkflowTool } from '@src/core'\n * import { createWorkflowRunner, createMemoryWorkflowStore } from '@orkestrel/workflow'\n * import { createToolManager } from '@orkestrel/agent'\n *\n * const runner = createWorkflowRunner()\n * const store = createMemoryWorkflowStore()\n * const tool = createWorkflowTool(definition, runner, { store })\n * const tools = createToolManager()\n * tools.add(tool) // authored runs are now persisted to `store` on settle\n * ```\n */\nexport function createWorkflowTool(\n\tdefinition: WorkflowDefinition,\n\trunner: WorkflowRunnerInterface,\n\toptions?: WorkflowToolOptions,\n): ToolInterface {\n\tconst strict = createWorkflowContract()\n\tconst draft = createWorkflowDraftContract()\n\tconst steps: ContractInterface<WorkflowSteps> = createContract(workflowStepsShape)\n\tconst depth = options?.depth ?? 0\n\tconst ancestry = options?.ancestry ?? []\n\tconst store = options?.store\n\tconst parameters = schemaToParameters(steps.schema)\n\treturn createTool({\n\t\tname: WORKFLOW_TOOL_NAME,\n\t\tdescription: WORKFLOW_TOOL_DESCRIPTION,\n\t\tsummary: WORKFLOW_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\t// Branch on the authored args' SHAPE (no ambient context — a tool handler gets only\n\t\t\t// `args`): empty ⇒ the wrapped definition; a `steps` array ⇒ the FLAT form, parsed +\n\t\t\t// expanded; otherwise the nested DRAFT form, parsed + completed. A parse failure leaves\n\t\t\t// `target` undefined ⇒ the strict gate below throws `TOOL`.\n\t\t\tlet target: WorkflowDefinition | undefined\n\t\t\tif (Object.keys(args).length === 0) {\n\t\t\t\ttarget = definition\n\t\t\t} else if (Array.isArray(args.steps)) {\n\t\t\t\tconst flat = steps.parse(args)\n\t\t\t\ttarget = flat === undefined ? undefined : expandSteps(flat)\n\t\t\t} else {\n\t\t\t\tconst parsed = draft.parse(args)\n\t\t\t\ttarget = parsed === undefined ? undefined : completeDraft(parsed)\n\t\t\t}\n\t\t\t// The SOUNDNESS gate: whatever authoring form produced `target`, it must satisfy the\n\t\t\t// STRICT canonical contract before it runs — the leniency never reaches the runner.\n\t\t\tif (target === undefined || !strict.is(target)) {\n\t\t\t\tthrow new WorkflowError('TOOL', 'malformed workflow definition', {\n\t\t\t\t\tworkflow: definition.id,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (depth + 1 > MAX_WORKFLOW_DEPTH) {\n\t\t\t\tthrow new WorkflowError(\n\t\t\t\t\t'DEPTH',\n\t\t\t\t\t`nested workflow exceeds max depth ${MAX_WORKFLOW_DEPTH}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tworkflow: target.id,\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tmax: MAX_WORKFLOW_DEPTH,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst tag = workflowTag(target.id)\n\t\t\tif (ancestry.includes(tag)) {\n\t\t\t\tthrow new WorkflowError('DEPTH', `workflow '${target.id}' is already an ancestor (cycle)`, {\n\t\t\t\t\tworkflow: target.id,\n\t\t\t\t\tancestry: [...ancestry],\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst result = await runner.execute(target)\n\t\t\tif (store !== undefined) await store.set(result.workflow.snapshot())\n\t\t\treturn workflowToolSummary(result)\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable workspace-editing tool — it ADVERTISES the `operation`-discriminated\n * 13-op union ({@link import('./shapers.js').workspaceToolShape}) as its `parameters`, and its\n * handler PARSES the model-supplied args against that contract and DISPATCHES the matched\n * operation against the manager's ACTIVE workspace (the registry ops drive the manager itself),\n * returning the plain result (throwing a typed `WorkspaceError`, `@orkestrel/agent`, on\n * failure). EITHER drives a caller-supplied {@link WorkspaceToolOptions.manager} directly, OR\n * constructs a fresh `WorkspaceManagerInterface` (`@orkestrel/agent`) over\n * {@link import('./types.js').WorkspaceToolOptions.store} (via `@orkestrel/agent`'s\n * `createWorkspaceManager`); neither given constructs a manager backed by `@orkestrel/agent`'s\n * in-memory store default.\n *\n * @remarks\n * MANAGER-DRIVEN: every edit / read op (read / list / has / search / replace / write / splice /\n * prepend / append / move / remove) targets `manager.active`, so the model edits whichever\n * workspace is active and a host can re-point it (`WorkspaceManagerInterface.switch`) between\n * turns. Two REGISTRY ops make the model self-sufficient: `workspaces` LISTS the registered\n * workspaces (each `{ id, files, active }`) so it can discover an id, and `switch` re-points the\n * active workspace by id (lenient — an unknown id is a no-op reporting `switched: false`, never a\n * throw).\n *\n * NO-ACTIVE RULE (the ergonomic seam): a WRITING op (write / splice / prepend / append / move /\n * remove / replace) run when `manager.active` is `undefined` AUTO-CREATES + activates a default\n * workspace (`manager.add()`) so the model can just start writing; a pure-READ op (read / list /\n * has / search) against no active workspace returns the EMPTY result (`undefined` / `[]` /\n * `false`), never creating one and never throwing.\n *\n * The handler conforms to the universal tool-handler contract (AGENTS §14): it `contract.parse`s\n * the args, THROWS a `TOOL` `WorkspaceError` when no operation arm matched (a malformed / unknown\n * operation), else `switch`es on `op.operation` and RETURNS the plain result — letting a\n * `WorkspaceError` raised by the live workspace (`MODALITY` / `PATTERN` / `RANGE`) PROPAGATE\n * uncaught. The range edit is the FLAT `'splice'` op: its four flat caret integers are\n * reassembled into a `Range` (`@orkestrel/agent`) by `rangeOf` and fed to the workspace's ranged\n * `write`.\n *\n * @param options - `manager` (drive directly) OR `store` (build a manager over it); neither ⇒\n * an in-memory-backed manager (see {@link import('./types.js').WorkspaceToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').WORKSPACE_TOOL_NAME} by default)\n *\n * @example\n * ```ts\n * import { createWorkspaceTool } from '@src/core'\n * import { createToolManager } from '@orkestrel/agent'\n *\n * const tool = createWorkspaceTool() // in-memory workspace, no persistence\n * const tools = createToolManager()\n * tools.add(tool)\n * ```\n */\nexport function createWorkspaceTool(options?: WorkspaceToolOptions): ToolInterface {\n\tconst manager: WorkspaceManagerInterface =\n\t\toptions?.manager ??\n\t\tcreateWorkspaceManager(options?.store === undefined ? undefined : { store: options.store })\n\tconst contract: ContractInterface<WorkspaceOperation> = createContract(workspaceToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\treturn createTool({\n\t\tname: options?.name ?? WORKSPACE_TOOL_NAME,\n\t\tdescription: options?.description ?? WORKSPACE_TOOL_DESCRIPTION,\n\t\tsummary: WORKSPACE_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: (args) => {\n\t\t\tconst op = contract.parse(args)\n\t\t\tif (op === undefined) {\n\t\t\t\tthrow new WorkspaceError('TOOL', `unknown or malformed operation`, { args })\n\t\t\t}\n\t\t\t// Registry ops act on the MANAGER, not a workspace — handle them first.\n\t\t\tif (op.operation === 'workspaces') {\n\t\t\t\tconst activeId = manager.active?.id\n\t\t\t\treturn manager.workspaces().map((workspace) => ({\n\t\t\t\t\tid: workspace.id,\n\t\t\t\t\tfiles: workspace.count,\n\t\t\t\t\tactive: workspace.id === activeId,\n\t\t\t\t}))\n\t\t\t}\n\t\t\tif (op.operation === 'switch') {\n\t\t\t\tconst switched = manager.switch(op.id)\n\t\t\t\t// Lenient: an unknown id leaves `active` unchanged and reports `switched: false`.\n\t\t\t\treturn switched === undefined\n\t\t\t\t\t? { id: op.id, switched: false }\n\t\t\t\t\t: { id: switched.id, switched: true, files: switched.count }\n\t\t\t}\n\t\t\t// Edit / read ops target the ACTIVE workspace. A WRITING op ensures a target — auto-creating\n\t\t\t// + activating a default workspace when none is active (the no-active ergonomic seam) — while\n\t\t\t// a pure-READ op returns the empty result against no active workspace rather than creating one.\n\t\t\tconst active = manager.active\n\t\t\tswitch (op.operation) {\n\t\t\t\tcase 'read':\n\t\t\t\t\treturn active?.read(op.path)\n\t\t\t\tcase 'list':\n\t\t\t\t\treturn (active?.files() ?? []).map((file) => ({\n\t\t\t\t\t\tpath: file.path,\n\t\t\t\t\t\tstate: file.state,\n\t\t\t\t\t\tsize: file.size,\n\t\t\t\t\t\tlines: file.lines,\n\t\t\t\t\t\tkind: isText(file.content) ? 'text' : 'binary',\n\t\t\t\t\t}))\n\t\t\t\tcase 'has':\n\t\t\t\t\treturn active?.has(op.path) ?? false\n\t\t\t\tcase 'search':\n\t\t\t\t\treturn (\n\t\t\t\t\t\tactive?.search(op.query, { regex: op.regex, exact: op.exact, limit: op.limit }) ?? []\n\t\t\t\t\t)\n\t\t\t\tcase 'replace': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\treturn workspace.replace(op.query, op.replacement, {\n\t\t\t\t\t\tregex: op.regex,\n\t\t\t\t\t\texact: op.exact,\n\t\t\t\t\t\tlimit: op.limit,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tcase 'write': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.write(op.path, op.content)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'splice': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.write(\n\t\t\t\t\t\top.path,\n\t\t\t\t\t\top.content,\n\t\t\t\t\t\trangeOf(op.fromLine, op.fromColumn, op.toLine, op.toColumn),\n\t\t\t\t\t)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'prepend': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.prepend(op.path, op.content)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'append': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\tworkspace.append(op.path, op.content)\n\t\t\t\t\treturn { path: op.path, state: workspace.file(op.path)?.state }\n\t\t\t\t}\n\t\t\t\tcase 'move': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\treturn { from: op.from, to: op.to, moved: workspace.move(op.from, op.to) }\n\t\t\t\t}\n\t\t\t\tcase 'remove': {\n\t\t\t\t\tconst workspace = active ?? manager.add()\n\t\t\t\t\treturn { path: op.path, removed: workspace.remove(op.path) }\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable sub-agent delegation tool — resolves a live, seeded `AgentInterface`\n * from `registry` and runs it to completion for ONE delegated `task`.\n *\n * @remarks\n * The universal tool-handler contract (AGENTS §14): validates the call args against\n * {@link import('./shapers.js').agentToolShape}, assembles an `AgentJobInput` (`task` seeds the\n * sub-agent's conversation as a single `user` message; `provider` / `tools` / `system` fall\n * back to the tool's own {@link import('./types.js').AgentToolOptions} defaults), rehydrates the sub-agent via\n * `registry.build`, runs it with `agent.generate()`, and returns the settled\n * `AgentResult.content` string (the sub-agent's final text). A missing / unresolvable `provider`, or a malformed call, THROWS a typed `TOOL`\n * {@link import('./errors.js').AgentToolError}; a delegation that would exceed\n * {@link import('./constants.js').AGENT_TOOL_DEPTH}, or re-enter an already-delegated agent (a\n * cycle), THROWS a typed `DEPTH` {@link import('./errors.js').AgentToolError} — both isolated\n * by the `ToolManagerInterface` into the canonical tool result's top-level `error`.\n *\n * `AgentInterface` (`@orkestrel/agent`) exposes no teardown method — a bound sub-agent's\n * lifetime is the single `generate()` call this handler awaits; there is nothing to release\n * afterwards (unlike a store-backed resource, its state lives entirely in the resolved\n * `AgentContextInterface`, owned by the caller's registry).\n *\n * @param registry - The `AgentRegistryInterface` a delegated job resolves against (providers,\n * tools, authorities, schedulers, and the `build` rehydration seam)\n * @param options - Delegation defaults, depth/ancestry bookkeeping, and advertised overrides\n * (see {@link import('./types.js').AgentToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').AGENT_TOOL_NAME} by default)\n *\n * @example\n * ```ts\n * import { createAgentTool } from '@src/core'\n * import { createAgentRegistry, createToolManager } from '@orkestrel/agent'\n *\n * const registry = createAgentRegistry({ providers: { openai: myProvider } })\n * const tool = createAgentTool(registry, { provider: 'openai' })\n * const tools = createToolManager()\n * tools.add(tool) // a model can now delegate a task to a sub-agent\n * ```\n */\nexport function createAgentTool(\n\tregistry: AgentRegistryInterface,\n\toptions?: AgentToolOptions,\n): ToolInterface {\n\tconst contract = createContract(agentToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\tconst depth = options?.depth ?? 0\n\tconst ancestry = options?.ancestry ?? []\n\treturn createTool({\n\t\tname: options?.name ?? AGENT_TOOL_NAME,\n\t\tdescription: options?.description ?? AGENT_TOOL_DESCRIPTION,\n\t\tsummary: AGENT_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\tconst call = contract.parse(args)\n\t\t\tif (call === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'malformed agent-delegation call', { args })\n\t\t\t}\n\t\t\tconst provider = call.provider ?? options?.provider\n\t\t\tif (provider === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'no provider resolved for the delegated agent', {\n\t\t\t\t\ttask: call.task,\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (depth + 1 > AGENT_TOOL_DEPTH) {\n\t\t\t\tthrow new AgentToolError(\n\t\t\t\t\t'DEPTH',\n\t\t\t\t\t`delegation exceeds max agent depth ${AGENT_TOOL_DEPTH}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tmax: AGENT_TOOL_DEPTH,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst tag = agentTag(provider)\n\t\t\tif (ancestry.includes(tag)) {\n\t\t\t\tthrow new AgentToolError('DEPTH', `agent '${provider}' is already an ancestor (cycle)`, {\n\t\t\t\t\tprovider,\n\t\t\t\t\tancestry: [...ancestry],\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst tools = call.tools ?? options?.tools\n\t\t\tconst system = call.system ?? options?.system\n\t\t\tconst agent = registry.build({\n\t\t\t\tprovider,\n\t\t\t\tmessages: [{ role: 'user', content: call.task }],\n\t\t\t\t...(system === undefined ? {} : { system }),\n\t\t\t\t...(tools === undefined ? {} : { tools }),\n\t\t\t})\n\t\t\tconst result = await agent.generate()\n\t\t\tif (options?.store !== undefined) {\n\t\t\t\tconst active = agent.context.conversations.active\n\t\t\t\tif (active !== undefined) await options.store.set(active.snapshot())\n\t\t\t}\n\t\t\treturn result.content\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable tool that returns the FULL `description` of another registered tool by\n * name — the counterpart to the lean `summary` the other tools in this package advertise\n * (`AGENT_TOOL_SUMMARY` / `WORKFLOW_TOOL_SUMMARY` / `WORKSPACE_TOOL_SUMMARY`).\n *\n * @remarks\n * `ToolManagerInterface.definitions()` (`@orkestrel/agent`) advertises `tool.summary ??\n * tool.description` — a lean one-sentence summary stands in for a tool's full teaching\n * description when `summary` is set, keeping the advertised tool list compact for a small model.\n * This tool is the on-demand expansion seam: given a registered tool's `name`, it looks the tool\n * up via `tools.tool(name)` and returns its full `description` (falling back to `summary` when a\n * tool has no `description` of its own, then a placeholder when it has neither).\n *\n * The universal tool-handler contract (AGENTS §14): validates the call args against\n * {@link import('./shapers.js').describeToolShape}, RETURNS the plain description string on\n * success, THROWS a typed `TOOL` {@link import('./errors.js').AgentToolError} on a malformed call\n * or an unknown tool name.\n *\n * @param tools - The `ToolManagerInterface` (`@orkestrel/agent`) whose registered tools this\n * tool can describe\n * @returns A `ToolInterface` (named {@link import('./constants.js').DESCRIBE_TOOL_NAME})\n *\n * @example\n * ```ts\n * import { createDescribeTool, createWorkflowTool } from '@src/core'\n * import { createToolManager } from '@orkestrel/agent'\n *\n * const tools = createToolManager()\n * tools.add(createWorkflowTool(definition, runner))\n * tools.add(createDescribeTool(tools))\n * const full = await tools.execute({ id: '1', name: 'describe', arguments: { name: 'workflow' } })\n * full.value // the workflow tool's full teaching description\n * ```\n */\nexport function createDescribeTool(tools: ToolManagerInterface): ToolInterface {\n\tconst contract = createContract(describeToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\treturn createTool({\n\t\tname: DESCRIBE_TOOL_NAME,\n\t\tdescription: DESCRIBE_TOOL_DESCRIPTION,\n\t\tsummary: DESCRIBE_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\tconst call = contract.parse(args)\n\t\t\tif (call === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'malformed describe call', { args })\n\t\t\t}\n\t\t\tconst tool = tools.tool(call.name)\n\t\t\tif (tool === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', `unknown tool '${call.name}'`, { name: call.name })\n\t\t\t}\n\t\t\treturn tool.description ?? tool.summary ?? '<no description>'\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable prompt tool — the ASK side of the terminal seam. Asks\n * {@link import('./types.js').PromptToolOptions.to} a question and BLOCKS until it answers,\n * returning the resolved answer value.\n *\n * @remarks\n * The universal tool-handler contract (AGENTS §14): validates the call args against\n * {@link import('./shapers.js').promptToolShape}, dispatches to the matching\n * `TerminalManagerInterface.ask` overload (`@orkestrel/terminal`) for the call's `form`, and\n * RETURNS the resolved answer on success. `from` is FIXED at construction\n * ({@link import('./types.js').PromptToolOptions.from}) — never read from the model-supplied\n * args — so a model cannot spoof which terminal is asking. A prompt CYCLE rejects with\n * `TerminalError('DEADLOCK')`, re-surfaced as a typed `DEADLOCK`\n * {@link import('./errors.js').AgentToolError}; an expired prompt re-surfaces as `EXPIRE`; an\n * unknown `to` (or any other `TerminalError`) re-surfaces as `TOOL`, naming the unknown terminal\n * plus the known ones (`manager.terminals()`).\n *\n * @param options - The live manager, the fixed `from` identity, and advertised overrides (see\n * {@link import('./types.js').PromptToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').PROMPT_TOOL_NAME} by default)\n *\n * @example\n * ```ts\n * import { createPromptTool } from '@src/core'\n * import { createTerminalManager, createToolManager } from '@orkestrel/terminal'\n *\n * const manager = createTerminalManager()\n * manager.add('agent')\n * manager.add('reviewer')\n * const tool = createPromptTool({ manager, from: 'agent' })\n * const tools = createToolManager()\n * tools.add(tool) // the agent can now ask 'reviewer' and block for the answer\n * ```\n */\nexport function createPromptTool(options: PromptToolOptions): ToolInterface {\n\tconst contract = createContract(promptToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\treturn createTool({\n\t\tname: options.name ?? PROMPT_TOOL_NAME,\n\t\tdescription: options.description ?? PROMPT_TOOL_DESCRIPTION,\n\t\tsummary: PROMPT_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\tconst call = contract.parse(args)\n\t\t\tif (call === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'malformed ask call', { args })\n\t\t\t}\n\t\t\tif (\n\t\t\t\t(call.form === 'select' || call.form === 'checkbox') &&\n\t\t\t\t(call.choices ?? []).length === 0\n\t\t\t) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'select/checkbox requires at least one choice', {\n\t\t\t\t\tto: call.to,\n\t\t\t\t\tform: call.form,\n\t\t\t\t})\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tswitch (call.form) {\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\treturn await options.manager.ask(options.from, call.to, call.form, {\n\t\t\t\t\t\t\tmessage: call.message,\n\t\t\t\t\t\t\t...(call.default === undefined ? {} : { default: call.default }),\n\t\t\t\t\t\t\t...(call.validate === undefined ? {} : { validate: call.validate }),\n\t\t\t\t\t\t})\n\t\t\t\t\tcase 'editor':\n\t\t\t\t\t\treturn await options.manager.ask(options.from, call.to, call.form, {\n\t\t\t\t\t\t\tmessage: call.message,\n\t\t\t\t\t\t\t...(call.default === undefined ? {} : { default: call.default }),\n\t\t\t\t\t\t\t...(call.validate === undefined ? {} : { validate: call.validate }),\n\t\t\t\t\t\t})\n\t\t\t\t\tcase 'password':\n\t\t\t\t\t\treturn await options.manager.ask(options.from, call.to, call.form, {\n\t\t\t\t\t\t\tmessage: call.message,\n\t\t\t\t\t\t\t...(call.mask === undefined ? {} : { mask: call.mask }),\n\t\t\t\t\t\t\t...(call.validate === undefined ? {} : { validate: call.validate }),\n\t\t\t\t\t\t})\n\t\t\t\t\tcase 'confirm':\n\t\t\t\t\t\treturn await options.manager.ask(options.from, call.to, call.form, {\n\t\t\t\t\t\t\tmessage: call.message,\n\t\t\t\t\t\t\t...(call.default === undefined ? {} : { default: call.default === 'true' }),\n\t\t\t\t\t\t})\n\t\t\t\t\tcase 'select':\n\t\t\t\t\t\treturn await options.manager.ask(options.from, call.to, call.form, {\n\t\t\t\t\t\t\tmessage: call.message,\n\t\t\t\t\t\t\tchoices: call.choices ?? [],\n\t\t\t\t\t\t\t...(call.default === undefined ? {} : { default: call.default }),\n\t\t\t\t\t\t})\n\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\treturn await options.manager.ask(options.from, call.to, call.form, {\n\t\t\t\t\t\t\tmessage: call.message,\n\t\t\t\t\t\t\tchoices: call.choices ?? [],\n\t\t\t\t\t\t\t...(call.min === undefined ? {} : { min: call.min }),\n\t\t\t\t\t\t\t...(call.max === undefined ? {} : { max: call.max }),\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst code = terminalToolCode(error)\n\t\t\t\tif (code === undefined) throw error\n\t\t\t\tif (code === 'DEADLOCK') {\n\t\t\t\t\tthrow new AgentToolError(\n\t\t\t\t\t\t'DEADLOCK',\n\t\t\t\t\t\t`asking '${call.to}' would form a prompt cycle`,\n\t\t\t\t\t\tisTerminalError(error) ? error.context : { from: options.from, to: call.to },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (code === 'EXPIRE') {\n\t\t\t\t\tthrow new AgentToolError(\n\t\t\t\t\t\t'EXPIRE',\n\t\t\t\t\t\t`prompt to '${call.to}' expired before it was answered`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tto: call.to,\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (isTerminalError(error) && error.code === 'TARGET') {\n\t\t\t\t\tthrow new AgentToolError('TOOL', `unknown terminal '${call.to}'`, {\n\t\t\t\t\t\tto: call.to,\n\t\t\t\t\t\tknown: options.manager.terminals(),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tthrow new AgentToolError('TOOL', `asking '${call.to}' failed`, { to: call.to })\n\t\t\t}\n\t\t},\n\t})\n}\n\n/**\n * Build an LLM-callable answer tool — the ANSWER side of the terminal seam. Lists the prompts\n * currently addressed to {@link import('./types.js').AnswerToolOptions.to}, or answers one of\n * them by id.\n *\n * @remarks\n * The universal tool-handler contract (AGENTS §14): validates the call args against\n * {@link import('./shapers.js').answerToolShape} (discriminated by `operation`). `'pending'`\n * returns a compact list (`{ id, from, form, message }`) of every prompt currently addressed to\n * `to` (`TerminalManagerInterface.pending`, `@orkestrel/terminal`). `'answer'` looks the prompt\n * up by `id` (an unknown id throws a typed `ANSWER` {@link import('./errors.js').AgentToolError}),\n * normalizes the model-supplied `value` to the prompt's own form\n * ({@link import('./helpers.js').coerceAnswer}), and applies it via\n * `TerminalManagerInterface.answer` — a rejected / unknown / unresolvable outcome\n * (`TerminalAnswerResult.error`) re-surfaces as a typed `ANSWER` `AgentToolError`; success returns\n * `{ answered: id }`. `to` is FIXED at construction\n * ({@link import('./types.js').AnswerToolOptions.to}) — never read from the model-supplied args —\n * so a model cannot spoof which terminal it is answering for. Concurrent answerers racing on one\n * endpoint are FIRST-WRITE-WINS — a late answer to an already-settled prompt returns a typed\n * `ANSWER` `AgentToolError` (surfaced as a 422 over HTTP).\n *\n * @param options - The live manager, the fixed `to` identity, and advertised overrides (see\n * {@link import('./types.js').AnswerToolOptions})\n * @returns A `ToolInterface` (named {@link import('./constants.js').ANSWER_TOOL_NAME} by default)\n *\n * @example\n * ```ts\n * import { createAnswerTool } from '@src/core'\n * import { createTerminalManager, createToolManager } from '@orkestrel/terminal'\n *\n * const manager = createTerminalManager()\n * manager.add('reviewer')\n * const tool = createAnswerTool({ manager, to: 'reviewer' })\n * const tools = createToolManager()\n * tools.add(tool) // the reviewer terminal can now list/answer prompts addressed to it\n * ```\n */\nexport function createAnswerTool(options: AnswerToolOptions): ToolInterface {\n\tconst contract = createContract(answerToolShape)\n\tconst parameters = schemaToParameters(contract.schema)\n\treturn createTool({\n\t\tname: options.name ?? ANSWER_TOOL_NAME,\n\t\tdescription: options.description ?? ANSWER_TOOL_DESCRIPTION,\n\t\tsummary: ANSWER_TOOL_SUMMARY,\n\t\tparameters,\n\t\texecute: async (args) => {\n\t\t\tconst call = contract.parse(args)\n\t\t\tif (call === undefined) {\n\t\t\t\tthrow new AgentToolError('TOOL', 'malformed answer call', { args })\n\t\t\t}\n\t\t\tif (call.operation === 'pending') {\n\t\t\t\treturn options.manager.pending(options.to).map((prompt) => ({\n\t\t\t\t\tid: prompt.id,\n\t\t\t\t\tfrom: prompt.from,\n\t\t\t\t\tform: prompt.form,\n\t\t\t\t\tmessage: prompt.message,\n\t\t\t\t}))\n\t\t\t}\n\t\t\tconst prompt = options.manager.pending(options.to).find((entry) => entry.id === call.id)\n\t\t\tif (prompt === undefined) {\n\t\t\t\tthrow new AgentToolError('ANSWER', `unknown prompt '${call.id}'`, {\n\t\t\t\t\tid: call.id,\n\t\t\t\t\treason: 'unknown',\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst coerced = coerceAnswer(prompt.form, call.value)\n\t\t\tconst result = options.manager.answer(options.to, call.id, coerced)\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new AgentToolError(\n\t\t\t\t\t'ANSWER',\n\t\t\t\t\t`failed to answer prompt '${call.id}': ${result.error}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: call.id,\n\t\t\t\t\t\treason: result.error,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn { answered: call.id }\n\t\t},\n\t})\n}\n"],"mappings":"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"}
|