orchajs 0.16.0 → 0.18.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/README.md +9 -3
- package/dist/amarsia/metadata.js +30 -16
- package/dist/amarsia/metadata.js.map +1 -1
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/compiler/build-project.js +2 -2
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +5 -2
- package/dist/env.js.map +1 -1
- package/dist/playground/public/app.js +9 -9
- package/dist/playground/public/app.js.map +4 -4
- package/dist/playground/server.d.ts.map +1 -1
- package/dist/playground/server.js +9 -4
- package/dist/playground/server.js.map +1 -1
- package/dist/project-loader.js +1 -1
- package/dist/providers/google-gemini.d.ts +67 -4
- package/dist/providers/google-gemini.d.ts.map +1 -1
- package/dist/providers/google-gemini.js +13 -2
- package/dist/providers/google-gemini.js.map +1 -1
- package/dist/providers/google-genai.d.ts.map +1 -1
- package/dist/providers/google-genai.js +2 -2
- package/dist/providers/google-genai.js.map +1 -1
- package/dist/providers/index.js +11 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/vertex-ai.d.ts.map +1 -1
- package/dist/providers/vertex-ai.js +2 -2
- package/dist/providers/vertex-ai.js.map +1 -1
- package/dist/runtime/actions/context.js +25 -1
- package/dist/runtime/actions/context.js.map +1 -1
- package/dist-cjs/amarsia/metadata.js +37 -25
- package/dist-cjs/amarsia/metadata.js.map +2 -2
- package/dist-cjs/amarsia/sync.js +1 -1
- package/dist-cjs/cli-agents-template.js +1 -1
- package/dist-cjs/compiler/build-project.js +24 -24
- package/dist-cjs/compiler/build-project.js.map +2 -2
- package/dist-cjs/compiler/compile.js +31 -31
- package/dist-cjs/compiler/compile.js.map +2 -2
- package/dist-cjs/env.js +10 -7
- package/dist-cjs/env.js.map +2 -2
- package/dist-cjs/errors.js +1 -1
- package/dist-cjs/file-content.js +6 -6
- package/dist-cjs/file-content.js.map +2 -2
- package/dist-cjs/index.js +1 -1
- package/dist-cjs/integrations/esbuild.js +4 -4
- package/dist-cjs/integrations/esbuild.js.map +2 -2
- package/dist-cjs/orcha.js +4 -4
- package/dist-cjs/orcha.js.map +2 -2
- package/dist-cjs/playground/server.js +34 -30
- package/dist-cjs/playground/server.js.map +2 -2
- package/dist-cjs/playground/source.js +11 -11
- package/dist-cjs/playground/source.js.map +2 -2
- package/dist-cjs/project-loader.js +11 -11
- package/dist-cjs/project-loader.js.map +2 -2
- package/dist-cjs/providers/anthropic.js +1 -1
- package/dist-cjs/providers/bedrock.js +8 -8
- package/dist-cjs/providers/bedrock.js.map +2 -2
- package/dist-cjs/providers/catalog.js +1 -1
- package/dist-cjs/providers/deepseek.js +1 -1
- package/dist-cjs/providers/dispatcher.js +1 -1
- package/dist-cjs/providers/google-gemini.js +13 -3
- package/dist-cjs/providers/google-gemini.js.map +2 -2
- package/dist-cjs/providers/google-genai.js +2 -2
- package/dist-cjs/providers/google-genai.js.map +2 -2
- package/dist-cjs/providers/index.js +11 -1
- package/dist-cjs/providers/index.js.map +2 -2
- package/dist-cjs/providers/openai.js +1 -1
- package/dist-cjs/providers/sse.js +1 -1
- package/dist-cjs/providers/types.js +1 -1
- package/dist-cjs/providers/vertex-ai.js +6 -2
- package/dist-cjs/providers/vertex-ai.js.map +2 -2
- package/dist-cjs/runtime/actions/context.js +26 -2
- package/dist-cjs/runtime/actions/context.js.map +2 -2
- package/dist-cjs/runtime/actions/execute.js +1 -1
- package/dist-cjs/runtime/actions/native.js +3 -3
- package/dist-cjs/runtime/actions/native.js.map +2 -2
- package/dist-cjs/runtime/actions/sandbox.js +1 -1
- package/dist-cjs/runtime/agent.js +3 -3
- package/dist-cjs/runtime/agent.js.map +2 -2
- package/dist-cjs/runtime/context.js +1 -1
- package/dist-cjs/runtime/create-orcha.js +3 -3
- package/dist-cjs/runtime/create-orcha.js.map +2 -2
- package/dist-cjs/runtime/execution.js +1 -1
- package/dist-cjs/runtime/session-events.js +1 -1
- package/dist-cjs/runtime/structured-output.js +1 -1
- package/dist-cjs/storage/browser-indexeddb.js +1 -1
- package/dist-cjs/storage/create-store.js +1 -1
- package/dist-cjs/storage/edge-store.js +1 -1
- package/dist-cjs/storage/migrate.js +1 -1
- package/dist-cjs/storage/node-jsonl.js +10 -10
- package/dist-cjs/storage/node-jsonl.js.map +2 -2
- package/dist-cjs/storage/node-sqlite.js +7 -7
- package/dist-cjs/storage/node-sqlite.js.map +2 -2
- package/dist-cjs/storage/react-native-jsonl.js +1 -1
- package/dist-cjs/testing.js +17 -17
- package/dist-cjs/testing.js.map +2 -2
- package/dist-cjs/types/google-genai-sdk.d.js +3 -0
- package/dist-cjs/types/google-genai-sdk.d.js.map +7 -0
- package/dist-cjs/types.js +1 -1
- package/package.json +14 -9
package/dist-cjs/env.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -22,13 +22,16 @@ __export(env_exports, {
|
|
|
22
22
|
loadProjectEnvironment: () => loadProjectEnvironment
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(env_exports);
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
25
|
+
var import_fs = require("fs");
|
|
26
|
+
var import_path = require("path");
|
|
27
|
+
var import_dotenv = require("dotenv");
|
|
28
28
|
function loadProjectEnvironment(projectRoot) {
|
|
29
|
-
const path = (0,
|
|
30
|
-
if ((0,
|
|
31
|
-
(0,
|
|
29
|
+
const path = (0, import_path.resolve)(projectRoot, ".env");
|
|
30
|
+
if ((0, import_fs.existsSync)(path)) {
|
|
31
|
+
const result = (0, import_dotenv.config)({ path, override: false, quiet: true });
|
|
32
|
+
if (result.error) {
|
|
33
|
+
throw result.error;
|
|
34
|
+
}
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
// Annotate the CommonJS export names for ESM import in node:
|
package/dist-cjs/env.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/env.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync } from \"
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { existsSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { config } from \"dotenv\";\n\nexport function loadProjectEnvironment(projectRoot: string): void {\n const path = resolve(projectRoot, \".env\");\n if (existsSync(path)) {\n const result = config({ path, override: false, quiet: true });\n if (result.error) {\n throw result.error;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAA2B;AAC3B,kBAAwB;AACxB,oBAAuB;AAEhB,SAAS,uBAAuB,aAA2B;AAChE,QAAM,WAAO,qBAAQ,aAAa,MAAM;AACxC,UAAI,sBAAW,IAAI,GAAG;AACpB,UAAM,aAAS,sBAAO,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK,CAAC;AAC5D,QAAI,OAAO,OAAO;AAChB,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-cjs/errors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
package/dist-cjs/file-content.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -24,8 +24,8 @@ __export(file_content_exports, {
|
|
|
24
24
|
readLocalFileContent: () => readLocalFileContent
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(file_content_exports);
|
|
27
|
-
var import_promises = require("
|
|
28
|
-
var
|
|
27
|
+
var import_promises = require("fs/promises");
|
|
28
|
+
var import_path = require("path");
|
|
29
29
|
const MIME_TYPES = {
|
|
30
30
|
".csv": "text/csv",
|
|
31
31
|
".doc": "application/msword",
|
|
@@ -48,7 +48,7 @@ const MIME_TYPES = {
|
|
|
48
48
|
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
49
49
|
};
|
|
50
50
|
function normalizeLocalFile(filePath, mimeType, projectRoot = process.cwd()) {
|
|
51
|
-
const absolutePath = (0,
|
|
51
|
+
const absolutePath = (0, import_path.resolve)(projectRoot, filePath);
|
|
52
52
|
return {
|
|
53
53
|
type: "file",
|
|
54
54
|
filePath: absolutePath,
|
|
@@ -78,14 +78,14 @@ async function readLocalFileContent(content) {
|
|
|
78
78
|
bytes,
|
|
79
79
|
base64,
|
|
80
80
|
dataUri: `data:${content.mimeType};base64,${base64}`,
|
|
81
|
-
fileName: (0,
|
|
81
|
+
fileName: (0, import_path.basename)(content.filePath)
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
84
|
function normalizeMimeType(mimeType, source) {
|
|
85
85
|
if (mimeType?.trim()) {
|
|
86
86
|
return mimeType.trim().toLowerCase();
|
|
87
87
|
}
|
|
88
|
-
const inferred = MIME_TYPES[(0,
|
|
88
|
+
const inferred = MIME_TYPES[(0, import_path.extname)(source).toLowerCase()];
|
|
89
89
|
if (!inferred) {
|
|
90
90
|
throw new Error(
|
|
91
91
|
`Could not infer a MIME type for "${source}". Provide mimeType explicitly.`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/file-content.ts"],
|
|
4
|
-
"sourcesContent": ["import { readFile } from \"
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB;AACzB,
|
|
4
|
+
"sourcesContent": ["import { readFile } from \"fs/promises\";\nimport { basename, extname, resolve } from \"path\";\nimport type { LocalFileContent } from \"./types.js\";\n\nconst MIME_TYPES: Record<string, string> = {\n \".csv\": \"text/csv\",\n \".doc\": \"application/msword\",\n \".docx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".gif\": \"image/gif\",\n \".htm\": \"text/html\",\n \".html\": \"text/html\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".json\": \"application/json\",\n \".md\": \"text/markdown\",\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"video/mp4\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".txt\": \"text/plain\",\n \".wav\": \"audio/wav\",\n \".webp\": \"image/webp\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\":\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n};\n\nexport function normalizeLocalFile(\n filePath: string,\n mimeType?: string,\n projectRoot = process.cwd(),\n): LocalFileContent {\n const absolutePath = resolve(projectRoot, filePath);\n return {\n type: \"file\",\n filePath: absolutePath,\n mimeType: normalizeMimeType(mimeType, absolutePath),\n };\n}\n\nexport function normalizeUrlContent(\n url: string,\n mimeType?: string,\n): {\n type: \"url\";\n fileUri: string;\n mimeType: string;\n} {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`Invalid content URL \"${url}\".`);\n }\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new Error(\"Content URLs must use http or https.\");\n }\n return {\n type: \"url\",\n fileUri: parsed.href,\n mimeType: normalizeMimeType(mimeType, parsed.pathname),\n };\n}\n\nexport async function readLocalFileContent(\n content: LocalFileContent,\n): Promise<{\n bytes: Uint8Array;\n base64: string;\n dataUri: string;\n fileName: string;\n}> {\n const bytes = await readFile(content.filePath);\n const base64 = bytes.toString(\"base64\");\n return {\n bytes,\n base64,\n dataUri: `data:${content.mimeType};base64,${base64}`,\n fileName: basename(content.filePath),\n };\n}\n\nfunction normalizeMimeType(\n mimeType: string | undefined,\n source: string,\n): string {\n if (mimeType?.trim()) {\n return mimeType.trim().toLowerCase();\n }\n const inferred = MIME_TYPES[extname(source).toLowerCase()];\n if (!inferred) {\n throw new Error(\n `Could not infer a MIME type for \"${source}\". Provide mimeType explicitly.`,\n );\n }\n return inferred;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB;AACzB,kBAA2C;AAG3C,MAAM,aAAqC;AAAA,EACzC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SACE;AAAA,EACF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SACE;AACJ;AAEO,SAAS,mBACd,UACA,UACA,cAAc,QAAQ,IAAI,GACR;AAClB,QAAM,mBAAe,qBAAQ,aAAa,QAAQ;AAClD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU,kBAAkB,UAAU,YAAY;AAAA,EACpD;AACF;AAEO,SAAS,oBACd,KACA,UAKA;AACA,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACN,UAAM,IAAI,MAAM,wBAAwB,GAAG,IAAI;AAAA,EACjD;AACA,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,SAAS;AAC/D,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,IAChB,UAAU,kBAAkB,UAAU,OAAO,QAAQ;AAAA,EACvD;AACF;AAEA,eAAsB,qBACpB,SAMC;AACD,QAAM,QAAQ,UAAM,0BAAS,QAAQ,QAAQ;AAC7C,QAAM,SAAS,MAAM,SAAS,QAAQ;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,QAAQ,QAAQ,WAAW,MAAM;AAAA,IAClD,cAAU,sBAAS,QAAQ,QAAQ;AAAA,EACrC;AACF;AAEA,SAAS,kBACP,UACA,QACQ;AACR,MAAI,UAAU,KAAK,GAAG;AACpB,WAAO,SAAS,KAAK,EAAE,YAAY;AAAA,EACrC;AACA,QAAM,WAAW,eAAW,qBAAQ,MAAM,EAAE,YAAY,CAAC;AACzD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,oCAAoC,MAAM;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -22,11 +22,11 @@ __export(esbuild_exports, {
|
|
|
22
22
|
orchaPlugin: () => orchaPlugin
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(esbuild_exports);
|
|
25
|
-
var
|
|
25
|
+
var import_path = require("path");
|
|
26
26
|
var import_build_project = require("../compiler/build-project.js");
|
|
27
27
|
function orchaPlugin(options = {}) {
|
|
28
|
-
const projectRoot = (0,
|
|
29
|
-
const generatedBundle = (0,
|
|
28
|
+
const projectRoot = (0, import_path.resolve)(options.projectRoot ?? process.cwd());
|
|
29
|
+
const generatedBundle = (0, import_path.resolve)(projectRoot, ".orcha/dist/bundle.js");
|
|
30
30
|
return {
|
|
31
31
|
name: "orchajs",
|
|
32
32
|
setup(builder) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/integrations/esbuild.ts"],
|
|
4
|
-
"sourcesContent": ["import { resolve } from \"
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { resolve } from \"path\";\nimport type { Plugin } from \"esbuild\";\nimport { buildProject } from \"../compiler/build-project.js\";\n\nexport interface OrchaEsbuildPluginOptions {\n projectRoot?: string;\n}\n\n/**\n * Compiles the consumer's Orcha registry and replaces unchanged `orchajs`\n * application imports with the self-contained generated production runtime.\n */\nexport function orchaPlugin(\n options: OrchaEsbuildPluginOptions = {},\n): Plugin {\n const projectRoot = resolve(options.projectRoot ?? process.cwd());\n const generatedBundle = resolve(projectRoot, \".orcha/dist/bundle.js\");\n\n return {\n name: \"orchajs\",\n setup(builder) {\n builder.onStart(async () => {\n await buildProject({ projectRoot });\n });\n\n builder.onResolve({ filter: /^orchajs$/ }, () => ({\n path: generatedBundle,\n }));\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,2BAA6B;AAUtB,SAAS,YACd,UAAqC,CAAC,GAC9B;AACR,QAAM,kBAAc,qBAAQ,QAAQ,eAAe,QAAQ,IAAI,CAAC;AAChE,QAAM,sBAAkB,qBAAQ,aAAa,uBAAuB;AAEpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,SAAS;AACb,cAAQ,QAAQ,YAAY;AAC1B,kBAAM,mCAAa,EAAE,YAAY,CAAC;AAAA,MACpC,CAAC;AAED,cAAQ,UAAU,EAAE,QAAQ,YAAY,GAAG,OAAO;AAAA,QAChD,MAAM;AAAA,MACR,EAAE;AAAA,IACJ;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist-cjs/orcha.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -22,7 +22,7 @@ __export(orcha_exports, {
|
|
|
22
22
|
orcha: () => orcha
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(orcha_exports);
|
|
25
|
-
var
|
|
25
|
+
var import_path = require("path");
|
|
26
26
|
var import_compile = require("./compiler/compile.js");
|
|
27
27
|
var import_providers = require("./providers/index.js");
|
|
28
28
|
var import_create_orcha = require("./runtime/create-orcha.js");
|
|
@@ -33,10 +33,10 @@ const orcha = (0, import_create_orcha.createOrcha)(
|
|
|
33
33
|
"ORCHA_PRODUCTION_BUNDLE_MISSING: configure the Orcha integration in your application build."
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
|
-
const projectRoot = (0,
|
|
36
|
+
const projectRoot = (0, import_path.resolve)(
|
|
37
37
|
configuration.root ?? process.env.ORCHA_PROJECT_ROOT ?? process.cwd()
|
|
38
38
|
);
|
|
39
|
-
const registryRoot = (0,
|
|
39
|
+
const registryRoot = (0, import_path.resolve)(projectRoot, "orcha");
|
|
40
40
|
return (0, import_compile.compileRegistry)(
|
|
41
41
|
configuration.agents,
|
|
42
42
|
registryRoot,
|
package/dist-cjs/orcha.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/orcha.ts"],
|
|
4
|
-
"sourcesContent": ["import { resolve } from \"
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { resolve } from \"path\";\nimport { compileRegistry } from \"./compiler/compile.js\";\nimport { generateProviderResponse } from \"./providers/index.js\";\nimport { createOrcha } from \"./runtime/create-orcha.js\";\n\nexport type { Orcha, OrchaClient } from \"./runtime/create-orcha.js\";\n\nexport const orcha = createOrcha(\n (configuration) => {\n if (\n process.env.NODE_ENV === \"production\" &&\n process.env.ORCHA_COMPILING !== \"1\"\n ) {\n throw new Error(\n \"ORCHA_PRODUCTION_BUNDLE_MISSING: configure the Orcha integration in your application build.\",\n );\n }\n const projectRoot = resolve(\n configuration.root ??\n process.env.ORCHA_PROJECT_ROOT ??\n process.cwd(),\n );\n const registryRoot = resolve(projectRoot, \"orcha\");\n return compileRegistry(\n configuration.agents,\n registryRoot,\n configuration.actions?.runtime ?? \"native\",\n );\n },\n generateProviderResponse,\n);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AACxB,qBAAgC;AAChC,uBAAyC;AACzC,0BAA4B;AAIrB,MAAM,YAAQ;AAAA,EACnB,CAAC,kBAAkB;AACjB,QACE,QAAQ,IAAI,aAAa,gBACzB,QAAQ,IAAI,oBAAoB,KAChC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,kBAAc;AAAA,MAClB,cAAc,QACZ,QAAQ,IAAI,sBACZ,QAAQ,IAAI;AAAA,IAChB;AACA,UAAM,mBAAe,qBAAQ,aAAa,OAAO;AACjD,eAAO;AAAA,MACL,cAAc;AAAA,MACd;AAAA,MACA,cAAc,SAAS,WAAW;AAAA,IACpC;AAAA,EACF;AAAA,EACA;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -22,19 +22,20 @@ __export(server_exports, {
|
|
|
22
22
|
startPlayground: () => startPlayground
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(server_exports);
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var import_promises = require("
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var
|
|
25
|
+
var import_child_process = require("child_process");
|
|
26
|
+
var import_crypto = require("crypto");
|
|
27
|
+
var import_fs = require("fs");
|
|
28
|
+
var import_promises = require("fs/promises");
|
|
29
|
+
var import_path = require("path");
|
|
30
|
+
var import_url = require("url");
|
|
31
|
+
var import_http = require("http");
|
|
32
|
+
var import_chokidar = require("chokidar");
|
|
32
33
|
var import_orcha = require("../orcha.js");
|
|
33
34
|
var import_project_loader = require("../project-loader.js");
|
|
34
35
|
var import_testing = require("../testing.js");
|
|
35
36
|
var import_source = require("./source.js");
|
|
36
37
|
async function startPlayground(options = {}) {
|
|
37
|
-
const projectRoot = (0,
|
|
38
|
+
const projectRoot = (0, import_path.resolve)(options.projectRoot ?? process.cwd());
|
|
38
39
|
const host = options.host ?? "localhost";
|
|
39
40
|
const port = options.port ?? 4310;
|
|
40
41
|
if (host === "0.0.0.0" || host === "::") {
|
|
@@ -42,11 +43,11 @@ async function startPlayground(options = {}) {
|
|
|
42
43
|
"Use an explicit hostname or IP address instead of a wildcard playground host."
|
|
43
44
|
);
|
|
44
45
|
}
|
|
45
|
-
const mutationToken = (0,
|
|
46
|
+
const mutationToken = (0, import_crypto.randomBytes)(32).toString("base64url");
|
|
46
47
|
const allowedHosts = playgroundHosts(host, port);
|
|
47
48
|
await (0, import_project_loader.loadProject)(projectRoot);
|
|
48
49
|
const projectClients = /* @__PURE__ */ new Set();
|
|
49
|
-
const server = (0,
|
|
50
|
+
const server = (0, import_http.createServer)(async (request, response) => {
|
|
50
51
|
try {
|
|
51
52
|
await routeRequest({
|
|
52
53
|
request,
|
|
@@ -105,22 +106,25 @@ async function startPlayground(options = {}) {
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
};
|
|
108
|
-
const watcher = (0,
|
|
109
|
-
(0,
|
|
110
|
-
{
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
);
|
|
109
|
+
const watcher = (0, import_chokidar.watch)(
|
|
110
|
+
(0, import_path.resolve)(projectRoot, "orcha"),
|
|
111
|
+
{ ignoreInitial: true }
|
|
112
|
+
).on("all", () => {
|
|
113
|
+
clearTimeout(reloadTimer);
|
|
114
|
+
reloadTimer = setTimeout(() => void reload(), 100);
|
|
115
|
+
});
|
|
116
116
|
await new Promise((resolveStop) => {
|
|
117
117
|
const stop = () => {
|
|
118
118
|
clearTimeout(reloadTimer);
|
|
119
|
-
watcher.close();
|
|
120
119
|
for (const client of projectClients) {
|
|
121
120
|
client.end();
|
|
122
121
|
}
|
|
123
|
-
|
|
122
|
+
void Promise.all([
|
|
123
|
+
watcher.close(),
|
|
124
|
+
new Promise((resolveClosed) => {
|
|
125
|
+
server.close(() => resolveClosed());
|
|
126
|
+
})
|
|
127
|
+
]).then(() => resolveStop());
|
|
124
128
|
};
|
|
125
129
|
process.once("SIGINT", stop);
|
|
126
130
|
process.once("SIGTERM", stop);
|
|
@@ -469,16 +473,16 @@ async function readAllEventPages(read) {
|
|
|
469
473
|
return pages.flat();
|
|
470
474
|
}
|
|
471
475
|
async function serveAsset(response, pathname) {
|
|
472
|
-
const publicRoot = (0,
|
|
473
|
-
(0,
|
|
476
|
+
const publicRoot = (0, import_path.resolve)(
|
|
477
|
+
(0, import_path.dirname)((0, import_url.fileURLToPath)(__orchaImportMetaUrl)),
|
|
474
478
|
"public"
|
|
475
479
|
);
|
|
476
480
|
const requested = pathname === "/" ? "index.html" : pathname.slice(1);
|
|
477
|
-
const path = (0,
|
|
478
|
-
const relativePath = (0,
|
|
479
|
-
if (relativePath.startsWith("..") || (0,
|
|
480
|
-
const indexPath = (0,
|
|
481
|
-
if (!(0,
|
|
481
|
+
const path = (0, import_path.resolve)(publicRoot, requested);
|
|
482
|
+
const relativePath = (0, import_path.relative)(publicRoot, path);
|
|
483
|
+
if (relativePath.startsWith("..") || (0, import_path.isAbsolute)(relativePath) || !(0, import_fs.existsSync)(path)) {
|
|
484
|
+
const indexPath = (0, import_path.resolve)(publicRoot, "index.html");
|
|
485
|
+
if (!(0, import_fs.existsSync)(indexPath)) {
|
|
482
486
|
sendJson(response, 503, {
|
|
483
487
|
error: "Playground assets are missing. Rebuild orchajs."
|
|
484
488
|
});
|
|
@@ -498,7 +502,7 @@ async function serveAsset(response, pathname) {
|
|
|
498
502
|
response.end(await (0, import_promises.readFile)(path));
|
|
499
503
|
}
|
|
500
504
|
function contentType(path) {
|
|
501
|
-
switch ((0,
|
|
505
|
+
switch ((0, import_path.extname)(path)) {
|
|
502
506
|
case ".html":
|
|
503
507
|
return "text/html; charset=utf-8";
|
|
504
508
|
case ".js":
|
|
@@ -624,7 +628,7 @@ function optionalString(value) {
|
|
|
624
628
|
function openBrowser(url) {
|
|
625
629
|
const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
|
|
626
630
|
const arguments_ = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
627
|
-
const child = (0,
|
|
631
|
+
const child = (0, import_child_process.spawn)(command, arguments_, {
|
|
628
632
|
detached: true,
|
|
629
633
|
stdio: "ignore"
|
|
630
634
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/playground/server.ts"],
|
|
4
|
-
"sourcesContent": ["import { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, watch } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, extname, isAbsolute, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { orcha } from \"../orcha.js\";\nimport type { OrchaClient } from \"../orcha.js\";\nimport { loadProject } from \"../project-loader.js\";\nimport { RuntimeAgent } from \"../runtime/agent.js\";\nimport { listTests, runTests } from \"../testing.js\";\nimport type {\n AgentContentInput,\n Execution,\n MessageContentInput,\n SessionEvent,\n ToolResult,\n} from \"../types.js\";\nimport { readPlaygroundAgentSource } from \"./source.js\";\n\nexport interface PlaygroundOptions {\n projectRoot?: string;\n host?: string;\n port?: number;\n open?: boolean;\n}\n\nexport async function startPlayground(\n options: PlaygroundOptions = {},\n): Promise<void> {\n const projectRoot = resolve(options.projectRoot ?? process.cwd());\n const host = options.host ?? \"localhost\";\n const port = options.port ?? 4310;\n if (host === \"0.0.0.0\" || host === \"::\") {\n throw new Error(\n \"Use an explicit hostname or IP address instead of a wildcard playground host.\",\n );\n }\n const mutationToken = randomBytes(32).toString(\"base64url\");\n const allowedHosts = playgroundHosts(host, port);\n await loadProject(projectRoot);\n\n const projectClients = new Set<ServerResponse>();\n const server = createServer(async (request, response) => {\n try {\n await routeRequest({\n request,\n response,\n projectRoot,\n host,\n port,\n projectClients,\n mutationToken,\n allowedHosts,\n });\n } catch (error) {\n sendJson(response, error instanceof HttpError ? error.status : 500, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n await new Promise<void>((resolveListening, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, resolveListening);\n });\n\n const url = `http://${host}:${port}`;\n console.log(`Orcha playground: ${url}`);\n if (options.open !== false) {\n openBrowser(url);\n }\n\n let reloadTimer: NodeJS.Timeout | undefined;\n let reloading = false;\n let reloadAgain = false;\n const reload = async (): Promise<void> => {\n if (reloading) {\n reloadAgain = true;\n return;\n }\n reloading = true;\n try {\n await loadProject(projectRoot);\n publishProjectEvent(projectClients, {\n type: \"project.updated\",\n timestamp: new Date().toISOString(),\n });\n console.log(\"[orcha] playground reloaded\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n publishProjectEvent(projectClients, {\n type: \"project.error\",\n timestamp: new Date().toISOString(),\n error: message,\n });\n console.error(`[orcha] playground reload failed \u2014 ${message}`);\n } finally {\n reloading = false;\n if (reloadAgain) {\n reloadAgain = false;\n await reload();\n }\n }\n };\n const watcher = watch(\n resolve(projectRoot, \"orcha\"),\n { recursive: true },\n () => {\n clearTimeout(reloadTimer);\n reloadTimer = setTimeout(() => void reload(), 100);\n },\n );\n\n await new Promise<void>((resolveStop) => {\n const stop = (): void => {\n clearTimeout(reloadTimer);\n watcher.close();\n for (const client of projectClients) {\n client.end();\n }\n server.close(() => resolveStop());\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n });\n}\n\ninterface RouteContext {\n request: IncomingMessage;\n response: ServerResponse;\n projectRoot: string;\n host: string;\n port: number;\n projectClients: Set<ServerResponse>;\n mutationToken: string;\n allowedHosts: Set<string>;\n}\n\nasync function routeRequest(context: RouteContext): Promise<void> {\n const { request, response } = context;\n const method = request.method ?? \"GET\";\n const url = new URL(\n request.url ?? \"/\",\n `http://${context.host}:${context.port}`,\n );\n const segments = url.pathname\n .split(\"/\")\n .filter(Boolean)\n .map(decodeURIComponent);\n validateRequestHost(request, context.allowedHosts);\n\n if (method === \"GET\" && url.pathname === \"/api/playground\") {\n sendJson(response, 200, { mutationToken: context.mutationToken });\n return;\n }\n if (method !== \"GET\" && method !== \"HEAD\") {\n validateMutationRequest(request, context.mutationToken);\n }\n\n if (method === \"GET\" && url.pathname === \"/api/project/events\") {\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n context.projectClients.add(response);\n response.once(\"close\", () => context.projectClients.delete(response));\n return;\n }\n\n if (method === \"GET\" && url.pathname === \"/api/agents\") {\n sendJson(response, 200, {\n agents: Object.values(orcha.getCompiledBundle().agents).map(\n publicAgentSummary,\n ),\n });\n return;\n }\n\n if (\n method === \"GET\" &&\n segments.length === 3 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\"\n ) {\n getAgent(segments[2]);\n sendJson(\n response,\n 200,\n await readPlaygroundAgentSource(orcha, segments[2]),\n );\n return;\n }\n\n if (\n segments.length === 4 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"tests\"\n ) {\n getAgent(segments[2]);\n if (method === \"GET\") {\n const tests = await listTests(orcha, { agent: segments[2] });\n sendJson(response, 200, {\n tests: tests.map((test) => ({\n ...test,\n rawConfiguration: JSON.stringify(test.configuration, null, 2),\n })),\n });\n return;\n }\n if (method === \"POST\") {\n const body = await readJsonBody(request);\n const test = optionalString(body.test);\n sendJson(\n response,\n 200,\n await runTests(orcha, {\n agent: segments[2],\n ...(test ? { test } : {}),\n onWarning: (warning) => {\n console.warn(\n `[orcha playground] WARN ${warning.agent}/${warning.test}: ${warning.message}`,\n );\n },\n }),\n );\n return;\n }\n }\n\n if (\n method === \"POST\" &&\n segments.length === 4 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"executions\"\n ) {\n await executeAgent(segments[2], request, response);\n return;\n }\n\n if (\n segments.length >= 4 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"sessions\"\n ) {\n const agent = getAgent(segments[2]);\n if (method === \"GET\" && segments.length === 4) {\n sendJson(\n response,\n 200,\n await agent.list({\n page: positiveInteger(url.searchParams.get(\"page\"), 1),\n pageSize: positiveInteger(url.searchParams.get(\"pageSize\"), 50),\n }),\n );\n return;\n }\n if (\n method === \"GET\" &&\n segments.length === 5 &&\n segments[4] === \"stream\"\n ) {\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n let closed = false;\n const unsubscribe = agent._subscribeAllSessionEvents((sessionId) => {\n void agent.get(sessionId).then(\n (snapshot) => {\n if (!closed) {\n response.write(\n `data: ${JSON.stringify({ snapshot })}\\n\\n`,\n );\n }\n },\n () => undefined,\n );\n });\n response.once(\"close\", () => {\n closed = true;\n unsubscribe();\n });\n return;\n }\n const sessionId = segments[4];\n if (method === \"GET\" && segments.length === 5) {\n sendJson(response, 200, await agent.get(sessionId));\n return;\n }\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[5] === \"events\"\n ) {\n sendJson(response, 200, {\n events: await readAllEvents(agent, sessionId),\n });\n return;\n }\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[5] === \"stream\"\n ) {\n await agent.get(sessionId);\n let ready = false;\n const pending: SessionEvent[][] = [];\n const publish = (events: SessionEvent[]): void => {\n if (!ready) {\n pending.push(events);\n return;\n }\n response.write(`data: ${JSON.stringify({ events })}\\n\\n`);\n };\n const unsubscribe = agent._subscribeSessionEvents(\n sessionId,\n publish,\n );\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n ready = true;\n for (const events of pending) {\n publish(events);\n }\n pending.length = 0;\n response.once(\"close\", unsubscribe);\n return;\n }\n if (\n method === \"POST\" &&\n segments.length === 6 &&\n segments[5] === \"pause\"\n ) {\n sendJson(response, 200, await agent.pause(sessionId));\n return;\n }\n }\n\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"subagents\" &&\n segments[5] === \"events\"\n ) {\n const agent = getAgent(segments[2]);\n sendJson(response, 200, {\n events: await readAllSubagentEvents(agent, segments[4]),\n });\n return;\n }\n\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"subagents\" &&\n segments[5] === \"stream\"\n ) {\n const agent = getAgent(segments[2]);\n let ready = false;\n const pending: SessionEvent[][] = [];\n const publish = (events: SessionEvent[]): void => {\n if (!ready) {\n pending.push(events);\n return;\n }\n response.write(`data: ${JSON.stringify({ events })}\\n\\n`);\n };\n const unsubscribe = await agent._subscribeSubagentSessionEvents(\n segments[4],\n publish,\n );\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n ready = true;\n for (const events of pending) {\n publish(events);\n }\n pending.length = 0;\n response.once(\"close\", unsubscribe);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n sendJson(response, 404, { error: \"Not found.\" });\n return;\n }\n\n if (method === \"GET\") {\n await serveAsset(response, url.pathname);\n return;\n }\n\n sendJson(response, 404, { error: \"Not found.\" });\n}\n\nasync function executeAgent(\n agentName: string,\n request: IncomingMessage,\n response: ServerResponse,\n): Promise<void> {\n const agent = getAgent(agentName);\n const body = await readJsonBody(request);\n const sessionId = optionalString(body.sessionId);\n const clientCapabilities = agent.clientTools.map((tool) => tool.name);\n let execution: Execution;\n if (\"toolResults\" in body) {\n if (!sessionId) {\n throw new HttpError(400, \"sessionId is required with toolResults.\");\n }\n execution = agent.resume(sessionId, {\n toolResults: parseToolResults(body.toolResults),\n });\n } else {\n const content = parseContent(body.content);\n const name = optionalString(body.name);\n execution = sessionId\n ? agent.resume(sessionId, { content, clientCapabilities })\n : agent.run({\n content,\n clientCapabilities,\n ...(name ? { name } : {}),\n });\n }\n await streamExecution(agent, execution, response);\n}\n\nasync function streamExecution(\n agent: RuntimeAgent,\n execution: Execution,\n response: ServerResponse,\n): Promise<void> {\n response.writeHead(200, {\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n const unsubscribe = agent._subscribeSessionEvents(\n execution.sessionId,\n (events) => writeNdjson(response, { type: \"events.appended\", events }),\n );\n writeNdjson(response, {\n type: \"execution.started\",\n sessionId: execution.sessionId,\n });\n try {\n for await (const snapshot of execution.stream) {\n writeNdjson(response, { type: \"snapshot\", snapshot });\n }\n const result = await execution.result;\n writeNdjson(response, { type: \"result\", result });\n writeNdjson(response, {\n type: \"events\",\n sessionId: result.sessionId,\n events: await readAllEvents(agent, result.sessionId),\n });\n writeNdjson(response, {\n type: \"evaluations\",\n sessionId: result.sessionId,\n evaluations: await execution.evaluations,\n });\n response.end();\n } catch (error) {\n await execution.result.catch(() => undefined);\n writeNdjson(response, {\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n try {\n writeNdjson(response, {\n type: \"events\",\n sessionId: execution.sessionId,\n events: await readAllEvents(agent, execution.sessionId),\n });\n } catch {\n // The session may have failed before it could be persisted.\n }\n response.end();\n } finally {\n unsubscribe();\n }\n}\n\nfunction getAgent(name: string): RuntimeAgent {\n const manifest = orcha.getCompiledBundle().agents[name];\n const agent = (orcha as OrchaClient)[name] as RuntimeAgent | undefined;\n if (!manifest || !agent) {\n throw new HttpError(404, `Unknown agent \"${name}\".`);\n }\n return agent;\n}\n\nfunction publicAgentSummary(\n manifest: ReturnType<typeof orcha.getCompiledBundle>[\"agents\"][string],\n) {\n return {\n key: manifest.key,\n name: manifest.name,\n description: manifest.description,\n provider: manifest.provider,\n model: manifest.model,\n actionCount: Object.keys(manifest.actions).length,\n skillCount: Object.keys(manifest.skills).length,\n evaluationCount: Object.keys(manifest.evaluations).length,\n subagentCount: Object.keys(manifest.subagents).length,\n };\n}\n\nasync function readAllEvents(\n agent: RuntimeAgent,\n sessionId: string,\n): Promise<SessionEvent[]> {\n return readAllEventPages((page, throughSequence) =>\n agent.events(sessionId, {\n page,\n pageSize: 100,\n ...(throughSequence ? { throughSequence } : {}),\n }),\n );\n}\n\nasync function readAllSubagentEvents(\n agent: RuntimeAgent,\n sessionId: string,\n): Promise<SessionEvent[]> {\n return readAllEventPages((page, throughSequence) =>\n agent.subagentEvents(sessionId, {\n page,\n pageSize: 100,\n ...(throughSequence ? { throughSequence } : {}),\n }),\n );\n}\n\nasync function readAllEventPages(\n read: (\n page: number,\n throughSequence?: number,\n ) => Promise<{\n events: SessionEvent[];\n throughSequence: number;\n hasMore: boolean;\n }>,\n): Promise<SessionEvent[]> {\n const pages: SessionEvent[][] = [];\n let page = 1;\n let hasMore = true;\n let throughSequence: number | undefined;\n while (hasMore) {\n const result = await read(page, throughSequence);\n throughSequence = result.throughSequence;\n pages.unshift(result.events);\n hasMore = result.hasMore;\n page += 1;\n }\n return pages.flat();\n}\n\nasync function serveAsset(\n response: ServerResponse,\n pathname: string,\n): Promise<void> {\n const publicRoot = resolve(\n dirname(fileURLToPath(import.meta.url)),\n \"public\",\n );\n const requested = pathname === \"/\" ? \"index.html\" : pathname.slice(1);\n const path = resolve(publicRoot, requested);\n const relativePath = relative(publicRoot, path);\n if (\n relativePath.startsWith(\"..\") ||\n isAbsolute(relativePath) ||\n !existsSync(path)\n ) {\n const indexPath = resolve(publicRoot, \"index.html\");\n if (!existsSync(indexPath)) {\n sendJson(response, 503, {\n error: \"Playground assets are missing. Rebuild orchajs.\",\n });\n return;\n }\n response.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(await readFile(indexPath));\n return;\n }\n response.writeHead(200, {\n \"content-type\": contentType(path),\n \"cache-control\": \"no-store\",\n });\n response.end(await readFile(path));\n}\n\nfunction contentType(path: string): string {\n switch (extname(path)) {\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".svg\":\n return \"image/svg+xml\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nasync function readJsonBody(\n request: IncomingMessage,\n): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > 2_000_000) {\n throw new HttpError(413, \"Request body exceeds 2 MB.\");\n }\n chunks.push(buffer);\n }\n let value: unknown;\n try {\n value = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n } catch {\n throw new HttpError(400, \"Request body must contain valid JSON.\");\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new HttpError(400, \"Request body must be a JSON object.\");\n }\n return value as Record<string, unknown>;\n}\n\nfunction parseContent(value: unknown): AgentContentInput {\n if (typeof value === \"string\" && value.trim()) {\n return value;\n }\n const items = Array.isArray(value) ? value : [value];\n if (items.length === 0) {\n throw new HttpError(400, \"content is required.\");\n }\n const parsed = items.map(parseContentItem);\n return Array.isArray(value) ? parsed : parsed[0];\n}\n\nfunction parseContentItem(value: unknown): MessageContentInput {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new HttpError(400, \"Every content item must be an object.\");\n }\n const item = value as Record<string, unknown>;\n if (typeof item.filePath === \"string\") {\n return {\n filePath: item.filePath,\n ...(typeof item.mimeType === \"string\"\n ? { mimeType: item.mimeType }\n : {}),\n };\n }\n if (typeof item.url === \"string\") {\n return {\n url: item.url,\n ...(typeof item.mimeType === \"string\"\n ? { mimeType: item.mimeType }\n : {}),\n };\n }\n if (item.type === \"text\" && typeof item.text === \"string\") {\n return { type: \"text\", text: item.text };\n }\n if (\n (item.type === \"image\" ||\n item.type === \"video\" ||\n item.type === \"audio\" ||\n item.type === \"url\") &&\n typeof item.mimeType === \"string\" &&\n typeof item.fileUri === \"string\"\n ) {\n return {\n type: item.type,\n mimeType: item.mimeType,\n fileUri: item.fileUri,\n };\n }\n throw new HttpError(400, \"Content item has invalid fields.\");\n}\n\nfunction parseToolResults(value: unknown): ToolResult[] {\n if (!Array.isArray(value) || value.length === 0) {\n throw new HttpError(400, \"toolResults must be a non-empty array.\");\n }\n return value.map((item) => {\n if (\n !item ||\n typeof item !== \"object\" ||\n Array.isArray(item) ||\n typeof (item as Record<string, unknown>).callId !== \"string\" ||\n !(\"output\" in item)\n ) {\n throw new HttpError(\n 400,\n \"Every tool result requires callId and output.\",\n );\n }\n const result = item as Record<string, unknown>;\n return {\n callId: result.callId as string,\n output: result.output,\n ...(result.isError === true ? { isError: true } : {}),\n };\n });\n}\n\nfunction sendJson(\n response: ServerResponse,\n status: number,\n value: unknown,\n): void {\n if (response.headersSent) {\n return;\n }\n response.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(JSON.stringify(value));\n}\n\nfunction writeNdjson(response: ServerResponse, value: unknown): void {\n response.write(`${JSON.stringify(value)}\\n`);\n}\n\nfunction publishProjectEvent(\n clients: Set<ServerResponse>,\n value: unknown,\n): void {\n const payload = `data: ${JSON.stringify(value)}\\n\\n`;\n for (const client of clients) {\n client.write(payload);\n }\n}\n\nfunction positiveInteger(value: string | null, fallback: number): number {\n const parsed = value ? Number.parseInt(value, 10) : fallback;\n return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const arguments_ =\n process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawn(command, arguments_, {\n detached: true,\n stdio: \"ignore\",\n });\n child.once(\"error\", () => undefined);\n child.unref();\n}\n\nclass HttpError extends Error {\n readonly status: number;\n\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\n\nfunction playgroundHosts(host: string, port: number): Set<string> {\n const configured =\n host.includes(\":\") && !host.startsWith(\"[\")\n ? `[${host}]:${port}`\n : `${host}:${port}`;\n const hosts = new Set([configured.toLowerCase()]);\n if ([\"127.0.0.1\", \"localhost\", \"::1\"].includes(host)) {\n hosts.add(`127.0.0.1:${port}`);\n hosts.add(`localhost:${port}`);\n hosts.add(`[::1]:${port}`);\n }\n return hosts;\n}\n\nfunction validateRequestHost(\n request: IncomingMessage,\n allowedHosts: Set<string>,\n): void {\n const host = request.headers.host?.toLowerCase();\n if (!host || !allowedHosts.has(host)) {\n throw new HttpError(403, \"Playground request host is not allowed.\");\n }\n}\n\nfunction validateMutationRequest(\n request: IncomingMessage,\n mutationToken: string,\n): void {\n const contentType = request.headers[\"content-type\"] ?? \"\";\n if (!contentType.toLowerCase().startsWith(\"application/json\")) {\n throw new HttpError(\n 415,\n \"Playground mutations require application/json.\",\n );\n }\n if (request.headers[\"x-orcha-playground-token\"] !== mutationToken) {\n throw new HttpError(403, \"Invalid playground mutation token.\");\n }\n const origin = request.headers.origin;\n if (origin) {\n let originHost: string;\n try {\n originHost = new URL(origin).host.toLowerCase();\n } catch {\n throw new HttpError(403, \"Invalid playground request origin.\");\n }\n if (originHost !== request.headers.host?.toLowerCase()) {\n throw new HttpError(403, \"Cross-origin playground request denied.\");\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAsB;AACtB,yBAA4B;AAC5B,qBAAkC;AAClC,sBAAyB;AACzB,uBAAgE;AAChE,sBAA8B;AAC9B,uBAIO;AACP,mBAAsB;AAEtB,4BAA4B;AAE5B,qBAAoC;AAQpC,oBAA0C;AAS1C,eAAsB,gBACpB,UAA6B,CAAC,GACf;AACf,QAAM,kBAAc,0BAAQ,QAAQ,eAAe,QAAQ,IAAI,CAAC;AAChE,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,SAAS,aAAa,SAAS,MAAM;AACvC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,oBAAgB,gCAAY,EAAE,EAAE,SAAS,WAAW;AAC1D,QAAM,eAAe,gBAAgB,MAAM,IAAI;AAC/C,YAAM,mCAAY,WAAW;AAE7B,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,QAAM,aAAS,+BAAa,OAAO,SAAS,aAAa;AACvD,QAAI;AACF,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,eAAS,UAAU,iBAAiB,YAAY,MAAM,SAAS,KAAK;AAAA,QAClE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,IAAI,QAAc,CAAC,kBAAkB,WAAW;AACpD,WAAO,KAAK,SAAS,MAAM;AAC3B,WAAO,OAAO,MAAM,MAAM,gBAAgB;AAAA,EAC5C,CAAC;AAED,QAAM,MAAM,UAAU,IAAI,IAAI,IAAI;AAClC,UAAQ,IAAI,qBAAqB,GAAG,EAAE;AACtC,MAAI,QAAQ,SAAS,OAAO;AAC1B,gBAAY,GAAG;AAAA,EACjB;AAEA,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,cAAc;AAClB,QAAM,SAAS,YAA2B;AACxC,QAAI,WAAW;AACb,oBAAc;AACd;AAAA,IACF;AACA,gBAAY;AACZ,QAAI;AACF,gBAAM,mCAAY,WAAW;AAC7B,0BAAoB,gBAAgB;AAAA,QAClC,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,cAAQ,IAAI,6BAA6B;AAAA,IAC3C,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,0BAAoB,gBAAgB;AAAA,QAClC,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,OAAO;AAAA,MACT,CAAC;AACD,cAAQ,MAAM,2CAAsC,OAAO,EAAE;AAAA,IAC/D,UAAE;AACA,kBAAY;AACZ,UAAI,aAAa;AACf,sBAAc;AACd,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAU;AAAA,QACd,0BAAQ,aAAa,OAAO;AAAA,IAC5B,EAAE,WAAW,KAAK;AAAA,IAClB,MAAM;AACJ,mBAAa,WAAW;AACxB,oBAAc,WAAW,MAAM,KAAK,OAAO,GAAG,GAAG;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,IAAI,QAAc,CAAC,gBAAgB;AACvC,UAAM,OAAO,MAAY;AACvB,mBAAa,WAAW;AACxB,cAAQ,MAAM;AACd,iBAAW,UAAU,gBAAgB;AACnC,eAAO,IAAI;AAAA,MACb;AACA,aAAO,MAAM,MAAM,YAAY,CAAC;AAAA,IAClC;AACA,YAAQ,KAAK,UAAU,IAAI;AAC3B,YAAQ,KAAK,WAAW,IAAI;AAAA,EAC9B,CAAC;AACH;AAaA,eAAe,aAAa,SAAsC;AAChE,QAAM,EAAE,SAAS,SAAS,IAAI;AAC9B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,MAAM,IAAI;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,UAAU,QAAQ,IAAI,IAAI,QAAQ,IAAI;AAAA,EACxC;AACA,QAAM,WAAW,IAAI,SAClB,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,kBAAkB;AACzB,sBAAoB,SAAS,QAAQ,YAAY;AAEjD,MAAI,WAAW,SAAS,IAAI,aAAa,mBAAmB;AAC1D,aAAS,UAAU,KAAK,EAAE,eAAe,QAAQ,cAAc,CAAC;AAChE;AAAA,EACF;AACA,MAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,4BAAwB,SAAS,QAAQ,aAAa;AAAA,EACxD;AAEA,MAAI,WAAW,SAAS,IAAI,aAAa,uBAAuB;AAC9D,aAAS,UAAU,KAAK;AAAA,MACtB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,IACd,CAAC;AACD,aAAS,MAAM,iBAAiB;AAChC,YAAQ,eAAe,IAAI,QAAQ;AACnC,aAAS,KAAK,SAAS,MAAM,QAAQ,eAAe,OAAO,QAAQ,CAAC;AACpE;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,IAAI,aAAa,eAAe;AACtD,aAAS,UAAU,KAAK;AAAA,MACtB,QAAQ,OAAO,OAAO,mBAAM,kBAAkB,EAAE,MAAM,EAAE;AAAA,QACtD;AAAA,MACF;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,MACE,WAAW,SACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,SAChB,SAAS,CAAC,MAAM,UAChB;AACA,aAAS,SAAS,CAAC,CAAC;AACpB;AAAA,MACE;AAAA,MACA;AAAA,MACA,UAAM,yCAA0B,oBAAO,SAAS,CAAC,CAAC;AAAA,IACpD;AACA;AAAA,EACF;AAEA,MACE,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,SAChB,SAAS,CAAC,MAAM,YAChB,SAAS,CAAC,MAAM,SAChB;AACA,aAAS,SAAS,CAAC,CAAC;AACpB,QAAI,WAAW,OAAO;AACpB,YAAM,QAAQ,UAAM,0BAAU,oBAAO,EAAE,OAAO,SAAS,CAAC,EAAE,CAAC;AAC3D,eAAS,UAAU,KAAK;AAAA,QACtB,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UAC1B,GAAG;AAAA,UACH,kBAAkB,KAAK,UAAU,KAAK,eAAe,MAAM,CAAC;AAAA,QAC9D,EAAE;AAAA,MACJ,CAAC;AACD;AAAA,IACF;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,OAAO,MAAM,aAAa,OAAO;AACvC,YAAM,OAAO,eAAe,KAAK,IAAI;AACrC;AAAA,QACE;AAAA,QACA;AAAA,QACA,UAAM,yBAAS,oBAAO;AAAA,UACpB,OAAO,SAAS,CAAC;AAAA,UACjB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,UACvB,WAAW,CAAC,YAAY;AACtB,oBAAQ;AAAA,cACN,2BAA2B,QAAQ,KAAK,IAAI,QAAQ,IAAI,KAAK,QAAQ,OAAO;AAAA,YAC9E;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAAA,EACF;AAEA,MACE,WAAW,UACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,SAChB,SAAS,CAAC,MAAM,YAChB,SAAS,CAAC,MAAM,cAChB;AACA,UAAM,aAAa,SAAS,CAAC,GAAG,SAAS,QAAQ;AACjD;AAAA,EACF;AAEA,MACE,SAAS,UAAU,KACnB,SAAS,CAAC,MAAM,SAChB,SAAS,CAAC,MAAM,YAChB,SAAS,CAAC,MAAM,YAChB;AACA,UAAM,QAAQ,SAAS,SAAS,CAAC,CAAC;AAClC,QAAI,WAAW,SAAS,SAAS,WAAW,GAAG;AAC7C;AAAA,QACE;AAAA,QACA;AAAA,QACA,MAAM,MAAM,KAAK;AAAA,UACf,MAAM,gBAAgB,IAAI,aAAa,IAAI,MAAM,GAAG,CAAC;AAAA,UACrD,UAAU,gBAAgB,IAAI,aAAa,IAAI,UAAU,GAAG,EAAE;AAAA,QAChE,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QACE,WAAW,SACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,UAChB;AACA,eAAS,UAAU,KAAK;AAAA,QACtB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd,CAAC;AACD,eAAS,MAAM,iBAAiB;AAChC,UAAI,SAAS;AACb,YAAM,cAAc,MAAM,2BAA2B,CAACA,eAAc;AAClE,aAAK,MAAM,IAAIA,UAAS,EAAE;AAAA,UACxB,CAAC,aAAa;AACZ,gBAAI,CAAC,QAAQ;AACX,uBAAS;AAAA,gBACP,SAAS,KAAK,UAAU,EAAE,SAAS,CAAC,CAAC;AAAA;AAAA;AAAA,cACvC;AAAA,YACF;AAAA,UACF;AAAA,UACA,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AACD,eAAS,KAAK,SAAS,MAAM;AAC3B,iBAAS;AACT,oBAAY;AAAA,MACd,CAAC;AACD;AAAA,IACF;AACA,UAAM,YAAY,SAAS,CAAC;AAC5B,QAAI,WAAW,SAAS,SAAS,WAAW,GAAG;AAC7C,eAAS,UAAU,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC;AAClD;AAAA,IACF;AACA,QACE,WAAW,SACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,UAChB;AACA,eAAS,UAAU,KAAK;AAAA,QACtB,QAAQ,MAAM,cAAc,OAAO,SAAS;AAAA,MAC9C,CAAC;AACD;AAAA,IACF;AACA,QACE,WAAW,SACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,UAChB;AACA,YAAM,MAAM,IAAI,SAAS;AACzB,UAAI,QAAQ;AACZ,YAAM,UAA4B,CAAC;AACnC,YAAM,UAAU,CAAC,WAAiC;AAChD,YAAI,CAAC,OAAO;AACV,kBAAQ,KAAK,MAAM;AACnB;AAAA,QACF;AACA,iBAAS,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,MAC1D;AACA,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AACA,eAAS,UAAU,KAAK;AAAA,QACtB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd,CAAC;AACD,eAAS,MAAM,iBAAiB;AAChC,cAAQ;AACR,iBAAW,UAAU,SAAS;AAC5B,gBAAQ,MAAM;AAAA,MAChB;AACA,cAAQ,SAAS;AACjB,eAAS,KAAK,SAAS,WAAW;AAClC;AAAA,IACF;AACA,QACE,WAAW,UACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,SAChB;AACA,eAAS,UAAU,KAAK,MAAM,MAAM,MAAM,SAAS,CAAC;AACpD;AAAA,IACF;AAAA,EACF;AAEA,MACE,WAAW,SACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,SAChB,SAAS,CAAC,MAAM,YAChB,SAAS,CAAC,MAAM,eAChB,SAAS,CAAC,MAAM,UAChB;AACA,UAAM,QAAQ,SAAS,SAAS,CAAC,CAAC;AAClC,aAAS,UAAU,KAAK;AAAA,MACtB,QAAQ,MAAM,sBAAsB,OAAO,SAAS,CAAC,CAAC;AAAA,IACxD,CAAC;AACD;AAAA,EACF;AAEA,MACE,WAAW,SACX,SAAS,WAAW,KACpB,SAAS,CAAC,MAAM,SAChB,SAAS,CAAC,MAAM,YAChB,SAAS,CAAC,MAAM,eAChB,SAAS,CAAC,MAAM,UAChB;AACA,UAAM,QAAQ,SAAS,SAAS,CAAC,CAAC;AAClC,QAAI,QAAQ;AACZ,UAAM,UAA4B,CAAC;AACnC,UAAM,UAAU,CAAC,WAAiC;AAChD,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,MAAM;AACnB;AAAA,MACF;AACA,eAAS,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,IAC1D;AACA,UAAM,cAAc,MAAM,MAAM;AAAA,MAC9B,SAAS,CAAC;AAAA,MACV;AAAA,IACF;AACA,aAAS,UAAU,KAAK;AAAA,MACtB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,IACd,CAAC;AACD,aAAS,MAAM,iBAAiB;AAChC,YAAQ;AACR,eAAW,UAAU,SAAS;AAC5B,cAAQ,MAAM;AAAA,IAChB;AACA,YAAQ,SAAS;AACjB,aAAS,KAAK,SAAS,WAAW;AAClC;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,WAAW,OAAO,GAAG;AACpC,aAAS,UAAU,KAAK,EAAE,OAAO,aAAa,CAAC;AAC/C;AAAA,EACF;AAEA,MAAI,WAAW,OAAO;AACpB,UAAM,WAAW,UAAU,IAAI,QAAQ;AACvC;AAAA,EACF;AAEA,WAAS,UAAU,KAAK,EAAE,OAAO,aAAa,CAAC;AACjD;AAEA,eAAe,aACb,WACA,SACA,UACe;AACf,QAAM,QAAQ,SAAS,SAAS;AAChC,QAAM,OAAO,MAAM,aAAa,OAAO;AACvC,QAAM,YAAY,eAAe,KAAK,SAAS;AAC/C,QAAM,qBAAqB,MAAM,YAAY,IAAI,CAAC,SAAS,KAAK,IAAI;AACpE,MAAI;AACJ,MAAI,iBAAiB,MAAM;AACzB,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,UAAU,KAAK,yCAAyC;AAAA,IACpE;AACA,gBAAY,MAAM,OAAO,WAAW;AAAA,MAClC,aAAa,iBAAiB,KAAK,WAAW;AAAA,IAChD,CAAC;AAAA,EACH,OAAO;AACL,UAAM,UAAU,aAAa,KAAK,OAAO;AACzC,UAAM,OAAO,eAAe,KAAK,IAAI;AACrC,gBAAY,YACR,MAAM,OAAO,WAAW,EAAE,SAAS,mBAAmB,CAAC,IACvD,MAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB,CAAC;AAAA,EACP;AACA,QAAM,gBAAgB,OAAO,WAAW,QAAQ;AAClD;AAEA,eAAe,gBACb,OACA,WACA,UACe;AACf,WAAS,UAAU,KAAK;AAAA,IACtB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd,CAAC;AACD,QAAM,cAAc,MAAM;AAAA,IACxB,UAAU;AAAA,IACV,CAAC,WAAW,YAAY,UAAU,EAAE,MAAM,mBAAmB,OAAO,CAAC;AAAA,EACvE;AACA,cAAY,UAAU;AAAA,IACpB,MAAM;AAAA,IACN,WAAW,UAAU;AAAA,EACvB,CAAC;AACD,MAAI;AACF,qBAAiB,YAAY,UAAU,QAAQ;AAC7C,kBAAY,UAAU,EAAE,MAAM,YAAY,SAAS,CAAC;AAAA,IACtD;AACA,UAAM,SAAS,MAAM,UAAU;AAC/B,gBAAY,UAAU,EAAE,MAAM,UAAU,OAAO,CAAC;AAChD,gBAAY,UAAU;AAAA,MACpB,MAAM;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,QAAQ,MAAM,cAAc,OAAO,OAAO,SAAS;AAAA,IACrD,CAAC;AACD,gBAAY,UAAU;AAAA,MACpB,MAAM;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,aAAa,MAAM,UAAU;AAAA,IAC/B,CAAC;AACD,aAAS,IAAI;AAAA,EACf,SAAS,OAAO;AACd,UAAM,UAAU,OAAO,MAAM,MAAM,MAAS;AAC5C,gBAAY,UAAU;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC;AACD,QAAI;AACF,kBAAY,UAAU;AAAA,QACpB,MAAM;AAAA,QACN,WAAW,UAAU;AAAA,QACrB,QAAQ,MAAM,cAAc,OAAO,UAAU,SAAS;AAAA,MACxD,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AACA,aAAS,IAAI;AAAA,EACf,UAAE;AACA,gBAAY;AAAA,EACd;AACF;AAEA,SAAS,SAAS,MAA4B;AAC5C,QAAM,WAAW,mBAAM,kBAAkB,EAAE,OAAO,IAAI;AACtD,QAAM,QAAS,mBAAsB,IAAI;AACzC,MAAI,CAAC,YAAY,CAAC,OAAO;AACvB,UAAM,IAAI,UAAU,KAAK,kBAAkB,IAAI,IAAI;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,mBACP,UACA;AACA,SAAO;AAAA,IACL,KAAK,SAAS;AAAA,IACd,MAAM,SAAS;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,aAAa,OAAO,KAAK,SAAS,OAAO,EAAE;AAAA,IAC3C,YAAY,OAAO,KAAK,SAAS,MAAM,EAAE;AAAA,IACzC,iBAAiB,OAAO,KAAK,SAAS,WAAW,EAAE;AAAA,IACnD,eAAe,OAAO,KAAK,SAAS,SAAS,EAAE;AAAA,EACjD;AACF;AAEA,eAAe,cACb,OACA,WACyB;AACzB,SAAO;AAAA,IAAkB,CAAC,MAAM,oBAC9B,MAAM,OAAO,WAAW;AAAA,MACtB;AAAA,MACA,UAAU;AAAA,MACV,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;AAEA,eAAe,sBACb,OACA,WACyB;AACzB,SAAO;AAAA,IAAkB,CAAC,MAAM,oBAC9B,MAAM,eAAe,WAAW;AAAA,MAC9B;AAAA,MACA,UAAU;AAAA,MACV,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;AAEA,eAAe,kBACb,MAQyB;AACzB,QAAM,QAA0B,CAAC;AACjC,MAAI,OAAO;AACX,MAAI,UAAU;AACd,MAAI;AACJ,SAAO,SAAS;AACd,UAAM,SAAS,MAAM,KAAK,MAAM,eAAe;AAC/C,sBAAkB,OAAO;AACzB,UAAM,QAAQ,OAAO,MAAM;AAC3B,cAAU,OAAO;AACjB,YAAQ;AAAA,EACV;AACA,SAAO,MAAM,KAAK;AACpB;AAEA,eAAe,WACb,UACA,UACe;AACf,QAAM,iBAAa;AAAA,QACjB,8BAAQ,+BAAc,oBAAe,CAAC;AAAA,IACtC;AAAA,EACF;AACA,QAAM,YAAY,aAAa,MAAM,eAAe,SAAS,MAAM,CAAC;AACpE,QAAM,WAAO,0BAAQ,YAAY,SAAS;AAC1C,QAAM,mBAAe,2BAAS,YAAY,IAAI;AAC9C,MACE,aAAa,WAAW,IAAI,SAC5B,6BAAW,YAAY,KACvB,KAAC,2BAAW,IAAI,GAChB;AACA,UAAM,gBAAY,0BAAQ,YAAY,YAAY;AAClD,QAAI,KAAC,2BAAW,SAAS,GAAG;AAC1B,eAAS,UAAU,KAAK;AAAA,QACtB,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AACA,aAAS,UAAU,KAAK;AAAA,MACtB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB,CAAC;AACD,aAAS,IAAI,UAAM,0BAAS,SAAS,CAAC;AACtC;AAAA,EACF;AACA,WAAS,UAAU,KAAK;AAAA,IACtB,gBAAgB,YAAY,IAAI;AAAA,IAChC,iBAAiB;AAAA,EACnB,CAAC;AACD,WAAS,IAAI,UAAM,0BAAS,IAAI,CAAC;AACnC;AAEA,SAAS,YAAY,MAAsB;AACzC,cAAQ,0BAAQ,IAAI,GAAG;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,eAAe,aACb,SACkC;AAClC,QAAM,SAAmB,CAAC;AAC1B,MAAI,OAAO;AACX,mBAAiB,SAAS,SAAS;AACjC,UAAM,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK;AACjE,YAAQ,OAAO;AACf,QAAI,OAAO,KAAW;AACpB,YAAM,IAAI,UAAU,KAAK,4BAA4B;AAAA,IACvD;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACA,MAAI;AACJ,MAAI;AACF,YAAQ,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,EAC3D,QAAQ;AACN,UAAM,IAAI,UAAU,KAAK,uCAAuC;AAAA,EAClE;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,UAAU,KAAK,qCAAqC;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACnD,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,UAAU,KAAK,sBAAsB;AAAA,EACjD;AACA,QAAM,SAAS,MAAM,IAAI,gBAAgB;AACzC,SAAO,MAAM,QAAQ,KAAK,IAAI,SAAS,OAAO,CAAC;AACjD;AAEA,SAAS,iBAAiB,OAAqC;AAC7D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,UAAU,KAAK,uCAAuC;AAAA,EAClE;AACA,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,aAAa,UAAU;AACrC,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,GAAI,OAAO,KAAK,aAAa,WACzB,EAAE,UAAU,KAAK,SAAS,IAC1B,CAAC;AAAA,IACP;AAAA,EACF;AACA,MAAI,OAAO,KAAK,QAAQ,UAAU;AAChC,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,GAAI,OAAO,KAAK,aAAa,WACzB,EAAE,UAAU,KAAK,SAAS,IAC1B,CAAC;AAAA,IACP;AAAA,EACF;AACA,MAAI,KAAK,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU;AACzD,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,EACzC;AACA,OACG,KAAK,SAAS,WACb,KAAK,SAAS,WACd,KAAK,SAAS,WACd,KAAK,SAAS,UAChB,OAAO,KAAK,aAAa,YACzB,OAAO,KAAK,YAAY,UACxB;AACA,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACA,QAAM,IAAI,UAAU,KAAK,kCAAkC;AAC7D;AAEA,SAAS,iBAAiB,OAA8B;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,UAAM,IAAI,UAAU,KAAK,wCAAwC;AAAA,EACnE;AACA,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,QACE,CAAC,QACD,OAAO,SAAS,YAChB,MAAM,QAAQ,IAAI,KAClB,OAAQ,KAAiC,WAAW,YACpD,EAAE,YAAY,OACd;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS;AACf,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,GAAI,OAAO,YAAY,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACrD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,SACP,UACA,QACA,OACM;AACN,MAAI,SAAS,aAAa;AACxB;AAAA,EACF;AACA,WAAS,UAAU,QAAQ;AAAA,IACzB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,CAAC;AACD,WAAS,IAAI,KAAK,UAAU,KAAK,CAAC;AACpC;AAEA,SAAS,YAAY,UAA0B,OAAsB;AACnE,WAAS,MAAM,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAC7C;AAEA,SAAS,oBACP,SACA,OACM;AACN,QAAM,UAAU,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA;AAC9C,aAAW,UAAU,SAAS;AAC5B,WAAO,MAAM,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,gBAAgB,OAAsB,UAA0B;AACvE,QAAM,SAAS,QAAQ,OAAO,SAAS,OAAO,EAAE,IAAI;AACpD,SAAO,OAAO,UAAU,MAAM,KAAK,SAAS,IAAI,SAAS;AAC3D;AAEA,SAAS,eAAe,OAAoC;AAC1D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAC3C,MAAM,KAAK,IACX;AACN;AAEA,SAAS,YAAY,KAAmB;AACtC,QAAM,UACJ,QAAQ,aAAa,WACjB,SACA,QAAQ,aAAa,UACnB,QACA;AACR,QAAM,aACJ,QAAQ,aAAa,UAAU,CAAC,MAAM,SAAS,IAAI,GAAG,IAAI,CAAC,GAAG;AAChE,QAAM,YAAQ,iCAAM,SAAS,YAAY;AAAA,IACvC,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,KAAK,SAAS,MAAM,MAAS;AACnC,QAAM,MAAM;AACd;AAEA,MAAM,kBAAkB,MAAM;AAAA,EACnB;AAAA,EAET,YAAY,QAAgB,SAAiB;AAC3C,UAAM,OAAO;AACb,SAAK,SAAS;AAAA,EAChB;AACF;AAEA,SAAS,gBAAgB,MAAc,MAA2B;AAChE,QAAM,aACJ,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,IACtC,IAAI,IAAI,KAAK,IAAI,KACjB,GAAG,IAAI,IAAI,IAAI;AACrB,QAAM,QAAQ,oBAAI,IAAI,CAAC,WAAW,YAAY,CAAC,CAAC;AAChD,MAAI,CAAC,aAAa,aAAa,KAAK,EAAE,SAAS,IAAI,GAAG;AACpD,UAAM,IAAI,aAAa,IAAI,EAAE;AAC7B,UAAM,IAAI,aAAa,IAAI,EAAE;AAC7B,UAAM,IAAI,SAAS,IAAI,EAAE;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,oBACP,SACA,cACM;AACN,QAAM,OAAO,QAAQ,QAAQ,MAAM,YAAY;AAC/C,MAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI,GAAG;AACpC,UAAM,IAAI,UAAU,KAAK,yCAAyC;AAAA,EACpE;AACF;AAEA,SAAS,wBACP,SACA,eACM;AACN,QAAMC,eAAc,QAAQ,QAAQ,cAAc,KAAK;AACvD,MAAI,CAACA,aAAY,YAAY,EAAE,WAAW,kBAAkB,GAAG;AAC7D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ,0BAA0B,MAAM,eAAe;AACjE,UAAM,IAAI,UAAU,KAAK,oCAAoC;AAAA,EAC/D;AACA,QAAM,SAAS,QAAQ,QAAQ;AAC/B,MAAI,QAAQ;AACV,QAAI;AACJ,QAAI;AACF,mBAAa,IAAI,IAAI,MAAM,EAAE,KAAK,YAAY;AAAA,IAChD,QAAQ;AACN,YAAM,IAAI,UAAU,KAAK,oCAAoC;AAAA,IAC/D;AACA,QAAI,eAAe,QAAQ,QAAQ,MAAM,YAAY,GAAG;AACtD,YAAM,IAAI,UAAU,KAAK,yCAAyC;AAAA,IACpE;AAAA,EACF;AACF;",
|
|
4
|
+
"sourcesContent": ["import { spawn } from \"child_process\";\nimport { randomBytes } from \"crypto\";\nimport { existsSync } from \"fs\";\nimport { readFile } from \"fs/promises\";\nimport { dirname, extname, isAbsolute, relative, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"http\";\nimport { watch } from \"chokidar\";\nimport { orcha } from \"../orcha.js\";\nimport type { OrchaClient } from \"../orcha.js\";\nimport { loadProject } from \"../project-loader.js\";\nimport { RuntimeAgent } from \"../runtime/agent.js\";\nimport { listTests, runTests } from \"../testing.js\";\nimport type {\n AgentContentInput,\n Execution,\n MessageContentInput,\n SessionEvent,\n ToolResult,\n} from \"../types.js\";\nimport { readPlaygroundAgentSource } from \"./source.js\";\n\nexport interface PlaygroundOptions {\n projectRoot?: string;\n host?: string;\n port?: number;\n open?: boolean;\n}\n\nexport async function startPlayground(\n options: PlaygroundOptions = {},\n): Promise<void> {\n const projectRoot = resolve(options.projectRoot ?? process.cwd());\n const host = options.host ?? \"localhost\";\n const port = options.port ?? 4310;\n if (host === \"0.0.0.0\" || host === \"::\") {\n throw new Error(\n \"Use an explicit hostname or IP address instead of a wildcard playground host.\",\n );\n }\n const mutationToken = randomBytes(32).toString(\"base64url\");\n const allowedHosts = playgroundHosts(host, port);\n await loadProject(projectRoot);\n\n const projectClients = new Set<ServerResponse>();\n const server = createServer(async (request, response) => {\n try {\n await routeRequest({\n request,\n response,\n projectRoot,\n host,\n port,\n projectClients,\n mutationToken,\n allowedHosts,\n });\n } catch (error) {\n sendJson(response, error instanceof HttpError ? error.status : 500, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n await new Promise<void>((resolveListening, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, resolveListening);\n });\n\n const url = `http://${host}:${port}`;\n console.log(`Orcha playground: ${url}`);\n if (options.open !== false) {\n openBrowser(url);\n }\n\n let reloadTimer: NodeJS.Timeout | undefined;\n let reloading = false;\n let reloadAgain = false;\n const reload = async (): Promise<void> => {\n if (reloading) {\n reloadAgain = true;\n return;\n }\n reloading = true;\n try {\n await loadProject(projectRoot);\n publishProjectEvent(projectClients, {\n type: \"project.updated\",\n timestamp: new Date().toISOString(),\n });\n console.log(\"[orcha] playground reloaded\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n publishProjectEvent(projectClients, {\n type: \"project.error\",\n timestamp: new Date().toISOString(),\n error: message,\n });\n console.error(`[orcha] playground reload failed \u2014 ${message}`);\n } finally {\n reloading = false;\n if (reloadAgain) {\n reloadAgain = false;\n await reload();\n }\n }\n };\n const watcher = watch(\n resolve(projectRoot, \"orcha\"),\n { ignoreInitial: true },\n ).on(\"all\", () => {\n clearTimeout(reloadTimer);\n reloadTimer = setTimeout(() => void reload(), 100);\n });\n\n await new Promise<void>((resolveStop) => {\n const stop = (): void => {\n clearTimeout(reloadTimer);\n for (const client of projectClients) {\n client.end();\n }\n void Promise.all([\n watcher.close(),\n new Promise<void>((resolveClosed) => {\n server.close(() => resolveClosed());\n }),\n ]).then(() => resolveStop());\n };\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n });\n}\n\ninterface RouteContext {\n request: IncomingMessage;\n response: ServerResponse;\n projectRoot: string;\n host: string;\n port: number;\n projectClients: Set<ServerResponse>;\n mutationToken: string;\n allowedHosts: Set<string>;\n}\n\nasync function routeRequest(context: RouteContext): Promise<void> {\n const { request, response } = context;\n const method = request.method ?? \"GET\";\n const url = new URL(\n request.url ?? \"/\",\n `http://${context.host}:${context.port}`,\n );\n const segments = url.pathname\n .split(\"/\")\n .filter(Boolean)\n .map(decodeURIComponent);\n validateRequestHost(request, context.allowedHosts);\n\n if (method === \"GET\" && url.pathname === \"/api/playground\") {\n sendJson(response, 200, { mutationToken: context.mutationToken });\n return;\n }\n if (method !== \"GET\" && method !== \"HEAD\") {\n validateMutationRequest(request, context.mutationToken);\n }\n\n if (method === \"GET\" && url.pathname === \"/api/project/events\") {\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n context.projectClients.add(response);\n response.once(\"close\", () => context.projectClients.delete(response));\n return;\n }\n\n if (method === \"GET\" && url.pathname === \"/api/agents\") {\n sendJson(response, 200, {\n agents: Object.values(orcha.getCompiledBundle().agents).map(\n publicAgentSummary,\n ),\n });\n return;\n }\n\n if (\n method === \"GET\" &&\n segments.length === 3 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\"\n ) {\n getAgent(segments[2]);\n sendJson(\n response,\n 200,\n await readPlaygroundAgentSource(orcha, segments[2]),\n );\n return;\n }\n\n if (\n segments.length === 4 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"tests\"\n ) {\n getAgent(segments[2]);\n if (method === \"GET\") {\n const tests = await listTests(orcha, { agent: segments[2] });\n sendJson(response, 200, {\n tests: tests.map((test) => ({\n ...test,\n rawConfiguration: JSON.stringify(test.configuration, null, 2),\n })),\n });\n return;\n }\n if (method === \"POST\") {\n const body = await readJsonBody(request);\n const test = optionalString(body.test);\n sendJson(\n response,\n 200,\n await runTests(orcha, {\n agent: segments[2],\n ...(test ? { test } : {}),\n onWarning: (warning) => {\n console.warn(\n `[orcha playground] WARN ${warning.agent}/${warning.test}: ${warning.message}`,\n );\n },\n }),\n );\n return;\n }\n }\n\n if (\n method === \"POST\" &&\n segments.length === 4 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"executions\"\n ) {\n await executeAgent(segments[2], request, response);\n return;\n }\n\n if (\n segments.length >= 4 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"sessions\"\n ) {\n const agent = getAgent(segments[2]);\n if (method === \"GET\" && segments.length === 4) {\n sendJson(\n response,\n 200,\n await agent.list({\n page: positiveInteger(url.searchParams.get(\"page\"), 1),\n pageSize: positiveInteger(url.searchParams.get(\"pageSize\"), 50),\n }),\n );\n return;\n }\n if (\n method === \"GET\" &&\n segments.length === 5 &&\n segments[4] === \"stream\"\n ) {\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n let closed = false;\n const unsubscribe = agent._subscribeAllSessionEvents((sessionId) => {\n void agent.get(sessionId).then(\n (snapshot) => {\n if (!closed) {\n response.write(\n `data: ${JSON.stringify({ snapshot })}\\n\\n`,\n );\n }\n },\n () => undefined,\n );\n });\n response.once(\"close\", () => {\n closed = true;\n unsubscribe();\n });\n return;\n }\n const sessionId = segments[4];\n if (method === \"GET\" && segments.length === 5) {\n sendJson(response, 200, await agent.get(sessionId));\n return;\n }\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[5] === \"events\"\n ) {\n sendJson(response, 200, {\n events: await readAllEvents(agent, sessionId),\n });\n return;\n }\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[5] === \"stream\"\n ) {\n await agent.get(sessionId);\n let ready = false;\n const pending: SessionEvent[][] = [];\n const publish = (events: SessionEvent[]): void => {\n if (!ready) {\n pending.push(events);\n return;\n }\n response.write(`data: ${JSON.stringify({ events })}\\n\\n`);\n };\n const unsubscribe = agent._subscribeSessionEvents(\n sessionId,\n publish,\n );\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n ready = true;\n for (const events of pending) {\n publish(events);\n }\n pending.length = 0;\n response.once(\"close\", unsubscribe);\n return;\n }\n if (\n method === \"POST\" &&\n segments.length === 6 &&\n segments[5] === \"pause\"\n ) {\n sendJson(response, 200, await agent.pause(sessionId));\n return;\n }\n }\n\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"subagents\" &&\n segments[5] === \"events\"\n ) {\n const agent = getAgent(segments[2]);\n sendJson(response, 200, {\n events: await readAllSubagentEvents(agent, segments[4]),\n });\n return;\n }\n\n if (\n method === \"GET\" &&\n segments.length === 6 &&\n segments[0] === \"api\" &&\n segments[1] === \"agents\" &&\n segments[3] === \"subagents\" &&\n segments[5] === \"stream\"\n ) {\n const agent = getAgent(segments[2]);\n let ready = false;\n const pending: SessionEvent[][] = [];\n const publish = (events: SessionEvent[]): void => {\n if (!ready) {\n pending.push(events);\n return;\n }\n response.write(`data: ${JSON.stringify({ events })}\\n\\n`);\n };\n const unsubscribe = await agent._subscribeSubagentSessionEvents(\n segments[4],\n publish,\n );\n response.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n response.write(\": connected\\n\\n\");\n ready = true;\n for (const events of pending) {\n publish(events);\n }\n pending.length = 0;\n response.once(\"close\", unsubscribe);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n sendJson(response, 404, { error: \"Not found.\" });\n return;\n }\n\n if (method === \"GET\") {\n await serveAsset(response, url.pathname);\n return;\n }\n\n sendJson(response, 404, { error: \"Not found.\" });\n}\n\nasync function executeAgent(\n agentName: string,\n request: IncomingMessage,\n response: ServerResponse,\n): Promise<void> {\n const agent = getAgent(agentName);\n const body = await readJsonBody(request);\n const sessionId = optionalString(body.sessionId);\n const clientCapabilities = agent.clientTools.map((tool) => tool.name);\n let execution: Execution;\n if (\"toolResults\" in body) {\n if (!sessionId) {\n throw new HttpError(400, \"sessionId is required with toolResults.\");\n }\n execution = agent.resume(sessionId, {\n toolResults: parseToolResults(body.toolResults),\n });\n } else {\n const content = parseContent(body.content);\n const name = optionalString(body.name);\n execution = sessionId\n ? agent.resume(sessionId, { content, clientCapabilities })\n : agent.run({\n content,\n clientCapabilities,\n ...(name ? { name } : {}),\n });\n }\n await streamExecution(agent, execution, response);\n}\n\nasync function streamExecution(\n agent: RuntimeAgent,\n execution: Execution,\n response: ServerResponse,\n): Promise<void> {\n response.writeHead(200, {\n \"content-type\": \"application/x-ndjson; charset=utf-8\",\n \"cache-control\": \"no-store\",\n connection: \"keep-alive\",\n });\n const unsubscribe = agent._subscribeSessionEvents(\n execution.sessionId,\n (events) => writeNdjson(response, { type: \"events.appended\", events }),\n );\n writeNdjson(response, {\n type: \"execution.started\",\n sessionId: execution.sessionId,\n });\n try {\n for await (const snapshot of execution.stream) {\n writeNdjson(response, { type: \"snapshot\", snapshot });\n }\n const result = await execution.result;\n writeNdjson(response, { type: \"result\", result });\n writeNdjson(response, {\n type: \"events\",\n sessionId: result.sessionId,\n events: await readAllEvents(agent, result.sessionId),\n });\n writeNdjson(response, {\n type: \"evaluations\",\n sessionId: result.sessionId,\n evaluations: await execution.evaluations,\n });\n response.end();\n } catch (error) {\n await execution.result.catch(() => undefined);\n writeNdjson(response, {\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n try {\n writeNdjson(response, {\n type: \"events\",\n sessionId: execution.sessionId,\n events: await readAllEvents(agent, execution.sessionId),\n });\n } catch {\n // The session may have failed before it could be persisted.\n }\n response.end();\n } finally {\n unsubscribe();\n }\n}\n\nfunction getAgent(name: string): RuntimeAgent {\n const manifest = orcha.getCompiledBundle().agents[name];\n const agent = (orcha as OrchaClient)[name] as RuntimeAgent | undefined;\n if (!manifest || !agent) {\n throw new HttpError(404, `Unknown agent \"${name}\".`);\n }\n return agent;\n}\n\nfunction publicAgentSummary(\n manifest: ReturnType<typeof orcha.getCompiledBundle>[\"agents\"][string],\n) {\n return {\n key: manifest.key,\n name: manifest.name,\n description: manifest.description,\n provider: manifest.provider,\n model: manifest.model,\n actionCount: Object.keys(manifest.actions).length,\n skillCount: Object.keys(manifest.skills).length,\n evaluationCount: Object.keys(manifest.evaluations).length,\n subagentCount: Object.keys(manifest.subagents).length,\n };\n}\n\nasync function readAllEvents(\n agent: RuntimeAgent,\n sessionId: string,\n): Promise<SessionEvent[]> {\n return readAllEventPages((page, throughSequence) =>\n agent.events(sessionId, {\n page,\n pageSize: 100,\n ...(throughSequence ? { throughSequence } : {}),\n }),\n );\n}\n\nasync function readAllSubagentEvents(\n agent: RuntimeAgent,\n sessionId: string,\n): Promise<SessionEvent[]> {\n return readAllEventPages((page, throughSequence) =>\n agent.subagentEvents(sessionId, {\n page,\n pageSize: 100,\n ...(throughSequence ? { throughSequence } : {}),\n }),\n );\n}\n\nasync function readAllEventPages(\n read: (\n page: number,\n throughSequence?: number,\n ) => Promise<{\n events: SessionEvent[];\n throughSequence: number;\n hasMore: boolean;\n }>,\n): Promise<SessionEvent[]> {\n const pages: SessionEvent[][] = [];\n let page = 1;\n let hasMore = true;\n let throughSequence: number | undefined;\n while (hasMore) {\n const result = await read(page, throughSequence);\n throughSequence = result.throughSequence;\n pages.unshift(result.events);\n hasMore = result.hasMore;\n page += 1;\n }\n return pages.flat();\n}\n\nasync function serveAsset(\n response: ServerResponse,\n pathname: string,\n): Promise<void> {\n const publicRoot = resolve(\n dirname(fileURLToPath(import.meta.url)),\n \"public\",\n );\n const requested = pathname === \"/\" ? \"index.html\" : pathname.slice(1);\n const path = resolve(publicRoot, requested);\n const relativePath = relative(publicRoot, path);\n if (\n relativePath.startsWith(\"..\") ||\n isAbsolute(relativePath) ||\n !existsSync(path)\n ) {\n const indexPath = resolve(publicRoot, \"index.html\");\n if (!existsSync(indexPath)) {\n sendJson(response, 503, {\n error: \"Playground assets are missing. Rebuild orchajs.\",\n });\n return;\n }\n response.writeHead(200, {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(await readFile(indexPath));\n return;\n }\n response.writeHead(200, {\n \"content-type\": contentType(path),\n \"cache-control\": \"no-store\",\n });\n response.end(await readFile(path));\n}\n\nfunction contentType(path: string): string {\n switch (extname(path)) {\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".svg\":\n return \"image/svg+xml\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nasync function readJsonBody(\n request: IncomingMessage,\n): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > 2_000_000) {\n throw new HttpError(413, \"Request body exceeds 2 MB.\");\n }\n chunks.push(buffer);\n }\n let value: unknown;\n try {\n value = JSON.parse(Buffer.concat(chunks).toString(\"utf8\"));\n } catch {\n throw new HttpError(400, \"Request body must contain valid JSON.\");\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new HttpError(400, \"Request body must be a JSON object.\");\n }\n return value as Record<string, unknown>;\n}\n\nfunction parseContent(value: unknown): AgentContentInput {\n if (typeof value === \"string\" && value.trim()) {\n return value;\n }\n const items = Array.isArray(value) ? value : [value];\n if (items.length === 0) {\n throw new HttpError(400, \"content is required.\");\n }\n const parsed = items.map(parseContentItem);\n return Array.isArray(value) ? parsed : parsed[0];\n}\n\nfunction parseContentItem(value: unknown): MessageContentInput {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new HttpError(400, \"Every content item must be an object.\");\n }\n const item = value as Record<string, unknown>;\n if (typeof item.filePath === \"string\") {\n return {\n filePath: item.filePath,\n ...(typeof item.mimeType === \"string\"\n ? { mimeType: item.mimeType }\n : {}),\n };\n }\n if (typeof item.url === \"string\") {\n return {\n url: item.url,\n ...(typeof item.mimeType === \"string\"\n ? { mimeType: item.mimeType }\n : {}),\n };\n }\n if (item.type === \"text\" && typeof item.text === \"string\") {\n return { type: \"text\", text: item.text };\n }\n if (\n (item.type === \"image\" ||\n item.type === \"video\" ||\n item.type === \"audio\" ||\n item.type === \"url\") &&\n typeof item.mimeType === \"string\" &&\n typeof item.fileUri === \"string\"\n ) {\n return {\n type: item.type,\n mimeType: item.mimeType,\n fileUri: item.fileUri,\n };\n }\n throw new HttpError(400, \"Content item has invalid fields.\");\n}\n\nfunction parseToolResults(value: unknown): ToolResult[] {\n if (!Array.isArray(value) || value.length === 0) {\n throw new HttpError(400, \"toolResults must be a non-empty array.\");\n }\n return value.map((item) => {\n if (\n !item ||\n typeof item !== \"object\" ||\n Array.isArray(item) ||\n typeof (item as Record<string, unknown>).callId !== \"string\" ||\n !(\"output\" in item)\n ) {\n throw new HttpError(\n 400,\n \"Every tool result requires callId and output.\",\n );\n }\n const result = item as Record<string, unknown>;\n return {\n callId: result.callId as string,\n output: result.output,\n ...(result.isError === true ? { isError: true } : {}),\n };\n });\n}\n\nfunction sendJson(\n response: ServerResponse,\n status: number,\n value: unknown,\n): void {\n if (response.headersSent) {\n return;\n }\n response.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(JSON.stringify(value));\n}\n\nfunction writeNdjson(response: ServerResponse, value: unknown): void {\n response.write(`${JSON.stringify(value)}\\n`);\n}\n\nfunction publishProjectEvent(\n clients: Set<ServerResponse>,\n value: unknown,\n): void {\n const payload = `data: ${JSON.stringify(value)}\\n\\n`;\n for (const client of clients) {\n client.write(payload);\n }\n}\n\nfunction positiveInteger(value: string | null, fallback: number): number {\n const parsed = value ? Number.parseInt(value, 10) : fallback;\n return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim()\n ? value.trim()\n : undefined;\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const arguments_ =\n process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawn(command, arguments_, {\n detached: true,\n stdio: \"ignore\",\n });\n child.once(\"error\", () => undefined);\n child.unref();\n}\n\nclass HttpError extends Error {\n readonly status: number;\n\n constructor(status: number, message: string) {\n super(message);\n this.status = status;\n }\n}\n\nfunction playgroundHosts(host: string, port: number): Set<string> {\n const configured =\n host.includes(\":\") && !host.startsWith(\"[\")\n ? `[${host}]:${port}`\n : `${host}:${port}`;\n const hosts = new Set([configured.toLowerCase()]);\n if ([\"127.0.0.1\", \"localhost\", \"::1\"].includes(host)) {\n hosts.add(`127.0.0.1:${port}`);\n hosts.add(`localhost:${port}`);\n hosts.add(`[::1]:${port}`);\n }\n return hosts;\n}\n\nfunction validateRequestHost(\n request: IncomingMessage,\n allowedHosts: Set<string>,\n): void {\n const host = request.headers.host?.toLowerCase();\n if (!host || !allowedHosts.has(host)) {\n throw new HttpError(403, \"Playground request host is not allowed.\");\n }\n}\n\nfunction validateMutationRequest(\n request: IncomingMessage,\n mutationToken: string,\n): void {\n const contentType = request.headers[\"content-type\"] ?? \"\";\n if (!contentType.toLowerCase().startsWith(\"application/json\")) {\n throw new HttpError(\n 415,\n \"Playground mutations require application/json.\",\n );\n }\n if (request.headers[\"x-orcha-playground-token\"] !== mutationToken) {\n throw new HttpError(403, \"Invalid playground mutation token.\");\n }\n const origin = request.headers.origin;\n if (origin) {\n let originHost: string;\n try {\n originHost = new URL(origin).host.toLowerCase();\n } catch {\n throw new HttpError(403, \"Invalid playground request origin.\");\n }\n if (originHost !== request.headers.host?.toLowerCase()) {\n throw new HttpError(403, \"Cross-origin playground request denied.\");\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["sessionId", "contentType"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict"; const __orchaImportMetaUrl = require("
|
|
1
|
+
"use strict"; const __orchaImportMetaUrl = require("url").pathToFileURL(__filename).href;
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -22,8 +22,8 @@ __export(source_exports, {
|
|
|
22
22
|
readPlaygroundAgentSource: () => readPlaygroundAgentSource
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(source_exports);
|
|
25
|
-
var import_promises = require("
|
|
26
|
-
var
|
|
25
|
+
var import_promises = require("fs/promises");
|
|
26
|
+
var import_path = require("path");
|
|
27
27
|
var import_context = require("../runtime/context.js");
|
|
28
28
|
async function readPlaygroundAgentSource(orcha, agentKey) {
|
|
29
29
|
const context = (0, import_context.getOrchaRuntimeContext)(orcha);
|
|
@@ -37,11 +37,11 @@ async function readPlaygroundAgentSource(orcha, agentKey) {
|
|
|
37
37
|
registration
|
|
38
38
|
);
|
|
39
39
|
const rawConfiguration = await readRequired(
|
|
40
|
-
(0,
|
|
40
|
+
(0, import_path.resolve)(directory, "index.json")
|
|
41
41
|
);
|
|
42
42
|
const configuration = parseObject(rawConfiguration, `${agentKey}/index.json`);
|
|
43
43
|
const instructions = await readRequired(
|
|
44
|
-
(0,
|
|
44
|
+
(0, import_path.resolve)(directory, "instructions.md")
|
|
45
45
|
);
|
|
46
46
|
return {
|
|
47
47
|
key: agentKey,
|
|
@@ -83,10 +83,10 @@ async function readPlaygroundAgentSource(orcha, agentKey) {
|
|
|
83
83
|
}
|
|
84
84
|
function registeredAgentDirectory(projectRoot, registration) {
|
|
85
85
|
const registeredPath = typeof registration === "string" ? registration : registration.path;
|
|
86
|
-
return (0,
|
|
86
|
+
return (0, import_path.resolve)(projectRoot, "orcha", registeredPath);
|
|
87
87
|
}
|
|
88
88
|
async function readCollectionItems(agentDirectory, collection, manifests, includeSource) {
|
|
89
|
-
const root = (0,
|
|
89
|
+
const root = (0, import_path.resolve)(agentDirectory, collection);
|
|
90
90
|
let entries;
|
|
91
91
|
try {
|
|
92
92
|
entries = await (0, import_promises.readdir)(root, { withFileTypes: true });
|
|
@@ -104,17 +104,17 @@ async function readCollectionItems(agentDirectory, collection, manifests, includ
|
|
|
104
104
|
);
|
|
105
105
|
return Promise.all(
|
|
106
106
|
entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).sort((left, right) => left.name.localeCompare(right.name)).map(async (entry) => {
|
|
107
|
-
const directory = (0,
|
|
107
|
+
const directory = (0, import_path.resolve)(root, entry.name);
|
|
108
108
|
const rawConfiguration = await readRequired(
|
|
109
|
-
(0,
|
|
109
|
+
(0, import_path.resolve)(directory, "index.json")
|
|
110
110
|
);
|
|
111
111
|
const configuration = parseObject(
|
|
112
112
|
rawConfiguration,
|
|
113
113
|
`${collection}/${entry.name}/index.json`
|
|
114
114
|
);
|
|
115
115
|
const compiled = byDirectory.get(entry.name);
|
|
116
|
-
const instructions = includeSource ? void 0 : await readOptional((0,
|
|
117
|
-
const source = includeSource ? await readOptional((0,
|
|
116
|
+
const instructions = includeSource ? void 0 : await readOptional((0, import_path.resolve)(directory, "instructions.md"));
|
|
117
|
+
const source = includeSource ? await readOptional((0, import_path.resolve)(directory, "index.js")) : void 0;
|
|
118
118
|
return {
|
|
119
119
|
key: compiled?.key ?? entry.name,
|
|
120
120
|
name: typeof configuration.name === "string" ? configuration.name : entry.name,
|