@ny4n/durable 1.1.0 → 1.3.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/LICENSE +1 -0
- package/README.md +41 -5
- package/dist/codemode/codemode.d.ts +132 -0
- package/dist/codemode/codemode.d.ts.map +1 -0
- package/dist/codemode/codemode.js +791 -0
- package/dist/codemode/codemode.js.map +1 -0
- package/dist/codemode/describe.d.ts +38 -0
- package/dist/codemode/describe.d.ts.map +1 -0
- package/dist/codemode/describe.js +117 -0
- package/dist/codemode/describe.js.map +1 -0
- package/dist/codemode/index.d.ts +3 -0
- package/dist/codemode/index.d.ts.map +1 -0
- package/dist/codemode/index.js +3 -0
- package/dist/codemode/index.js.map +1 -0
- package/dist/codemode/output.d.ts +39 -0
- package/dist/codemode/output.d.ts.map +1 -0
- package/dist/codemode/output.js +160 -0
- package/dist/codemode/output.js.map +1 -0
- package/dist/harness/agent.d.ts +4 -2
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +56 -26
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +6 -1
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +10 -7
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/events.d.ts +8 -2
- package/dist/harness/events.d.ts.map +1 -1
- package/dist/harness/events.js +4 -1
- package/dist/harness/events.js.map +1 -1
- package/dist/harness/generation.d.ts +2 -0
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +25 -4
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/inbox.d.ts +16 -4
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +26 -3
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/live.d.ts +15 -1
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js +10 -2
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +72 -10
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +7 -4
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +29 -10
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +13 -1
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/types.d.ts +38 -11
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tool-search/index.d.ts +2 -0
- package/dist/tool-search/index.d.ts.map +1 -0
- package/dist/tool-search/index.js +2 -0
- package/dist/tool-search/index.js.map +1 -0
- package/dist/tool-search/tool-search.d.ts +18 -0
- package/dist/tool-search/tool-search.d.ts.map +1 -0
- package/dist/tool-search/tool-search.js +62 -0
- package/dist/tool-search/tool-search.js.map +1 -0
- package/package.json +16 -3
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -16,6 +16,7 @@ catalogs, credentials, and OAuth remain owned by the host that supplies the mode
|
|
|
16
16
|
- [Persist and Resume](#persist-and-resume)
|
|
17
17
|
- [Extensions](#extensions)
|
|
18
18
|
- [Tools](#tools)
|
|
19
|
+
- [Code Mode](#code-mode)
|
|
19
20
|
- [System Prompt](#system-prompt)
|
|
20
21
|
- [Per-Conversation Agent](#per-conversation-agent)
|
|
21
22
|
- [Settings](#settings)
|
|
@@ -181,7 +182,7 @@ registry.install(defineExtension({ name: "count", tools: [count] }));
|
|
|
181
182
|
|
|
182
183
|
Each call runs as its own durable task. Its intent is committed before `execute()` runs. If the process dies mid-call, the tool reruns on reopen only when it is declared `replay: "safe"`; otherwise the model gets an `interrupted` error result with the output committed so far. Throwing from `execute()` gives the model an error result. A result can also return `usage`, which is added to the conversation's [usage](#usage-and-cost). It can also return `control: { terminate: true }`: when every result of the round asks for it, the run ends without another model request.
|
|
183
184
|
|
|
184
|
-
A result has three channels: `output` for the model, `structuredOutput` for programs that call the tool (see [Calling tools from tools](#calling-tools-from-tools)), and `details` for UIs. A tool that declares `structuredOutputSchema` returns a matching `structuredOutput`, which the Harness validates. Programs calling a tool without one get its bounded output: one text item as a string, one image as its `ImageContent`, nothing as `""`, and anything else as the content list, for errors too. The transcript stores only `output` and `details`:
|
|
185
|
+
A result has three channels: `output` for the model, `structuredOutput` for programs that call the tool (see [Calling tools from tools](#calling-tools-from-tools)), and `details` for UIs. A tool that declares `structuredOutputSchema` returns a matching `structuredOutput`, which the Harness validates. Programs calling a tool without one get its bounded output: one text item as a string, one image as its `ImageContent`, nothing as `""`, and anything else as the content list, for errors too. `structuredOutput` is always the tool's own value: a schema tool's error result keeps the value it returned, and the text of one without is in a `tool_error` diagnostic, as a thrown error's message is. The transcript stores only `output` and `details`:
|
|
185
186
|
|
|
186
187
|
```typescript
|
|
187
188
|
const lines = defineTool({
|
|
@@ -197,7 +198,7 @@ const lines = defineTool({
|
|
|
197
198
|
});
|
|
198
199
|
```
|
|
199
200
|
|
|
200
|
-
A missing, undeclared, or invalid `structuredOutput` turns a nested call's result into an error result with an `invalid_structured_output` diagnostic; for a call the model made, which never sees it, it is dropped and reported through `onReport`. An error result may omit it; error results the Harness writes itself (blocked, invalid, interrupted, aborted) carry none, and their `diagnostics` say what went wrong. An `afterTool` hook that redacts a schema tool's `output` must redact its `structuredOutput` too. The built-in `bash` returns `{ output, truncated, fullOutputPath?, exitCode }`, where `output` is the retained tail the model sees, read with `api.retainedOutput()`, and answers a nonzero exit with an error result that still carries it.
|
|
201
|
+
A missing, undeclared, or invalid `structuredOutput` turns a nested call's result into an error result with an `invalid_structured_output` diagnostic; for a call the model made, which never sees it, it is dropped and reported through `onReport`. An error result may omit it, and programs then find its text in a `tool_error` diagnostic; error results the Harness writes itself (blocked, invalid, interrupted, aborted) carry none, and their `diagnostics` say what went wrong. An `afterTool` hook that redacts a schema tool's `output` must redact its `structuredOutput` too. The built-in `bash` returns `{ output, truncated, fullOutputPath?, exitCode }`, where `output` is the retained tail the model sees, read with `api.retainedOutput()`, and answers a nonzero exit with an error result that still carries it.
|
|
201
202
|
|
|
202
203
|
A later extension's tool with the same name replaces an earlier one where both are selected, and `wrapTool()` decorates whichever tool won:
|
|
203
204
|
|
|
@@ -251,10 +252,27 @@ await root.configure({ modelTools: { remove: [bash] } }, context);
|
|
|
251
252
|
|
|
252
253
|
`conversation.agent()` resolves both lists: `tools`, offered to the model, and `callable`, which nested calls resolve among. `tools` still decides what is enabled at all; `modelTools` cannot add to it.
|
|
253
254
|
|
|
255
|
+
A `deferred: true` tool is not offered to the model until it is loaded, though other tools can call it any time. The `tool_search` tool from `@ny4n/durable/tool-search` (`createToolSearchExtension()`) lets the model search the deferred tools and loads the matches with `control.addTools`, which records them in `modelTools`; loaded tools stay offered on that branch, also after a compaction, and the `codemode` section leaves deferred tools out. Use it for large tool sets, such as an MCP server's.
|
|
256
|
+
|
|
254
257
|
### Tasks a restart abandons
|
|
255
258
|
|
|
256
259
|
A task that its creator awaits only in memory, and that the creator never resumes after a restart, can be created with `abandonOnRestart: true`. When a later Harness starts scheduling and finds it still live, it is aborted with `abortReason: "restart"`, together with everything it owns, before any of it runs again. Nested calls of tools that are not replay-safe get this automatically, and so do the child tasks such a tool creates with `api.createTask()`. A task abandoned this way whose definition is missing waits until its extension is installed, so its abort handler still cleans up. Its caller, and the conversation, wait with it; `harness.inspect()` shows it as blocked. Aborting it then orphans it, as any abort does.
|
|
257
260
|
|
|
261
|
+
## Code Mode
|
|
262
|
+
|
|
263
|
+
`@ny4n/durable/codemode` adds a `codemode` tool: the model writes JavaScript that calls the conversation's tools as `await tools.<name>(args)`, in a QuickJS sandbox (`@ny4n/codemode`). Each call is a nested tool call, and only the script's output reaches the model. The script survives a restart: it resumes where it was, without running its finished calls again.
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import { CodemodeSandbox } from "@ny4n/codemode";
|
|
267
|
+
import { createCodemodeExtension } from "@ny4n/durable/codemode";
|
|
268
|
+
|
|
269
|
+
registry.install(createCodemodeExtension({ sandbox: new CodemodeSandbox({ memoryLimitBytes: 256 * 1024 * 1024 }) }));
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
The extension also adds a `codemode` prompt section listing the tools scripts can call, as TypeScript declarations within a token budget; scripts find the others with `searchTools()`, `describeTool()`, and `describeNamespace()`. Group tools by name prefix with `namespaces: [{ name, description, prefix }]`, for example an MCP server's `mcp__github__`. The result reads like the coding agent's: a header, the script's output, and on failure the calls already made; text past `max_output_tokens` is cut, with the full text in a temp file. Scripts have no `models` global: the model port of a Harness has no catalog, classifier, or image operations. On Cloudflare, pass a `RemoteCodemodeSandbox` instead. Closing the sandbox while a script runs (for example when shutting down) is not an outcome: the script resumes with the next process's sandbox. A failed nested call rejects in the script with its error text, unless the tool declares a schema and returned its own value with the error: `tools.bash` resolves with `{ output, exitCode, ... }` also for a nonzero exit, so scripts check `exitCode`. `store(key, value)` and `load(key)` keep JSON values per conversation; a fork sees them as they were at its entry.
|
|
273
|
+
|
|
274
|
+
How it survives a restart: the sandbox runs the script deterministically (a virtual clock, seeded randomness, UTC), and the tool writes each result the script gets to a journal before handing it over. After a restart, the tool runs the script again and hands it the journaled results in the same order, so it makes the same calls with the same arguments; these reattach to their nested calls by key, and then the script continues. A rerun ends the call with an error instead when the script takes another path than before, when the sandbox's fingerprint or the code mode version changed, or when its `timeout_ms` passed meanwhile. A nested call running at the restart follows its own replay policy.
|
|
275
|
+
|
|
258
276
|
## System Prompt
|
|
259
277
|
|
|
260
278
|
The system prompt is built from the selected extensions' sections, rendered in order before each request. A section sees the resolved agent, the environment built for the request, and committed documents:
|
|
@@ -396,11 +414,27 @@ await root.submit({ type: "write", entry: { kind: "app.note", data: "user opened
|
|
|
396
414
|
|
|
397
415
|
- **Steers** are placed after the current tool round and join the running work.
|
|
398
416
|
- **Follow-ups** are placed when the run answers, and start the next run.
|
|
399
|
-
- **Writes** append an entry without asking the model anything.
|
|
417
|
+
- **Writes** append an entry without asking the model anything. A write of only `kind` and `data` changes nothing the model sees, so it is appended at once, even mid-run, and is never queued: a chat message shows in the transcript as soon as it is sent. It can therefore appear before items submitted earlier that are still queued, except behind a queued reset, where it waits so the reset does not hide it. A write with `model`, `head`, or `edits` waits for the next boundary like a steer.
|
|
400
418
|
- `await submission.abort(context)` withdraws a queued submission.
|
|
401
419
|
- The [settings](#settings) `steeringMode: "all"` and `followUpMode: "all"` place every queued item at once instead of one per turn.
|
|
402
420
|
|
|
403
|
-
If a run fails, queued items stay in the inbox until the next
|
|
421
|
+
If a run fails, queued items stay in the inbox until the next input or queued write places them, oldest first.
|
|
422
|
+
|
|
423
|
+
An input is placed as a `nyan.user` entry. To show it as something else, give it an `entry` with your kind and data; the model still sees `content` as the user message:
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
await root.submit(
|
|
427
|
+
{
|
|
428
|
+
type: "input",
|
|
429
|
+
content: "ann: can you check the build?",
|
|
430
|
+
entry: { kind: "chat.mention", data: { author: "ann", text: "can you check the build?" } },
|
|
431
|
+
},
|
|
432
|
+
context,
|
|
433
|
+
);
|
|
434
|
+
// placed as { kind: "chat.mention", data: { author: "ann", ... }, model: [{ role: "user", content: "ann: can you check the build?" }] }
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
It behaves like any other input: it starts a run, steers, follows up, or rejects, and is answered. While queued, its inbox item carries the entry. The kind must not start with `nyan.`.
|
|
404
438
|
|
|
405
439
|
## Reset and Handoff
|
|
406
440
|
|
|
@@ -443,7 +477,9 @@ settings: {
|
|
|
443
477
|
|
|
444
478
|
When a provider rejects a request because the context is too long, generation compacts and retries once. A summary that would cut before the start of the current context settles as `stale` when it is placed, so when several are in flight, the furthest cut stays in effect. Summarization spend counts in `nyan.usage`. A `beforeCompact` hook on `CompactionTask` can decline or supply its own summary.
|
|
445
479
|
|
|
446
|
-
|
|
480
|
+
When a compaction that a generation waits for at the blocking threshold fails, the generation fails too, without sending a request: its inputs settle `unanswered` with `model_error` and detail `Compaction failed: <error>`. One that finds nothing to compact or is declined lets the request go ahead.
|
|
481
|
+
|
|
482
|
+
Running compactions are listed in `docs["nyan.live"].compactions` with their reason, attempt, and retry backoff. The newest failure stays in `docs["nyan.live"].compactionFailure` (task, reason, error) until a compaction produces a summary. The agent events add `compaction_start` and `compaction_end` (with `error` when the compaction failed), and `compactions` and `compactionFailure` fields in the snapshot.
|
|
447
483
|
|
|
448
484
|
## Agent Events (Experimental)
|
|
449
485
|
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { type Context, type JsonValue } from "@ny4n/chord";
|
|
2
|
+
import { type CodemodeSandboxBase } from "@ny4n/codemode/portable";
|
|
3
|
+
import { type Static, Type } from "typebox";
|
|
4
|
+
import type { Extension, ToolExecutionApi, ToolRegistration } from "../harness/types.ts";
|
|
5
|
+
import type { JsonObject } from "../types.ts";
|
|
6
|
+
import { type CodemodeNamespace } from "./describe.ts";
|
|
7
|
+
/**
|
|
8
|
+
* Version of everything in this module that turns stored results into what a script sees: result mapping, globals,
|
|
9
|
+
* start data. Bump it when that changes, so a call started before an upgrade is not replayed by different code.
|
|
10
|
+
*/
|
|
11
|
+
export declare const CODEMODE_MODULE_VERSION = 1;
|
|
12
|
+
export declare const CODEMODE_TOOL_NAME = "codemode";
|
|
13
|
+
/**
|
|
14
|
+
* One tool as the script sees it: `tools.<jsName>`. `structured`: the tool declares `structuredOutputSchema`, so an
|
|
15
|
+
* error result with a value resolves with it.
|
|
16
|
+
*/
|
|
17
|
+
type DeclaredTool = {
|
|
18
|
+
name: string;
|
|
19
|
+
jsName: string;
|
|
20
|
+
description: string;
|
|
21
|
+
structured?: true;
|
|
22
|
+
};
|
|
23
|
+
/** What a call starts with; a rerun starts the VM from exactly this. */
|
|
24
|
+
type Start = {
|
|
25
|
+
version: number;
|
|
26
|
+
startedAt: number;
|
|
27
|
+
seed: number;
|
|
28
|
+
/** The VM's fingerprint, recorded by the first run before any call is admitted. */
|
|
29
|
+
fingerprint?: string;
|
|
30
|
+
/** `startedAt + timeout_ms` when the script set one. */
|
|
31
|
+
deadline?: number;
|
|
32
|
+
tools: DeclaredTool[];
|
|
33
|
+
/** The namespaces of the tools, as `describeNamespace()` and `searchTools()` see them. */
|
|
34
|
+
namespaces: {
|
|
35
|
+
name: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
instructions?: string;
|
|
38
|
+
tools: string[];
|
|
39
|
+
}[];
|
|
40
|
+
globals: {
|
|
41
|
+
name: string;
|
|
42
|
+
spread: boolean;
|
|
43
|
+
}[];
|
|
44
|
+
/** `max_output_tokens` of the script's options line, or the default. */
|
|
45
|
+
maxOutputTokens: number;
|
|
46
|
+
store: Record<string, JsonValue>;
|
|
47
|
+
};
|
|
48
|
+
type RunState = {
|
|
49
|
+
start?: Start;
|
|
50
|
+
/** Directory of the result's files (the full output, images), created once: a rerun writes the same files again. */
|
|
51
|
+
outputDir?: string;
|
|
52
|
+
/** The outcome, decided once. */
|
|
53
|
+
result?: JsonObject;
|
|
54
|
+
};
|
|
55
|
+
export declare const CodemodeRunDoc: import("../types.ts").TaskDocToken<RunState>;
|
|
56
|
+
type JournalEntry = {
|
|
57
|
+
/** The VM's call ID. Its result is the entry's position + 1 (`seq`). */
|
|
58
|
+
id: number;
|
|
59
|
+
/** The VM clock while it processes this result. */
|
|
60
|
+
at: number;
|
|
61
|
+
/** Calls the VM had issued after processing this result; absent until acknowledged. */
|
|
62
|
+
issuedAfter?: number;
|
|
63
|
+
/** A global's call and outcome; a tool's result is its nested call's. */
|
|
64
|
+
global?: {
|
|
65
|
+
name: string;
|
|
66
|
+
args?: JsonValue;
|
|
67
|
+
outcome: JsonObject;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
type JournalState = {
|
|
71
|
+
entries: JournalEntry[];
|
|
72
|
+
/** Calls the VM had issued after the script's first run, before any result; absent until acknowledged. */
|
|
73
|
+
firstIssued?: number;
|
|
74
|
+
};
|
|
75
|
+
export declare const CodemodeJournalDoc: import("../types.ts").TaskDocToken<JournalState>;
|
|
76
|
+
/**
|
|
77
|
+
* What scripts keep with `store()` and read with `load()`, per conversation. Rewindable and copied as of the fork
|
|
78
|
+
* point, so a fork sees the values as they were when its entry was committed.
|
|
79
|
+
*/
|
|
80
|
+
export declare const CodemodeStoreDoc: import("../types.ts").RewindableConversationDocToken<{
|
|
81
|
+
values: Record<string, JsonValue>;
|
|
82
|
+
}>;
|
|
83
|
+
/** One tool call a script made, as the code mode call's details show it. */
|
|
84
|
+
export type CodemodeNestedCall = {
|
|
85
|
+
/** The VM's number for the call; its nested call ID is `<callId>/c<id>`. */
|
|
86
|
+
id: number;
|
|
87
|
+
name: string;
|
|
88
|
+
/** Compact JSON of the arguments, cut for display. */
|
|
89
|
+
args: string;
|
|
90
|
+
status: "running" | "ok" | "error" | "cancelled";
|
|
91
|
+
durationMs?: number;
|
|
92
|
+
/** Error text, cut for display. */
|
|
93
|
+
error?: string;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* The code mode call's details, in its result: its tool calls in the order it made them, with their status. Calls to
|
|
97
|
+
* globals are not listed. While the script runs, UIs show its nested calls from `nyan.live.nestedTools`, so the list is
|
|
98
|
+
* written once, with the result.
|
|
99
|
+
*/
|
|
100
|
+
export type CodemodeToolDetails = {
|
|
101
|
+
calls: CodemodeNestedCall[];
|
|
102
|
+
/** Temp file with the complete text output, when the output was cut to its token budget. */
|
|
103
|
+
fullOutputPath?: string;
|
|
104
|
+
};
|
|
105
|
+
/** A function scripts call as a top-level global; its result is journaled. */
|
|
106
|
+
export type CodemodeGlobal = {
|
|
107
|
+
readonly name: string;
|
|
108
|
+
readonly spread?: boolean;
|
|
109
|
+
execute(args: unknown, api: ToolExecutionApi, context: Context): Promise<JsonValue | undefined>;
|
|
110
|
+
};
|
|
111
|
+
declare const codemodeSchema: Type.TObject<{
|
|
112
|
+
code: Type.TString;
|
|
113
|
+
}>;
|
|
114
|
+
export type CodemodeToolInput = Static<typeof codemodeSchema>;
|
|
115
|
+
export type CodemodeToolOptions = {
|
|
116
|
+
/** Runs the scripts: `CodemodeSandbox` on Node, `RemoteCodemodeSandbox` on Cloudflare. */
|
|
117
|
+
readonly sandbox: CodemodeSandboxBase;
|
|
118
|
+
/** Groups of tools by name prefix, such as MCP servers, for the `codemode` section and tool search. */
|
|
119
|
+
readonly namespaces?: readonly CodemodeNamespace[];
|
|
120
|
+
/** Estimated tokens the tool declarations in the `codemode` section may use. Default 3000. */
|
|
121
|
+
readonly inlineBudget?: number;
|
|
122
|
+
/** @internal Host functions scripts call as globals. */
|
|
123
|
+
readonly globals?: readonly CodemodeGlobal[];
|
|
124
|
+
};
|
|
125
|
+
/** The code mode tool. Scripts call the conversation's callable tools as `tools.<name>(args)`. */
|
|
126
|
+
export declare function createCodemodeTool(options: CodemodeToolOptions): ToolRegistration<typeof codemodeSchema>;
|
|
127
|
+
/**
|
|
128
|
+
* The `codemode` extension: the code mode tool, and the `codemode` prompt section listing the tools scripts can call.
|
|
129
|
+
*/
|
|
130
|
+
export declare function createCodemodeExtension(options: CodemodeToolOptions): Extension;
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=codemode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codemode.d.ts","sourceRoot":"","sources":["../../src/codemode/codemode.ts"],"names":[],"mappings":"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"}
|