@synap-core/cli 1.8.0 → 1.10.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 (332) hide show
  1. package/dist/commands/agent-chat.d.ts +47 -0
  2. package/dist/commands/agent-chat.js +250 -0
  3. package/dist/commands/agent-chat.js.map +1 -0
  4. package/dist/commands/agent-run.js +3 -4
  5. package/dist/commands/agent-run.js.map +1 -1
  6. package/dist/commands/agents.js +85 -46
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/automation.js +2 -1
  9. package/dist/commands/automation.js.map +1 -1
  10. package/dist/commands/bridge-setup.d.ts +66 -0
  11. package/dist/commands/bridge-setup.js +1112 -0
  12. package/dist/commands/bridge-setup.js.map +1 -0
  13. package/dist/commands/cap-connections.d.ts +28 -0
  14. package/dist/commands/cap-connections.js +224 -0
  15. package/dist/commands/cap-connections.js.map +1 -0
  16. package/dist/commands/capability.d.ts +89 -0
  17. package/dist/commands/capability.js +1523 -0
  18. package/dist/commands/capability.js.map +1 -0
  19. package/dist/commands/centrality.d.ts +20 -0
  20. package/dist/commands/centrality.js +94 -0
  21. package/dist/commands/centrality.js.map +1 -0
  22. package/dist/commands/connect.d.ts +2 -0
  23. package/dist/commands/connect.js +16 -35
  24. package/dist/commands/connect.js.map +1 -1
  25. package/dist/commands/context.js +4 -6
  26. package/dist/commands/context.js.map +1 -1
  27. package/dist/commands/data-extra.d.ts +1 -0
  28. package/dist/commands/data-extra.js +34 -10
  29. package/dist/commands/data-extra.js.map +1 -1
  30. package/dist/commands/data.d.ts +4 -4
  31. package/dist/commands/data.js +241 -184
  32. package/dist/commands/data.js.map +1 -1
  33. package/dist/commands/diagnose.d.ts +20 -0
  34. package/dist/commands/diagnose.js +143 -0
  35. package/dist/commands/diagnose.js.map +1 -0
  36. package/dist/commands/digest.d.ts +17 -0
  37. package/dist/commands/digest.js +121 -0
  38. package/dist/commands/digest.js.map +1 -0
  39. package/dist/commands/discover.d.ts +2 -0
  40. package/dist/commands/discover.js +25 -8
  41. package/dist/commands/discover.js.map +1 -1
  42. package/dist/commands/events.js +2 -1
  43. package/dist/commands/events.js.map +1 -1
  44. package/dist/commands/explain.d.ts +1 -1
  45. package/dist/commands/explain.js +18 -15
  46. package/dist/commands/explain.js.map +1 -1
  47. package/dist/commands/facet.d.ts +29 -0
  48. package/dist/commands/facet.js +113 -0
  49. package/dist/commands/facet.js.map +1 -0
  50. package/dist/commands/graph.js +2 -1
  51. package/dist/commands/graph.js.map +1 -1
  52. package/dist/commands/import.d.ts +38 -0
  53. package/dist/commands/import.js +440 -0
  54. package/dist/commands/import.js.map +1 -0
  55. package/dist/commands/init.js +35 -16
  56. package/dist/commands/init.js.map +1 -1
  57. package/dist/commands/keys.js +3 -4
  58. package/dist/commands/keys.js.map +1 -1
  59. package/dist/commands/knowledge.d.ts +2 -0
  60. package/dist/commands/knowledge.js +61 -9
  61. package/dist/commands/knowledge.js.map +1 -1
  62. package/dist/commands/launch.d.ts +50 -0
  63. package/dist/commands/launch.js +790 -0
  64. package/dist/commands/launch.js.map +1 -0
  65. package/dist/commands/lens.d.ts +45 -0
  66. package/dist/commands/lens.js +386 -0
  67. package/dist/commands/lens.js.map +1 -0
  68. package/dist/commands/market.d.ts +209 -0
  69. package/dist/commands/market.js +1368 -0
  70. package/dist/commands/market.js.map +1 -0
  71. package/dist/commands/mcp.d.ts +42 -0
  72. package/dist/commands/mcp.js +184 -0
  73. package/dist/commands/mcp.js.map +1 -0
  74. package/dist/commands/observe.js +14 -11
  75. package/dist/commands/observe.js.map +1 -1
  76. package/dist/commands/open.d.ts +21 -4
  77. package/dist/commands/open.js +45 -4
  78. package/dist/commands/open.js.map +1 -1
  79. package/dist/commands/pod.d.ts +100 -0
  80. package/dist/commands/pod.js +359 -0
  81. package/dist/commands/pod.js.map +1 -0
  82. package/dist/commands/pods.d.ts +1 -0
  83. package/dist/commands/pods.js +77 -15
  84. package/dist/commands/pods.js.map +1 -1
  85. package/dist/commands/proposals-actions.js +40 -3
  86. package/dist/commands/proposals-actions.js.map +1 -1
  87. package/dist/commands/purge.d.ts +23 -0
  88. package/dist/commands/purge.js +148 -0
  89. package/dist/commands/purge.js.map +1 -0
  90. package/dist/commands/raycast.d.ts +15 -0
  91. package/dist/commands/raycast.js +153 -0
  92. package/dist/commands/raycast.js.map +1 -0
  93. package/dist/commands/sessions.js +45 -21
  94. package/dist/commands/sessions.js.map +1 -1
  95. package/dist/commands/skill-manage.d.ts +21 -0
  96. package/dist/commands/skill-manage.js +195 -0
  97. package/dist/commands/skill-manage.js.map +1 -0
  98. package/dist/commands/skills-commands.js +2 -1
  99. package/dist/commands/skills-commands.js.map +1 -1
  100. package/dist/commands/skills.js +4 -3
  101. package/dist/commands/skills.js.map +1 -1
  102. package/dist/commands/status.d.ts +3 -1
  103. package/dist/commands/status.js +166 -14
  104. package/dist/commands/status.js.map +1 -1
  105. package/dist/commands/statusline.d.ts +24 -0
  106. package/dist/commands/statusline.js +450 -0
  107. package/dist/commands/statusline.js.map +1 -0
  108. package/dist/commands/subscribe.js +2 -2
  109. package/dist/commands/subscribe.js.map +1 -1
  110. package/dist/commands/tools.d.ts +30 -0
  111. package/dist/commands/tools.js +315 -0
  112. package/dist/commands/tools.js.map +1 -0
  113. package/dist/commands/versions.d.ts +27 -0
  114. package/dist/commands/versions.js +277 -0
  115. package/dist/commands/versions.js.map +1 -0
  116. package/dist/commands/view.js +3 -2
  117. package/dist/commands/view.js.map +1 -1
  118. package/dist/commands/whoami.d.ts +21 -0
  119. package/dist/commands/whoami.js +129 -0
  120. package/dist/commands/whoami.js.map +1 -0
  121. package/dist/index.js +776 -60
  122. package/dist/index.js.map +1 -1
  123. package/dist/lib/approval-poll.d.ts +42 -0
  124. package/dist/lib/approval-poll.js +52 -0
  125. package/dist/lib/approval-poll.js.map +1 -0
  126. package/dist/lib/auth.d.ts +29 -6
  127. package/dist/lib/auth.js +105 -94
  128. package/dist/lib/auth.js.map +1 -1
  129. package/dist/lib/bundle-version.d.ts +11 -0
  130. package/dist/lib/bundle-version.js +33 -0
  131. package/dist/lib/bundle-version.js.map +1 -0
  132. package/dist/lib/capture-lane.d.ts +30 -12
  133. package/dist/lib/capture-lane.js +71 -14
  134. package/dist/lib/capture-lane.js.map +1 -1
  135. package/dist/lib/cp-packages.d.ts +121 -0
  136. package/dist/lib/cp-packages.js +218 -0
  137. package/dist/lib/cp-packages.js.map +1 -0
  138. package/dist/lib/describe-lens.d.ts +46 -0
  139. package/dist/lib/describe-lens.js +33 -0
  140. package/dist/lib/describe-lens.js.map +1 -0
  141. package/dist/lib/hub-client.d.ts +78 -1
  142. package/dist/lib/hub-client.js +474 -22
  143. package/dist/lib/hub-client.js.map +1 -1
  144. package/dist/lib/installed.d.ts +51 -0
  145. package/dist/lib/installed.js +70 -0
  146. package/dist/lib/installed.js.map +1 -0
  147. package/dist/lib/next-steps.d.ts +61 -0
  148. package/dist/lib/next-steps.js +146 -0
  149. package/dist/lib/next-steps.js.map +1 -0
  150. package/dist/lib/pod.d.ts +91 -19
  151. package/dist/lib/pod.js +222 -56
  152. package/dist/lib/pod.js.map +1 -1
  153. package/dist/lib/project-ref.d.ts +95 -0
  154. package/dist/lib/project-ref.js +144 -0
  155. package/dist/lib/project-ref.js.map +1 -0
  156. package/dist/lib/project.d.ts +35 -0
  157. package/dist/lib/project.js +39 -0
  158. package/dist/lib/project.js.map +1 -0
  159. package/dist/lib/session-lens.d.ts +33 -0
  160. package/dist/lib/session-lens.js +76 -0
  161. package/dist/lib/session-lens.js.map +1 -0
  162. package/dist/lib/skill-import.d.ts +40 -0
  163. package/dist/lib/skill-import.js +203 -0
  164. package/dist/lib/skill-import.js.map +1 -0
  165. package/dist/lib/skills-installer.d.ts +17 -6
  166. package/dist/lib/skills-installer.js +133 -19
  167. package/dist/lib/skills-installer.js.map +1 -1
  168. package/dist/lib/suite.d.ts +28 -0
  169. package/dist/lib/suite.js +29 -0
  170. package/dist/lib/suite.js.map +1 -0
  171. package/dist/lib/superwhisper-import.d.ts +40 -0
  172. package/dist/lib/superwhisper-import.js +389 -0
  173. package/dist/lib/superwhisper-import.js.map +1 -0
  174. package/dist/lib/targets.d.ts +49 -1
  175. package/dist/lib/targets.js +420 -288
  176. package/dist/lib/targets.js.map +1 -1
  177. package/dist/lib/unwrapList.d.ts +1 -0
  178. package/dist/lib/unwrapList.js +20 -0
  179. package/dist/lib/unwrapList.js.map +1 -0
  180. package/dist/utils/logger.d.ts +2 -0
  181. package/dist/utils/logger.js +10 -2
  182. package/dist/utils/logger.js.map +1 -1
  183. package/package.json +9 -4
  184. package/skills/agent-os/SKILL.md +212 -0
  185. package/skills/manifest.json +5 -0
  186. package/skills/onboard/SKILL.md +186 -0
  187. package/skills/synap/SKILL.md +1182 -37
  188. package/skills/synap/_order.txt +37 -0
  189. package/skills/synap/_skill.yaml +24 -0
  190. package/skills/synap/authentication.md +10 -0
  191. package/skills/synap/automations.md +264 -0
  192. package/skills/synap/capabilities.md +107 -0
  193. package/skills/synap/capture.md +10 -0
  194. package/skills/synap/cli-operations.md +107 -0
  195. package/skills/synap/common-mistakes.md +12 -0
  196. package/skills/synap/creative-loop.md +43 -0
  197. package/skills/synap/crm.md +117 -0
  198. package/skills/synap/diagnostics.md +35 -0
  199. package/skills/synap/digesting-a-channel.md +38 -0
  200. package/skills/synap/document-embeds.md +123 -0
  201. package/skills/synap/escalation-ladder.md +71 -0
  202. package/skills/synap/focus-sessions.md +47 -0
  203. package/skills/synap/governance-rules.md +64 -0
  204. package/skills/synap/governance.md +6 -6
  205. package/skills/synap/graph-gardening.md +21 -0
  206. package/skills/synap/inline-patterns.md +38 -0
  207. package/skills/synap/lenses.md +38 -0
  208. package/skills/synap/linking-principle.md +39 -0
  209. package/skills/synap/linking.md +1 -0
  210. package/skills/synap/mental-model.md +45 -0
  211. package/skills/synap/more.md +7 -0
  212. package/skills/synap/multi-entity-capture.md +10 -0
  213. package/skills/synap/next-action.md +37 -0
  214. package/skills/synap/north-star.md +17 -0
  215. package/skills/synap/operating-mode-rules.md +45 -0
  216. package/skills/synap/operating-mode.md +9 -0
  217. package/skills/synap/quick-reference.md +67 -0
  218. package/skills/synap/reading.md +43 -0
  219. package/skills/synap/recap.md +21 -0
  220. package/skills/synap/reflexes.md +46 -0
  221. package/skills/synap/response-style.md +21 -0
  222. package/skills/synap/scope.md +13 -0
  223. package/skills/synap/showing.md +17 -0
  224. package/skills/synap/user-model.md +25 -0
  225. package/skills/synap/viewframe-cells.md +290 -0
  226. package/skills/synap/work-flow.md +113 -0
  227. package/skills/synap/worked-examples.md +53 -0
  228. package/skills/synap/workspace-design.md +45 -0
  229. package/skills/synap/workspace-edges.md +49 -0
  230. package/skills/synap/writes.md +156 -0
  231. package/skills/synap-schema/SKILL.md +97 -6
  232. package/skills/synap-schema/_order.txt +13 -0
  233. package/skills/synap-schema/_skill.yaml +22 -0
  234. package/skills/synap-schema/before-you-touch.md +14 -0
  235. package/skills/synap-schema/common-mistakes.md +9 -0
  236. package/skills/synap-schema/creating-profiles.md +17 -0
  237. package/skills/synap-schema/discover-profiles.md +24 -0
  238. package/skills/synap-schema/entity-scope.md +8 -0
  239. package/skills/synap-schema/extend-vs-create.md +31 -0
  240. package/skills/synap-schema/more.md +6 -0
  241. package/skills/synap-schema/overlay-properties.md +22 -0
  242. package/skills/synap-schema/profiles.md +3 -0
  243. package/skills/synap-schema/property-defs.md +29 -0
  244. package/skills/synap-schema/read-before-write.md +50 -0
  245. package/skills/synap-schema/relations.md +18 -0
  246. package/skills/synap-schema/worked-example.md +30 -0
  247. package/skills/synap-ui/SKILL.md +26 -2
  248. package/skills/synap-ui/_order.txt +13 -0
  249. package/skills/synap-ui/_skill.yaml +23 -0
  250. package/skills/synap-ui/ai-companion.md +27 -0
  251. package/skills/synap-ui/arranging-bento.md +8 -0
  252. package/skills/synap-ui/before-you-build.md +20 -0
  253. package/skills/synap-ui/bento-layouts.md +35 -0
  254. package/skills/synap-ui/common-mistakes.md +10 -0
  255. package/skills/synap-ui/creating-views.md +26 -0
  256. package/skills/synap-ui/four-builds.md +24 -0
  257. package/skills/synap-ui/more.md +7 -0
  258. package/skills/synap-ui/proposing-vs-extending.md +11 -0
  259. package/skills/synap-ui/view-list.md +24 -0
  260. package/skills/synap-ui/views.md +3 -0
  261. package/skills/synap-ui/worked-example.md +18 -0
  262. package/skills/synap-ui/workspaces.md +47 -0
  263. package/templates/automations/bookmark-enrichment.automation.json +44 -0
  264. package/templates/automations/mail-feed.automation.json +86 -0
  265. package/templates/automations/url-bookmark-capture.automation.json +70 -0
  266. package/templates/skills/README.md +21 -0
  267. package/templates/skills/authoring-automations/SKILL.md +95 -0
  268. package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
  269. package/templates/skills/authoring-capabilities/SKILL.md +93 -0
  270. package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
  271. package/templates/skills/authoring-playbooks/SKILL.md +102 -0
  272. package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
  273. package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
  274. package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
  275. package/templates/skills/coordinating-agents/SKILL.md +32 -0
  276. package/templates/skills/coordinating-branches/SKILL.md +27 -0
  277. package/templates/skills/mapping-the-server/SKILL.md +54 -0
  278. package/templates/skills/reading-client-progress/SKILL.md +65 -0
  279. package/templates/skills/routing-to-channels/SKILL.md +54 -0
  280. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
  281. package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
  282. package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
  283. package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
  284. package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
  285. package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
  286. package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
  287. package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
  288. package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
  289. package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
  290. package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
  291. package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
  292. package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
  293. package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
  294. package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
  295. package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
  296. package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
  297. package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
  298. package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
  299. package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
  300. package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
  301. package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
  302. package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
  303. package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
  304. package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
  305. package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
  306. package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
  307. package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
  308. package/dist/commands/connectors.d.ts +0 -31
  309. package/dist/commands/connectors.js +0 -276
  310. package/dist/commands/connectors.js.map +0 -1
  311. package/dist/commands/finish.d.ts +0 -25
  312. package/dist/commands/finish.js +0 -274
  313. package/dist/commands/finish.js.map +0 -1
  314. package/dist/commands/openclaw.d.ts +0 -40
  315. package/dist/commands/openclaw.js +0 -1148
  316. package/dist/commands/openclaw.js.map +0 -1
  317. package/dist/commands/security-audit.d.ts +0 -12
  318. package/dist/commands/security-audit.js +0 -100
  319. package/dist/commands/security-audit.js.map +0 -1
  320. package/dist/lib/hardening.d.ts +0 -18
  321. package/dist/lib/hardening.js +0 -214
  322. package/dist/lib/hardening.js.map +0 -1
  323. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
  324. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
  325. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
  326. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
  327. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  328. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
  329. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  330. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
  331. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
  332. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
