@noetic-tools/core 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/in-memory-fs-adapter.js +1 -1
- package/dist/adapters/in-memory-subprocess/manifest-persistence.d.ts +8 -0
- package/dist/adapters/in-memory-subprocess/manifest-persistence.js +56 -0
- package/dist/adapters/in-memory-subprocess/metadata.d.ts +12 -0
- package/dist/adapters/in-memory-subprocess/metadata.js +58 -0
- package/dist/adapters/in-memory-subprocess/step-completion.d.ts +3 -0
- package/dist/adapters/in-memory-subprocess/step-completion.js +86 -0
- package/dist/adapters/in-memory-subprocess/types.d.ts +88 -0
- package/dist/adapters/in-memory-subprocess/types.js +2 -0
- package/dist/adapters/in-memory-subprocess-adapter.d.ts +12 -4
- package/dist/adapters/in-memory-subprocess-adapter.js +164 -55
- package/dist/adapters/openrouter.d.ts +11 -2
- package/dist/adapters/openrouter.js +66 -5
- package/dist/builders/control-flow-builders.js +8 -3
- package/dist/builders/every.js +4 -1
- package/dist/builders/layer-provides-builders.d.ts +1 -32
- package/dist/builders/layer-provides-builders.js +1 -33
- package/dist/builders/loop-builder.js +4 -1
- package/dist/builders/memory-builder.js +1 -1
- package/dist/builders/provide-builder.js +4 -1
- package/dist/builders/spawn-builder.d.ts +20 -7
- package/dist/builders/spawn-builder.js +16 -2
- package/dist/builders/step-builders.d.ts +49 -28
- package/dist/builders/step-builders.js +30 -11
- package/dist/builders/tool-builder.d.ts +5 -1
- package/dist/builders/tool-builder.js +2 -0
- package/dist/builders/workflow-hydrator.d.ts +38 -0
- package/dist/builders/workflow-hydrator.js +336 -0
- package/dist/conditions/conditions.js +1 -1
- package/dist/errors/noetic-error.js +2 -0
- package/dist/{runtime → harness}/agent-harness.d.ts +65 -45
- package/dist/harness/agent-harness.js +576 -0
- package/dist/harness/deps/adapters.d.ts +4 -0
- package/dist/harness/deps/adapters.js +4 -0
- package/dist/harness/deps/interpreter.d.ts +5 -0
- package/dist/harness/deps/interpreter.js +4 -0
- package/dist/harness/deps/memory.d.ts +5 -0
- package/dist/harness/deps/memory.js +4 -0
- package/dist/harness/deps/runtime.d.ts +10 -0
- package/dist/harness/deps/runtime.js +7 -0
- package/dist/harness/deps/types.d.ts +17 -0
- package/dist/harness/deps/types.js +1 -0
- package/dist/harness/model-call.d.ts +50 -0
- package/dist/harness/model-call.js +694 -0
- package/dist/harness/model-schema.d.ts +19 -0
- package/dist/harness/model-schema.js +46 -0
- package/dist/harness/step-bootstrap.d.ts +25 -0
- package/dist/harness/step-bootstrap.js +170 -0
- package/dist/index.d.ts +48 -12
- package/dist/index.js +29 -7
- package/dist/interpreter/action-deps.d.ts +12 -0
- package/dist/interpreter/action-deps.js +10 -0
- package/dist/interpreter/action-types.d.ts +8 -0
- package/dist/interpreter/action-types.js +1 -0
- package/dist/interpreter/collect-tools.d.ts +1 -1
- package/dist/interpreter/collect-tools.js +6 -2
- package/dist/interpreter/execute-action.d.ts +22 -0
- package/dist/interpreter/execute-action.js +527 -0
- package/dist/interpreter/{execute-every.d.ts → execute-control.d.ts} +7 -1
- package/dist/interpreter/execute-control.js +530 -0
- package/dist/interpreter/execute.d.ts +13 -0
- package/dist/interpreter/execute.js +151 -48
- package/dist/interpreter/message-helpers.d.ts +1 -9
- package/dist/interpreter/message-helpers.js +1 -42
- package/dist/interpreter/step-dispatcher.d.ts +61 -0
- package/dist/interpreter/step-dispatcher.js +67 -0
- package/dist/interpreter/typeguards.d.ts +3 -10
- package/dist/interpreter/typeguards.js +3 -20
- package/dist/{runtime → memory}/exec-context-factory.js +1 -1
- package/dist/memory/flow-schema.d.ts +52 -0
- package/dist/memory/flow-schema.js +102 -0
- package/dist/memory/function-call-utils.js +4 -2
- package/dist/memory/layer-api.d.ts +1 -1
- package/dist/memory/layer-api.js +2 -2
- package/dist/memory/layer-lifecycle.d.ts +1 -1
- package/dist/memory/layer-lifecycle.js +2 -2
- package/dist/memory/layer-provides.d.ts +32 -0
- package/dist/memory/layer-provides.js +33 -0
- package/dist/memory/layer-usage.d.ts +3 -2
- package/dist/memory/layer-usage.js +9 -3
- package/dist/memory/layers/durable-task-state.js +1 -1
- package/dist/memory/layers/file-reference.js +302 -246
- package/dist/memory/layers/history-window.js +1 -1
- package/dist/memory/layers/observational-memory.js +1 -2
- package/dist/memory/layers/plan.d.ts +1 -1
- package/dist/memory/layers/plan.js +13 -8
- package/dist/memory/layers/steering.js +1 -1
- package/dist/memory/layers/tool-memory-layer.d.ts +1 -1
- package/dist/memory/layers/working-memory.js +2 -2
- package/dist/patterns/dynamic-workflow.d.ts +55 -0
- package/dist/patterns/dynamic-workflow.js +194 -0
- package/dist/patterns/flow.d.ts +2 -52
- package/dist/patterns/flow.js +1 -103
- package/dist/patterns/interview.js +1 -1
- package/dist/patterns/plans.d.ts +3 -3
- package/dist/patterns/plans.js +3 -3
- package/dist/patterns/ralph-wiggum.d.ts +1 -1
- package/dist/patterns/react.d.ts +1 -1
- package/dist/portable/adapters.d.ts +6 -0
- package/dist/portable/adapters.js +6 -0
- package/dist/portable/ask-user.d.ts +4 -0
- package/dist/portable/ask-user.js +2 -0
- package/dist/portable/builders.d.ts +12 -0
- package/dist/portable/builders.js +12 -0
- package/dist/portable/memory-layers.d.ts +12 -0
- package/dist/portable/memory-layers.js +12 -0
- package/dist/portable/runtime.d.ts +4 -0
- package/dist/portable/runtime.js +4 -0
- package/dist/portable/until.d.ts +4 -0
- package/dist/portable/until.js +4 -0
- package/dist/portable.d.ts +8 -26
- package/dist/portable.js +8 -34
- package/dist/runtime/broadcaster-utils.d.ts +5 -1
- package/dist/runtime/broadcaster-utils.js +11 -6
- package/dist/runtime/channel-store.js +1 -1
- package/dist/runtime/context-deps.d.ts +4 -0
- package/dist/runtime/context-deps.js +2 -0
- package/dist/runtime/context-impl.d.ts +42 -12
- package/dist/runtime/context-impl.js +51 -4
- package/dist/runtime/context-type-deps.d.ts +14 -0
- package/dist/runtime/context-type-deps.js +1 -0
- package/dist/runtime/detached-handle.d.ts +50 -2
- package/dist/runtime/detached-handle.js +216 -12
- package/dist/runtime/durable/checkpoint-store.d.ts +38 -0
- package/dist/runtime/durable/checkpoint-store.js +101 -0
- package/dist/runtime/durable/detached-signal.d.ts +37 -0
- package/dist/runtime/durable/detached-signal.js +52 -0
- package/dist/runtime/durable/harness-checkpoints.d.ts +51 -0
- package/dist/runtime/durable/harness-checkpoints.js +104 -0
- package/dist/runtime/durable/index.d.ts +10 -0
- package/dist/runtime/durable/index.js +5 -0
- package/dist/runtime/durable/runnable-loop.d.ts +100 -0
- package/dist/runtime/durable/runnable-loop.js +90 -0
- package/dist/runtime/durable/session-seed.d.ts +28 -0
- package/dist/runtime/durable/session-seed.js +27 -0
- package/dist/runtime/durable/stall-nudge.d.ts +82 -0
- package/dist/runtime/durable/stall-nudge.js +87 -0
- package/dist/runtime/in-memory-storage.js +1 -1
- package/dist/runtime/item-log-impl.d.ts +1 -1
- package/dist/runtime/step-registry.d.ts +42 -0
- package/dist/runtime/step-registry.js +77 -0
- package/dist/schemas/workflow.d.ts +139 -0
- package/dist/schemas/workflow.js +232 -0
- package/dist/types/ask-user-types.d.ts +57 -0
- package/dist/types/ask-user-types.js +74 -0
- package/dist/types/checkpoint.d.ts +98 -0
- package/dist/types/checkpoint.js +81 -0
- package/dist/types/common.d.ts +1 -50
- package/dist/types/context-parts/item-log.d.ts +6 -0
- package/dist/types/context-parts/item-log.js +1 -0
- package/dist/types/context-parts/layer-usage.d.ts +18 -0
- package/dist/types/context-parts/layer-usage.js +1 -0
- package/dist/types/context.d.ts +135 -26
- package/dist/types/error.d.ts +15 -0
- package/dist/types/harness-result.d.ts +1 -1
- package/dist/types/items.d.ts +18 -2
- package/dist/types/memory-context.d.ts +39 -0
- package/dist/types/memory-context.js +1 -0
- package/dist/types/memory.d.ts +35 -65
- package/dist/types/runtime.d.ts +2 -1
- package/dist/types/steering.d.ts +1 -1
- package/dist/types/step-registrar.d.ts +46 -0
- package/dist/types/step-registrar.js +56 -0
- package/dist/types/step.d.ts +30 -5
- package/dist/types/subprocess-adapter.d.ts +119 -3
- package/dist/types/subprocess-adapter.js +2 -0
- package/dist/types/tool.d.ts +64 -0
- package/dist/types/tool.js +1 -0
- package/dist/unstable.d.ts +2 -2
- package/dist/unstable.js +2 -2
- package/dist/until/predicates.d.ts +9 -0
- package/dist/until/predicates.js +14 -0
- package/dist/util/message-helpers.d.ts +17 -0
- package/dist/util/message-helpers.js +64 -0
- package/package.json +1 -1
- package/dist/adapters/local-fs-adapter.d.ts +0 -3
- package/dist/adapters/local-fs-adapter.js +0 -43
- package/dist/adapters/local-shell-adapter.d.ts +0 -51
- package/dist/adapters/local-shell-adapter.js +0 -167
- package/dist/adapters/local-subprocess-adapter.d.ts +0 -16
- package/dist/adapters/local-subprocess-adapter.js +0 -187
- package/dist/interpreter/execute-branch.d.ts +0 -3
- package/dist/interpreter/execute-branch.js +0 -10
- package/dist/interpreter/execute-every.js +0 -143
- package/dist/interpreter/execute-fork.d.ts +0 -3
- package/dist/interpreter/execute-fork.js +0 -215
- package/dist/interpreter/execute-llm.d.ts +0 -4
- package/dist/interpreter/execute-llm.js +0 -217
- package/dist/interpreter/execute-loop.d.ts +0 -3
- package/dist/interpreter/execute-loop.js +0 -171
- package/dist/interpreter/execute-provide.d.ts +0 -10
- package/dist/interpreter/execute-provide.js +0 -64
- package/dist/interpreter/execute-run.d.ts +0 -3
- package/dist/interpreter/execute-run.js +0 -39
- package/dist/interpreter/execute-spawn.d.ts +0 -11
- package/dist/interpreter/execute-spawn.js +0 -113
- package/dist/interpreter/execute-tool.d.ts +0 -5
- package/dist/interpreter/execute-tool.js +0 -81
- package/dist/runtime/agent-harness.js +0 -1170
- /package/dist/{runtime → memory}/exec-context-factory.d.ts +0 -0
- /package/dist/{interpreter → util}/framework-cast.d.ts +0 -0
- /package/dist/{interpreter → util}/framework-cast.js +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { layerData, layerFn } from '../../builders/layer-provides-builders';
|
|
3
|
-
import { createMessage, estimateTokens } from '../../interpreter/message-helpers';
|
|
4
2
|
import { Slot } from '../../types/memory';
|
|
3
|
+
import { createMessage, estimateTokens } from '../../util/message-helpers';
|
|
5
4
|
import { findFunctionCall } from '../function-call-utils';
|
|
5
|
+
import { layerData, layerFn } from '../layer-provides';
|
|
6
6
|
function safeMerge(state, args) {
|
|
7
7
|
const { __proto__: _p, constructor: _c, ...safeArgs } = args;
|
|
8
8
|
if (typeof state === 'object' && state !== null) {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern that lets an LLM generate a workflow as JSON during execution,
|
|
3
|
+
* then hydrates and runs it within the same harness session.
|
|
4
|
+
*/
|
|
5
|
+
import type { Context } from '../types/context';
|
|
6
|
+
import type { ContextMemory } from '../types/memory';
|
|
7
|
+
import type { AgentHarnessContract } from '../types/runtime';
|
|
8
|
+
import type { Step } from '../types/step';
|
|
9
|
+
import type { Tool } from '../types/tool';
|
|
10
|
+
/** @public Options for creating a dynamic workflow step. */
|
|
11
|
+
export interface DynamicWorkflowOpts {
|
|
12
|
+
model?: string;
|
|
13
|
+
instructions?: string;
|
|
14
|
+
tools: Tool[];
|
|
15
|
+
maxDepth?: number;
|
|
16
|
+
maxRevisions?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a step that uses an LLM to generate a workflow as JSON, then
|
|
20
|
+
* hydrates and executes it. The entire plan-and-execute cycle happens
|
|
21
|
+
* within a single harness run.
|
|
22
|
+
*
|
|
23
|
+
* @public
|
|
24
|
+
* @param opts.model - Model for the planner LLM. Default: `openai/gpt-4o`.
|
|
25
|
+
* @param opts.instructions - Additional instructions prepended to the planner prompt.
|
|
26
|
+
* @param opts.tools - Tools the generated workflow may reference by name.
|
|
27
|
+
* @param opts.maxDepth - Maximum workflow tree depth. Default: 5.
|
|
28
|
+
* @param opts.maxRevisions - Retries with error feedback on validation failure. Default: 3.
|
|
29
|
+
* @returns A `Step` that dynamically plans and executes.
|
|
30
|
+
*/
|
|
31
|
+
export declare function dynamicWorkflow(opts: DynamicWorkflowOpts): Step<ContextMemory, string, string>;
|
|
32
|
+
/** @public Options for `parseAndRunWorkflow`. */
|
|
33
|
+
export interface ParseAndRunWorkflowOpts {
|
|
34
|
+
json: unknown;
|
|
35
|
+
harness: AgentHarnessContract;
|
|
36
|
+
ctx: Context;
|
|
37
|
+
tools: Tool[];
|
|
38
|
+
input?: string;
|
|
39
|
+
maxDepth?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parses raw JSON into a `WorkflowDocument`, hydrates it into a live step
|
|
43
|
+
* tree, and executes it via the harness.
|
|
44
|
+
*
|
|
45
|
+
* @public
|
|
46
|
+
* @param opts.json - Raw JSON (string or parsed object) representing a workflow.
|
|
47
|
+
* @param opts.harness - The agent harness to execute the workflow with.
|
|
48
|
+
* @param opts.ctx - Execution context.
|
|
49
|
+
* @param opts.tools - Available tools the workflow may reference.
|
|
50
|
+
* @param opts.maxDepth - Maximum workflow tree depth. Default: 5.
|
|
51
|
+
* @returns The string output of the executed workflow.
|
|
52
|
+
* @throws `NoeticConfigError` with code `WORKFLOW_VALIDATION_FAILED` if JSON is invalid.
|
|
53
|
+
* @throws `NoeticConfigError` with code `UNKNOWN_TOOL_REFERENCE` if a tool reference cannot be resolved.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseAndRunWorkflow(opts: ParseAndRunWorkflowOpts): Promise<string>;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern that lets an LLM generate a workflow as JSON during execution,
|
|
3
|
+
* then hydrates and runs it within the same harness session.
|
|
4
|
+
*/
|
|
5
|
+
import { step } from '../builders/step-builders';
|
|
6
|
+
import { hydrateWorkflow } from '../builders/workflow-hydrator';
|
|
7
|
+
import { NoeticConfigError } from '../errors/noetic-config-error';
|
|
8
|
+
import { WorkflowDocumentSchema, workflowDepth } from '../schemas/workflow';
|
|
9
|
+
import { frameworkCast } from '../util/framework-cast';
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region Constants
|
|
12
|
+
const DEFAULT_MAX_DEPTH = 5;
|
|
13
|
+
const DEFAULT_MAX_REVISIONS = 3;
|
|
14
|
+
const DEFAULT_MODEL = 'openai/gpt-4o';
|
|
15
|
+
const PLANNER_INSTRUCTIONS = `You are a workflow planner. Given a task, generate a JSON workflow document that describes how to accomplish it.
|
|
16
|
+
|
|
17
|
+
The workflow document must be valid JSON with this structure:
|
|
18
|
+
{
|
|
19
|
+
"version": 1,
|
|
20
|
+
"root": <WorkflowNode>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
A WorkflowNode is one of:
|
|
24
|
+
- { "kind": "llm", "id": "<unique>", "instructions": "<prompt>", "model": "<optional>", "tools": ["<tool-name>", ...] }
|
|
25
|
+
- { "kind": "tool", "id": "<unique>", "toolName": "<name>", "args": { ... } }
|
|
26
|
+
- { "kind": "sequence", "id": "<unique>", "steps": [<WorkflowNode>, ...] }
|
|
27
|
+
- { "kind": "fork", "id": "<unique>", "mode": "all"|"race"|"settle", "paths": [<WorkflowNode>, ...], "merge": "last"|"first"|"concat" }
|
|
28
|
+
- { "kind": "loop", "id": "<unique>", "body": <WorkflowNode>, "until": { "kind": "maxSteps", "n": <number> } }
|
|
29
|
+
- { "kind": "branch", "id": "<unique>", "routes": [{ "match": "<substring>", "target": <WorkflowNode> }], "default": <WorkflowNode> }
|
|
30
|
+
- { "kind": "spawn", "id": "<unique>", "child": <WorkflowNode> }
|
|
31
|
+
|
|
32
|
+
Until predicates: maxSteps, maxCost, maxDuration, noToolCalls, outputContains, outputEquals, converged, any, all.
|
|
33
|
+
|
|
34
|
+
Respond with ONLY the JSON document, no markdown fences or explanation.`;
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region Public API
|
|
37
|
+
/**
|
|
38
|
+
* Creates a step that uses an LLM to generate a workflow as JSON, then
|
|
39
|
+
* hydrates and executes it. The entire plan-and-execute cycle happens
|
|
40
|
+
* within a single harness run.
|
|
41
|
+
*
|
|
42
|
+
* @public
|
|
43
|
+
* @param opts.model - Model for the planner LLM. Default: `openai/gpt-4o`.
|
|
44
|
+
* @param opts.instructions - Additional instructions prepended to the planner prompt.
|
|
45
|
+
* @param opts.tools - Tools the generated workflow may reference by name.
|
|
46
|
+
* @param opts.maxDepth - Maximum workflow tree depth. Default: 5.
|
|
47
|
+
* @param opts.maxRevisions - Retries with error feedback on validation failure. Default: 3.
|
|
48
|
+
* @returns A `Step` that dynamically plans and executes.
|
|
49
|
+
*/
|
|
50
|
+
export function dynamicWorkflow(opts) {
|
|
51
|
+
const model = opts.model ?? DEFAULT_MODEL;
|
|
52
|
+
const maxDepth = opts.maxDepth ?? DEFAULT_MAX_DEPTH;
|
|
53
|
+
const maxRevisions = opts.maxRevisions ?? DEFAULT_MAX_REVISIONS;
|
|
54
|
+
const toolMap = buildToolMap(opts.tools);
|
|
55
|
+
return step.run({
|
|
56
|
+
id: 'dynamic-workflow',
|
|
57
|
+
execute: async (input, ctx) => {
|
|
58
|
+
const harness = ctx.harness;
|
|
59
|
+
if (!harness) {
|
|
60
|
+
throw new NoeticConfigError({
|
|
61
|
+
code: 'MISSING_HARNESS_CONTEXT',
|
|
62
|
+
message: 'dynamicWorkflow requires a harness on the execution context.',
|
|
63
|
+
hint: 'Execute this step via AgentHarness.run() or ensure ctx.harness is set.',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const toolList = opts.tools.map((t) => `- ${t.name}: ${t.description}`).join('\n');
|
|
67
|
+
const basePrompt = [
|
|
68
|
+
opts.instructions,
|
|
69
|
+
PLANNER_INSTRUCTIONS,
|
|
70
|
+
`\nAvailable tools:\n${toolList}`,
|
|
71
|
+
`\nTask: ${input}`,
|
|
72
|
+
]
|
|
73
|
+
.filter(Boolean)
|
|
74
|
+
.join('\n\n');
|
|
75
|
+
let lastError;
|
|
76
|
+
for (let revision = 0; revision < maxRevisions; revision++) {
|
|
77
|
+
const prompt = lastError
|
|
78
|
+
? `${basePrompt}\n\nPrevious attempt failed with error: ${lastError}\nPlease fix the workflow and try again.`
|
|
79
|
+
: basePrompt;
|
|
80
|
+
const plannerStep = step.llm({
|
|
81
|
+
id: `dynamic-workflow-planner-${revision}`,
|
|
82
|
+
model,
|
|
83
|
+
instructions: prompt,
|
|
84
|
+
});
|
|
85
|
+
const executeStep = frameworkCast(harness.run.bind(harness));
|
|
86
|
+
const rawOutput = await executeStep(plannerStep, input, ctx);
|
|
87
|
+
const text = coerceToString(rawOutput);
|
|
88
|
+
const parseResult = tryParseWorkflow(text, maxDepth);
|
|
89
|
+
if (!parseResult.ok) {
|
|
90
|
+
lastError = parseResult.error;
|
|
91
|
+
if (revision === maxRevisions - 1) {
|
|
92
|
+
throw new NoeticConfigError({
|
|
93
|
+
code: 'WORKFLOW_VALIDATION_FAILED',
|
|
94
|
+
message: `Failed to generate valid workflow after ${maxRevisions} attempts: ${lastError}`,
|
|
95
|
+
hint: 'The planner model may need clearer instructions or a more capable model.',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const hydrationCtx = {
|
|
101
|
+
tools: toolMap,
|
|
102
|
+
executeStep,
|
|
103
|
+
};
|
|
104
|
+
const hydrated = hydrateWorkflow(parseResult.doc, hydrationCtx);
|
|
105
|
+
return frameworkCast(await executeStep(hydrated, input, ctx));
|
|
106
|
+
}
|
|
107
|
+
throw new NoeticConfigError({
|
|
108
|
+
code: 'WORKFLOW_VALIDATION_FAILED',
|
|
109
|
+
message: `Failed to generate valid workflow after ${maxRevisions} attempts.`,
|
|
110
|
+
hint: 'The planner model may need clearer instructions or a more capable model.',
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Parses raw JSON into a `WorkflowDocument`, hydrates it into a live step
|
|
117
|
+
* tree, and executes it via the harness.
|
|
118
|
+
*
|
|
119
|
+
* @public
|
|
120
|
+
* @param opts.json - Raw JSON (string or parsed object) representing a workflow.
|
|
121
|
+
* @param opts.harness - The agent harness to execute the workflow with.
|
|
122
|
+
* @param opts.ctx - Execution context.
|
|
123
|
+
* @param opts.tools - Available tools the workflow may reference.
|
|
124
|
+
* @param opts.maxDepth - Maximum workflow tree depth. Default: 5.
|
|
125
|
+
* @returns The string output of the executed workflow.
|
|
126
|
+
* @throws `NoeticConfigError` with code `WORKFLOW_VALIDATION_FAILED` if JSON is invalid.
|
|
127
|
+
* @throws `NoeticConfigError` with code `UNKNOWN_TOOL_REFERENCE` if a tool reference cannot be resolved.
|
|
128
|
+
*/
|
|
129
|
+
export async function parseAndRunWorkflow(opts) {
|
|
130
|
+
const parseResult = tryParseWorkflow(opts.json, opts.maxDepth ?? DEFAULT_MAX_DEPTH);
|
|
131
|
+
if (!parseResult.ok) {
|
|
132
|
+
throw new NoeticConfigError({
|
|
133
|
+
code: 'WORKFLOW_VALIDATION_FAILED',
|
|
134
|
+
message: `Invalid workflow document: ${parseResult.error}`,
|
|
135
|
+
hint: 'Ensure the JSON matches the WorkflowDocumentSchema.',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const executeStep = frameworkCast(opts.harness.run.bind(opts.harness));
|
|
139
|
+
const hydrationCtx = {
|
|
140
|
+
tools: buildToolMap(opts.tools),
|
|
141
|
+
executeStep,
|
|
142
|
+
};
|
|
143
|
+
const hydrated = hydrateWorkflow(parseResult.doc, hydrationCtx);
|
|
144
|
+
const result = await executeStep(hydrated, opts.input ?? '', opts.ctx);
|
|
145
|
+
return coerceToString(result);
|
|
146
|
+
}
|
|
147
|
+
function buildToolMap(tools) {
|
|
148
|
+
return new Map(tools.map((t) => [
|
|
149
|
+
t.name,
|
|
150
|
+
t,
|
|
151
|
+
]));
|
|
152
|
+
}
|
|
153
|
+
function coerceToString(value) {
|
|
154
|
+
if (typeof value === 'string') {
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
return String(value ?? '');
|
|
158
|
+
}
|
|
159
|
+
function tryParseWorkflow(raw, maxDepth) {
|
|
160
|
+
const parsed = typeof raw === 'string' ? safeParse(raw) : raw;
|
|
161
|
+
if (parsed === null) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
error: 'Input is not valid JSON.',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const result = WorkflowDocumentSchema.safeParse(parsed);
|
|
168
|
+
if (!result.success) {
|
|
169
|
+
return {
|
|
170
|
+
ok: false,
|
|
171
|
+
error: result.error.message,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const depth = workflowDepth(result.data.root);
|
|
175
|
+
if (depth > maxDepth) {
|
|
176
|
+
return {
|
|
177
|
+
ok: false,
|
|
178
|
+
error: `Workflow tree depth ${depth} exceeds maximum ${maxDepth}.`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
ok: true,
|
|
183
|
+
doc: result.data,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function safeParse(text) {
|
|
187
|
+
try {
|
|
188
|
+
return JSON.parse(text);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//#endregion
|
package/dist/patterns/flow.d.ts
CHANGED
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* A "flow" is a JSON-serialisable subset of noetic's `Step` shape that the model
|
|
5
|
-
* may emit during plan mode. The runtime expands each node into a concrete `Step`
|
|
6
|
-
* via the existing builders (`step.llm`, `fork`, `spawn`) at execute time.
|
|
7
|
-
*
|
|
8
|
-
* Tool references inside `llm` nodes are name strings — they get resolved against
|
|
9
|
-
* the harness's live tool registry when the flow runs.
|
|
10
|
-
*/
|
|
11
|
-
import { z } from 'zod';
|
|
12
|
-
interface NodeBase {
|
|
13
|
-
id: string;
|
|
14
|
-
subPlanRef?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface LlmFlowNode extends NodeBase {
|
|
17
|
-
kind: 'llm';
|
|
18
|
-
model?: string;
|
|
19
|
-
instructions: string;
|
|
20
|
-
tools?: string[];
|
|
21
|
-
}
|
|
22
|
-
export interface SubagentFlowNode extends NodeBase {
|
|
23
|
-
kind: 'subagent';
|
|
24
|
-
preset: string;
|
|
25
|
-
prompt: string;
|
|
26
|
-
}
|
|
27
|
-
export interface ForkFlowNode extends NodeBase {
|
|
28
|
-
kind: 'fork';
|
|
29
|
-
mode: 'all' | 'race' | 'settle';
|
|
30
|
-
paths: FlowNode[];
|
|
31
|
-
}
|
|
32
|
-
export interface SpawnFlowNode extends NodeBase {
|
|
33
|
-
kind: 'spawn';
|
|
34
|
-
child: FlowNode;
|
|
35
|
-
}
|
|
36
|
-
export interface SequenceFlowNode extends NodeBase {
|
|
37
|
-
kind: 'sequence';
|
|
38
|
-
steps: FlowNode[];
|
|
39
|
-
}
|
|
40
|
-
export type FlowNode = LlmFlowNode | SubagentFlowNode | ForkFlowNode | SpawnFlowNode | SequenceFlowNode;
|
|
41
|
-
/** Top-level flow document — a single root node. */
|
|
42
|
-
export declare const FlowSchema: z.ZodType<FlowNode, unknown, z.core.$ZodTypeInternals<FlowNode, unknown>>;
|
|
43
|
-
/** Validates a candidate flow document. Throws `ZodError` on invalid input. */
|
|
44
|
-
export declare function validateFlow(input: unknown): FlowNode;
|
|
45
|
-
/** Walks a flow tree depth-first, yielding each node. */
|
|
46
|
-
export declare function walkFlow(root: FlowNode): Iterable<FlowNode>;
|
|
47
|
-
/**
|
|
48
|
-
* Returns the maximum depth of a flow tree. A leaf (llm/subagent) is depth 0.
|
|
49
|
-
* Structural nodes (sequence/fork/spawn) contribute +1 over their deepest child.
|
|
50
|
-
*/
|
|
51
|
-
export declare function flowDepth(node: FlowNode): number;
|
|
52
|
-
export {};
|
|
1
|
+
export type { FlowNode, ForkFlowNode, LlmFlowNode, SequenceFlowNode, SpawnFlowNode, SubagentFlowNode, } from '../memory/flow-schema';
|
|
2
|
+
export { FlowSchema, flowDepth, validateFlow, walkFlow } from '../memory/flow-schema';
|
package/dist/patterns/flow.js
CHANGED
|
@@ -1,103 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Zod schema for plan-mode flow JSON.
|
|
3
|
-
*
|
|
4
|
-
* A "flow" is a JSON-serialisable subset of noetic's `Step` shape that the model
|
|
5
|
-
* may emit during plan mode. The runtime expands each node into a concrete `Step`
|
|
6
|
-
* via the existing builders (`step.llm`, `fork`, `spawn`) at execute time.
|
|
7
|
-
*
|
|
8
|
-
* Tool references inside `llm` nodes are name strings — they get resolved against
|
|
9
|
-
* the harness's live tool registry when the flow runs.
|
|
10
|
-
*/
|
|
11
|
-
import { z } from 'zod';
|
|
12
|
-
//#endregion
|
|
13
|
-
//#region Schema
|
|
14
|
-
const FlowNodeRef = z.lazy(() => FlowNodeSchema);
|
|
15
|
-
const SHARED_FIELDS = {
|
|
16
|
-
id: z.string().min(1),
|
|
17
|
-
subPlanRef: z.string().optional(),
|
|
18
|
-
};
|
|
19
|
-
const LlmNodeSchema = z.object({
|
|
20
|
-
kind: z.literal('llm'),
|
|
21
|
-
...SHARED_FIELDS,
|
|
22
|
-
model: z.string().optional(),
|
|
23
|
-
instructions: z.string(),
|
|
24
|
-
tools: z.array(z.string()).optional(),
|
|
25
|
-
});
|
|
26
|
-
const SubagentNodeSchema = z.object({
|
|
27
|
-
kind: z.literal('subagent'),
|
|
28
|
-
...SHARED_FIELDS,
|
|
29
|
-
preset: z.string().min(1),
|
|
30
|
-
prompt: z.string(),
|
|
31
|
-
});
|
|
32
|
-
const ForkNodeSchema = z.object({
|
|
33
|
-
kind: z.literal('fork'),
|
|
34
|
-
...SHARED_FIELDS,
|
|
35
|
-
mode: z.enum([
|
|
36
|
-
'all',
|
|
37
|
-
'race',
|
|
38
|
-
'settle',
|
|
39
|
-
]),
|
|
40
|
-
paths: z.array(FlowNodeRef).min(1),
|
|
41
|
-
});
|
|
42
|
-
const SpawnNodeSchema = z.object({
|
|
43
|
-
kind: z.literal('spawn'),
|
|
44
|
-
...SHARED_FIELDS,
|
|
45
|
-
child: FlowNodeRef,
|
|
46
|
-
});
|
|
47
|
-
const SequenceNodeSchema = z.object({
|
|
48
|
-
kind: z.literal('sequence'),
|
|
49
|
-
...SHARED_FIELDS,
|
|
50
|
-
steps: z.array(FlowNodeRef).min(1),
|
|
51
|
-
});
|
|
52
|
-
const FlowNodeSchema = z.discriminatedUnion('kind', [
|
|
53
|
-
LlmNodeSchema,
|
|
54
|
-
SubagentNodeSchema,
|
|
55
|
-
ForkNodeSchema,
|
|
56
|
-
SpawnNodeSchema,
|
|
57
|
-
SequenceNodeSchema,
|
|
58
|
-
]);
|
|
59
|
-
/** Top-level flow document — a single root node. */
|
|
60
|
-
export const FlowSchema = FlowNodeSchema;
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region Public API
|
|
63
|
-
/** Validates a candidate flow document. Throws `ZodError` on invalid input. */
|
|
64
|
-
export function validateFlow(input) {
|
|
65
|
-
return FlowSchema.parse(input);
|
|
66
|
-
}
|
|
67
|
-
/** Walks a flow tree depth-first, yielding each node. */
|
|
68
|
-
export function* walkFlow(root) {
|
|
69
|
-
yield root;
|
|
70
|
-
if (root.kind === 'fork') {
|
|
71
|
-
for (const path of root.paths) {
|
|
72
|
-
yield* walkFlow(path);
|
|
73
|
-
}
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
if (root.kind === 'sequence') {
|
|
77
|
-
for (const step of root.steps) {
|
|
78
|
-
yield* walkFlow(step);
|
|
79
|
-
}
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
if (root.kind === 'spawn') {
|
|
83
|
-
yield* walkFlow(root.child);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Returns the maximum depth of a flow tree. A leaf (llm/subagent) is depth 0.
|
|
89
|
-
* Structural nodes (sequence/fork/spawn) contribute +1 over their deepest child.
|
|
90
|
-
*/
|
|
91
|
-
export function flowDepth(node) {
|
|
92
|
-
if (node.kind === 'sequence') {
|
|
93
|
-
return 1 + Math.max(0, ...node.steps.map(flowDepth));
|
|
94
|
-
}
|
|
95
|
-
if (node.kind === 'fork') {
|
|
96
|
-
return 1 + Math.max(0, ...node.paths.map(flowDepth));
|
|
97
|
-
}
|
|
98
|
-
if (node.kind === 'spawn') {
|
|
99
|
-
return 1 + flowDepth(node.child);
|
|
100
|
-
}
|
|
101
|
-
return 0;
|
|
102
|
-
}
|
|
103
|
-
//#endregion
|
|
1
|
+
export { FlowSchema, flowDepth, validateFlow, walkFlow } from '../memory/flow-schema';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { loop } from '../builders/loop-builder';
|
|
3
3
|
import { step } from '../builders/step-builders';
|
|
4
|
-
import { frameworkCast } from '../interpreter/framework-cast';
|
|
5
4
|
import { any } from '../until/combinators';
|
|
6
5
|
import { until } from '../until/predicates';
|
|
6
|
+
import { frameworkCast } from '../util/framework-cast';
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region Helpers
|
|
9
9
|
const DEFAULT_MAX_QUESTIONS = 8;
|
package/dist/patterns/plans.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export interface PlanConstraints {
|
|
|
27
27
|
* @param executeStep - Optional step executor for non-run step kinds.
|
|
28
28
|
* @returns A compiled `Step` ready for execution.
|
|
29
29
|
*/
|
|
30
|
-
export declare function compilePlan<O>(plan: PlanNode, agents: Record<string, (prompt: string) => Step<ContextMemory, string,
|
|
30
|
+
export declare function compilePlan<O, A = unknown>(plan: PlanNode, agents: Record<string, (prompt: string) => Step<ContextMemory, string, A>>, constraints?: PlanConstraints, executeStep?: ExecuteStepFn): Step<ContextMemory, string, O>;
|
|
31
31
|
/**
|
|
32
32
|
* Creates a step that dynamically generates a plan via a planner step and executes it,
|
|
33
33
|
* retrying with error feedback up to `maxRevisions` times on failure.
|
|
@@ -36,9 +36,9 @@ export declare function compilePlan<O>(plan: PlanNode, agents: Record<string, (p
|
|
|
36
36
|
* @param opts - Planner step, agent factories, optional constraints, max revision count, and step executor.
|
|
37
37
|
* @returns A `Step` that adaptively plans and executes.
|
|
38
38
|
*/
|
|
39
|
-
export declare function adaptivePlan<O>(opts: {
|
|
39
|
+
export declare function adaptivePlan<O, A = unknown>(opts: {
|
|
40
40
|
planner: Step<ContextMemory, string, PlanNode>;
|
|
41
|
-
agents: Record<string, (prompt: string) => Step<ContextMemory, string,
|
|
41
|
+
agents: Record<string, (prompt: string) => Step<ContextMemory, string, A>>;
|
|
42
42
|
constraints?: PlanConstraints;
|
|
43
43
|
maxRevisions: number;
|
|
44
44
|
executeStep?: ExecuteStepFn;
|
package/dist/patterns/plans.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { fork } from '../builders/control-flow-builders';
|
|
3
|
-
import { frameworkCast } from '../
|
|
3
|
+
import { frameworkCast } from '../util/framework-cast';
|
|
4
4
|
// PlanNode schema — the variable annotation provides the recursive type;
|
|
5
5
|
// z.lazy() returns a compatible type that TypeScript checks against it.
|
|
6
6
|
/** @public Zod schema for recursive `PlanNode` validation. */
|
|
@@ -47,7 +47,7 @@ function compileNode(node, opts) {
|
|
|
47
47
|
id: `plan-fork-${node.id}`,
|
|
48
48
|
mode: 'all',
|
|
49
49
|
paths: () => childSteps,
|
|
50
|
-
merge: (results) => results[results.length - 1],
|
|
50
|
+
merge: (results) => frameworkCast(results[results.length - 1]),
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
// Sequential - chain steps via a run step that uses executeStep
|
|
@@ -68,7 +68,7 @@ function compileNode(node, opts) {
|
|
|
68
68
|
throw new Error(`No executeStep provided and child step kind '${child.kind}' cannot be executed directly`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
return currentOutput;
|
|
71
|
+
return frameworkCast(currentOutput);
|
|
72
72
|
},
|
|
73
73
|
};
|
|
74
74
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Tool } from '../types/common';
|
|
2
1
|
import type { ContextMemory } from '../types/memory';
|
|
3
2
|
import type { StepLoop } from '../types/step';
|
|
3
|
+
import type { Tool } from '../types/tool';
|
|
4
4
|
import type { VerifyFn } from '../until/predicates';
|
|
5
5
|
/**
|
|
6
6
|
* Creates a retry-with-feedback loop wrapping a ReAct agent. Each iteration spawns an inner agent
|
package/dist/patterns/react.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Tool } from '../types/common';
|
|
2
1
|
import type { ContextMemory, MemoryConfig, MemoryLayer } from '../types/memory';
|
|
3
2
|
import type { StepLoop, StepSpawn } from '../types/step';
|
|
3
|
+
import type { Tool } from '../types/tool';
|
|
4
4
|
/**
|
|
5
5
|
* Creates a ReAct (Reason + Act) agent loop: an LLM step with tools iterated until no tool calls or limits are hit.
|
|
6
6
|
*
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export { createInMemoryFsAdapter } from '../adapters/in-memory-fs-adapter';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { createInMemoryShellAdapter } from '../adapters/in-memory-shell-adapter';
|
|
5
|
+
/** @public */
|
|
6
|
+
export { createInMemorySubprocessAdapter } from '../adapters/in-memory-subprocess-adapter';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export { createInMemoryFsAdapter } from '../adapters/in-memory-fs-adapter';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { createInMemoryShellAdapter } from '../adapters/in-memory-shell-adapter';
|
|
5
|
+
/** @public */
|
|
6
|
+
export { createInMemorySubprocessAdapter } from '../adapters/in-memory-subprocess-adapter';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export type { AskUserAnnotation, AskUserInput, AskUserOption, AskUserOutput, AskUserQuestion, } from '../types/ask-user-types';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { AskUserAnnotationSchema, AskUserInputSchema, AskUserOptionSchema, AskUserOutputSchema, AskUserQuestionSchema, } from '../types/ask-user-types';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export { branch, fork } from '../builders/control-flow-builders';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { layerData, layerFn } from '../builders/layer-provides-builders';
|
|
5
|
+
/** @public */
|
|
6
|
+
export { loop } from '../builders/loop-builder';
|
|
7
|
+
/** @public */
|
|
8
|
+
export { spawn } from '../builders/spawn-builder';
|
|
9
|
+
/** @public */
|
|
10
|
+
export { step } from '../builders/step-builders';
|
|
11
|
+
/** @public */
|
|
12
|
+
export { tool, toolWithGenerator } from '../builders/tool-builder';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export { branch, fork } from '../builders/control-flow-builders';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { layerData, layerFn } from '../builders/layer-provides-builders';
|
|
5
|
+
/** @public */
|
|
6
|
+
export { loop } from '../builders/loop-builder';
|
|
7
|
+
/** @public */
|
|
8
|
+
export { spawn } from '../builders/spawn-builder';
|
|
9
|
+
/** @public */
|
|
10
|
+
export { step } from '../builders/step-builders';
|
|
11
|
+
/** @public */
|
|
12
|
+
export { tool, toolWithGenerator } from '../builders/tool-builder';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export { durableTaskState } from '../memory/layers/durable-task-state';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { historyWindow } from '../memory/layers/history-window';
|
|
5
|
+
/** @public */
|
|
6
|
+
export { observationalMemory } from '../memory/layers/observational-memory';
|
|
7
|
+
/** @public */
|
|
8
|
+
export { planMemory } from '../memory/layers/plan';
|
|
9
|
+
/** @public */
|
|
10
|
+
export { toolMemoryLayer } from '../memory/layers/tool-memory-layer';
|
|
11
|
+
/** @public */
|
|
12
|
+
export { workingMemory } from '../memory/layers/working-memory';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export { durableTaskState } from '../memory/layers/durable-task-state';
|
|
3
|
+
/** @public */
|
|
4
|
+
export { historyWindow } from '../memory/layers/history-window';
|
|
5
|
+
/** @public */
|
|
6
|
+
export { observationalMemory } from '../memory/layers/observational-memory';
|
|
7
|
+
/** @public */
|
|
8
|
+
export { planMemory } from '../memory/layers/plan';
|
|
9
|
+
/** @public */
|
|
10
|
+
export { toolMemoryLayer } from '../memory/layers/tool-memory-layer';
|
|
11
|
+
/** @public */
|
|
12
|
+
export { workingMemory } from '../memory/layers/working-memory';
|
package/dist/portable.d.ts
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
/** @public */
|
|
8
|
-
export {
|
|
9
|
-
/** @public */
|
|
10
|
-
export { tool, toolWithGenerator } from './builders/tool-builder';
|
|
11
|
-
/** @public */
|
|
12
|
-
export { durableTaskState } from './memory/layers/durable-task-state';
|
|
13
|
-
/** @public */
|
|
14
|
-
export { historyWindow } from './memory/layers/history-window';
|
|
15
|
-
/** @public */
|
|
16
|
-
export { observationalMemory } from './memory/layers/observational-memory';
|
|
17
|
-
/** @public */
|
|
18
|
-
export { planMemory } from './memory/layers/plan';
|
|
19
|
-
/** @public */
|
|
20
|
-
export { toolMemoryLayer } from './memory/layers/tool-memory-layer';
|
|
21
|
-
/** @public */
|
|
22
|
-
export { workingMemory } from './memory/layers/working-memory';
|
|
23
|
-
/** @public */
|
|
24
|
-
export { AgentHarness } from './runtime/agent-harness';
|
|
25
|
-
/** @public */
|
|
26
|
-
export { createInMemoryStorage } from './runtime/in-memory-storage';
|
|
1
|
+
export * from './portable/adapters';
|
|
2
|
+
export * from './portable/ask-user';
|
|
3
|
+
export * from './portable/builders';
|
|
4
|
+
export * from './portable/memory-layers';
|
|
5
|
+
export * from './portable/runtime';
|
|
6
|
+
export * from './portable/until';
|
|
7
|
+
/** @public */
|
|
8
|
+
export { Slot } from './types/memory';
|