@tessar/core 0.0.0-stage → 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.
Files changed (190) hide show
  1. package/README.md +168 -3
  2. package/dist/agent.d.ts +78 -0
  3. package/dist/agent.js +189 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/controller.d.ts +62 -0
  6. package/dist/controller.js +371 -0
  7. package/dist/controller.js.map +1 -0
  8. package/dist/engine/abort.d.ts +1 -0
  9. package/dist/engine/abort.js +17 -0
  10. package/dist/engine/abort.js.map +1 -0
  11. package/dist/engine/call.d.ts +8 -0
  12. package/dist/engine/call.js +136 -0
  13. package/dist/engine/call.js.map +1 -0
  14. package/dist/engine/checkpoint.d.ts +11 -0
  15. package/dist/engine/checkpoint.js +187 -0
  16. package/dist/engine/checkpoint.js.map +1 -0
  17. package/dist/engine/context.d.ts +6 -0
  18. package/dist/engine/context.js +20 -0
  19. package/dist/engine/context.js.map +1 -0
  20. package/dist/engine/delivery.d.ts +35 -0
  21. package/dist/engine/delivery.js +140 -0
  22. package/dist/engine/delivery.js.map +1 -0
  23. package/dist/engine/execution.d.ts +5 -0
  24. package/dist/engine/execution.js +292 -0
  25. package/dist/engine/execution.js.map +1 -0
  26. package/dist/engine/frame.d.ts +77 -0
  27. package/dist/engine/frame.js +83 -0
  28. package/dist/engine/frame.js.map +1 -0
  29. package/dist/engine/hooks.d.ts +4 -0
  30. package/dist/engine/hooks.js +138 -0
  31. package/dist/engine/hooks.js.map +1 -0
  32. package/dist/engine/interrupt.d.ts +23 -0
  33. package/dist/engine/interrupt.js +14 -0
  34. package/dist/engine/interrupt.js.map +1 -0
  35. package/dist/engine/lineage.d.ts +15 -0
  36. package/dist/engine/lineage.js +66 -0
  37. package/dist/engine/lineage.js.map +1 -0
  38. package/dist/engine/recovery.d.ts +17 -0
  39. package/dist/engine/recovery.js +23 -0
  40. package/dist/engine/recovery.js.map +1 -0
  41. package/dist/engine/resume.d.ts +31 -0
  42. package/dist/engine/resume.js +250 -0
  43. package/dist/engine/resume.js.map +1 -0
  44. package/dist/engine/runtime.d.ts +16 -0
  45. package/dist/engine/runtime.js +29 -0
  46. package/dist/engine/runtime.js.map +1 -0
  47. package/dist/engine/services.d.ts +3 -0
  48. package/dist/engine/services.js +125 -0
  49. package/dist/engine/services.js.map +1 -0
  50. package/dist/engine/tool-executor.d.ts +8 -0
  51. package/dist/engine/tool-executor.js +281 -0
  52. package/dist/engine/tool-executor.js.map +1 -0
  53. package/dist/engine/tracked-effects.d.ts +89 -0
  54. package/dist/engine/tracked-effects.js +142 -0
  55. package/dist/engine/tracked-effects.js.map +1 -0
  56. package/dist/errors.d.ts +27 -0
  57. package/dist/errors.js +73 -0
  58. package/dist/errors.js.map +1 -0
  59. package/dist/events/definition.d.ts +50 -0
  60. package/dist/events/definition.js +41 -0
  61. package/dist/events/definition.js.map +1 -0
  62. package/dist/events/dispatcher.d.ts +5 -0
  63. package/dist/events/dispatcher.js +87 -0
  64. package/dist/events/dispatcher.js.map +1 -0
  65. package/dist/events/observer.d.ts +3 -0
  66. package/dist/events/observer.js +13 -0
  67. package/dist/events/observer.js.map +1 -0
  68. package/dist/events/type.d.ts +365 -0
  69. package/dist/events/type.js +175 -0
  70. package/dist/events/type.js.map +1 -0
  71. package/dist/identity.d.ts +1 -0
  72. package/dist/identity.js +23 -0
  73. package/dist/identity.js.map +1 -0
  74. package/dist/index.d.ts +36 -0
  75. package/dist/index.js +37 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/instructions/instruction.d.ts +11 -0
  78. package/dist/instructions/instruction.js +25 -0
  79. package/dist/instructions/instruction.js.map +1 -0
  80. package/dist/json.d.ts +17 -0
  81. package/dist/json.js +46 -0
  82. package/dist/json.js.map +1 -0
  83. package/dist/loop.d.ts +20 -0
  84. package/dist/loop.js +247 -0
  85. package/dist/loop.js.map +1 -0
  86. package/dist/messages/codec.d.ts +5 -0
  87. package/dist/messages/codec.js +50 -0
  88. package/dist/messages/codec.js.map +1 -0
  89. package/dist/messages/message.d.ts +42 -0
  90. package/dist/messages/message.js +85 -0
  91. package/dist/messages/message.js.map +1 -0
  92. package/dist/messages/parts.d.ts +21 -0
  93. package/dist/messages/parts.js +2 -0
  94. package/dist/messages/parts.js.map +1 -0
  95. package/dist/models/catalog.d.ts +8 -0
  96. package/dist/models/catalog.js +3 -0
  97. package/dist/models/catalog.js.map +1 -0
  98. package/dist/models/catalog.snapshot.json +1 -0
  99. package/dist/models/contract.d.ts +72 -0
  100. package/dist/models/contract.js +2 -0
  101. package/dist/models/contract.js.map +1 -0
  102. package/dist/models/normalize-catalog.d.ts +5 -0
  103. package/dist/models/normalize-catalog.js +84 -0
  104. package/dist/models/normalize-catalog.js.map +1 -0
  105. package/dist/models/options.d.ts +3 -0
  106. package/dist/models/options.js +13 -0
  107. package/dist/models/options.js.map +1 -0
  108. package/dist/models/profile.d.ts +55 -0
  109. package/dist/models/profile.js +2 -0
  110. package/dist/models/profile.js.map +1 -0
  111. package/dist/models/registry.d.ts +24 -0
  112. package/dist/models/registry.js +151 -0
  113. package/dist/models/registry.js.map +1 -0
  114. package/dist/models/resolver.d.ts +25 -0
  115. package/dist/models/resolver.js +159 -0
  116. package/dist/models/resolver.js.map +1 -0
  117. package/dist/models/stream.d.ts +9 -0
  118. package/dist/models/stream.js +83 -0
  119. package/dist/models/stream.js.map +1 -0
  120. package/dist/plugins/context.d.ts +72 -0
  121. package/dist/plugins/context.js +2 -0
  122. package/dist/plugins/context.js.map +1 -0
  123. package/dist/plugins/host.d.ts +32 -0
  124. package/dist/plugins/host.js +235 -0
  125. package/dist/plugins/host.js.map +1 -0
  126. package/dist/plugins/registry.d.ts +42 -0
  127. package/dist/plugins/registry.js +33 -0
  128. package/dist/plugins/registry.js.map +1 -0
  129. package/dist/session.d.ts +87 -0
  130. package/dist/session.js +424 -0
  131. package/dist/session.js.map +1 -0
  132. package/dist/state/commit.d.ts +13 -0
  133. package/dist/state/commit.js +112 -0
  134. package/dist/state/commit.js.map +1 -0
  135. package/dist/state/fork.d.ts +15 -0
  136. package/dist/state/fork.js +58 -0
  137. package/dist/state/fork.js.map +1 -0
  138. package/dist/state/memory-backend.d.ts +5 -0
  139. package/dist/state/memory-backend.js +357 -0
  140. package/dist/state/memory-backend.js.map +1 -0
  141. package/dist/state/plugin-state.d.ts +52 -0
  142. package/dist/state/plugin-state.js +135 -0
  143. package/dist/state/plugin-state.js.map +1 -0
  144. package/dist/state/queries.d.ts +50 -0
  145. package/dist/state/queries.js +178 -0
  146. package/dist/state/queries.js.map +1 -0
  147. package/dist/state/schema.d.ts +186 -0
  148. package/dist/state/schema.js +10 -0
  149. package/dist/state/schema.js.map +1 -0
  150. package/dist/state/scope.d.ts +3 -0
  151. package/dist/state/scope.js +16 -0
  152. package/dist/state/scope.js.map +1 -0
  153. package/dist/state/sessions.d.ts +2 -0
  154. package/dist/state/sessions.js +21 -0
  155. package/dist/state/sessions.js.map +1 -0
  156. package/dist/state/storage-ports.d.ts +94 -0
  157. package/dist/state/storage-ports.js +2 -0
  158. package/dist/state/storage-ports.js.map +1 -0
  159. package/dist/state/threads.d.ts +29 -0
  160. package/dist/state/threads.js +114 -0
  161. package/dist/state/threads.js.map +1 -0
  162. package/dist/testing/harness.d.ts +36 -0
  163. package/dist/testing/harness.js +93 -0
  164. package/dist/testing/harness.js.map +1 -0
  165. package/dist/testing/index.d.ts +2 -0
  166. package/dist/testing/index.js +3 -0
  167. package/dist/testing/index.js.map +1 -0
  168. package/dist/testing/scripted-provider.d.ts +19 -0
  169. package/dist/testing/scripted-provider.js +66 -0
  170. package/dist/testing/scripted-provider.js.map +1 -0
  171. package/dist/testing/storage-conformance.d.ts +3 -0
  172. package/dist/testing/storage-conformance.js +204 -0
  173. package/dist/testing/storage-conformance.js.map +1 -0
  174. package/dist/thread.d.ts +77 -0
  175. package/dist/thread.js +129 -0
  176. package/dist/thread.js.map +1 -0
  177. package/dist/tools/input-definition.d.ts +5 -0
  178. package/dist/tools/input-definition.js +2 -0
  179. package/dist/tools/input-definition.js.map +1 -0
  180. package/dist/tools/tool.d.ts +50 -0
  181. package/dist/tools/tool.js +44 -0
  182. package/dist/tools/tool.js.map +1 -0
  183. package/dist/trace/records.d.ts +90 -0
  184. package/dist/trace/records.js +29 -0
  185. package/dist/trace/records.js.map +1 -0
  186. package/dist/trace/usage.d.ts +23 -0
  187. package/dist/trace/usage.js +55 -0
  188. package/dist/trace/usage.js.map +1 -0
  189. package/package.json +47 -3
  190. package/src/models/catalog.LICENSE +21 -0
