@dex-ai/sdk 0.1.30

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 (85) hide show
  1. package/README.md +308 -0
  2. package/dist/agent.d.ts +181 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +41 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/context.d.ts +68 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +8 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/create-agent.d.ts +7 -0
  11. package/dist/create-agent.d.ts.map +1 -0
  12. package/dist/create-agent.js +205 -0
  13. package/dist/create-agent.js.map +1 -0
  14. package/dist/extension.d.ts +162 -0
  15. package/dist/extension.d.ts.map +1 -0
  16. package/dist/extension.js +20 -0
  17. package/dist/extension.js.map +1 -0
  18. package/dist/generate.d.ts +10 -0
  19. package/dist/generate.d.ts.map +1 -0
  20. package/dist/generate.js +839 -0
  21. package/dist/generate.js.map +1 -0
  22. package/dist/index.d.ts +26 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +16 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/message.d.ts +89 -0
  27. package/dist/message.d.ts.map +1 -0
  28. package/dist/message.js +17 -0
  29. package/dist/message.js.map +1 -0
  30. package/dist/messages.d.ts +98 -0
  31. package/dist/messages.d.ts.map +1 -0
  32. package/dist/messages.js +339 -0
  33. package/dist/messages.js.map +1 -0
  34. package/dist/model.d.ts +39 -0
  35. package/dist/model.d.ts.map +1 -0
  36. package/dist/model.js +11 -0
  37. package/dist/model.js.map +1 -0
  38. package/dist/provider.d.ts +157 -0
  39. package/dist/provider.d.ts.map +1 -0
  40. package/dist/provider.js +39 -0
  41. package/dist/provider.js.map +1 -0
  42. package/dist/resolve-schema.d.ts +44 -0
  43. package/dist/resolve-schema.d.ts.map +1 -0
  44. package/dist/resolve-schema.js +367 -0
  45. package/dist/resolve-schema.js.map +1 -0
  46. package/dist/schema.d.ts +80 -0
  47. package/dist/schema.d.ts.map +1 -0
  48. package/dist/schema.js +90 -0
  49. package/dist/schema.js.map +1 -0
  50. package/dist/tool-dispatch.d.ts +24 -0
  51. package/dist/tool-dispatch.d.ts.map +1 -0
  52. package/dist/tool-dispatch.js +120 -0
  53. package/dist/tool-dispatch.js.map +1 -0
  54. package/dist/tool-result-cache.d.ts +43 -0
  55. package/dist/tool-result-cache.d.ts.map +1 -0
  56. package/dist/tool-result-cache.js +118 -0
  57. package/dist/tool-result-cache.js.map +1 -0
  58. package/dist/tool.d.ts +96 -0
  59. package/dist/tool.d.ts.map +1 -0
  60. package/dist/tool.js +29 -0
  61. package/dist/tool.js.map +1 -0
  62. package/dist/util.d.ts +26 -0
  63. package/dist/util.d.ts.map +1 -0
  64. package/dist/util.js +104 -0
  65. package/dist/util.js.map +1 -0
  66. package/package.json +41 -0
  67. package/src/agent.ts +235 -0
  68. package/src/context.ts +82 -0
  69. package/src/create-agent.ts +237 -0
  70. package/src/extension.ts +244 -0
  71. package/src/generate.ts +943 -0
  72. package/src/index.ts +113 -0
  73. package/src/message.ts +114 -0
  74. package/src/messages.test.ts +299 -0
  75. package/src/messages.ts +423 -0
  76. package/src/model.ts +43 -0
  77. package/src/provider.ts +187 -0
  78. package/src/resolve-schema.test.ts +351 -0
  79. package/src/resolve-schema.ts +426 -0
  80. package/src/schema.ts +131 -0
  81. package/src/tool-dispatch.ts +166 -0
  82. package/src/tool-result-cache.test.ts +182 -0
  83. package/src/tool-result-cache.ts +164 -0
  84. package/src/tool.ts +110 -0
  85. package/src/util.ts +110 -0
