@botbotgo/common 1.0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +54 -0
  2. package/dist/chunk-GQZFDM3S.js +51 -0
  3. package/dist/chunk-GQZFDM3S.js.map +1 -0
  4. package/dist/chunk-HBCZVEUG.js +92 -0
  5. package/dist/chunk-HBCZVEUG.js.map +1 -0
  6. package/dist/chunk-OTWARMTU.js +182 -0
  7. package/dist/chunk-OTWARMTU.js.map +1 -0
  8. package/dist/chunk-P6CL7XSX.js +463 -0
  9. package/dist/chunk-P6CL7XSX.js.map +1 -0
  10. package/dist/chunk-QG6CT2GZ.js +31 -0
  11. package/dist/chunk-QG6CT2GZ.js.map +1 -0
  12. package/dist/chunk-RQSSJFDP.js +33 -0
  13. package/dist/chunk-RQSSJFDP.js.map +1 -0
  14. package/dist/chunk-X4TDNR4V.js +206 -0
  15. package/dist/chunk-X4TDNR4V.js.map +1 -0
  16. package/dist/cli/index.d.ts +1 -0
  17. package/dist/cli/index.js +13 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/startup.d.ts +14 -0
  20. package/dist/config/hydrate.d.ts +15 -0
  21. package/dist/config/index.d.ts +3 -0
  22. package/dist/config/index.js +27 -0
  23. package/dist/config/index.js.map +1 -0
  24. package/dist/config/kind.d.ts +28 -0
  25. package/dist/config/path.d.ts +14 -0
  26. package/dist/config/yaml.d.ts +32 -0
  27. package/dist/connectivity/check.d.ts +19 -0
  28. package/dist/connectivity/index.d.ts +3 -0
  29. package/dist/connectivity/index.js +102 -0
  30. package/dist/connectivity/index.js.map +1 -0
  31. package/dist/connectivity/types.d.ts +12 -0
  32. package/dist/context/default-context.d.ts +10 -0
  33. package/dist/context/index.d.ts +2 -0
  34. package/dist/context/index.js +16 -0
  35. package/dist/context/index.js.map +1 -0
  36. package/dist/context/tokens.d.ts +29 -0
  37. package/dist/events/index.d.ts +17 -0
  38. package/dist/events/index.js +20 -0
  39. package/dist/events/index.js.map +1 -0
  40. package/dist/events/progress-listener.d.ts +8 -0
  41. package/dist/events/runtime2-tree-listener.d.ts +26 -0
  42. package/dist/index.d.ts +4 -0
  43. package/dist/index.js +49 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/npm/cache.d.ts +9 -0
  46. package/dist/npm/command.d.ts +36 -0
  47. package/dist/npm/index.d.ts +1 -0
  48. package/dist/npm/index.js +29 -0
  49. package/dist/npm/index.js.map +1 -0
  50. package/dist/npm/install.d.ts +8 -0
  51. package/dist/npm/provider.d.ts +14 -0
  52. package/dist/npm/version.d.ts +11 -0
  53. package/dist/security-store/backends/file/index.d.ts +19 -0
  54. package/dist/security-store/backends/index.d.ts +7 -0
  55. package/dist/security-store/backends/keychain/constants.d.ts +4 -0
  56. package/dist/security-store/backends/keychain/index.d.ts +17 -0
  57. package/dist/security-store/backends/keychain/keytar.d.ts +5 -0
  58. package/dist/security-store/backends/keychain/swift-bridge.d.ts +17 -0
  59. package/dist/security-store/backends/keychain/utils.d.ts +11 -0
  60. package/dist/security-store/backends/memory/index.d.ts +10 -0
  61. package/dist/security-store/backends/types.d.ts +29 -0
  62. package/dist/security-store/backends/utils.d.ts +2 -0
  63. package/dist/security-store/index.d.ts +2 -0
  64. package/dist/security-store/index.js +819 -0
  65. package/dist/security-store/index.js.map +1 -0
  66. package/dist/security-store/store.d.ts +49 -0
  67. package/dist/testing/index.d.ts +1 -0
  68. package/dist/testing/index.js +7 -0
  69. package/dist/testing/index.js.map +1 -0
  70. package/dist/utils/agent-result.d.ts +4 -0
  71. package/dist/utils/checksum.d.ts +16 -0
  72. package/dist/utils/deep-merge.d.ts +4 -0
  73. package/dist/utils/frontmatter.d.ts +12 -0
  74. package/dist/utils/index.d.ts +10 -0
  75. package/dist/utils/index.js +38 -0
  76. package/dist/utils/index.js.map +1 -0
  77. package/dist/utils/log.d.ts +1 -0
  78. package/dist/utils/object.d.ts +4 -0
  79. package/dist/utils/override-with-config.d.ts +12 -0
  80. package/dist/utils/parsing.d.ts +4 -0
  81. package/dist/utils/selection/tool-choice.d.ts +1 -0
  82. package/dist/utils/selection/tool-registry.d.ts +5 -0
  83. package/package.json +128 -0
