@rwoll/canvas-kit 0.0.0-stage → 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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +482 -2
  3. package/cli/canvas-kit.mjs +148 -0
  4. package/cli/lib.mjs +697 -0
  5. package/cli/release.json +4 -0
  6. package/dist/client.d.ts +72 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +156 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/define.d.ts +249 -0
  11. package/dist/define.d.ts.map +1 -0
  12. package/dist/define.js +197 -0
  13. package/dist/define.js.map +1 -0
  14. package/dist/errors.d.ts +12 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +39 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/extension.d.ts +25 -0
  19. package/dist/extension.d.ts.map +1 -0
  20. package/dist/extension.js +70 -0
  21. package/dist/extension.js.map +1 -0
  22. package/dist/index.d.ts +5 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +4 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/jobs.d.ts +56 -0
  27. package/dist/jobs.d.ts.map +1 -0
  28. package/dist/jobs.js +33 -0
  29. package/dist/jobs.js.map +1 -0
  30. package/dist/playwright.d.ts +79 -0
  31. package/dist/playwright.d.ts.map +1 -0
  32. package/dist/playwright.js +124 -0
  33. package/dist/playwright.js.map +1 -0
  34. package/dist/react.d.ts +55 -0
  35. package/dist/react.d.ts.map +1 -0
  36. package/dist/react.js +72 -0
  37. package/dist/react.js.map +1 -0
  38. package/dist/server/headless.d.ts +20 -0
  39. package/dist/server/headless.d.ts.map +1 -0
  40. package/dist/server/headless.js +35 -0
  41. package/dist/server/headless.js.map +1 -0
  42. package/dist/server/host.d.ts +146 -0
  43. package/dist/server/host.d.ts.map +1 -0
  44. package/dist/server/host.js +1078 -0
  45. package/dist/server/host.js.map +1 -0
  46. package/dist/server/index.d.ts +9 -0
  47. package/dist/server/index.d.ts.map +1 -0
  48. package/dist/server/index.js +5 -0
  49. package/dist/server/index.js.map +1 -0
  50. package/dist/server/release.d.ts +30 -0
  51. package/dist/server/release.d.ts.map +1 -0
  52. package/dist/server/release.js +71 -0
  53. package/dist/server/release.js.map +1 -0
  54. package/dist/server/storage.d.ts +63 -0
  55. package/dist/server/storage.d.ts.map +1 -0
  56. package/dist/server/storage.js +253 -0
  57. package/dist/server/storage.js.map +1 -0
  58. package/dist/testing.d.ts +49 -0
  59. package/dist/testing.d.ts.map +1 -0
  60. package/dist/testing.js +42 -0
  61. package/dist/testing.js.map +1 -0
  62. package/dist/vite.d.ts +15 -0
  63. package/dist/vite.d.ts.map +1 -0
  64. package/dist/vite.js +213 -0
  65. package/dist/vite.js.map +1 -0
  66. package/package.json +115 -3
  67. package/styles.css +122 -0
  68. package/templates/canvas/README.md +19 -0
  69. package/templates/canvas/e2e/canvas.spec.ts +15 -0
  70. package/templates/canvas/index.html +13 -0
  71. package/templates/canvas/package.json +29 -0
  72. package/templates/canvas/playwright.config.ts +5 -0
  73. package/templates/canvas/server/canvas.test.ts +22 -0
  74. package/templates/canvas/server/canvas.ts +27 -0
  75. package/templates/canvas/src/App.css +21 -0
  76. package/templates/canvas/src/App.tsx +31 -0
  77. package/templates/canvas/src/index.css +3 -0
  78. package/templates/canvas/src/main.tsx +11 -0
  79. package/templates/canvas/tsconfig.app.json +1 -0
  80. package/templates/canvas/tsconfig.json +7 -0
  81. package/templates/canvas/tsconfig.node.json +1 -0
  82. package/templates/canvas/vite.config.ts +7 -0
  83. package/templates/ui/README.md +18 -0
  84. package/templates/ui/package.json +22 -0
  85. package/templates/ui/src/Checklist.tsx +42 -0
  86. package/templates/ui/src/Header.tsx +17 -0
  87. package/templates/ui/src/Markdown.tsx +140 -0
  88. package/templates/ui/src/TextButton.tsx +6 -0
  89. package/templates/ui/src/index.ts +4 -0
  90. package/templates/ui/theme.css +143 -0
  91. package/templates/ui/tsconfig.json +18 -0
  92. package/tsconfig/canvas.json +27 -0
  93. package/tsconfig/node.json +24 -0