@@ -0,0 +1,440 @@
1
+ /**
2
+ * synap import — "capture, but for files and URLs".
3
+ *
4
+ * Routes EVERY input (local file, folder, or http(s) URL) through the SAME AI
5
+ * capture centerpiece as free-text `capture`:
6
+ * POST /capture/structure (AI entity extraction + workspace/project routing)
7
+ * POST /capture/execute (materialize the chosen proposals + relations)
8
+ *
9
+ * One item per file/url. This inherits AI entity extraction, the relation graph,
10
+ * workspace routing AND project routing for free — no separate /import/* path.
11
+ *
12
+ * Inputs:
13
+ * - http(s) URL → sent as `url`
14
+ * - directory → recursively globbed (skips node_modules/.git/dotfiles)
15
+ * - file → text-like → utf8, everything else → base64
16
+ *
17
+ * Routing: --workspace / --project override the AI's suggestion; otherwise the
18
+ * AI-proposed targetWorkspaceId / targetProjectId from /capture/structure win.
19
+ */
20
+ import chalk from "chalk";
21
+ import { readFileSync, statSync, readdirSync, existsSync } from "node:fs";
22
+ import { extname, basename, join } from "node:path";
23
+ import * as readline from "node:readline/promises";
24
+ import { stdin as input, stdout as output } from "node:process";
25
+ import { log } from "../utils/logger.js";
26
+ import { resolveHubConfig, resolveUserId, hubGet, hubPost, readActiveSessionId, renderHubError, } from "../lib/hub-client.js";
27
+ import { unwrapList } from "../lib/unwrapList.js";
28
+ import { formatLaneLine, resolveWorkspaceName } from "../lib/capture-lane.js";
29
+ // ─── input classification ─────────────────────────────────────────────────────
30
+ const TEXT_LIKE = new Set([".md", ".markdown", ".txt", ".csv", ".json", ".html", ".htm"]);
31
+ const MIME = {
32
+ ".md": "text/markdown",
33
+ ".markdown": "text/markdown",
34
+ ".txt": "text/plain",
35
+ ".csv": "text/csv",
36
+ ".json": "application/json",
37
+ ".html": "text/html",
38
+ ".htm": "text/html",
39
+ ".pdf": "application/pdf",
40
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
41
+ ".doc": "application/msword",
42
+ ".png": "image/png",
43
+ ".jpg": "image/jpeg",
44
+ ".jpeg": "image/jpeg",
45
+ ".webp": "image/webp",
46
+ ".gif": "image/gif",
47
+ ".svg": "image/svg+xml",
48
+ ".mp3": "audio/mpeg",
49
+ ".wav": "audio/wav",
50
+ ".m4a": "audio/mp4",
51
+ ".ogg": "audio/ogg",
52
+ ".mp4": "video/mp4",
53
+ ".mov": "video/quicktime",
54
+ };
55
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
56
+ const URL_RE = /^https?:\/\//i;
57
+ /** Cap on files pulled from a single directory — log + truncate, never silently drop. */
58
+ const DIR_FILE_CAP = 200;
59
+ function mimeFor(path) {
60
+ return MIME[extname(path).toLowerCase()] ?? "application/octet-stream";
61
+ }
62
+ /** Read a single file into an ImportItem (utf8 for text-like, base64 otherwise). */
63
+ function fileToItem(path) {
64
+ const ext = extname(path).toLowerCase();
65
+ const filename = basename(path);
66
+ const mimeType = mimeFor(path);
67
+ if (TEXT_LIKE.has(ext)) {
68
+ return {
69
+ kind: "file",
70
+ label: path,
71
+ file: { content: readFileSync(path, "utf8"), mimeType, filename, encoding: "utf8" },
72
+ };
73
+ }
74
+ return {
75
+ kind: "file",
76
+ label: path,
77
+ file: { content: readFileSync(path).toString("base64"), mimeType, filename, encoding: "base64" },
78
+ };
79
+ }
80
+ /** Recursively collect files under a directory, skipping node_modules/.git/dotfiles. */
81
+ function walkDir(dir, acc) {
82
+ if (acc.length >= DIR_FILE_CAP)
83
+ return;
84
+ let entries = [];
85
+ try {
86
+ entries = readdirSync(dir, { withFileTypes: true });
87
+ }
88
+ catch {
89
+ return;
90
+ }
91
+ for (const e of entries) {
92
+ if (acc.length >= DIR_FILE_CAP)
93
+ return;
94
+ if (e.name.startsWith("."))
95
+ continue; // dotfiles + dot-dirs (.git, .env, …)
96
+ if (e.name === "node_modules")
97
+ continue;
98
+ const full = join(dir, e.name);
99
+ if (e.isDirectory()) {
100
+ walkDir(full, acc);
101
+ }
102
+ else if (e.isFile()) {
103
+ acc.push(full);
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Expand the raw CLI inputs into a flat list of import items. Returns the items
109
+ * plus any per-input failures (missing paths) and a `truncated` flag if a
110
+ * directory exceeded DIR_FILE_CAP.
111
+ */
112
+ function expandInputs(inputs) {
113
+ const items = [];
114
+ const failures = [];
115
+ let truncated = false;
116
+ for (const raw of inputs) {
117
+ if (URL_RE.test(raw)) {
118
+ items.push({ kind: "url", label: raw, url: raw });
119
+ continue;
120
+ }
121
+ if (!existsSync(raw)) {
122
+ failures.push({ label: raw, error: "no such file, directory, or URL" });
123
+ continue;
124
+ }
125
+ let st;
126
+ try {
127
+ st = statSync(raw);
128
+ }
129
+ catch (e) {
130
+ failures.push({ label: raw, error: e.message });
131
+ continue;
132
+ }
133
+ if (st.isDirectory()) {
134
+ const files = [];
135
+ walkDir(raw, files);
136
+ if (files.length >= DIR_FILE_CAP)
137
+ truncated = true;
138
+ for (const f of files) {
139
+ try {
140
+ items.push(fileToItem(f));
141
+ }
142
+ catch (e) {
143
+ failures.push({ label: f, error: e.message });
144
+ }
145
+ }
146
+ }
147
+ else {
148
+ try {
149
+ items.push(fileToItem(raw));
150
+ }
151
+ catch (e) {
152
+ failures.push({ label: raw, error: e.message });
153
+ }
154
+ }
155
+ }
156
+ return { items, failures, truncated };
157
+ }
158
+ // ─── workspace / project name → id resolution ─────────────────────────────────
159
+ /** Resolve a --workspace value (id or name) to a workspace id. Throws if unknown. */
160
+ async function resolveWorkspaceArg(value, cfg) {
161
+ if (UUID_RE.test(value))
162
+ return value;
163
+ const res = (await hubGet("/workspaces", {}, cfg));
164
+ const list = unwrapList(res, ["workspaces"]);
165
+ const match = list.find((w) => String(w.name ?? "").toLowerCase() === value.toLowerCase());
166
+ if (!match) {
167
+ const names = list.map((w) => String(w.name ?? w.id)).join(", ");
168
+ throw new Error(`Workspace '${value}' not found.${names ? ` Available: ${names}` : ""}`);
169
+ }
170
+ return String(match.id);
171
+ }
172
+ /** Resolve a --project value (id or name) to a project id. Throws if unknown. */
173
+ async function resolveProjectArg(value, cfg) {
174
+ if (UUID_RE.test(value))
175
+ return value;
176
+ // GET /projects returns a raw array (no envelope).
177
+ const res = (await hubGet("/projects", {}, cfg));
178
+ const list = unwrapList(res, ["projects"]);
179
+ const match = list.find((p) => String(p.name ?? "").toLowerCase() === value.toLowerCase());
180
+ if (!match) {
181
+ const names = list.map((p) => String(p.name ?? p.id)).join(", ");
182
+ throw new Error(`Project '${value}' not found.${names ? ` Available: ${names}` : ""}`);
183
+ }
184
+ return String(match.id);
185
+ }
186
+ // ─── rendering ─────────────────────────────────────────────────────────────────
187
+ function renderProposals(result) {
188
+ const proposals = result.proposals ?? [];
189
+ if (result.degraded) {
190
+ log.warn("AI structuring degraded — this source may not be fully extractable server-side.");
191
+ }
192
+ if (proposals.length === 0) {
193
+ log.dim("No entity proposals extracted.");
194
+ return;
195
+ }
196
+ log.heading("Proposed entities");
197
+ const typeW = Math.min(18, Math.max(6, ...proposals.map((p) => p.profileSlug.length)));
198
+ const titleW = Math.min(48, Math.max(10, ...proposals.map((p) => p.title.length)));
199
+ console.log(" " +
200
+ [chalk.bold("#".padEnd(3)), chalk.bold("Type".padEnd(typeW)), chalk.bold("Title".padEnd(titleW))].join(" "));
201
+ console.log(" " + chalk.dim("-".repeat(3 + 2 + typeW + 2 + titleW)));
202
+ for (let i = 0; i < proposals.length; i++) {
203
+ const p = proposals[i];
204
+ console.log(" " +
205
+ [
206
+ chalk.dim(String(i + 1).padEnd(3)),
207
+ chalk.cyan(p.profileSlug.slice(0, typeW).padEnd(typeW)),
208
+ p.title.slice(0, titleW).padEnd(titleW),
209
+ ].join(" "));
210
+ if (p.description)
211
+ log.dim(` ${p.description.slice(0, 80)}`);
212
+ }
213
+ const rels = result.relations ?? [];
214
+ if (rels.length > 0) {
215
+ log.blank();
216
+ log.dim(` ${rels.length} relation${rels.length !== 1 ? "s" : ""} will be created.`);
217
+ }
218
+ }
219
+ function pct(c) {
220
+ return typeof c === "number" ? ` (${Math.round(c * 100)}%)` : "";
221
+ }
222
+ /** Print the AI's proposed workspace/project routing for this item. */
223
+ function renderRouting(result, wsOverride, projOverride) {
224
+ const ws = wsOverride ?? result.targetWorkspaceId ?? null;
225
+ const proj = projOverride ?? result.targetProjectId ?? null;
226
+ const wsSrc = wsOverride ? " (override)" : pct(result.targetWorkspaceConfidence);
227
+ const projSrc = projOverride ? " (override)" : pct(result.targetProjectConfidence);
228
+ log.dim(` → workspace: ${ws ?? "pod-wide / unclear"}${wsSrc}`);
229
+ if (result.targetWorkspaceReason && !wsOverride)
230
+ log.dim(` ${result.targetWorkspaceReason.slice(0, 90)}`);
231
+ log.dim(` → project: ${proj ?? "none / unclear"}${projSrc}`);
232
+ if (result.targetProjectReason && !projOverride)
233
+ log.dim(` ${result.targetProjectReason.slice(0, 90)}`);
234
+ }
235
+ async function processItem(item, opts, cfg, userId, wsOverride, projOverride, sessionId, rl) {
236
+ // 1. Structure — workspace hint = override ?? active (the AI may still re-route).
237
+ const structureBody = {
238
+ userId,
239
+ ...(wsOverride ?? cfg.workspaceId ? { workspaceId: wsOverride ?? cfg.workspaceId } : {}),
240
+ ...(sessionId ? { sessionId } : {}),
241
+ };
242
+ if (item.kind === "url")
243
+ structureBody.url = item.url;
244
+ else
245
+ structureBody.file = item.file;
246
+ // File extraction (PDF/audio/image) runs through the IS extractor and is slow —
247
+ // give structure a generous timeout (capture's free-text path is fast).
248
+ const structureRes = (await hubPost("/capture/structure", structureBody, cfg, 120_000));
249
+ const wsTarget = wsOverride ?? structureRes.targetWorkspaceId ?? cfg.workspaceId ?? null;
250
+ const projTarget = projOverride ?? structureRes.targetProjectId ?? null;
251
+ const proposals = structureRes.proposals ?? [];
252
+ if (!opts.json) {
253
+ log.heading(`▸ ${item.label}`);
254
+ renderProposals(structureRes);
255
+ renderRouting(structureRes, wsOverride, projOverride);
256
+ }
257
+ if (proposals.length === 0) {
258
+ return { label: item.label, status: "empty", workspaceId: wsTarget, projectId: projTarget };
259
+ }
260
+ if (opts.dryRun) {
261
+ return {
262
+ label: item.label,
263
+ status: "dry-run",
264
+ entities: proposals.length,
265
+ relations: (structureRes.relations ?? []).length,
266
+ workspaceId: wsTarget,
267
+ projectId: projTarget,
268
+ };
269
+ }
270
+ // 2. Confirm (skipped with --yes or in --json mode).
271
+ let confirmed = Boolean(opts.yes);
272
+ if (!confirmed && !opts.json && rl) {
273
+ const answer = await rl.question(chalk.bold(` Create ${proposals.length} entr${proposals.length !== 1 ? "ies" : "y"} from this item? [y/N] `));
274
+ confirmed = answer.trim().toLowerCase() === "y";
275
+ }
276
+ if (!confirmed) {
277
+ if (!opts.json)
278
+ log.dim(" Skipped.");
279
+ return { label: item.label, status: "skipped", workspaceId: wsTarget, projectId: projTarget };
280
+ }
281
+ // 3. Execute — route to the resolved workspace/project.
282
+ // An explicit --workspace override is a deliberate pin: send it as-is, no
283
+ // AI routing hints. Otherwise stop pre-resolving the target client-side —
284
+ // forward the ambient workspace + the AI's routing signal and let the
285
+ // backend decide (auto = AI target wins over ambient when confidence is
286
+ // high enough AND the user is a member).
287
+ // NOTE: the hub REST /capture/execute door currently forwards only
288
+ // workspaceId (not projectId) to the tRPC caller; projectId is sent for
289
+ // forward-compatibility but is not yet applied server-side via this door.
290
+ const executeBody = {
291
+ userId,
292
+ ...(wsOverride
293
+ ? { workspaceId: wsOverride }
294
+ : {
295
+ ...(cfg.workspaceId ? { workspaceId: cfg.workspaceId } : {}),
296
+ workspaceRouting: "auto",
297
+ aiWorkspaceId: structureRes.targetWorkspaceId,
298
+ aiWorkspaceConfidence: structureRes.targetWorkspaceConfidence,
299
+ aiWorkspaceReason: structureRes.targetWorkspaceReason,
300
+ }),
301
+ ...(projTarget ? { projectId: projTarget } : {}),
302
+ ...(sessionId ? { sessionId } : {}),
303
+ entities: proposals,
304
+ relations: structureRes.relations ?? [],
305
+ };
306
+ const executeRes = (await hubPost("/capture/execute", executeBody, cfg, 60_000));
307
+ const created = Array.isArray(executeRes.created) ? executeRes.created : [];
308
+ const entityCount = created.filter((c) => !c.linked).length || created.length;
309
+ const relCount = Array.isArray(executeRes.relations) ? executeRes.relations.length : 0;
310
+ // Final resting workspace: the backend may have moved it (auto routing);
311
+ // otherwise fall back to the pre-execute guess.
312
+ const finalWorkspaceId = executeRes.movedToWorkspace ?? wsTarget;
313
+ if (!opts.json) {
314
+ const report = {
315
+ lane: "work",
316
+ workspaceId: finalWorkspaceId ?? undefined,
317
+ workspaceName: finalWorkspaceId ? await resolveWorkspaceName(finalWorkspaceId, cfg) : "pod-wide",
318
+ governance: "auto",
319
+ };
320
+ log.success(` ${entityCount} entit${entityCount !== 1 ? "ies" : "y"} created${relCount ? `, ${relCount} relation${relCount !== 1 ? "s" : ""}` : ""}`);
321
+ console.log(" " + formatLaneLine(report) + (projTarget ? chalk.dim(` [project ${projTarget.slice(0, 8)}]`) : ""));
322
+ if (executeRes.movedToWorkspace) {
323
+ log.dim(` → filed into workspace ${executeRes.movedToWorkspace}`);
324
+ }
325
+ }
326
+ return {
327
+ label: item.label,
328
+ status: "stored",
329
+ entities: entityCount,
330
+ relations: relCount,
331
+ workspaceId: finalWorkspaceId,
332
+ projectId: projTarget,
333
+ };
334
+ }
335
+ // ─── command entrypoint ─────────────────────────────────────────────────────────
336
+ export async function importData(inputs, opts) {
337
+ try {
338
+ if (!inputs || inputs.length === 0) {
339
+ console.error(chalk.red("Nothing to import. Pass one or more files, folders, or URLs."));
340
+ console.error(chalk.dim(" e.g. synap import ./notes.md ./docs/ https://example.com/article"));
341
+ console.error(chalk.dim(" e.g. synap import ~/Documents/superwhisper/recordings --source superwhisper --store-first --yes --limit 10"));
342
+ process.exit(1);
343
+ }
344
+ // Superwhisper store-first: pair meta+wav → pod-wide notes (no AI structure on audio).
345
+ if (opts.source === "superwhisper" ||
346
+ (opts.storeFirst && opts.source === "superwhisper")) {
347
+ const { importSuperwhisperStoreFirst } = await import("../lib/superwhisper-import.js");
348
+ await importSuperwhisperStoreFirst(inputs, {
349
+ dryRun: opts.dryRun,
350
+ yes: opts.yes,
351
+ json: opts.json,
352
+ withAudio: opts.withAudio,
353
+ limit: opts.limit,
354
+ concurrency: opts.concurrency,
355
+ resume: opts.resume,
356
+ podUrl: opts.podUrl,
357
+ apiKey: opts.apiKey,
358
+ });
359
+ return;
360
+ }
361
+ if (opts.storeFirst && opts.source && opts.source !== "superwhisper") {
362
+ console.error(chalk.red(`--store-first is only implemented for --source superwhisper (got ${opts.source})`));
363
+ process.exit(1);
364
+ }
365
+ const cfg = await resolveHubConfig(opts);
366
+ const userId = await resolveUserId(cfg);
367
+ // Resolve routing overrides (id or name) up front so a bad value fails fast.
368
+ const wsOverride = opts.workspace ? await resolveWorkspaceArg(opts.workspace, cfg) : undefined;
369
+ const projOverride = opts.project ? await resolveProjectArg(opts.project, cfg) : undefined;
370
+ const sessionId = opts.session ? readActiveSessionId() : undefined;
371
+ const { items, failures, truncated } = expandInputs(inputs);
372
+ if (truncated && !opts.json) {
373
+ log.warn(`A directory exceeded ${DIR_FILE_CAP} files — only the first ${DIR_FILE_CAP} were taken. Narrow the path or split the import.`);
374
+ }
375
+ if (items.length === 0) {
376
+ if (opts.json) {
377
+ console.log(JSON.stringify({ imported: [], failures, truncated }, null, 2));
378
+ }
379
+ else {
380
+ log.warn("No importable items found.");
381
+ for (const f of failures)
382
+ log.dim(` ✗ ${f.label}: ${f.error}`);
383
+ }
384
+ process.exit(failures.length > 0 ? 1 : 0);
385
+ }
386
+ if (!opts.json) {
387
+ log.info(`Importing ${items.length} item${items.length !== 1 ? "s" : ""}${opts.dryRun ? " (dry run)" : ""}…`);
388
+ }
389
+ const outcomes = [];
390
+ // One shared readline for all interactive confirmations (human, non-json).
391
+ const interactive = !opts.json && !opts.dryRun && !opts.yes;
392
+ const rl = interactive ? readline.createInterface({ input, output }) : undefined;
393
+ try {
394
+ for (const item of items) {
395
+ try {
396
+ outcomes.push(await processItem(item, opts, cfg, userId, wsOverride, projOverride, sessionId, rl));
397
+ }
398
+ catch (e) {
399
+ // Never abort the whole run on one bad item — collect + continue.
400
+ const error = e.message;
401
+ if (!opts.json)
402
+ log.error(` ${item.label}: ${error}`);
403
+ outcomes.push({ label: item.label, status: "failed", error });
404
+ }
405
+ }
406
+ }
407
+ finally {
408
+ rl?.close();
409
+ }
410
+ // Fold read-time failures (missing paths) into the outcome list.
411
+ for (const f of failures)
412
+ outcomes.push({ label: f.label, status: "failed", error: f.error });
413
+ if (opts.json) {
414
+ console.log(JSON.stringify({ imported: outcomes, truncated }, null, 2));
415
+ }
416
+ else {
417
+ const stored = outcomes.filter((o) => o.status === "stored");
418
+ const totalEntities = stored.reduce((n, o) => n + (o.entities ?? 0), 0);
419
+ const failed = outcomes.filter((o) => o.status === "failed");
420
+ log.blank();
421
+ log.heading("Import summary");
422
+ log.info(`${outcomes.length} item${outcomes.length !== 1 ? "s" : ""} · ` +
423
+ `${stored.length} stored (${totalEntities} entit${totalEntities !== 1 ? "ies" : "y"}) · ` +
424
+ `${outcomes.filter((o) => o.status === "dry-run").length} dry-run · ` +
425
+ `${outcomes.filter((o) => o.status === "skipped").length} skipped · ` +
426
+ `${outcomes.filter((o) => o.status === "empty").length} empty · ` +
427
+ `${failed.length} failed`);
428
+ for (const f of failed)
429
+ log.dim(` ✗ ${f.label}: ${f.error ?? "unknown error"}`);
430
+ }
431
+ const anyFailed = outcomes.some((o) => o.status === "failed");
432
+ if (anyFailed)
433
+ process.exit(1);
434
+ }
435
+ catch (e) {
436
+ renderHubError(e);
437
+ process.exit(1);
438
+ }
439
+ }
440
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,MAAM,EACN,OAAO,EACP,mBAAmB,EAEnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AAqB/F,iFAAiF;AAEjF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE1F,MAAM,IAAI,GAA2B;IACnC,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,eAAe;IAC5B,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,iBAAiB;IACzB,OAAO,EAAE,yEAAyE;IAClF,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAClF,MAAM,MAAM,GAAG,eAAe,CAAC;AAE/B,yFAAyF;AACzF,MAAM,YAAY,GAAG,GAAG,CAAC;AAUzB,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;AACzE,CAAC;AAED,oFAAoF;AACpF,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;SACpF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE;KACjG,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,OAAO,CAAC,GAAW,EAAE,GAAa;IACzC,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO;IACvC,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAa,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY;YAAE,OAAO;QACvC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,sCAAsC;QAC5E,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,MAAgB;IAKpC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAuC,EAAE,CAAC;IACxD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACpB,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY;gBAAE,SAAS,GAAG,IAAI,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC;AAyCD,iFAAiF;AAEjF,qFAAqF;AACrF,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,GAAc;IAC9D,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE,EAAE,GAAG,CAAC,CAA4B,CAAC;IAC9E,MAAM,IAAI,GAAG,UAAU,CAA0B,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,eAAe,KAAK,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,iFAAiF;AACjF,KAAK,UAAU,iBAAiB,CAAC,KAAa,EAAE,GAAc;IAC5D,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,mDAAmD;IACnD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,CAAY,CAAC;IAC5D,MAAM,IAAI,GAAG,UAAU,CAA0B,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,eAAe,KAAK,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,kFAAkF;AAElF,SAAS,eAAe,CAAC,MAAuB;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CACT,IAAI;QACF,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/G,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,IAAI;YACF;gBACE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvD,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;aACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CACf,CAAC;QACF,IAAI,CAAC,CAAC,WAAW;YAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,CAAiB;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,uEAAuE;AACvE,SAAS,aAAa,CAAC,MAAuB,EAAE,UAAmB,EAAE,YAAqB;IACxF,MAAM,EAAE,GAAG,UAAU,IAAI,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAG,YAAY,IAAI,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACnF,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,oBAAoB,GAAG,KAAK,EAAE,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,qBAAqB,IAAI,CAAC,UAAU;QAAE,GAAG,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/G,GAAG,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,gBAAgB,GAAG,OAAO,EAAE,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,mBAAmB,IAAI,CAAC,YAAY;QAAE,GAAG,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAC/G,CAAC;AAcD,KAAK,UAAU,WAAW,CACxB,IAAgB,EAChB,IAAgB,EAChB,GAAc,EACd,MAAc,EACd,UAA8B,EAC9B,YAAgC,EAChC,SAA6B,EAC7B,EAAkC;IAElC,kFAAkF;IAClF,MAAM,aAAa,GAA4B;QAC7C,MAAM;QACN,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;IACF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;;QACjD,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAEpC,gFAAgF;IAChF,wEAAwE;IACxE,MAAM,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,oBAAoB,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC,CAAoB,CAAC;IAE3G,MAAM,QAAQ,GAAG,UAAU,IAAI,YAAY,CAAC,iBAAiB,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC;IACzF,MAAM,UAAU,GAAG,YAAY,IAAI,YAAY,CAAC,eAAe,IAAI,IAAI,CAAC;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,IAAI,EAAE,CAAC;IAE/C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/B,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9B,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IAC9F,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,SAAS,CAAC,MAAM;YAC1B,SAAS,EAAE,CAAC,YAAY,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM;YAChD,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE,UAAU;SACtB,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,MAAM,QAAQ,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAC9G,CAAC;QACF,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IAChG,CAAC;IAED,wDAAwD;IACxD,6EAA6E;IAC7E,6EAA6E;IAC7E,yEAAyE;IACzE,2EAA2E;IAC3E,4CAA4C;IAC5C,sEAAsE;IACtE,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,WAAW,GAA4B;QAC3C,MAAM;QACN,GAAG,CAAC,UAAU;YACZ,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE;YAC7B,CAAC,CAAC;gBACE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,gBAAgB,EAAE,MAAM;gBACxB,aAAa,EAAE,YAAY,CAAC,iBAAiB;gBAC7C,qBAAqB,EAAE,YAAY,CAAC,yBAAyB;gBAC7D,iBAAiB,EAAE,YAAY,CAAC,qBAAqB;aACtD,CAAC;QACN,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,EAAE;KACxC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,MAAM,OAAO,CAAC,kBAAkB,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,CAAkB,CAAC;IAClG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC9E,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,yEAAyE;IACzE,gDAAgD;IAChD,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,IAAI,QAAQ,CAAC;IAEjE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,gBAAgB,IAAI,SAAS;YAC1C,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU;YAChG,UAAU,EAAE,MAAM;SACnB,CAAC;QACF,GAAG,CAAC,OAAO,CAAC,KAAK,WAAW,SAAS,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,YAAY,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvJ,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnH,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAChC,GAAG,CAAC,GAAG,CAAC,4BAA4B,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,gBAAgB;QAC7B,SAAS,EAAE,UAAU;KACtB,CAAC;AACJ,CAAC;AAED,mFAAmF;AAEnF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAgB,EAAE,IAAgB;IACjE,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,8GAA8G,CAC/G,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uFAAuF;QACvF,IACE,IAAI,CAAC,MAAM,KAAK,cAAc;YAC9B,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,EACnD,CAAC;YACD,MAAM,EAAE,4BAA4B,EAAE,GAAG,MAAM,MAAM,CACnD,+BAA+B,CAChC,CAAC;YACF,MAAM,4BAA4B,CAAC,MAAM,EAAE;gBACzC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACrE,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,oEAAoE,IAAI,CAAC,MAAM,GAAG,CACnF,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QAExC,6EAA6E;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,wBAAwB,YAAY,2BAA2B,YAAY,mDAAmD,CAAC,CAAC;QAC3I,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACvC,KAAK,MAAM,CAAC,IAAI,QAAQ;oBAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChH,CAAC;QAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,2EAA2E;QAC3E,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,QAAQ,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;gBACrG,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,kEAAkE;oBAClE,MAAM,KAAK,GAAI,CAAW,CAAC,OAAO,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,IAAI;wBAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;oBACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,EAAE,EAAE,KAAK,EAAE,CAAC;QACd,CAAC;QAED,iEAAiE;QACjE,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9F,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YAC7D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YAC7D,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,CACN,GAAG,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK;gBAC7D,GAAG,MAAM,CAAC,MAAM,YAAY,aAAa,SAAS,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM;gBACzF,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,aAAa;gBACrE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,aAAa;gBACrE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,WAAW;gBACjE,GAAG,MAAM,CAAC,MAAM,SAAS,CAC5B,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QAC9D,IAAI,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -13,7 +13,8 @@ import { execSync } from "child_process";
13
13
  import fs from "fs";
14
14
  import { log, banner } from "../utils/logger.js";
15
15
  import { detectOpenClaw, readOpenClawConfig, writeOpenClawConfig, setConfigValue, } from "../lib/openclaw.js";
16
- import { checkPodHealth, setupAgent, setupAgentViaCp, provisionUserOnPod, installSynapSkill, enableOpenClawAddonManaged, saveLocalPodConfig, checkServerResources, startOpenClawOnServer, findSynapDeployDir, getLocalPodConfig, } from "../lib/pod.js";
16
+ import { checkPodHealth, setupAgentViaPod, provisionUserOnPod, installSynapSkill, enableOpenClawAddonManaged, saveLocalPodConfig, checkServerResources, startOpenClawOnServer, findSynapDeployDir, getLocalPodConfig, getActiveProjectId, } from "../lib/pod.js";
17
+ import { provisionAgentKey, configureAgentContext } from "../lib/targets.js";
17
18
  import { seedAgentEntities } from "../lib/seed.js";
18
19
  import { login, isLoggedIn, listPods, getStoredToken, waitForPodCallback } from "../lib/auth.js";
19
20
  export async function init(opts) {
@@ -156,7 +157,7 @@ async function pathBExisting(opts, detectedUrl) {
156
157
  log.blank();
157
158
  let ocStarted = false;
158
159
  try {
159
- startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl);
160
+ startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl, getActiveProjectId());
160
161
  ocStarted = true;
161
162
  log.success("OpenClaw container started");
162
163
  }
@@ -232,7 +233,7 @@ async function pathB(opts) {
232
233
  log.blank();
233
234
  try {
234
235
  const localConfig = getLocalPodConfig();
235
- startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl);
236
+ startOpenClawOnServer(apiKey, localConfig?.agentUserId ?? "", localConfig?.workspaceId ?? "", podUrl, getActiveProjectId());
236
237
  log.success("OpenClaw container started");
237
238
  }
238
239
  catch (err) {
@@ -585,23 +586,30 @@ async function connectStep(podUrl, opts, openclawFound, podId) {
585
586
  // The pod trusts the user's session to create agent credentials
586
587
  const spinner = ora("Generating API key for OpenClaw agent...").start();
587
588
  try {
588
- // Provision the user on the pod (creates Kratos identity + pod user account)
589
- // This is idempotent — safe to call on every init
589
+ // Provision the user on the pod (creates Kratos identity + pod user
590
+ // account) AND capture the Kratos session the handshake mints. This is
591
+ // idempotent — safe to call on every init.
592
+ let sessionToken = null;
590
593
  try {
591
- await provisionUserOnPod(podUrl, creds.token);
594
+ ({ sessionToken } = await provisionUserOnPod(podUrl, creds.token));
592
595
  }
593
596
  catch (err) {
594
- // Non-fatal: log warning, proceed anyway (user may already exist from Browser/Relay login)
597
+ // Non-fatal here — the missing-session guard below decides what to do.
595
598
  log.warn(`Could not provision user on pod: ${err instanceof Error ? err.message : String(err)}`);
596
599
  }
597
- // Try using the user's CP session token to call the pod directly
598
- // The pod's setup/agent endpoint accepts PROVISIONING_TOKEN,
599
- // but for managed pods we can also use the CP to relay the request
600
- const result = await setupAgentViaCp(podUrl, creds.token, "openclaw");
600
+ if (!sessionToken) {
601
+ throw new Error("Could not establish a pod session to issue an agent key.");
602
+ }
603
+ // Canonical key issuance: mint a scoped Hub Protocol key via the pod's
604
+ // apiKeys.connectIntegration tRPC procedure — the same path the pod-admin
605
+ // /connect page and the browser use (replaces the removed CP relay).
606
+ const result = await setupAgentViaPod(podUrl, sessionToken, "openclaw");
601
607
  apiKey = result.hubApiKey;
602
608
  opts.apiKey = apiKey;
603
609
  spinner.succeed("API key generated");
604
- log.dim(`Agent user: ${result.agentUserId}`);
610
+ if (result.agentUserId) {
611
+ log.dim(`Agent user: ${result.agentUserId}`);
612
+ }
605
613
  log.dim(`Workspace: ${result.workspaceId}`);
606
614
  log.blank();
607
615
  log.info("This key lets OpenClaw read/write your knowledge graph.");
@@ -665,16 +673,20 @@ async function connectStep(podUrl, opts, openclawFound, podId) {
665
673
  if (token) {
666
674
  const spinner = ora("Creating agent credentials...").start();
667
675
  try {
668
- const result = await setupAgent(podUrl, token, "openclaw");
676
+ // Agents are pod-wide singletons now — setupAgent() never passed a
677
+ // workspaceId in its request either, so the response's workspaceId
678
+ // was already always null/"" in practice. Provision via the shared
679
+ // wrapper (no enrollAgentIfNeeded: a PROVISIONING_TOKEN can't
680
+ // authorize /workspaces/enroll-agent, same as before).
681
+ const result = await provisionAgentKey(podUrl, token, "openclaw");
669
682
  apiKey = result.hubApiKey;
670
683
  opts.apiKey = apiKey;
671
684
  spinner.succeed("Credentials created");
672
685
  log.dim(`Agent: ${result.agentUserId}`);
673
- log.dim(`Workspace: ${result.workspaceId}`);
674
686
  saveLocalPodConfig({
675
687
  podUrl,
676
688
  podId: podId ?? undefined,
677
- workspaceId: result.workspaceId,
689
+ workspaceId: "",
678
690
  agentUserId: result.agentUserId,
679
691
  hubApiKey: result.hubApiKey,
680
692
  savedAt: new Date().toISOString(),
@@ -682,10 +694,17 @@ async function connectStep(podUrl, opts, openclawFound, podId) {
682
694
  if (openclawFound) {
683
695
  const config = readOpenClawConfig() ?? {};
684
696
  setConfigValue(config, "synap.podUrl", podUrl);
685
- setConfigValue(config, "synap.workspaceId", result.workspaceId);
686
697
  setConfigValue(config, "synap.agentUserId", result.agentUserId);
687
698
  writeOpenClawConfig(config);
688
699
  }
700
+ if (result.agentUserId) {
701
+ try {
702
+ await configureAgentContext(podUrl, apiKey, "openclaw", result.agentUserId);
703
+ }
704
+ catch (err) {
705
+ log.warn(`Agent context wizard failed: ${err instanceof Error ? err.message : String(err)}`);
706
+ }
707
+ }
689
708
  }
690
709
  catch (err) {
691
710
  spinner.fail(err instanceof Error ? err.message : String(err));