@goondan/runtime 0.0.3-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/bundle-loader.d.ts +30 -0
- package/dist/config/bundle-loader.d.ts.map +1 -0
- package/dist/config/bundle-loader.js +504 -0
- package/dist/config/bundle-loader.js.map +1 -0
- package/dist/config/object-ref.d.ts +8 -0
- package/dist/config/object-ref.d.ts.map +1 -0
- package/dist/config/object-ref.js +60 -0
- package/dist/config/object-ref.js.map +1 -0
- package/dist/config/resources.d.ts +18 -0
- package/dist/config/resources.d.ts.map +1 -0
- package/dist/config/resources.js +575 -0
- package/dist/config/resources.js.map +1 -0
- package/dist/config/simple-yaml.d.ts +5 -0
- package/dist/config/simple-yaml.d.ts.map +1 -0
- package/dist/config/simple-yaml.js +250 -0
- package/dist/config/simple-yaml.js.map +1 -0
- package/dist/conversation/state.d.ts +38 -0
- package/dist/conversation/state.d.ts.map +1 -0
- package/dist/conversation/state.js +157 -0
- package/dist/conversation/state.js.map +1 -0
- package/dist/events/runtime-events.d.ts +87 -0
- package/dist/events/runtime-events.d.ts.map +1 -0
- package/dist/events/runtime-events.js +32 -0
- package/dist/events/runtime-events.js.map +1 -0
- package/dist/extension/api-impl.d.ts +28 -0
- package/dist/extension/api-impl.d.ts.map +1 -0
- package/dist/extension/api-impl.js +59 -0
- package/dist/extension/api-impl.js.map +1 -0
- package/dist/extension/api-impl.test.d.ts +2 -0
- package/dist/extension/api-impl.test.d.ts.map +1 -0
- package/dist/extension/api-impl.test.js +97 -0
- package/dist/extension/api-impl.test.js.map +1 -0
- package/dist/extension/index.d.ts +4 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/index.js +4 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/integration.test.d.ts +2 -0
- package/dist/extension/integration.test.d.ts.map +1 -0
- package/dist/extension/integration.test.js +224 -0
- package/dist/extension/integration.test.js.map +1 -0
- package/dist/extension/loader.d.ts +17 -0
- package/dist/extension/loader.d.ts.map +1 -0
- package/dist/extension/loader.js +50 -0
- package/dist/extension/loader.js.map +1 -0
- package/dist/extension/loader.test.d.ts +2 -0
- package/dist/extension/loader.test.d.ts.map +1 -0
- package/dist/extension/loader.test.js +180 -0
- package/dist/extension/loader.test.js.map +1 -0
- package/dist/extension/state-manager.d.ts +21 -0
- package/dist/extension/state-manager.d.ts.map +1 -0
- package/dist/extension/state-manager.js +43 -0
- package/dist/extension/state-manager.js.map +1 -0
- package/dist/extension/state-manager.test.d.ts +2 -0
- package/dist/extension/state-manager.test.d.ts.map +1 -0
- package/dist/extension/state-manager.test.js +100 -0
- package/dist/extension/state-manager.test.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/event-queue.d.ts +15 -0
- package/dist/orchestrator/event-queue.d.ts.map +1 -0
- package/dist/orchestrator/event-queue.js +20 -0
- package/dist/orchestrator/event-queue.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +41 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +409 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/types.d.ts +72 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +2 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/pipeline/registry.d.ts +60 -0
- package/dist/pipeline/registry.d.ts.map +1 -0
- package/dist/pipeline/registry.js +362 -0
- package/dist/pipeline/registry.js.map +1 -0
- package/dist/runner/conversation-state.d.ts +8 -0
- package/dist/runner/conversation-state.d.ts.map +1 -0
- package/dist/runner/conversation-state.js +52 -0
- package/dist/runner/conversation-state.js.map +1 -0
- package/dist/runner/index.d.ts +4 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +18 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/runtime-restart-signal.d.ts +6 -0
- package/dist/runner/runtime-restart-signal.d.ts.map +1 -0
- package/dist/runner/runtime-restart-signal.js +18 -0
- package/dist/runner/runtime-restart-signal.js.map +1 -0
- package/dist/runner/runtime-routing.d.ts +41 -0
- package/dist/runner/runtime-routing.d.ts.map +1 -0
- package/dist/runner/runtime-routing.js +154 -0
- package/dist/runner/runtime-routing.js.map +1 -0
- package/dist/runner/runtime-runner-connector-child.d.ts +2 -0
- package/dist/runner/runtime-runner-connector-child.d.ts.map +1 -0
- package/dist/runner/runtime-runner-connector-child.js +188 -0
- package/dist/runner/runtime-runner-connector-child.js.map +1 -0
- package/dist/runner/runtime-runner-protocol.d.ts +13 -0
- package/dist/runner/runtime-runner-protocol.d.ts.map +1 -0
- package/dist/runner/runtime-runner-protocol.js +14 -0
- package/dist/runner/runtime-runner-protocol.js.map +1 -0
- package/dist/runner/runtime-runner.d.ts +2 -0
- package/dist/runner/runtime-runner.d.ts.map +1 -0
- package/dist/runner/runtime-runner.js +2738 -0
- package/dist/runner/runtime-runner.js.map +1 -0
- package/dist/runner/turn-policy.d.ts +8 -0
- package/dist/runner/turn-policy.d.ts.map +1 -0
- package/dist/runner/turn-policy.js +13 -0
- package/dist/runner/turn-policy.js.map +1 -0
- package/dist/tools/executor.d.ts +29 -0
- package/dist/tools/executor.d.ts.map +1 -0
- package/dist/tools/executor.js +124 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/naming.d.ts +7 -0
- package/dist/tools/naming.d.ts.map +1 -0
- package/dist/tools/naming.js +31 -0
- package/dist/tools/naming.js.map +1 -0
- package/dist/tools/registry.d.ts +18 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +66 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/types.d.ts +388 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace/instance-manager.d.ts +19 -0
- package/dist/workspace/instance-manager.d.ts.map +1 -0
- package/dist/workspace/instance-manager.js +72 -0
- package/dist/workspace/instance-manager.js.map +1 -0
- package/dist/workspace/paths.d.ts +28 -0
- package/dist/workspace/paths.d.ts.map +1 -0
- package/dist/workspace/paths.js +108 -0
- package/dist/workspace/paths.js.map +1 -0
- package/dist/workspace/storage.d.ts +45 -0
- package/dist/workspace/storage.d.ts.map +1 -0
- package/dist/workspace/storage.js +377 -0
- package/dist/workspace/storage.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "bun:test";
|
|
2
|
+
import { loadExtensions, ExtensionLoadError } from "./loader.js";
|
|
3
|
+
import { PipelineRegistryImpl } from "../pipeline/registry.js";
|
|
4
|
+
import { ToolRegistryImpl } from "../tools/registry.js";
|
|
5
|
+
import { ExtensionStateManagerImpl } from "./state-manager.js";
|
|
6
|
+
import { ExtensionApiImpl } from "./api-impl.js";
|
|
7
|
+
import { FileWorkspaceStorage } from "../workspace/storage.js";
|
|
8
|
+
import { WorkspacePaths } from "../workspace/paths.js";
|
|
9
|
+
import { EventEmitter } from "node:events";
|
|
10
|
+
import * as fs from "node:fs/promises";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import * as os from "node:os";
|
|
13
|
+
describe("loadExtensions", () => {
|
|
14
|
+
let tempDir;
|
|
15
|
+
let bundleDir;
|
|
16
|
+
let apiFactory;
|
|
17
|
+
let logger;
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "ext-loader-test-"));
|
|
20
|
+
bundleDir = path.join(tempDir, "bundle");
|
|
21
|
+
await fs.mkdir(bundleDir, { recursive: true });
|
|
22
|
+
const paths = new WorkspacePaths({
|
|
23
|
+
stateRoot: tempDir,
|
|
24
|
+
projectRoot: tempDir,
|
|
25
|
+
});
|
|
26
|
+
const storage = new FileWorkspaceStorage(paths);
|
|
27
|
+
await storage.initializeSystemRoot();
|
|
28
|
+
await storage.initializeInstanceState("test-instance", "test-agent");
|
|
29
|
+
const pipelineRegistry = new PipelineRegistryImpl();
|
|
30
|
+
const toolRegistry = new ToolRegistryImpl();
|
|
31
|
+
const eventBus = new EventEmitter();
|
|
32
|
+
apiFactory = (name) => {
|
|
33
|
+
const stateManager = new ExtensionStateManagerImpl(storage, "test-instance", [name]);
|
|
34
|
+
return new ExtensionApiImpl(name, pipelineRegistry, toolRegistry, stateManager, eventBus, console);
|
|
35
|
+
};
|
|
36
|
+
logger = console;
|
|
37
|
+
});
|
|
38
|
+
it("should load and register extension successfully", async () => {
|
|
39
|
+
const extPath = path.join(bundleDir, "test-ext.ts");
|
|
40
|
+
await fs.writeFile(extPath, `
|
|
41
|
+
export function register(api) {
|
|
42
|
+
api.tools.register(
|
|
43
|
+
{ name: 'test-ext__hello', description: 'Test', parameters: { type: 'object', properties: {} } },
|
|
44
|
+
async () => ({ message: 'Hello' })
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
`, "utf8");
|
|
48
|
+
const resources = [
|
|
49
|
+
{
|
|
50
|
+
apiVersion: "goondan.ai/v1",
|
|
51
|
+
kind: "Extension",
|
|
52
|
+
metadata: { name: "test-ext" },
|
|
53
|
+
spec: { entry: "./test-ext.ts" },
|
|
54
|
+
__file: "test.yaml",
|
|
55
|
+
__docIndex: 0,
|
|
56
|
+
__rootDir: bundleDir,
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
await loadExtensions(resources, apiFactory, bundleDir, logger);
|
|
60
|
+
});
|
|
61
|
+
it("should load multiple extensions in order", async () => {
|
|
62
|
+
const ext1Path = path.join(bundleDir, "ext1.ts");
|
|
63
|
+
const ext2Path = path.join(bundleDir, "ext2.ts");
|
|
64
|
+
await fs.writeFile(ext1Path, `
|
|
65
|
+
export function register(api) {
|
|
66
|
+
api.logger.info('ext1 registered');
|
|
67
|
+
}
|
|
68
|
+
`, "utf8");
|
|
69
|
+
await fs.writeFile(ext2Path, `
|
|
70
|
+
export function register(api) {
|
|
71
|
+
api.logger.info('ext2 registered');
|
|
72
|
+
}
|
|
73
|
+
`, "utf8");
|
|
74
|
+
const resources = [
|
|
75
|
+
{
|
|
76
|
+
apiVersion: "goondan.ai/v1",
|
|
77
|
+
kind: "Extension",
|
|
78
|
+
metadata: { name: "ext1" },
|
|
79
|
+
spec: { entry: "./ext1.ts" },
|
|
80
|
+
__file: "test.yaml",
|
|
81
|
+
__docIndex: 0,
|
|
82
|
+
__rootDir: bundleDir,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
apiVersion: "goondan.ai/v1",
|
|
86
|
+
kind: "Extension",
|
|
87
|
+
metadata: { name: "ext2" },
|
|
88
|
+
spec: { entry: "./ext2.ts" },
|
|
89
|
+
__file: "test.yaml",
|
|
90
|
+
__docIndex: 1,
|
|
91
|
+
__rootDir: bundleDir,
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
await loadExtensions(resources, apiFactory, bundleDir, logger);
|
|
95
|
+
});
|
|
96
|
+
it("should throw ExtensionLoadError if register function is missing", async () => {
|
|
97
|
+
const extPath = path.join(bundleDir, "bad-ext.ts");
|
|
98
|
+
await fs.writeFile(extPath, `
|
|
99
|
+
export const notRegister = () => {};
|
|
100
|
+
`, "utf8");
|
|
101
|
+
const resources = [
|
|
102
|
+
{
|
|
103
|
+
apiVersion: "goondan.ai/v1",
|
|
104
|
+
kind: "Extension",
|
|
105
|
+
metadata: { name: "bad-ext" },
|
|
106
|
+
spec: { entry: "./bad-ext.ts" },
|
|
107
|
+
__file: "test.yaml",
|
|
108
|
+
__docIndex: 0,
|
|
109
|
+
__rootDir: bundleDir,
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
await expect(loadExtensions(resources, apiFactory, bundleDir, logger)).rejects.toThrow(ExtensionLoadError);
|
|
113
|
+
});
|
|
114
|
+
it("should throw ExtensionLoadError if register throws", async () => {
|
|
115
|
+
const extPath = path.join(bundleDir, "error-ext.ts");
|
|
116
|
+
await fs.writeFile(extPath, `
|
|
117
|
+
export function register(api) {
|
|
118
|
+
throw new Error('Extension init failed');
|
|
119
|
+
}
|
|
120
|
+
`, "utf8");
|
|
121
|
+
const resources = [
|
|
122
|
+
{
|
|
123
|
+
apiVersion: "goondan.ai/v1",
|
|
124
|
+
kind: "Extension",
|
|
125
|
+
metadata: { name: "error-ext" },
|
|
126
|
+
spec: { entry: "./error-ext.ts" },
|
|
127
|
+
__file: "test.yaml",
|
|
128
|
+
__docIndex: 0,
|
|
129
|
+
__rootDir: bundleDir,
|
|
130
|
+
},
|
|
131
|
+
];
|
|
132
|
+
await expect(loadExtensions(resources, apiFactory, bundleDir, logger)).rejects.toThrow(/Extension init failed/);
|
|
133
|
+
});
|
|
134
|
+
it("should support async register function", async () => {
|
|
135
|
+
const extPath = path.join(bundleDir, "async-ext.ts");
|
|
136
|
+
await fs.writeFile(extPath, `
|
|
137
|
+
export async function register(api) {
|
|
138
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
139
|
+
api.logger.info('async registered');
|
|
140
|
+
}
|
|
141
|
+
`, "utf8");
|
|
142
|
+
const resources = [
|
|
143
|
+
{
|
|
144
|
+
apiVersion: "goondan.ai/v1",
|
|
145
|
+
kind: "Extension",
|
|
146
|
+
metadata: { name: "async-ext" },
|
|
147
|
+
spec: { entry: "./async-ext.ts" },
|
|
148
|
+
__file: "test.yaml",
|
|
149
|
+
__docIndex: 0,
|
|
150
|
+
__rootDir: bundleDir,
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
await loadExtensions(resources, apiFactory, bundleDir, logger);
|
|
154
|
+
});
|
|
155
|
+
it("should include error details in ExtensionLoadError", async () => {
|
|
156
|
+
const resources = [
|
|
157
|
+
{
|
|
158
|
+
apiVersion: "goondan.ai/v1",
|
|
159
|
+
kind: "Extension",
|
|
160
|
+
metadata: { name: "missing-ext" },
|
|
161
|
+
spec: { entry: "./missing-ext.ts" },
|
|
162
|
+
__file: "test.yaml",
|
|
163
|
+
__docIndex: 0,
|
|
164
|
+
__rootDir: bundleDir,
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
try {
|
|
168
|
+
await loadExtensions(resources, apiFactory, bundleDir, logger);
|
|
169
|
+
expect(true).toBe(false);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
expect(error).toBeInstanceOf(ExtensionLoadError);
|
|
173
|
+
if (error instanceof ExtensionLoadError) {
|
|
174
|
+
expect(error.extensionName).toBe("missing-ext");
|
|
175
|
+
expect(error.code).toBe("E_EXT_INIT");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/extension/loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { JsonValue } from "../types.js";
|
|
2
|
+
import { FileWorkspaceStorage } from "../workspace/storage.js";
|
|
3
|
+
export interface ExtensionStateManager {
|
|
4
|
+
loadAll(): Promise<void>;
|
|
5
|
+
get(extensionName: string): Promise<JsonValue | null>;
|
|
6
|
+
set(extensionName: string, value: JsonValue): Promise<void>;
|
|
7
|
+
saveAll(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare class ExtensionStateManagerImpl implements ExtensionStateManager {
|
|
10
|
+
private readonly storage;
|
|
11
|
+
private readonly instanceKey;
|
|
12
|
+
private readonly extensionNames;
|
|
13
|
+
private states;
|
|
14
|
+
private dirty;
|
|
15
|
+
constructor(storage: FileWorkspaceStorage, instanceKey: string, extensionNames: string[]);
|
|
16
|
+
loadAll(): Promise<void>;
|
|
17
|
+
get(extensionName: string): Promise<JsonValue | null>;
|
|
18
|
+
set(extensionName: string, value: JsonValue): Promise<void>;
|
|
19
|
+
saveAll(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/extension/state-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACtD,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,qBAAa,yBAA0B,YAAW,qBAAqB;IAKnE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IANjC,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,KAAK,CAA0B;gBAGpB,OAAO,EAAE,oBAAoB,EAC7B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EAAE;IAGrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAUxB,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAKrD,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAe/B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export class ExtensionStateManagerImpl {
|
|
2
|
+
storage;
|
|
3
|
+
instanceKey;
|
|
4
|
+
extensionNames;
|
|
5
|
+
states = new Map();
|
|
6
|
+
dirty = new Set();
|
|
7
|
+
constructor(storage, instanceKey, extensionNames) {
|
|
8
|
+
this.storage = storage;
|
|
9
|
+
this.instanceKey = instanceKey;
|
|
10
|
+
this.extensionNames = extensionNames;
|
|
11
|
+
}
|
|
12
|
+
async loadAll() {
|
|
13
|
+
for (const name of this.extensionNames) {
|
|
14
|
+
const state = await this.storage.readExtensionState(this.instanceKey, name);
|
|
15
|
+
if (state !== undefined) {
|
|
16
|
+
this.states.set(name, state);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
this.dirty.clear();
|
|
20
|
+
}
|
|
21
|
+
async get(extensionName) {
|
|
22
|
+
const value = this.states.get(extensionName);
|
|
23
|
+
return value ?? null;
|
|
24
|
+
}
|
|
25
|
+
async set(extensionName, value) {
|
|
26
|
+
this.states.set(extensionName, value);
|
|
27
|
+
this.dirty.add(extensionName);
|
|
28
|
+
}
|
|
29
|
+
async saveAll() {
|
|
30
|
+
for (const name of this.dirty) {
|
|
31
|
+
const state = this.states.get(name);
|
|
32
|
+
if (state === undefined) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (typeof state !== "object" || state === null || Array.isArray(state)) {
|
|
36
|
+
throw new Error(`extension state must be JsonObject, got ${typeof state} for extension ${name}`);
|
|
37
|
+
}
|
|
38
|
+
await this.storage.writeExtensionState(this.instanceKey, name, state);
|
|
39
|
+
}
|
|
40
|
+
this.dirty.clear();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/extension/state-manager.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,yBAAyB;IAKjB;IACA;IACA;IANX,MAAM,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC3C,KAAK,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEvC,YACmB,OAA6B,EAC7B,WAAmB,EACnB,cAAwB;QAFxB,YAAO,GAAP,OAAO,CAAsB;QAC7B,gBAAW,GAAX,WAAW,CAAQ;QACnB,mBAAc,GAAd,cAAc,CAAU;IACxC,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC5E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,aAAqB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,aAAqB,EAAE,KAAgB;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxE,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,KAAK,kBAAkB,IAAI,EAAE,CAAC,CAAC;YACnG,CAAC;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.test.d.ts","sourceRoot":"","sources":["../../src/extension/state-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "bun:test";
|
|
2
|
+
import { ExtensionStateManagerImpl } from "./state-manager.js";
|
|
3
|
+
import { FileWorkspaceStorage } from "../workspace/storage.js";
|
|
4
|
+
import { WorkspacePaths } from "../workspace/paths.js";
|
|
5
|
+
import * as fs from "node:fs/promises";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
describe("ExtensionStateManager", () => {
|
|
9
|
+
let tempDir;
|
|
10
|
+
let storage;
|
|
11
|
+
let paths;
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "ext-state-test-"));
|
|
14
|
+
paths = new WorkspacePaths({
|
|
15
|
+
stateRoot: tempDir,
|
|
16
|
+
projectRoot: tempDir,
|
|
17
|
+
});
|
|
18
|
+
storage = new FileWorkspaceStorage(paths);
|
|
19
|
+
await storage.initializeSystemRoot();
|
|
20
|
+
});
|
|
21
|
+
it("should load all extension states from storage", async () => {
|
|
22
|
+
const instanceKey = "test-instance";
|
|
23
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
24
|
+
await storage.writeExtensionState(instanceKey, "ext1", { count: 1 });
|
|
25
|
+
await storage.writeExtensionState(instanceKey, "ext2", { value: "hello" });
|
|
26
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, ["ext1", "ext2"]);
|
|
27
|
+
await manager.loadAll();
|
|
28
|
+
const state1 = await manager.get("ext1");
|
|
29
|
+
const state2 = await manager.get("ext2");
|
|
30
|
+
expect(state1).toEqual({ count: 1 });
|
|
31
|
+
expect(state2).toEqual({ value: "hello" });
|
|
32
|
+
});
|
|
33
|
+
it("should return null for non-existent extension state", async () => {
|
|
34
|
+
const instanceKey = "test-instance";
|
|
35
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
36
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, []);
|
|
37
|
+
await manager.loadAll();
|
|
38
|
+
const state = await manager.get("missing");
|
|
39
|
+
expect(state).toBeNull();
|
|
40
|
+
});
|
|
41
|
+
it("should set and track dirty state", async () => {
|
|
42
|
+
const instanceKey = "test-instance";
|
|
43
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
44
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, ["ext1"]);
|
|
45
|
+
await manager.loadAll();
|
|
46
|
+
await manager.set("ext1", { updated: true });
|
|
47
|
+
const state = await manager.get("ext1");
|
|
48
|
+
expect(state).toEqual({ updated: true });
|
|
49
|
+
});
|
|
50
|
+
it("should save only dirty states", async () => {
|
|
51
|
+
const instanceKey = "test-instance";
|
|
52
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
53
|
+
await storage.writeExtensionState(instanceKey, "ext1", { original: 1 });
|
|
54
|
+
await storage.writeExtensionState(instanceKey, "ext2", { original: 2 });
|
|
55
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, ["ext1", "ext2"]);
|
|
56
|
+
await manager.loadAll();
|
|
57
|
+
await manager.set("ext1", { modified: true });
|
|
58
|
+
await manager.saveAll();
|
|
59
|
+
const saved1 = await storage.readExtensionState(instanceKey, "ext1");
|
|
60
|
+
const saved2 = await storage.readExtensionState(instanceKey, "ext2");
|
|
61
|
+
expect(saved1).toEqual({ modified: true });
|
|
62
|
+
expect(saved2).toEqual({ original: 2 });
|
|
63
|
+
});
|
|
64
|
+
it("should clear dirty set after save", async () => {
|
|
65
|
+
const instanceKey = "test-instance";
|
|
66
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
67
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, ["ext1"]);
|
|
68
|
+
await manager.loadAll();
|
|
69
|
+
await manager.set("ext1", { count: 1 });
|
|
70
|
+
await manager.saveAll();
|
|
71
|
+
await manager.set("ext1", { count: 2 });
|
|
72
|
+
await manager.saveAll();
|
|
73
|
+
const saved = await storage.readExtensionState(instanceKey, "ext1");
|
|
74
|
+
expect(saved).toEqual({ count: 2 });
|
|
75
|
+
});
|
|
76
|
+
it("should throw error if state is not JsonObject", async () => {
|
|
77
|
+
const instanceKey = "test-instance";
|
|
78
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
79
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, ["ext1"]);
|
|
80
|
+
await manager.loadAll();
|
|
81
|
+
await manager.set("ext1", "invalid-string");
|
|
82
|
+
await expect(manager.saveAll()).rejects.toThrow(/must be JsonObject/);
|
|
83
|
+
});
|
|
84
|
+
it("should handle multiple extensions independently", async () => {
|
|
85
|
+
const instanceKey = "test-instance";
|
|
86
|
+
await storage.initializeInstanceState(instanceKey, "test-agent");
|
|
87
|
+
const manager = new ExtensionStateManagerImpl(storage, instanceKey, ["ext1", "ext2", "ext3"]);
|
|
88
|
+
await manager.loadAll();
|
|
89
|
+
await manager.set("ext1", { a: 1 });
|
|
90
|
+
await manager.set("ext2", { b: 2 });
|
|
91
|
+
await manager.set("ext3", { c: 3 });
|
|
92
|
+
const state1 = await manager.get("ext1");
|
|
93
|
+
const state2 = await manager.get("ext2");
|
|
94
|
+
const state3 = await manager.get("ext3");
|
|
95
|
+
expect(state1).toEqual({ a: 1 });
|
|
96
|
+
expect(state2).toEqual({ b: 2 });
|
|
97
|
+
expect(state3).toEqual({ c: 3 });
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=state-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.test.js","sourceRoot":"","sources":["../../src/extension/state-manager.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export { PipelineRegistryImpl, type MiddlewareOptions } from "./pipeline/registry.js";
|
|
3
|
+
export * from "./conversation/state.js";
|
|
4
|
+
export * from "./tools/naming.js";
|
|
5
|
+
export { ToolRegistryImpl, type ToolRegistry } from "./tools/registry.js";
|
|
6
|
+
export * from "./tools/executor.js";
|
|
7
|
+
export * from "./config/object-ref.js";
|
|
8
|
+
export * from "./config/simple-yaml.js";
|
|
9
|
+
export * from "./config/resources.js";
|
|
10
|
+
export * from "./config/bundle-loader.js";
|
|
11
|
+
export * from "./workspace/paths.js";
|
|
12
|
+
export * from "./workspace/storage.js";
|
|
13
|
+
export * from "./workspace/instance-manager.js";
|
|
14
|
+
export * from "./orchestrator/types.js";
|
|
15
|
+
export * from "./orchestrator/orchestrator.js";
|
|
16
|
+
export * from "./orchestrator/event-queue.js";
|
|
17
|
+
export * from "./events/runtime-events.js";
|
|
18
|
+
export * from "./extension/index.js";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,cAAc,yBAAyB,CAAC;AAExC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,cAAc,qBAAqB,CAAC;AAEpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAEhD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export { PipelineRegistryImpl } from "./pipeline/registry.js";
|
|
3
|
+
export * from "./conversation/state.js";
|
|
4
|
+
export * from "./tools/naming.js";
|
|
5
|
+
export { ToolRegistryImpl } from "./tools/registry.js";
|
|
6
|
+
export * from "./tools/executor.js";
|
|
7
|
+
export * from "./config/object-ref.js";
|
|
8
|
+
export * from "./config/simple-yaml.js";
|
|
9
|
+
export * from "./config/resources.js";
|
|
10
|
+
export * from "./config/bundle-loader.js";
|
|
11
|
+
export * from "./workspace/paths.js";
|
|
12
|
+
export * from "./workspace/storage.js";
|
|
13
|
+
export * from "./workspace/instance-manager.js";
|
|
14
|
+
export * from "./orchestrator/types.js";
|
|
15
|
+
export * from "./orchestrator/orchestrator.js";
|
|
16
|
+
export * from "./orchestrator/event-queue.js";
|
|
17
|
+
export * from "./events/runtime-events.js";
|
|
18
|
+
export * from "./extension/index.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAA0B,MAAM,wBAAwB,CAAC;AAEtF,cAAc,yBAAyB,CAAC;AAExC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAqB,MAAM,qBAAqB,CAAC;AAC1E,cAAc,qBAAqB,CAAC;AAEpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAEhD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgentEvent } from "../types.js";
|
|
2
|
+
export interface AgentEventQueue {
|
|
3
|
+
enqueue(event: AgentEvent): void;
|
|
4
|
+
dequeue(): AgentEvent | null;
|
|
5
|
+
readonly length: number;
|
|
6
|
+
peek(): readonly AgentEvent[];
|
|
7
|
+
}
|
|
8
|
+
export declare class AgentEventQueueImpl implements AgentEventQueue {
|
|
9
|
+
private readonly queue;
|
|
10
|
+
enqueue(event: AgentEvent): void;
|
|
11
|
+
dequeue(): AgentEvent | null;
|
|
12
|
+
get length(): number;
|
|
13
|
+
peek(): readonly AgentEvent[];
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=event-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/orchestrator/event-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,UAAU,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,IAAI,IAAI,SAAS,UAAU,EAAE,CAAC;CAC/B;AAED,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIhC,OAAO,IAAI,UAAU,GAAG,IAAI;IAS5B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,IAAI,SAAS,UAAU,EAAE;CAG9B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class AgentEventQueueImpl {
|
|
2
|
+
queue = [];
|
|
3
|
+
enqueue(event) {
|
|
4
|
+
this.queue.push(event);
|
|
5
|
+
}
|
|
6
|
+
dequeue() {
|
|
7
|
+
const event = this.queue.shift();
|
|
8
|
+
if (event === undefined) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return event;
|
|
12
|
+
}
|
|
13
|
+
get length() {
|
|
14
|
+
return this.queue.length;
|
|
15
|
+
}
|
|
16
|
+
peek() {
|
|
17
|
+
return [...this.queue];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=event-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/orchestrator/event-queue.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,mBAAmB;IACb,KAAK,GAAiB,EAAE,CAAC;IAE1C,OAAO,CAAC,KAAiB;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IpcMessage } from "../types.js";
|
|
2
|
+
import type { AgentProcessHandle, Orchestrator, OrchestratorOptions, ReconciliationResult } from "./types.js";
|
|
3
|
+
export declare class OrchestratorImpl implements Orchestrator {
|
|
4
|
+
private readonly options;
|
|
5
|
+
readonly swarmName: string;
|
|
6
|
+
readonly bundleDir: string;
|
|
7
|
+
readonly agents: Map<string, AgentProcessHandle>;
|
|
8
|
+
private readonly desiredAgents;
|
|
9
|
+
private readonly desiredConnectors;
|
|
10
|
+
private readonly agentState;
|
|
11
|
+
private readonly connectorState;
|
|
12
|
+
private readonly reconcileIntervalMs;
|
|
13
|
+
private readonly crashThreshold;
|
|
14
|
+
private readonly initialBackoffMs;
|
|
15
|
+
private readonly maxBackoffMs;
|
|
16
|
+
private readonly defaultGracePeriodMs;
|
|
17
|
+
private readonly now;
|
|
18
|
+
private readonly setTimeoutFn;
|
|
19
|
+
private readonly clearTimeoutFn;
|
|
20
|
+
private readonly setIntervalFn;
|
|
21
|
+
private readonly clearIntervalFn;
|
|
22
|
+
private reconcileTimer;
|
|
23
|
+
constructor(options: OrchestratorOptions);
|
|
24
|
+
spawn(agentName: string, instanceKey: string): AgentProcessHandle;
|
|
25
|
+
restart(agentName: string): Promise<void>;
|
|
26
|
+
reloadAndRestartAll(): Promise<void>;
|
|
27
|
+
reconcile(): Promise<ReconciliationResult>;
|
|
28
|
+
shutdown(): Promise<void>;
|
|
29
|
+
route(message: IpcMessage): void;
|
|
30
|
+
private createHandle;
|
|
31
|
+
private spawnIntoState;
|
|
32
|
+
private spawnConnector;
|
|
33
|
+
private calculateBackoffMs;
|
|
34
|
+
private gracefulShutdown;
|
|
35
|
+
private handleShutdownAck;
|
|
36
|
+
private findStateForShutdownAck;
|
|
37
|
+
private hasStateForAgent;
|
|
38
|
+
private resetCrashTracking;
|
|
39
|
+
private logCrashLoopBackOff;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA4C,MAAM,aAAa,CAAC;AAExF,OAAO,KAAK,EACV,kBAAkB,EAElB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAqBpB,qBAAa,gBAAiB,YAAW,YAAY;IAsBvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IArBpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,kCAAyC;IAExD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqB;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAC3E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6D;IAC1F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6D;IAC3F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IAEnE,OAAO,CAAC,cAAc,CAA+B;gBAExB,OAAO,EAAE,mBAAmB;IA6BzD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAiC3D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAkF1C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB/B,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IA0BhC,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,cAAc;IAwCtB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,kBAAkB;YAMZ,gBAAgB;IA4E9B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,mBAAmB;CAa5B"}
|