studiograph 1.1.2 → 1.2.0-beta.1

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 (349) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +301 -10
  3. package/dist/agent/orchestrator.d.ts +17 -9
  4. package/dist/agent/orchestrator.js +142 -97
  5. package/dist/agent/orchestrator.js.map +1 -1
  6. package/dist/agent/prompts/system.md +186 -0
  7. package/dist/agent/skill-loader.d.ts +48 -0
  8. package/dist/agent/skill-loader.js +166 -0
  9. package/dist/agent/skill-loader.js.map +1 -0
  10. package/dist/agent/skills/enrich-entities.md +136 -0
  11. package/dist/agent/skills/entity-schema.md +502 -0
  12. package/dist/agent/skills/gather-context.md +46 -0
  13. package/dist/agent/skills/obsidian-source-setup.md +246 -0
  14. package/dist/agent/skills/skill-loader.d.ts +48 -0
  15. package/dist/agent/skills/skill-loader.js +166 -0
  16. package/dist/agent/skills/skill-loader.js.map +1 -0
  17. package/dist/agent/skills/sync-configuration.md +144 -0
  18. package/dist/agent/skills/sync-setup.md +68 -0
  19. package/dist/agent/tools/connector-tools.d.ts +37 -0
  20. package/dist/agent/tools/connector-tools.js +132 -0
  21. package/dist/agent/tools/connector-tools.js.map +1 -0
  22. package/dist/agent/tools/fs-tools.d.ts +39 -0
  23. package/dist/agent/tools/fs-tools.js +106 -0
  24. package/dist/agent/tools/fs-tools.js.map +1 -0
  25. package/dist/agent/tools/graph-tools.d.ts +30 -2
  26. package/dist/agent/tools/graph-tools.js +154 -37
  27. package/dist/agent/tools/graph-tools.js.map +1 -1
  28. package/dist/agent/tools/load-skill.d.ts +42 -0
  29. package/dist/agent/tools/load-skill.js +45 -0
  30. package/dist/agent/tools/load-skill.js.map +1 -0
  31. package/dist/agent/tools/sync-tools.d.ts +25 -0
  32. package/dist/agent/tools/sync-tools.js +691 -0
  33. package/dist/agent/tools/sync-tools.js.map +1 -0
  34. package/dist/agent/tools/tool-loader.d.ts +25 -0
  35. package/dist/agent/tools/tool-loader.js +73 -0
  36. package/dist/agent/tools/tool-loader.js.map +1 -0
  37. package/dist/auth/github.d.ts +11 -8
  38. package/dist/auth/github.js +56 -75
  39. package/dist/auth/github.js.map +1 -1
  40. package/dist/cli/colors.d.ts +54 -0
  41. package/dist/cli/colors.js +133 -0
  42. package/dist/cli/colors.js.map +1 -0
  43. package/dist/cli/commands/app.d.ts +7 -0
  44. package/dist/cli/commands/app.js +167 -0
  45. package/dist/cli/commands/app.js.map +1 -0
  46. package/dist/cli/commands/auth.d.ts +1 -1
  47. package/dist/cli/commands/auth.js +26 -10
  48. package/dist/cli/commands/auth.js.map +1 -1
  49. package/dist/cli/commands/clone.d.ts +9 -0
  50. package/dist/cli/commands/clone.js +167 -0
  51. package/dist/cli/commands/clone.js.map +1 -0
  52. package/dist/cli/commands/commit.d.ts +8 -0
  53. package/dist/cli/commands/commit.js +43 -0
  54. package/dist/cli/commands/commit.js.map +1 -0
  55. package/dist/cli/commands/config.d.ts +13 -0
  56. package/dist/cli/commands/config.js +276 -0
  57. package/dist/cli/commands/config.js.map +1 -0
  58. package/dist/cli/commands/connector.d.ts +33 -0
  59. package/dist/cli/commands/connector.js +178 -0
  60. package/dist/cli/commands/connector.js.map +1 -0
  61. package/dist/cli/commands/deploy.d.ts +11 -0
  62. package/dist/cli/commands/deploy.js +153 -0
  63. package/dist/cli/commands/deploy.js.map +1 -0
  64. package/dist/cli/commands/enrich.d.ts +11 -0
  65. package/dist/cli/commands/enrich.js +135 -0
  66. package/dist/cli/commands/enrich.js.map +1 -0
  67. package/dist/cli/commands/graphrag.d.ts +12 -0
  68. package/dist/cli/commands/graphrag.js +122 -0
  69. package/dist/cli/commands/graphrag.js.map +1 -0
  70. package/dist/cli/commands/index.d.ts +15 -0
  71. package/dist/cli/commands/index.js +117 -0
  72. package/dist/cli/commands/index.js.map +1 -0
  73. package/dist/cli/commands/init.js +110 -210
  74. package/dist/cli/commands/init.js.map +1 -1
  75. package/dist/cli/commands/join.js +89 -24
  76. package/dist/cli/commands/join.js.map +1 -1
  77. package/dist/cli/commands/lint.d.ts +8 -0
  78. package/dist/cli/commands/lint.js +70 -0
  79. package/dist/cli/commands/lint.js.map +1 -0
  80. package/dist/cli/commands/mcp.d.ts +27 -0
  81. package/dist/cli/commands/mcp.js +56 -0
  82. package/dist/cli/commands/mcp.js.map +1 -0
  83. package/dist/cli/commands/orphans.d.ts +8 -0
  84. package/dist/cli/commands/orphans.js +125 -0
  85. package/dist/cli/commands/orphans.js.map +1 -0
  86. package/dist/cli/commands/provision.d.ts +8 -0
  87. package/dist/cli/commands/provision.js +116 -0
  88. package/dist/cli/commands/provision.js.map +1 -0
  89. package/dist/cli/commands/r2.d.ts +2 -0
  90. package/dist/cli/commands/r2.js +87 -6
  91. package/dist/cli/commands/r2.js.map +1 -1
  92. package/dist/cli/commands/reset.d.ts +12 -0
  93. package/dist/cli/commands/reset.js +137 -0
  94. package/dist/cli/commands/reset.js.map +1 -0
  95. package/dist/cli/commands/review.d.ts +19 -0
  96. package/dist/cli/commands/review.js +128 -0
  97. package/dist/cli/commands/review.js.map +1 -0
  98. package/dist/cli/commands/serve.js +47 -2
  99. package/dist/cli/commands/serve.js.map +1 -1
  100. package/dist/cli/commands/source.d.ts +16 -0
  101. package/dist/cli/commands/source.js +159 -0
  102. package/dist/cli/commands/source.js.map +1 -0
  103. package/dist/cli/commands/start.js +472 -103
  104. package/dist/cli/commands/start.js.map +1 -1
  105. package/dist/cli/commands/sync-entities.d.ts +13 -0
  106. package/dist/cli/commands/sync-entities.js +242 -0
  107. package/dist/cli/commands/sync-entities.js.map +1 -0
  108. package/dist/cli/commands/sync.js +40 -9
  109. package/dist/cli/commands/sync.js.map +1 -1
  110. package/dist/cli/commands/update.d.ts +8 -0
  111. package/dist/cli/commands/update.js +155 -0
  112. package/dist/cli/commands/update.js.map +1 -0
  113. package/dist/cli/index.js +114 -3
  114. package/dist/cli/index.js.map +1 -1
  115. package/dist/cli/scaffolding.d.ts +10 -0
  116. package/dist/cli/scaffolding.js +302 -0
  117. package/dist/cli/scaffolding.js.map +1 -0
  118. package/dist/cli/setup-wizard.d.ts +30 -0
  119. package/dist/cli/setup-wizard.js +244 -0
  120. package/dist/cli/setup-wizard.js.map +1 -0
  121. package/dist/cli/sync-review-interactive.d.ts +31 -0
  122. package/dist/cli/sync-review-interactive.js +393 -0
  123. package/dist/cli/sync-review-interactive.js.map +1 -0
  124. package/dist/cli/theme.d.ts +31 -0
  125. package/dist/cli/theme.js +116 -0
  126. package/dist/cli/theme.js.map +1 -0
  127. package/dist/core/graph.d.ts +16 -9
  128. package/dist/core/graph.js +263 -145
  129. package/dist/core/graph.js.map +1 -1
  130. package/dist/core/migration-runner.d.ts +42 -0
  131. package/dist/core/migration-runner.js +232 -0
  132. package/dist/core/migration-runner.js.map +1 -0
  133. package/dist/core/migration-types.d.ts +101 -0
  134. package/dist/core/migration-types.js +21 -0
  135. package/dist/core/migration-types.js.map +1 -0
  136. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
  137. package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
  138. package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
  139. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
  140. package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
  141. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
  142. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
  143. package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
  144. package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
  145. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
  146. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
  147. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
  148. package/dist/core/migrations/index.d.ts +11 -0
  149. package/dist/core/migrations/index.js +23 -0
  150. package/dist/core/migrations/index.js.map +1 -0
  151. package/dist/core/schema-registry.d.ts +36 -0
  152. package/dist/core/schema-registry.js +161 -0
  153. package/dist/core/schema-registry.js.map +1 -0
  154. package/dist/core/types.d.ts +242 -3
  155. package/dist/core/types.js +21 -2
  156. package/dist/core/types.js.map +1 -1
  157. package/dist/core/user-config.d.ts +16 -0
  158. package/dist/core/user-config.js +8 -0
  159. package/dist/core/user-config.js.map +1 -1
  160. package/dist/core/validation.d.ts +973 -32
  161. package/dist/core/validation.js +163 -4
  162. package/dist/core/validation.js.map +1 -1
  163. package/dist/core/workspace-manager.d.ts +26 -2
  164. package/dist/core/workspace-manager.js +113 -15
  165. package/dist/core/workspace-manager.js.map +1 -1
  166. package/dist/core/workspace.d.ts +20 -11
  167. package/dist/core/workspace.js +123 -34
  168. package/dist/core/workspace.js.map +1 -1
  169. package/dist/mcp/connector-manager.d.ts +65 -0
  170. package/dist/mcp/connector-manager.js +223 -0
  171. package/dist/mcp/connector-manager.js.map +1 -0
  172. package/dist/mcp/connectors/asana.d.ts +2 -0
  173. package/dist/mcp/connectors/asana.js +20 -0
  174. package/dist/mcp/connectors/asana.js.map +1 -0
  175. package/dist/mcp/connectors/definitions.d.ts +45 -0
  176. package/dist/mcp/connectors/definitions.js +32 -0
  177. package/dist/mcp/connectors/definitions.js.map +1 -0
  178. package/dist/mcp/connectors/figma.d.ts +5 -0
  179. package/dist/mcp/connectors/figma.js +21 -0
  180. package/dist/mcp/connectors/figma.js.map +1 -0
  181. package/dist/mcp/connectors/gdrive.d.ts +2 -0
  182. package/dist/mcp/connectors/gdrive.js +20 -0
  183. package/dist/mcp/connectors/gdrive.js.map +1 -0
  184. package/dist/mcp/connectors/granola.d.ts +2 -0
  185. package/dist/mcp/connectors/granola.js +12 -0
  186. package/dist/mcp/connectors/granola.js.map +1 -0
  187. package/dist/mcp/connectors/linear.d.ts +2 -0
  188. package/dist/mcp/connectors/linear.js +19 -0
  189. package/dist/mcp/connectors/linear.js.map +1 -0
  190. package/dist/mcp/connectors/obsidian.d.ts +2 -0
  191. package/dist/mcp/connectors/obsidian.js +19 -0
  192. package/dist/mcp/connectors/obsidian.js.map +1 -0
  193. package/dist/mcp/connectors/pipedrive.d.ts +2 -0
  194. package/dist/mcp/connectors/pipedrive.js +20 -0
  195. package/dist/mcp/connectors/pipedrive.js.map +1 -0
  196. package/dist/mcp/connectors/slack.d.ts +2 -0
  197. package/dist/mcp/connectors/slack.js +21 -0
  198. package/dist/mcp/connectors/slack.js.map +1 -0
  199. package/dist/mcp/oauth-provider.d.ts +41 -0
  200. package/dist/mcp/oauth-provider.js +160 -0
  201. package/dist/mcp/oauth-provider.js.map +1 -0
  202. package/dist/mcp/server.d.ts +11 -0
  203. package/dist/mcp/server.js +28 -0
  204. package/dist/mcp/server.js.map +1 -0
  205. package/dist/mcp/tools.d.ts +14 -0
  206. package/dist/mcp/tools.js +172 -0
  207. package/dist/mcp/tools.js.map +1 -0
  208. package/dist/server/index.js +17 -4
  209. package/dist/server/index.js.map +1 -1
  210. package/dist/server/plugin-loader.d.ts +15 -0
  211. package/dist/server/plugin-loader.js +68 -2
  212. package/dist/server/plugin-loader.js.map +1 -1
  213. package/dist/server/routes/graph-api.js +1 -1
  214. package/dist/server/routes/graph-api.js.map +1 -1
  215. package/dist/server/routes/webhook.js +33 -0
  216. package/dist/server/routes/webhook.js.map +1 -1
  217. package/dist/services/github-provisioner.d.ts +9 -3
  218. package/dist/services/github-provisioner.js +46 -8
  219. package/dist/services/github-provisioner.js.map +1 -1
  220. package/dist/services/lint-service.d.ts +27 -0
  221. package/dist/services/lint-service.js +83 -0
  222. package/dist/services/lint-service.js.map +1 -0
  223. package/dist/services/markdown.d.ts +9 -0
  224. package/dist/services/markdown.js +26 -5
  225. package/dist/services/markdown.js.map +1 -1
  226. package/dist/services/memory-service.d.ts +1 -2
  227. package/dist/services/memory-service.js +5 -4
  228. package/dist/services/memory-service.js.map +1 -1
  229. package/dist/services/orphan-service.d.ts +31 -0
  230. package/dist/services/orphan-service.js +100 -0
  231. package/dist/services/orphan-service.js.map +1 -0
  232. package/dist/services/sync/commit.d.ts +58 -0
  233. package/dist/services/sync/commit.js +350 -0
  234. package/dist/services/sync/commit.js.map +1 -0
  235. package/dist/services/sync/context-index.d.ts +69 -0
  236. package/dist/services/sync/context-index.js +280 -0
  237. package/dist/services/sync/context-index.js.map +1 -0
  238. package/dist/services/sync/derive.d.ts +34 -0
  239. package/dist/services/sync/derive.js +164 -0
  240. package/dist/services/sync/derive.js.map +1 -0
  241. package/dist/services/sync/enrichment-state.d.ts +31 -0
  242. package/dist/services/sync/enrichment-state.js +63 -0
  243. package/dist/services/sync/enrichment-state.js.map +1 -0
  244. package/dist/services/sync/enrichment.d.ts +25 -0
  245. package/dist/services/sync/enrichment.js +121 -0
  246. package/dist/services/sync/enrichment.js.map +1 -0
  247. package/dist/services/sync/frontmatter-extractor.d.ts +40 -0
  248. package/dist/services/sync/frontmatter-extractor.js +273 -0
  249. package/dist/services/sync/frontmatter-extractor.js.map +1 -0
  250. package/dist/services/sync/graph-match-state.d.ts +33 -0
  251. package/dist/services/sync/graph-match-state.js +61 -0
  252. package/dist/services/sync/graph-match-state.js.map +1 -0
  253. package/dist/services/sync/graph-match.d.ts +53 -0
  254. package/dist/services/sync/graph-match.js +316 -0
  255. package/dist/services/sync/graph-match.js.map +1 -0
  256. package/dist/services/sync/graphrag-client.d.ts +43 -0
  257. package/dist/services/sync/graphrag-client.js +94 -0
  258. package/dist/services/sync/graphrag-client.js.map +1 -0
  259. package/dist/services/sync/graphrag-config.d.ts +16 -0
  260. package/dist/services/sync/graphrag-config.js +39 -0
  261. package/dist/services/sync/graphrag-config.js.map +1 -0
  262. package/dist/services/sync/graphrag-context.d.ts +14 -0
  263. package/dist/services/sync/graphrag-context.js +109 -0
  264. package/dist/services/sync/graphrag-context.js.map +1 -0
  265. package/dist/services/sync/graphrag-indexer.d.ts +30 -0
  266. package/dist/services/sync/graphrag-indexer.js +358 -0
  267. package/dist/services/sync/graphrag-indexer.js.map +1 -0
  268. package/dist/services/sync/llm.d.ts +32 -0
  269. package/dist/services/sync/llm.js +115 -0
  270. package/dist/services/sync/llm.js.map +1 -0
  271. package/dist/services/sync/mcp-client.d.ts +59 -0
  272. package/dist/services/sync/mcp-client.js +285 -0
  273. package/dist/services/sync/mcp-client.js.map +1 -0
  274. package/dist/services/sync/model-factory.d.ts +10 -0
  275. package/dist/services/sync/model-factory.js +24 -0
  276. package/dist/services/sync/model-factory.js.map +1 -0
  277. package/dist/services/sync/name-quality.d.ts +31 -0
  278. package/dist/services/sync/name-quality.js +60 -0
  279. package/dist/services/sync/name-quality.js.map +1 -0
  280. package/dist/services/sync/output-schemas.d.ts +92 -0
  281. package/dist/services/sync/output-schemas.js +43 -0
  282. package/dist/services/sync/output-schemas.js.map +1 -0
  283. package/dist/services/sync/prompts.d.ts +19 -0
  284. package/dist/services/sync/prompts.js +128 -0
  285. package/dist/services/sync/prompts.js.map +1 -0
  286. package/dist/services/sync/reconciler.d.ts +48 -0
  287. package/dist/services/sync/reconciler.js +295 -0
  288. package/dist/services/sync/reconciler.js.map +1 -0
  289. package/dist/services/sync/source-config.d.ts +45 -0
  290. package/dist/services/sync/source-config.js +208 -0
  291. package/dist/services/sync/source-config.js.map +1 -0
  292. package/dist/services/sync/source-definitions/asana.d.ts +15 -0
  293. package/dist/services/sync/source-definitions/asana.js +48 -0
  294. package/dist/services/sync/source-definitions/asana.js.map +1 -0
  295. package/dist/services/sync/source-definitions/definitions.d.ts +21 -0
  296. package/dist/services/sync/source-definitions/definitions.js +26 -0
  297. package/dist/services/sync/source-definitions/definitions.js.map +1 -0
  298. package/dist/services/sync/source-definitions/gdrive.d.ts +16 -0
  299. package/dist/services/sync/source-definitions/gdrive.js +68 -0
  300. package/dist/services/sync/source-definitions/gdrive.js.map +1 -0
  301. package/dist/services/sync/source-definitions/granola.d.ts +2 -0
  302. package/dist/services/sync/source-definitions/granola.js +28 -0
  303. package/dist/services/sync/source-definitions/granola.js.map +1 -0
  304. package/dist/services/sync/source-definitions/linear.d.ts +2 -0
  305. package/dist/services/sync/source-definitions/linear.js +60 -0
  306. package/dist/services/sync/source-definitions/linear.js.map +1 -0
  307. package/dist/services/sync/source-definitions/obsidian.d.ts +2 -0
  308. package/dist/services/sync/source-definitions/obsidian.js +55 -0
  309. package/dist/services/sync/source-definitions/obsidian.js.map +1 -0
  310. package/dist/services/sync/source-definitions/pipedrive.d.ts +2 -0
  311. package/dist/services/sync/source-definitions/pipedrive.js +52 -0
  312. package/dist/services/sync/source-definitions/pipedrive.js.map +1 -0
  313. package/dist/services/sync/staging.d.ts +53 -0
  314. package/dist/services/sync/staging.js +131 -0
  315. package/dist/services/sync/staging.js.map +1 -0
  316. package/dist/services/sync/structured-extractor.d.ts +49 -0
  317. package/dist/services/sync/structured-extractor.js +344 -0
  318. package/dist/services/sync/structured-extractor.js.map +1 -0
  319. package/dist/services/sync/sync-runner.d.ts +32 -0
  320. package/dist/services/sync/sync-runner.js +195 -0
  321. package/dist/services/sync/sync-runner.js.map +1 -0
  322. package/dist/services/sync/sync-state.d.ts +43 -0
  323. package/dist/services/sync/sync-state.js +154 -0
  324. package/dist/services/sync/sync-state.js.map +1 -0
  325. package/dist/services/sync/types.d.ts +203 -0
  326. package/dist/services/sync/types.js +8 -0
  327. package/dist/services/sync/types.js.map +1 -0
  328. package/dist/services/sync/unstructured-extractor.d.ts +29 -0
  329. package/dist/services/sync/unstructured-extractor.js +197 -0
  330. package/dist/services/sync/unstructured-extractor.js.map +1 -0
  331. package/dist/services/vector-service.d.ts +88 -0
  332. package/dist/services/vector-service.js +322 -0
  333. package/dist/services/vector-service.js.map +1 -0
  334. package/dist/utils/git.d.ts +26 -4
  335. package/dist/utils/git.js +55 -7
  336. package/dist/utils/git.js.map +1 -1
  337. package/dist/utils/merge-resolver.d.ts +34 -0
  338. package/dist/utils/merge-resolver.js +201 -0
  339. package/dist/utils/merge-resolver.js.map +1 -0
  340. package/dist/utils/preflight.d.ts +2 -1
  341. package/dist/utils/preflight.js +8 -1
  342. package/dist/utils/preflight.js.map +1 -1
  343. package/dist/utils/version-checker.d.ts +23 -0
  344. package/dist/utils/version-checker.js +116 -0
  345. package/dist/utils/version-checker.js.map +1 -0
  346. package/dist/utils/workspace-config.d.ts +8 -0
  347. package/dist/utils/workspace-config.js +22 -0
  348. package/dist/utils/workspace-config.js.map +1 -0
  349. package/package.json +24 -11
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Interactive review UI for `studiograph sync review`.
3
+ *
4
+ * Uses @clack/prompts for file selection and action menus,
5
+ * and sync-colors for colored diff output.
6
+ */
7
+ import { spawnSync } from 'child_process';
8
+ import { existsSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { select, intro, isCancel, cancel, log, confirm } from '@clack/prompts';
11
+ import { colorizeDiff, statusIcon, statusLabel, created, updated, error, header, count, dimText, entityRef } from './colors.js';
12
+ import { isGitRepo, gitHasUncommittedChanges } from '../utils/git.js';
13
+ import { commitRepos } from '../services/sync/commit.js';
14
+ // ── Diff mode detection ──────────────────────────────────────────────────────
15
+ export function detectDiffMode(workspacePath, repos) {
16
+ for (const repo of repos) {
17
+ const repoPath = join(workspacePath, repo.path);
18
+ if (!existsSync(repoPath) || !isGitRepo(repoPath))
19
+ continue;
20
+ if (gitHasUncommittedChanges(repoPath)) {
21
+ return 'uncommitted';
22
+ }
23
+ }
24
+ // Check if there are committed changes (HEAD vs HEAD~1)
25
+ for (const repo of repos) {
26
+ const repoPath = join(workspacePath, repo.path);
27
+ if (!existsSync(repoPath) || !isGitRepo(repoPath))
28
+ continue;
29
+ const result = spawnSync('git', ['diff', '--name-status', 'HEAD~1..HEAD'], {
30
+ cwd: repoPath,
31
+ encoding: 'utf-8',
32
+ });
33
+ if (result.status === 0 && result.stdout.trim()) {
34
+ return 'committed';
35
+ }
36
+ }
37
+ return 'none';
38
+ }
39
+ // ── Collect changed files ────────────────────────────────────────────────────
40
+ export function collectChangedFiles(ctx) {
41
+ const files = [];
42
+ for (const repo of ctx.repos) {
43
+ const repoPath = join(ctx.workspacePath, repo.path);
44
+ if (!existsSync(repoPath) || !isGitRepo(repoPath))
45
+ continue;
46
+ const seen = new Set();
47
+ // Tracked changes (modified, deleted, staged adds)
48
+ const diffArgs = ctx.committed
49
+ ? ['diff', '--name-status', 'HEAD~1..HEAD']
50
+ : ['diff', '--name-status', 'HEAD'];
51
+ const result = spawnSync('git', diffArgs, { cwd: repoPath, encoding: 'utf-8' });
52
+ if (result.status === 0 && result.stdout.trim()) {
53
+ for (const line of result.stdout.trim().split('\n')) {
54
+ const match = line.match(/^([AMD])\t(.+)$/);
55
+ if (!match)
56
+ continue;
57
+ const [, statusChar, filePath] = match;
58
+ const parsed = parseEntityPath(filePath, repo.name);
59
+ if (!parsed)
60
+ continue;
61
+ seen.add(filePath);
62
+ files.push({ ...parsed, path: join(repoPath, filePath), repoPath, status: statusChar });
63
+ }
64
+ }
65
+ // Untracked files (new files not yet git-added)
66
+ if (!ctx.committed) {
67
+ const untracked = spawnSync('git', ['ls-files', '--others', '--exclude-standard'], {
68
+ cwd: repoPath,
69
+ encoding: 'utf-8',
70
+ });
71
+ if (untracked.status === 0 && untracked.stdout.trim()) {
72
+ for (const filePath of untracked.stdout.trim().split('\n')) {
73
+ if (seen.has(filePath))
74
+ continue;
75
+ const parsed = parseEntityPath(filePath, repo.name);
76
+ if (!parsed)
77
+ continue;
78
+ seen.add(filePath);
79
+ files.push({ ...parsed, path: join(repoPath, filePath), repoPath, status: 'A' });
80
+ }
81
+ }
82
+ }
83
+ }
84
+ return files;
85
+ }
86
+ /**
87
+ * Parse a repo-relative file path into entity metadata.
88
+ * Supports:
89
+ * - Standard entities: <entity_id>/main.md
90
+ * - Sub-content: <parent_id>/<subfolder>/<file>.md
91
+ */
92
+ function parseEntityPath(filePath, repoName) {
93
+ if (!filePath.endsWith('.md'))
94
+ return null;
95
+ const parts = filePath.split('/');
96
+ if (parts.length < 2)
97
+ return null;
98
+ // Skip dotfiles and config
99
+ if (parts[0].startsWith('.'))
100
+ return null;
101
+ if (parts[parts.length - 1] === 'main.md') {
102
+ // Standard entity: <entity_id>/main.md
103
+ return {
104
+ relativePath: filePath,
105
+ repoName,
106
+ entityType: repoName,
107
+ entityId: parts[0],
108
+ };
109
+ }
110
+ // Sub-content: <parent_id>/<subfolder>/<file>.md
111
+ if (parts.length >= 3) {
112
+ const parentId = parts[0];
113
+ const subfolder = parts[1];
114
+ const fileName = parts[parts.length - 1].replace(/\.md$/, '');
115
+ return {
116
+ relativePath: filePath,
117
+ repoName,
118
+ entityType: subfolder,
119
+ entityId: fileName,
120
+ };
121
+ }
122
+ return null;
123
+ }
124
+ // ── Get diff for a single file ───────────────────────────────────────────────
125
+ export function getFileDiff(file, committed) {
126
+ const diffArgs = committed
127
+ ? ['diff', 'HEAD~1..HEAD', '--', file.relativePath]
128
+ : ['diff', 'HEAD', '--', file.relativePath];
129
+ const result = spawnSync('git', diffArgs, { cwd: file.repoPath, encoding: 'utf-8' });
130
+ if (result.status === 0 && result.stdout)
131
+ return result.stdout;
132
+ // Untracked file — show full content as a pseudo-diff
133
+ if (!committed && file.status === 'A') {
134
+ const noIndex = spawnSync('git', ['diff', '--no-index', '/dev/null', file.relativePath], {
135
+ cwd: file.repoPath,
136
+ encoding: 'utf-8',
137
+ });
138
+ if (noIndex.stdout)
139
+ return noIndex.stdout;
140
+ }
141
+ return '';
142
+ }
143
+ // ── Interactive review loop ──────────────────────────────────────────────────
144
+ export async function runInteractiveReview(ctx) {
145
+ const files = collectChangedFiles(ctx);
146
+ if (files.length === 0) {
147
+ log.info('No changes to review.');
148
+ return;
149
+ }
150
+ // Tally
151
+ const added = files.filter((f) => f.status === 'A').length;
152
+ const modified = files.filter((f) => f.status === 'M').length;
153
+ const deleted = files.filter((f) => f.status === 'D').length;
154
+ const modeParts = [];
155
+ if (added > 0)
156
+ modeParts.push(created(`${added} added`));
157
+ if (modified > 0)
158
+ modeParts.push(updated(`${modified} modified`));
159
+ if (deleted > 0)
160
+ modeParts.push(error(`${deleted} deleted`));
161
+ const modeLabel = ctx.committed ? dimText('(committed)') : dimText('(uncommitted)');
162
+ intro(`${header('Review')} — ${count(String(files.length))} files: ${modeParts.join(', ')} ${modeLabel}`);
163
+ // Unique entity types for filtering
164
+ const entityTypes = [...new Set(files.map((f) => f.entityType))].sort();
165
+ const hasMultipleStatuses = [added, modified, deleted].filter((n) => n > 0).length > 1;
166
+ // Main loop
167
+ while (true) {
168
+ // ── Main menu ──────────────────────────────────────────────────────────
169
+ const mainOptions = [
170
+ { value: '__browse__', label: 'Browse files', hint: `${files.length} files` },
171
+ ];
172
+ if (!ctx.committed) {
173
+ mainOptions.push({ value: '__actions__', label: 'Actions', hint: 'commit, abort' });
174
+ }
175
+ mainOptions.push({ value: '__exit__', label: 'Exit review' });
176
+ const mainChoice = await select({ message: 'Review', options: mainOptions });
177
+ if (isCancel(mainChoice)) {
178
+ cancel('Review cancelled.');
179
+ return;
180
+ }
181
+ if (mainChoice === '__exit__')
182
+ return;
183
+ // ── Actions submenu ────────────────────────────────────────────────────
184
+ if (mainChoice === '__actions__') {
185
+ const actionChoice = await select({
186
+ message: 'Actions',
187
+ options: [
188
+ { value: '__commit__', label: `${created('Commit all')}` },
189
+ { value: '__abort__', label: `${error('Abort all')}`, hint: 'discard all changes' },
190
+ { value: '__back__', label: 'Back' },
191
+ ],
192
+ });
193
+ if (isCancel(actionChoice) || actionChoice === '__back__')
194
+ continue;
195
+ if (actionChoice === '__commit__') {
196
+ const yes = await confirm({
197
+ message: `Commit all changes across ${ctx.repos.length} repos?`,
198
+ });
199
+ if (isCancel(yes) || !yes)
200
+ continue;
201
+ await commitRepos(ctx.workspacePath, (msg) => log.info(msg));
202
+ log.success('All changes committed.');
203
+ return;
204
+ }
205
+ if (actionChoice === '__abort__') {
206
+ const yes = await confirm({
207
+ message: `Discard ALL uncommitted changes (${files.length} files)? This cannot be undone.`,
208
+ });
209
+ if (isCancel(yes) || !yes)
210
+ continue;
211
+ for (const repo of ctx.repos) {
212
+ const repoPath = join(ctx.workspacePath, repo.path);
213
+ if (!existsSync(repoPath) || !isGitRepo(repoPath))
214
+ continue;
215
+ // Revert tracked changes
216
+ spawnSync('git', ['checkout', '.'], { cwd: repoPath, encoding: 'utf-8' });
217
+ // Remove untracked files
218
+ spawnSync('git', ['clean', '-fd'], { cwd: repoPath, encoding: 'utf-8' });
219
+ }
220
+ log.success('All changes discarded.');
221
+ return;
222
+ }
223
+ continue;
224
+ }
225
+ // ── Browse files submenu ───────────────────────────────────────────────
226
+ let statusFilter = null;
227
+ let typeFilter = null;
228
+ let showAllFiles = false;
229
+ browseLoop: while (true) {
230
+ let filteredFiles = files;
231
+ if (statusFilter)
232
+ filteredFiles = filteredFiles.filter((f) => f.status === statusFilter);
233
+ if (typeFilter)
234
+ filteredFiles = filteredFiles.filter((f) => f.entityType === typeFilter);
235
+ const options = [];
236
+ // View selector — shown when multiple statuses and no filter active
237
+ if (hasMultipleStatuses && !statusFilter && !typeFilter && !showAllFiles) {
238
+ options.push({ value: '__all__', label: `All files (${files.length})` });
239
+ if (modified > 0)
240
+ options.push({ value: '__modified__', label: `${updated('Modified only')} (${modified})` });
241
+ if (added > 0)
242
+ options.push({ value: '__added__', label: `${created('Added only')} (${added})` });
243
+ if (deleted > 0)
244
+ options.push({ value: '__deleted__', label: `${error('Deleted only')} (${deleted})` });
245
+ if (entityTypes.length > 1) {
246
+ options.push({ value: '__filter_type__', label: `Filter by type... (${entityTypes.length} types)` });
247
+ }
248
+ options.push({ value: '__back__', label: 'Back' });
249
+ }
250
+ else {
251
+ // File list mode
252
+ const filterParts = [];
253
+ if (statusFilter)
254
+ filterParts.push(statusLabel(statusFilter));
255
+ if (typeFilter)
256
+ filterParts.push(entityRef(typeFilter));
257
+ if (filterParts.length > 0 || showAllFiles) {
258
+ const hint = filterParts.length > 0 ? `${filterParts.join(', ')} (${filteredFiles.length})` : undefined;
259
+ options.push({ value: '__clear__', label: 'Back', hint });
260
+ }
261
+ else {
262
+ options.push({ value: '__back__', label: 'Back' });
263
+ }
264
+ if (!typeFilter && filteredFiles.length >= 20 && entityTypes.length > 1) {
265
+ options.push({ value: '__filter_type__', label: `Filter by type... (${entityTypes.length} types)` });
266
+ }
267
+ for (const file of filteredFiles) {
268
+ const icon = statusIcon(file.status);
269
+ const label = `${icon} ${file.repoName}/${entityRef(file.entityType)}/${file.entityId}`;
270
+ options.push({
271
+ value: file.path,
272
+ label,
273
+ hint: statusFilter ? undefined : statusLabel(file.status),
274
+ });
275
+ }
276
+ }
277
+ const message = statusFilter || typeFilter || showAllFiles
278
+ ? 'Select a file to review'
279
+ : 'Select a view';
280
+ const selected = await select({ message, options, maxItems: 15 });
281
+ if (isCancel(selected)) {
282
+ cancel('Review cancelled.');
283
+ return;
284
+ }
285
+ if (selected === '__back__') {
286
+ if (statusFilter || typeFilter || showAllFiles) {
287
+ // Go back to view selector
288
+ statusFilter = null;
289
+ typeFilter = null;
290
+ showAllFiles = false;
291
+ continue;
292
+ }
293
+ // Go back to main menu
294
+ break browseLoop;
295
+ }
296
+ if (selected === '__all__') {
297
+ showAllFiles = true;
298
+ continue;
299
+ }
300
+ if (selected === '__modified__') {
301
+ statusFilter = 'M';
302
+ typeFilter = null;
303
+ continue;
304
+ }
305
+ if (selected === '__added__') {
306
+ statusFilter = 'A';
307
+ typeFilter = null;
308
+ continue;
309
+ }
310
+ if (selected === '__deleted__') {
311
+ statusFilter = 'D';
312
+ typeFilter = null;
313
+ continue;
314
+ }
315
+ if (selected === '__clear__') {
316
+ statusFilter = null;
317
+ typeFilter = null;
318
+ showAllFiles = false;
319
+ continue;
320
+ }
321
+ if (selected === '__filter_type__') {
322
+ const typeChoice = await select({
323
+ message: 'Filter by entity type',
324
+ options: [
325
+ { value: '__all__', label: 'All types' },
326
+ ...entityTypes.map((t) => ({
327
+ value: t,
328
+ label: entityRef(t),
329
+ hint: `${files.filter((f) => f.entityType === t).length} files`,
330
+ })),
331
+ ],
332
+ });
333
+ if (isCancel(typeChoice))
334
+ continue;
335
+ typeFilter = typeChoice === '__all__' ? null : typeChoice;
336
+ continue;
337
+ }
338
+ // Show diff for selected file
339
+ const file = files.find((f) => f.path === selected);
340
+ if (!file)
341
+ continue;
342
+ const rawDiff = getFileDiff(file, ctx.committed);
343
+ if (!rawDiff) {
344
+ log.warn(`No diff available for ${file.relativePath}`);
345
+ continue;
346
+ }
347
+ console.log('');
348
+ console.log(header(`${file.repoName}/${file.entityType}/${file.entityId}`));
349
+ console.log(colorizeDiff(rawDiff));
350
+ // File action menu
351
+ const fileActionOptions = [
352
+ { value: 'back', label: 'Back to list' },
353
+ { value: 'edit', label: 'Open in editor' },
354
+ ];
355
+ if (!ctx.committed) {
356
+ fileActionOptions.push({ value: 'revert', label: error('Revert file') });
357
+ }
358
+ const action = await select({ message: 'Action', options: fileActionOptions });
359
+ if (isCancel(action) || action === 'back')
360
+ continue;
361
+ if (action === 'edit') {
362
+ const editor = process.env.VISUAL || process.env.EDITOR || 'vi';
363
+ spawnSync(editor, [file.path], { stdio: 'inherit' });
364
+ continue;
365
+ }
366
+ if (action === 'revert') {
367
+ const yes = await confirm({
368
+ message: `Revert ${file.entityType}/${file.entityId}? This cannot be undone.`,
369
+ });
370
+ if (isCancel(yes) || !yes)
371
+ continue;
372
+ const result = spawnSync('git', ['checkout', '--', file.relativePath], {
373
+ cwd: file.repoPath,
374
+ encoding: 'utf-8',
375
+ });
376
+ if (result.status === 0) {
377
+ log.success(`Reverted ${file.entityType}/${file.entityId}`);
378
+ const idx = files.indexOf(file);
379
+ if (idx >= 0)
380
+ files.splice(idx, 1);
381
+ if (files.length === 0) {
382
+ log.info('No more changes to review.');
383
+ return;
384
+ }
385
+ }
386
+ else {
387
+ log.error(`Revert failed: ${result.stderr?.trim()}`);
388
+ }
389
+ }
390
+ }
391
+ }
392
+ }
393
+ //# sourceMappingURL=sync-review-interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-review-interactive.js","sourceRoot":"","sources":["../../src/cli/sync-review-interactive.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChI,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAsBzD,gFAAgF;AAEhF,MAAM,UAAU,cAAc,CAAC,aAAqB,EAAE,KAA4C;IAChG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAAE,SAAS;QAE5D,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAAE,SAAS;QAE5D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAAE;YACzE,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB,CAAC,GAAkB;IACpD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAAE,SAAS;QAE5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,mDAAmD;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS;YAC5B,CAAC,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC5C,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACrB,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;gBACvC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAA6B,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE;gBACjF,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtD,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACjC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,IAAI,CAAC,MAAM;wBAAE,SAAS;oBACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACnB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAgB;IACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,2BAA2B;IAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1C,uCAAuC;QACvC,OAAO;YACL,YAAY,EAAE,QAAQ;YACtB,QAAQ;YACR,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;SACnB,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9D,OAAO;YACL,YAAY,EAAE,QAAQ;YACtB,QAAQ;YACR,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,QAAQ;SACnB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,IAAiB,EAAE,SAAkB;IAC/D,MAAM,QAAQ,GAAG,SAAS;QACxB,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC;QACnD,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAE/D,sDAAsD;IACtD,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE;YACvF,GAAG,EAAE,IAAI,CAAC,QAAQ;YAClB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAkB;IAC3D,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,QAAQ;IACR,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IAE7D,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;IACzD,IAAI,QAAQ,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC,CAAC;IAE7D,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACpF,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IAE1G,oCAAoC;IACpC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvF,YAAY;IACZ,OAAO,IAAI,EAAE,CAAC;QACZ,0EAA0E;QAC1E,MAAM,WAAW,GAA2D;YAC1E,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,QAAQ,EAAE;SAC9E,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7E,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAClE,IAAI,UAAU,KAAK,UAAU;YAAE,OAAO;QAEtC,0EAA0E;QAC1E,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC;gBAChC,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE;oBAC1D,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;oBACnF,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;iBACrC;aACF,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,KAAK,UAAU;gBAAE,SAAS;YAEpE,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;oBACxB,OAAO,EAAE,6BAA6B,GAAG,CAAC,KAAK,CAAC,MAAM,SAAS;iBAChE,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEpC,MAAM,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7D,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;oBACxB,OAAO,EAAE,oCAAoC,KAAK,CAAC,MAAM,iCAAiC;iBAC3F,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEpC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBAE5D,yBAAyB;oBACzB,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC1E,yBAAyB;oBACzB,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBAED,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,IAAI,YAAY,GAA2B,IAAI,CAAC;QAChD,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,UAAU,EACV,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,YAAY;gBAAE,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;YACzF,IAAI,UAAU;gBAAE,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;YAEzF,MAAM,OAAO,GAA2D,EAAE,CAAC;YAE3E,oEAAoE;YACpE,IAAI,mBAAmB,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBACzE,IAAI,QAAQ,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,QAAQ,GAAG,EAAE,CAAC,CAAC;gBAC9G,IAAI,KAAK,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;gBAClG,IAAI,OAAO,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,OAAO,GAAG,EAAE,CAAC,CAAC;gBACxG,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,sBAAsB,WAAW,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;gBACvG,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,iBAAiB;gBACjB,MAAM,WAAW,GAAa,EAAE,CAAC;gBACjC,IAAI,YAAY;oBAAE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC9D,IAAI,UAAU;oBAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;gBACxD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;oBAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;oBACxG,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAED,IAAI,CAAC,UAAU,IAAI,aAAa,CAAC,MAAM,IAAI,EAAE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,sBAAsB,WAAW,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;gBACvG,CAAC;gBAED,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrC,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACxF,OAAO,CAAC,IAAI,CAAC;wBACX,KAAK,EAAE,IAAI,CAAC,IAAI;wBAChB,KAAK;wBACL,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;qBAC1D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,IAAI,UAAU,IAAI,YAAY;gBACxD,CAAC,CAAC,yBAAyB;gBAC3B,CAAC,CAAC,eAAe,CAAC;YAEpB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAEhE,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC5B,IAAI,YAAY,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;oBAC/C,2BAA2B;oBAC3B,YAAY,GAAG,IAAI,CAAC;oBACpB,UAAU,GAAG,IAAI,CAAC;oBAClB,YAAY,GAAG,KAAK,CAAC;oBACrB,SAAS;gBACX,CAAC;gBACD,uBAAuB;gBACvB,MAAM,UAAU,CAAC;YACnB,CAAC;YAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAAC,YAAY,GAAG,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC9D,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;gBAAC,YAAY,GAAG,GAAG,CAAC;gBAAC,UAAU,GAAG,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YACrF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAAC,YAAY,GAAG,GAAG,CAAC;gBAAC,UAAU,GAAG,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YAClF,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAAC,YAAY,GAAG,GAAG,CAAC;gBAAC,UAAU,GAAG,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YACpF,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAAC,YAAY,GAAG,IAAI,CAAC;gBAAC,UAAU,GAAG,IAAI,CAAC;gBAAC,YAAY,GAAG,KAAK,CAAC;gBAAC,SAAS;YAAC,CAAC;YAEzG,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC;oBAC9B,OAAO,EAAE,uBAAuB;oBAChC,OAAO,EAAE;wBACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;wBACxC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACzB,KAAK,EAAE,CAAC;4BACR,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;4BACnB,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;yBAChE,CAAC,CAAC;qBACJ;iBACF,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,UAAU,CAAC;oBAAE,SAAS;gBACnC,UAAU,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAoB,CAAC;gBACpE,SAAS;YACX,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBACvD,SAAS;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAEnC,mBAAmB;YACnB,MAAM,iBAAiB,GAA4C;gBACjE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE;gBACxC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE;aAC3C,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnB,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC/E,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,MAAM;gBAAE,SAAS;YAEpD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC;gBAChE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACrD,SAAS;YACX,CAAC;YAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;oBACxB,OAAO,EAAE,UAAU,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,0BAA0B;iBAC9E,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEpC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE;oBACrE,GAAG,EAAE,IAAI,CAAC,QAAQ;oBAClB,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChC,IAAI,GAAG,IAAI,CAAC;wBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvB,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;wBACvC,OAAO;oBACT,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * CLI theme — palette, markdown theme, and syntax highlighting.
3
+ *
4
+ * Adapted from OpenClaw's TUI theme with a cyan accent palette.
5
+ * Uses chalk for hex-color styling and cli-highlight for code blocks.
6
+ */
7
+ import type { MarkdownTheme } from '@mariozechner/pi-tui';
8
+ export declare const palette: {
9
+ text: string;
10
+ dim: string;
11
+ accent: string;
12
+ accentSoft: string;
13
+ border: string;
14
+ userBg: string;
15
+ userText: string;
16
+ systemText: string;
17
+ toolPendingBg: string;
18
+ toolSuccessBg: string;
19
+ toolErrorBg: string;
20
+ toolTitle: string;
21
+ toolOutput: string;
22
+ quote: string;
23
+ quoteBorder: string;
24
+ code: string;
25
+ codeBlock: string;
26
+ codeBorder: string;
27
+ link: string;
28
+ error: string;
29
+ success: string;
30
+ };
31
+ export declare const markdownTheme: MarkdownTheme;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * CLI theme — palette, markdown theme, and syntax highlighting.
3
+ *
4
+ * Adapted from OpenClaw's TUI theme with a cyan accent palette.
5
+ * Uses chalk for hex-color styling and cli-highlight for code blocks.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { highlight, supportsLanguage } from 'cli-highlight';
9
+ // ── Color palette ───────────────────────────────────────────────────────────
10
+ export const palette = {
11
+ text: '#E8E3D5',
12
+ dim: '#7B7F87',
13
+ accent: '#22D3EE',
14
+ accentSoft: '#67E8F9',
15
+ border: '#3C414B',
16
+ userBg: '#2B2F36',
17
+ userText: '#F3EEE0',
18
+ systemText: '#9BA3B2',
19
+ toolPendingBg: '#1F2A2F',
20
+ toolSuccessBg: '#1E2D23',
21
+ toolErrorBg: '#2F1F1F',
22
+ toolTitle: '#22D3EE',
23
+ toolOutput: '#E1DACB',
24
+ quote: '#8CC8FF',
25
+ quoteBorder: '#3B4D6B',
26
+ code: '#F0C987',
27
+ codeBlock: '#1E232A',
28
+ codeBorder: '#6B7280',
29
+ link: '#7DD3A5',
30
+ error: '#F97066',
31
+ success: '#7DD3A5',
32
+ };
33
+ // ── Helpers ─────────────────────────────────────────────────────────────────
34
+ const fg = (hex) => (text) => chalk.hex(hex)(text);
35
+ function createSyntaxTheme(fallback) {
36
+ return {
37
+ keyword: chalk.hex('#C586C0'),
38
+ built_in: chalk.hex('#4EC9B0'),
39
+ type: chalk.hex('#4EC9B0'),
40
+ literal: chalk.hex('#569CD6'),
41
+ number: chalk.hex('#B5CEA8'),
42
+ string: chalk.hex('#CE9178'),
43
+ regexp: chalk.hex('#D16969'),
44
+ symbol: chalk.hex('#B5CEA8'),
45
+ class: chalk.hex('#4EC9B0'),
46
+ function: chalk.hex('#DCDCAA'),
47
+ title: chalk.hex('#DCDCAA'),
48
+ params: chalk.hex('#9CDCFE'),
49
+ comment: chalk.hex('#6A9955'),
50
+ doctag: chalk.hex('#608B4E'),
51
+ meta: chalk.hex('#9CDCFE'),
52
+ 'meta-keyword': chalk.hex('#C586C0'),
53
+ 'meta-string': chalk.hex('#CE9178'),
54
+ section: chalk.hex('#DCDCAA'),
55
+ tag: chalk.hex('#569CD6'),
56
+ name: chalk.hex('#9CDCFE'),
57
+ attr: chalk.hex('#9CDCFE'),
58
+ attribute: chalk.hex('#9CDCFE'),
59
+ variable: chalk.hex('#9CDCFE'),
60
+ bullet: chalk.hex('#D7BA7D'),
61
+ code: chalk.hex('#CE9178'),
62
+ emphasis: chalk.italic,
63
+ strong: chalk.bold,
64
+ formula: chalk.hex('#C586C0'),
65
+ link: chalk.hex('#4EC9B0'),
66
+ quote: chalk.hex('#6A9955'),
67
+ addition: chalk.hex('#B5CEA8'),
68
+ deletion: chalk.hex('#F44747'),
69
+ 'selector-tag': chalk.hex('#D7BA7D'),
70
+ 'selector-id': chalk.hex('#D7BA7D'),
71
+ 'selector-class': chalk.hex('#D7BA7D'),
72
+ 'selector-attr': chalk.hex('#D7BA7D'),
73
+ 'selector-pseudo': chalk.hex('#D7BA7D'),
74
+ 'template-tag': chalk.hex('#C586C0'),
75
+ 'template-variable': chalk.hex('#9CDCFE'),
76
+ default: fallback,
77
+ };
78
+ }
79
+ const syntaxTheme = createSyntaxTheme(fg(palette.code));
80
+ /**
81
+ * Highlight code with syntax coloring.
82
+ * Returns an array of lines with ANSI escape codes.
83
+ */
84
+ function highlightCode(code, lang) {
85
+ try {
86
+ const language = lang && supportsLanguage(lang) ? lang : undefined;
87
+ const highlighted = highlight(code, {
88
+ language,
89
+ theme: syntaxTheme,
90
+ ignoreIllegals: true,
91
+ });
92
+ return highlighted.split('\n');
93
+ }
94
+ catch {
95
+ return code.split('\n').map((line) => fg(palette.code)(line));
96
+ }
97
+ }
98
+ // ── Markdown theme for pi-tui ───────────────────────────────────────────────
99
+ export const markdownTheme = {
100
+ heading: (text) => chalk.bold(fg(palette.accent)(text)),
101
+ link: (text) => fg(palette.link)(text),
102
+ linkUrl: (text) => chalk.dim(text),
103
+ code: (text) => fg(palette.code)(text),
104
+ codeBlock: (text) => fg(palette.code)(text),
105
+ codeBlockBorder: (text) => fg(palette.codeBorder)(text),
106
+ quote: (text) => fg(palette.quote)(text),
107
+ quoteBorder: (text) => fg(palette.quoteBorder)(text),
108
+ hr: (text) => fg(palette.border)(text),
109
+ listBullet: (text) => fg(palette.accentSoft)(text),
110
+ bold: (text) => chalk.bold(text),
111
+ italic: (text) => chalk.italic(text),
112
+ strikethrough: (text) => chalk.strikethrough(text),
113
+ underline: (text) => chalk.underline(text),
114
+ highlightCode,
115
+ };
116
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/cli/theme.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,18 @@ import { GitUser } from '../services/git.js';
8
8
  import { MarkdownDocument } from '../services/markdown.js';
9
9
  import { AssetInfo, AssetConfig } from '../services/assets/index.js';
10
10
  import { EntityType, type EntityData, type DatasetRow } from './validation.js';
11
+ import { SchemaRegistry } from './schema-registry.js';
11
12
  import { type DatasetFilter } from '../services/csv-service.js';
13
+ import { type VectorService } from '../services/vector-service.js';
12
14
  export interface GraphConfig {
13
15
  repoPath: string;
16
+ repoName: string;
14
17
  assetConfig?: AssetConfig;
15
18
  gitUser: GitUser;
19
+ vectorService?: VectorService;
20
+ schemaRegistry?: SchemaRegistry;
21
+ /** When true, all git operations are skipped. Used for the private/ graph. */
22
+ noGit?: boolean;
16
23
  }
17
24
  export interface EntityFile {
18
25
  id: string;
@@ -50,11 +57,15 @@ export interface UpdateEntityOptions {
50
57
  }
51
58
  export declare class BaseGraphManager {
52
59
  private repoPath;
53
- private gitService;
60
+ readonly repoName: string;
61
+ private gitService?;
62
+ private noGit;
54
63
  private markdownService;
55
64
  private assetService?;
56
65
  private gitUser;
57
66
  private csvService;
67
+ private vectorService?;
68
+ private schemaRegistry?;
58
69
  constructor(config: GraphConfig);
59
70
  /**
60
71
  * Ensure repository exists
@@ -64,14 +75,6 @@ export declare class BaseGraphManager {
64
75
  * Get entity file path
65
76
  */
66
77
  private getEntityPath;
67
- /**
68
- * Get entity folder path
69
- */
70
- private getEntityFolder;
71
- /**
72
- * Public alias for getEntityPath (used internally by dataset methods)
73
- */
74
- private getEntityPathPublic;
75
78
  /**
76
79
  * Validate entity data against schema
77
80
  */
@@ -84,6 +87,10 @@ export declare class BaseGraphManager {
84
87
  * Get an entity by type and ID
85
88
  */
86
89
  get(entityType: EntityType, entityId: string): EntityFile;
90
+ /**
91
+ * Get an entity by ID only (type resolved from frontmatter)
92
+ */
93
+ getById(entityId: string): EntityFile;
87
94
  /**
88
95
  * Update an existing entity
89
96
  */