@project-ava-supernova/core 0.2.71 → 0.2.73

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 (171) hide show
  1. package/dist/agent/agent.d.ts.map +1 -1
  2. package/dist/agent/agent.js +138 -38
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/mode-tags.d.ts +72 -0
  5. package/dist/agent/mode-tags.d.ts.map +1 -0
  6. package/dist/agent/mode-tags.js +84 -0
  7. package/dist/agent/mode-tags.js.map +1 -0
  8. package/dist/agent/system-prompt.d.ts +16 -2
  9. package/dist/agent/system-prompt.d.ts.map +1 -1
  10. package/dist/agent/system-prompt.js +178 -24
  11. package/dist/agent/system-prompt.js.map +1 -1
  12. package/dist/brainstorm/brainstorm-store.d.ts +42 -0
  13. package/dist/brainstorm/brainstorm-store.d.ts.map +1 -0
  14. package/dist/brainstorm/brainstorm-store.js +164 -0
  15. package/dist/brainstorm/brainstorm-store.js.map +1 -0
  16. package/dist/brainstorm/types.d.ts +64 -0
  17. package/dist/brainstorm/types.d.ts.map +1 -0
  18. package/dist/brainstorm/types.js +20 -0
  19. package/dist/brainstorm/types.js.map +1 -0
  20. package/dist/config/project.d.ts.map +1 -1
  21. package/dist/config/project.js +3 -1
  22. package/dist/config/project.js.map +1 -1
  23. package/dist/config/schema.d.ts +13 -0
  24. package/dist/config/schema.d.ts.map +1 -1
  25. package/dist/config/schema.js.map +1 -1
  26. package/dist/dataset/capture.d.ts.map +1 -1
  27. package/dist/dataset/capture.js +6 -14
  28. package/dist/dataset/capture.js.map +1 -1
  29. package/dist/history/conversation-title.d.ts +5 -4
  30. package/dist/history/conversation-title.d.ts.map +1 -1
  31. package/dist/history/conversation-title.js +6 -19
  32. package/dist/history/conversation-title.js.map +1 -1
  33. package/dist/i18n/locales/ar.d.ts.map +1 -1
  34. package/dist/i18n/locales/ar.js +41 -13
  35. package/dist/i18n/locales/ar.js.map +1 -1
  36. package/dist/i18n/locales/de.d.ts.map +1 -1
  37. package/dist/i18n/locales/de.js +41 -13
  38. package/dist/i18n/locales/de.js.map +1 -1
  39. package/dist/i18n/locales/en.d.ts +38 -10
  40. package/dist/i18n/locales/en.d.ts.map +1 -1
  41. package/dist/i18n/locales/en.js +41 -13
  42. package/dist/i18n/locales/en.js.map +1 -1
  43. package/dist/i18n/locales/es.d.ts.map +1 -1
  44. package/dist/i18n/locales/es.js +41 -13
  45. package/dist/i18n/locales/es.js.map +1 -1
  46. package/dist/i18n/locales/fr.d.ts.map +1 -1
  47. package/dist/i18n/locales/fr.js +41 -13
  48. package/dist/i18n/locales/fr.js.map +1 -1
  49. package/dist/i18n/locales/hi.d.ts.map +1 -1
  50. package/dist/i18n/locales/hi.js +41 -13
  51. package/dist/i18n/locales/hi.js.map +1 -1
  52. package/dist/i18n/locales/id.d.ts.map +1 -1
  53. package/dist/i18n/locales/id.js +41 -13
  54. package/dist/i18n/locales/id.js.map +1 -1
  55. package/dist/i18n/locales/it.d.ts.map +1 -1
  56. package/dist/i18n/locales/it.js +41 -13
  57. package/dist/i18n/locales/it.js.map +1 -1
  58. package/dist/i18n/locales/ja.d.ts.map +1 -1
  59. package/dist/i18n/locales/ja.js +41 -13
  60. package/dist/i18n/locales/ja.js.map +1 -1
  61. package/dist/i18n/locales/ko.d.ts.map +1 -1
  62. package/dist/i18n/locales/ko.js +41 -13
  63. package/dist/i18n/locales/ko.js.map +1 -1
  64. package/dist/i18n/locales/nl.d.ts.map +1 -1
  65. package/dist/i18n/locales/nl.js +41 -13
  66. package/dist/i18n/locales/nl.js.map +1 -1
  67. package/dist/i18n/locales/pl.d.ts.map +1 -1
  68. package/dist/i18n/locales/pl.js +41 -13
  69. package/dist/i18n/locales/pl.js.map +1 -1
  70. package/dist/i18n/locales/pt.d.ts.map +1 -1
  71. package/dist/i18n/locales/pt.js +41 -13
  72. package/dist/i18n/locales/pt.js.map +1 -1
  73. package/dist/i18n/locales/ru.d.ts.map +1 -1
  74. package/dist/i18n/locales/ru.js +41 -13
  75. package/dist/i18n/locales/ru.js.map +1 -1
  76. package/dist/i18n/locales/th.d.ts.map +1 -1
  77. package/dist/i18n/locales/th.js +41 -13
  78. package/dist/i18n/locales/th.js.map +1 -1
  79. package/dist/i18n/locales/tr.d.ts.map +1 -1
  80. package/dist/i18n/locales/tr.js +41 -13
  81. package/dist/i18n/locales/tr.js.map +1 -1
  82. package/dist/i18n/locales/uk.d.ts.map +1 -1
  83. package/dist/i18n/locales/uk.js +41 -13
  84. package/dist/i18n/locales/uk.js.map +1 -1
  85. package/dist/i18n/locales/vi.d.ts.map +1 -1
  86. package/dist/i18n/locales/vi.js +41 -13
  87. package/dist/i18n/locales/vi.js.map +1 -1
  88. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  89. package/dist/i18n/locales/zh-CN.js +41 -13
  90. package/dist/i18n/locales/zh-CN.js.map +1 -1
  91. package/dist/i18n/locales/zh-TW.d.ts.map +1 -1
  92. package/dist/i18n/locales/zh-TW.js +41 -13
  93. package/dist/i18n/locales/zh-TW.js.map +1 -1
  94. package/dist/index.d.ts +5 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +7 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/journal/journal-manager.d.ts +22 -1
  99. package/dist/journal/journal-manager.d.ts.map +1 -1
  100. package/dist/journal/journal-manager.js +47 -2
  101. package/dist/journal/journal-manager.js.map +1 -1
  102. package/dist/personas/conductor.d.ts +11 -0
  103. package/dist/personas/conductor.d.ts.map +1 -1
  104. package/dist/personas/conductor.js +56 -12
  105. package/dist/personas/conductor.js.map +1 -1
  106. package/dist/personas/definitions.d.ts +15 -4
  107. package/dist/personas/definitions.d.ts.map +1 -1
  108. package/dist/personas/definitions.js +184 -19
  109. package/dist/personas/definitions.js.map +1 -1
  110. package/dist/personas/types.d.ts +1 -1
  111. package/dist/personas/types.d.ts.map +1 -1
  112. package/dist/projects/project-data.d.ts +73 -0
  113. package/dist/projects/project-data.d.ts.map +1 -0
  114. package/dist/projects/project-data.js +126 -0
  115. package/dist/projects/project-data.js.map +1 -0
  116. package/dist/projects/projects-home.d.ts +33 -0
  117. package/dist/projects/projects-home.d.ts.map +1 -0
  118. package/dist/projects/projects-home.js +43 -0
  119. package/dist/projects/projects-home.js.map +1 -0
  120. package/dist/projects/storage-categories.d.ts +45 -0
  121. package/dist/projects/storage-categories.d.ts.map +1 -0
  122. package/dist/projects/storage-categories.js +86 -0
  123. package/dist/projects/storage-categories.js.map +1 -0
  124. package/dist/social/index.d.ts +19 -4
  125. package/dist/social/index.d.ts.map +1 -1
  126. package/dist/tools/authoring/export-document.d.ts +45 -0
  127. package/dist/tools/authoring/export-document.d.ts.map +1 -0
  128. package/dist/tools/authoring/export-document.js +132 -0
  129. package/dist/tools/authoring/export-document.js.map +1 -0
  130. package/dist/tools/authoring/export-formats.d.ts +37 -0
  131. package/dist/tools/authoring/export-formats.d.ts.map +1 -0
  132. package/dist/tools/authoring/export-formats.js +50 -0
  133. package/dist/tools/authoring/export-formats.js.map +1 -0
  134. package/dist/tools/authoring/index.d.ts +6 -1
  135. package/dist/tools/authoring/index.d.ts.map +1 -1
  136. package/dist/tools/authoring/index.js +9 -0
  137. package/dist/tools/authoring/index.js.map +1 -1
  138. package/dist/tools/authoring/render-odf.d.ts +22 -0
  139. package/dist/tools/authoring/render-odf.d.ts.map +1 -0
  140. package/dist/tools/authoring/render-odf.js +604 -0
  141. package/dist/tools/authoring/render-odf.js.map +1 -0
  142. package/dist/tools/authoring/zip.d.ts +33 -0
  143. package/dist/tools/authoring/zip.d.ts.map +1 -0
  144. package/dist/tools/authoring/zip.js +125 -0
  145. package/dist/tools/authoring/zip.js.map +1 -0
  146. package/dist/tools/brainstorm-session.d.ts +29 -0
  147. package/dist/tools/brainstorm-session.d.ts.map +1 -0
  148. package/dist/tools/brainstorm-session.js +184 -0
  149. package/dist/tools/brainstorm-session.js.map +1 -0
  150. package/dist/tools/document-author.d.ts +1 -1
  151. package/dist/tools/document-author.d.ts.map +1 -1
  152. package/dist/tools/document-author.js +22 -5
  153. package/dist/tools/document-author.js.map +1 -1
  154. package/dist/tools/security.d.ts +25 -0
  155. package/dist/tools/security.d.ts.map +1 -1
  156. package/dist/tools/security.js +35 -0
  157. package/dist/tools/security.js.map +1 -1
  158. package/dist/tools/suggest-beats.d.ts.map +1 -1
  159. package/dist/tools/suggest-beats.js +3 -2
  160. package/dist/tools/suggest-beats.js.map +1 -1
  161. package/dist/tools/tool-registry.d.ts.map +1 -1
  162. package/dist/tools/tool-registry.js +4 -0
  163. package/dist/tools/tool-registry.js.map +1 -1
  164. package/dist/tools/verification-trust.d.ts +2 -2
  165. package/dist/tools/verification-trust.d.ts.map +1 -1
  166. package/dist/tools/verification-trust.js +11 -13
  167. package/dist/tools/verification-trust.js.map +1 -1
  168. package/dist/tools/write-video-post.d.ts.map +1 -1
  169. package/dist/tools/write-video-post.js +89 -13
  170. package/dist/tools/write-video-post.js.map +1 -1
  171. package/package.json +26 -1
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Where Ava's per-project data lives, and which project it belongs to.
3
+ *
4
+ * `~/.ava/projects/<hash>/` holds what Ava knows about a project — verification
5
+ * trust, brainstorm sessions — keyed by a hash of the project's path. Note what
6
+ * that is NOT: it is not where projects live. The user's code is wherever they
7
+ * made it. A row in the storage bar called "Projects" pointing here would say
8
+ * something false.
9
+ *
10
+ * Two things brought this module into being.
11
+ *
12
+ * The hash was implemented TWICE — `projectHash` in brainstorm-store.ts and
13
+ * `cwdHash` in verification-trust.ts — byte-identical and independently
14
+ * maintained. They agree today. If either drifted, the same project would
15
+ * silently split into two folders and Ava would lose her trust history and her
16
+ * brainstorming for it, with nothing failing loudly enough to notice.
17
+ *
18
+ * And the hash is ONE-WAY. Nothing recorded which path produced it, so Ava
19
+ * could never answer "which projects do I know about?" — you could only ask
20
+ * about a project you already had in your hand. `project.json` fixes that: the
21
+ * directory now says what it belongs to.
22
+ */
23
+ import { projectsHomeFrom, DEFAULT_PROJECTS_DIRNAME } from './projects-home.js';
24
+ export { projectsHomeFrom, DEFAULT_PROJECTS_DIRNAME };
25
+ /** Ava's data root. */
26
+ export declare function avaHome(): string;
27
+ /**
28
+ * The folder new projects are created in.
29
+ *
30
+ * `~/Ava Projects` unless the user has pointed `preferences.projectsHome`
31
+ * somewhere else. Visible on purpose, and deliberately NOT under `~/.ava` —
32
+ * that is application data and it is hidden; source code in a dotfolder gets
33
+ * lost and gets skipped by backup tools.
34
+ *
35
+ * Resolved here rather than in each surface so the IDE, the extension and the
36
+ * CLI cannot disagree about where a project went. That is the mistake this
37
+ * module already exists to correct once.
38
+ */
39
+ export declare function projectsHome(configured?: string | null): string;
40
+ /**
41
+ * Stable id for a project path.
42
+ *
43
+ * Canonicalised first so a trailing slash or Windows drive-letter casing
44
+ * cannot produce separate buckets for one project.
45
+ */
46
+ export declare function projectHash(projectPath: string): string;
47
+ /** Directory holding Ava's data for one project. Does not create it. */
48
+ export declare function projectDataDir(projectPath: string, globalDir?: string): string;
49
+ /** What `project.json` records — the path the hash was made from. */
50
+ export interface ProjectRecord {
51
+ version: 1;
52
+ /** Absolute path, as resolved when first seen. */
53
+ path: string;
54
+ firstSeenAt: string;
55
+ lastSeenAt: string;
56
+ }
57
+ /**
58
+ * Ensure the project's data directory exists and knows which project it is.
59
+ *
60
+ * Called by anything about to write per-project data. Cheap and idempotent:
61
+ * an existing record only has its `lastSeenAt` refreshed, so a project that
62
+ * moved keeps its original first-seen date rather than looking new.
63
+ */
64
+ export declare function ensureProjectData(projectPath: string, globalDir?: string): Promise<string>;
65
+ /**
66
+ * Every project Ava has data for, newest-seen first.
67
+ *
68
+ * Skips directories with no `project.json` — those predate this record and
69
+ * their path is genuinely unrecoverable, the hash being one-way. They are not
70
+ * an error; they are simply not listable.
71
+ */
72
+ export declare function listKnownProjects(globalDir?: string): Promise<ProjectRecord[]>;
73
+ //# sourceMappingURL=project-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-data.d.ts","sourceRoot":"","sources":["../../src/projects/project-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;AAEtD,uBAAuB;AACvB,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBhG;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoBpF"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Where Ava's per-project data lives, and which project it belongs to.
3
+ *
4
+ * `~/.ava/projects/<hash>/` holds what Ava knows about a project — verification
5
+ * trust, brainstorm sessions — keyed by a hash of the project's path. Note what
6
+ * that is NOT: it is not where projects live. The user's code is wherever they
7
+ * made it. A row in the storage bar called "Projects" pointing here would say
8
+ * something false.
9
+ *
10
+ * Two things brought this module into being.
11
+ *
12
+ * The hash was implemented TWICE — `projectHash` in brainstorm-store.ts and
13
+ * `cwdHash` in verification-trust.ts — byte-identical and independently
14
+ * maintained. They agree today. If either drifted, the same project would
15
+ * silently split into two folders and Ava would lose her trust history and her
16
+ * brainstorming for it, with nothing failing loudly enough to notice.
17
+ *
18
+ * And the hash is ONE-WAY. Nothing recorded which path produced it, so Ava
19
+ * could never answer "which projects do I know about?" — you could only ask
20
+ * about a project you already had in your hand. `project.json` fixes that: the
21
+ * directory now says what it belongs to.
22
+ */
23
+ import { createHash } from 'node:crypto';
24
+ import { homedir } from 'node:os';
25
+ import { join, resolve } from 'node:path';
26
+ import { mkdir, readFile, writeFile, readdir } from 'node:fs/promises';
27
+ // The path rule itself lives in a dependency-free leaf, because the IDE
28
+ // renderer needs the same answer and cannot import node:fs.
29
+ import { projectsHomeFrom, DEFAULT_PROJECTS_DIRNAME } from './projects-home.js';
30
+ export { projectsHomeFrom, DEFAULT_PROJECTS_DIRNAME };
31
+ /** Ava's data root. */
32
+ export function avaHome() {
33
+ return join(homedir(), '.ava');
34
+ }
35
+ /**
36
+ * The folder new projects are created in.
37
+ *
38
+ * `~/Ava Projects` unless the user has pointed `preferences.projectsHome`
39
+ * somewhere else. Visible on purpose, and deliberately NOT under `~/.ava` —
40
+ * that is application data and it is hidden; source code in a dotfolder gets
41
+ * lost and gets skipped by backup tools.
42
+ *
43
+ * Resolved here rather than in each surface so the IDE, the extension and the
44
+ * CLI cannot disagree about where a project went. That is the mistake this
45
+ * module already exists to correct once.
46
+ */
47
+ export function projectsHome(configured) {
48
+ return projectsHomeFrom(homedir(), configured);
49
+ }
50
+ /**
51
+ * Stable id for a project path.
52
+ *
53
+ * Canonicalised first so a trailing slash or Windows drive-letter casing
54
+ * cannot produce separate buckets for one project.
55
+ */
56
+ export function projectHash(projectPath) {
57
+ const canonical = resolve(projectPath).replace(/[\\/]+$/, '').toLowerCase();
58
+ return createHash('sha256').update(canonical).digest('hex').slice(0, 16);
59
+ }
60
+ /** Directory holding Ava's data for one project. Does not create it. */
61
+ export function projectDataDir(projectPath, globalDir) {
62
+ return join(globalDir ?? avaHome(), 'projects', projectHash(projectPath));
63
+ }
64
+ /**
65
+ * Ensure the project's data directory exists and knows which project it is.
66
+ *
67
+ * Called by anything about to write per-project data. Cheap and idempotent:
68
+ * an existing record only has its `lastSeenAt` refreshed, so a project that
69
+ * moved keeps its original first-seen date rather than looking new.
70
+ */
71
+ export async function ensureProjectData(projectPath, globalDir) {
72
+ const dir = projectDataDir(projectPath, globalDir);
73
+ await mkdir(dir, { recursive: true });
74
+ const file = join(dir, 'project.json');
75
+ const now = new Date().toISOString();
76
+ let record = {
77
+ version: 1,
78
+ path: resolve(projectPath),
79
+ firstSeenAt: now,
80
+ lastSeenAt: now,
81
+ };
82
+ try {
83
+ const existing = JSON.parse(await readFile(file, 'utf8'));
84
+ if (existing?.firstSeenAt)
85
+ record = { ...record, firstSeenAt: existing.firstSeenAt };
86
+ }
87
+ catch { /* first time, or unreadable — rewrite it */ }
88
+ // Best-effort: failing to record the path must never stop the caller from
89
+ // doing the work it actually came here for.
90
+ try {
91
+ await writeFile(file, JSON.stringify(record, null, 2), 'utf8');
92
+ }
93
+ catch { /* ignore */ }
94
+ return dir;
95
+ }
96
+ /**
97
+ * Every project Ava has data for, newest-seen first.
98
+ *
99
+ * Skips directories with no `project.json` — those predate this record and
100
+ * their path is genuinely unrecoverable, the hash being one-way. They are not
101
+ * an error; they are simply not listable.
102
+ */
103
+ export async function listKnownProjects(globalDir) {
104
+ const root = join(globalDir ?? avaHome(), 'projects');
105
+ let entries;
106
+ try {
107
+ entries = (await readdir(root, { withFileTypes: true }))
108
+ .filter((e) => e.isDirectory())
109
+ .map((e) => e.name);
110
+ }
111
+ catch {
112
+ return [];
113
+ }
114
+ const records = [];
115
+ for (const hash of entries) {
116
+ try {
117
+ const raw = await readFile(join(root, hash, 'project.json'), 'utf8');
118
+ const rec = JSON.parse(raw);
119
+ if (rec?.path)
120
+ records.push(rec);
121
+ }
122
+ catch { /* pre-record directory, or unreadable */ }
123
+ }
124
+ return records.sort((a, b) => (b.lastSeenAt ?? '').localeCompare(a.lastSeenAt ?? ''));
125
+ }
126
+ //# sourceMappingURL=project-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-data.js","sourceRoot":"","sources":["../../src/projects/project-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvE,wEAAwE;AACxE,4DAA4D;AAC5D,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;AAEtD,uBAAuB;AACvB,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,UAA0B;IACrD,OAAO,gBAAgB,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5E,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,SAAkB;IACpE,OAAO,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5E,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,SAAkB;IAC7E,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,MAAM,GAAkB;QAC1B,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC;QAC1B,WAAW,EAAE,GAAG;QAChB,UAAU,EAAE,GAAG;KAChB,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAA2B,CAAC;QACpF,IAAI,QAAQ,EAAE,WAAW;YAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;IAExD,0EAA0E;IAC1E,4CAA4C;IAC5C,IAAI,CAAC;QAAC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAkB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;aACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YACrE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;YAC7C,IAAI,GAAG,EAAE,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Where new projects go — and nothing else.
3
+ *
4
+ * Dependency-free on purpose, like routing-modes.ts and the authoring format
5
+ * leaf. Four places need this answer and they do not share a runtime: core and
6
+ * the extension host are Node, the IDE renderer reaches the filesystem through
7
+ * Tauri, and the webviews have no filesystem at all. A file that imports
8
+ * nothing can be reached from all of them, so "where did Ava put my project?"
9
+ * has one answer instead of four that drift.
10
+ *
11
+ * The home directory is passed IN rather than read here, because that is the
12
+ * one thing each runtime discovers differently (`os.homedir()` in Node,
13
+ * `homeDir()` from Tauri in the renderer).
14
+ */
15
+ /**
16
+ * The default folder name, under the user's home directory.
17
+ *
18
+ * Visible on purpose, and deliberately NOT under `~/.ava`: that is application
19
+ * data and it is hidden. Source code in a dotfolder is a trap — people lose
20
+ * it, and backup tools routinely skip dotfolders.
21
+ */
22
+ export declare const DEFAULT_PROJECTS_DIRNAME = "Ava Projects";
23
+ /**
24
+ * Resolve the projects home.
25
+ *
26
+ * `configured` is `preferences.projectsHome` — an absolute path the user chose.
27
+ * Empty or unset means the default. A default, not a prison: developers have
28
+ * settled habits about `~/dev` or `D:\work`, and the point is to remove a
29
+ * decision from someone who does not yet have one, not to overrule someone
30
+ * who does.
31
+ */
32
+ export declare function projectsHomeFrom(homeDir: string, configured?: string | null): string;
33
+ //# sourceMappingURL=projects-home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-home.d.ts","sourceRoot":"","sources":["../../src/projects/projects-home.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AAQvD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIpF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Where new projects go — and nothing else.
3
+ *
4
+ * Dependency-free on purpose, like routing-modes.ts and the authoring format
5
+ * leaf. Four places need this answer and they do not share a runtime: core and
6
+ * the extension host are Node, the IDE renderer reaches the filesystem through
7
+ * Tauri, and the webviews have no filesystem at all. A file that imports
8
+ * nothing can be reached from all of them, so "where did Ava put my project?"
9
+ * has one answer instead of four that drift.
10
+ *
11
+ * The home directory is passed IN rather than read here, because that is the
12
+ * one thing each runtime discovers differently (`os.homedir()` in Node,
13
+ * `homeDir()` from Tauri in the renderer).
14
+ */
15
+ /**
16
+ * The default folder name, under the user's home directory.
17
+ *
18
+ * Visible on purpose, and deliberately NOT under `~/.ava`: that is application
19
+ * data and it is hidden. Source code in a dotfolder is a trap — people lose
20
+ * it, and backup tools routinely skip dotfolders.
21
+ */
22
+ export const DEFAULT_PROJECTS_DIRNAME = 'Ava Projects';
23
+ /** Join two path segments without caring which separator the platform uses. */
24
+ function joinPath(base, name) {
25
+ const sep = base.includes('\\') && !base.includes('/') ? '\\' : '/';
26
+ return base.replace(/[\\/]+$/, '') + sep + name;
27
+ }
28
+ /**
29
+ * Resolve the projects home.
30
+ *
31
+ * `configured` is `preferences.projectsHome` — an absolute path the user chose.
32
+ * Empty or unset means the default. A default, not a prison: developers have
33
+ * settled habits about `~/dev` or `D:\work`, and the point is to remove a
34
+ * decision from someone who does not yet have one, not to overrule someone
35
+ * who does.
36
+ */
37
+ export function projectsHomeFrom(homeDir, configured) {
38
+ const trimmed = configured?.trim();
39
+ if (trimmed)
40
+ return trimmed.replace(/[\\/]+$/, '');
41
+ return joinPath(homeDir, DEFAULT_PROJECTS_DIRNAME);
42
+ }
43
+ //# sourceMappingURL=projects-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-home.js","sourceRoot":"","sources":["../../src/projects/projects-home.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAEvD,+EAA+E;AAC/E,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,UAA0B;IAC1E,MAAM,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * What each thing in `~/.ava` counts as, and what the user is told it is.
3
+ *
4
+ * Dependency-free, and shared. The extension host and the IDE each carried
5
+ * their own copy of this map — same keys, same labels, same `categoryOf`,
6
+ * separately maintained. Adding one category to two files is how the two
7
+ * surfaces end up reporting a user's disk differently, which is a strange
8
+ * thing for a local-first product to do.
9
+ *
10
+ * The scanning itself stays per-surface: the host walks with `node:fs`, the
11
+ * IDE through Tauri. Only the rules live here.
12
+ */
13
+ /** Which half of the bar a category belongs to. */
14
+ export type StorageFamily = 'ava' | 'projects';
15
+ export declare const CATEGORY_LABEL: Record<string, string>;
16
+ /** Stable display order; largest-first is applied after, this breaks ties. */
17
+ export declare const CATEGORY_ORDER: string[];
18
+ /** Map a top-level entry name in `~/.ava` to a storage category. */
19
+ export declare function categoryOf(name: string): string;
20
+ /** What the user's projects folder costs. Measured separately from `~/.ava`,
21
+ * because it is their work rather than Ava's footprint — and because it is
22
+ * expensive enough that it cannot be measured on every render. */
23
+ export interface ProjectsUsage {
24
+ /** The projects home this figure describes. */
25
+ path: string;
26
+ bytes: number;
27
+ /** ISO timestamp. Shown to the user, because a cached number that does not
28
+ * say how old it is invites being read as live. */
29
+ measuredAt: string;
30
+ /** How many project folders were counted, when known. */
31
+ projectCount?: number;
32
+ }
33
+ /**
34
+ * Is a cached projects measurement worth reusing?
35
+ *
36
+ * A source tree is not a config folder — an Unreal project's `Intermediate`,
37
+ * `Binaries` and `DerivedDataCache` run to tens of gigabytes, and walking that
38
+ * on every page render would stall the UI every time. So the number is cached
39
+ * and shown with its age, and re-measured only on request or once it is stale.
40
+ */
41
+ export declare const PROJECTS_USAGE_TTL_MS: number;
42
+ export declare function isUsageStale(usage: ProjectsUsage | null | undefined, now?: number): boolean;
43
+ /** "measured 2h ago" — deliberately coarse; the point is age, not precision. */
44
+ export declare function measuredAgo(usage: ProjectsUsage | null | undefined, now?: number): string | null;
45
+ //# sourceMappingURL=storage-categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-categories.d.ts","sourceRoot":"","sources":["../../src/projects/storage-categories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAcjD,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,cAAc,UAG1B,CAAC;AAEF,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAW/C;AAED;;mEAEmE;AACnE,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;wDACoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,QAAqB,CAAC;AAExD,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,SAAa,GAAG,OAAO,CAI/F;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,IAAI,CAUpG"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * What each thing in `~/.ava` counts as, and what the user is told it is.
3
+ *
4
+ * Dependency-free, and shared. The extension host and the IDE each carried
5
+ * their own copy of this map — same keys, same labels, same `categoryOf`,
6
+ * separately maintained. Adding one category to two files is how the two
7
+ * surfaces end up reporting a user's disk differently, which is a strange
8
+ * thing for a local-first product to do.
9
+ *
10
+ * The scanning itself stays per-surface: the host walks with `node:fs`, the
11
+ * IDE through Tauri. Only the rules live here.
12
+ */
13
+ export const CATEGORY_LABEL = {
14
+ models: 'Models',
15
+ runtime: 'Runtime',
16
+ creative: 'Creative',
17
+ memory: 'Memory',
18
+ journal: 'Journal',
19
+ datasets: 'Datasets',
20
+ // NOT "Projects". `~/.ava/projects/` holds what Ava knows ABOUT a project —
21
+ // trust state, brainstorm sessions — keyed by a hash of its path. The user's
22
+ // code is wherever they made it. A row called "Projects" reading 1 KB would
23
+ // say something false about where their work lives.
24
+ projects: 'Project data',
25
+ backups: 'Old backups',
26
+ other: 'Other',
27
+ };
28
+ /** Stable display order; largest-first is applied after, this breaks ties. */
29
+ export const CATEGORY_ORDER = [
30
+ 'models', 'runtime', 'creative', 'memory', 'journal',
31
+ 'datasets', 'projects', 'backups', 'other',
32
+ ];
33
+ /** Map a top-level entry name in `~/.ava` to a storage category. */
34
+ export function categoryOf(name) {
35
+ const n = name.toLowerCase();
36
+ if (/backup/.test(n))
37
+ return 'backups';
38
+ if (n === 'models')
39
+ return 'models';
40
+ if (n === 'bin')
41
+ return 'runtime';
42
+ if (n === 'creative')
43
+ return 'creative';
44
+ if (n === 'memory' || n === 'memory.json' || n === 'memory.md' || n === 'embeddings' || n === 'graph.json')
45
+ return 'memory';
46
+ if (n === 'journal')
47
+ return 'journal';
48
+ if (n === 'datasets')
49
+ return 'datasets';
50
+ if (n === 'projects')
51
+ return 'projects';
52
+ return 'other';
53
+ }
54
+ /**
55
+ * Is a cached projects measurement worth reusing?
56
+ *
57
+ * A source tree is not a config folder — an Unreal project's `Intermediate`,
58
+ * `Binaries` and `DerivedDataCache` run to tens of gigabytes, and walking that
59
+ * on every page render would stall the UI every time. So the number is cached
60
+ * and shown with its age, and re-measured only on request or once it is stale.
61
+ */
62
+ export const PROJECTS_USAGE_TTL_MS = 6 * 60 * 60 * 1000; // 6 hours
63
+ export function isUsageStale(usage, now = Date.now()) {
64
+ if (!usage?.measuredAt)
65
+ return true;
66
+ const at = Date.parse(usage.measuredAt);
67
+ return Number.isNaN(at) || now - at > PROJECTS_USAGE_TTL_MS;
68
+ }
69
+ /** "measured 2h ago" — deliberately coarse; the point is age, not precision. */
70
+ export function measuredAgo(usage, now = Date.now()) {
71
+ if (!usage?.measuredAt)
72
+ return null;
73
+ const at = Date.parse(usage.measuredAt);
74
+ if (Number.isNaN(at))
75
+ return null;
76
+ const mins = Math.max(0, Math.floor((now - at) / 60000));
77
+ if (mins < 1)
78
+ return 'just now';
79
+ if (mins < 60)
80
+ return `${mins}m ago`;
81
+ const hours = Math.floor(mins / 60);
82
+ if (hours < 24)
83
+ return `${hours}h ago`;
84
+ return `${Math.floor(hours / 24)}d ago`;
85
+ }
86
+ //# sourceMappingURL=storage-categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-categories.js","sourceRoot":"","sources":["../../src/projects/storage-categories.ts"],"names":[],"mappings":"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"}
@@ -272,12 +272,27 @@ export interface Beat {
272
272
  /**
273
273
  * Does this story want SHOWING as well as saying?
274
274
  *
275
- * The one genuinely per-story judgement about medium: a demo, a before/after
276
- * or anything visual earns a video for Reels and Shorts; an argument or a
277
- * position usually does not. This decides whether the video platforms are on
278
- * by default, so the operator is not making that call five times a morning.
275
+ * The one genuinely per-story judgement about medium: would this land HARDER
276
+ * as a film than as text? Not only demos and before/afters a mood piece, a
277
+ * piece to camera, a scene that sets a feeling. It decides whether the video
278
+ * platforms are on by default, so the operator is not making that call five
279
+ * times a morning.
280
+ *
281
+ * It used to be rationed, on the reasoning that "a video nobody needed costs
282
+ * them an hour". That was true when a usable clip took three to five attempts.
283
+ * A clip now comes back first-time in a couple of minutes, so the question is
284
+ * which form the idea WANTS, not whether it has earned the effort.
279
285
  */
280
286
  needs_video?: boolean;
287
+ /**
288
+ * The shape the idea wants, when the FORM is the idea rather than a wrapper
289
+ * on it — "30s piece to camera", "15s held shot of the dish", "silent 30s
290
+ * scene, caption carries it".
291
+ *
292
+ * Present only when a beat really exists in one form. Most angles work as
293
+ * either and should leave this alone.
294
+ */
295
+ format?: string;
281
296
  }
