orchajs 0.23.0 → 0.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compiler/compile.js +21 -21
- package/dist/playground/server.js +3 -4
- package/dist/playground/source.js +12 -5
- package/dist/runtime/agent.js +10 -1
- package/dist-cjs/compiler/compile.js +19 -20
- package/dist-cjs/playground/server.js +8 -4
- package/dist-cjs/playground/source.js +9 -1
- package/dist-cjs/runtime/agent.js +10 -1
- package/package.json +2 -2
package/dist/compiler/compile.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import { existsSync, readFileSync, readdirSync, statSync, } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { buildSync } from "esbuild";
|
|
5
5
|
import { isBuiltInProvider } from "../providers/catalog.js";
|
|
@@ -163,27 +163,24 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
163
163
|
return {};
|
|
164
164
|
}
|
|
165
165
|
const actions = {};
|
|
166
|
-
for (const entry of
|
|
167
|
-
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
const configurationPath = resolve(actionsDirectory, entry.name, "index.json");
|
|
166
|
+
for (const entry of discoverDirectories(actionsDirectory)) {
|
|
167
|
+
const configurationPath = resolve(actionsDirectory, entry, "index.json");
|
|
171
168
|
let configuration;
|
|
172
169
|
try {
|
|
173
170
|
configuration = JSON.parse(readFileSync(configurationPath, "utf8"));
|
|
174
171
|
}
|
|
175
172
|
catch (error) {
|
|
176
|
-
throw new Error(`Action "${agentName}/${entry
|
|
173
|
+
throw new Error(`Action "${agentName}/${entry}" is missing a valid index.json.`, { cause: error });
|
|
177
174
|
}
|
|
178
|
-
validateEnabled(`Action "${agentName}/${entry
|
|
175
|
+
validateEnabled(`Action "${agentName}/${entry}"`, configuration?.enabled);
|
|
179
176
|
if (configuration?.enabled === false) {
|
|
180
177
|
continue;
|
|
181
178
|
}
|
|
182
179
|
if (!configuration.name?.trim() || !configuration.description?.trim()) {
|
|
183
|
-
throw new Error(`Action "${agentName}/${entry
|
|
180
|
+
throw new Error(`Action "${agentName}/${entry}" requires name and description.`);
|
|
184
181
|
}
|
|
185
182
|
if (!/^[a-zA-Z0-9_-]{1,64}$/.test(configuration.name)) {
|
|
186
|
-
throw new Error(`Action "${agentName}/${entry
|
|
183
|
+
throw new Error(`Action "${agentName}/${entry}" has an invalid model-facing name.`);
|
|
187
184
|
}
|
|
188
185
|
if ([
|
|
189
186
|
"load_skill",
|
|
@@ -191,50 +188,50 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
191
188
|
"resume_agent",
|
|
192
189
|
"inspect_agent",
|
|
193
190
|
].includes(configuration.name)) {
|
|
194
|
-
throw new Error(`Action "${agentName}/${entry
|
|
191
|
+
throw new Error(`Action "${agentName}/${entry}" uses reserved name "${configuration.name}".`);
|
|
195
192
|
}
|
|
196
193
|
const execution = configuration.execution ?? "local";
|
|
197
194
|
if (!["client", "local"].includes(execution)) {
|
|
198
|
-
throw new Error(`Action "${agentName}/${entry
|
|
195
|
+
throw new Error(`Action "${agentName}/${entry}" has invalid execution "${configuration.execution}".`);
|
|
199
196
|
}
|
|
200
197
|
if (!configuration.parameters ||
|
|
201
198
|
typeof configuration.parameters !== "object" ||
|
|
202
199
|
Array.isArray(configuration.parameters)) {
|
|
203
|
-
throw new Error(`Action "${agentName}/${entry
|
|
200
|
+
throw new Error(`Action "${agentName}/${entry}" requires a parameters JSON Schema.`);
|
|
204
201
|
}
|
|
205
202
|
if (configuration.outputSchema !== undefined &&
|
|
206
203
|
(typeof configuration.outputSchema !== "object" ||
|
|
207
204
|
configuration.outputSchema === null ||
|
|
208
205
|
Array.isArray(configuration.outputSchema))) {
|
|
209
|
-
throw new Error(`Action "${agentName}/${entry
|
|
206
|
+
throw new Error(`Action "${agentName}/${entry}" has an invalid outputSchema.`);
|
|
210
207
|
}
|
|
211
|
-
validateNumber(`${agentName}/${entry
|
|
208
|
+
validateNumber(`${agentName}/${entry}`, "timeoutMs", configuration.timeoutMs, { integer: true, minimum: 1, maximum: 120_000 });
|
|
212
209
|
if (configuration.permissions?.env !== undefined &&
|
|
213
210
|
!Array.isArray(configuration.permissions.env)) {
|
|
214
|
-
throw new Error(`Action "${agentName}/${entry
|
|
211
|
+
throw new Error(`Action "${agentName}/${entry}" permissions.env must be an array.`);
|
|
215
212
|
}
|
|
216
213
|
if (configuration.permissions?.network !== undefined &&
|
|
217
214
|
!Array.isArray(configuration.permissions.network)) {
|
|
218
|
-
throw new Error(`Action "${agentName}/${entry
|
|
215
|
+
throw new Error(`Action "${agentName}/${entry}" permissions.network must be an array.`);
|
|
219
216
|
}
|
|
220
217
|
for (const permission of [
|
|
221
218
|
...(configuration.permissions?.env ?? []),
|
|
222
219
|
...(configuration.permissions?.network ?? []),
|
|
223
220
|
]) {
|
|
224
221
|
if (typeof permission !== "string" || !permission.trim()) {
|
|
225
|
-
throw new Error(`Action "${agentName}/${entry
|
|
222
|
+
throw new Error(`Action "${agentName}/${entry}" has an invalid permission.`);
|
|
226
223
|
}
|
|
227
224
|
}
|
|
228
225
|
if (actions[configuration.name]) {
|
|
229
226
|
throw new Error(`Agent "${agentName}" has duplicate action name "${configuration.name}".`);
|
|
230
227
|
}
|
|
231
228
|
const compiledSource = execution === "local"
|
|
232
|
-
? compileLocalAction(agentName, entry
|
|
229
|
+
? compileLocalAction(agentName, entry, actionsDirectory, actionRuntime, target)
|
|
233
230
|
: undefined;
|
|
234
231
|
actions[configuration.name] = Object.freeze({
|
|
235
232
|
...configuration,
|
|
236
233
|
execution,
|
|
237
|
-
directoryName: entry
|
|
234
|
+
directoryName: entry,
|
|
238
235
|
...compiledSource,
|
|
239
236
|
});
|
|
240
237
|
}
|
|
@@ -321,7 +318,10 @@ function compileEvaluations(agentName, sourceDirectory) {
|
|
|
321
318
|
}
|
|
322
319
|
function discoverDirectories(directory) {
|
|
323
320
|
return readdirSync(directory, { withFileTypes: true })
|
|
324
|
-
.filter((entry) =>
|
|
321
|
+
.filter((entry) => !entry.name.startsWith(".") &&
|
|
322
|
+
(entry.isDirectory() ||
|
|
323
|
+
(entry.isSymbolicLink() &&
|
|
324
|
+
statSync(resolve(directory, entry.name)).isDirectory())))
|
|
325
325
|
.map((entry) => entry.name)
|
|
326
326
|
.sort();
|
|
327
327
|
}
|
|
@@ -2,8 +2,8 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { randomBytes } from "node:crypto";
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
4
|
import { copyFile, mkdir, readFile, writeFile, } from "node:fs/promises";
|
|
5
|
-
import { createRequire } from "node:module";
|
|
6
5
|
import { extname, isAbsolute, relative, resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { createServer, } from "node:http";
|
|
8
8
|
import { watch } from "chokidar";
|
|
9
9
|
import { build } from "esbuild";
|
|
@@ -475,12 +475,11 @@ async function serveAsset(response, pathname, publicRoot) {
|
|
|
475
475
|
response.end(await readFile(path));
|
|
476
476
|
}
|
|
477
477
|
async function buildPlaygroundAssets(projectRoot) {
|
|
478
|
-
const require = createRequire(import.meta.url);
|
|
479
478
|
let entryPath;
|
|
480
479
|
let logoPath;
|
|
481
480
|
try {
|
|
482
|
-
entryPath =
|
|
483
|
-
logoPath =
|
|
481
|
+
entryPath = fileURLToPath(import.meta.resolve("@orchajs/playground-ui/mount"));
|
|
482
|
+
logoPath = fileURLToPath(import.meta.resolve("@orchajs/playground-ui/orcha-logo.svg"));
|
|
484
483
|
}
|
|
485
484
|
catch (error) {
|
|
486
485
|
throw new Error('The playground requires the optional "@orchajs/playground-ui" package. Install it as a development dependency.', { cause: error });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFile, readdir } from "node:fs/promises";
|
|
1
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { getOrchaRuntimeContext } from "../runtime/context.js";
|
|
4
4
|
export async function readPlaygroundAgentSource(orcha, agentKey) {
|
|
@@ -57,10 +57,17 @@ async function readCollectionItems(agentDirectory, collection, manifests, includ
|
|
|
57
57
|
manifest.directoryName,
|
|
58
58
|
{ key, manifest },
|
|
59
59
|
]));
|
|
60
|
-
|
|
61
|
-
.filter((entry) =>
|
|
62
|
-
.
|
|
63
|
-
|
|
60
|
+
const directories = (await Promise.all(entries
|
|
61
|
+
.filter((entry) => !entry.name.startsWith("."))
|
|
62
|
+
.map(async (entry) => ({
|
|
63
|
+
entry,
|
|
64
|
+
isDirectory: entry.isDirectory() ||
|
|
65
|
+
(entry.isSymbolicLink() &&
|
|
66
|
+
(await stat(resolve(root, entry.name))).isDirectory()),
|
|
67
|
+
})))).filter(({ isDirectory }) => isDirectory);
|
|
68
|
+
return Promise.all(directories
|
|
69
|
+
.sort((left, right) => left.entry.name.localeCompare(right.entry.name))
|
|
70
|
+
.map(async ({ entry }) => {
|
|
64
71
|
const directory = resolve(root, entry.name);
|
|
65
72
|
const rawConfiguration = await readRequired(resolve(directory, "index.json"));
|
|
66
73
|
const configuration = parseObject(rawConfiguration, `${collection}/${entry.name}/index.json`);
|
package/dist/runtime/agent.js
CHANGED
|
@@ -1740,7 +1740,16 @@ function normalizeDelegatedInput(input, projectRoot) {
|
|
|
1740
1740
|
if (!content) {
|
|
1741
1741
|
throw new Error("run_agent input must contain at least one valid content item.");
|
|
1742
1742
|
}
|
|
1743
|
-
|
|
1743
|
+
if (content.some((item) => item.type === "text")) {
|
|
1744
|
+
return content;
|
|
1745
|
+
}
|
|
1746
|
+
return [
|
|
1747
|
+
{
|
|
1748
|
+
type: "text",
|
|
1749
|
+
text: "Process the attached content according to your agent instructions.",
|
|
1750
|
+
},
|
|
1751
|
+
...content,
|
|
1752
|
+
];
|
|
1744
1753
|
}
|
|
1745
1754
|
function agentContentInputSchema() {
|
|
1746
1755
|
const textItem = {
|
|
@@ -215,13 +215,10 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
215
215
|
return {};
|
|
216
216
|
}
|
|
217
217
|
const actions = {};
|
|
218
|
-
for (const entry of (
|
|
219
|
-
if (!entry.isDirectory()) {
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
218
|
+
for (const entry of discoverDirectories(actionsDirectory)) {
|
|
222
219
|
const configurationPath = (0, import_path.resolve)(
|
|
223
220
|
actionsDirectory,
|
|
224
|
-
entry
|
|
221
|
+
entry,
|
|
225
222
|
"index.json"
|
|
226
223
|
);
|
|
227
224
|
let configuration;
|
|
@@ -231,12 +228,12 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
231
228
|
);
|
|
232
229
|
} catch (error) {
|
|
233
230
|
throw new Error(
|
|
234
|
-
`Action "${agentName}/${entry
|
|
231
|
+
`Action "${agentName}/${entry}" is missing a valid index.json.`,
|
|
235
232
|
{ cause: error }
|
|
236
233
|
);
|
|
237
234
|
}
|
|
238
235
|
validateEnabled(
|
|
239
|
-
`Action "${agentName}/${entry
|
|
236
|
+
`Action "${agentName}/${entry}"`,
|
|
240
237
|
configuration?.enabled
|
|
241
238
|
);
|
|
242
239
|
if (configuration?.enabled === false) {
|
|
@@ -244,12 +241,12 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
244
241
|
}
|
|
245
242
|
if (!configuration.name?.trim() || !configuration.description?.trim()) {
|
|
246
243
|
throw new Error(
|
|
247
|
-
`Action "${agentName}/${entry
|
|
244
|
+
`Action "${agentName}/${entry}" requires name and description.`
|
|
248
245
|
);
|
|
249
246
|
}
|
|
250
247
|
if (!/^[a-zA-Z0-9_-]{1,64}$/.test(configuration.name)) {
|
|
251
248
|
throw new Error(
|
|
252
|
-
`Action "${agentName}/${entry
|
|
249
|
+
`Action "${agentName}/${entry}" has an invalid model-facing name.`
|
|
253
250
|
);
|
|
254
251
|
}
|
|
255
252
|
if ([
|
|
@@ -259,39 +256,39 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
259
256
|
"inspect_agent"
|
|
260
257
|
].includes(configuration.name)) {
|
|
261
258
|
throw new Error(
|
|
262
|
-
`Action "${agentName}/${entry
|
|
259
|
+
`Action "${agentName}/${entry}" uses reserved name "${configuration.name}".`
|
|
263
260
|
);
|
|
264
261
|
}
|
|
265
262
|
const execution = configuration.execution ?? "local";
|
|
266
263
|
if (!["client", "local"].includes(execution)) {
|
|
267
264
|
throw new Error(
|
|
268
|
-
`Action "${agentName}/${entry
|
|
265
|
+
`Action "${agentName}/${entry}" has invalid execution "${configuration.execution}".`
|
|
269
266
|
);
|
|
270
267
|
}
|
|
271
268
|
if (!configuration.parameters || typeof configuration.parameters !== "object" || Array.isArray(configuration.parameters)) {
|
|
272
269
|
throw new Error(
|
|
273
|
-
`Action "${agentName}/${entry
|
|
270
|
+
`Action "${agentName}/${entry}" requires a parameters JSON Schema.`
|
|
274
271
|
);
|
|
275
272
|
}
|
|
276
273
|
if (configuration.outputSchema !== void 0 && (typeof configuration.outputSchema !== "object" || configuration.outputSchema === null || Array.isArray(configuration.outputSchema))) {
|
|
277
274
|
throw new Error(
|
|
278
|
-
`Action "${agentName}/${entry
|
|
275
|
+
`Action "${agentName}/${entry}" has an invalid outputSchema.`
|
|
279
276
|
);
|
|
280
277
|
}
|
|
281
278
|
validateNumber(
|
|
282
|
-
`${agentName}/${entry
|
|
279
|
+
`${agentName}/${entry}`,
|
|
283
280
|
"timeoutMs",
|
|
284
281
|
configuration.timeoutMs,
|
|
285
282
|
{ integer: true, minimum: 1, maximum: 12e4 }
|
|
286
283
|
);
|
|
287
284
|
if (configuration.permissions?.env !== void 0 && !Array.isArray(configuration.permissions.env)) {
|
|
288
285
|
throw new Error(
|
|
289
|
-
`Action "${agentName}/${entry
|
|
286
|
+
`Action "${agentName}/${entry}" permissions.env must be an array.`
|
|
290
287
|
);
|
|
291
288
|
}
|
|
292
289
|
if (configuration.permissions?.network !== void 0 && !Array.isArray(configuration.permissions.network)) {
|
|
293
290
|
throw new Error(
|
|
294
|
-
`Action "${agentName}/${entry
|
|
291
|
+
`Action "${agentName}/${entry}" permissions.network must be an array.`
|
|
295
292
|
);
|
|
296
293
|
}
|
|
297
294
|
for (const permission of [
|
|
@@ -300,7 +297,7 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
300
297
|
]) {
|
|
301
298
|
if (typeof permission !== "string" || !permission.trim()) {
|
|
302
299
|
throw new Error(
|
|
303
|
-
`Action "${agentName}/${entry
|
|
300
|
+
`Action "${agentName}/${entry}" has an invalid permission.`
|
|
304
301
|
);
|
|
305
302
|
}
|
|
306
303
|
}
|
|
@@ -311,7 +308,7 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
311
308
|
}
|
|
312
309
|
const compiledSource = execution === "local" ? compileLocalAction(
|
|
313
310
|
agentName,
|
|
314
|
-
entry
|
|
311
|
+
entry,
|
|
315
312
|
actionsDirectory,
|
|
316
313
|
actionRuntime,
|
|
317
314
|
target
|
|
@@ -319,7 +316,7 @@ function compileActions(agentName, sourceDirectory, actionRuntime, target) {
|
|
|
319
316
|
actions[configuration.name] = Object.freeze({
|
|
320
317
|
...configuration,
|
|
321
318
|
execution,
|
|
322
|
-
directoryName: entry
|
|
319
|
+
directoryName: entry,
|
|
323
320
|
...compiledSource
|
|
324
321
|
});
|
|
325
322
|
}
|
|
@@ -426,7 +423,9 @@ function compileEvaluations(agentName, sourceDirectory) {
|
|
|
426
423
|
return Object.freeze(evaluations);
|
|
427
424
|
}
|
|
428
425
|
function discoverDirectories(directory) {
|
|
429
|
-
return (0, import_fs.readdirSync)(directory, { withFileTypes: true }).filter(
|
|
426
|
+
return (0, import_fs.readdirSync)(directory, { withFileTypes: true }).filter(
|
|
427
|
+
(entry) => !entry.name.startsWith(".") && (entry.isDirectory() || entry.isSymbolicLink() && (0, import_fs.statSync)((0, import_path.resolve)(directory, entry.name)).isDirectory())
|
|
428
|
+
).map((entry) => entry.name).sort();
|
|
430
429
|
}
|
|
431
430
|
function rejectLegacyRegistry(agentName, directory, collection) {
|
|
432
431
|
if ((0, import_fs.existsSync)((0, import_path.resolve)(directory, "index.js"))) {
|
|
@@ -26,8 +26,8 @@ var import_child_process = require("child_process");
|
|
|
26
26
|
var import_crypto = require("crypto");
|
|
27
27
|
var import_fs = require("fs");
|
|
28
28
|
var import_promises = require("fs/promises");
|
|
29
|
-
var import_module = require("module");
|
|
30
29
|
var import_path = require("path");
|
|
30
|
+
var import_url = require("url");
|
|
31
31
|
var import_http = require("http");
|
|
32
32
|
var import_chokidar = require("chokidar");
|
|
33
33
|
var import_esbuild = require("esbuild");
|
|
@@ -35,6 +35,7 @@ var import_orcha = require("../orcha.js");
|
|
|
35
35
|
var import_project_loader = require("../project-loader.js");
|
|
36
36
|
var import_testing = require("../testing.js");
|
|
37
37
|
var import_source = require("./source.js");
|
|
38
|
+
const import_meta = {};
|
|
38
39
|
async function startPlayground(options = {}) {
|
|
39
40
|
const projectRoot = (0, import_path.resolve)(options.projectRoot ?? process.cwd());
|
|
40
41
|
const host = options.host ?? "localhost";
|
|
@@ -501,12 +502,15 @@ async function serveAsset(response, pathname, publicRoot) {
|
|
|
501
502
|
response.end(await (0, import_promises.readFile)(path));
|
|
502
503
|
}
|
|
503
504
|
async function buildPlaygroundAssets(projectRoot) {
|
|
504
|
-
const require2 = (0, import_module.createRequire)(__orchaImportMetaUrl);
|
|
505
505
|
let entryPath;
|
|
506
506
|
let logoPath;
|
|
507
507
|
try {
|
|
508
|
-
entryPath =
|
|
509
|
-
|
|
508
|
+
entryPath = (0, import_url.fileURLToPath)(
|
|
509
|
+
import_meta.resolve("@orchajs/playground-ui/mount")
|
|
510
|
+
);
|
|
511
|
+
logoPath = (0, import_url.fileURLToPath)(
|
|
512
|
+
import_meta.resolve("@orchajs/playground-ui/orcha-logo.svg")
|
|
513
|
+
);
|
|
510
514
|
} catch (error) {
|
|
511
515
|
throw new Error(
|
|
512
516
|
'The playground requires the optional "@orchajs/playground-ui" package. Install it as a development dependency.',
|
|
@@ -102,8 +102,16 @@ async function readCollectionItems(agentDirectory, collection, manifests, includ
|
|
|
102
102
|
{ key, manifest }
|
|
103
103
|
])
|
|
104
104
|
);
|
|
105
|
+
const directories = (await Promise.all(
|
|
106
|
+
entries.filter((entry) => !entry.name.startsWith(".")).map(async (entry) => ({
|
|
107
|
+
entry,
|
|
108
|
+
isDirectory: entry.isDirectory() || entry.isSymbolicLink() && (await (0, import_promises.stat)((0, import_path.resolve)(root, entry.name))).isDirectory()
|
|
109
|
+
}))
|
|
110
|
+
)).filter(({ isDirectory }) => isDirectory);
|
|
105
111
|
return Promise.all(
|
|
106
|
-
|
|
112
|
+
directories.sort(
|
|
113
|
+
(left, right) => left.entry.name.localeCompare(right.entry.name)
|
|
114
|
+
).map(async ({ entry }) => {
|
|
107
115
|
const directory = (0, import_path.resolve)(root, entry.name);
|
|
108
116
|
const rawConfiguration = await readRequired(
|
|
109
117
|
(0, import_path.resolve)(directory, "index.json")
|
|
@@ -2024,7 +2024,16 @@ function normalizeDelegatedInput(input, projectRoot) {
|
|
|
2024
2024
|
"run_agent input must contain at least one valid content item."
|
|
2025
2025
|
);
|
|
2026
2026
|
}
|
|
2027
|
-
|
|
2027
|
+
if (content.some((item) => item.type === "text")) {
|
|
2028
|
+
return content;
|
|
2029
|
+
}
|
|
2030
|
+
return [
|
|
2031
|
+
{
|
|
2032
|
+
type: "text",
|
|
2033
|
+
text: "Process the attached content according to your agent instructions."
|
|
2034
|
+
},
|
|
2035
|
+
...content
|
|
2036
|
+
];
|
|
2028
2037
|
}
|
|
2029
2038
|
function agentContentInputSchema() {
|
|
2030
2039
|
const textItem = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orchajs",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.2",
|
|
4
4
|
"description": "A filesystem-convention, stateful agent framework for JavaScript.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"node": ">=18.20.8"
|
|
125
125
|
},
|
|
126
126
|
"peerDependencies": {
|
|
127
|
-
"@orchajs/playground-ui": ">=0.2.
|
|
127
|
+
"@orchajs/playground-ui": ">=0.2.3",
|
|
128
128
|
"@react-native-async-storage/async-storage": ">=2 <3",
|
|
129
129
|
"@aws-sdk/client-bedrock-runtime": ">=3.864.0 <4",
|
|
130
130
|
"@google/genai": ">=2.22.0 <3",
|