mister-wolf 2.18.5 → 2.20.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 (102) hide show
  1. package/README.md +12 -1
  2. package/README.ru.md +33 -14
  3. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  4. package/dist/adapters/cli/cli-entry.js +10 -1
  5. package/dist/adapters/cli/cli-entry.js.map +1 -1
  6. package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
  7. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  8. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
  9. package/dist/adapters/cli/commands/memory-sync.js +3 -0
  10. package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
  11. package/dist/adapters/cli/commands/memory-uninstall.d.ts.map +1 -1
  12. package/dist/adapters/cli/commands/memory-uninstall.js.map +1 -1
  13. package/dist/adapters/cli/commands/memory-upgrade.d.ts +274 -0
  14. package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
  15. package/dist/adapters/cli/commands/memory-upgrade.js +1354 -6
  16. package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
  17. package/dist/adapters/cli/commands/upgrade-projects.d.ts +19 -0
  18. package/dist/adapters/cli/commands/upgrade-projects.d.ts.map +1 -0
  19. package/dist/adapters/cli/commands/upgrade-projects.js +85 -0
  20. package/dist/adapters/cli/commands/upgrade-projects.js.map +1 -0
  21. package/dist/adapters/cli/report-renderer.d.ts +43 -0
  22. package/dist/adapters/cli/report-renderer.d.ts.map +1 -0
  23. package/dist/adapters/cli/report-renderer.js +184 -0
  24. package/dist/adapters/cli/report-renderer.js.map +1 -0
  25. package/dist/adapters/fs/projects-registry.d.ts +21 -0
  26. package/dist/adapters/fs/projects-registry.d.ts.map +1 -1
  27. package/dist/adapters/fs/projects-registry.js +54 -1
  28. package/dist/adapters/fs/projects-registry.js.map +1 -1
  29. package/dist/adapters/fs/update-map.d.ts +102 -0
  30. package/dist/adapters/fs/update-map.d.ts.map +1 -0
  31. package/dist/adapters/fs/update-map.js +95 -0
  32. package/dist/adapters/fs/update-map.js.map +1 -0
  33. package/dist/adapters/fs/upgrade-lock.d.ts +23 -0
  34. package/dist/adapters/fs/upgrade-lock.d.ts.map +1 -0
  35. package/dist/adapters/fs/upgrade-lock.js +59 -0
  36. package/dist/adapters/fs/upgrade-lock.js.map +1 -0
  37. package/dist/adapters/render/opencode/opencode-renderer.d.ts +45 -5
  38. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -1
  39. package/dist/adapters/render/opencode/opencode-renderer.js +434 -86
  40. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -1
  41. package/dist/adapters/render/stamp.d.ts +2 -0
  42. package/dist/adapters/render/stamp.d.ts.map +1 -1
  43. package/dist/adapters/render/stamp.js +9 -1
  44. package/dist/adapters/render/stamp.js.map +1 -1
  45. package/dist/adapters/render/sync-state.d.ts +15 -3
  46. package/dist/adapters/render/sync-state.d.ts.map +1 -1
  47. package/dist/adapters/render/sync-state.js +52 -8
  48. package/dist/adapters/render/sync-state.js.map +1 -1
  49. package/dist/app/use-cases/decisions.d.ts +247 -0
  50. package/dist/app/use-cases/decisions.d.ts.map +1 -0
  51. package/dist/app/use-cases/decisions.js +528 -0
  52. package/dist/app/use-cases/decisions.js.map +1 -0
  53. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  54. package/dist/app/use-cases/init-project.js +34 -1
  55. package/dist/app/use-cases/init-project.js.map +1 -1
  56. package/dist/app/use-cases/platform-mismatch.d.ts +2 -1
  57. package/dist/app/use-cases/platform-mismatch.d.ts.map +1 -1
  58. package/dist/app/use-cases/platform-mismatch.js.map +1 -1
  59. package/dist/app/use-cases/project-step.d.ts +71 -0
  60. package/dist/app/use-cases/project-step.d.ts.map +1 -0
  61. package/dist/app/use-cases/project-step.js +163 -0
  62. package/dist/app/use-cases/project-step.js.map +1 -0
  63. package/dist/app/use-cases/repair-platform.d.ts +2 -1
  64. package/dist/app/use-cases/repair-platform.d.ts.map +1 -1
  65. package/dist/app/use-cases/repair-platform.js.map +1 -1
  66. package/dist/app/use-cases/scan-unregistered.d.ts +25 -0
  67. package/dist/app/use-cases/scan-unregistered.d.ts.map +1 -0
  68. package/dist/app/use-cases/scan-unregistered.js +74 -0
  69. package/dist/app/use-cases/scan-unregistered.js.map +1 -0
  70. package/dist/app/use-cases/seed-base-playbooks.d.ts +10 -0
  71. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  72. package/dist/app/use-cases/seed-base-playbooks.js +54 -13
  73. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  74. package/dist/app/use-cases/sync-base-set.d.ts +4 -2
  75. package/dist/app/use-cases/sync-base-set.d.ts.map +1 -1
  76. package/dist/app/use-cases/sync-base-set.js +4 -2
  77. package/dist/app/use-cases/sync-base-set.js.map +1 -1
  78. package/dist/app/use-cases/uninstall.d.ts +2 -1
  79. package/dist/app/use-cases/uninstall.d.ts.map +1 -1
  80. package/dist/app/use-cases/uninstall.js.map +1 -1
  81. package/dist/app/use-cases/upgrade-projects.d.ts +91 -0
  82. package/dist/app/use-cases/upgrade-projects.d.ts.map +1 -0
  83. package/dist/app/use-cases/upgrade-projects.js +494 -0
  84. package/dist/app/use-cases/upgrade-projects.js.map +1 -0
  85. package/dist/app/use-cases/verify-against-map.d.ts +52 -0
  86. package/dist/app/use-cases/verify-against-map.d.ts.map +1 -0
  87. package/dist/app/use-cases/verify-against-map.js +189 -0
  88. package/dist/app/use-cases/verify-against-map.js.map +1 -0
  89. package/dist/domain/line-diff.d.ts +36 -0
  90. package/dist/domain/line-diff.d.ts.map +1 -0
  91. package/dist/domain/line-diff.js +175 -0
  92. package/dist/domain/line-diff.js.map +1 -0
  93. package/dist/domain/protect-key.d.ts +21 -0
  94. package/dist/domain/protect-key.d.ts.map +1 -0
  95. package/dist/domain/protect-key.js +112 -0
  96. package/dist/domain/protect-key.js.map +1 -0
  97. package/dist/ports/base-set-renderer.port.d.ts +62 -1
  98. package/dist/ports/base-set-renderer.port.d.ts.map +1 -1
  99. package/package.json +3 -2
  100. package/templates/.wolf/router.log +1 -1
  101. package/templates/base/AGENTS.md +6 -3
  102. package/update-map.json +204 -0