282
297
  /**
283
298
  * Surface-injected sink for the day's suggested beats. The web/hub
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/social/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/social/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Export a stored document to a chosen format.
3
+ *
4
+ * The Library is where documents are kept, exported and opened, and both the
5
+ * extension and the IDE mount that same tab. This module is the shared body
6
+ * behind both mounts: one place that decides what can be exported, what the
7
+ * output is called, and what a failure says. Two hosts calling one function is
8
+ * the only version of "one feature, two mounts" that does not quietly drift.
9
+ *
10
+ * Only sources we can faithfully re-render are exportable. A `.docx` is not
11
+ * offered as an `.odt` here, because that is a conversion with fidelity loss
12
+ * dressed up as an export — the honest answer for an already-built file is
13
+ * Open or Reveal, not a second lossy copy of it.
14
+ */
15
+ import { type RenderTarget } from './export-formats.js';
16
+ export interface ExportRequest {
17
+ /** Absolute path of the source document. */
18
+ sourcePath: string;
19
+ format: RenderTarget;
20
+ /** Absolute output path. Defaults to the source's name with a new extension. */
21
+ outPath?: string;
22
+ loadDocx?: () => Promise<unknown>;
23
+ loadPdf?: () => Promise<unknown>;
24
+ }
25
+ export type ExportResult = {
26
+ ok: true;
27
+ path: string;
28
+ bytes: number;
29
+ } | {
30
+ ok: false;
31
+ error: string;
32
+ };
33
+ /** Where the export lands: beside its source, which is how `document_author
34
+ * build` already behaves, so an exported file stays in the Library. */
35
+ export declare function deriveExportPath(sourcePath: string, format: RenderTarget): string;
36
+ export declare function exportDocument(req: ExportRequest): Promise<ExportResult>;
37
+ /**
38
+ * RFC 4180 enough: quoted fields, doubled quotes, and — the case a
39
+ * split-on-newline parser gets wrong — newlines inside quoted fields.
40
+ */
41
+ export declare function parseCsv(raw: string): {
42
+ headers: string[];
43
+ rows: string[][];
44
+ };
45
+ //# sourceMappingURL=export-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-document.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/export-document.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC;wEACwE;AACxE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAOjF;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAoC9E;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;CAAE,CA8B7E"}