package/README.md CHANGED
@@ -1,3 +1,168 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # @tessar/core
2
+
3
+ Tessar's TypeScript API for Agent, Controller, Session, Thread, messages,
4
+ tools, hooks, state and checkpoints. Requires Node 24.14 or newer.
5
+
6
+ ```sh
7
+ npm install @tessar/core @tessar/openai zod
8
+ ```
9
+
10
+ - `Agent` owns its model, instructions, tools, limits and the agent loop.
11
+ - `Controller({ id, agent, plugins })` owns plugin setup, resources and sessions.
12
+ - An executable model lets Agent run directly, without public init/dispose.
13
+ - When opting into Controller, initialize it before its sessions or plugin-backed
14
+ executions and dispose it when finished.
15
+ - `agent.stream()` creates an independent task; `agent.generate()` collects the
16
+ same execution. A Session manages a continuing conversation with
17
+ `session.subscribe()` and queued `session.followUp()` inputs.
18
+ - Core manages state and checkpoints, using memory storage by default.
19
+
20
+ ```ts
21
+ import { Agent, Controller, HumanMessage, ToolMessage } from "@tessar/core";
22
+ import { createTool } from "@tessar/core/tool";
23
+ import { OpenAIProvider } from "@tessar/openai";
24
+ import { z } from "zod";
25
+
26
+ const addTool = createTool({
27
+ name: "add",
28
+ description: "Add two numbers",
29
+ schema: z.object({ a: z.number(), b: z.number() }),
30
+ execute: ({ a, b }) => ({ sum: a + b }),
31
+ });
32
+
33
+ const agent = new Agent({
34
+ id: "assistant",
35
+ model: new OpenAIProvider({
36
+ apiKey: process.env.OPENAI_API_KEY!,
37
+ model: process.env.OPENAI_MODEL!,
38
+ }),
39
+ tools: { addTool },
40
+ });
41
+
42
+ const result = await agent.generate("What is 1 + 2?");
43
+ console.log(result.output);
44
+ ```
45
+
46
+ Tools can also be registered by plugins using `tessar.tools.register(addTool)`.
47
+ Both paths share hooks and execution. Tool names must be unique.
48
+ `tools: { concurrency: 4, addTool }` optionally limits active calls, including
49
+ plugin tools; omit concurrency to execute the model's tool calls without a
50
+ scheduling limit. Tools are authorized before dispatch; results enter the
51
+ conversation in call order after the executions complete. Execution budgets
52
+ such as `limits.maxToolCalls` still apply.
53
+
54
+ `Agent.model` is required. `stream(message, options?)` and
55
+ `generate(message, options?)` accept a string, a message, or message history.
56
+ Each direct call has independent context and automatic per-execution cleanup.
57
+ Use a Session when the host needs a continuing conversation.
58
+
59
+ ```ts
60
+ const stream = agent.stream("Explain briefly", {
61
+ model: "another-model-on-the-same-connection",
62
+ modelOptions: { reasoning: { effort: "low" } },
63
+ });
64
+ for await (const event of stream) console.log(event);
65
+ ```
66
+
67
+ A string model override keeps the default connection. An executable model
68
+ instance selects its own connection and request defaults. `modelOptions`
69
+ replaces top-level values, including whole nested objects, for that call only.
70
+ Omitted provider settings are left to the provider SDK. Legacy object-input
71
+ overloads/model references remain for existing Controller integrations.
72
+
73
+ Zod validates arguments and infers executor input; Tessar generates the model's
74
+ JSON Schema. Return text or JSON directly: Tessar wraps it in a `ToolMessage`
75
+ and binds the toolCallId. Undefined and non-JSON returns fail explicitly.
76
+ To supply content parts or metadata, return a message yourself:
77
+
78
+ ```ts
79
+ new ToolMessage("Already calculated", { metadata: { source: "cache" } });
80
+ ```
81
+
82
+ All messages have an ID, role, content and optional metadata. Constructors infer
83
+ the role and generate an ID unless supplied. Metadata is persisted for hosts and
84
+ plugins and is not automatically sent to a model. Standalone ToolMessages may
85
+ omit toolCallId; encoding history requires it, and the tool runtime binds it
86
+ automatically. OpenAI Responses serializes JSON tool data as JSON text.
87
+
88
+ Retry, conditional availability and permissions belong in tool implementations
89
+ or plugins. Use `tools.select` for advertised tools and `tool.before` to enforce
90
+ execution policy. Skills and subagents are host/plugin orchestration, expressed
91
+ to providers through instructions, messages and tools.
92
+
93
+ Build instructions from sections when plugins need to append their own content:
94
+
95
+ ```ts
96
+ import { buildInstruction } from "@tessar/core";
97
+
98
+ const instructions = buildInstruction([
99
+ { id: "base", content: "You are an assistant.", order: 0 },
100
+ { id: "skills", content: "<skills>...</skills>", order: 100 },
101
+ { id: "current-context", content: "Current task details", order: 1000 },
102
+ ]);
103
+ const agent = new Agent({ id: "assistant", model, instructions });
104
+ ```
105
+
106
+ Sections sort by ascending `order`, with omitted order comparing as zero. Equal
107
+ orders sort by ordinal ID, independent of plugin registration order. Use distinct
108
+ orders when sequence matters. IDs must be unique and orders finite numbers.
109
+ Building copies/freezes the data; it does not mutate caller arrays or inject a
110
+ default order. String instructions remain supported. Final requests are normalized
111
+ after `context.prepare` and `model.request`, including sections added by plugins.
112
+ Ordering controls content placement; provider adapters own serialization and cache
113
+ behavior. Core adds no cache markers or history breakpoint API.
114
+
115
+ Built-in and custom plugins use classes instantiated with `new`, implementing
116
+ the same `Plugin` instance contract. Provider adapters are separate packages,
117
+ such as `@tessar/openai`; persistence backends such as `@tessar/sqlite` attach
118
+ through Controller plugins.
119
+
120
+ All hooks share `tessar.hook` and one typed EventMap. Import event groups directly:
121
+
122
+ ```ts
123
+ import { model, thread, session } from "@tessar/core";
124
+
125
+ tessar.hook(model.usage, event => console.log(event.payload.usage));
126
+ tessar.hook(thread.beforeDelete, () => ({ decision: "deny", reason: "Keep history" }));
127
+ tessar.hook(session.model.beforeChange, event => console.log(event.payload.model));
128
+ ```
129
+
130
+ Keys start lowercase and use camelCase for hyphens in the string identifier:
131
+ `thread.beforeDelete === "thread.before-delete"`. There is no `events` prefix.
132
+ The old `AgentEvents` and `SessionEvents` exports are replaced by these groups.
133
+ Session selection policies are asynchronous: use `await session.setModel(model)`
134
+ before queuing input that should use the new model. See
135
+ [plugin authoring](../../docs/plugin-authoring.md) for decisions and capabilities.
136
+
137
+ This is an early 0.x release. See the
138
+ [repository](https://github.com/hphucdev-04/tessar) for complete TypeScript
139
+ examples and the current API contracts. The bundled model catalog includes its
140
+ upstream license at `src/models/catalog.LICENSE`.
141
+
142
+ ## Persistent Sessions
143
+
144
+ `await controller.createSession({ scope, metadata })` commits a Session record
145
+ before returning the handle. `session.id` is generated by Tessar. Use
146
+ `await controller.getSession(id, { scope })` to restore it and
147
+ `await controller.listSessions({ scope, limit, cursor })` to browse this Agent's
148
+ Sessions. A restored handle does not automatically resume unfinished work.
149
+
150
+ Selections use compare-and-set: stale handles fail `CommitConflict`; reload the
151
+ Session before retrying. Thread creation may succeed before selection fails,
152
+ so the unselected thread remains available in the scoped thread list. Closing
153
+ a Session keeps its record. Soft-deleting a thread clears stored selections in
154
+ the same transaction. Subscribers and unadmitted followUp queues stay in memory.
155
+
156
+ There is no Agent table. The application constructs its Agent and supplies the
157
+ same `agentId` and compatible providers/plugins on restart. Controller's ID is
158
+ not a persistence key. Session creation notifications are available to Controller
159
+ plugins; subscribe on the returned handle for subsequent events. Restoration
160
+ does not emit another `session.created` notification.
161
+
162
+ `controller.deleteThread` is a soft delete. `controller.purgeThread` permanently
163
+ removes only a deleted, inactive, unowned thread with no retained fork referencing
164
+ it. Both invoke thread deletion policy; purge supplies `permanent: true`.
165
+
166
+ Storage adapter authors must implement the new `sessions` CAS port, backend page
167
+ and history queries, `threads.get(..., { includeDeleted })` and `threads.purge`.
168
+ These are breaking storage-port changes; run storage conformance and query tests.
@@ -0,0 +1,78 @@
1
+ import type { Controller } from "./controller.js";
2
+ import type { Model } from "./models/profile.js";
3
+ import type { ModelAdapter, ModelOptions, ModelRef } from "./models/contract.js";
4
+ import type { Scope, InterruptRecord, StreamLimits } from "./state/schema.js";
5
+ import type { StreamRecord } from "./trace/records.js";
6
+ import type { StorageBackend } from "./state/storage-ports.js";
7
+ import type { PluginHost } from "./plugins/host.js";
8
+ import { type Stream, type DeliveryTarget } from "./engine/delivery.js";
9
+ export type { Stream, DeliveryTarget } from "./engine/delivery.js";
10
+ import { type ErrorInfo } from "./errors.js";
11
+ import { type Clock, type IdGenerator, type JsonObject } from "./json.js";
12
+ import { type Instruction } from "./instructions/instruction.js";
13
+ import type { MessageData } from "./messages/message.js";
14
+ import { Tool } from "./tools/tool.js";
15
+ import type { ExecutionRequest } from "./engine/frame.js";
16
+ export type { ExecutionFrame, ExecutionRequest, ExecutionOrigin, } from "./engine/frame.js";
17
+ import type { ExecutionRuntime } from "./engine/runtime.js";
18
+ export type ModelSelection = ModelAdapter | Model | ModelRef;
19
+ export type AgentInput = string | MessageData | readonly MessageData[];
20
+ export interface AgentOptions<M extends ModelSelection = ModelSelection> {
21
+ id: string;
22
+ model: M;
23
+ instructions?: string | Instruction;
24
+ limits?: Partial<StreamLimits>;
25
+ tools?: AgentTools;
26
+ }
27
+ export interface AgentTools {
28
+ concurrency?: number;
29
+ readonly [alias: string]: Tool | number | undefined;
30
+ }
31
+ export interface AgentExecutionOptions<M = ModelAdapter> {
32
+ model?: M | Model | ModelRef | string;
33
+ modelOptions?: ModelOptions<M>;
34
+ scope?: Scope;
35
+ context?: JsonObject;
36
+ signal?: AbortSignal;
37
+ limits?: Partial<StreamLimits>;
38
+ }
39
+ export interface GenerateOutcome {
40
+ threadId: string;
41
+ streamId: string;
42
+ status: StreamRecord["status"];
43
+ output: readonly MessageData[];
44
+ usage: import("./trace/usage.js").UsageSummary;
45
+ interrupt: InterruptRecord | null;
46
+ error: ErrorInfo | null;
47
+ }
48
+ export declare function inputMessages(input: MessageData | readonly MessageData[]): readonly MessageData[];
49
+ export declare class Agent<M extends ModelSelection = ModelSelection> {
50
+ readonly id: string;
51
+ readonly tools: readonly Tool[];
52
+ /** @internal */ readonly toolConcurrency: number;
53
+ readonly model: M;
54
+ private controller?;
55
+ /** @internal */ attachController(controller: Controller): void;
56
+ private runtime;
57
+ get backend(): StorageBackend;
58
+ get registry(): PluginHost;
59
+ readonly ids: IdGenerator;
60
+ readonly clock: Clock;
61
+ readonly limits: StreamLimits;
62
+ readonly instructions: Instruction;
63
+ private readonly jobs;
64
+ private readonly outcomes;
65
+ private readonly active;
66
+ private readonly pendingModels;
67
+ private closed;
68
+ private readonly releaseId;
69
+ private readonly resumeAdmissions;
70
+ constructor(options: AgentOptions<M>);
71
+ stream<T extends ModelAdapter = Extract<M, ModelAdapter>>(input: AgentInput, options?: AgentExecutionOptions<T>): Stream;
72
+ generate<T extends ModelAdapter = Extract<M, ModelAdapter>>(input: AgentInput, options?: AgentExecutionOptions<T>): Promise<GenerateOutcome>;
73
+ /** @internal Shared admission for Thread, Session and testing. */
74
+ admit(request: ExecutionRequest, target?: DeliveryTarget, prepare?: () => Promise<void>, runtime?: ExecutionRuntime, cleanup?: () => Promise<void>): Stream;
75
+ private executionContext;
76
+ cancel(threadId: string, streamId: string, reason?: string, target?: DeliveryTarget, context?: Pick<ExecutionRequest, "session" | "thread">): Promise<void>;
77
+ shutdown(): Promise<void>;
78
+ }
package/dist/agent.js ADDED
@@ -0,0 +1,189 @@
1
+ import { stream as streamHooks } from "./events/type.js";
2
+ import { createDelivery, } from "./engine/delivery.js";
3
+ import { errorInfo, errorFromInfo, fail, requireId, } from "./errors.js";
4
+ import { immutable, randomIds, systemClock, } from "./json.js";
5
+ import { normalizeInstruction, } from "./instructions/instruction.js";
6
+ import { MessageCodec } from "./messages/codec.js";
7
+ import { Tool } from "./tools/tool.js";
8
+ import { execute, cancel } from "./engine/execution.js";
9
+ import { hook } from "./engine/hooks.js";
10
+ import { put, rows, commit, updateUsage, prepareMessage, appendMessage, finish, } from "./engine/checkpoint.js";
11
+ import { services } from "./engine/services.js";
12
+ import { callAgent, modelRef, readOutcome } from "./engine/call.js";
13
+ import { isModelAdapter } from "./models/stream.js";
14
+ import { reserveId } from "./identity.js";
15
+ export function inputMessages(input) {
16
+ const values = Array.isArray(input) ? input : [input];
17
+ return values.map((value) => MessageCodec.encode(MessageCodec.decode(MessageCodec.encode(value))));
18
+ }
19
+ function validateLimits(limits) {
20
+ for (const value of Object.values(limits))
21
+ if (!Number.isInteger(value) || value < 1)
22
+ fail("InvalidConfiguration", "Limits must be positive integers");
23
+ }
24
+ export class Agent {
25
+ id;
26
+ tools;
27
+ /** @internal */ toolConcurrency;
28
+ model;
29
+ controller;
30
+ /** @internal */ attachController(controller) {
31
+ if (this.controller)
32
+ fail("AgentAlreadyBound", "Agent already belongs to a Controller");
33
+ this.controller = controller;
34
+ }
35
+ runtime() {
36
+ if (!this.controller)
37
+ fail("ControllerNotReady", "Initialize a Controller for this Agent");
38
+ return this.controller;
39
+ }
40
+ get backend() {
41
+ return this.runtime().backend;
42
+ }
43
+ get registry() {
44
+ return this.runtime().hooks;
45
+ }
46
+ ids;
47
+ clock;
48
+ limits;
49
+ instructions;
50
+ jobs = new Set();
51
+ outcomes = new WeakMap();
52
+ active = new Map();
53
+ pendingModels = new Map();
54
+ closed = false;
55
+ releaseId;
56
+ resumeAdmissions = new Map();
57
+ constructor(options) {
58
+ this.id = requireId(options.id, "agent id");
59
+ if (!options.model)
60
+ fail("MissingModel", "Agent requires a default model");
61
+ const { concurrency, ...tools } = options.tools ?? {};
62
+ if (concurrency !== undefined &&
63
+ (!Number.isInteger(concurrency) || concurrency < 1))
64
+ fail("InvalidConfiguration", "Tool concurrency must be a positive integer");
65
+ const values = Object.values(tools);
66
+ if (values.some((tool) => !(tool instanceof Tool)))
67
+ fail("InvalidConfiguration", "Agent tools must be Tool instances");
68
+ this.tools = Object.freeze(values);
69
+ if (new Set(this.tools.map((tool) => tool.name)).size !== this.tools.length)
70
+ fail("RegistrationConflict", "Tool name already registered");
71
+ this.toolConcurrency = concurrency ?? Infinity;
72
+ this.model = ("ref" in options.model ? options.model : immutable(options.model));
73
+ const ref = modelRef(this.model);
74
+ requireId(ref.providerId, "provider id");
75
+ requireId(ref.modelId, "model id");
76
+ this.ids = randomIds;
77
+ this.clock = systemClock;
78
+ this.instructions = normalizeInstruction(options.instructions);
79
+ this.limits = immutable({
80
+ maxTurns: 32,
81
+ maxModelAttempts: 64,
82
+ maxToolCalls: 128,
83
+ ...options.limits,
84
+ });
85
+ validateLimits(this.limits);
86
+ this.releaseId = reserveId("Agent", this.id, this);
87
+ }
88
+ stream(input, options = {}) {
89
+ return callAgent(this, input, options, this.controller);
90
+ }
91
+ async generate(input, options = {}) {
92
+ const stream = this.stream(input, options);
93
+ for await (const event of stream)
94
+ if (event.is(streamHooks.error))
95
+ throw errorFromInfo(event.payload.error);
96
+ return this.outcomes.get(stream);
97
+ }
98
+ /** @internal Shared admission for Thread, Session and testing. */
99
+ admit(request, target = { kind: "iterator" }, prepare, runtime, cleanup) {
100
+ const environment = runtime ?? this.runtime();
101
+ if (environment === this.controller)
102
+ this.controller.requireReady();
103
+ if (this.closed)
104
+ fail("Disposed", "Agent closed");
105
+ if (request.kind === "input")
106
+ validateLimits({ ...this.limits, ...request.limits });
107
+ if (!request.adapter &&
108
+ isModelAdapter(this.model) &&
109
+ request.model?.providerId === this.model.ref.providerId &&
110
+ request.model.connectionId === this.model.ref.connectionId) {
111
+ request = {
112
+ ...request,
113
+ adapter: request.model.modelId === this.model.ref.modelId
114
+ ? this.model
115
+ : this.model.withModel?.(request.model.modelId),
116
+ };
117
+ }
118
+ const sink = createDelivery(request.threadId, this.ids, target, request.signal, environment.report);
119
+ const registry = environment.hooks.capture();
120
+ const outcome = (async () => {
121
+ let entered = false;
122
+ try {
123
+ await prepare?.();
124
+ if (this.closed)
125
+ fail("Disposed", "Agent closed");
126
+ entered = true;
127
+ const failure = await execute(this.executionContext(environment), request, sink, registry);
128
+ if (failure !== undefined && errorInfo(failure).source === "provider")
129
+ throw failure;
130
+ return await readOutcome(environment, sink.stream);
131
+ }
132
+ catch (error) {
133
+ if (!entered)
134
+ await registry.release();
135
+ environment.report(errorInfo(error));
136
+ sink.emit(streamHooks.error, {
137
+ error: errorInfo(error),
138
+ lastKnownCheckpointId: null,
139
+ persistedStatus: null,
140
+ }, {});
141
+ sink.rejected(errorInfo(error));
142
+ sink.close();
143
+ throw error;
144
+ }
145
+ finally {
146
+ await cleanup?.();
147
+ }
148
+ })();
149
+ this.outcomes.set(sink.stream, outcome);
150
+ const job = outcome.then(() => { }, () => { });
151
+ this.jobs.add(job);
152
+ void job.then(() => this.jobs.delete(job));
153
+ return sink.stream;
154
+ }
155
+ executionContext(runtime = this.runtime()) {
156
+ const execution = {
157
+ agent: this,
158
+ runtime,
159
+ active: this.active,
160
+ pendingModels: this.pendingModels,
161
+ resumeAdmissions: this.resumeAdmissions,
162
+ ids: this.ids,
163
+ clock: this.clock,
164
+ toolConcurrency: this.toolConcurrency,
165
+ hook: (frame, definition, payload, toolExecutionId) => hook(execution, frame, definition, payload, toolExecutionId),
166
+ put,
167
+ rows,
168
+ commit: (frame, cause) => commit(execution, frame, cause),
169
+ updateUsage: (frame) => updateUsage(execution, frame),
170
+ prepareMessage: (frame, message) => prepareMessage(execution, frame, message),
171
+ appendMessage: (frame, message) => appendMessage(execution, frame, message),
172
+ services: (frame, toolExecutionId) => services(execution, frame, toolExecutionId),
173
+ finish: (frame, status, reason, error) => finish(execution, frame, status, reason, error),
174
+ };
175
+ return execution;
176
+ }
177
+ async cancel(threadId, streamId, reason = "Cancelled", target = { kind: "observer", observe: () => { } }, context = {}) {
178
+ return cancel(this.executionContext(), threadId, streamId, reason, target, context);
179
+ }
180
+ async shutdown() {
181
+ this.closed = true;
182
+ for (const frame of this.active.values())
183
+ frame.sink.controller.abort("Controller disposed");
184
+ await Promise.allSettled([...this.jobs]);
185
+ this.pendingModels.clear();
186
+ this.releaseId();
187
+ }
188
+ }
189
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { type ErrorInfo } from "./errors.js";
2
+ import type { StoredModelSelection, SessionRecord } from "./state/schema.js";
3
+ import { type EventContext } from "./events/definition.js";
4
+ import { PluginHost } from "./plugins/host.js";
5
+ import type { Plugin } from "./plugins/context.js";
6
+ import type { Agent, ModelSelection } from "./agent.js";
7
+ import type { Model } from "./models/profile.js";
8
+ import { ModelRegistry } from "./models/registry.js";
9
+ import type { StorageBackend } from "./state/storage-ports.js";
10
+ import { StateQueries } from "./state/queries.js";
11
+ import { type CreateThreadOptions } from "./state/threads.js";
12
+ import { type ForkOptions } from "./state/fork.js";
13
+ import type { PageOptions, StateQuery, ThreadInfo } from "./state/schema.js";
14
+ import { Thread } from "./thread.js";
15
+ import { Session, type SessionOptions } from "./session.js";
16
+ export declare class Controller {
17
+ readonly id: string;
18
+ readonly agent: Agent;
19
+ readonly models: ModelRegistry;
20
+ readonly diagnostics: ErrorInfo[];
21
+ readonly report: (error: ErrorInfo, context?: EventContext) => void;
22
+ /** @internal */ readonly hooks: PluginHost;
23
+ /** @internal */ backend: StorageBackend;
24
+ /** @internal */ queries: StateQueries;
25
+ private phase;
26
+ private initialization?;
27
+ private readonly initialPlugins;
28
+ private disposal?;
29
+ private readonly releaseId;
30
+ private defaultBackend;
31
+ private readonly providers;
32
+ readonly plugins: {
33
+ attach: (plugin: Plugin) => Promise<void>;
34
+ detach: (id: string) => Promise<void>;
35
+ };
36
+ constructor(options: {
37
+ id: string;
38
+ agent: Agent;
39
+ plugins?: readonly Plugin[];
40
+ });
41
+ initialize(): Promise<void>;
42
+ /** @internal */ requireReady(): void;
43
+ private syncProviders;
44
+ /** @internal */ resolveModel(value: ModelSelection | undefined): Model;
45
+ /** @internal */ prepareThread(options?: CreateThreadOptions, reservedId?: string): Promise<ThreadInfo>;
46
+ createThread(options?: CreateThreadOptions): Promise<Thread>;
47
+ /** @internal */ sessionModel(value: ModelSelection): {
48
+ model: Model;
49
+ stored: StoredModelSelection;
50
+ };
51
+ createSession(options?: SessionOptions): Promise<Session>;
52
+ getSession(id: string, query?: StateQuery): Promise<Session | null>;
53
+ listSessions(query?: StateQuery & PageOptions): Promise<import("./state/schema.js").Page<SessionRecord>>;
54
+ getThread(id: string, query?: StateQuery): Promise<Thread | null>;
55
+ listThreads(query?: StateQuery & PageOptions): Promise<import("./state/schema.js").Page<ThreadInfo>>;
56
+ deleteThread(id: string, query?: StateQuery): Promise<void>;
57
+ purgeThread(id: string, query?: StateQuery): Promise<void>;
58
+ renameThread(id: string, title: string, query?: StateQuery): Promise<void>;
59
+ forkThread(id: string, options?: ForkOptions & StateQuery): Promise<Thread>;
60
+ private threadContext;
61
+ dispose(): Promise<void>;
62
+ }