@@ -1,5 +1,5 @@
1
1
  import * as fs from 'fs/promises';
2
- import { mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { mkdirSync, readFileSync, realpathSync, writeFileSync } from 'fs';
3
3
  import { join } from 'path';
4
4
  import yaml from 'js-yaml';
5
5
  import { writeFileAtomic } from './markdown-memory-store.js';
@@ -33,6 +33,31 @@ export class ProjectsRegistry {
33
33
  const projects = doc?.projects;
34
34
  return Array.isArray(projects) ? projects : [];
35
35
  }
36
+ /**
37
+ * Строгая альтернатива list() для прохода upgrade (design «Гварды прохода»):
38
+ * файла нет (ENOENT) → пустой реестр штатно; битый yaml / ошибка чтения →
39
+ * throw — «реестр нечитаем» обязан отличаться от «реестр пуст» (exit 1 vs 0).
40
+ */
41
+ async listStrict() {
42
+ let raw;
43
+ try {
44
+ raw = await fs.readFile(this.file, 'utf-8');
45
+ }
46
+ catch (err) {
47
+ if (err.code === 'ENOENT')
48
+ return []; // реестра ещё нет
49
+ throw err;
50
+ }
51
+ let doc;
52
+ try {
53
+ doc = yaml.load(raw);
54
+ }
55
+ catch (err) {
56
+ throw new Error(`failed to read projects registry ${this.file}: ${err.message}`);
57
+ }
58
+ const projects = doc?.projects;
59
+ return Array.isArray(projects) ? projects : [];
60
+ }
36
61
  async register(path, schemaVersion) {
37
62
  const projects = await this.list();
38
63
  const existing = projects.find((p) => p.path === path);
@@ -100,4 +125,32 @@ export class ProjectsRegistry {
100
125
  await writeFileAtomic(this.file, body);
101
126
  }
102
127
  }
128
+ /**
129
+ * Дедуп списка проектов по fs.realpathSync(root) (design «Гварды прохода»):
130
+ * ручные правки yaml могут задублировать один проект symlink'ом/алиас-путём.
131
+ * Несуществующий путь realpath не резолвится — запись сохраняется как есть
132
+ * (missing-статус классифицирует проход, не дедуп).
133
+ */
134
+ export function dedupeByRealpath(projects) {
135
+ const seen = new Set();
136
+ const unique = [];
137
+ const duplicates = [];
138
+ for (const project of projects) {
139
+ let real;
140
+ try {
141
+ real = realpathSync(project.path);
142
+ }
143
+ catch {
144
+ unique.push(project);
145
+ continue;
146
+ }
147
+ if (seen.has(real))
148
+ duplicates.push(project);
149
+ else {
150
+ seen.add(real);
151
+ unique.push(project);
152
+ }
153
+ }
154
+ return { unique, duplicates };
155
+ }
103
156
  //# sourceMappingURL=projects-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects-registry.js","sourceRoot":"","sources":["../../../src/adapters/fs/projects-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects-registry.js","sourceRoot":"","sources":["../../../src/adapters/fs/projects-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAU7D;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAElD,IAAY,IAAI;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC,CAAC,2DAA2D;QACxE,CAAC;QACD,MAAM,QAAQ,GAAI,GAAqC,EAAE,QAAQ,CAAC;QAClE,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC,CAAC,kBAAkB;YACnF,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,QAAQ,GAAI,GAAqC,EAAE,QAAQ,CAAC;QAClE,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,aAAqB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,cAAc,KAAK,aAAa;gBAAE,OAAO,CAAC,0EAA0E;YACjI,QAAQ,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC,kDAAkD;QAC7F,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACH,oBAAoB,CAAC,IAAY,EAAE,aAAqB;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACjG,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,QAAQ;QACd,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC,CAAC,YAAY;YAC7E,MAAM,GAAG,CAAC,CAAC,mEAAmE;QAChF,CAAC;QACD,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC,CAAC,2DAA2D;QACxE,CAAC;QACD,MAAM,QAAQ,GAAI,GAAqC,EAAE,QAAQ,CAAC;QAClE,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,QAA6B;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AASD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA6B;IAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAwB,EAAE,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACxC,CAAC;YACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { z } from 'zod';
2
+ export declare const UpdateCategorySchema: z.ZodEnum<{
3
+ deprecated: "deprecated";
4
+ new: "new";
5
+ removed: "removed";
6
+ unchanged: "unchanged";
7
+ changed: "changed";
8
+ }>;
9
+ export type UpdateCategory = z.infer<typeof UpdateCategorySchema>;
10
+ export declare const FileKindSchema: z.ZodEnum<{
11
+ command: "command";
12
+ agent: "agent";
13
+ skill: "skill";
14
+ plugin: "plugin";
15
+ }>;
16
+ export type FileKind = z.infer<typeof FileKindSchema>;
17
+ export declare const FileEntrySchema: z.ZodObject<{
18
+ path: z.ZodString;
19
+ kind: z.ZodEnum<{
20
+ command: "command";
21
+ agent: "agent";
22
+ skill: "skill";
23
+ plugin: "plugin";
24
+ }>;
25
+ category: z.ZodEnum<{
26
+ deprecated: "deprecated";
27
+ new: "new";
28
+ removed: "removed";
29
+ unchanged: "unchanged";
30
+ changed: "changed";
31
+ }>;
32
+ }, z.core.$strip>;
33
+ export type FileEntry = z.infer<typeof FileEntrySchema>;
34
+ export declare const FaceEntrySchema: z.ZodObject<{
35
+ template: z.ZodString;
36
+ owner_skill: z.ZodString;
37
+ category: z.ZodEnum<{
38
+ deprecated: "deprecated";
39
+ new: "new";
40
+ removed: "removed";
41
+ unchanged: "unchanged";
42
+ changed: "changed";
43
+ }>;
44
+ seed: z.ZodBoolean;
45
+ }, z.core.$strip>;
46
+ export type FaceEntry = z.infer<typeof FaceEntrySchema>;
47
+ export declare const UpdateMapSchema: z.ZodObject<{
48
+ version: z.ZodString;
49
+ prev: z.ZodString;
50
+ files: z.ZodArray<z.ZodObject<{
51
+ path: z.ZodString;
52
+ kind: z.ZodEnum<{
53
+ command: "command";
54
+ agent: "agent";
55
+ skill: "skill";
56
+ plugin: "plugin";
57
+ }>;
58
+ category: z.ZodEnum<{
59
+ deprecated: "deprecated";
60
+ new: "new";
61
+ removed: "removed";
62
+ unchanged: "unchanged";
63
+ changed: "changed";
64
+ }>;
65
+ }, z.core.$strip>>;
66
+ faces: z.ZodArray<z.ZodObject<{
67
+ template: z.ZodString;
68
+ owner_skill: z.ZodString;
69
+ category: z.ZodEnum<{
70
+ deprecated: "deprecated";
71
+ new: "new";
72
+ removed: "removed";
73
+ unchanged: "unchanged";
74
+ changed: "changed";
75
+ }>;
76
+ seed: z.ZodBoolean;
77
+ }, z.core.$strip>>;
78
+ agents_md: z.ZodObject<{
79
+ category: z.ZodEnum<{
80
+ deprecated: "deprecated";
81
+ new: "new";
82
+ removed: "removed";
83
+ unchanged: "unchanged";
84
+ changed: "changed";
85
+ }>;
86
+ mode: z.ZodLiteral<"append-block">;
87
+ }, z.core.$strip>;
88
+ schema_migrations: z.ZodArray<z.ZodObject<{
89
+ from: z.ZodNumber;
90
+ to: z.ZodNumber;
91
+ }, z.core.$strip>>;
92
+ outside_v1: z.ZodArray<z.ZodString>;
93
+ }, z.core.$strip>;
94
+ export type UpdateMap = z.infer<typeof UpdateMapSchema>;
95
+ /** Сравнение полных версий X.Y.Z: -1 (a<b) | 0 | 1 (a>b). */
96
+ export declare function compareVersions(a: string, b: string): number;
97
+ /**
98
+ * Читает и валидирует update-map.json из корня пакета. Карта из будущего
99
+ * (version новее CLI) — честный отказ, не молчаливое использование.
100
+ */
101
+ export declare function loadUpdateMap(pkgRoot?: string): UpdateMap;
102
+ //# sourceMappingURL=update-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-map.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/update-map.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,oBAAoB;;;;;;EAAmE,CAAC;AACrG,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,cAAc;;;;;EAAkD,CAAC;AAC9E,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;iBAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe;;;;;;;;;;;iBAM1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5D;AAeD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAA6B,GAAG,SAAS,CA4B/E"}
@@ -0,0 +1,95 @@
1
+ // src/adapters/fs/update-map.ts
2
+ // T1 (волна 2.19.0, ADR-1): карта обновления — zod-схема wire-формата
3
+ // update-map.json (полный инвентарь состава релиза, корень пакета) и
4
+ // загрузчик из packageRoot. Путь в FileEntry/FaceEntry — относительно
5
+ // templates/ пакета: base/agents/*.md, base/skills/<name>/SKILL.md,
6
+ // base/commands/*.md, base/playbooks/*.md, opencode/plugins/* — те же
7
+ // корни, что обходит templateFiles() рендерера (opencode-renderer.ts).
8
+ import { readFileSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { z } from 'zod';
11
+ import { UserFacingError } from '../../domain/errors.js';
12
+ import { packageRoot as defaultPackageRoot } from '../render/templates-root.js';
13
+ /** Полный X.Y.Z — голые миноры запрещены (AGENTS.md). */
14
+ const SEMVER_RE = /^\d+\.\d+\.\d+$/;
15
+ export const UpdateCategorySchema = z.enum(['new', 'changed', 'unchanged', 'deprecated', 'removed']);
16
+ export const FileKindSchema = z.enum(['agent', 'skill', 'command', 'plugin']);
17
+ export const FileEntrySchema = z.object({
18
+ path: z.string().min(1),
19
+ kind: FileKindSchema,
20
+ category: UpdateCategorySchema,
21
+ });
22
+ export const FaceEntrySchema = z.object({
23
+ template: z.string().min(1),
24
+ owner_skill: z.string().min(1),
25
+ category: UpdateCategorySchema,
26
+ /** true = сеять недостающее лицо (seed-missing-only); false = репортить, не мутировать (deprecated). */
27
+ seed: z.boolean(),
28
+ });
29
+ export const UpdateMapSchema = z.object({
30
+ version: z.string().regex(SEMVER_RE),
31
+ prev: z.string().regex(SEMVER_RE),
32
+ /** ВСЕ файловые цели base-set — полный инвентарь, не компоновка дельт. */
33
+ files: z.array(FileEntrySchema),
34
+ faces: z.array(FaceEntrySchema),
35
+ agents_md: z.object({ category: UpdateCategorySchema, mode: z.literal('append-block') }),
36
+ /** Пусто = релиз без миграций схемы. */
37
+ schema_migrations: z.array(z.object({ from: z.number().int(), to: z.number().int() })),
38
+ /** Классы вне покрытия v1 — граница «не трогать чужое» объявлена явно. */
39
+ outside_v1: z.array(z.string()),
40
+ });
41
+ /** Сравнение полных версий X.Y.Z: -1 (a<b) | 0 | 1 (a>b). */
42
+ export function compareVersions(a, b) {
43
+ const pa = a.split('.').map(Number);
44
+ const pb = b.split('.').map(Number);
45
+ for (let i = 0; i < 3; i++) {
46
+ if (pa[i] !== pb[i])
47
+ return (pa[i] ?? 0) < (pb[i] ?? 0) ? -1 : 1;
48
+ }
49
+ return 0;
50
+ }
51
+ function readCliVersion(pkgRoot) {
52
+ let version;
53
+ try {
54
+ version = JSON.parse(readFileSync(join(pkgRoot, 'package.json'), 'utf8')).version;
55
+ }
56
+ catch {
57
+ throw new UserFacingError(`package.json not found or corrupted at ${pkgRoot}`);
58
+ }
59
+ if (typeof version !== 'string' || !SEMVER_RE.test(version)) {
60
+ throw new UserFacingError(`package.json at ${pkgRoot} has no valid X.Y.Z version`);
61
+ }
62
+ return version;
63
+ }
64
+ /**
65
+ * Читает и валидирует update-map.json из корня пакета. Карта из будущего
66
+ * (version новее CLI) — честный отказ, не молчаливое использование.
67
+ */
68
+ export function loadUpdateMap(pkgRoot = defaultPackageRoot()) {
69
+ const mapPath = join(pkgRoot, 'update-map.json');
70
+ let raw;
71
+ try {
72
+ raw = readFileSync(mapPath, 'utf8');
73
+ }
74
+ catch {
75
+ throw new UserFacingError(`update-map.json not found at ${mapPath} — reinstall the package`);
76
+ }
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(raw);
80
+ }
81
+ catch (err) {
82
+ throw new UserFacingError(`update-map.json is corrupted (invalid JSON): ${err instanceof Error ? err.message : String(err)}`);
83
+ }
84
+ const result = UpdateMapSchema.safeParse(parsed);
85
+ if (!result.success) {
86
+ const issue = result.error.issues[0];
87
+ throw new UserFacingError(`update-map.json is invalid at ${issue.path.join('.')}: ${issue.message}`);
88
+ }
89
+ const cliVersion = readCliVersion(pkgRoot);
90
+ if (compareVersions(result.data.version, cliVersion) > 0) {
91
+ throw new UserFacingError(`update-map.json version ${result.data.version} is newer than CLI ${cliVersion} — update wolf first`);
92
+ }
93
+ return result.data;
94
+ }
95
+ //# sourceMappingURL=update-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-map.js","sourceRoot":"","sources":["../../../src/adapters/fs/update-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TTL lock-файла параллельного upgrade (REQ-01/06): проход, убитый без
3
+ * release (SIGKILL/OOM), не должен блокировать следующие запуски навсегда —
4
+ * протухший lock перехватывается. 10 минут ≥ парковый бюджет N03.1 (≤40 с
5
+ * на 4 проекта) с запасом на медленные окружения.
6
+ */
7
+ export declare const LOCK_TTL_MS: number;
8
+ /**
9
+ * Lock-файл параллельного upgrade в ОС-tmp (механика в духе flock, но с
10
+ * TTL). Владелец — экземпляр в процессе: повторный acquire() тем же
11
+ * экземпляром идемпотентен; живой чужой lock → Error 'upgrade already
12
+ * running'; отсутствующий/протухший/битый — захватывается перезаписью.
13
+ */
14
+ export declare class UpgradeLock {
15
+ private readonly now;
16
+ private readonly dir;
17
+ private readonly held;
18
+ constructor(now?: () => number, dir?: string);
19
+ private file;
20
+ acquire(id: string): boolean;
21
+ release(id: string): void;
22
+ }
23
+ //# sourceMappingURL=upgrade-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-lock.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/upgrade-lock.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAiB,CAAC;AAE1C;;;;;GAKG;AACH,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;gBAGvB,GAAG,GAAE,MAAM,MAAiB,EAC5B,GAAG,GAAE,MAAiB;IAGzC,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAmB5B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAQ1B"}
@@ -0,0 +1,59 @@
1
+ import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
2
+ import { tmpdir } from 'os';
3
+ import { join } from 'path';
4
+ /**
5
+ * TTL lock-файла параллельного upgrade (REQ-01/06): проход, убитый без
6
+ * release (SIGKILL/OOM), не должен блокировать следующие запуски навсегда —
7
+ * протухший lock перехватывается. 10 минут ≥ парковый бюджет N03.1 (≤40 с
8
+ * на 4 проекта) с запасом на медленные окружения.
9
+ */
10
+ export const LOCK_TTL_MS = 10 * 60 * 1000;
11
+ /**
12
+ * Lock-файл параллельного upgrade в ОС-tmp (механика в духе flock, но с
13
+ * TTL). Владелец — экземпляр в процессе: повторный acquire() тем же
14
+ * экземпляром идемпотентен; живой чужой lock → Error 'upgrade already
15
+ * running'; отсутствующий/протухший/битый — захватывается перезаписью.
16
+ */
17
+ export class UpgradeLock {
18
+ now;
19
+ dir;
20
+ held = new Set();
21
+ constructor(now = Date.now, dir = tmpdir()) {
22
+ this.now = now;
23
+ this.dir = dir;
24
+ }
25
+ file(id) {
26
+ return join(this.dir, `${id}.lock`);
27
+ }
28
+ acquire(id) {
29
+ if (this.held.has(id))
30
+ return true; // тот же владелец — идемпотентно
31
+ let raw;
32
+ try {
33
+ raw = readFileSync(this.file(id), 'utf-8');
34
+ }
35
+ catch {
36
+ raw = undefined; // lock-файла нет — захват
37
+ }
38
+ if (raw !== undefined) {
39
+ const ts = Number(raw);
40
+ if (Number.isFinite(ts) && this.now() - ts < LOCK_TTL_MS)
41
+ throw new Error('upgrade already running');
42
+ // протухший (≥ TTL) или битый lock — перезаписываем
43
+ }
44
+ mkdirSync(this.dir, { recursive: true });
45
+ writeFileSync(this.file(id), String(this.now()));
46
+ this.held.add(id);
47
+ return true;
48
+ }
49
+ release(id) {
50
+ this.held.delete(id);
51
+ try {
52
+ unlinkSync(this.file(id));
53
+ }
54
+ catch {
55
+ // файла нет — уже снят
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=upgrade-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-lock.js","sourceRoot":"","sources":["../../../src/adapters/fs/upgrade-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAIH;IACA;IAJF,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,YACmB,MAAoB,IAAI,CAAC,GAAG,EAC5B,MAAc,MAAM,EAAE;QADtB,QAAG,GAAH,GAAG,CAAyB;QAC5B,QAAG,GAAH,GAAG,CAAmB;IACtC,CAAC;IAEI,IAAI,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,iCAAiC;QACrE,IAAI,GAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,SAAS,CAAC,CAAC,0BAA0B;QAC7C,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACrG,oDAAoD;QACtD,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import { BaseSetRenderer, ModelContext, RenderBaseSetOptions, RenderOutcome } from '../../../ports/base-set-renderer.port.js';
1
+ import { BaseSetRenderer, InspectOutcome, ModelContext, ProtectEntry, RenderBaseSetOptions, RenderOutcome, SyncBaseSetOptions } from '../../../ports/base-set-renderer.port.js';
2
2
  export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
3
3
  private readonly baseTemplatesRoot;
4
4
  private readonly opts;
@@ -12,19 +12,59 @@ export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
12
12
  private templateFiles;
13
13
  private walkAbs;
14
14
  renderBaseSet(baseDir: string, opts?: RenderBaseSetOptions): Promise<RenderOutcome[]>;
15
- syncBaseSet(baseDir: string, models?: ModelContext | 'omit'): Promise<{
15
+ syncBaseSet(baseDir: string, models?: ModelContext | 'omit', opts?: SyncBaseSetOptions): Promise<{
16
16
  outcomes: RenderOutcome[];
17
17
  orphaned: string[];
18
18
  }>;
19
+ /** Блочный режим AGENTS.md (§4.5): управляется только текст между маркерами;
20
+ * контент выше и ниже — байт-в-байт. protect у AGENTS.md не поддерживается.
21
+ * Штампованная цель с блоком (миграция 2.19.0 → 2.20.0, M-1) после замены
22
+ * блока получает штамп текущей базы и свидетель; `state` передаёт только
23
+ * init-ветка (блочный файл без штампа свидетеля не имеет). */
24
+ private syncAgentsBlock;
25
+ /** Штампованная цель с блоком: штамп приводится к текущей базе **на своём
26
+ * месте** (позицию задаёт `insertStamp` — после frontmatter, `---` остаётся
27
+ * первой строкой). Без нового регекса штампа (§4.4): канонический текст
28
+ * `renderStamp` заменяется строкой текущей базы; нестандартную запись штампа
29
+ * не переписываем (файл честно останется `mutated`). */
30
+ private restampAgents;
31
+ /** Свидетель после обновления блока: только если файл совпал с эталоном
32
+ * (EOL отличием не считается — проход приводит его правилом 7). Иначе
33
+ * локальный текст вне блока остаётся решением `mutated` и не перезаписывается. */
34
+ private recordAgentsBase;
35
+ /** T10 (REQ-08): read-only инспекция целей base-set — предикат того, что
36
+ * сделает syncBaseSet, БЕЗ записей (ни writeFileAtomic, ни saveSyncState):
37
+ * missing / protected / foreign (unstamped, wx-политика) / identical (в т.ч.
38
+ * штамп-дрейф: проходу нечего решать) / differs / mutated / kept. models по
39
+ * умолчанию 'omit' — паритет с syncBaseSet, чей исход и предсказываем. */
40
+ inspectBaseSet(baseDir: string, opts?: RenderBaseSetOptions): Promise<InspectOutcome[]>;
41
+ /** Реестр защит (§4.11, REQ-09): read-only обход каталогов base-set, включая
42
+ * файлы вне карты. AGENTS.md в реестр не входит — protect у него не поддерживается. */
43
+ listProtections(baseDir: string, base: string): Promise<ProtectEntry[]>;
44
+ /** Свежий рендер одного файла карты (эталон для `--show` и `behind`); null — вне карты. */
45
+ renderFreshFile(baseDir: string, rel: string, opts?: RenderBaseSetOptions): string | null;
46
+ /** Read-only инспекция AGENTS.md (§4.2) — по фактическим веткам управления:
47
+ * штампованный цельный файл — зона syncAgentsMd (сверка всего файла со
48
+ * штампом, mutated по свидетелю); без штампа — маркер-блок append-ветки
49
+ * init (синку не принадлежит, свидетеля не имеет); нет ни штампа, ни
50
+ * маркера — чужой файл на месте цели (wx-политика → foreign). */
51
+ private inspectAgentsMd;
19
52
  /** AGENTS.md — цель в КОРНЕ проекта (§4.2); шаблона нет — тихо нет исхода. */
20
53
  private agentsMdPaths;
21
54
  private agentsMdContent;
22
55
  /** Init-ветка AGENTS.md: create (wx + штамп) / marker-append / skip (D3). */
23
56
  private renderAgentsMd;
24
- /** Sync-ветка AGENTS.md: только штампованный цельный файл; append-блок синку не принадлежит. */
57
+ /** Sync-ветка AGENTS.md: только штампованный цельный файл; append-блок синку не принадлежит.
58
+ * protect у AGENTS.md не поддерживается (§4.5); правила 6/6.5/7 §4.3 действуют,
59
+ * включая take-on-mutated (6′) с бэкапом — механизм тот же, что у файлов карты (§4.12). */
25
60
  private syncAgentsMd;
61
+ /** Единый порядок решающих правил §4.3: missing → protect → unstamped →
62
+ * identical → штамп-дрейф → mutated → kept → rewrite. Режимы (sync/render/
63
+ * inspect) читают это решение и выполняют свою часть (запись или нет). */
64
+ private classify;
65
+ /** Свидетель записи: хэш нормализованного контента + происхождение + база (§4.2). */
66
+ private record;
67
+ private writeFresh;
26
68
  private renderContent;
27
- /** Пишет рендер и возвращает записанный контент (T010: хэш для sync-state). */
28
- private writeRendered;
29
69
  }
30
70
  //# sourceMappingURL=opencode-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-renderer.d.ts","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EAEf,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACd,MAAM,0CAA0C,CAAC;AAuBlD,qBAAa,uBAAwB,YAAW,eAAe;IAI3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,EAAE,SAAc;gBAGG,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE;QAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpF,OAAO,KAAK,UAAU,GAErB;IAED,gFAAgF;IAChF,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,OAAO;IASV,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA8CrF,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA8D7D,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,6EAA6E;YAC/D,cAAc;IAyB5B,gGAAgG;YAClF,YAAY;IA2C1B,OAAO,CAAC,aAAa;IASrB,+EAA+E;YACjE,aAAa;CAM5B"}
1
+ {"version":3,"file":"opencode-renderer.d.ts","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,eAAe,EAEf,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EACnB,MAAM,0CAA0C,CAAC;AAqFlD,qBAAa,uBAAwB,YAAW,eAAe;IAI3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,EAAE,SAAc;gBAGG,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE;QAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpF,OAAO,KAAK,UAAU,GAErB;IAED,gFAAgF;IAChF,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,OAAO;IASV,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA6DrF,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,EAC9B,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAoG7D;;;;mEAI+D;YACjD,eAAe;IA4C7B;;;;6DAIyD;IACzD,OAAO,CAAC,aAAa;IAQrB;;uFAEmF;IACnF,OAAO,CAAC,gBAAgB;IAKxB;;;;+EAI2E;IACrE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4C7F;4FACwF;IAClF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA8B7E,2FAA2F;IAC3F,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI;IAkBzF;;;;sEAIkE;IAClE,OAAO,CAAC,eAAe;IA2BvB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,6EAA6E;YAC/D,cAAc;IAmC5B;;gGAE4F;YAC9E,YAAY;IA8D1B;;+EAE2E;IAC3E,OAAO,CAAC,QAAQ;IAehB,qFAAqF;IACrF,OAAO,CAAC,MAAM;YAIA,UAAU;IAKxB,OAAO,CAAC,aAAa;CAQtB"}