@kvman/testkit 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 (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/bin/bin-failure.d.ts +16 -0
  4. package/dist/bin/bin-failure.d.ts.map +1 -0
  5. package/dist/bin/bin-failure.js +28 -0
  6. package/dist/bin/bin-failure.js.map +1 -0
  7. package/dist/bin/program-command.d.ts +7 -0
  8. package/dist/bin/program-command.d.ts.map +1 -0
  9. package/dist/bin/program-command.js +8 -0
  10. package/dist/bin/program-command.js.map +1 -0
  11. package/dist/bin/run-program.d.ts +10 -0
  12. package/dist/bin/run-program.d.ts.map +1 -0
  13. package/dist/bin/run-program.js +30 -0
  14. package/dist/bin/run-program.js.map +1 -0
  15. package/dist/check/check-extension.d.ts +4 -0
  16. package/dist/check/check-extension.d.ts.map +1 -0
  17. package/dist/check/check-extension.js +78 -0
  18. package/dist/check/check-extension.js.map +1 -0
  19. package/dist/check/check-output.d.ts +4 -0
  20. package/dist/check/check-output.d.ts.map +1 -0
  21. package/dist/check/check-output.js +13 -0
  22. package/dist/check/check-output.js.map +1 -0
  23. package/dist/check/docs-findings.d.ts +8 -0
  24. package/dist/check/docs-findings.d.ts.map +1 -0
  25. package/dist/check/docs-findings.js +65 -0
  26. package/dist/check/docs-findings.js.map +1 -0
  27. package/dist/check/field-descriptions.d.ts +8 -0
  28. package/dist/check/field-descriptions.d.ts.map +1 -0
  29. package/dist/check/field-descriptions.js +19 -0
  30. package/dist/check/field-descriptions.js.map +1 -0
  31. package/dist/check/finding.d.ts +11 -0
  32. package/dist/check/finding.d.ts.map +1 -0
  33. package/dist/check/finding.js +2 -0
  34. package/dist/check/finding.js.map +1 -0
  35. package/dist/check/locale-keys.d.ts +7 -0
  36. package/dist/check/locale-keys.d.ts.map +1 -0
  37. package/dist/check/locale-keys.js +40 -0
  38. package/dist/check/locale-keys.js.map +1 -0
  39. package/dist/check/timer-scan.d.ts +6 -0
  40. package/dist/check/timer-scan.d.ts.map +1 -0
  41. package/dist/check/timer-scan.js +84 -0
  42. package/dist/check/timer-scan.js.map +1 -0
  43. package/dist/check/ui-keys.d.ts +3 -0
  44. package/dist/check/ui-keys.d.ts.map +1 -0
  45. package/dist/check/ui-keys.js +58 -0
  46. package/dist/check/ui-keys.js.map +1 -0
  47. package/dist/check-bin.d.ts +3 -0
  48. package/dist/check-bin.d.ts.map +1 -0
  49. package/dist/check-bin.js +17 -0
  50. package/dist/check-bin.js.map +1 -0
  51. package/dist/docs/built-in-guides.d.ts +12 -0
  52. package/dist/docs/built-in-guides.d.ts.map +1 -0
  53. package/dist/docs/built-in-guides.js +20 -0
  54. package/dist/docs/built-in-guides.js.map +1 -0
  55. package/dist/docs/docs-bin.d.ts +3 -0
  56. package/dist/docs/docs-bin.d.ts.map +1 -0
  57. package/dist/docs/docs-bin.js +98 -0
  58. package/dist/docs/docs-bin.js.map +1 -0
  59. package/dist/docs/docs-get.d.ts +11 -0
  60. package/dist/docs/docs-get.d.ts.map +1 -0
  61. package/dist/docs/docs-get.js +54 -0
  62. package/dist/docs/docs-get.js.map +1 -0
  63. package/dist/docs/docs-list.d.ts +22 -0
  64. package/dist/docs/docs-list.d.ts.map +1 -0
  65. package/dist/docs/docs-list.js +51 -0
  66. package/dist/docs/docs-list.js.map +1 -0
  67. package/dist/fake-clock.d.ts +16 -0
  68. package/dist/fake-clock.d.ts.map +1 -0
  69. package/dist/fake-clock.js +47 -0
  70. package/dist/fake-clock.js.map +1 -0
  71. package/dist/fake-openai.d.ts +55 -0
  72. package/dist/fake-openai.d.ts.map +1 -0
  73. package/dist/fake-openai.js +115 -0
  74. package/dist/fake-openai.js.map +1 -0
  75. package/dist/index.d.ts +55 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +111 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/new/new-bin.d.ts +3 -0
  80. package/dist/new/new-bin.d.ts.map +1 -0
  81. package/dist/new/new-bin.js +60 -0
  82. package/dist/new/new-bin.js.map +1 -0
  83. package/dist/new/new-project.d.ts +11 -0
  84. package/dist/new/new-project.d.ts.map +1 -0
  85. package/dist/new/new-project.js +36 -0
  86. package/dist/new/new-project.js.map +1 -0
  87. package/dist/new/scaffold-files.d.ts +7 -0
  88. package/dist/new/scaffold-files.d.ts.map +1 -0
  89. package/dist/new/scaffold-files.js +100 -0
  90. package/dist/new/scaffold-files.js.map +1 -0
  91. package/dist/new/scaffold-versions.d.ts +10 -0
  92. package/dist/new/scaffold-versions.d.ts.map +1 -0
  93. package/dist/new/scaffold-versions.js +12 -0
  94. package/dist/new/scaffold-versions.js.map +1 -0
  95. package/dist/preset/preset-bin.d.ts +3 -0
  96. package/dist/preset/preset-bin.d.ts.map +1 -0
  97. package/dist/preset/preset-bin.js +91 -0
  98. package/dist/preset/preset-bin.js.map +1 -0
  99. package/dist/preset/preset-check.d.ts +15 -0
  100. package/dist/preset/preset-check.d.ts.map +1 -0
  101. package/dist/preset/preset-check.js +113 -0
  102. package/dist/preset/preset-check.js.map +1 -0
  103. package/dist/preset/preset-new.d.ts +5 -0
  104. package/dist/preset/preset-new.d.ts.map +1 -0
  105. package/dist/preset/preset-new.js +16 -0
  106. package/dist/preset/preset-new.js.map +1 -0
  107. package/dist/preset/preset-reach.d.ts +18 -0
  108. package/dist/preset/preset-reach.d.ts.map +1 -0
  109. package/dist/preset/preset-reach.js +33 -0
  110. package/dist/preset/preset-reach.js.map +1 -0
  111. package/dist/preset/project-manifest.d.ts +5 -0
  112. package/dist/preset/project-manifest.d.ts.map +1 -0
  113. package/dist/preset/project-manifest.js +30 -0
  114. package/dist/preset/project-manifest.js.map +1 -0
  115. package/dist/preview/preview-bin.d.ts +3 -0
  116. package/dist/preview/preview-bin.d.ts.map +1 -0
  117. package/dist/preview/preview-bin.js +63 -0
  118. package/dist/preview/preview-bin.js.map +1 -0
  119. package/dist/preview/preview-home.d.ts +5 -0
  120. package/dist/preview/preview-home.d.ts.map +1 -0
  121. package/dist/preview/preview-home.js +64 -0
  122. package/dist/preview/preview-home.js.map +1 -0
  123. package/dist/preview/preview-manifest.d.ts +9 -0
  124. package/dist/preview/preview-manifest.d.ts.map +1 -0
  125. package/dist/preview/preview-manifest.js +32 -0
  126. package/dist/preview/preview-manifest.js.map +1 -0
  127. package/dist/preview/preview-port.d.ts +5 -0
  128. package/dist/preview/preview-port.d.ts.map +1 -0
  129. package/dist/preview/preview-port.js +22 -0
  130. package/dist/preview/preview-port.js.map +1 -0
  131. package/dist/preview/preview-preset.d.ts +14 -0
  132. package/dist/preview/preview-preset.d.ts.map +1 -0
  133. package/dist/preview/preview-preset.js +13 -0
  134. package/dist/preview/preview-preset.js.map +1 -0
  135. package/dist/preview/preview-run.d.ts +14 -0
  136. package/dist/preview/preview-run.d.ts.map +1 -0
  137. package/dist/preview/preview-run.js +241 -0
  138. package/dist/preview/preview-run.js.map +1 -0
  139. package/dist/preview/process-tree.d.ts +40 -0
  140. package/dist/preview/process-tree.d.ts.map +1 -0
  141. package/dist/preview/process-tree.js +92 -0
  142. package/dist/preview/process-tree.js.map +1 -0
  143. package/dist/running/call-query.d.ts +5 -0
  144. package/dist/running/call-query.d.ts.map +1 -0
  145. package/dist/running/call-query.js +34 -0
  146. package/dist/running/call-query.js.map +1 -0
  147. package/dist/running/running-kvman.d.ts +14 -0
  148. package/dist/running/running-kvman.d.ts.map +1 -0
  149. package/dist/running/running-kvman.js +80 -0
  150. package/dist/running/running-kvman.js.map +1 -0
  151. package/docs/i18n.md +20 -0
  152. package/docs/presets.md +15 -0
  153. package/docs/sdk.md +77 -0
  154. package/package.json +49 -0
  155. package/templates/AGENTS.md.template +13 -0
  156. package/templates/README.md.template +12 -0
  157. package/templates/extension-docs/usage.md.template +8 -0
  158. package/templates/src/docs.ts.template +46 -0
  159. package/templates/src/index.ts.template +42 -0
  160. package/templates/test/extension.test.ts.template +29 -0
  161. package/templates/web/components/Hello.vue.template +42 -0
  162. package/templates/web-build.ts.template +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer-scan.js","sourceRoot":"","sources":["../../src/check/timer-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function viewKeys(view: unknown): string[];
2
+ export declare function uiKeys(answer: unknown): string[];
3
+ //# sourceMappingURL=ui-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-keys.d.ts","sourceRoot":"","sources":["../../src/check/ui-keys.ts"],"names":[],"mappings":"AAyCA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAYhD;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAShD"}
@@ -0,0 +1,58 @@
1
+ // The translation keys a `<namespace>.ui.get` answer uses (plan 06 §6.3–6.4): page, nav, and panel titles, status
2
+ // texts, and every text of a view tree (headings, texts, translated Markdown, card titles, columns and their badges,
3
+ // empty texts, buttons and their confirms, links, form submits, and toasts).
4
+ function isObject(value) {
5
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ }
7
+ function objects(value) {
8
+ return Array.isArray(value) ? value.filter(isObject) : [];
9
+ }
10
+ function strings(object, fields) {
11
+ return fields.flatMap((field) => {
12
+ const value = object[field];
13
+ return typeof value === 'string' ? [value] : [];
14
+ });
15
+ }
16
+ const textFields = {
17
+ heading: ['text'],
18
+ text: ['text'],
19
+ markdown: ['text'],
20
+ card: ['title'],
21
+ link: ['text'],
22
+ button: ['text', 'confirm'],
23
+ form: ['submit'],
24
+ table: ['empty'],
25
+ list: ['empty'],
26
+ };
27
+ function columnKeys(columns) {
28
+ return objects(columns).flatMap((column) => [...strings(column, ['title']), ...(isObject(column['badges']) ? Object.values(column['badges']).filter(isObject).flatMap((badge) => strings(badge, ['text'])) : [])]);
29
+ }
30
+ function thenKeys(then) {
31
+ return isObject(then) ? strings(then, ['toast']) : [];
32
+ }
33
+ export function viewKeys(view) {
34
+ if (!isObject(view))
35
+ return [];
36
+ const type = typeof view['type'] === 'string' ? view['type'] : '';
37
+ return [
38
+ ...strings(view, textFields[type] ?? []),
39
+ ...thenKeys(view['then']),
40
+ ...columnKeys(view['columns']),
41
+ ...columnKeys(view['fields']),
42
+ ...objects(view['rowActions']).flatMap(viewKeys),
43
+ ...objects(view['children']).flatMap(viewKeys),
44
+ ...viewKeys(view['item']),
45
+ ];
46
+ }
47
+ export function uiKeys(answer) {
48
+ if (!isObject(answer))
49
+ return [];
50
+ return [
51
+ ...objects(answer['pages']).flatMap((page) => [...strings(page, ['title']), ...viewKeys(page['view'])]),
52
+ ...objects(answer['nav']).flatMap((item) => strings(item, ['title'])),
53
+ ...objects(answer['panels']).flatMap((panel) => [...strings(panel, ['title']), ...viewKeys(panel['view'])]),
54
+ ...objects(answer['status']).flatMap((item) => strings(item, ['text'])),
55
+ ...viewKeys(answer['configuration']),
56
+ ];
57
+ }
58
+ //# sourceMappingURL=ui-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-keys.js","sourceRoot":"","sources":["../../src/check/ui-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=check-bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-bin.d.ts","sourceRoot":"","sources":["../src/check-bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { checkExtension } from "./check/check-extension.js";
3
+ import { jsonFindings, readableFindings } from "./check/check-output.js";
4
+ // The `kvman-check` bin (plan 10, ADR 0009, 116): run in an extension project, as its `npm run check`. It exits 1 when
5
+ // it finds an error and 0 when it finds only warnings.
6
+ const options = process.argv.slice(2);
7
+ const unknown = options.filter((option) => option !== '--json');
8
+ if (unknown.length > 0) {
9
+ process.stderr.write(`kvman-check: unknown option ${unknown.join(' ')}; the only option is --json.\n`);
10
+ process.exitCode = 1;
11
+ }
12
+ else {
13
+ const findings = await checkExtension(process.cwd());
14
+ process.stdout.write(`${options.includes('--json') ? jsonFindings(findings) : readableFindings(findings)}\n`);
15
+ process.exitCode = findings.some((finding) => !finding.warning) ? 1 : 0;
16
+ }
17
+ //# sourceMappingURL=check-bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-bin.js","sourceRoot":"","sources":["../src/check-bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,uHAAuH;AACvH,uDAAuD;AAEvD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;AAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IACvG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;KAAM,CAAC;IACN,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9G,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** A built-in guide: `extension` is always `"kvman"`. */
2
+ export type BuiltInGuide = {
3
+ extension: 'kvman';
4
+ topic: string;
5
+ title: string;
6
+ markdown: string;
7
+ };
8
+ /** The three built-in guides, sorted by topic. */
9
+ export declare function listBuiltInGuides(): BuiltInGuide[];
10
+ /** The built-in guide on a topic, or `undefined` for any other topic. */
11
+ export declare function readBuiltInGuide(topic: string): BuiltInGuide | undefined;
12
+ //# sourceMappingURL=built-in-guides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in-guides.d.ts","sourceRoot":"","sources":["../../src/docs/built-in-guides.ts"],"names":[],"mappings":"AAKA,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAclG,kDAAkD;AAClD,wBAAgB,iBAAiB,IAAI,YAAY,EAAE,CAElD;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGxE"}
@@ -0,0 +1,20 @@
1
+ import { readFileSync } from 'node:fs';
2
+ const builtInTopics = ['i18n', 'presets', 'sdk'];
3
+ function titleOf(topic, markdown) {
4
+ const first = markdown.split('\n', 1)[0];
5
+ return first !== undefined && first.startsWith('# ') ? first.slice(2) : topic;
6
+ }
7
+ function readGuide(topic) {
8
+ const markdown = readFileSync(new URL(`../../docs/${topic}.md`, import.meta.url), 'utf8');
9
+ return { extension: 'kvman', topic, title: titleOf(topic, markdown), markdown };
10
+ }
11
+ /** The three built-in guides, sorted by topic. */
12
+ export function listBuiltInGuides() {
13
+ return builtInTopics.map((topic) => readGuide(topic));
14
+ }
15
+ /** The built-in guide on a topic, or `undefined` for any other topic. */
16
+ export function readBuiltInGuide(topic) {
17
+ const known = builtInTopics.includes(topic);
18
+ return known ? readGuide(topic) : undefined;
19
+ }
20
+ //# sourceMappingURL=built-in-guides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in-guides.js","sourceRoot":"","sources":["../../src/docs/built-in-guides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQvC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AAE1D,SAAS,OAAO,CAAC,KAAa,EAAE,QAAgB;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAChF,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,cAAc,KAAK,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1F,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;AAClF,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAI,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=docs-bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-bin.d.ts","sourceRoot":"","sources":["../../src/docs/docs-bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from 'node:util';
3
+ import { BinFailure, printFailure } from "../bin/bin-failure.js";
4
+ import { listDocsPages } from "./docs-list.js";
5
+ import { readDocsPage } from "./docs-get.js";
6
+ import { findRunningKvman } from "../running/running-kvman.js";
7
+ // The `kvman-docs` bin (plan 09 §9.5, plan 10, ADR 0010, 17): reads the docs of the extensions a running kvman has
8
+ // loaded over HTTP, plus the three built-in guides with no kvman running. With `--json` it prints the data as one
9
+ // JSON line.
10
+ const usage = 'Usage: kvman-docs list [--json] [--home <dir>] [--url <url>]\nUsage: kvman-docs get <extension> <topic> [--json] [--home <dir>] [--url <url>]';
11
+ function parseOptions(argv) {
12
+ let parsed;
13
+ try {
14
+ parsed = parseArgs({
15
+ args: argv,
16
+ allowPositionals: true,
17
+ options: {
18
+ json: { type: 'boolean', default: false },
19
+ home: { type: 'string' },
20
+ url: { type: 'string' },
21
+ },
22
+ });
23
+ }
24
+ catch (error) {
25
+ const reason = error instanceof Error ? error.message : String(error);
26
+ throw new BinFailure('VALIDATION_FAILED', `${reason} ${usage}`);
27
+ }
28
+ const flags = {
29
+ json: parsed.values.json ?? false,
30
+ home: typeof parsed.values.home === 'string' ? parsed.values.home : undefined,
31
+ url: typeof parsed.values.url === 'string' ? parsed.values.url : undefined,
32
+ };
33
+ const [subcommand, ...rest] = parsed.positionals;
34
+ if (subcommand === 'list' && rest.length === 0)
35
+ return { kind: 'list', ...flags };
36
+ if (subcommand === 'get' && rest.length === 2 && rest[0] !== undefined && rest[1] !== undefined) {
37
+ return { kind: 'get', extension: rest[0], topic: rest[1], ...flags };
38
+ }
39
+ if (subcommand === undefined)
40
+ throw new BinFailure('VALIDATION_FAILED', `A subcommand is required. ${usage}`);
41
+ if (subcommand !== 'list' && subcommand !== 'get')
42
+ throw new BinFailure('VALIDATION_FAILED', `Unknown subcommand ${JSON.stringify(subcommand)}; give list or get. ${usage}`);
43
+ if (subcommand === 'list')
44
+ throw new BinFailure('VALIDATION_FAILED', `list takes no arguments. ${usage}`);
45
+ throw new BinFailure('VALIDATION_FAILED', `get takes <extension> and <topic>. ${usage}`);
46
+ }
47
+ function readableListing(listing) {
48
+ const lines = [];
49
+ let current;
50
+ for (const page of listing.pages) {
51
+ if (page.extension !== current) {
52
+ current = page.extension;
53
+ lines.push(current);
54
+ }
55
+ lines.push(` ${page.topic}: ${page.title}`);
56
+ }
57
+ if (listing.problems.length > 0) {
58
+ lines.push('Problems:');
59
+ for (const problem of listing.problems)
60
+ lines.push(`${problem.extension}: ${problem.problem.message}`);
61
+ }
62
+ return `${lines.join('\n')}\n`;
63
+ }
64
+ const json = process.argv.includes('--json');
65
+ try {
66
+ const command = parseOptions(process.argv.slice(2));
67
+ const locate = {};
68
+ if (command.home !== undefined)
69
+ locate.home = command.home;
70
+ if (command.url !== undefined)
71
+ locate.url = command.url;
72
+ const running = findRunningKvman(locate);
73
+ if (command.kind === 'list') {
74
+ const listing = await listDocsPages(running);
75
+ if (command.json) {
76
+ process.stdout.write(`${JSON.stringify({ pages: listing.pages, problems: listing.problems })}\n`);
77
+ }
78
+ else {
79
+ process.stdout.write(readableListing(listing));
80
+ }
81
+ if (!listing.running)
82
+ process.stderr.write("kvman isn't running; start it to read the extensions' docs.\n");
83
+ }
84
+ else {
85
+ const page = await readDocsPage(running, command.extension, command.topic);
86
+ if (command.json) {
87
+ process.stdout.write(`${JSON.stringify({ extension: page.extension, topic: page.topic, title: page.title, markdown: page.markdown })}\n`);
88
+ }
89
+ else {
90
+ process.stdout.write(`${page.markdown}\n`);
91
+ }
92
+ }
93
+ }
94
+ catch (error) {
95
+ printFailure(error, json);
96
+ process.exitCode = 1;
97
+ }
98
+ //# sourceMappingURL=docs-bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-bin.js","sourceRoot":"","sources":["../../src/docs/docs-bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type RunningKvman } from '../running/running-kvman.ts';
2
+ /** A docs page. */
3
+ export type DocsPage = {
4
+ extension: string;
5
+ topic: string;
6
+ title: string;
7
+ markdown: string;
8
+ };
9
+ /** Reads one docs page. */
10
+ export declare function readDocsPage(running: RunningKvman | undefined, extension: string, topic: string): Promise<DocsPage>;
11
+ //# sourceMappingURL=docs-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-get.d.ts","sourceRoot":"","sources":["../../src/docs/docs-get.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMvF,mBAAmB;AACnB,MAAM,MAAM,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAS7F,2BAA2B;AAC3B,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiCzH"}
@@ -0,0 +1,54 @@
1
+ import { ProblemError, extensionInfoSchema, z } from '@kvman/sdk';
2
+ import { readBuiltInGuide } from "./built-in-guides.js";
3
+ import { callQuery } from "../running/call-query.js";
4
+ import { KvmanUnreachableError } from "../running/running-kvman.js";
5
+ import { BinFailure } from "../bin/bin-failure.js";
6
+ const docsPageSchema = z.strictObject({ topic: z.string(), title: z.string(), markdown: z.string() });
7
+ const extensionsListSchema = z.array(extensionInfoSchema);
8
+ function notRunning(extension) {
9
+ return new BinFailure('NOT_RUNNING', `kvman isn't running; start it to read ${extension}'s docs.`);
10
+ }
11
+ /** Reads one docs page. */
12
+ export async function readDocsPage(running, extension, topic) {
13
+ if (extension === 'kvman') {
14
+ const guide = readBuiltInGuide(topic);
15
+ if (guide === undefined)
16
+ throw new BinFailure('NOT_FOUND', `kvman has no guide on ${topic}.`);
17
+ return { extension: guide.extension, topic: guide.topic, title: guide.title, markdown: guide.markdown };
18
+ }
19
+ if (running === undefined)
20
+ throw notRunning(extension);
21
+ let extensions;
22
+ try {
23
+ extensions = await callQuery(running, 'kernel.extensions.list', {}, extensionsListSchema);
24
+ }
25
+ catch (error) {
26
+ if (error instanceof KvmanUnreachableError)
27
+ throw notRunning(extension);
28
+ throw error;
29
+ }
30
+ const documented = extensions.find((entry) => entry.name === extension);
31
+ if (documented === undefined)
32
+ throw new BinFailure('NOT_FOUND', `${extension} isn't loaded or doesn't serve docs.`);
33
+ const servesDocs = [`${documented.namespace}.docs.list`, `${documented.namespace}.docs.get`].every((wanted) => documented.queries.some((query) => query.name === wanted && query.public));
34
+ if (!servesDocs)
35
+ throw new BinFailure('NOT_FOUND', `${extension} isn't loaded or doesn't serve docs.`);
36
+ const namespace = documented.namespace;
37
+ try {
38
+ const page = await callQuery(running, `${namespace}.docs.get`, { topic }, docsPageSchema);
39
+ return { extension, topic: page.topic, title: page.title, markdown: page.markdown };
40
+ }
41
+ catch (error) {
42
+ if (error instanceof KvmanUnreachableError)
43
+ throw notRunning(extension);
44
+ if (error instanceof ProblemError && (error.problem.code === 'NOT_FOUND' || error.problem.code.endsWith('/NOT_FOUND'))) {
45
+ throw new BinFailure('NOT_FOUND', error.problem.message);
46
+ }
47
+ if (error instanceof ProblemError)
48
+ throw new Error(`${error.problem.code}: ${error.problem.message}`);
49
+ if (error instanceof z.ZodError)
50
+ throw new Error(`${namespace}.docs.get answered something other than a page.`);
51
+ throw error;
52
+ }
53
+ }
54
+ //# sourceMappingURL=docs-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-get.js","sourceRoot":"","sources":["../../src/docs/docs-get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Problem } from '@kvman/sdk';
2
+ import { type RunningKvman } from '../running/running-kvman.ts';
3
+ /** A docs page in the listing. */
4
+ export type DocsListPage = {
5
+ extension: string;
6
+ topic: string;
7
+ title: string;
8
+ };
9
+ /** An extension whose docs failed, with its Problem. */
10
+ export type DocsListProblem = {
11
+ extension: string;
12
+ problem: Problem;
13
+ };
14
+ /** The listing: the pages, the per-extension problems, and whether a kvman answered. */
15
+ export type DocsListing = {
16
+ pages: DocsListPage[];
17
+ problems: DocsListProblem[];
18
+ running: boolean;
19
+ };
20
+ /** Lists the docs pages, reading only the built-in guides when no kvman runs. */
21
+ export declare function listDocsPages(running: RunningKvman | undefined): Promise<DocsListing>;
22
+ //# sourceMappingURL=docs-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-list.d.ts","sourceRoot":"","sources":["../../src/docs/docs-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKvF,kCAAkC;AAClC,MAAM,MAAM,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,wDAAwD;AACxD,MAAM,MAAM,eAAe,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE,wFAAwF;AACxF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAcnG,iFAAiF;AACjF,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CA6B3F"}
@@ -0,0 +1,51 @@
1
+ import { ProblemError, extensionInfoSchema, z } from '@kvman/sdk';
2
+ import { listBuiltInGuides } from "./built-in-guides.js";
3
+ import { callQuery } from "../running/call-query.js";
4
+ import { KvmanUnreachableError } from "../running/running-kvman.js";
5
+ const docsListSchema = z.array(z.strictObject({ topic: z.string(), title: z.string() }));
6
+ const extensionsListSchema = z.array(extensionInfoSchema);
7
+ function documented(extensions) {
8
+ return extensions
9
+ .filter((extension) => [`${extension.namespace}.docs.list`, `${extension.namespace}.docs.get`].every((wanted) => extension.queries.some((query) => query.name === wanted && query.public)))
10
+ .map((extension) => ({ name: extension.name, namespace: extension.namespace }))
11
+ .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
12
+ }
13
+ /** Lists the docs pages, reading only the built-in guides when no kvman runs. */
14
+ export async function listDocsPages(running) {
15
+ const builtIn = listBuiltInGuides().map((guide) => ({ extension: guide.extension, topic: guide.topic, title: guide.title }));
16
+ if (running === undefined)
17
+ return { pages: builtIn, problems: [], running: false };
18
+ let extensions;
19
+ try {
20
+ extensions = await callQuery(running, 'kernel.extensions.list', {}, extensionsListSchema);
21
+ }
22
+ catch (error) {
23
+ if (error instanceof KvmanUnreachableError)
24
+ return { pages: builtIn, problems: [], running: false };
25
+ throw error;
26
+ }
27
+ const pages = [...builtIn];
28
+ const problems = [];
29
+ for (const extension of documented(extensions)) {
30
+ let entries;
31
+ try {
32
+ entries = await callQuery(running, `${extension.namespace}.docs.list`, {}, docsListSchema);
33
+ }
34
+ catch (error) {
35
+ if (error instanceof KvmanUnreachableError)
36
+ return { pages: builtIn, problems: [], running: false };
37
+ if (error instanceof ProblemError) {
38
+ problems.push({ extension: extension.name, problem: error.problem });
39
+ continue;
40
+ }
41
+ if (!(error instanceof z.ZodError))
42
+ throw error;
43
+ problems.push({ extension: extension.name, problem: { code: 'VALIDATION_FAILED', message: `${extension.namespace}.docs.list answered something other than a list of pages.` } });
44
+ continue;
45
+ }
46
+ for (const entry of entries)
47
+ pages.push({ extension: extension.name, topic: entry.topic, title: entry.title });
48
+ }
49
+ return { pages, problems, running: true };
50
+ }
51
+ //# sourceMappingURL=docs-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-list.js","sourceRoot":"","sources":["../../src/docs/docs-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Clock } from '@kvman/kernel';
2
+ /** The test kernel's clock: it moves only when a test advances it. */
3
+ export type TestClock = {
4
+ /** The current fake time, in milliseconds since the epoch. */
5
+ now(): number;
6
+ /** Moves the time forward, firing due retries and schedules, and resolves once no job is running or due. */
7
+ advance(milliseconds: number): Promise<void>;
8
+ };
9
+ export type FakeClock = {
10
+ kernelClock: Clock;
11
+ testClock: TestClock;
12
+ settleWith(settle: () => Promise<void>): void;
13
+ moveWhileStopped(milliseconds: number): void;
14
+ };
15
+ export declare function createFakeClock(start: number): FakeClock;
16
+ //# sourceMappingURL=fake-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-clock.d.ts","sourceRoot":"","sources":["../src/fake-clock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG;IACtB,8DAA8D;IAC9D,GAAG,IAAI,MAAM,CAAC;IACd,4GAA4G;IAC5G,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAIF,MAAM,MAAM,SAAS,GAAG;IAAE,WAAW,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAIlK,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CA4CxD"}
@@ -0,0 +1,47 @@
1
+ // Each advance fires the due timers one by one, letting the kernel settle after each, so work that a timer starts and
2
+ // the timers that work sets (a retry's backoff, a cron's next run) are seen within the same advance (ADR 0009, 15).
3
+ export function createFakeClock(start) {
4
+ let time = start;
5
+ let order = 0;
6
+ let timers = [];
7
+ let settle = async () => undefined;
8
+ const nextDue = (until) => timers.filter((timer) => timer.at <= until).sort((left, right) => left.at - right.at || left.order - right.order)[0];
9
+ const kernelClock = {
10
+ now: () => time,
11
+ setTimer: (delayMs, run) => {
12
+ order += 1;
13
+ const timer = { at: time + delayMs, order, run };
14
+ timers.push(timer);
15
+ return () => {
16
+ timers = timers.filter((entry) => entry !== timer);
17
+ };
18
+ },
19
+ };
20
+ return {
21
+ kernelClock,
22
+ testClock: {
23
+ now: () => time,
24
+ advance: async (milliseconds) => {
25
+ const target = time + milliseconds;
26
+ await settle();
27
+ for (let timer = nextDue(target); timer !== undefined; timer = nextDue(target)) {
28
+ const due = timer;
29
+ timers = timers.filter((entry) => entry !== due);
30
+ time = due.at;
31
+ due.run();
32
+ await settle();
33
+ }
34
+ time = target;
35
+ await settle();
36
+ },
37
+ },
38
+ settleWith: (next) => {
39
+ settle = next;
40
+ },
41
+ // A stopped kernel has cancelled its timers, so the time simply moves.
42
+ moveWhileStopped: (milliseconds) => {
43
+ time += milliseconds;
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=fake-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-clock.js","sourceRoot":"","sources":["../src/fake-clock.ts"],"names":[],"mappings":"AAcA,sHAAsH;AACtH,oHAAoH;AACpH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAY,EAAE,CAAC;IACzB,IAAI,MAAM,GAAwB,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,KAAa,EAAqB,EAAE,CACnD,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvH,MAAM,WAAW,GAAU;QACzB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;QACf,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;YACzB,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,GAAG,EAAE;gBACV,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACrD,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;IACF,OAAO;QACL,WAAW;QACX,SAAS,EAAE;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;YACf,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,YAAY,CAAC;gBACnC,MAAM,MAAM,EAAE,CAAC;gBACf,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/E,MAAM,GAAG,GAAG,KAAK,CAAC;oBAClB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;oBACjD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;oBACd,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,MAAM,MAAM,EAAE,CAAC;gBACjB,CAAC;gBACD,IAAI,GAAG,MAAM,CAAC;gBACd,MAAM,MAAM,EAAE,CAAC;YACjB,CAAC;SACF;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,uEAAuE;QACvE,gBAAgB,EAAE,CAAC,YAAY,EAAE,EAAE;YACjC,IAAI,IAAI,YAAY,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,55 @@
1
+ /** A tool call: its arguments in one piece, or as the pieces of their JSON text (which together are valid JSON). */
2
+ export type FakeToolCall = {
3
+ id: string;
4
+ name: string;
5
+ } & ({
6
+ arguments: Record<string, unknown>;
7
+ } | {
8
+ argumentPieces: readonly string[];
9
+ });
10
+ /** A piece of a scripted stream: text, thinking, a tool call, or a pause until the promise settles. */
11
+ export type FakeChunk = {
12
+ text: string;
13
+ } | {
14
+ thinking: string;
15
+ } | {
16
+ toolCall: FakeToolCall;
17
+ } | {
18
+ wait: Promise<void>;
19
+ };
20
+ /** The tokens the fake server reports, counted as pi-ai counts them: `input` excludes cache reads and writes. */
21
+ export type FakeUsage = {
22
+ input: number;
23
+ output: number;
24
+ cacheRead?: number;
25
+ cacheWrite?: number;
26
+ };
27
+ /** One scripted answer: a stream (its finish defaults to `tool_calls` when it calls a tool, else `stop`), or an error. */
28
+ export type FakeReply = {
29
+ chunks: readonly FakeChunk[];
30
+ finish?: 'stop' | 'length' | 'tool_calls';
31
+ usage?: FakeUsage;
32
+ } | {
33
+ status: number;
34
+ body: unknown;
35
+ };
36
+ /** A request the fake server got; `state` becomes `aborted` when the client closes it before the answer ends. */
37
+ export type FakeRequest = {
38
+ authorization: string | undefined;
39
+ body: unknown;
40
+ state: 'answering' | 'answered' | 'aborted';
41
+ };
42
+ /** The fake server. */
43
+ export type FakeOpenAI = {
44
+ /** The base URL to add as a provider's `baseUrl`. */
45
+ baseUrl: string;
46
+ /** Queues replies; each answers the next request. */
47
+ reply(...replies: FakeReply[]): void;
48
+ /** Every request so far, oldest first. */
49
+ requests(): readonly FakeRequest[];
50
+ /** Stops the server and drops open connections. */
51
+ close(): Promise<void>;
52
+ };
53
+ /** Starts a fake OpenAI-compatible streaming server on 127.0.0.1 for LLM tests. */
54
+ export declare function startFakeOpenAI(): Promise<FakeOpenAI>;
55
+ //# sourceMappingURL=fake-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-openai.d.ts","sourceRoot":"","sources":["../src/fake-openai.ts"],"names":[],"mappings":"AAKA,oHAAoH;AACpH,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAE3I,uGAAuG;AACvG,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAEvH,iHAAiH;AACjH,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,0HAA0H;AAC1H,MAAM,MAAM,SAAS,GACjB;IAAE,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAC9F;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtC,iHAAiH;AACjH,MAAM,MAAM,WAAW,GAAG;IAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC;AAE5H,uBAAuB;AACvB,MAAM,MAAM,UAAU,GAAG;IACvB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,0CAA0C;IAC1C,QAAQ,IAAI,SAAS,WAAW,EAAE,CAAC;IACnC,mDAAmD;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAwFF,mFAAmF;AACnF,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CAuB3D"}