@nexalab/agent-sdk 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/LICENSE +15 -0
- package/README.md +518 -0
- package/bin/nexa.mjs +33 -0
- package/dist/advanced-memory.d.ts +32 -0
- package/dist/advanced-memory.d.ts.map +1 -0
- package/dist/advanced-memory.js +54 -0
- package/dist/advanced-memory.js.map +1 -0
- package/dist/agent-builder.d.ts +60 -0
- package/dist/agent-builder.d.ts.map +1 -0
- package/dist/agent-builder.js +141 -0
- package/dist/agent-builder.js.map +1 -0
- package/dist/approvals.d.ts +34 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +54 -0
- package/dist/approvals.js.map +1 -0
- package/dist/artifacts.d.ts +13 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +13 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/cache.d.ts +17 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +29 -0
- package/dist/cache.js.map +1 -0
- package/dist/completion-gate.d.ts +5 -0
- package/dist/completion-gate.d.ts.map +1 -0
- package/dist/completion-gate.js +20 -0
- package/dist/completion-gate.js.map +1 -0
- package/dist/console-chat.d.ts +110 -0
- package/dist/console-chat.d.ts.map +1 -0
- package/dist/console-chat.js +284 -0
- package/dist/console-chat.js.map +1 -0
- package/dist/context.d.ts +45 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +92 -0
- package/dist/context.js.map +1 -0
- package/dist/evals.d.ts +38 -0
- package/dist/evals.d.ts.map +1 -0
- package/dist/evals.js +37 -0
- package/dist/evals.js.map +1 -0
- package/dist/event-bus.d.ts +28 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +28 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/file-storage.d.ts +25 -0
- package/dist/file-storage.d.ts.map +1 -0
- package/dist/file-storage.js +100 -0
- package/dist/file-storage.js.map +1 -0
- package/dist/guardrails.d.ts +44 -0
- package/dist/guardrails.d.ts.map +1 -0
- package/dist/guardrails.js +37 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/harness.d.ts +26 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +49 -0
- package/dist/harness.js.map +1 -0
- package/dist/hooks.d.ts +58 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +16 -0
- package/dist/hooks.js.map +1 -0
- package/dist/http-adapter.d.ts +13 -0
- package/dist/http-adapter.d.ts.map +1 -0
- package/dist/http-adapter.js +33 -0
- package/dist/http-adapter.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +90 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +251 -0
- package/dist/kernel.js.map +1 -0
- package/dist/knowledge.d.ts +35 -0
- package/dist/knowledge.d.ts.map +1 -0
- package/dist/knowledge.js +89 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/local-tool-executor.d.ts +26 -0
- package/dist/local-tool-executor.d.ts.map +1 -0
- package/dist/local-tool-executor.js +30 -0
- package/dist/local-tool-executor.js.map +1 -0
- package/dist/loop-guard.d.ts +15 -0
- package/dist/loop-guard.d.ts.map +1 -0
- package/dist/loop-guard.js +12 -0
- package/dist/loop-guard.js.map +1 -0
- package/dist/manifest.d.ts +43 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +31 -0
- package/dist/manifest.js.map +1 -0
- package/dist/mcp.d.ts +55 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +175 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +32 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +40 -0
- package/dist/memory.js.map +1 -0
- package/dist/mission-runtime.d.ts +106 -0
- package/dist/mission-runtime.d.ts.map +1 -0
- package/dist/mission-runtime.js +196 -0
- package/dist/mission-runtime.js.map +1 -0
- package/dist/model-harness.d.ts +23 -0
- package/dist/model-harness.d.ts.map +1 -0
- package/dist/model-harness.js +7 -0
- package/dist/model-harness.js.map +1 -0
- package/dist/model-router.d.ts +60 -0
- package/dist/model-router.d.ts.map +1 -0
- package/dist/model-router.js +90 -0
- package/dist/model-router.js.map +1 -0
- package/dist/multi-agent.d.ts +56 -0
- package/dist/multi-agent.d.ts.map +1 -0
- package/dist/multi-agent.js +69 -0
- package/dist/multi-agent.js.map +1 -0
- package/dist/native-tool-loop.d.ts +70 -0
- package/dist/native-tool-loop.d.ts.map +1 -0
- package/dist/native-tool-loop.js +92 -0
- package/dist/native-tool-loop.js.map +1 -0
- package/dist/openai-agent.d.ts +75 -0
- package/dist/openai-agent.d.ts.map +1 -0
- package/dist/openai-agent.js +190 -0
- package/dist/openai-agent.js.map +1 -0
- package/dist/openai-compatible.d.ts +117 -0
- package/dist/openai-compatible.d.ts.map +1 -0
- package/dist/openai-compatible.js +486 -0
- package/dist/openai-compatible.js.map +1 -0
- package/dist/otel.d.ts +12 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +35 -0
- package/dist/otel.js.map +1 -0
- package/dist/permissions.d.ts +6 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +33 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plan-validator.d.ts +9 -0
- package/dist/plan-validator.d.ts.map +1 -0
- package/dist/plan-validator.js +27 -0
- package/dist/plan-validator.js.map +1 -0
- package/dist/policy.d.ts +27 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +37 -0
- package/dist/policy.js.map +1 -0
- package/dist/postgres-storage.d.ts +33 -0
- package/dist/postgres-storage.d.ts.map +1 -0
- package/dist/postgres-storage.js +80 -0
- package/dist/postgres-storage.js.map +1 -0
- package/dist/provider-capabilities.d.ts +13 -0
- package/dist/provider-capabilities.d.ts.map +1 -0
- package/dist/provider-capabilities.js +19 -0
- package/dist/provider-capabilities.js.map +1 -0
- package/dist/providers.d.ts +14 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +69 -0
- package/dist/providers.js.map +1 -0
- package/dist/queue.d.ts +29 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +36 -0
- package/dist/queue.js.map +1 -0
- package/dist/redis-storage.d.ts +36 -0
- package/dist/redis-storage.d.ts.map +1 -0
- package/dist/redis-storage.js +68 -0
- package/dist/redis-storage.js.map +1 -0
- package/dist/replay.d.ts +13 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +32 -0
- package/dist/replay.js.map +1 -0
- package/dist/runtime.d.ts +54 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +218 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sdk.d.ts +43 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +82 -0
- package/dist/sdk.js.map +1 -0
- package/dist/secrets.d.ts +9 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +23 -0
- package/dist/secrets.js.map +1 -0
- package/dist/sessions.d.ts +44 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +76 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills.d.ts +12 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +13 -0
- package/dist/skills.js.map +1 -0
- package/dist/smoke.d.ts +8 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +5 -0
- package/dist/smoke.js.map +1 -0
- package/dist/sqlite-storage.d.ts +30 -0
- package/dist/sqlite-storage.d.ts.map +1 -0
- package/dist/sqlite-storage.js +52 -0
- package/dist/sqlite-storage.js.map +1 -0
- package/dist/storage.d.ts +74 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +83 -0
- package/dist/storage.js.map +1 -0
- package/dist/structured-output.d.ts +14 -0
- package/dist/structured-output.d.ts.map +1 -0
- package/dist/structured-output.js +24 -0
- package/dist/structured-output.js.map +1 -0
- package/dist/telemetry.d.ts +27 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +40 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tenancy.d.ts +9 -0
- package/dist/tenancy.d.ts.map +1 -0
- package/dist/tenancy.js +8 -0
- package/dist/tenancy.js.map +1 -0
- package/dist/tool-factory.d.ts +25 -0
- package/dist/tool-factory.d.ts.map +1 -0
- package/dist/tool-factory.js +38 -0
- package/dist/tool-factory.js.map +1 -0
- package/dist/tool-orchestrator.d.ts +89 -0
- package/dist/tool-orchestrator.d.ts.map +1 -0
- package/dist/tool-orchestrator.js +102 -0
- package/dist/tool-orchestrator.js.map +1 -0
- package/dist/tool-registry.d.ts +52 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +19 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/types.d.ts +1020 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +115 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-memory.d.ts +19 -0
- package/dist/vector-memory.d.ts.map +1 -0
- package/dist/vector-memory.js +58 -0
- package/dist/vector-memory.js.map +1 -0
- package/dist/workflow.d.ts +65 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +102 -0
- package/dist/workflow.js.map +1 -0
- package/dist/workspace.d.ts +35 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +131 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +223 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import readline from "node:readline/promises";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { createNexaAgentSdk } from "./sdk.js";
|
|
4
|
+
import { OpenAICompatibleChatClient, OpenAICompatibleRegistry, createOpenAICompatibleReasoner } from "./openai-compatible.js";
|
|
5
|
+
import { LocalToolExecutor } from "./local-tool-executor.js";
|
|
6
|
+
export class PremiumConsoleRenderer {
|
|
7
|
+
output;
|
|
8
|
+
constructor(output = process.stdout) {
|
|
9
|
+
this.output = output;
|
|
10
|
+
}
|
|
11
|
+
header(input) {
|
|
12
|
+
this.line(color("Nexa Agent SDK Console", "gold"));
|
|
13
|
+
this.line(`${muted("env")} ${input.loadedEnvLabel ?? "none"}`);
|
|
14
|
+
this.line(`${muted("provider")} ${input.providerId}`);
|
|
15
|
+
if (input.baseUrl)
|
|
16
|
+
this.line(`${muted("baseUrl")} ${input.baseUrl}`);
|
|
17
|
+
this.line(`${muted("model")} ${input.model}`);
|
|
18
|
+
this.line(`${muted("trace")} ${input.trace ? "on" : "off"}`);
|
|
19
|
+
this.line("");
|
|
20
|
+
this.line(muted("Commands"));
|
|
21
|
+
for (const command of input.commands)
|
|
22
|
+
this.line(` ${color(command.name, "cyan")} ${muted(command.description)}`);
|
|
23
|
+
this.line("");
|
|
24
|
+
}
|
|
25
|
+
prompt() {
|
|
26
|
+
return `${color("you", "gold")}> `;
|
|
27
|
+
}
|
|
28
|
+
status(label, detail) {
|
|
29
|
+
this.line(`${color("◇", "cyan")} ${label}${detail ? ` ${muted(detail)}` : ""}`);
|
|
30
|
+
}
|
|
31
|
+
trace(event) {
|
|
32
|
+
this.line(`${muted("[trace]")} ${event.type}: ${JSON.stringify(event)}`);
|
|
33
|
+
}
|
|
34
|
+
assistantStart() {
|
|
35
|
+
this.write(`${color("nexa", "gold")}> `);
|
|
36
|
+
}
|
|
37
|
+
token(text) {
|
|
38
|
+
this.write(text);
|
|
39
|
+
}
|
|
40
|
+
assistantEnd() {
|
|
41
|
+
this.line("\n");
|
|
42
|
+
}
|
|
43
|
+
toolResult(toolId, result) {
|
|
44
|
+
if (result.status === "ok")
|
|
45
|
+
this.line(`${color("tool", "cyan")}> ${toolId}: ${JSON.stringify(result.output)}`);
|
|
46
|
+
else
|
|
47
|
+
this.line(`${color("tool", "red")}> ${toolId}: ${JSON.stringify(result)}`);
|
|
48
|
+
this.line("");
|
|
49
|
+
}
|
|
50
|
+
line(text = "") {
|
|
51
|
+
this.output.write(`${text}\n`);
|
|
52
|
+
}
|
|
53
|
+
write(text) {
|
|
54
|
+
this.output.write(text);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class ConsoleChatIntegration {
|
|
58
|
+
options;
|
|
59
|
+
renderer;
|
|
60
|
+
commands;
|
|
61
|
+
messages;
|
|
62
|
+
constructor(options) {
|
|
63
|
+
this.options = options;
|
|
64
|
+
this.renderer = new PremiumConsoleRenderer();
|
|
65
|
+
this.commands = [
|
|
66
|
+
toolsCommand,
|
|
67
|
+
exitCommand,
|
|
68
|
+
...(options.commands ?? [])
|
|
69
|
+
];
|
|
70
|
+
this.messages = [
|
|
71
|
+
{
|
|
72
|
+
role: "system",
|
|
73
|
+
content: options.systemPrompt ?? "You are Nexa, a concise and useful AI assistant running through @nexalab/agent-sdk."
|
|
74
|
+
}
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
trace(event) {
|
|
78
|
+
if (this.options.trace ?? true)
|
|
79
|
+
this.renderer.trace(event);
|
|
80
|
+
}
|
|
81
|
+
async run(runOptions = {}) {
|
|
82
|
+
const input = runOptions.input ?? process.stdin;
|
|
83
|
+
const output = runOptions.output ?? process.stdout;
|
|
84
|
+
const scriptedInputs = input.isTTY ? null : readFileSync(0, "utf8").split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
85
|
+
const rl = input.isTTY ? readline.createInterface({ input, output }) : null;
|
|
86
|
+
this.renderer.header({
|
|
87
|
+
providerId: this.options.providerLabel ?? this.options.providerId,
|
|
88
|
+
model: this.options.model,
|
|
89
|
+
commands: this.commands,
|
|
90
|
+
trace: this.options.trace ?? true,
|
|
91
|
+
...(this.options.loadedEnvLabel ? { loadedEnvLabel: this.options.loadedEnvLabel } : {}),
|
|
92
|
+
...(this.options.baseUrl ? { baseUrl: this.options.baseUrl } : {})
|
|
93
|
+
});
|
|
94
|
+
for (;;) {
|
|
95
|
+
const answer = scriptedInputs ? scriptedInputs.shift() ?? "/exit" : await rl.question(this.renderer.prompt()).catch(() => "/exit");
|
|
96
|
+
const text = answer.trim();
|
|
97
|
+
if (scriptedInputs)
|
|
98
|
+
this.renderer.line(`${this.renderer.prompt()}${text}`);
|
|
99
|
+
if (!text)
|
|
100
|
+
continue;
|
|
101
|
+
const command = this.commands.find((item) => item.name === text.split(/\s+/)[0]);
|
|
102
|
+
if (command) {
|
|
103
|
+
const result = await command.run({
|
|
104
|
+
sdk: this.options.sdk,
|
|
105
|
+
messages: this.messages,
|
|
106
|
+
write: (line = "") => this.renderer.line(line)
|
|
107
|
+
});
|
|
108
|
+
if (result === "exit")
|
|
109
|
+
break;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
await this.answer(text);
|
|
113
|
+
}
|
|
114
|
+
rl?.close();
|
|
115
|
+
}
|
|
116
|
+
async answer(text) {
|
|
117
|
+
this.messages.push({ role: "user", content: text });
|
|
118
|
+
this.renderer.status("preparing agent turn");
|
|
119
|
+
const turn = await this.options.sdk.prepareTurnWithTools({
|
|
120
|
+
text,
|
|
121
|
+
messages: this.messages
|
|
122
|
+
});
|
|
123
|
+
this.renderer.status("agent run", `${turn.run.state} ${turn.run.runId}`);
|
|
124
|
+
if (turn.toolTurn.selectedTools.length) {
|
|
125
|
+
this.renderer.status("tools selected", turn.toolTurn.selectedTools.map((intent) => intent.tool.id).join(", "));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
this.renderer.status("tools selected", "none");
|
|
129
|
+
}
|
|
130
|
+
this.renderer.assistantStart();
|
|
131
|
+
let assistantText = "";
|
|
132
|
+
for await (const chunk of this.options.client.stream({
|
|
133
|
+
providerId: this.options.providerId,
|
|
134
|
+
model: this.options.model,
|
|
135
|
+
messages: turn.modelMessages,
|
|
136
|
+
stream: true
|
|
137
|
+
})) {
|
|
138
|
+
if (chunk.done)
|
|
139
|
+
break;
|
|
140
|
+
assistantText += chunk.text;
|
|
141
|
+
this.renderer.token(chunk.text);
|
|
142
|
+
}
|
|
143
|
+
this.renderer.assistantEnd();
|
|
144
|
+
this.messages.push({ role: "assistant", content: assistantText });
|
|
145
|
+
this.options.sdk.memory.write({
|
|
146
|
+
kind: "episode",
|
|
147
|
+
content: `User: ${text}\nAssistant: ${assistantText}`,
|
|
148
|
+
source: "console-chat",
|
|
149
|
+
tags: ["chat", this.options.providerId, this.options.model],
|
|
150
|
+
importance: 0.6
|
|
151
|
+
});
|
|
152
|
+
return assistantText;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export function createConsoleChatIntegration(options) {
|
|
156
|
+
return new ConsoleChatIntegration(options);
|
|
157
|
+
}
|
|
158
|
+
export async function createOpenAICompatibleConsoleAgent(options) {
|
|
159
|
+
const registry = new OpenAICompatibleRegistry();
|
|
160
|
+
registry.register({
|
|
161
|
+
...options.provider,
|
|
162
|
+
...(options.model ? { defaultModel: options.model } : {})
|
|
163
|
+
});
|
|
164
|
+
const client = new OpenAICompatibleChatClient(registry);
|
|
165
|
+
const model = options.model ?? options.provider.defaultModel ?? (await client.listModels(options.provider.id))[0]?.id;
|
|
166
|
+
if (!model)
|
|
167
|
+
throw new Error(`No model found for provider ${options.provider.id}.`);
|
|
168
|
+
const selectedModel = model;
|
|
169
|
+
const toolExecutor = new LocalToolExecutor();
|
|
170
|
+
for (const registration of options.tools ?? []) {
|
|
171
|
+
toolExecutor.register(registration.tool, registration.handler);
|
|
172
|
+
}
|
|
173
|
+
const sdk = createNexaAgentSdk({
|
|
174
|
+
reasoner: createOpenAICompatibleReasoner({ client, providerId: options.provider.id, model: selectedModel }),
|
|
175
|
+
tools: (options.tools ?? []).map((registration) => registration.tool),
|
|
176
|
+
toolExecutor,
|
|
177
|
+
trace: createConsoleTraceRenderer(options.trace ?? true)
|
|
178
|
+
});
|
|
179
|
+
const commands = (options.tools ?? []).flatMap((registration) => (registration.commands ?? []).map((command) => createToolCommand({
|
|
180
|
+
name: command.name,
|
|
181
|
+
description: command.description,
|
|
182
|
+
toolId: registration.tool.id,
|
|
183
|
+
...(command.input ? { input: command.input } : {})
|
|
184
|
+
})));
|
|
185
|
+
const console = createConsoleChatIntegration({
|
|
186
|
+
sdk,
|
|
187
|
+
client,
|
|
188
|
+
providerId: options.provider.id,
|
|
189
|
+
providerLabel: options.provider.name,
|
|
190
|
+
baseUrl: options.provider.baseUrl,
|
|
191
|
+
model: selectedModel,
|
|
192
|
+
trace: options.trace ?? true,
|
|
193
|
+
commands,
|
|
194
|
+
...(options.loadedEnvLabel ? { loadedEnvLabel: options.loadedEnvLabel } : {}),
|
|
195
|
+
...(options.systemPrompt ? { systemPrompt: options.systemPrompt } : {})
|
|
196
|
+
});
|
|
197
|
+
async function streamMessage(text, streamInput = {}) {
|
|
198
|
+
const messages = streamInput.messages ?? [{ role: "system", content: options.systemPrompt ?? "You are Nexa, a concise and useful AI assistant running through @nexalab/agent-sdk." }];
|
|
199
|
+
streamInput.onStatus?.("user.message.received", text);
|
|
200
|
+
messages.push({ role: "user", content: text });
|
|
201
|
+
streamInput.onStatus?.("agent.turn.prepare");
|
|
202
|
+
const turn = await sdk.prepareTurnWithTools({ text, messages });
|
|
203
|
+
streamInput.onStatus?.("agent.run", `${turn.run.state} ${turn.run.runId}`);
|
|
204
|
+
streamInput.onStatus?.("tools.selected", turn.toolTurn.selectedTools.map((intent) => intent.tool.id).join(", ") || "none");
|
|
205
|
+
let assistantText = "";
|
|
206
|
+
streamInput.onStatus?.("model.stream.start", selectedModel);
|
|
207
|
+
for await (const chunk of client.stream({
|
|
208
|
+
providerId: options.provider.id,
|
|
209
|
+
model: selectedModel,
|
|
210
|
+
messages: turn.modelMessages,
|
|
211
|
+
stream: true
|
|
212
|
+
})) {
|
|
213
|
+
if (chunk.done)
|
|
214
|
+
break;
|
|
215
|
+
assistantText += chunk.text;
|
|
216
|
+
streamInput.onToken?.(chunk.text);
|
|
217
|
+
}
|
|
218
|
+
streamInput.onStatus?.("model.stream.done");
|
|
219
|
+
messages.push({ role: "assistant", content: assistantText });
|
|
220
|
+
return { text: assistantText, messages, toolTurn: turn.toolTurn };
|
|
221
|
+
}
|
|
222
|
+
async function runMessage(text, messages = [{ role: "system", content: options.systemPrompt ?? "You are Nexa, a concise and useful AI assistant running through @nexalab/agent-sdk." }]) {
|
|
223
|
+
return streamMessage(text, { messages });
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
sdk,
|
|
227
|
+
client,
|
|
228
|
+
console,
|
|
229
|
+
model: selectedModel,
|
|
230
|
+
runMessage,
|
|
231
|
+
streamMessage,
|
|
232
|
+
run: (runOptions) => console.run(runOptions)
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
export const createAgentCLI = createOpenAICompatibleConsoleAgent;
|
|
236
|
+
export function createConsoleTraceRenderer(enabled = true) {
|
|
237
|
+
const renderer = new PremiumConsoleRenderer();
|
|
238
|
+
return (event) => {
|
|
239
|
+
if (enabled)
|
|
240
|
+
renderer.trace(event);
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
export function createToolCommand(input) {
|
|
244
|
+
return {
|
|
245
|
+
name: input.name,
|
|
246
|
+
description: input.description,
|
|
247
|
+
async run(context) {
|
|
248
|
+
const result = await context.sdk.toolOrchestrator.executor.execute(input.toolId, input.input ?? {}, {
|
|
249
|
+
taskId: "console",
|
|
250
|
+
runId: "console",
|
|
251
|
+
stepId: `command-${input.name}`
|
|
252
|
+
});
|
|
253
|
+
context.write(`${input.toolId}: ${JSON.stringify(result)}`);
|
|
254
|
+
context.write("");
|
|
255
|
+
return "continue";
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const toolsCommand = {
|
|
260
|
+
name: "/tools",
|
|
261
|
+
description: "list registered tools",
|
|
262
|
+
run(context) {
|
|
263
|
+
for (const tool of context.sdk.tools.list()) {
|
|
264
|
+
context.write(`${tool.id} -> capability=${tool.capability}, provider=${tool.provider}`);
|
|
265
|
+
}
|
|
266
|
+
context.write("");
|
|
267
|
+
return "continue";
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const exitCommand = {
|
|
271
|
+
name: "/exit",
|
|
272
|
+
description: "exit",
|
|
273
|
+
run() {
|
|
274
|
+
return "exit";
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
function color(text, tone) {
|
|
278
|
+
const code = tone === "gold" ? 33 : tone === "cyan" ? 36 : 31;
|
|
279
|
+
return `\u001b[${code}m${text}\u001b[0m`;
|
|
280
|
+
}
|
|
281
|
+
function muted(text) {
|
|
282
|
+
return `\u001b[2m${text}\u001b[0m`;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=console-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-chat.js","sourceRoot":"","sources":["../src/console-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ChatMessage } from "./openai-compatible.js";
|
|
2
|
+
import type { JsonObject } from "./types.js";
|
|
3
|
+
export type ContextResolverInput = {
|
|
4
|
+
runId: string;
|
|
5
|
+
taskId: string;
|
|
6
|
+
text: string;
|
|
7
|
+
};
|
|
8
|
+
export type ContextSectionValue = string | JsonObject | null | undefined;
|
|
9
|
+
export type ContextResolverFn = (input: ContextResolverInput) => ContextSectionValue | Promise<ContextSectionValue>;
|
|
10
|
+
export type ContextSectionInput = string | JsonObject | ContextResolverFn;
|
|
11
|
+
export type ContextEngineConfig = {
|
|
12
|
+
sections?: Record<string, ContextSectionInput>;
|
|
13
|
+
conversation?: boolean;
|
|
14
|
+
knowledge?: ContextSectionInput[];
|
|
15
|
+
dynamic?: ContextResolverFn;
|
|
16
|
+
maxTokens?: number;
|
|
17
|
+
compression?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type ContextBlock = {
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
content: string;
|
|
23
|
+
tokens: number;
|
|
24
|
+
priority: number;
|
|
25
|
+
};
|
|
26
|
+
export type BuiltContext = {
|
|
27
|
+
systemMessage: string;
|
|
28
|
+
blocks: ContextBlock[];
|
|
29
|
+
totalTokens: number;
|
|
30
|
+
truncated: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type BuildContextInput = {
|
|
33
|
+
runId: string;
|
|
34
|
+
taskId: string;
|
|
35
|
+
text: string;
|
|
36
|
+
conversation?: ChatMessage[];
|
|
37
|
+
};
|
|
38
|
+
export declare class ContextEngine {
|
|
39
|
+
private readonly config;
|
|
40
|
+
constructor(config: ContextEngineConfig);
|
|
41
|
+
build(input: BuildContextInput): Promise<BuiltContext>;
|
|
42
|
+
}
|
|
43
|
+
export declare function createContextEngine(config: ContextEngineConfig): ContextEngine;
|
|
44
|
+
export declare function estimateTokens(text: string): number;
|
|
45
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACnF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACpH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,UAAU,GAAG,iBAAiB,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5G,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B,CAAC;AAYF,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,mBAAmB;IAElD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;CA+B7D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAE9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const WELL_KNOWN_PRIORITY = {
|
|
2
|
+
identity: 100,
|
|
3
|
+
user: 90,
|
|
4
|
+
tenant: 85,
|
|
5
|
+
company: 85,
|
|
6
|
+
conversation: 70,
|
|
7
|
+
knowledge: 60,
|
|
8
|
+
dynamic: 50
|
|
9
|
+
};
|
|
10
|
+
export class ContextEngine {
|
|
11
|
+
config;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
async build(input) {
|
|
16
|
+
const resolverInput = { runId: input.runId, taskId: input.taskId, text: input.text };
|
|
17
|
+
const blocks = [];
|
|
18
|
+
for (const [id, section] of Object.entries(this.config.sections ?? {})) {
|
|
19
|
+
const value = await resolveSection(section, resolverInput);
|
|
20
|
+
if (value == null)
|
|
21
|
+
continue;
|
|
22
|
+
blocks.push(toBlock(id, id, value, WELL_KNOWN_PRIORITY[id] ?? 40));
|
|
23
|
+
}
|
|
24
|
+
if (this.config.conversation && input.conversation?.length) {
|
|
25
|
+
const transcript = input.conversation
|
|
26
|
+
.map((message) => `${message.role}: ${message.content}`)
|
|
27
|
+
.join("\n");
|
|
28
|
+
blocks.push(toBlock("conversation", "conversation", transcript, WELL_KNOWN_PRIORITY.conversation ?? 70));
|
|
29
|
+
}
|
|
30
|
+
for (const [index, source] of (this.config.knowledge ?? []).entries()) {
|
|
31
|
+
const value = await resolveSection(source, resolverInput);
|
|
32
|
+
if (value == null)
|
|
33
|
+
continue;
|
|
34
|
+
blocks.push(toBlock(`knowledge-${index}`, "knowledge", value, (WELL_KNOWN_PRIORITY.knowledge ?? 60) - index));
|
|
35
|
+
}
|
|
36
|
+
if (this.config.dynamic) {
|
|
37
|
+
const value = await this.config.dynamic(resolverInput);
|
|
38
|
+
if (value != null)
|
|
39
|
+
blocks.push(toBlock("dynamic", "dynamic", value, WELL_KNOWN_PRIORITY.dynamic ?? 50));
|
|
40
|
+
}
|
|
41
|
+
blocks.sort((a, b) => b.priority - a.priority);
|
|
42
|
+
return applyBudget(blocks, this.config);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function createContextEngine(config) {
|
|
46
|
+
return new ContextEngine(config);
|
|
47
|
+
}
|
|
48
|
+
export function estimateTokens(text) {
|
|
49
|
+
return Math.ceil(text.length / 4);
|
|
50
|
+
}
|
|
51
|
+
async function resolveSection(section, input) {
|
|
52
|
+
const value = typeof section === "function" ? await section(input) : section;
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
function toBlock(id, label, value, priority) {
|
|
56
|
+
const content = typeof value === "string" ? value : JSON.stringify(value);
|
|
57
|
+
return { id, label, content, tokens: estimateTokens(content), priority };
|
|
58
|
+
}
|
|
59
|
+
// OSS reference strategy: plain char-count truncation, not context ranking or adaptive
|
|
60
|
+
// compression. See docs/architecture/open-core-target.md (R3) — `dynamic`/section resolvers
|
|
61
|
+
// are already the intended seam for a more advanced private ranking/compression strategy;
|
|
62
|
+
// no SDK change is needed to plug one in.
|
|
63
|
+
function applyBudget(blocks, config) {
|
|
64
|
+
const maxTokens = config.maxTokens;
|
|
65
|
+
if (!maxTokens)
|
|
66
|
+
return finalize(blocks, false);
|
|
67
|
+
let budget = maxTokens;
|
|
68
|
+
const kept = [];
|
|
69
|
+
let truncated = false;
|
|
70
|
+
for (const block of blocks) {
|
|
71
|
+
if (block.tokens <= budget) {
|
|
72
|
+
kept.push(block);
|
|
73
|
+
budget -= block.tokens;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (config.compression && budget > 0) {
|
|
77
|
+
const maxChars = budget * 4;
|
|
78
|
+
kept.push({ ...block, content: `${block.content.slice(0, maxChars)}…`, tokens: budget });
|
|
79
|
+
budget = 0;
|
|
80
|
+
truncated = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
truncated = true;
|
|
84
|
+
}
|
|
85
|
+
return finalize(kept, truncated);
|
|
86
|
+
}
|
|
87
|
+
function finalize(blocks, truncated) {
|
|
88
|
+
const systemMessage = blocks.map((block) => `## ${block.label}\n${block.content}`).join("\n\n");
|
|
89
|
+
const totalTokens = blocks.reduce((sum, block) => sum + block.tokens, 0);
|
|
90
|
+
return { systemMessage, blocks, totalTokens, truncated };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/evals.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AgentMessageResult, OpenAICompatibleAgent } from "./openai-agent.js";
|
|
2
|
+
import type { JsonObject } from "./types.js";
|
|
3
|
+
export type AgentEvalCase = {
|
|
4
|
+
id: string;
|
|
5
|
+
input: string;
|
|
6
|
+
expected?: string[];
|
|
7
|
+
metadata?: JsonObject;
|
|
8
|
+
};
|
|
9
|
+
export type AgentEvalScore = {
|
|
10
|
+
passed: boolean;
|
|
11
|
+
score: number;
|
|
12
|
+
reason: string;
|
|
13
|
+
};
|
|
14
|
+
export type AgentEvalJudge = (input: {
|
|
15
|
+
testCase: AgentEvalCase;
|
|
16
|
+
result: AgentMessageResult;
|
|
17
|
+
}) => Promise<AgentEvalScore> | AgentEvalScore;
|
|
18
|
+
export type AgentEvalResult = {
|
|
19
|
+
id: string;
|
|
20
|
+
input: string;
|
|
21
|
+
output: string;
|
|
22
|
+
passed: boolean;
|
|
23
|
+
score: number;
|
|
24
|
+
reason: string;
|
|
25
|
+
metadata: JsonObject;
|
|
26
|
+
};
|
|
27
|
+
export type AgentEvalReport = {
|
|
28
|
+
passed: boolean;
|
|
29
|
+
score: number;
|
|
30
|
+
results: AgentEvalResult[];
|
|
31
|
+
};
|
|
32
|
+
export declare function runAgentEvals(input: {
|
|
33
|
+
agent: Pick<OpenAICompatibleAgent, "runMessage">;
|
|
34
|
+
cases: AgentEvalCase[];
|
|
35
|
+
judge?: AgentEvalJudge;
|
|
36
|
+
}): Promise<AgentEvalReport>;
|
|
37
|
+
export declare const keywordJudge: AgentEvalJudge;
|
|
38
|
+
//# sourceMappingURL=evals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evals.d.ts","sourceRoot":"","sources":["../src/evals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IACnC,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;IACjD,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsB3B;AAED,eAAO,MAAM,YAAY,EAAE,cAW1B,CAAC"}
|
package/dist/evals.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export async function runAgentEvals(input) {
|
|
2
|
+
const judge = input.judge ?? keywordJudge;
|
|
3
|
+
const results = [];
|
|
4
|
+
for (const testCase of input.cases) {
|
|
5
|
+
const result = await input.agent.runMessage(testCase.input);
|
|
6
|
+
const score = await judge({ testCase, result });
|
|
7
|
+
results.push({
|
|
8
|
+
id: testCase.id,
|
|
9
|
+
input: testCase.input,
|
|
10
|
+
output: result.text,
|
|
11
|
+
passed: score.passed,
|
|
12
|
+
score: score.score,
|
|
13
|
+
reason: score.reason,
|
|
14
|
+
metadata: testCase.metadata ?? {}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const average = results.length ? results.reduce((sum, result) => sum + result.score, 0) / results.length : 1;
|
|
18
|
+
return {
|
|
19
|
+
passed: results.every((result) => result.passed),
|
|
20
|
+
score: average,
|
|
21
|
+
results
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export const keywordJudge = ({ testCase, result }) => {
|
|
25
|
+
const expected = testCase.expected ?? [];
|
|
26
|
+
if (!expected.length)
|
|
27
|
+
return { passed: Boolean(result.text.trim()), score: result.text.trim() ? 1 : 0, reason: "Output is non-empty." };
|
|
28
|
+
const normalized = result.text.toLowerCase();
|
|
29
|
+
const matched = expected.filter((term) => normalized.includes(term.toLowerCase()));
|
|
30
|
+
const score = matched.length / expected.length;
|
|
31
|
+
return {
|
|
32
|
+
passed: score === 1,
|
|
33
|
+
score,
|
|
34
|
+
reason: `Matched ${matched.length}/${expected.length} expected term(s).`
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=evals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evals.js","sourceRoot":"","sources":["../src/evals.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAInC;IACC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC;IAC1C,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7G,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QAChD,KAAK,EAAE,OAAO;QACd,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;IACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACxI,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/C,OAAO;QACL,MAAM,EAAE,KAAK,KAAK,CAAC;QACnB,KAAK;QACL,MAAM,EAAE,WAAW,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,oBAAoB;KACzE,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { JsonValue } from "./types.js";
|
|
2
|
+
import type { EventJournal } from "./storage.js";
|
|
3
|
+
export type NexaSdkEvent<T extends JsonValue = JsonValue> = {
|
|
4
|
+
id: string;
|
|
5
|
+
type: string;
|
|
6
|
+
source: string;
|
|
7
|
+
taskId?: string;
|
|
8
|
+
runId?: string;
|
|
9
|
+
missionId?: string;
|
|
10
|
+
stepId?: string;
|
|
11
|
+
visibility?: "user" | "technical";
|
|
12
|
+
payload: T;
|
|
13
|
+
at: string;
|
|
14
|
+
};
|
|
15
|
+
export type EventHandler = (event: NexaSdkEvent) => void | Promise<void>;
|
|
16
|
+
export declare class EventBus {
|
|
17
|
+
private readonly persistentJournal?;
|
|
18
|
+
private readonly handlers;
|
|
19
|
+
private readonly journal;
|
|
20
|
+
constructor(persistentJournal?: EventJournal | undefined);
|
|
21
|
+
subscribe(handler: EventHandler): () => void;
|
|
22
|
+
list(): NexaSdkEvent[];
|
|
23
|
+
publish(input: Omit<NexaSdkEvent, "id" | "at"> & {
|
|
24
|
+
id?: string;
|
|
25
|
+
at?: string;
|
|
26
|
+
}): Promise<NexaSdkEvent>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzE,qBAAa,QAAQ;IAIP,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAH/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAEjB,iBAAiB,CAAC,EAAE,YAAY,YAAA;IAE7D,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAK5C,IAAI,IAAI,YAAY,EAAE;IAIhB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAW5G"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class EventBus {
|
|
2
|
+
persistentJournal;
|
|
3
|
+
handlers = new Set();
|
|
4
|
+
journal = [];
|
|
5
|
+
constructor(persistentJournal) {
|
|
6
|
+
this.persistentJournal = persistentJournal;
|
|
7
|
+
}
|
|
8
|
+
subscribe(handler) {
|
|
9
|
+
this.handlers.add(handler);
|
|
10
|
+
return () => this.handlers.delete(handler);
|
|
11
|
+
}
|
|
12
|
+
list() {
|
|
13
|
+
return [...this.journal];
|
|
14
|
+
}
|
|
15
|
+
async publish(input) {
|
|
16
|
+
const event = {
|
|
17
|
+
...input,
|
|
18
|
+
id: input.id ?? crypto.randomUUID(),
|
|
19
|
+
at: input.at ?? new Date().toISOString()
|
|
20
|
+
};
|
|
21
|
+
this.journal.push(event);
|
|
22
|
+
await this.persistentJournal?.appendEvent(event);
|
|
23
|
+
for (const handler of this.handlers)
|
|
24
|
+
await handler(event);
|
|
25
|
+
return event;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,QAAQ;IAIU;IAHZ,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;IACnC,OAAO,GAAmB,EAAE,CAAC;IAE9C,YAA6B,iBAAgC;QAAhC,sBAAiB,GAAjB,iBAAiB,CAAe;IAAG,CAAC;IAEjE,SAAS,CAAC,OAAqB;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAqE;QACjF,MAAM,KAAK,GAAiB;YAC1B,GAAG,KAAK;YACR,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE;YACnC,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ApprovalRequest } from "./approvals.js";
|
|
2
|
+
import type { NexaSdkEvent } from "./event-bus.js";
|
|
3
|
+
import type { MemoryRecord } from "./memory.js";
|
|
4
|
+
import type { NexaStorage } from "./storage.js";
|
|
5
|
+
import type { AgentRunSnapshot } from "./types.js";
|
|
6
|
+
import type { WorkflowRun } from "./workflow.js";
|
|
7
|
+
export declare class JsonFileStorage implements NexaStorage {
|
|
8
|
+
private readonly rootDir;
|
|
9
|
+
constructor(rootDir: string);
|
|
10
|
+
saveRun(run: AgentRunSnapshot): Promise<void>;
|
|
11
|
+
getRun(runId: string): Promise<AgentRunSnapshot | undefined>;
|
|
12
|
+
listRuns(): Promise<AgentRunSnapshot[]>;
|
|
13
|
+
appendEvent(event: NexaSdkEvent): Promise<void>;
|
|
14
|
+
listEvents(): Promise<NexaSdkEvent[]>;
|
|
15
|
+
saveMemory(record: MemoryRecord): Promise<void>;
|
|
16
|
+
listMemories(): Promise<MemoryRecord[]>;
|
|
17
|
+
saveApproval(approval: ApprovalRequest): Promise<void>;
|
|
18
|
+
getApproval(id: string): Promise<ApprovalRequest | undefined>;
|
|
19
|
+
listApprovals(status?: ApprovalRequest["status"]): Promise<ApprovalRequest[]>;
|
|
20
|
+
saveWorkflow(run: WorkflowRun): Promise<void>;
|
|
21
|
+
getWorkflow(id: string): Promise<WorkflowRun | undefined>;
|
|
22
|
+
private path;
|
|
23
|
+
}
|
|
24
|
+
export declare function createJsonFileStorage(rootDir: string): JsonFileStorage;
|
|
25
|
+
//# sourceMappingURL=file-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../src/file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEtC,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAI5D,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIvC,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIrC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIvC,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAI7D,aAAa,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAK7E,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAI/D,OAAO,CAAC,IAAI;CAGb;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAEtE"}
|