orchajs 0.16.0 → 0.17.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.
@@ -129,7 +129,7 @@ function actionMetadata(key, action) {
129
129
  function readPackageInfo(projectRoot) {
130
130
  const packagePath = (0, import_node_path.join)(projectRoot, "package.json");
131
131
  if (!(0, import_node_fs.existsSync)(packagePath)) {
132
- return { repositoryUrl: readGitRemoteUrl(projectRoot) };
132
+ return { repositoryUrl: normalizeRepositoryUrl(readGitRemoteUrl(projectRoot)) };
133
133
  }
134
134
  try {
135
135
  const parsed = JSON.parse((0, import_node_fs.readFileSync)(packagePath, "utf8"));
@@ -137,10 +137,12 @@ function readPackageInfo(projectRoot) {
137
137
  name: typeof parsed.name === "string" ? parsed.name : void 0,
138
138
  description: typeof parsed.description === "string" ? parsed.description : void 0,
139
139
  version: typeof parsed.version === "string" ? parsed.version : void 0,
140
- repositoryUrl: readPackageRepositoryUrl(parsed.repository) ?? readGitRemoteUrl(projectRoot)
140
+ repositoryUrl: normalizeRepositoryUrl(
141
+ readPackageRepositoryUrl(parsed.repository) ?? readGitRemoteUrl(projectRoot)
142
+ )
141
143
  };
142
144
  } catch {
143
- return { repositoryUrl: readGitRemoteUrl(projectRoot) };
145
+ return { repositoryUrl: normalizeRepositoryUrl(readGitRemoteUrl(projectRoot)) };
144
146
  }
145
147
  }
146
148
  function readPackageRepositoryUrl(repository) {
@@ -162,20 +164,30 @@ function readGitRemoteUrl(projectRoot) {
162
164
  return origin?.[1]?.trim();
163
165
  }
164
166
  function resolveGitConfigPath(projectRoot) {
165
- const gitPath = (0, import_node_path.join)(projectRoot, ".git");
166
- if (!(0, import_node_fs.existsSync)(gitPath)) {
167
- return void 0;
168
- }
169
- try {
170
- const gitFile = (0, import_node_fs.readFileSync)(gitPath, "utf8");
171
- const gitDir = gitFile.match(/^gitdir: (.+)$/m)?.[1]?.trim();
172
- if (gitDir) {
173
- return (0, import_node_path.join)((0, import_node_path.resolve)(projectRoot, gitDir), "config");
167
+ let directory = (0, import_node_path.resolve)(projectRoot);
168
+ while (true) {
169
+ const gitPath = (0, import_node_path.join)(directory, ".git");
170
+ if ((0, import_node_fs.existsSync)(gitPath)) {
171
+ try {
172
+ const gitFile = (0, import_node_fs.readFileSync)(gitPath, "utf8");
173
+ const gitDir = gitFile.match(/^gitdir: (.+)$/m)?.[1]?.trim();
174
+ if (gitDir) {
175
+ return (0, import_node_path.join)((0, import_node_path.resolve)(directory, gitDir), "config");
176
+ }
177
+ } catch {
178
+ return (0, import_node_path.join)(gitPath, "config");
179
+ }
180
+ return (0, import_node_path.join)((0, import_node_path.dirname)(gitPath), ".git", "config");
174
181
  }
175
- } catch {
176
- return (0, import_node_path.join)(gitPath, "config");
182
+ const parent = (0, import_node_path.dirname)(directory);
183
+ if (parent === directory) {
184
+ return void 0;
185
+ }
186
+ directory = parent;
177
187
  }
178
- return (0, import_node_path.join)((0, import_node_path.dirname)(gitPath), ".git", "config");
188
+ }
189
+ function normalizeRepositoryUrl(url) {
190
+ return url?.replace(/^git\+/, "").replace(/^git@github\.com:/, "https://github.com/").replace(/\.git$/, "");
179
191
  }
180
192
  function hashStable(value) {
181
193
  return (0, import_node_crypto.createHash)("sha256").update(JSON.stringify(sortStable(value))).digest("hex");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/amarsia/metadata.ts"],
4
- "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type {\n CompiledActionManifest,\n CompiledAgentManifest,\n CompiledBundle,\n} from \"../types.js\";\n\nexport interface AmarsiaProjectMetadata {\n schema_version: 1;\n content_hash: string;\n project: {\n external_id: string;\n name: string;\n description?: string;\n root_path: string;\n package_name?: string;\n repository_url?: string;\n metadata: Record<string, unknown>;\n };\n agents: AmarsiaAgentMetadata[];\n}\n\nexport interface AmarsiaAgentMetadata {\n external_id: string;\n parent_external_id?: string;\n name: string;\n description?: string;\n provider?: string;\n model?: string;\n output_type?: string;\n actions: AmarsiaActionMetadata[];\n skills: AmarsiaSkillMetadata[];\n evaluations: AmarsiaEvaluationMetadata[];\n tests: AmarsiaTestMetadata[];\n metadata: Record<string, unknown>;\n}\n\nexport interface AmarsiaActionMetadata {\n key: string;\n name: string;\n description: string;\n execution?: \"client\" | \"local\";\n parameters: Record<string, unknown>;\n output_schema?: Record<string, unknown>;\n permissions: Record<string, string[]>;\n timeout_ms?: number;\n side_effect?: boolean;\n source_hash?: string;\n}\n\nexport interface AmarsiaSkillMetadata {\n key: string;\n name: string;\n description?: string;\n enabled?: boolean;\n triggers: string[];\n}\n\nexport interface AmarsiaEvaluationMetadata {\n key: string;\n name: string;\n description?: string;\n enabled?: boolean;\n provider?: string;\n model?: string;\n metrics: Array<{\n name: string;\n description?: string;\n threshold?: number;\n }>;\n}\n\nexport interface AmarsiaTestMetadata {\n key: string;\n name?: string;\n description?: string;\n enabled?: boolean;\n}\n\nexport function createAmarsiaProjectMetadata(\n bundle: CompiledBundle,\n projectRoot: string,\n): AmarsiaProjectMetadata {\n const packageInfo = readPackageInfo(projectRoot);\n const projectExternalId = hashStable({\n packageName: packageInfo.name,\n rootPath: projectRoot,\n }).slice(0, 32);\n const agents = flattenAgents(bundle.agents);\n const content = {\n project: {\n external_id: projectExternalId,\n name: packageInfo.name ?? \"Orcha project\",\n description: packageInfo.description,\n root_path: projectRoot,\n package_name: packageInfo.name,\n repository_url: packageInfo.repositoryUrl,\n metadata: {\n packageVersion: packageInfo.version,\n orchaSchemaVersion: bundle.schemaVersion,\n actionRuntime: bundle.actionRuntime,\n },\n },\n agents,\n };\n\n return {\n schema_version: 1,\n content_hash: hashStable(content),\n ...content,\n };\n}\n\nfunction flattenAgents(\n agents: Record<string, CompiledAgentManifest>,\n): AmarsiaAgentMetadata[] {\n const result: AmarsiaAgentMetadata[] = [];\n const visit = (\n manifest: CompiledAgentManifest,\n parentExternalId?: string,\n ) => {\n result.push(agentMetadata(manifest, parentExternalId));\n for (const subagent of Object.values(manifest.subagents ?? {})) {\n visit(subagent, manifest.key);\n }\n };\n\n for (const manifest of Object.values(agents)) {\n visit(manifest);\n }\n return result;\n}\n\nfunction agentMetadata(\n manifest: CompiledAgentManifest,\n parentExternalId?: string,\n): AmarsiaAgentMetadata {\n return {\n external_id: manifest.key,\n parent_external_id: parentExternalId,\n name: manifest.name,\n description: manifest.description,\n provider: manifest.provider,\n model: manifest.model,\n output_type: manifest.outputType,\n actions: Object.entries(manifest.actions ?? {}).map(([key, action]) =>\n actionMetadata(key, action),\n ),\n skills: Object.entries(manifest.skills ?? {}).map(([key, skill]) => ({\n key,\n name: skill.name,\n description: skill.description,\n enabled: skill.enabled,\n triggers: skill.triggers ?? [],\n })),\n evaluations: Object.entries(manifest.evaluations ?? {}).map(\n ([key, evaluation]) => ({\n key,\n name: evaluation.name,\n description: evaluation.description,\n enabled: evaluation.enabled,\n provider: evaluation.provider,\n model: evaluation.model,\n metrics: evaluation.metrics.map((metric) => ({\n name: metric.name,\n description: metric.description,\n threshold: metric.threshold,\n })),\n }),\n ),\n tests: [],\n metadata: {\n region: manifest.region,\n maxTokens: manifest.maxTokens,\n reasoningLevel: manifest.reasoningLevel,\n outputSchema: manifest.outputSchema,\n subagents: Object.keys(manifest.subagents ?? {}),\n subagentPolicy: manifest.subagentPolicy,\n },\n };\n}\n\nfunction actionMetadata(\n key: string,\n action: CompiledActionManifest,\n): AmarsiaActionMetadata {\n return {\n key,\n name: action.name,\n description: action.description,\n execution: action.execution,\n parameters: action.parameters,\n output_schema: action.outputSchema,\n permissions: action.permissions ?? {},\n timeout_ms: action.timeoutMs,\n side_effect: action.sideEffect,\n source_hash: action.sourceHash,\n };\n}\n\nfunction readPackageInfo(projectRoot: string): {\n name?: string;\n description?: string;\n version?: string;\n repositoryUrl?: string;\n} {\n const packagePath = join(projectRoot, \"package.json\");\n if (!existsSync(packagePath)) {\n return { repositoryUrl: readGitRemoteUrl(projectRoot) };\n }\n try {\n const parsed = JSON.parse(readFileSync(packagePath, \"utf8\")) as {\n name?: unknown;\n description?: unknown;\n version?: unknown;\n repository?: unknown;\n };\n return {\n name: typeof parsed.name === \"string\" ? parsed.name : undefined,\n description:\n typeof parsed.description === \"string\" ? parsed.description : undefined,\n version: typeof parsed.version === \"string\" ? parsed.version : undefined,\n repositoryUrl:\n readPackageRepositoryUrl(parsed.repository) ?? readGitRemoteUrl(projectRoot),\n };\n } catch {\n return { repositoryUrl: readGitRemoteUrl(projectRoot) };\n }\n}\n\nfunction readPackageRepositoryUrl(repository: unknown): string | undefined {\n if (typeof repository === \"string\") {\n return repository;\n }\n if (\n repository &&\n typeof repository === \"object\" &&\n typeof (repository as { url?: unknown }).url === \"string\"\n ) {\n return (repository as { url: string }).url;\n }\n return undefined;\n}\n\nfunction readGitRemoteUrl(projectRoot: string): string | undefined {\n const configPath = resolveGitConfigPath(projectRoot);\n if (!configPath || !existsSync(configPath)) {\n return undefined;\n }\n const config = readFileSync(configPath, \"utf8\");\n const origin = config.match(/\\[remote \"origin\"\\][\\s\\S]*?\\n\\s*url = (.+)/);\n return origin?.[1]?.trim();\n}\n\nfunction resolveGitConfigPath(projectRoot: string): string | undefined {\n const gitPath = join(projectRoot, \".git\");\n if (!existsSync(gitPath)) {\n return undefined;\n }\n try {\n const gitFile = readFileSync(gitPath, \"utf8\");\n const gitDir = gitFile.match(/^gitdir: (.+)$/m)?.[1]?.trim();\n if (gitDir) {\n return join(resolve(projectRoot, gitDir), \"config\");\n }\n } catch {\n return join(gitPath, \"config\");\n }\n return join(dirname(gitPath), \".git\", \"config\");\n}\n\nfunction hashStable(value: unknown): string {\n return createHash(\"sha256\")\n .update(JSON.stringify(sortStable(value)))\n .digest(\"hex\");\n}\n\nfunction sortStable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortStable);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, sortStable(entry)]),\n );\n }\n return value;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type {\n CompiledActionManifest,\n CompiledAgentManifest,\n CompiledBundle,\n} from \"../types.js\";\n\nexport interface AmarsiaProjectMetadata {\n schema_version: 1;\n content_hash: string;\n project: {\n external_id: string;\n name: string;\n description?: string;\n root_path: string;\n package_name?: string;\n repository_url?: string;\n metadata: Record<string, unknown>;\n };\n agents: AmarsiaAgentMetadata[];\n}\n\nexport interface AmarsiaAgentMetadata {\n external_id: string;\n parent_external_id?: string;\n name: string;\n description?: string;\n provider?: string;\n model?: string;\n output_type?: string;\n actions: AmarsiaActionMetadata[];\n skills: AmarsiaSkillMetadata[];\n evaluations: AmarsiaEvaluationMetadata[];\n tests: AmarsiaTestMetadata[];\n metadata: Record<string, unknown>;\n}\n\nexport interface AmarsiaActionMetadata {\n key: string;\n name: string;\n description: string;\n execution?: \"client\" | \"local\";\n parameters: Record<string, unknown>;\n output_schema?: Record<string, unknown>;\n permissions: Record<string, string[]>;\n timeout_ms?: number;\n side_effect?: boolean;\n source_hash?: string;\n}\n\nexport interface AmarsiaSkillMetadata {\n key: string;\n name: string;\n description?: string;\n enabled?: boolean;\n triggers: string[];\n}\n\nexport interface AmarsiaEvaluationMetadata {\n key: string;\n name: string;\n description?: string;\n enabled?: boolean;\n provider?: string;\n model?: string;\n metrics: Array<{\n name: string;\n description?: string;\n threshold?: number;\n }>;\n}\n\nexport interface AmarsiaTestMetadata {\n key: string;\n name?: string;\n description?: string;\n enabled?: boolean;\n}\n\nexport function createAmarsiaProjectMetadata(\n bundle: CompiledBundle,\n projectRoot: string,\n): AmarsiaProjectMetadata {\n const packageInfo = readPackageInfo(projectRoot);\n const projectExternalId = hashStable({\n packageName: packageInfo.name,\n rootPath: projectRoot,\n }).slice(0, 32);\n const agents = flattenAgents(bundle.agents);\n const content = {\n project: {\n external_id: projectExternalId,\n name: packageInfo.name ?? \"Orcha project\",\n description: packageInfo.description,\n root_path: projectRoot,\n package_name: packageInfo.name,\n repository_url: packageInfo.repositoryUrl,\n metadata: {\n packageVersion: packageInfo.version,\n orchaSchemaVersion: bundle.schemaVersion,\n actionRuntime: bundle.actionRuntime,\n },\n },\n agents,\n };\n\n return {\n schema_version: 1,\n content_hash: hashStable(content),\n ...content,\n };\n}\n\nfunction flattenAgents(\n agents: Record<string, CompiledAgentManifest>,\n): AmarsiaAgentMetadata[] {\n const result: AmarsiaAgentMetadata[] = [];\n const visit = (\n manifest: CompiledAgentManifest,\n parentExternalId?: string,\n ) => {\n result.push(agentMetadata(manifest, parentExternalId));\n for (const subagent of Object.values(manifest.subagents ?? {})) {\n visit(subagent, manifest.key);\n }\n };\n\n for (const manifest of Object.values(agents)) {\n visit(manifest);\n }\n return result;\n}\n\nfunction agentMetadata(\n manifest: CompiledAgentManifest,\n parentExternalId?: string,\n): AmarsiaAgentMetadata {\n return {\n external_id: manifest.key,\n parent_external_id: parentExternalId,\n name: manifest.name,\n description: manifest.description,\n provider: manifest.provider,\n model: manifest.model,\n output_type: manifest.outputType,\n actions: Object.entries(manifest.actions ?? {}).map(([key, action]) =>\n actionMetadata(key, action),\n ),\n skills: Object.entries(manifest.skills ?? {}).map(([key, skill]) => ({\n key,\n name: skill.name,\n description: skill.description,\n enabled: skill.enabled,\n triggers: skill.triggers ?? [],\n })),\n evaluations: Object.entries(manifest.evaluations ?? {}).map(\n ([key, evaluation]) => ({\n key,\n name: evaluation.name,\n description: evaluation.description,\n enabled: evaluation.enabled,\n provider: evaluation.provider,\n model: evaluation.model,\n metrics: evaluation.metrics.map((metric) => ({\n name: metric.name,\n description: metric.description,\n threshold: metric.threshold,\n })),\n }),\n ),\n tests: [],\n metadata: {\n region: manifest.region,\n maxTokens: manifest.maxTokens,\n reasoningLevel: manifest.reasoningLevel,\n outputSchema: manifest.outputSchema,\n subagents: Object.keys(manifest.subagents ?? {}),\n subagentPolicy: manifest.subagentPolicy,\n },\n };\n}\n\nfunction actionMetadata(\n key: string,\n action: CompiledActionManifest,\n): AmarsiaActionMetadata {\n return {\n key,\n name: action.name,\n description: action.description,\n execution: action.execution,\n parameters: action.parameters,\n output_schema: action.outputSchema,\n permissions: action.permissions ?? {},\n timeout_ms: action.timeoutMs,\n side_effect: action.sideEffect,\n source_hash: action.sourceHash,\n };\n}\n\nfunction readPackageInfo(projectRoot: string): {\n name?: string;\n description?: string;\n version?: string;\n repositoryUrl?: string;\n} {\n const packagePath = join(projectRoot, \"package.json\");\n if (!existsSync(packagePath)) {\n return { repositoryUrl: normalizeRepositoryUrl(readGitRemoteUrl(projectRoot)) };\n }\n try {\n const parsed = JSON.parse(readFileSync(packagePath, \"utf8\")) as {\n name?: unknown;\n description?: unknown;\n version?: unknown;\n repository?: unknown;\n };\n return {\n name: typeof parsed.name === \"string\" ? parsed.name : undefined,\n description:\n typeof parsed.description === \"string\" ? parsed.description : undefined,\n version: typeof parsed.version === \"string\" ? parsed.version : undefined,\n repositoryUrl: normalizeRepositoryUrl(\n readPackageRepositoryUrl(parsed.repository) ??\n readGitRemoteUrl(projectRoot),\n ),\n };\n } catch {\n return { repositoryUrl: normalizeRepositoryUrl(readGitRemoteUrl(projectRoot)) };\n }\n}\n\nfunction readPackageRepositoryUrl(repository: unknown): string | undefined {\n if (typeof repository === \"string\") {\n return repository;\n }\n if (\n repository &&\n typeof repository === \"object\" &&\n typeof (repository as { url?: unknown }).url === \"string\"\n ) {\n return (repository as { url: string }).url;\n }\n return undefined;\n}\n\nfunction readGitRemoteUrl(projectRoot: string): string | undefined {\n const configPath = resolveGitConfigPath(projectRoot);\n if (!configPath || !existsSync(configPath)) {\n return undefined;\n }\n const config = readFileSync(configPath, \"utf8\");\n const origin = config.match(/\\[remote \"origin\"\\][\\s\\S]*?\\n\\s*url = (.+)/);\n return origin?.[1]?.trim();\n}\n\nfunction resolveGitConfigPath(projectRoot: string): string | undefined {\n let directory = resolve(projectRoot);\n while (true) {\n const gitPath = join(directory, \".git\");\n if (existsSync(gitPath)) {\n try {\n const gitFile = readFileSync(gitPath, \"utf8\");\n const gitDir = gitFile.match(/^gitdir: (.+)$/m)?.[1]?.trim();\n if (gitDir) {\n return join(resolve(directory, gitDir), \"config\");\n }\n } catch {\n return join(gitPath, \"config\");\n }\n return join(dirname(gitPath), \".git\", \"config\");\n }\n const parent = dirname(directory);\n if (parent === directory) {\n return undefined;\n }\n directory = parent;\n }\n}\n\nfunction normalizeRepositoryUrl(url: string | undefined): string | undefined {\n return url\n ?.replace(/^git\\+/, \"\")\n .replace(/^git@github\\.com:/, \"https://github.com/\")\n .replace(/\\.git$/, \"\");\n}\n\nfunction hashStable(value: unknown): string {\n return createHash(\"sha256\")\n .update(JSON.stringify(sortStable(value)))\n .digest(\"hex\");\n}\n\nfunction sortStable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortStable);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, sortStable(entry)]),\n );\n }\n return value;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,qBAAyC;AACzC,uBAAuC;AA+EhC,SAAS,6BACd,QACA,aACwB;AACxB,QAAM,cAAc,gBAAgB,WAAW;AAC/C,QAAM,oBAAoB,WAAW;AAAA,IACnC,aAAa,YAAY;AAAA,IACzB,UAAU;AAAA,EACZ,CAAC,EAAE,MAAM,GAAG,EAAE;AACd,QAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,QAAM,UAAU;AAAA,IACd,SAAS;AAAA,MACP,aAAa;AAAA,MACb,MAAM,YAAY,QAAQ;AAAA,MAC1B,aAAa,YAAY;AAAA,MACzB,WAAW;AAAA,MACX,cAAc,YAAY;AAAA,MAC1B,gBAAgB,YAAY;AAAA,MAC5B,UAAU;AAAA,QACR,gBAAgB,YAAY;AAAA,QAC5B,oBAAoB,OAAO;AAAA,QAC3B,eAAe,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,cAAc,WAAW,OAAO;AAAA,IAChC,GAAG;AAAA,EACL;AACF;AAEA,SAAS,cACP,QACwB;AACxB,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ,CACZ,UACA,qBACG;AACH,WAAO,KAAK,cAAc,UAAU,gBAAgB,CAAC;AACrD,eAAW,YAAY,OAAO,OAAO,SAAS,aAAa,CAAC,CAAC,GAAG;AAC9D,YAAM,UAAU,SAAS,GAAG;AAAA,IAC9B;AAAA,EACF;AAEA,aAAW,YAAY,OAAO,OAAO,MAAM,GAAG;AAC5C,UAAM,QAAQ;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cACP,UACA,kBACsB;AACtB,SAAO;AAAA,IACL,aAAa,SAAS;AAAA,IACtB,oBAAoB;AAAA,IACpB,MAAM,SAAS;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,aAAa,SAAS;AAAA,IACtB,SAAS,OAAO,QAAQ,SAAS,WAAW,CAAC,CAAC,EAAE;AAAA,MAAI,CAAC,CAAC,KAAK,MAAM,MAC/D,eAAe,KAAK,MAAM;AAAA,IAC5B;AAAA,IACA,QAAQ,OAAO,QAAQ,SAAS,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,MACnE;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,UAAU,MAAM,YAAY,CAAC;AAAA,IAC/B,EAAE;AAAA,IACF,aAAa,OAAO,QAAQ,SAAS,eAAe,CAAC,CAAC,EAAE;AAAA,MACtD,CAAC,CAAC,KAAK,UAAU,OAAO;AAAA,QACtB;AAAA,QACA,MAAM,WAAW;AAAA,QACjB,aAAa,WAAW;AAAA,QACxB,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,QACrB,OAAO,WAAW;AAAA,QAClB,SAAS,WAAW,QAAQ,IAAI,CAAC,YAAY;AAAA,UAC3C,MAAM,OAAO;AAAA,UACb,aAAa,OAAO;AAAA,UACpB,WAAW,OAAO;AAAA,QACpB,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,MACR,QAAQ,SAAS;AAAA,MACjB,WAAW,SAAS;AAAA,MACpB,gBAAgB,SAAS;AAAA,MACzB,cAAc,SAAS;AAAA,MACvB,WAAW,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC;AAAA,MAC/C,gBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,eACP,KACA,QACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,eAAe,OAAO;AAAA,IACtB,aAAa,OAAO,eAAe,CAAC;AAAA,IACpC,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,gBAAgB,aAKvB;AACA,QAAM,kBAAc,uBAAK,aAAa,cAAc;AACpD,MAAI,KAAC,2BAAW,WAAW,GAAG;AAC5B,WAAO,EAAE,eAAe,uBAAuB,iBAAiB,WAAW,CAAC,EAAE;AAAA,EAChF;AACA,MAAI;AACF,UAAM,SAAS,KAAK,UAAM,6BAAa,aAAa,MAAM,CAAC;AAM3D,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,aACE,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,MAChE,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,MAC/D,eAAe;AAAA,QACb,yBAAyB,OAAO,UAAU,KACxC,iBAAiB,WAAW;AAAA,MAChC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,eAAe,uBAAuB,iBAAiB,WAAW,CAAC,EAAE;AAAA,EAChF;AACF;AAEA,SAAS,yBAAyB,YAAyC;AACzE,MAAI,OAAO,eAAe,UAAU;AAClC,WAAO;AAAA,EACT;AACA,MACE,cACA,OAAO,eAAe,YACtB,OAAQ,WAAiC,QAAQ,UACjD;AACA,WAAQ,WAA+B;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAyC;AACjE,QAAM,aAAa,qBAAqB,WAAW;AACnD,MAAI,CAAC,cAAc,KAAC,2BAAW,UAAU,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,QAAM,aAAS,6BAAa,YAAY,MAAM;AAC9C,QAAM,SAAS,OAAO,MAAM,4CAA4C;AACxE,SAAO,SAAS,CAAC,GAAG,KAAK;AAC3B;AAEA,SAAS,qBAAqB,aAAyC;AACrE,MAAI,gBAAY,0BAAQ,WAAW;AACnC,SAAO,MAAM;AACX,UAAM,cAAU,uBAAK,WAAW,MAAM;AACtC,YAAI,2BAAW,OAAO,GAAG;AACvB,UAAI;AACF,cAAM,cAAU,6BAAa,SAAS,MAAM;AAC5C,cAAM,SAAS,QAAQ,MAAM,iBAAiB,IAAI,CAAC,GAAG,KAAK;AAC3D,YAAI,QAAQ;AACV,qBAAO,2BAAK,0BAAQ,WAAW,MAAM,GAAG,QAAQ;AAAA,QAClD;AAAA,MACF,QAAQ;AACN,mBAAO,uBAAK,SAAS,QAAQ;AAAA,MAC/B;AACA,iBAAO,2BAAK,0BAAQ,OAAO,GAAG,QAAQ,QAAQ;AAAA,IAChD;AACA,UAAM,aAAS,0BAAQ,SAAS;AAChC,QAAI,WAAW,WAAW;AACxB,aAAO;AAAA,IACT;AACA,gBAAY;AAAA,EACd;AACF;AAEA,SAAS,uBAAuB,KAA6C;AAC3E,SAAO,KACH,QAAQ,UAAU,EAAE,EACrB,QAAQ,qBAAqB,qBAAqB,EAClD,QAAQ,UAAU,EAAE;AACzB;AAEA,SAAS,WAAW,OAAwB;AAC1C,aAAO,+BAAW,QAAQ,EACvB,OAAO,KAAK,UAAU,WAAW,KAAK,CAAC,CAAC,EACxC,OAAO,KAAK;AACjB;AAEA,SAAS,WAAW,OAAyB;AAC3C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,UAAU;AAAA,EAC7B;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAgC,EAC5C,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,WAAW,KAAK,CAAC,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orchajs",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "A filesystem-convention, stateful agent framework for JavaScript.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,7 +13,8 @@
13
13
  },
14
14
  "workspaces": [
15
15
  ".",
16
- "packages/create-orcha"
16
+ "packages/create-orcha",
17
+ "packages/playground-ui"
17
18
  ],
18
19
  "type": "module",
19
20
  "main": "./dist-cjs/index.js",