@@ -0,0 +1,206 @@
1
+ // src/config/yaml.ts
2
+ import { existsSync, readFileSync, statSync } from "fs";
3
+ import { readFile, stat } from "fs/promises";
4
+ import path2 from "path";
5
+ import { parse as parseYaml } from "yaml";
6
+
7
+ // src/config/path.ts
8
+ import path from "path";
9
+ import { homedir } from "os";
10
+ function isPathRef(value) {
11
+ return typeof value === "string" && value.length > 0 && (value.endsWith(".yaml") || value.endsWith(".yml"));
12
+ }
13
+ function expandHomePath(inputPath, options = {}) {
14
+ const home = options.homeDir ?? homedir();
15
+ if (inputPath === "~") return home;
16
+ if (inputPath.startsWith("~/")) return path.join(home, inputPath.slice(2));
17
+ return inputPath;
18
+ }
19
+ function resolveConfigPath(pathRef, configDir, options = {}) {
20
+ const expanded = options.expandHome === false ? pathRef : expandHomePath(pathRef, { homeDir: options.homeDir });
21
+ return path.resolve(configDir, expanded);
22
+ }
23
+ function asObject(input) {
24
+ return typeof input === "object" && input !== null ? input : void 0;
25
+ }
26
+ function toPathRef(input) {
27
+ if (typeof input === "string" && input.trim().length > 0) return { ref: input.trim() };
28
+ const obj = asObject(input);
29
+ if (!obj) return void 0;
30
+ const value = (typeof obj.__filePath === "string" && obj.__filePath.trim().length > 0 ? obj.__filePath.trim() : void 0) ?? (typeof obj.ref === "string" && obj.ref.trim().length > 0 ? obj.ref.trim() : void 0);
31
+ return value ? { ref: value } : void 0;
32
+ }
33
+
34
+ // src/config/yaml.ts
35
+ var YAML_CACHE = /* @__PURE__ */ new Map();
36
+ function clearYamlFileCache() {
37
+ YAML_CACHE.clear();
38
+ }
39
+ function substituteEnvInString(input, env, missingEnv) {
40
+ return input.replace(/\$\{(\w+)\}/g, (_, name) => {
41
+ const value = env[name];
42
+ if (value !== void 0) return value;
43
+ return missingEnv === "empty" ? "" : `\${${name}}`;
44
+ });
45
+ }
46
+ function substituteEnvInValue(input, options) {
47
+ if (typeof input === "string") {
48
+ return substituteEnvInString(input, options.env, options.missingEnv);
49
+ }
50
+ if (Array.isArray(input)) {
51
+ return input.map((item) => substituteEnvInValue(item, options));
52
+ }
53
+ if (input && typeof input === "object") {
54
+ const out = {};
55
+ for (const [k, v] of Object.entries(input)) {
56
+ out[k] = substituteEnvInValue(v, options);
57
+ }
58
+ return out;
59
+ }
60
+ return input;
61
+ }
62
+ function parseYamlContent(content, options = {}) {
63
+ const parsed = parseYaml(content);
64
+ if (options.substituteEnv === false) return parsed;
65
+ return substituteEnvInValue(parsed, {
66
+ env: options.env ?? process.env,
67
+ missingEnv: options.missingEnv ?? "keep"
68
+ });
69
+ }
70
+ function readFromCache(filePath, mtimeMs) {
71
+ const cached = YAML_CACHE.get(filePath);
72
+ if (!cached) return void 0;
73
+ if (cached.mtimeMs !== mtimeMs) return void 0;
74
+ return cached.value;
75
+ }
76
+ function writeCache(filePath, mtimeMs, value) {
77
+ YAML_CACHE.set(filePath, { mtimeMs, value });
78
+ }
79
+ function loadYamlFileSync(filePath, options = {}) {
80
+ const absPath = path2.resolve(filePath);
81
+ if (!existsSync(absPath)) return void 0;
82
+ const useCache = options.cache === true;
83
+ const fileStat = statSync(absPath);
84
+ if (useCache) {
85
+ const cached = readFromCache(absPath, fileStat.mtimeMs);
86
+ if (cached !== void 0) return cached;
87
+ }
88
+ const content = readFileSync(absPath, "utf-8");
89
+ const parsed = parseYamlContent(content, options);
90
+ if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);
91
+ return parsed;
92
+ }
93
+ async function loadYamlFile(filePath, options = {}) {
94
+ const absPath = path2.resolve(filePath);
95
+ let fileStat;
96
+ try {
97
+ fileStat = await stat(absPath);
98
+ } catch (err) {
99
+ if (err?.code === "ENOENT") return void 0;
100
+ throw err;
101
+ }
102
+ const useCache = options.cache === true;
103
+ if (useCache) {
104
+ const cached = readFromCache(absPath, fileStat.mtimeMs);
105
+ if (cached !== void 0) return cached;
106
+ }
107
+ const content = await readFile(absPath, "utf-8");
108
+ const parsed = parseYamlContent(content, options);
109
+ if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);
110
+ return parsed;
111
+ }
112
+
113
+ // src/config/kind.ts
114
+ import { dirname } from "path";
115
+ function toResourceHeader(input) {
116
+ const obj = asObject(input);
117
+ if (!obj) throw new Error("Invalid config document: expected object root");
118
+ const apiVersion = typeof obj.apiVersion === "string" ? obj.apiVersion.trim() : "";
119
+ const kind = typeof obj.kind === "string" ? obj.kind.trim() : "";
120
+ const spec = obj.spec;
121
+ if (!apiVersion) throw new Error("Invalid config document: missing apiVersion");
122
+ if (!kind) throw new Error("Invalid config document: missing kind");
123
+ if (spec === void 0) throw new Error("Invalid config document: missing spec");
124
+ const metadataRaw = asObject(obj.metadata);
125
+ const metadata = metadataRaw ? {
126
+ name: typeof metadataRaw.name === "string" ? metadataRaw.name : void 0,
127
+ labels: metadataRaw.labels && typeof metadataRaw.labels === "object" && !Array.isArray(metadataRaw.labels) ? metadataRaw.labels : void 0
128
+ } : void 0;
129
+ return { apiVersion, kind, metadata, spec };
130
+ }
131
+ function isRefNode(input) {
132
+ const obj = asObject(input);
133
+ return !!obj && typeof obj.ref === "string" && obj.ref.trim().length > 0;
134
+ }
135
+ async function resolveKindResourceFile(entryFile, options = {}) {
136
+ const baseDir = options.baseDir ?? process.cwd();
137
+ const entryAbs = resolveConfigPath(entryFile, baseDir);
138
+ const maxDepth = options.maxDepth ?? 50;
139
+ const cache = /* @__PURE__ */ new Map();
140
+ const visiting = /* @__PURE__ */ new Set();
141
+ const resolveNode = async (node, currentDir, depth) => {
142
+ if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);
143
+ if (isRefNode(node)) {
144
+ const next = resolveConfigPath(node.ref, currentDir);
145
+ return loadResource(next, depth + 1);
146
+ }
147
+ if (Array.isArray(node)) {
148
+ return Promise.all(node.map((item) => resolveNode(item, currentDir, depth + 1)));
149
+ }
150
+ const obj = asObject(node);
151
+ if (!obj) return node;
152
+ const out = {};
153
+ for (const [k, v] of Object.entries(obj)) {
154
+ out[k] = await resolveNode(v, currentDir, depth + 1);
155
+ }
156
+ return out;
157
+ };
158
+ const loadResource = async (absPath, depth) => {
159
+ if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);
160
+ if (options.cache !== false) {
161
+ const cached = cache.get(absPath);
162
+ if (cached) return cached;
163
+ }
164
+ if (visiting.has(absPath)) {
165
+ throw new Error(`Config ref cycle detected at: ${absPath}`);
166
+ }
167
+ visiting.add(absPath);
168
+ try {
169
+ const raw = await loadYamlFile(absPath, options.yaml);
170
+ const header = toResourceHeader(raw);
171
+ if (options.expectedApiVersion && header.apiVersion !== options.expectedApiVersion) {
172
+ throw new Error(`Unexpected apiVersion "${header.apiVersion}" at ${absPath}`);
173
+ }
174
+ const resolvedSpec = await resolveNode(header.spec, dirname(absPath), depth + 1);
175
+ const resolved = {
176
+ ...header,
177
+ spec: resolvedSpec,
178
+ __filePath: absPath
179
+ };
180
+ if (options.cache !== false) cache.set(absPath, resolved);
181
+ return resolved;
182
+ } finally {
183
+ visiting.delete(absPath);
184
+ }
185
+ };
186
+ const root = await loadResource(entryAbs, 0);
187
+ if (options.expectedKind && root.kind !== options.expectedKind) {
188
+ throw new Error(`Expected kind "${options.expectedKind}" but got "${root.kind}" at ${root.__filePath}`);
189
+ }
190
+ return root;
191
+ }
192
+
193
+ export {
194
+ isPathRef,
195
+ expandHomePath,
196
+ resolveConfigPath,
197
+ asObject,
198
+ toPathRef,
199
+ clearYamlFileCache,
200
+ parseYamlContent,
201
+ loadYamlFileSync,
202
+ loadYamlFile,
203
+ isRefNode,
204
+ resolveKindResourceFile
205
+ };
206
+ //# sourceMappingURL=chunk-X4TDNR4V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/yaml.ts","../src/config/path.ts","../src/config/kind.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { resolveConfigPath } from \"./path.js\";\n\nexport interface YamlEnvOptions {\n substituteEnv?: boolean;\n missingEnv?: \"keep\" | \"empty\";\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface LoadYamlOptions extends YamlEnvOptions {\n cache?: boolean;\n}\n\nexport interface LoadModuleConfigOptions<TConfig, TRaw = Record<string, unknown>> {\n path?: string;\n defaultPath?: string;\n appRoot?: string;\n yaml?: LoadYamlOptions;\n unwrapSpec?: boolean;\n fallback: TConfig;\n normalize?: (raw: TRaw, meta: { resolvedPath: string }) => TConfig;\n}\n\ninterface CacheEntry {\n mtimeMs: number;\n value: unknown;\n}\n\nconst YAML_CACHE = new Map<string, CacheEntry>();\n\nexport function clearYamlFileCache(): void {\n YAML_CACHE.clear();\n}\n\nfunction substituteEnvInString(\n input: string,\n env: NodeJS.ProcessEnv,\n missingEnv: \"keep\" | \"empty\",\n): string {\n return input.replace(/\\$\\{(\\w+)\\}/g, (_, name: string) => {\n const value = env[name];\n if (value !== undefined) return value;\n return missingEnv === \"empty\" ? \"\" : `\\${${name}}`;\n });\n}\n\nfunction substituteEnvInValue(\n input: unknown,\n options: { env: NodeJS.ProcessEnv; missingEnv: \"keep\" | \"empty\" },\n): unknown {\n if (typeof input === \"string\") {\n return substituteEnvInString(input, options.env, options.missingEnv);\n }\n if (Array.isArray(input)) {\n return input.map((item) => substituteEnvInValue(item, options));\n }\n if (input && typeof input === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n out[k] = substituteEnvInValue(v, options);\n }\n return out;\n }\n return input;\n}\n\nexport function parseYamlContent<T = unknown>(\n content: string,\n options: YamlEnvOptions = {},\n): T {\n const parsed = parseYaml(content) as unknown;\n if (options.substituteEnv === false) return parsed as T;\n return substituteEnvInValue(parsed, {\n env: options.env ?? process.env,\n missingEnv: options.missingEnv ?? \"keep\",\n }) as T;\n}\n\nfunction readFromCache(filePath: string, mtimeMs: number): unknown | undefined {\n const cached = YAML_CACHE.get(filePath);\n if (!cached) return undefined;\n if (cached.mtimeMs !== mtimeMs) return undefined;\n return cached.value;\n}\n\nfunction writeCache(filePath: string, mtimeMs: number, value: unknown): void {\n YAML_CACHE.set(filePath, { mtimeMs, value });\n}\n\nexport function loadYamlFileSync<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): T | undefined {\n const absPath = path.resolve(filePath);\n if (!existsSync(absPath)) return undefined;\n const useCache = options.cache === true;\n const fileStat = statSync(absPath);\n if (useCache) {\n const cached = readFromCache(absPath, fileStat.mtimeMs);\n if (cached !== undefined) return cached as T;\n }\n const content = readFileSync(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);\n return parsed;\n}\n\nexport async function loadYamlFile<T = unknown>(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<T | undefined> {\n const absPath = path.resolve(filePath);\n let fileStat;\n try {\n fileStat = await stat(absPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"ENOENT\") return undefined;\n throw err;\n }\n const useCache = options.cache === true;\n if (useCache) {\n const cached = readFromCache(absPath, fileStat.mtimeMs);\n if (cached !== undefined) return cached as T;\n }\n const content = await readFile(absPath, \"utf-8\");\n const parsed = parseYamlContent<T>(content, options);\n if (useCache) writeCache(absPath, fileStat.mtimeMs, parsed);\n return parsed;\n}\n\nexport async function loadYamlObject(\n filePath: string,\n options: LoadYamlOptions = {},\n): Promise<Record<string, unknown>> {\n const parsed = await loadYamlFile<unknown>(filePath, options);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Generic module config loader:\n * 1) resolve path (path || defaultPath) relative to appRoot\n * 2) load YAML as object\n * 3) normalize into module-owned config interface\n * 4) fallback when missing/invalid\n */\nexport async function loadModuleConfig<TConfig, TRaw = Record<string, unknown>>(\n options: LoadModuleConfigOptions<TConfig, TRaw>,\n): Promise<TConfig> {\n const selected = options.path ?? options.defaultPath;\n if (!selected) return options.fallback;\n\n const appRoot = options.appRoot ?? process.cwd();\n const resolvedPath = resolveConfigPath(selected, appRoot);\n const loaded = await loadYamlFile<unknown>(resolvedPath, options.yaml);\n if (!loaded || typeof loaded !== \"object\" || Array.isArray(loaded)) return options.fallback;\n const raw = options.unwrapSpec === true\n ? (\n typeof (loaded as { spec?: unknown }).spec === \"object\" &&\n (loaded as { spec?: unknown }).spec !== null &&\n !Array.isArray((loaded as { spec?: unknown }).spec)\n ? (loaded as { spec: unknown }).spec\n : loaded\n )\n : loaded;\n\n if (options.normalize) {\n return options.normalize(raw as TRaw, { resolvedPath });\n }\n return raw as TConfig;\n}\n","import path from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface ResolveConfigPathOptions {\n expandHome?: boolean;\n homeDir?: string;\n}\n\nexport type PathRef = { ref?: string };\n\nexport function isPathRef(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n (value.endsWith(\".yaml\") || value.endsWith(\".yml\"))\n );\n}\n\nexport function expandHomePath(inputPath: string, options: { homeDir?: string } = {}): string {\n const home = options.homeDir ?? homedir();\n if (inputPath === \"~\") return home;\n if (inputPath.startsWith(\"~/\")) return path.join(home, inputPath.slice(2));\n return inputPath;\n}\n\nexport function resolveConfigPath(\n pathRef: string,\n configDir: string,\n options: ResolveConfigPathOptions = {},\n): string {\n const expanded = options.expandHome === false ? pathRef : expandHomePath(pathRef, { homeDir: options.homeDir });\n return path.resolve(configDir, expanded);\n}\n\nexport function asObject(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null ? (input as Record<string, unknown>) : undefined;\n}\n\nexport function toPathRef(input: unknown): PathRef | undefined {\n if (typeof input === \"string\" && input.trim().length > 0) return { ref: input.trim() };\n const obj = asObject(input);\n if (!obj) return undefined;\n const value =\n (typeof (obj as { __filePath?: unknown }).__filePath === \"string\" &&\n (obj as { __filePath: string }).__filePath.trim().length > 0\n ? (obj as { __filePath: string }).__filePath.trim()\n : undefined) ??\n (typeof obj.ref === \"string\" && obj.ref.trim().length > 0 ? obj.ref.trim() : undefined);\n return value ? { ref: value } : undefined;\n}\n","import { dirname } from \"node:path\";\nimport { loadYamlFile, type LoadYamlOptions } from \"./yaml.js\";\nimport { asObject, resolveConfigPath } from \"./path.js\";\n\nexport interface ResourceMetadata {\n name?: string;\n labels?: Record<string, string>;\n}\n\nexport interface ResourceHeader {\n apiVersion: string;\n kind: string;\n metadata?: ResourceMetadata;\n spec: unknown;\n}\n\nexport type RefNode = { ref: string };\n\nexport type ResolvedResource<TSpec = unknown> = ResourceHeader & {\n spec: TSpec;\n __filePath: string;\n};\n\nexport interface ResolveKindResourceOptions {\n baseDir?: string;\n maxDepth?: number;\n cache?: boolean;\n yaml?: LoadYamlOptions;\n expectedKind?: string;\n expectedApiVersion?: string;\n}\n\nfunction toResourceHeader(input: unknown): ResourceHeader {\n const obj = asObject(input);\n if (!obj) throw new Error(\"Invalid config document: expected object root\");\n\n const apiVersion = typeof obj.apiVersion === \"string\" ? obj.apiVersion.trim() : \"\";\n const kind = typeof obj.kind === \"string\" ? obj.kind.trim() : \"\";\n const spec = (obj as { spec?: unknown }).spec;\n if (!apiVersion) throw new Error(\"Invalid config document: missing apiVersion\");\n if (!kind) throw new Error(\"Invalid config document: missing kind\");\n if (spec === undefined) throw new Error(\"Invalid config document: missing spec\");\n const metadataRaw = asObject(obj.metadata);\n const metadata: ResourceMetadata | undefined = metadataRaw\n ? {\n name: typeof metadataRaw.name === \"string\" ? metadataRaw.name : undefined,\n labels:\n metadataRaw.labels && typeof metadataRaw.labels === \"object\" && !Array.isArray(metadataRaw.labels)\n ? (metadataRaw.labels as Record<string, string>)\n : undefined,\n }\n : undefined;\n return { apiVersion, kind, metadata, spec };\n}\n\nexport function isRefNode(input: unknown): input is RefNode {\n const obj = asObject(input);\n return !!obj && typeof obj.ref === \"string\" && obj.ref.trim().length > 0;\n}\n\nexport async function resolveKindResourceFile<TSpec = unknown>(\n entryFile: string,\n options: ResolveKindResourceOptions = {},\n): Promise<ResolvedResource<TSpec>> {\n const baseDir = options.baseDir ?? process.cwd();\n const entryAbs = resolveConfigPath(entryFile, baseDir);\n const maxDepth = options.maxDepth ?? 50;\n const cache = new Map<string, ResolvedResource>();\n const visiting = new Set<string>();\n\n const resolveNode = async (node: unknown, currentDir: string, depth: number): Promise<unknown> => {\n if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);\n if (isRefNode(node)) {\n const next = resolveConfigPath(node.ref, currentDir);\n return loadResource(next, depth + 1);\n }\n if (Array.isArray(node)) {\n return Promise.all(node.map((item) => resolveNode(item, currentDir, depth + 1)));\n }\n const obj = asObject(node);\n if (!obj) return node;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n out[k] = await resolveNode(v, currentDir, depth + 1);\n }\n return out;\n };\n\n const loadResource = async (absPath: string, depth: number): Promise<ResolvedResource> => {\n if (depth > maxDepth) throw new Error(`Config ref resolution exceeded maxDepth=${maxDepth}`);\n if (options.cache !== false) {\n const cached = cache.get(absPath);\n if (cached) return cached;\n }\n if (visiting.has(absPath)) {\n throw new Error(`Config ref cycle detected at: ${absPath}`);\n }\n visiting.add(absPath);\n try {\n const raw = await loadYamlFile(absPath, options.yaml);\n const header = toResourceHeader(raw);\n if (options.expectedApiVersion && header.apiVersion !== options.expectedApiVersion) {\n throw new Error(`Unexpected apiVersion \"${header.apiVersion}\" at ${absPath}`);\n }\n const resolvedSpec = await resolveNode(header.spec, dirname(absPath), depth + 1);\n const resolved: ResolvedResource = {\n ...header,\n spec: resolvedSpec,\n __filePath: absPath,\n };\n if (options.cache !== false) cache.set(absPath, resolved);\n return resolved;\n } finally {\n visiting.delete(absPath);\n }\n };\n\n const root = await loadResource(entryAbs, 0);\n if (options.expectedKind && root.kind !== options.expectedKind) {\n throw new Error(`Expected kind \"${options.expectedKind}\" but got \"${root.kind}\" at ${root.__filePath}`);\n }\n return root as ResolvedResource<TSpec>;\n}\n"],"mappings":"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","names":["path","path"]}
@@ -0,0 +1 @@
1
+ export { toErrorMessage, formatLogPath, StartupProgressRenderer, runStartupStep, } from "./startup.js";
@@ -0,0 +1,13 @@
1
+ import {
2
+ StartupProgressRenderer,
3
+ formatLogPath,
4
+ runStartupStep,
5
+ toErrorMessage
6
+ } from "../chunk-HBCZVEUG.js";
7
+ export {
8
+ StartupProgressRenderer,
9
+ formatLogPath,
10
+ runStartupStep,
11
+ toErrorMessage
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,14 @@
1
+ export declare function toErrorMessage(error: unknown): string;
2
+ export declare function formatLogPath(pathValue: string): string;
3
+ export declare class StartupProgressRenderer {
4
+ private readonly isDynamic;
5
+ private readonly frames;
6
+ private readonly lineByStep;
7
+ private readonly timerByStep;
8
+ private readonly frameIndexByStep;
9
+ private lineCount;
10
+ start(stepId: string, title: string): void;
11
+ complete(stepId: string, title: string, ok: boolean, detail: string, elapsedMs: number): void;
12
+ private renderLine;
13
+ }
14
+ export declare function runStartupStep<T>(progress: StartupProgressRenderer, title: string, fn: () => Promise<T> | T, formatResult?: (result: T) => string): Promise<T>;
@@ -0,0 +1,15 @@
1
+ export interface HydrateScopedDefaultsOptions<TConfig, TScope extends {
2
+ ref?: string;
3
+ }, TDefaults> {
4
+ appRoot: string;
5
+ getScope: (config: TConfig) => TScope | undefined;
6
+ setScope: (config: TConfig, scope: TScope) => TConfig;
7
+ resolveDefaults: (ref: string, appRoot: string) => Promise<TDefaults>;
8
+ }
9
+ /**
10
+ * Generic helper for config maps that keep a scoped ref as `{ ref }`.
11
+ * It loads defaults per unique ref once, then merges with item-local scope.
12
+ */
13
+ export declare function hydrateNamedScopedDefaults<TConfig, TScope extends {
14
+ ref?: string;
15
+ }, TDefaults extends Record<string, unknown>>(configs: Record<string, TConfig>, options: HydrateScopedDefaultsOptions<TConfig, TScope, TDefaults>): Promise<Record<string, TConfig>>;
@@ -0,0 +1,3 @@
1
+ export { loadYamlFile, loadYamlFileSync, parseYamlContent, clearYamlFileCache, type LoadYamlOptions, } from "./yaml.js";
2
+ export { expandHomePath, resolveConfigPath, asObject, isPathRef, toPathRef, type ResolveConfigPathOptions, type PathRef, } from "./path.js";
3
+ export { resolveKindResourceFile, isRefNode, type ResourceMetadata, type ResourceHeader, type RefNode, type ResolvedResource, type ResolveKindResourceOptions, } from "./kind.js";
@@ -0,0 +1,27 @@
1
+ import {
2
+ asObject,
3
+ clearYamlFileCache,
4
+ expandHomePath,
5
+ isPathRef,
6
+ isRefNode,
7
+ loadYamlFile,
8
+ loadYamlFileSync,
9
+ parseYamlContent,
10
+ resolveConfigPath,
11
+ resolveKindResourceFile,
12
+ toPathRef
13
+ } from "../chunk-X4TDNR4V.js";
14
+ export {
15
+ asObject,
16
+ clearYamlFileCache,
17
+ expandHomePath,
18
+ isPathRef,
19
+ isRefNode,
20
+ loadYamlFile,
21
+ loadYamlFileSync,
22
+ parseYamlContent,
23
+ resolveConfigPath,
24
+ resolveKindResourceFile,
25
+ toPathRef
26
+ };
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,28 @@
1
+ import { type LoadYamlOptions } from "./yaml.js";
2
+ export interface ResourceMetadata {
3
+ name?: string;
4
+ labels?: Record<string, string>;
5
+ }
6
+ export interface ResourceHeader {
7
+ apiVersion: string;
8
+ kind: string;
9
+ metadata?: ResourceMetadata;
10
+ spec: unknown;
11
+ }
12
+ export type RefNode = {
13
+ ref: string;
14
+ };
15
+ export type ResolvedResource<TSpec = unknown> = ResourceHeader & {
16
+ spec: TSpec;
17
+ __filePath: string;
18
+ };
19
+ export interface ResolveKindResourceOptions {
20
+ baseDir?: string;
21
+ maxDepth?: number;
22
+ cache?: boolean;
23
+ yaml?: LoadYamlOptions;
24
+ expectedKind?: string;
25
+ expectedApiVersion?: string;
26
+ }
27
+ export declare function isRefNode(input: unknown): input is RefNode;
28
+ export declare function resolveKindResourceFile<TSpec = unknown>(entryFile: string, options?: ResolveKindResourceOptions): Promise<ResolvedResource<TSpec>>;
@@ -0,0 +1,14 @@
1
+ export interface ResolveConfigPathOptions {
2
+ expandHome?: boolean;
3
+ homeDir?: string;
4
+ }
5
+ export type PathRef = {
6
+ ref?: string;
7
+ };
8
+ export declare function isPathRef(value: unknown): value is string;
9
+ export declare function expandHomePath(inputPath: string, options?: {
10
+ homeDir?: string;
11
+ }): string;
12
+ export declare function resolveConfigPath(pathRef: string, configDir: string, options?: ResolveConfigPathOptions): string;
13
+ export declare function asObject(input: unknown): Record<string, unknown> | undefined;
14
+ export declare function toPathRef(input: unknown): PathRef | undefined;
@@ -0,0 +1,32 @@
1
+ export interface YamlEnvOptions {
2
+ substituteEnv?: boolean;
3
+ missingEnv?: "keep" | "empty";
4
+ env?: NodeJS.ProcessEnv;
5
+ }
6
+ export interface LoadYamlOptions extends YamlEnvOptions {
7
+ cache?: boolean;
8
+ }
9
+ export interface LoadModuleConfigOptions<TConfig, TRaw = Record<string, unknown>> {
10
+ path?: string;
11
+ defaultPath?: string;
12
+ appRoot?: string;
13
+ yaml?: LoadYamlOptions;
14
+ unwrapSpec?: boolean;
15
+ fallback: TConfig;
16
+ normalize?: (raw: TRaw, meta: {
17
+ resolvedPath: string;
18
+ }) => TConfig;
19
+ }
20
+ export declare function clearYamlFileCache(): void;
21
+ export declare function parseYamlContent<T = unknown>(content: string, options?: YamlEnvOptions): T;
22
+ export declare function loadYamlFileSync<T = unknown>(filePath: string, options?: LoadYamlOptions): T | undefined;
23
+ export declare function loadYamlFile<T = unknown>(filePath: string, options?: LoadYamlOptions): Promise<T | undefined>;
24
+ export declare function loadYamlObject(filePath: string, options?: LoadYamlOptions): Promise<Record<string, unknown>>;
25
+ /**
26
+ * Generic module config loader:
27
+ * 1) resolve path (path || defaultPath) relative to appRoot
28
+ * 2) load YAML as object
29
+ * 3) normalize into module-owned config interface
30
+ * 4) fallback when missing/invalid
31
+ */
32
+ export declare function loadModuleConfig<TConfig, TRaw = Record<string, unknown>>(options: LoadModuleConfigOptions<TConfig, TRaw>): Promise<TConfig>;
@@ -0,0 +1,19 @@
1
+ import type { CheckConnectivityResult } from "./types.js";
2
+ export interface EndpointConnectivityOptions {
3
+ timeoutMs?: number;
4
+ resolveHost?: {
5
+ from: string;
6
+ to: string;
7
+ };
8
+ host?: string;
9
+ verifySSL?: boolean;
10
+ bypassAuth?: boolean;
11
+ featureKey?: string;
12
+ }
13
+ export declare function checkEndpointConnectivity(baseURL: string, options?: {
14
+ timeoutMs?: number;
15
+ } & EndpointConnectivityOptions): Promise<CheckConnectivityResult>;
16
+ export interface BuildUnreachableErrorOptions {
17
+ suggestion?: string;
18
+ }
19
+ export declare function buildUnreachableError(endpointId: string, baseURL: string, detail?: string, options?: BuildUnreachableErrorOptions): string;
@@ -0,0 +1,3 @@
1
+ export { checkEndpointConnectivity, buildUnreachableError, } from "./check.js";
2
+ export type { EndpointConnectivityOptions } from "./check.js";
3
+ export type { ConnectionStatus, ConnectionPhase, CheckConnectivityResult, } from "./types.js";
@@ -0,0 +1,102 @@
1
+ // src/connectivity/check.ts
2
+ import https from "https";
3
+ var DEFAULT_TIMEOUT_MS = 8e3;
4
+ function probePath(baseURL) {
5
+ const base = baseURL.replace(/\/+$/, "");
6
+ if (base.endsWith("/v1")) return `${base}/models`;
7
+ return base.includes("/v1") ? `${base}/models` : `${base}/v1/models`;
8
+ }
9
+ function resolveProbeRequest(baseURL, endpointOptions) {
10
+ let path = probePath(baseURL);
11
+ const urlObj = new URL(path);
12
+ const resolveFrom = endpointOptions?.resolveHost?.from;
13
+ const resolveTo = endpointOptions?.resolveHost?.to;
14
+ let hostHeader = endpointOptions?.host;
15
+ if (resolveFrom && resolveTo && urlObj.hostname) {
16
+ urlObj.hostname = urlObj.hostname.replace(resolveFrom, resolveTo);
17
+ hostHeader = hostHeader ?? resolveFrom;
18
+ }
19
+ const searchParams = new URLSearchParams(urlObj.search);
20
+ if (endpointOptions?.bypassAuth === true) searchParams.set("bypass_auth", "true");
21
+ urlObj.search = searchParams.toString();
22
+ return { url: urlObj.toString(), hostHeader };
23
+ }
24
+ function checkWithHttps(url, hostHeader, options) {
25
+ return new Promise((resolve) => {
26
+ const u = new URL(url);
27
+ const reqOpts = {
28
+ hostname: u.hostname,
29
+ port: u.port || (u.protocol === "https:" ? 443 : 80),
30
+ path: u.pathname + u.search,
31
+ method: "GET",
32
+ headers: { Accept: "application/json" },
33
+ rejectUnauthorized: options.verifySSL
34
+ };
35
+ if (hostHeader) reqOpts.headers = { ...reqOpts.headers, Host: hostHeader };
36
+ const timeoutId = setTimeout(() => {
37
+ req.destroy();
38
+ resolve({ reachable: false, message: "Connection timed out" });
39
+ }, options.timeoutMs);
40
+ const req = https.request(reqOpts, (res) => {
41
+ clearTimeout(timeoutId);
42
+ resolve({
43
+ reachable: true,
44
+ message: res.statusCode === 200 ? "OK" : `HTTP ${res.statusCode}`,
45
+ statusCode: res.statusCode
46
+ });
47
+ });
48
+ req.on("error", (err) => {
49
+ clearTimeout(timeoutId);
50
+ resolve({ reachable: false, message: err.message || "Connection failed" });
51
+ });
52
+ req.end();
53
+ });
54
+ }
55
+ async function checkEndpointConnectivity(baseURL, options) {
56
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
57
+ const useHttps = options?.resolveHost != null || options?.verifySSL === false || options?.host != null || options?.bypassAuth === true;
58
+ if (useHttps) {
59
+ const { url: url2, hostHeader } = resolveProbeRequest(baseURL, options);
60
+ return checkWithHttps(url2, hostHeader, {
61
+ timeoutMs,
62
+ verifySSL: options?.verifySSL === true
63
+ });
64
+ }
65
+ const url = probePath(baseURL);
66
+ const controller = new AbortController();
67
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
68
+ try {
69
+ const res = await fetch(url, {
70
+ method: "GET",
71
+ signal: controller.signal,
72
+ headers: { Accept: "application/json" }
73
+ });
74
+ clearTimeout(timeoutId);
75
+ return {
76
+ reachable: true,
77
+ message: res.ok ? "OK" : `HTTP ${res.status}`,
78
+ statusCode: res.status
79
+ };
80
+ } catch (err) {
81
+ clearTimeout(timeoutId);
82
+ const message = err instanceof Error ? err.message : String(err);
83
+ const isTimeout = err instanceof Error && err.name === "AbortError";
84
+ return {
85
+ reachable: false,
86
+ message: isTimeout ? "Connection timed out" : message || "Connection failed"
87
+ };
88
+ }
89
+ }
90
+ function buildUnreachableError(endpointId, baseURL, detail, options) {
91
+ const parts = [
92
+ `Cannot connect to endpoint (endpoint: ${endpointId}, base URL: ${baseURL}).`,
93
+ detail && ` ${detail}`,
94
+ options?.suggestion ? ` ${options.suggestion}` : ""
95
+ ];
96
+ return parts.filter(Boolean).join("").trim();
97
+ }
98
+ export {
99
+ buildUnreachableError,
100
+ checkEndpointConnectivity
101
+ };
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/connectivity/check.ts"],"sourcesContent":["/**\n * Check connectivity to OpenAI-compatible endpoints.\n */\nimport https from \"node:https\";\nimport type { CheckConnectivityResult } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 8000;\n\nexport interface EndpointConnectivityOptions {\n timeoutMs?: number;\n resolveHost?: { from: string; to: string };\n host?: string;\n verifySSL?: boolean;\n bypassAuth?: boolean;\n featureKey?: string;\n}\n\nfunction probePath(baseURL: string): string {\n const base = baseURL.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return `${base}/models`;\n return base.includes(\"/v1\") ? `${base}/models` : `${base}/v1/models`;\n}\n\nfunction resolveProbeRequest(\n baseURL: string,\n endpointOptions?: EndpointConnectivityOptions | null\n): { url: string; hostHeader: string | undefined } {\n let path = probePath(baseURL);\n const urlObj = new URL(path);\n const resolveFrom = endpointOptions?.resolveHost?.from;\n const resolveTo = endpointOptions?.resolveHost?.to;\n let hostHeader = endpointOptions?.host;\n if (resolveFrom && resolveTo && urlObj.hostname) {\n urlObj.hostname = urlObj.hostname.replace(resolveFrom, resolveTo);\n hostHeader = hostHeader ?? resolveFrom;\n }\n const searchParams = new URLSearchParams(urlObj.search);\n if (endpointOptions?.bypassAuth === true) searchParams.set(\"bypass_auth\", \"true\");\n urlObj.search = searchParams.toString();\n return { url: urlObj.toString(), hostHeader };\n}\n\nfunction checkWithHttps(\n url: string,\n hostHeader: string | undefined,\n options: { timeoutMs: number; verifySSL: boolean }\n): Promise<CheckConnectivityResult> {\n return new Promise((resolve) => {\n const u = new URL(url);\n const reqOpts: https.RequestOptions = {\n hostname: u.hostname,\n port: u.port || (u.protocol === \"https:\" ? 443 : 80),\n path: u.pathname + u.search,\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n rejectUnauthorized: options.verifySSL,\n };\n if (hostHeader) reqOpts.headers = { ...reqOpts.headers, Host: hostHeader };\n\n const timeoutId = setTimeout(() => {\n req.destroy();\n resolve({ reachable: false, message: \"Connection timed out\" });\n }, options.timeoutMs);\n\n const req = https.request(reqOpts, (res) => {\n clearTimeout(timeoutId);\n resolve({\n reachable: true,\n message: res.statusCode === 200 ? \"OK\" : `HTTP ${res.statusCode}`,\n statusCode: res.statusCode,\n });\n });\n req.on(\"error\", (err) => {\n clearTimeout(timeoutId);\n resolve({ reachable: false, message: err.message || \"Connection failed\" });\n });\n req.end();\n });\n}\n\nexport async function checkEndpointConnectivity(\n baseURL: string,\n options?: { timeoutMs?: number } & EndpointConnectivityOptions\n): Promise<CheckConnectivityResult> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const useHttps =\n options?.resolveHost != null ||\n options?.verifySSL === false ||\n options?.host != null ||\n options?.bypassAuth === true;\n\n if (useHttps) {\n const { url, hostHeader } = resolveProbeRequest(baseURL, options);\n return checkWithHttps(url, hostHeader, {\n timeoutMs,\n verifySSL: options?.verifySSL === true,\n });\n }\n\n const url = probePath(baseURL);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n });\n clearTimeout(timeoutId);\n return {\n reachable: true,\n message: res.ok ? \"OK\" : `HTTP ${res.status}`,\n statusCode: res.status,\n };\n } catch (err) {\n clearTimeout(timeoutId);\n const message = err instanceof Error ? err.message : String(err);\n const isTimeout = err instanceof Error && err.name === \"AbortError\";\n return {\n reachable: false,\n message: isTimeout ? \"Connection timed out\" : message || \"Connection failed\",\n };\n }\n}\n\nexport interface BuildUnreachableErrorOptions {\n suggestion?: string;\n}\n\nexport function buildUnreachableError(\n endpointId: string,\n baseURL: string,\n detail?: string,\n options?: BuildUnreachableErrorOptions\n): string {\n const parts = [\n `Cannot connect to endpoint (endpoint: ${endpointId}, base URL: ${baseURL}).`,\n detail && ` ${detail}`,\n options?.suggestion ? ` ${options.suggestion}` : \"\",\n ];\n return parts.filter(Boolean).join(\"\").trim();\n}\n"],"mappings":"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","names":["url"]}
@@ -0,0 +1,12 @@
1
+ export type ConnectionPhase = "checking" | "reachable" | "unreachable";
2
+ export interface ConnectionStatus {
3
+ phase: ConnectionPhase;
4
+ endpointId?: string;
5
+ baseURL?: string;
6
+ message?: string;
7
+ }
8
+ export interface CheckConnectivityResult {
9
+ reachable: boolean;
10
+ message?: string;
11
+ statusCode?: number;
12
+ }
@@ -0,0 +1,10 @@
1
+ export interface AgentContext {
2
+ set<T>(token: symbol, value: T): void;
3
+ get<T>(token: symbol): T;
4
+ has(token: symbol): boolean;
5
+ tryGet<T>(token: symbol): T | undefined;
6
+ }
7
+ export declare function createAgentContext(): AgentContext;
8
+ export declare function isAgentContext(value: unknown): value is AgentContext;
9
+ export declare function getDefaultAgentContext(): AgentContext;
10
+ export declare function resetDefaultAgentContext(): void;
@@ -0,0 +1,2 @@
1
+ export { AgentContextTokens, type AgentContextTokenKey } from "./tokens.js";
2
+ export { createAgentContext, getDefaultAgentContext, isAgentContext, type AgentContext, } from "./default-context.js";
@@ -0,0 +1,16 @@
1
+ import {
2
+ AgentContextTokens
3
+ } from "../chunk-RQSSJFDP.js";
4
+ import {
5
+ createAgentContext,
6
+ getDefaultAgentContext,
7
+ isAgentContext
8
+ } from "../chunk-GQZFDM3S.js";
9
+ import "../chunk-QG6CT2GZ.js";
10
+ export {
11
+ AgentContextTokens,
12
+ createAgentContext,
13
+ getDefaultAgentContext,
14
+ isAgentContext
15
+ };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Well-known Symbol tokens for AgentContext.
3
+ * Use these to register and retrieve modules from an AgentContext.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * ctx.set(AgentContextTokens.ChatModel, llm);
8
+ * const llm = ctx.get<BaseChatModel>(AgentContextTokens.ChatModel);
9
+ * ```
10
+ */
11
+ export declare const AgentContextTokens: {
12
+ /** The shared AgentEventBus instance */
13
+ readonly EventBus: symbol;
14
+ /** The primary chat model (BaseChatModel) */
15
+ readonly ChatModel: symbol;
16
+ /** The embedding model (Embeddings) */
17
+ readonly EmbedModel: symbol;
18
+ /** The vision-language chat model (BaseChatModel) */
19
+ readonly VlmModel: symbol;
20
+ /** The memory client (AgentMemory) */
21
+ readonly Memory: symbol;
22
+ /** The initialized tool list */
23
+ readonly Tools: symbol;
24
+ /** The loaded skill set (SkillSet | undefined) */
25
+ readonly SkillSet: symbol;
26
+ /** The initialized agent runtime instance (react/deep) */
27
+ readonly Runtime: symbol;
28
+ };
29
+ export type AgentContextTokenKey = (typeof AgentContextTokens)[keyof typeof AgentContextTokens];
@@ -0,0 +1,17 @@
1
+ export interface AgentEvent<TPayload = unknown> {
2
+ id: string;
3
+ name: string;
4
+ from: string;
5
+ to: string;
6
+ at: string;
7
+ payload?: TPayload;
8
+ }
9
+ export interface AgentEventBus {
10
+ publish<TPayload = unknown>(event: Omit<AgentEvent<TPayload>, "id" | "at">): AgentEvent<TPayload>;
11
+ subscribe(listener: AgentEventListener): () => void;
12
+ }
13
+ export type AgentEventListener = (event: AgentEvent) => void;
14
+ export declare function createAgentEventBus(): AgentEventBus;
15
+ export declare function createConsoleAgentEventListener(writer?: (line: string) => void): AgentEventListener;
16
+ export { createProgressAgentEventListener, type ProgressEventListenerOptions, } from "./progress-listener.js";
17
+ export { createRuntime2TreeEventListener, resolveRuntime2DebugConfig, type Runtime2EventDebugConfig, type Runtime2EventRuntimeConfig, type Runtime2TreeEventListenerOptions, } from "./runtime2-tree-listener.js";