package/dist/define.js ADDED
@@ -0,0 +1,197 @@
1
+ import { z } from 'zod';
2
+ import { CanvasKitError } from "./errors.js";
3
+ import { INTERVAL_PATTERN, JOB_ACTIONS, intervalMs } from "./jobs.js";
4
+ export { formatInterval, intervalMs } from "./jobs.js";
5
+ const emptyInput = z.object({}).strict();
6
+ const ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
7
+ const ACTION_PATTERN = /^[a-z][a-z0-9_]*$/;
8
+ // scheme://host[:port], where host may start with `*.` and port may be `*`. No paths, keywords, or bare wildcards.
9
+ const CSP_SOURCE_PATTERN = /^(?:https?|wss?):\/\/(?:\[::1\]|(?:\*\.)?[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*)(?::(?:\*|[0-9]{1,5}))?$/;
10
+ function compileCsp(id, csp) {
11
+ const connectSrc = [...(csp?.connectSrc ?? [])];
12
+ for (const source of connectSrc) {
13
+ if (typeof source !== 'string' || !CSP_SOURCE_PATTERN.test(source)) {
14
+ throw new Error(`Canvas ${id} has an invalid csp.connectSrc source: ${JSON.stringify(source)}. Use scheme://host[:port].`);
15
+ }
16
+ }
17
+ return { connectSrc: [...new Set(connectSrc)] };
18
+ }
19
+ const DEFAULT_MAX_EVERY_MS = 30 * 86_400_000;
20
+ const DEFAULT_MAX_JOBS = 20;
21
+ const CONTROLS = ['both', 'ui', 'agent'];
22
+ function checkedInterval(name, field, every) {
23
+ const ms = intervalMs(every);
24
+ if (!Number.isFinite(ms) || ms < 1_000) {
25
+ throw new Error(`Job ${name} needs ${field}: at least 1 second, such as '30s', '15m', '6h', '1d', or milliseconds`);
26
+ }
27
+ return ms;
28
+ }
29
+ function compileJob(name, job) {
30
+ if (!ACTION_PATTERN.test(name))
31
+ throw new Error(`Job names must be snake_case: ${name}`);
32
+ if (typeof job?.run !== 'function')
33
+ throw new Error(`Job ${name} needs a run() function`);
34
+ const everyMs = checkedInterval(name, 'every', job.every);
35
+ const minEveryMs = job.minEvery === undefined ? everyMs : checkedInterval(name, 'minEvery', job.minEvery);
36
+ const maxEveryMs = job.maxEvery === undefined ? Math.max(everyMs, DEFAULT_MAX_EVERY_MS) : checkedInterval(name, 'maxEvery', job.maxEvery);
37
+ if (minEveryMs > everyMs || everyMs > maxEveryMs)
38
+ throw new Error(`Job ${name} needs minEvery <= every <= maxEvery`);
39
+ if (job.controls !== undefined && !CONTROLS.includes(job.controls)) {
40
+ throw new Error(`Job ${name} has invalid controls: use 'both', 'ui', or 'agent'`);
41
+ }
42
+ if (job.input !== undefined && typeof job.input.safeParseAsync !== 'function') {
43
+ throw new Error(`Job ${name} needs a Zod schema for input`);
44
+ }
45
+ if (job.input !== undefined && job.controls === undefined) {
46
+ throw new Error(`Job ${name} has input, so it needs controls: the UI or the agent adds jobs from it`);
47
+ }
48
+ const maxJobs = job.maxJobs ?? DEFAULT_MAX_JOBS;
49
+ if (!Number.isInteger(maxJobs) || maxJobs < 1 || maxJobs > 1_000)
50
+ throw new Error(`Job ${name} needs maxJobs between 1 and 1000`);
51
+ return {
52
+ name,
53
+ description: job.description,
54
+ everyMs,
55
+ minEveryMs,
56
+ maxEveryMs,
57
+ controls: job.controls,
58
+ input: job.input,
59
+ maxJobs,
60
+ run: job.run,
61
+ };
62
+ }
63
+ /**
64
+ * The job a job ID belongs to: a declared job's name, or `<name>-<hex>` for a job
65
+ * added from a job with input. Throws `not_found` with the canvas's job names.
66
+ */
67
+ export function jobForId(canvas, id) {
68
+ const declared = canvas.jobs.get(id);
69
+ if (declared)
70
+ return declared;
71
+ const added = /^([a-z][a-z0-9_]*)-[0-9a-f]+$/.exec(id);
72
+ const job = added ? canvas.jobs.get(added[1]) : undefined;
73
+ if (job?.input)
74
+ return job;
75
+ const known = [...canvas.jobs.keys()];
76
+ throw new CanvasKitError('not_found', `${canvas.title} has no job ${id}. Its jobs: ${known.length ? known.join(', ') : 'none'}.`);
77
+ }
78
+ /** Who may call a built-in job action: everyone any of the jobs it covers lets in. */
79
+ function exposureFor(jobs) {
80
+ const ui = jobs.some(job => job.controls === 'both' || job.controls === 'ui');
81
+ const agent = jobs.some(job => job.controls === 'both' || job.controls === 'agent');
82
+ return ui && agent ? 'both' : ui ? 'ui' : 'agent';
83
+ }
84
+ const intervalInput = z
85
+ .union([z.number().int().min(1_000), z.string().regex(INTERVAL_PATTERN)])
86
+ .describe("Interval such as '15m', '6h', or '1d', or milliseconds");
87
+ const jobId = z.string().min(1).max(100).describe('The job ID from list_jobs');
88
+ /** The built-in actions for jobs with `controls`; the host runs them. */
89
+ function jobActions(title, jobs) {
90
+ const controlled = jobs.filter(job => job.controls !== undefined);
91
+ if (controlled.length === 0)
92
+ return [];
93
+ const builtIn = (jobAction, description, input, covers) => ({
94
+ name: jobAction,
95
+ description,
96
+ expose: exposureFor(covers),
97
+ input,
98
+ inputJsonSchema: toJsonSchema(input),
99
+ jobAction,
100
+ run: () => {
101
+ throw new CanvasKitError('internal_error', `${jobAction} runs in the canvas host`);
102
+ },
103
+ });
104
+ const actions = [
105
+ builtIn(JOB_ACTIONS.list, `List this ${title} document's scheduled jobs: their IDs, intervals, whether they are paused, and their last and next runs.`, emptyInput, controlled),
106
+ builtIn(JOB_ACTIONS.update, 'Pause or resume a scheduled job, or change how often it runs, by its ID from list_jobs.', z.object({ id: jobId, enabled: z.boolean().optional(), every: intervalInput.optional() }).strict(), controlled),
107
+ builtIn(JOB_ACTIONS.run, 'Run a scheduled job now, by its ID from list_jobs.', z.object({ id: jobId }).strict(), controlled),
108
+ ];
109
+ const withInput = controlled.filter(job => job.input !== undefined);
110
+ if (withInput.length > 0) {
111
+ const variants = withInput.map(job => z
112
+ .object({ job: z.literal(job.name), input: job.input, every: intervalInput.optional(), enabled: z.boolean().optional() })
113
+ .strict());
114
+ const input = variants.length === 1 ? variants[0] : z.discriminatedUnion('job', variants);
115
+ const kinds = withInput.map(job => (job.description ? `${job.name} (${job.description})` : job.name)).join('; ');
116
+ actions.push(builtIn(JOB_ACTIONS.add, `Add a scheduled job from one of: ${kinds}. It runs soon after it is added, then on its interval. Returns its ID.`, input, withInput), builtIn(JOB_ACTIONS.remove, 'Remove a job added with add_job, by its ID.', z.object({ id: jobId }).strict(), withInput));
117
+ }
118
+ return actions;
119
+ }
120
+ export function toJsonSchema(schema) {
121
+ const { $schema: _ignored, ...rest } = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' });
122
+ return rest;
123
+ }
124
+ export async function parseWith(schema, value, label) {
125
+ const result = await schema.safeParseAsync(value);
126
+ if (!result.success)
127
+ throw new CanvasKitError('invalid_input', `${label}: ${z.prettifyError(result.error)}`);
128
+ return result.data;
129
+ }
130
+ /**
131
+ * Declare a canvas: its state, open input, and actions. The kit supplies the
132
+ * HTTP server, live state sync, persistence, and Copilot SDK registration.
133
+ */
134
+ export function defineCanvas(spec) {
135
+ if (!ID_PATTERN.test(spec.id))
136
+ throw new Error(`Canvas id must be kebab-case: ${spec.id}`);
137
+ if (!spec.title.trim())
138
+ throw new Error(`Canvas ${spec.id} needs a title`);
139
+ if (!spec.description.trim())
140
+ throw new Error(`Canvas ${spec.id} needs a description`);
141
+ const declared = spec.actions?.({ action: definition => definition }) ?? {};
142
+ const actions = new Map();
143
+ for (const [name, action] of Object.entries(declared)) {
144
+ if (!ACTION_PATTERN.test(name))
145
+ throw new Error(`Action names must be snake_case: ${name}`);
146
+ if (typeof action?.run !== 'function')
147
+ throw new Error(`Action ${name} needs a run() function`);
148
+ const input = action.input ?? emptyInput;
149
+ actions.set(name, {
150
+ name,
151
+ description: action.description,
152
+ expose: action.expose ?? 'both',
153
+ input,
154
+ inputJsonSchema: toJsonSchema(input),
155
+ run: action.run,
156
+ });
157
+ }
158
+ if (!actions.has('get_state')) {
159
+ actions.set('get_state', {
160
+ name: 'get_state',
161
+ description: `Read the current state of this ${spec.title} instance, including changes made in its UI.`,
162
+ expose: 'agent',
163
+ input: emptyInput,
164
+ inputJsonSchema: toJsonSchema(emptyInput),
165
+ run: ctx => ctx.state,
166
+ });
167
+ }
168
+ const declaredJobs = spec.jobs?.({ job: definition => definition }) ?? {};
169
+ const jobs = new Map();
170
+ for (const [name, job] of Object.entries(declaredJobs))
171
+ jobs.set(name, compileJob(name, job));
172
+ for (const action of jobActions(spec.title, [...jobs.values()])) {
173
+ if (actions.has(action.name))
174
+ throw new Error(`Action ${action.name} is reserved for job controls; rename it`);
175
+ actions.set(action.name, action);
176
+ }
177
+ return {
178
+ kind: 'canvas-kit/canvas',
179
+ id: spec.id,
180
+ title: spec.title,
181
+ description: spec.description,
182
+ state: spec.state,
183
+ input: spec.input,
184
+ inputJsonSchema: spec.input ? toJsonSchema(spec.input) : undefined,
185
+ versionFooter: spec.versionFooter ?? true,
186
+ csp: compileCsp(spec.id, spec.csp),
187
+ actions,
188
+ jobs,
189
+ persist: spec.persist
190
+ ? { key: spec.persist.key, version: spec.persist.version ?? 1 }
191
+ : undefined,
192
+ init: spec.init,
193
+ reopen: ctx => spec.reopen?.(ctx),
194
+ status: state => spec.status?.(state),
195
+ };
196
+ }
197
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * An expected canvas failure with a stable code. The kit reports it to the agent
3
+ * as a `CanvasError` and to the UI as a JSON error response.
4
+ */
5
+ export declare class CanvasKitError extends Error {
6
+ readonly code: string;
7
+ readonly status: number;
8
+ constructor(code: string, message: string, status?: number);
9
+ static [Symbol.hasInstance](value: unknown): boolean;
10
+ }
11
+ export declare function errorMessage(error: unknown): string;
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ1D,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAIrD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD"}
package/dist/errors.js ADDED
@@ -0,0 +1,39 @@
1
+ const STATUS_BY_CODE = {
2
+ invalid_input: 400,
3
+ forbidden: 403,
4
+ not_found: 404,
5
+ not_open: 409,
6
+ conflict: 409,
7
+ payload_too_large: 413,
8
+ corrupt_state: 500,
9
+ unsupported_state: 500,
10
+ storage_error: 500,
11
+ internal_error: 500,
12
+ };
13
+ // A registered symbol, so errors thrown by another copy of this module (as in the
14
+ // Vite dev server, which loads canvas code separately from the kit) are still recognized.
15
+ const BRAND = Symbol.for('@rwoll/canvas-kit/CanvasKitError');
16
+ /**
17
+ * An expected canvas failure with a stable code. The kit reports it to the agent
18
+ * as a `CanvasError` and to the UI as a JSON error response.
19
+ */
20
+ export class CanvasKitError extends Error {
21
+ code;
22
+ status;
23
+ constructor(code, message, status) {
24
+ super(message);
25
+ this.name = 'CanvasKitError';
26
+ this.code = code;
27
+ this.status = status ?? STATUS_BY_CODE[code] ?? 400;
28
+ Object.defineProperty(this, BRAND, { value: true });
29
+ }
30
+ static [Symbol.hasInstance](value) {
31
+ if (this !== CanvasKitError)
32
+ return Function.prototype[Symbol.hasInstance].call(this, value);
33
+ return typeof value === 'object' && value !== null && value[BRAND] === true;
34
+ }
35
+ }
36
+ export function errorMessage(error) {
37
+ return error instanceof Error ? error.message : String(error);
38
+ }
39
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAA2B;IAC7C,aAAa,EAAE,GAAG;IAClB,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;IACb,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,GAAG;IAClB,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,GAAG;IAClB,cAAc,EAAE,GAAG;CACpB,CAAC;AAEF,kFAAkF;AAClF,0FAA0F;AAC1F,MAAM,KAAK,GAAkB,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAS;IACb,MAAM,CAAS;IAExB,YAAY,IAAY,EAAE,OAAe,EAAE,MAAe;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QACpD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAc;QACxC,IAAI,IAAI,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7F,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA+B,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IACzG,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { joinSession } from '@github/copilot-sdk/extension';
2
+ import type { AnyCanvas } from './define.ts';
3
+ import { CanvasHost } from './server/host.ts';
4
+ export interface RunCanvasExtensionOptions {
5
+ /** Folder with the built UI, usually `new URL('./ui/', import.meta.url)`. */
6
+ uiDir: URL | string;
7
+ /** Plugin name and version, embedded at build time. */
8
+ plugin: {
9
+ name: string;
10
+ version: string;
11
+ };
12
+ /** Release stamp written by `canvas-kit release`, usually `<plugin>/release.json`. */
13
+ releaseFile: URL | string;
14
+ }
15
+ /** What `runCanvasExtension` returns: the joined session and the canvas host. */
16
+ export interface RunningCanvasExtension {
17
+ session: Awaited<ReturnType<typeof joinSession>>;
18
+ host: CanvasHost;
19
+ }
20
+ /**
21
+ * Register a canvas with the current Copilot session. The kit's Vite build
22
+ * generates the extension entry that calls this; canvases do not call it directly.
23
+ */
24
+ export declare function runCanvasExtension(canvas: AnyCanvas, options: RunCanvasExtensionOptions): Promise<RunningCanvasExtension>;
25
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,WAAW,EAAyB,MAAM,+BAA+B,CAAC;AAE9G,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC;IACpB,uDAAuD;IACvD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,sFAAsF;IACtF,WAAW,EAAE,GAAG,GAAG,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;IACjD,IAAI,EAAE,UAAU,CAAC;CAClB;AAiBD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA+C/H"}
@@ -0,0 +1,70 @@
1
+ import { CanvasError, createCanvas, joinSession } from '@github/copilot-sdk/extension';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { CanvasKitError, errorMessage } from "./errors.js";
4
+ import { CanvasHost } from "./server/host.js";
5
+ import { loadRelease } from "./server/release.js";
6
+ const toPath = (value) => (typeof value === 'string' ? value : fileURLToPath(value));
7
+ function toCanvasError(error) {
8
+ if (error instanceof CanvasError)
9
+ return error;
10
+ if (error instanceof CanvasKitError)
11
+ return new CanvasError(error.code, error.message);
12
+ return new CanvasError('extension_error', errorMessage(error));
13
+ }
14
+ const guard = (run) => Promise.resolve()
15
+ .then(run)
16
+ .catch(error => {
17
+ throw toCanvasError(error);
18
+ });
19
+ /**
20
+ * Register a canvas with the current Copilot session. The kit's Vite build
21
+ * generates the extension entry that calls this; canvases do not call it directly.
22
+ */
23
+ export async function runCanvasExtension(canvas, options) {
24
+ let session;
25
+ const log = (message, level) => {
26
+ if (!session)
27
+ return;
28
+ Promise.resolve(session.log(message, { level })).catch(() => { });
29
+ };
30
+ const { release, warning } = await loadRelease(toPath(options.releaseFile), options.plugin);
31
+ const host = new CanvasHost(canvas, {
32
+ uiDir: toPath(options.uiDir),
33
+ release,
34
+ log,
35
+ sendToAgent: async (message) => {
36
+ if (!session)
37
+ throw new Error('The canvas has not joined a session yet');
38
+ await session.send(message);
39
+ },
40
+ });
41
+ session = await joinSession({
42
+ canvases: [
43
+ createCanvas({
44
+ id: canvas.id,
45
+ displayName: canvas.title,
46
+ description: canvas.description,
47
+ ...(canvas.inputJsonSchema ? { inputSchema: canvas.inputJsonSchema } : {}),
48
+ actions: [...canvas.actions.values()]
49
+ .filter(action => action.expose !== 'ui')
50
+ .map(action => ({
51
+ name: action.name,
52
+ description: action.description,
53
+ inputSchema: action.inputJsonSchema,
54
+ handler: ctx => guard(() => host.invoke({ instanceId: ctx.instanceId, actionName: action.name, input: ctx.input, source: 'agent' })),
55
+ })),
56
+ open: ctx => guard(() => host.open({ instanceId: ctx.instanceId, input: ctx.input })),
57
+ onClose: ctx => guard(() => host.closeInstance(ctx.instanceId)),
58
+ }),
59
+ ],
60
+ });
61
+ if (warning)
62
+ log(warning, 'warning');
63
+ const shutdown = () => {
64
+ host.close().finally(() => process.exit(0));
65
+ };
66
+ process.once('SIGTERM', shutdown);
67
+ process.once('SIGINT', shutdown);
68
+ return { session, host };
69
+ }
70
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { z } from 'zod';
2
+ export { defineCanvas, formatInterval, intervalMs } from './define.ts';
3
+ export type { ActionContext, ActionExposure, ActionInput, ActionResult, ActionsOf, ActionSource, ActionSpec, AgentMessage, AnyCanvas, CanvasCsp, CanvasDefinition, CanvasSpec, Interval, JobContext, JobControls, JobDefinitionInfo, JobInput, JobName, JobSpec, JobStatus, JobStatusOf, JobWithInputName, JobsOf, LogLevel, OpenContext, PersistOptions, ReopenContext, StateOf, UiActionName, } from './define.ts';
4
+ export { CanvasKitError } from './errors.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,MAAM,EACN,QAAQ,EACR,WAAW,EACX,cAAc,EACd,aAAa,EACb,OAAO,EACP,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { z } from 'zod';
2
+ export { defineCanvas, formatInterval, intervalMs } from "./define.js";
3
+ export { CanvasKitError } from "./errors.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgCvE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/jobs.d.ts ADDED
@@ -0,0 +1,56 @@
1
+ /** A duration such as `30s`, `15m`, `6h`, or `1d`, or milliseconds. */
2
+ export type Interval = number | `${number}${'s' | 'm' | 'h' | 'd'}`;
3
+ /** Who may pause, resume, retime, and run a job, and add jobs from a job with input. */
4
+ export type JobControls = 'both' | 'ui' | 'agent';
5
+ export declare const INTERVAL_PATTERN: RegExp;
6
+ /** Milliseconds in an `Interval`, or NaN when it is not one. */
7
+ export declare function intervalMs(every: Interval): number;
8
+ /** The shortest `Interval` for a duration: `90_000` is `90s`, `3_600_000` is `1h`. */
9
+ export declare function formatInterval(ms: number): Interval;
10
+ /** A job's schedule for one document, as the UI and the agent see it. */
11
+ export interface JobStatus<Name extends string = string, Input = unknown> {
12
+ /** The job's name for a job without input; otherwise a generated ID such as `remind-3f9a2c`. */
13
+ id: string;
14
+ job: Name;
15
+ description?: string;
16
+ /** The input it was added with, for a job added from a job with input. */
17
+ input?: Input;
18
+ /** Interval in milliseconds; `formatInterval()` turns it into text such as `6h`. */
19
+ every: number;
20
+ /** The shortest and longest interval that may be chosen, in milliseconds. */
21
+ minEvery: number;
22
+ maxEvery: number;
23
+ /** False while paused. */
24
+ enabled: boolean;
25
+ lastRunAt?: string;
26
+ /** The error from the last run, when it failed. */
27
+ lastError?: string;
28
+ /** When it next runs while a chat has the canvas open; absent while paused or before its first run. */
29
+ nextRunAt?: string;
30
+ /** Who may control it; absent when only code may. */
31
+ controls?: JobControls;
32
+ /** True for a job added from a job with input, which may be removed. */
33
+ added: boolean;
34
+ }
35
+ /** A job declared by the canvas, for UIs that add jobs from a job with input. */
36
+ export interface JobDefinitionInfo {
37
+ name: string;
38
+ description?: string;
39
+ every: number;
40
+ minEvery: number;
41
+ maxEvery: number;
42
+ controls?: JobControls;
43
+ /** True when it takes input: users add jobs from it instead of it running on its own. */
44
+ hasInput: boolean;
45
+ maxJobs: number;
46
+ }
47
+ /** Built-in actions added for jobs with `controls`. */
48
+ export declare const JOB_ACTIONS: {
49
+ readonly list: "list_jobs";
50
+ readonly update: "update_job";
51
+ readonly run: "run_job";
52
+ readonly add: "add_job";
53
+ readonly remove: "remove_job";
54
+ };
55
+ export type JobAction = (typeof JOB_ACTIONS)[keyof typeof JOB_ACTIONS];
56
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AAEpE,wFAAwF;AACxF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAElD,eAAO,MAAM,gBAAgB,QAA+B,CAAC;AAQ7D,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAKlD;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAKnD;AAED,yEAAyE;AACzE,MAAM,WAAW,SAAS,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,OAAO;IACtE,gGAAgG;IAChG,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,IAAI,CAAC;IACV,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uGAAuG;IACvG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,wEAAwE;IACxE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uDAAuD;AACvD,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC"}
package/dist/jobs.js ADDED
@@ -0,0 +1,33 @@
1
+ // Job types and helpers shared by the server and the browser. No Node.js or Zod imports.
2
+ export const INTERVAL_PATTERN = /^(\d+(?:\.\d+)?)(s|m|h|d)$/;
3
+ const UNITS = [
4
+ ['d', 86_400_000],
5
+ ['h', 3_600_000],
6
+ ['m', 60_000],
7
+ ['s', 1_000],
8
+ ];
9
+ /** Milliseconds in an `Interval`, or NaN when it is not one. */
10
+ export function intervalMs(every) {
11
+ if (typeof every === 'number')
12
+ return every;
13
+ const match = INTERVAL_PATTERN.exec(every);
14
+ const unit = match && UNITS.find(([name]) => name === match[2]);
15
+ return match && unit ? Number(match[1]) * unit[1] : Number.NaN;
16
+ }
17
+ /** The shortest `Interval` for a duration: `90_000` is `90s`, `3_600_000` is `1h`. */
18
+ export function formatInterval(ms) {
19
+ for (const [name, size] of UNITS) {
20
+ if (ms >= size && ms % size === 0)
21
+ return `${ms / size}${name}`;
22
+ }
23
+ return ms;
24
+ }
25
+ /** Built-in actions added for jobs with `controls`. */
26
+ export const JOB_ACTIONS = {
27
+ list: 'list_jobs',
28
+ update: 'update_job',
29
+ run: 'run_job',
30
+ add: 'add_job',
31
+ remove: 'remove_job',
32
+ };
33
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAQzF,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAC7D,MAAM,KAAK,GAAG;IACZ,CAAC,GAAG,EAAE,UAAU,CAAC;IACjB,CAAC,GAAG,EAAE,SAAS,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,KAAK,CAAC;CACJ,CAAC;AAEX,gEAAgE;AAChE,MAAM,UAAU,UAAU,CAAC,KAAe;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AACjE,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC;YAAE,OAAO,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAc,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAyCD,uDAAuD;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,YAAY;CACZ,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { type Page, type PlaywrightTestConfig } from '@playwright/test';
2
+ import type { AgentMessage, AnyCanvas, JobName, StateOf } from './define.ts';
3
+ import type { JobOutcome, RunJobOptions } from './server/host.ts';
4
+ import type { ReleaseInfo } from './server/release.ts';
5
+ import { type HarnessAction, type HarnessInput, type HarnessResult, type TestCanvas } from './testing.ts';
6
+ export interface CanvasTestOptions {
7
+ /**
8
+ * Folder with the built UI. Defaults to `dist/plugin/extensions/<name>/ui` in the
9
+ * current folder, where `<name>` is the current folder's name, which is what
10
+ * `vite build` writes for a canvas package.
11
+ */
12
+ uiDir?: string;
13
+ /**
14
+ * Release shown in the version footer. Defaults to an unpublished build of the
15
+ * package in the current folder, so screenshots stay stable.
16
+ */
17
+ release?: ReleaseInfo;
18
+ /** Clock for actions and jobs (`ctx.now()`), to test time-based jobs. Defaults to `Date.now`. */
19
+ now?: () => number;
20
+ }
21
+ export interface OpenedCanvas<C extends AnyCanvas> {
22
+ /** The page showing the canvas, already live. */
23
+ page: Page;
24
+ url: string;
25
+ instanceId: string;
26
+ /** The instance's current state on the server. */
27
+ state(): StateOf<C> | undefined;
28
+ /** Open the same instance in another page of the browser context, to check that views stay in sync. */
29
+ openAnotherPage(): Promise<Page>;
30
+ }
31
+ export interface CanvasAgent<C extends AnyCanvas> {
32
+ /** Run an action as the agent, including the built-in job actions. Defaults to the most recently opened instance. */
33
+ invoke<K extends HarnessAction<C>>(action: K, input?: HarnessInput<C, K>, options?: {
34
+ instanceId?: string;
35
+ }): Promise<HarnessResult<C, K>>;
36
+ /** Messages the canvas sent to the agent with `ctx.sendToAgent()`, oldest first. */
37
+ readonly messages: AgentMessage[];
38
+ /** Make the next `ctx.sendToAgent()` fail, to test how the canvas reports it. */
39
+ failNextSend(error?: Error): void;
40
+ }
41
+ export interface CanvasFixtures<C extends AnyCanvas> {
42
+ /** The canvas running on a real local server with a temporary data folder. */
43
+ canvasHarness: TestCanvas<C>;
44
+ /** Open an instance, point `page` at it, and wait until it is live. */
45
+ openCanvas(input?: unknown, options?: {
46
+ instanceId?: string;
47
+ }): Promise<OpenedCanvas<C>>;
48
+ /** Act as the agent and see what the canvas sent it. */
49
+ agent: CanvasAgent<C>;
50
+ /** Save state for a `persist` key before opening, to test reopening saved documents. */
51
+ seed(key: string, state: unknown): Promise<void>;
52
+ /**
53
+ * Run a job now, as its schedule would. Defaults to the most recently opened
54
+ * instance; pass `key` to run it for a saved document with no chat open.
55
+ */
56
+ runJob(id: JobName<C> | (string & {}), options?: RunJobOptions): Promise<JobOutcome>;
57
+ }
58
+ /**
59
+ * Playwright fixtures for a canvas. Use the returned `test` like Playwright's own:
60
+ *
61
+ * ```ts
62
+ * export const test = canvasTest(canvas)
63
+ * test('adds a blocker', async ({ openCanvas, agent }) => { ... })
64
+ * ```
65
+ */
66
+ export declare function canvasTest<C extends AnyCanvas>(canvas: C, options?: CanvasTestOptions): import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & CanvasFixtures<C> & {
67
+ _canvasState: {
68
+ messages: AgentMessage[];
69
+ failures: Error[];
70
+ lastInstance: string;
71
+ };
72
+ }, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
73
+ /**
74
+ * Playwright config for canvas tests: specs in `e2e/`, run in light, dark, and
75
+ * high-contrast Chromium. Pass overrides as you would to `defineConfig`.
76
+ */
77
+ export declare function defineCanvasConfig(config?: PlaywrightTestConfig): PlaywrightTestConfig;
78
+ export { expect } from '@playwright/test';
79
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}