@@ -0,0 +1,205 @@
1
+ /** createAgentImpl — wires extensions into an Agent instance. */
2
+ import { runGenerate } from "./generate";
3
+ import { resolveConfig, cleanCacheDir, TOOL_RESULT_CACHE_KEY, } from "./tool-result-cache";
4
+ import { Messages } from "./messages";
5
+ export function resolveModel(extensions, providerName, modelId) {
6
+ for (const ext of extensions) {
7
+ if (ext.name !== providerName || !ext.models)
8
+ continue;
9
+ const model = ext.models.find((m) => m.id === modelId);
10
+ if (model)
11
+ return model;
12
+ }
13
+ throw new Error(`No model "${modelId}" found on provider "${providerName}".`);
14
+ }
15
+ export async function createAgentImpl(opts) {
16
+ const extensions = opts.extensions ?? [];
17
+ // Seed messages (non-system) to append after system prompt assembly
18
+ const seedMessages = [];
19
+ if (opts.messages) {
20
+ seedMessages.push(...opts.messages);
21
+ }
22
+ // NOTE: We intentionally do NOT eagerly validate the model here.
23
+ // actx.model is a lazy getter — it will throw on first generate() call
24
+ // if the provider/model combination is invalid. This allows the agent
25
+ // (and its TUI) to start up and let the user fix configuration via
26
+ // /model or /provider commands.
27
+ const messageStore = new Messages();
28
+ const actx = Object.defineProperties({
29
+ name: opts.name ?? "agent",
30
+ extensions,
31
+ messages: messageStore.array,
32
+ messageStore,
33
+ tokenCount: 0,
34
+ state: new Map(),
35
+ providerName: opts.provider,
36
+ modelId: opts.model,
37
+ appendMessage(message) {
38
+ messageStore.append(message);
39
+ },
40
+ ...(opts.signal !== undefined ? { signal: opts.signal } : {}),
41
+ ...(opts.metadata !== undefined ? { metadata: opts.metadata } : {}),
42
+ }, {
43
+ model: {
44
+ get() {
45
+ return resolveModel(extensions, actx.providerName, actx.modelId);
46
+ },
47
+ enumerable: true,
48
+ },
49
+ });
50
+ // ── Agent setup is a batch: validation deferred until all messages are
51
+ // in place (extensions may append history during init, system prompt is
52
+ // assembled after, then reordered). ──
53
+ messageStore.batch();
54
+ // init() on each extension (registration order).
55
+ for (const ext of extensions) {
56
+ if (ext.init)
57
+ await ext.init(actx);
58
+ }
59
+ // ── Tool result cache setup ──────────────────────────────────────────
60
+ if (opts.toolResultCache) {
61
+ const cacheConfig = resolveConfig(opts.toolResultCache);
62
+ actx.state.set(TOOL_RESULT_CACHE_KEY, cacheConfig);
63
+ await cleanCacheDir(cacheConfig);
64
+ }
65
+ // ── Assemble system prompt ──────────────────────────────────────────
66
+ // We consolidate all system-level content (systemPrompt + skills +
67
+ // session-start context) into a single system message. The last text
68
+ // block gets a cache_control breakpoint so providers that support
69
+ // prompt caching (Anthropic) can cache the static system prefix.
70
+ const systemParts = [];
71
+ // 1. Explicit system prompt from opts
72
+ if (opts.systemPrompt !== undefined) {
73
+ systemParts.push(opts.systemPrompt);
74
+ }
75
+ // 2. Collect skills from extensions — build catalog and store content in state
76
+ const skillMap = new Map();
77
+ const catalogLines = [];
78
+ for (const ext of extensions) {
79
+ const raw = ext.skills;
80
+ if (raw === undefined)
81
+ continue;
82
+ const list = Array.isArray(raw) ? raw : [raw];
83
+ for (const skill of list) {
84
+ if (skill.when) {
85
+ const active = await skill.when(actx);
86
+ if (!active)
87
+ continue;
88
+ }
89
+ const text = typeof skill.content === "function"
90
+ ? await skill.content(actx)
91
+ : skill.content;
92
+ if (text) {
93
+ skillMap.set(skill.name, text);
94
+ const desc = skill.description ? `: ${skill.description}` : "";
95
+ catalogLines.push(`- **${skill.name}**${desc}`);
96
+ }
97
+ }
98
+ }
99
+ if (catalogLines.length > 0) {
100
+ systemParts.push(`## Available Skills\n\nUse the \`get_skill\` tool to retrieve detailed instructions when needed.\n\n${catalogLines.join("\n")}`);
101
+ }
102
+ actx.state.set("skills", skillMap);
103
+ // 3. Collect session-start context from extensions
104
+ const sessionContent = [];
105
+ for (const ext of extensions) {
106
+ const handler = ext.on?.["session-start"];
107
+ if (!handler)
108
+ continue;
109
+ try {
110
+ const result = await handler(actx);
111
+ if (result && Symbol.asyncIterator in result) {
112
+ for await (const c of result) {
113
+ sessionContent.push(c);
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ /* observer */
119
+ }
120
+ }
121
+ // Extract text from session content and add to system parts
122
+ for (const c of sessionContent) {
123
+ if (c.type === "text") {
124
+ systemParts.push(c.text);
125
+ }
126
+ }
127
+ // Assemble the single system message with cache breakpoint on last block
128
+ if (systemParts.length > 0) {
129
+ const lastBlock = {
130
+ type: "text",
131
+ text: systemParts.join("\n\n"),
132
+ cacheControl: { type: "ephemeral" },
133
+ };
134
+ actx.appendMessage({
135
+ role: "system",
136
+ content: [lastBlock],
137
+ });
138
+ }
139
+ // Append any non-text session content as a separate context message
140
+ const nonTextSession = sessionContent.filter((c) => c.type !== "text");
141
+ if (nonTextSession.length > 0) {
142
+ actx.appendMessage({
143
+ role: "system",
144
+ content: nonTextSession,
145
+ type: "context-session",
146
+ });
147
+ }
148
+ // Ensure system messages are at the front (extensions may have appended
149
+ // conversation history during init() — e.g. session resume).
150
+ const allMsgs = [...messageStore.array];
151
+ const systemMsgs = allMsgs.filter((m) => m.role === "system");
152
+ const nonSystemMsgs = allMsgs.filter((m) => m.role !== "system");
153
+ messageStore._unsafeSetLength(0);
154
+ messageStore._unsafePush(...systemMsgs, ...nonSystemMsgs);
155
+ // Seed messages (non-system)
156
+ if (seedMessages.length > 0) {
157
+ for (const m of seedMessages) {
158
+ const withId = m.id !== undefined ? m : { ...m, id: crypto.randomUUID() };
159
+ messageStore._unsafePush(withId);
160
+ }
161
+ }
162
+ // End batch — validate the assembled message sequence.
163
+ messageStore.commit();
164
+ let disposed = false;
165
+ const agent = {
166
+ context: actx,
167
+ generate(o) {
168
+ if (disposed)
169
+ throw new Error("Agent has been disposed");
170
+ return runGenerate(actx, o);
171
+ },
172
+ async dispose() {
173
+ if (disposed)
174
+ return;
175
+ disposed = true;
176
+ // emit('session-stop') in reverse order
177
+ for (let i = extensions.length - 1; i >= 0; i--) {
178
+ const ext = extensions[i];
179
+ const handler = ext?.on?.["session-stop"];
180
+ if (handler) {
181
+ try {
182
+ await handler(actx);
183
+ }
184
+ catch {
185
+ /* */
186
+ }
187
+ }
188
+ }
189
+ // dispose() in reverse order
190
+ for (let i = extensions.length - 1; i >= 0; i--) {
191
+ const ext = extensions[i];
192
+ if (ext?.dispose) {
193
+ try {
194
+ await ext.dispose(actx);
195
+ }
196
+ catch {
197
+ /* */
198
+ }
199
+ }
200
+ }
201
+ },
202
+ };
203
+ return agent;
204
+ }
205
+ //# sourceMappingURL=create-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-agent.js","sourceRoot":"","sources":["../src/create-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Extension — the universal building block.
3
+ *
4
+ * Extensions contribute models, tools, skills, config, and event handlers.
5
+ * The agent loop emits events; extensions subscribe via `on`.
6
+ *
7
+ * Host-specific capabilities (e.g. CLI commands) are added by the host layer
8
+ * and discovered at runtime via duck typing — extensions don't need to know
9
+ * about every host that might load them.
10
+ */
11
+ import type { ModelRequest } from "./provider";
12
+ import type { ToolCall, ToolResult, AnyTool } from "./tool";
13
+ import type { AgentContext, GenerateContext } from "./context";
14
+ import type { Content, Message } from "./message";
15
+ import type { Model } from "./model";
16
+ import type { StandardSchemaV1 } from "./schema";
17
+ export type MaybePromise<T> = T | Promise<T>;
18
+ export interface ErrorSource {
19
+ readonly kind: "provider" | "tool" | "extension" | "loop";
20
+ readonly request?: ModelRequest;
21
+ readonly call?: ToolCall;
22
+ readonly extensionName?: string;
23
+ readonly event?: string;
24
+ }
25
+ /**
26
+ * A skill — structured instructions injected into the system prompt.
27
+ *
28
+ * Skills are context-sensitive guidance: coding patterns, tool usage hints,
29
+ * domain knowledge, etc. They can be static text or dynamically generated
30
+ * based on the current session state.
31
+ */
32
+ export interface Skill {
33
+ /** Stable identifier, e.g. "memory.recall" or "coding.typescript". */
34
+ readonly name: string;
35
+ /** Short description shown in listings. */
36
+ readonly description?: string;
37
+ /**
38
+ * The skill content. Either:
39
+ * - A static string (markdown/text injected as-is), or
40
+ * - A function that generates content based on context.
41
+ */
42
+ readonly content: string | ((actx: AgentContext) => MaybePromise<string>);
43
+ /**
44
+ * When this skill should be active. If omitted, always active.
45
+ * Return false to suppress the skill for this session/generate.
46
+ */
47
+ readonly when?: (actx: AgentContext) => MaybePromise<boolean>;
48
+ }
49
+ /**
50
+ * Typed configuration schema for an extension.
51
+ *
52
+ * Extensions declare the config they accept. The host (CLI, SDK, ACP)
53
+ * validates user-supplied config against this schema at load time.
54
+ *
55
+ * Config values come from (in priority order):
56
+ * 1. Environment variables: DEX_<EXT_NAME>_<KEY> (uppercased, dot → underscore)
57
+ * 2. dex.config.ts → extensions section
58
+ * 3. Defaults declared here
59
+ */
60
+ export interface ConfigField {
61
+ readonly type: "string" | "number" | "boolean" | "array" | "object";
62
+ readonly description?: string;
63
+ readonly default?: unknown;
64
+ readonly required?: boolean;
65
+ /** Environment variable override name. Auto-generated if omitted. */
66
+ readonly env?: string;
67
+ }
68
+ /**
69
+ * Config schema — either a simple record of field descriptors,
70
+ * or a Standard Schema for full validation power.
71
+ */
72
+ export type ConfigSchema = Record<string, ConfigField> | StandardSchemaV1;
73
+ export interface ExtensionEvents {
74
+ "session-start"?: (actx: AgentContext) => MaybePromise<AsyncIterable<Content> | void>;
75
+ "session-stop"?: (actx: AgentContext) => MaybePromise<void>;
76
+ /**
77
+ * Fired before input messages are committed.
78
+ * Extensions can return additional Content to append to the last user message.
79
+ * Use this for attachments, context injection, etc.
80
+ */
81
+ "generate-input"?: (input: ReadonlyArray<Message>, gctx: GenerateContext) => MaybePromise<ReadonlyArray<Content> | void>;
82
+ "generate-start"?: (gctx: GenerateContext) => MaybePromise<AsyncIterable<Content> | void>;
83
+ "generate-stop"?: (gctx: GenerateContext) => MaybePromise<void>;
84
+ "model-start"?: (req: ModelRequest, gctx: GenerateContext) => MaybePromise<ModelRequest | void>;
85
+ "model-stop"?: (gctx: GenerateContext) => MaybePromise<void>;
86
+ "message-start"?: (gctx: GenerateContext) => MaybePromise<void>;
87
+ "message-stop"?: (message: Message, gctx: GenerateContext) => MaybePromise<void>;
88
+ "text-delta"?: (delta: string, gctx: GenerateContext) => MaybePromise<void>;
89
+ "reasoning-delta"?: (delta: string, gctx: GenerateContext) => MaybePromise<void>;
90
+ "tool-call-delta"?: (delta: {
91
+ toolCallId: string;
92
+ toolName: string;
93
+ inputDelta: string;
94
+ }, gctx: GenerateContext) => MaybePromise<void>;
95
+ "tool-start"?: (call: ToolCall, gctx: GenerateContext) => MaybePromise<ToolCall | ToolResult | void>;
96
+ "tool-stop"?: (result: ToolResult, gctx: GenerateContext) => MaybePromise<ToolResult | void>;
97
+ error?: (error: unknown, source: ErrorSource, gctx: GenerateContext) => MaybePromise<void>;
98
+ }
99
+ /**
100
+ * A single config field that a provider needs.
101
+ * Used by the CLI to prompt users during interactive provider setup.
102
+ */
103
+ export interface ProviderConfigField {
104
+ /** Config key (e.g. "apiKey", "baseUrl"). */
105
+ readonly key: string;
106
+ /** Human-readable label shown during setup. */
107
+ readonly label: string;
108
+ /** Whether this field is required. */
109
+ readonly required: boolean;
110
+ /** If true, masks input (for API keys). */
111
+ readonly secret?: boolean;
112
+ /** Default value. */
113
+ readonly default?: string;
114
+ /** Environment variable fallback name. */
115
+ readonly envVar?: string;
116
+ /** Help text shown during input. */
117
+ readonly hint?: string;
118
+ }
119
+ /**
120
+ * A provider descriptor — declares config schema and factory.
121
+ * Exported by each provider package so the CLI can drive interactive setup.
122
+ */
123
+ export interface ProviderDescriptor {
124
+ /** Provider type identifier (e.g. "openai", "anthropic"). */
125
+ readonly type: string;
126
+ /** Human-readable name (e.g. "OpenAI", "Anthropic"). */
127
+ readonly label: string;
128
+ /** Config fields this provider needs. */
129
+ readonly fields: ReadonlyArray<ProviderConfigField>;
130
+ /** Create a provider extension from a config object. */
131
+ create(config: Record<string, unknown>): Extension;
132
+ }
133
+ export interface Extension {
134
+ /** Stable identifier. For provider extensions, this is the provider name. */
135
+ readonly name: string;
136
+ /** Human-readable description of what this extension does. */
137
+ readonly description?: string;
138
+ /** Models this extension provides. */
139
+ readonly models?: ReadonlyArray<Model>;
140
+ /** Tools this extension contributes to the agent. */
141
+ readonly tools?: AnyTool | ReadonlyArray<AnyTool>;
142
+ /** Skills — structured instructions injected into the system prompt. */
143
+ readonly skills?: Skill | ReadonlyArray<Skill>;
144
+ /**
145
+ * Configuration schema. Declares the config keys this extension accepts.
146
+ * Values are resolved from env vars, dex.config.ts, and defaults.
147
+ */
148
+ readonly config?: ConfigSchema;
149
+ /** Event handlers. The loop emits events; extensions subscribe here. */
150
+ readonly on?: ExtensionEvents;
151
+ /** Called during Agent.create(). Seed long-lived resources. */
152
+ init?(actx: AgentContext): MaybePromise<void>;
153
+ /** Called during agent.dispose(). Release long-lived resources. Reverse order. */
154
+ dispose?(actx: AgentContext): MaybePromise<void>;
155
+ }
156
+ /**
157
+ * Extension namespace — identity-typed declaration helper.
158
+ */
159
+ export declare const Extension: {
160
+ define<E extends Extension>(ext: E): E;
161
+ };
162
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Extension — the universal building block.
3
+ *
4
+ * Extensions contribute models, tools, skills, config, and event handlers.
5
+ * The agent loop emits events; extensions subscribe via `on`.
6
+ *
7
+ * Host-specific capabilities (e.g. CLI commands) are added by the host layer
8
+ * and discovered at runtime via duck typing — extensions don't need to know
9
+ * about every host that might load them.
10
+ */
11
+ /**
12
+ * Extension namespace — identity-typed declaration helper.
13
+ */
14
+ // eslint-disable-next-line @typescript-eslint/no-redeclare
15
+ export const Extension = {
16
+ define(ext) {
17
+ return ext;
18
+ },
19
+ };
20
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkOH;;GAEG;AACH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,MAAM,CAAsB,GAAM;QACjC,OAAO,GAAG,CAAC;IACZ,CAAC;CACD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The generate loop — event-driven.
3
+ *
4
+ * Emits events to extensions via ext.on['event-name']. Extensions subscribe
5
+ * to events they care about. The loop orchestrates model calls, tool dispatch,
6
+ * and context injection purely through events.
7
+ */
8
+ import type { AgentContext, AgentStream, GenerateOptions } from "./index";
9
+ export declare function runGenerate(actx: AgentContext, opts: GenerateOptions): AgentStream;
10
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACX,YAAY,EACZ,WAAW,EAQX,eAAe,EAQf,MAAM,SAAS,CAAC;AAkQjB,wBAAgB,WAAW,CAC1B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,eAAe,GACnB,WAAW,CAiBb"}