@rwoll/canvas-kit 0.0.0-placeholder → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +481 -1
- package/cli/canvas-kit.mjs +148 -0
- package/cli/lib.mjs +697 -0
- package/cli/release.json +4 -0
- package/dist/client.d.ts +72 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +156 -0
- package/dist/client.js.map +1 -0
- package/dist/define.d.ts +249 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +197 -0
- package/dist/define.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/extension.d.ts +25 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +70 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +56 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +33 -0
- package/dist/jobs.js.map +1 -0
- package/dist/playwright.d.ts +79 -0
- package/dist/playwright.d.ts.map +1 -0
- package/dist/playwright.js +124 -0
- package/dist/playwright.js.map +1 -0
- package/dist/react.d.ts +55 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +72 -0
- package/dist/react.js.map +1 -0
- package/dist/server/headless.d.ts +20 -0
- package/dist/server/headless.d.ts.map +1 -0
- package/dist/server/headless.js +35 -0
- package/dist/server/headless.js.map +1 -0
- package/dist/server/host.d.ts +146 -0
- package/dist/server/host.d.ts.map +1 -0
- package/dist/server/host.js +1078 -0
- package/dist/server/host.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/release.d.ts +30 -0
- package/dist/server/release.d.ts.map +1 -0
- package/dist/server/release.js +71 -0
- package/dist/server/release.js.map +1 -0
- package/dist/server/storage.d.ts +63 -0
- package/dist/server/storage.d.ts.map +1 -0
- package/dist/server/storage.js +253 -0
- package/dist/server/storage.js.map +1 -0
- package/dist/testing.d.ts +49 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +42 -0
- package/dist/testing.js.map +1 -0
- package/dist/vite.d.ts +15 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +213 -0
- package/dist/vite.js.map +1 -0
- package/package.json +111 -5
- package/styles.css +122 -0
- package/templates/canvas/README.md +19 -0
- package/templates/canvas/e2e/canvas.spec.ts +15 -0
- package/templates/canvas/index.html +13 -0
- package/templates/canvas/package.json +29 -0
- package/templates/canvas/playwright.config.ts +5 -0
- package/templates/canvas/server/canvas.test.ts +22 -0
- package/templates/canvas/server/canvas.ts +27 -0
- package/templates/canvas/src/App.css +21 -0
- package/templates/canvas/src/App.tsx +31 -0
- package/templates/canvas/src/index.css +3 -0
- package/templates/canvas/src/main.tsx +11 -0
- package/templates/canvas/tsconfig.app.json +1 -0
- package/templates/canvas/tsconfig.json +7 -0
- package/templates/canvas/tsconfig.node.json +1 -0
- package/templates/canvas/vite.config.ts +7 -0
- package/templates/ui/README.md +18 -0
- package/templates/ui/package.json +22 -0
- package/templates/ui/src/Checklist.tsx +42 -0
- package/templates/ui/src/Header.tsx +17 -0
- package/templates/ui/src/Markdown.tsx +140 -0
- package/templates/ui/src/TextButton.tsx +6 -0
- package/templates/ui/src/index.ts +4 -0
- package/templates/ui/theme.css +143 -0
- package/templates/ui/tsconfig.json +18 -0
- package/tsconfig/canvas.json +27 -0
- package/tsconfig/node.json +24 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { defineConfig, devices, test as base } from '@playwright/test';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { basename, join, resolve } from 'node:path';
|
|
4
|
+
import { StateStore, canvasDataDir } from "./server/storage.js";
|
|
5
|
+
import { createTestCanvas } from "./testing.js";
|
|
6
|
+
const DEFAULT_INSTANCE = 'test';
|
|
7
|
+
/**
|
|
8
|
+
* Playwright fixtures for a canvas. Use the returned `test` like Playwright's own:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* export const test = canvasTest(canvas)
|
|
12
|
+
* test('adds a blocker', async ({ openCanvas, agent }) => { ... })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export function canvasTest(canvas, options = {}) {
|
|
16
|
+
const uiDir = resolve(options.uiDir ?? join('dist', 'plugin', 'extensions', basename(process.cwd()), 'ui'));
|
|
17
|
+
const assertBuilt = () => {
|
|
18
|
+
if (!existsSync(join(uiDir, 'index.html'))) {
|
|
19
|
+
throw new Error(`No built canvas UI in ${uiDir}. Build the canvas first (for example \`pnpm build\`), or pass uiDir to canvasTest().`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const release = options.release ?? localRelease();
|
|
23
|
+
return base.extend({
|
|
24
|
+
_canvasState: async ({}, use) => {
|
|
25
|
+
await use({ messages: [], failures: [], lastInstance: DEFAULT_INSTANCE });
|
|
26
|
+
},
|
|
27
|
+
canvasHarness: async ({ _canvasState }, use) => {
|
|
28
|
+
assertBuilt();
|
|
29
|
+
const harness = await createTestCanvas(canvas, {
|
|
30
|
+
uiDir,
|
|
31
|
+
release,
|
|
32
|
+
now: options.now,
|
|
33
|
+
sendToAgent: async (message) => {
|
|
34
|
+
const failure = _canvasState.failures.shift();
|
|
35
|
+
if (failure)
|
|
36
|
+
throw failure;
|
|
37
|
+
_canvasState.messages.push(message);
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
try {
|
|
41
|
+
await use(harness);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await harness.close();
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
openCanvas: async ({ canvasHarness, page, _canvasState }, use) => {
|
|
48
|
+
await use(async (input, { instanceId = DEFAULT_INSTANCE } = {}) => {
|
|
49
|
+
const { url } = await canvasHarness.open(instanceId, input);
|
|
50
|
+
_canvasState.lastInstance = instanceId;
|
|
51
|
+
await gotoLive(page, url);
|
|
52
|
+
return {
|
|
53
|
+
page,
|
|
54
|
+
url,
|
|
55
|
+
instanceId,
|
|
56
|
+
state: () => canvasHarness.state(instanceId),
|
|
57
|
+
openAnotherPage: async () => {
|
|
58
|
+
const another = await page.context().newPage();
|
|
59
|
+
await gotoLive(another, url);
|
|
60
|
+
return another;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
agent: async ({ canvasHarness, _canvasState }, use) => {
|
|
66
|
+
await use({
|
|
67
|
+
invoke: (action, input, { instanceId } = {}) => canvasHarness.invoke(instanceId ?? _canvasState.lastInstance, action, input, 'agent'),
|
|
68
|
+
messages: _canvasState.messages,
|
|
69
|
+
failNextSend: (error = new Error('The agent could not be reached')) => {
|
|
70
|
+
_canvasState.failures.push(error);
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
seed: async ({ canvasHarness }, use) => {
|
|
75
|
+
await use(async (key, state) => {
|
|
76
|
+
if (!canvas.persist)
|
|
77
|
+
throw new Error(`${canvas.id} does not set persist, so there is nothing to seed`);
|
|
78
|
+
const store = new StateStore(canvasDataDir(canvas.id, canvasHarness.dataRoot), canvas.state, canvas.persist.version);
|
|
79
|
+
await store.save(key, canvas.state.parse(state));
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
runJob: async ({ canvasHarness, _canvasState }, use) => {
|
|
83
|
+
await use((job, runOptions = {}) => canvasHarness.runJob(job, runOptions.key === undefined && runOptions.instanceId === undefined ? { ...runOptions, instanceId: _canvasState.lastInstance } : runOptions));
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** The footer of an unpublished build of the canvas package in the current folder. */
|
|
88
|
+
function localRelease() {
|
|
89
|
+
const name = basename(process.cwd());
|
|
90
|
+
try {
|
|
91
|
+
const { version } = JSON.parse(readFileSync('package.json', 'utf8'));
|
|
92
|
+
return { name, version: version ?? '0.0.0', channel: 'local' };
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { name, version: '0.0.0', channel: 'local' };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Playwright config for canvas tests: specs in `e2e/`, run in light, dark, and
|
|
100
|
+
* high-contrast Chromium. Pass overrides as you would to `defineConfig`.
|
|
101
|
+
*/
|
|
102
|
+
export function defineCanvasConfig(config = {}) {
|
|
103
|
+
const chrome = devices['Desktop Chrome'];
|
|
104
|
+
return defineConfig({
|
|
105
|
+
testDir: 'e2e',
|
|
106
|
+
fullyParallel: true,
|
|
107
|
+
forbidOnly: Boolean(process.env.CI),
|
|
108
|
+
retries: process.env.CI ? 1 : 0,
|
|
109
|
+
reporter: process.env.CI ? [['github'], ['list']] : 'list',
|
|
110
|
+
use: { trace: 'retain-on-failure' },
|
|
111
|
+
projects: [
|
|
112
|
+
{ name: 'light', use: { ...chrome, colorScheme: 'light' } },
|
|
113
|
+
{ name: 'dark', use: { ...chrome, colorScheme: 'dark' } },
|
|
114
|
+
{ name: 'high-contrast', use: { ...chrome, colorScheme: 'dark', contextOptions: { forcedColors: 'active' } } },
|
|
115
|
+
],
|
|
116
|
+
...config,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async function gotoLive(page, url) {
|
|
120
|
+
await page.goto(url);
|
|
121
|
+
await page.locator('html[data-canvas-status="live"]').waitFor({ state: 'attached' });
|
|
122
|
+
}
|
|
123
|
+
export { expect } from '@playwright/test';
|
|
124
|
+
//# sourceMappingURL=playwright.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { CanvasActionError, type AddJobOptions, type CanvasSnapshot, type InputArgs, type RunAction } from './client.ts';
|
|
2
|
+
import type { ActionResult, AnyCanvas, JobInput, JobStatusOf, JobWithInputName, StateOf, UiActionName } from './define.ts';
|
|
3
|
+
import type { Interval, JobDefinitionInfo } from './jobs.ts';
|
|
4
|
+
export { CanvasActionError, CanvasClient, formatInterval, getCanvasClient, intervalMs } from './client.ts';
|
|
5
|
+
export type { AddJobOptions, CanvasSnapshot, ConnectionStatus, Interval, JobDefinitionInfo, JobStatus, RunAction } from './client.ts';
|
|
6
|
+
export interface UseCanvas<C extends AnyCanvas> extends CanvasSnapshot<StateOf<C>> {
|
|
7
|
+
run: RunAction<C>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Live canvas state and a typed action caller. Pass the canvas type with
|
|
11
|
+
* `import type canvas from '../server/canvas.ts'` and `useCanvas<typeof canvas>()`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useCanvas<C extends AnyCanvas>(): UseCanvas<C>;
|
|
14
|
+
export interface ActionState {
|
|
15
|
+
pending: boolean;
|
|
16
|
+
error: CanvasActionError | undefined;
|
|
17
|
+
}
|
|
18
|
+
/** A single action with its pending and error state, for buttons and forms. */
|
|
19
|
+
export declare function useAction<C extends AnyCanvas, K extends UiActionName<C>>(name: K): [(...args: InputArgs<C, K>) => Promise<ActionResult<C, K> | undefined>, ActionState];
|
|
20
|
+
export interface UseJobs<C extends AnyCanvas> {
|
|
21
|
+
/** The document's jobs, live: one per declared job, then the jobs added from jobs with input. */
|
|
22
|
+
jobs: readonly JobStatusOf<C>[];
|
|
23
|
+
/** The jobs the canvas declares, for forms that add jobs. */
|
|
24
|
+
definitions: readonly JobDefinitionInfo[];
|
|
25
|
+
/** Pause or resume a job, or change its interval. Resolves to its new status, or undefined when it failed. */
|
|
26
|
+
update(id: string, patch: {
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
every?: Interval;
|
|
29
|
+
}): Promise<JobStatusOf<C> | undefined>;
|
|
30
|
+
/** Run a job now, even if paused. */
|
|
31
|
+
run(id: string): Promise<JobStatusOf<C> | undefined>;
|
|
32
|
+
/** Add a job from a job with input. Resolves to its status, with its new ID. */
|
|
33
|
+
add<K extends JobWithInputName<C>>(job: K, input: JobInput<C, K>, options?: AddJobOptions): Promise<JobStatusOf<C> | undefined>;
|
|
34
|
+
/** Remove a job added from a job with input. Resolves to whether it was removed. */
|
|
35
|
+
remove(id: string): Promise<boolean>;
|
|
36
|
+
/** IDs of jobs with a call in flight, and the names of jobs being added from. */
|
|
37
|
+
pending: ReadonlySet<string>;
|
|
38
|
+
/** The last call's failure, cleared by the next call. */
|
|
39
|
+
error: CanvasActionError | undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The document's scheduled jobs, live, with calls to control the ones whose
|
|
43
|
+
* `controls` include the UI.
|
|
44
|
+
*/
|
|
45
|
+
export declare function useJobs<C extends AnyCanvas>(): UseJobs<C>;
|
|
46
|
+
/**
|
|
47
|
+
* Hooks bound to one canvas type, so action names and inputs are inferred:
|
|
48
|
+
* `const { useCanvas, useAction, useJobs } = createCanvasHooks<typeof canvas>();`
|
|
49
|
+
*/
|
|
50
|
+
export declare function createCanvasHooks<C extends AnyCanvas>(): {
|
|
51
|
+
useCanvas: () => UseCanvas<C>;
|
|
52
|
+
useAction: <K extends UiActionName<C>>(name: K) => [(...args: InputArgs<C, K>) => Promise<ActionResult<C, K> | undefined>, ActionState];
|
|
53
|
+
useJobs: () => UseJobs<C>;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useCallback, useMemo, useState, useSyncExternalStore } from 'react';
|
|
2
|
+
import { CanvasActionError, getCanvasClient } from "./client.js";
|
|
3
|
+
export { CanvasActionError, CanvasClient, formatInterval, getCanvasClient, intervalMs } from "./client.js";
|
|
4
|
+
/**
|
|
5
|
+
* Live canvas state and a typed action caller. Pass the canvas type with
|
|
6
|
+
* `import type canvas from '../server/canvas.ts'` and `useCanvas<typeof canvas>()`.
|
|
7
|
+
*/
|
|
8
|
+
export function useCanvas() {
|
|
9
|
+
const client = getCanvasClient();
|
|
10
|
+
const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot);
|
|
11
|
+
return { ...snapshot, run: client.run };
|
|
12
|
+
}
|
|
13
|
+
/** A single action with its pending and error state, for buttons and forms. */
|
|
14
|
+
export function useAction(name) {
|
|
15
|
+
const client = getCanvasClient();
|
|
16
|
+
const [state, setState] = useState({ pending: false, error: undefined });
|
|
17
|
+
const call = useCallback(async (...args) => {
|
|
18
|
+
setState({ pending: true, error: undefined });
|
|
19
|
+
try {
|
|
20
|
+
const result = await client.run(name, ...args);
|
|
21
|
+
setState({ pending: false, error: undefined });
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const failure = error instanceof CanvasActionError ? error : new CanvasActionError('request_failed', String(error));
|
|
26
|
+
setState({ pending: false, error: failure });
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}, [client, name]);
|
|
30
|
+
return [call, state];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The document's scheduled jobs, live, with calls to control the ones whose
|
|
34
|
+
* `controls` include the UI.
|
|
35
|
+
*/
|
|
36
|
+
export function useJobs() {
|
|
37
|
+
const client = getCanvasClient();
|
|
38
|
+
const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot);
|
|
39
|
+
const [pending, setPending] = useState(new Set());
|
|
40
|
+
const [error, setError] = useState();
|
|
41
|
+
const track = useCallback((key, call) => {
|
|
42
|
+
setError(undefined);
|
|
43
|
+
setPending(current => new Set(current).add(key));
|
|
44
|
+
return call().then(result => result, (failure) => {
|
|
45
|
+
setError(failure instanceof CanvasActionError ? failure : new CanvasActionError('request_failed', String(failure)));
|
|
46
|
+
return undefined;
|
|
47
|
+
}).finally(() => setPending(current => {
|
|
48
|
+
const next = new Set(current);
|
|
49
|
+
next.delete(key);
|
|
50
|
+
return next;
|
|
51
|
+
}));
|
|
52
|
+
}, []);
|
|
53
|
+
const calls = useMemo(() => ({
|
|
54
|
+
update: (id, patch) => track(id, () => client.updateJob(id, patch)),
|
|
55
|
+
run: (id) => track(id, () => client.runJob(id)),
|
|
56
|
+
add: (job, input, options) => track(job, () => client.addJob(job, input, options)),
|
|
57
|
+
remove: async (id) => (await track(id, () => client.removeJob(id).then(() => true))) ?? false,
|
|
58
|
+
}), [client, track]);
|
|
59
|
+
return { jobs: snapshot.jobs, definitions: client.jobDefinitions, ...calls, pending, error };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Hooks bound to one canvas type, so action names and inputs are inferred:
|
|
63
|
+
* `const { useCanvas, useAction, useJobs } = createCanvasHooks<typeof canvas>();`
|
|
64
|
+
*/
|
|
65
|
+
export function createCanvasHooks() {
|
|
66
|
+
return {
|
|
67
|
+
useCanvas: () => useCanvas(),
|
|
68
|
+
useAction: (name) => useAction(name),
|
|
69
|
+
useJobs: () => useJobs(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAA2E,MAAM,aAAa,CAAC;AAI1I,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO3G;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,eAAe,EAAK,CAAC;IACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AAC1C,CAAC;AAOD,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CACvB,IAAO;IAEP,MAAM,MAAM,GAAG,eAAe,EAAK,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,WAAW,CACtB,KAAK,EAAE,GAAG,IAAqB,EAAE,EAAE;QACjC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/C,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpH,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,IAAI,CAAC,CACf,CAAC;IACF,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvB,CAAC;AAqBD;;;GAGG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,MAAM,GAAG,eAAe,EAAK,CAAC;IACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAsB,IAAI,GAAG,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAiC,CAAC;IACpE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAI,GAAW,EAAE,IAAsB,EAA0B,EAAE;QAC3F,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,EAAE,CAAC,IAAI,CAChB,MAAM,CAAC,EAAE,CAAC,MAAM,EAChB,CAAC,OAAgB,EAAE,EAAE;YACnB,QAAQ,CAAC,OAAO,YAAY,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpH,OAAO,SAAS,CAAC;QACnB,CAAC,CACF,CAAC,OAAO,CAAC,GAAG,EAAE,CACb,UAAU,CAAC,OAAO,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,MAAM,EAAE,CAAC,EAAU,EAAE,KAA8C,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpH,GAAG,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvD,GAAG,EAAE,CAAgC,GAAM,EAAE,KAAqB,EAAE,OAAuB,EAAE,EAAE,CAC7F,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK;KACtG,CAAC,EACF,CAAC,MAAM,EAAE,KAAK,CAAC,CAChB,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAiC,EAAE,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5H,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,SAAS,EAAE,GAAiB,EAAE,CAAC,SAAS,EAAK;QAC7C,SAAS,EAAE,CAA4B,IAAO,EAAE,EAAE,CAAC,SAAS,CAAO,IAAI,CAAC;QACxE,OAAO,EAAE,GAAe,EAAE,CAAC,OAAO,EAAK;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type AnyCanvas, type LogLevel } from '../define.ts';
|
|
2
|
+
import { type JobOutcome } from './host.ts';
|
|
3
|
+
export interface RunCanvasJobOptions {
|
|
4
|
+
/** Run jobs for this saved document only. Defaults to every saved document. */
|
|
5
|
+
key?: string;
|
|
6
|
+
/** Run even if not due or paused. */
|
|
7
|
+
force?: boolean;
|
|
8
|
+
/** Parent of the per-canvas data folders. Defaults to `<copilot-home>/extension-data`. */
|
|
9
|
+
dataRoot?: string;
|
|
10
|
+
log?: (message: string, level: LogLevel) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Run scheduled jobs for saved documents with no chat or agent, as `canvas-kit run`
|
|
14
|
+
* does. `job` selects every job (undefined), the jobs with one name (including those
|
|
15
|
+
* added from a job with input), or the job with one ID. Each runs only when due and
|
|
16
|
+
* not paused (unless `force`), under the same lock chats use, so it is safe while
|
|
17
|
+
* chats have the canvas open.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runCanvasJob(canvas: AnyCanvas, job?: string, options?: RunCanvasJobOptions): Promise<JobOutcome[]>;
|
|
20
|
+
//# sourceMappingURL=headless.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless.d.ts","sourceRoot":"","sources":["../../src/server/headless.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAoB5H"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jobForId } from "../define.js";
|
|
2
|
+
import { CanvasKitError, errorMessage } from "../errors.js";
|
|
3
|
+
import { CanvasHost } from "./host.js";
|
|
4
|
+
/**
|
|
5
|
+
* Run scheduled jobs for saved documents with no chat or agent, as `canvas-kit run`
|
|
6
|
+
* does. `job` selects every job (undefined), the jobs with one name (including those
|
|
7
|
+
* added from a job with input), or the job with one ID. Each runs only when due and
|
|
8
|
+
* not paused (unless `force`), under the same lock chats use, so it is safe while
|
|
9
|
+
* chats have the canvas open.
|
|
10
|
+
*/
|
|
11
|
+
export async function runCanvasJob(canvas, job, options = {}) {
|
|
12
|
+
if (job !== undefined)
|
|
13
|
+
jobForId(canvas, job);
|
|
14
|
+
if (!canvas.persist) {
|
|
15
|
+
throw new CanvasKitError('invalid_input', `${canvas.title} does not save documents, so its jobs run only while a chat has it open.`);
|
|
16
|
+
}
|
|
17
|
+
const host = new CanvasHost(canvas, { dataRoot: options.dataRoot, jobs: 'manual', watch: false, log: options.log });
|
|
18
|
+
try {
|
|
19
|
+
const keys = options.key !== undefined ? [options.key] : await host.savedKeys();
|
|
20
|
+
const outcomes = [];
|
|
21
|
+
for (const key of keys) {
|
|
22
|
+
try {
|
|
23
|
+
outcomes.push(...(await host.runJobs(job, { key, force: options.force ?? false, headless: true })));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
outcomes.push({ id: job ?? '*', job: job ?? '*', key, ran: false, error: errorMessage(error) });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return outcomes;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await host.close();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=headless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless.js","sourceRoot":"","sources":["../../src/server/headless.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAiC,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AAYxD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAiB,EAAE,GAAY,EAAE,UAA+B,EAAE;IACnG,IAAI,GAAG,KAAK,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,GAAG,MAAM,CAAC,KAAK,0EAA0E,CAAC,CAAC;IACvI,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAChF,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { type IncomingMessage, type ServerResponse } from 'node:http';
|
|
2
|
+
import { type ActionSource, type AgentMessage, type AnyCanvas, type LogLevel } from '../define.ts';
|
|
3
|
+
import { type JobDefinitionInfo, type JobStatus } from '../jobs.ts';
|
|
4
|
+
import { type ReleaseInfo } from './release.ts';
|
|
5
|
+
import { type StateStoreOptions } from './storage.ts';
|
|
6
|
+
export interface CanvasHostOptions {
|
|
7
|
+
/** Folder with the built UI (`index.html` and assets). Omit to serve a bare page, as in tests. */
|
|
8
|
+
uiDir?: string;
|
|
9
|
+
/** Parent of the per-canvas data folders. Defaults to `<copilot-home>/extension-data`. */
|
|
10
|
+
dataRoot?: string;
|
|
11
|
+
/** Build shown in the page footer and sent to the UI. */
|
|
12
|
+
release?: ReleaseInfo;
|
|
13
|
+
/** Delivers `ctx.sendToAgent()` messages. Without it, sending fails with `agent_unavailable`. */
|
|
14
|
+
sendToAgent?: (message: AgentMessage) => Promise<void>;
|
|
15
|
+
log?: (message: string, level: LogLevel) => void;
|
|
16
|
+
/** The clock for `ctx.now()` and job schedules. Defaults to `Date.now`. */
|
|
17
|
+
now?: () => number;
|
|
18
|
+
/**
|
|
19
|
+
* `auto` (default) runs due jobs on a timer while documents are open; `manual`
|
|
20
|
+
* runs them only through `runJob()` and `tickJobs()`, as tests do.
|
|
21
|
+
*/
|
|
22
|
+
jobs?: 'auto' | 'manual';
|
|
23
|
+
/** Watch saved documents so changes from other chats reach open pages. Defaults to true. */
|
|
24
|
+
watch?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* How often to check open documents for changes that file watching missed, in
|
|
27
|
+
* milliseconds. Defaults to 2000.
|
|
28
|
+
*/
|
|
29
|
+
watchPollMs?: number;
|
|
30
|
+
/** Cross-process lock timings for saved documents. */
|
|
31
|
+
store?: StateStoreOptions;
|
|
32
|
+
}
|
|
33
|
+
/** What running a job did for one document. */
|
|
34
|
+
export interface JobOutcome {
|
|
35
|
+
/** The job's ID: its name, or the ID of a job added from a job with input. */
|
|
36
|
+
id: string;
|
|
37
|
+
job: string;
|
|
38
|
+
key: string | undefined;
|
|
39
|
+
/** False when the job was not due yet, or paused. */
|
|
40
|
+
ran: boolean;
|
|
41
|
+
/** True when it did not run because it is paused. */
|
|
42
|
+
paused?: boolean;
|
|
43
|
+
/** The error message when the job failed. Its state changes were rolled back. */
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface RunJobOptions {
|
|
47
|
+
/** Run it for this open instance's document. */
|
|
48
|
+
instanceId?: string;
|
|
49
|
+
/** Run it for the saved document with this persist key, open or not. */
|
|
50
|
+
key?: string;
|
|
51
|
+
/** Run even if it is not due. Defaults to true. */
|
|
52
|
+
force?: boolean;
|
|
53
|
+
/** Mark the run as headless (`ctx.headless`), as `canvas-kit run` does. */
|
|
54
|
+
headless?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface OpenRequest {
|
|
57
|
+
instanceId: string;
|
|
58
|
+
input?: unknown;
|
|
59
|
+
}
|
|
60
|
+
export interface OpenResult {
|
|
61
|
+
url: string;
|
|
62
|
+
title: string;
|
|
63
|
+
status?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface InvokeRequest {
|
|
66
|
+
instanceId: string;
|
|
67
|
+
actionName: string;
|
|
68
|
+
input?: unknown;
|
|
69
|
+
source: ActionSource;
|
|
70
|
+
}
|
|
71
|
+
export interface StateSnapshot {
|
|
72
|
+
revision: number;
|
|
73
|
+
state: unknown;
|
|
74
|
+
/** The document's jobs, for a canvas with jobs. */
|
|
75
|
+
jobs?: JobStatus[];
|
|
76
|
+
}
|
|
77
|
+
/** Data the server embeds in the page for the client library. */
|
|
78
|
+
export interface CanvasBootstrap extends StateSnapshot {
|
|
79
|
+
base: string;
|
|
80
|
+
token: string;
|
|
81
|
+
release?: ReleaseInfo;
|
|
82
|
+
/** The jobs the canvas declares, for a canvas with jobs. */
|
|
83
|
+
jobDefinitions?: JobDefinitionInfo[];
|
|
84
|
+
}
|
|
85
|
+
/** The page's Content-Security-Policy: strict defaults plus the canvas's own `csp` sources. */
|
|
86
|
+
export declare function contentSecurityPolicy(csp: AnyCanvas['csp']): string;
|
|
87
|
+
export declare function renderBootstrap(bootstrap: CanvasBootstrap): string;
|
|
88
|
+
export declare function injectBootstrap(html: string, bootstrap: CanvasBootstrap): string;
|
|
89
|
+
/**
|
|
90
|
+
* Runs one canvas definition: instance lifecycle, serialized actions, state
|
|
91
|
+
* persistence, and the loopback HTTP server that serves the UI and live state.
|
|
92
|
+
*
|
|
93
|
+
* Locks: `i:<instanceId>` serializes open, close, and actions for one instance;
|
|
94
|
+
* the slot lock serializes state changes for one document. Instance locks are
|
|
95
|
+
* always taken before slot locks.
|
|
96
|
+
*/
|
|
97
|
+
export declare class CanvasHost {
|
|
98
|
+
#private;
|
|
99
|
+
readonly canvas: AnyCanvas;
|
|
100
|
+
constructor(canvas: AnyCanvas, options?: CanvasHostOptions);
|
|
101
|
+
log(message: string, level?: LogLevel): void;
|
|
102
|
+
/** Open or reopen an instance and return the URL of its page. */
|
|
103
|
+
open(request: OpenRequest): Promise<OpenResult>;
|
|
104
|
+
/** Open an instance without starting the HTTP server, as the Vite dev server does. */
|
|
105
|
+
openLocal(request: OpenRequest): Promise<CanvasBootstrap>;
|
|
106
|
+
/** Page bootstrap data for an open instance, without reopening it. */
|
|
107
|
+
bootstrapFor(instanceId: string, base: string): CanvasBootstrap | undefined;
|
|
108
|
+
invoke(request: InvokeRequest): Promise<unknown>;
|
|
109
|
+
snapshot(instanceId: string): StateSnapshot | undefined;
|
|
110
|
+
/** Close an instance. The HTTP server stops once no instances remain. */
|
|
111
|
+
closeInstance(instanceId: string): Promise<void>;
|
|
112
|
+
/** Close every instance, stop jobs and file watching, and stop the HTTP server. */
|
|
113
|
+
close(): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Run every due job once for every open document. With `jobs: 'auto'` the host
|
|
116
|
+
* calls this on a timer; failures are logged.
|
|
117
|
+
*/
|
|
118
|
+
tickJobs(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Run a job now for one document: an open instance's (`instanceId`), a saved
|
|
121
|
+
* document's (`key`), or the only open document. `id` is a job's name, or the ID
|
|
122
|
+
* of a job added from a job with input. Runs even if not due unless `force: false`.
|
|
123
|
+
*/
|
|
124
|
+
runJob(id: string, options?: RunJobOptions): Promise<JobOutcome>;
|
|
125
|
+
/**
|
|
126
|
+
* Run one document's due jobs, as `canvas-kit run` does: every job, the jobs with
|
|
127
|
+
* one name (including the jobs added from a job with input), or the job with one ID.
|
|
128
|
+
* `force` runs them even if not due or paused.
|
|
129
|
+
*/
|
|
130
|
+
runJobs(selector: string | undefined, options?: RunJobOptions): Promise<JobOutcome[]>;
|
|
131
|
+
/** The persist keys of every saved document, for running jobs without an open canvas. */
|
|
132
|
+
savedKeys(): Promise<string[]>;
|
|
133
|
+
/**
|
|
134
|
+
* Handle `__canvas/*` API requests for one instance. `path` is relative to the
|
|
135
|
+
* instance base, for example `__canvas/events`.
|
|
136
|
+
*/
|
|
137
|
+
handleApi(instanceId: string, path: string, request: IncomingMessage, response: ServerResponse): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Run an action as the agent would through the Copilot host. Only the Vite
|
|
140
|
+
* dev server uses this, so canvas UIs can be checked without an agent.
|
|
141
|
+
*/
|
|
142
|
+
runDevAgentAction(instanceId: string, actionName: string, request: IncomingMessage, response: ServerResponse): Promise<void>;
|
|
143
|
+
/** Report a request failure as JSON without leaking unexpected error details. */
|
|
144
|
+
sendError(response: ServerResponse, error: unknown): void;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/server/host.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,eAAe,EAAe,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjG,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EAGd,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAA0E,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5I,OAAO,EAAiD,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAA6C,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAChC,kGAAkG;IAClG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,iGAAiG;IACjG,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACjD,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,4FAA4F;IAC5F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,qDAAqD;IACrD,GAAG,EAAE,OAAO,CAAC;IACb,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,iEAAiE;AACjE,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACtC;AA+DD,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAYnE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAMlE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,MAAM,CAEhF;AAgCD;;;;;;;GAOG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;gBAoBf,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,iBAAsB;IAU9D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,QAAiB;IAI7C,iEAAiE;IAC3D,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBrD,sFAAsF;IACtF,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAKzD,sEAAsE;IACtE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAK3E,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAKvD,yEAAyE;IACnE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD,mFAAmF;IAC7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB/B;;;;OAIG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;IAW1E;;;;OAIG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgB/F,yFAAyF;IACnF,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBpC;;;OAGG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBpH;;;OAGG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlI,iFAAiF;IACjF,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;CAgvBnD"}
|