@synap-core/cli 1.11.0 → 1.13.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 (533) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -198
  3. package/dist/build-info.json +6 -0
  4. package/dist/commands/agent-run.js +3 -2
  5. package/dist/commands/agent-run.js.map +1 -1
  6. package/dist/commands/agents.d.ts +32 -17
  7. package/dist/commands/agents.js +203 -237
  8. package/dist/commands/agents.js.map +1 -1
  9. package/dist/commands/app.d.ts +143 -0
  10. package/dist/commands/app.js +524 -0
  11. package/dist/commands/app.js.map +1 -0
  12. package/dist/commands/automate.d.ts +21 -0
  13. package/dist/commands/automate.js +42 -0
  14. package/dist/commands/automate.js.map +1 -0
  15. package/dist/commands/automation-schema.test.d.ts +16 -0
  16. package/dist/commands/automation-schema.test.js +77 -0
  17. package/dist/commands/automation-schema.test.js.map +1 -0
  18. package/dist/commands/automation.d.ts +12 -0
  19. package/dist/commands/automation.js +116 -66
  20. package/dist/commands/automation.js.map +1 -1
  21. package/dist/commands/box.d.ts +42 -0
  22. package/dist/commands/box.js +89 -0
  23. package/dist/commands/box.js.map +1 -0
  24. package/dist/commands/bridge-setup.d.ts +14 -1
  25. package/dist/commands/bridge-setup.js +395 -129
  26. package/dist/commands/bridge-setup.js.map +1 -1
  27. package/dist/commands/cap-connections.d.ts +4 -4
  28. package/dist/commands/cap-connections.js +14 -14
  29. package/dist/commands/cap-connections.js.map +1 -1
  30. package/dist/commands/capability.d.ts +3 -1
  31. package/dist/commands/capability.js +249 -176
  32. package/dist/commands/capability.js.map +1 -1
  33. package/dist/commands/catalog.d.ts +275 -0
  34. package/dist/commands/catalog.js +481 -0
  35. package/dist/commands/catalog.js.map +1 -0
  36. package/dist/commands/cell.d.ts +155 -8
  37. package/dist/commands/cell.js +416 -40
  38. package/dist/commands/cell.js.map +1 -1
  39. package/dist/commands/centrality.js +1 -13
  40. package/dist/commands/centrality.js.map +1 -1
  41. package/dist/commands/close-questions.d.ts +27 -0
  42. package/dist/commands/close-questions.js +49 -0
  43. package/dist/commands/close-questions.js.map +1 -0
  44. package/dist/commands/close-questions.test.d.ts +1 -0
  45. package/dist/commands/close-questions.test.js +52 -0
  46. package/dist/commands/close-questions.test.js.map +1 -0
  47. package/dist/commands/connect.d.ts +36 -13
  48. package/dist/commands/connect.js +68 -167
  49. package/dist/commands/connect.js.map +1 -1
  50. package/dist/commands/connections.d.ts +3 -2
  51. package/dist/commands/connections.js +95 -25
  52. package/dist/commands/connections.js.map +1 -1
  53. package/dist/commands/context.js +79 -44
  54. package/dist/commands/context.js.map +1 -1
  55. package/dist/commands/data-extra.d.ts +34 -0
  56. package/dist/commands/data-extra.js +203 -25
  57. package/dist/commands/data-extra.js.map +1 -1
  58. package/dist/commands/data.d.ts +120 -2
  59. package/dist/commands/data.js +295 -21
  60. package/dist/commands/data.js.map +1 -1
  61. package/dist/commands/diagnose.d.ts +66 -4
  62. package/dist/commands/diagnose.js +285 -28
  63. package/dist/commands/diagnose.js.map +1 -1
  64. package/dist/commands/doc.d.ts +11 -4
  65. package/dist/commands/doc.js +39 -14
  66. package/dist/commands/doc.js.map +1 -1
  67. package/dist/commands/doctor.d.ts +133 -3
  68. package/dist/commands/doctor.js +761 -41
  69. package/dist/commands/doctor.js.map +1 -1
  70. package/dist/commands/explain.js +5 -5
  71. package/dist/commands/explain.js.map +1 -1
  72. package/dist/commands/hooks.d.ts +19 -0
  73. package/dist/commands/hooks.js +70 -0
  74. package/dist/commands/hooks.js.map +1 -0
  75. package/dist/commands/import.d.ts +393 -13
  76. package/dist/commands/import.js +1150 -54
  77. package/dist/commands/import.js.map +1 -1
  78. package/dist/commands/init.d.ts +34 -9
  79. package/dist/commands/init.js +481 -981
  80. package/dist/commands/init.js.map +1 -1
  81. package/dist/commands/keys.d.ts +1 -0
  82. package/dist/commands/keys.js +15 -2
  83. package/dist/commands/keys.js.map +1 -1
  84. package/dist/commands/knowledge.d.ts +22 -6
  85. package/dist/commands/knowledge.js +121 -57
  86. package/dist/commands/knowledge.js.map +1 -1
  87. package/dist/commands/lens.d.ts +37 -1
  88. package/dist/commands/lens.js +194 -72
  89. package/dist/commands/lens.js.map +1 -1
  90. package/dist/commands/market-authoring.d.ts +29 -2
  91. package/dist/commands/market-authoring.js +348 -7
  92. package/dist/commands/market-authoring.js.map +1 -1
  93. package/dist/commands/market-official.d.ts +58 -0
  94. package/dist/commands/market-official.js +84 -0
  95. package/dist/commands/market-official.js.map +1 -0
  96. package/dist/commands/market.d.ts +400 -16
  97. package/dist/commands/market.js +1802 -146
  98. package/dist/commands/market.js.map +1 -1
  99. package/dist/commands/mcp.d.ts +60 -25
  100. package/dist/commands/mcp.js +251 -64
  101. package/dist/commands/mcp.js.map +1 -1
  102. package/dist/commands/observe.category.test.d.ts +1 -0
  103. package/dist/commands/observe.category.test.js +59 -0
  104. package/dist/commands/observe.category.test.js.map +1 -0
  105. package/dist/commands/observe.d.ts +3 -0
  106. package/dist/commands/observe.js +7 -5
  107. package/dist/commands/observe.js.map +1 -1
  108. package/dist/commands/observe.title.test.d.ts +1 -0
  109. package/dist/commands/observe.title.test.js +37 -0
  110. package/dist/commands/observe.title.test.js.map +1 -0
  111. package/dist/commands/open.d.ts +39 -9
  112. package/dist/commands/open.js +80 -25
  113. package/dist/commands/open.js.map +1 -1
  114. package/dist/commands/playbook.d.ts +42 -0
  115. package/dist/commands/playbook.js +171 -0
  116. package/dist/commands/playbook.js.map +1 -0
  117. package/dist/commands/pod.js +1 -1
  118. package/dist/commands/pod.js.map +1 -1
  119. package/dist/commands/pods.d.ts +11 -1
  120. package/dist/commands/pods.js +129 -131
  121. package/dist/commands/pods.js.map +1 -1
  122. package/dist/commands/proposals-actions.d.ts +62 -0
  123. package/dist/commands/proposals-actions.js +143 -8
  124. package/dist/commands/proposals-actions.js.map +1 -1
  125. package/dist/commands/proposals-await.d.ts +68 -0
  126. package/dist/commands/proposals-await.js +248 -0
  127. package/dist/commands/proposals-await.js.map +1 -0
  128. package/dist/commands/proton-setup.d.ts +73 -0
  129. package/dist/commands/proton-setup.js +579 -0
  130. package/dist/commands/proton-setup.js.map +1 -0
  131. package/dist/commands/providers.d.ts +23 -0
  132. package/dist/commands/providers.js +126 -1
  133. package/dist/commands/providers.js.map +1 -1
  134. package/dist/commands/raycast.js +6 -2
  135. package/dist/commands/raycast.js.map +1 -1
  136. package/dist/commands/rule.d.ts +150 -0
  137. package/dist/commands/rule.js +447 -0
  138. package/dist/commands/rule.js.map +1 -0
  139. package/dist/commands/session-feed-wait.d.ts +48 -0
  140. package/dist/commands/session-feed-wait.js +261 -0
  141. package/dist/commands/session-feed-wait.js.map +1 -0
  142. package/dist/commands/session-post.d.ts +40 -0
  143. package/dist/commands/session-post.js +96 -0
  144. package/dist/commands/session-post.js.map +1 -0
  145. package/dist/commands/session-wait.d.ts +116 -0
  146. package/dist/commands/session-wait.js +224 -0
  147. package/dist/commands/session-wait.js.map +1 -0
  148. package/dist/commands/sessions.d.ts +54 -0
  149. package/dist/commands/sessions.js +501 -58
  150. package/dist/commands/sessions.js.map +1 -1
  151. package/dist/commands/skill-manage.d.ts +21 -0
  152. package/dist/commands/skill-manage.js +136 -19
  153. package/dist/commands/skill-manage.js.map +1 -1
  154. package/dist/commands/skills-commands.d.ts +2 -0
  155. package/dist/commands/skills-commands.js +9 -1
  156. package/dist/commands/skills-commands.js.map +1 -1
  157. package/dist/commands/skills-commands.test.d.ts +1 -0
  158. package/dist/commands/skills-commands.test.js +57 -0
  159. package/dist/commands/skills-commands.test.js.map +1 -0
  160. package/dist/commands/skills.js +16 -0
  161. package/dist/commands/skills.js.map +1 -1
  162. package/dist/commands/status.d.ts +1 -4
  163. package/dist/commands/status.js +6 -35
  164. package/dist/commands/status.js.map +1 -1
  165. package/dist/commands/statusline.backoff.test.d.ts +13 -0
  166. package/dist/commands/statusline.backoff.test.js +100 -0
  167. package/dist/commands/statusline.backoff.test.js.map +1 -0
  168. package/dist/commands/statusline.js +16 -9
  169. package/dist/commands/statusline.js.map +1 -1
  170. package/dist/commands/sync-status.d.ts +12 -0
  171. package/dist/commands/sync-status.js +125 -0
  172. package/dist/commands/sync-status.js.map +1 -0
  173. package/dist/commands/templates-retire.d.ts +34 -0
  174. package/dist/commands/templates-retire.js +192 -0
  175. package/dist/commands/templates-retire.js.map +1 -0
  176. package/dist/commands/tools.js +6 -21
  177. package/dist/commands/tools.js.map +1 -1
  178. package/dist/commands/tracks.d.ts +112 -0
  179. package/dist/commands/tracks.js +543 -0
  180. package/dist/commands/tracks.js.map +1 -0
  181. package/dist/commands/update.d.ts +3 -11
  182. package/dist/commands/update.js +5 -134
  183. package/dist/commands/update.js.map +1 -1
  184. package/dist/commands/upload.d.ts +41 -3
  185. package/dist/commands/upload.js +120 -18
  186. package/dist/commands/upload.js.map +1 -1
  187. package/dist/commands/vendor.d.ts +28 -0
  188. package/dist/commands/vendor.js +110 -0
  189. package/dist/commands/vendor.js.map +1 -0
  190. package/dist/commands/versions.js +6 -0
  191. package/dist/commands/versions.js.map +1 -1
  192. package/dist/commands/view.js +10 -5
  193. package/dist/commands/view.js.map +1 -1
  194. package/dist/commands/whoami.d.ts +30 -3
  195. package/dist/commands/whoami.js +186 -23
  196. package/dist/commands/whoami.js.map +1 -1
  197. package/dist/commands/worker-accounts.d.ts +149 -0
  198. package/dist/commands/worker-accounts.js +339 -0
  199. package/dist/commands/worker-accounts.js.map +1 -0
  200. package/dist/commands/worker-accounts.test.d.ts +1 -0
  201. package/dist/commands/worker-accounts.test.js +224 -0
  202. package/dist/commands/worker-accounts.test.js.map +1 -0
  203. package/dist/commands/worker.d.ts +331 -0
  204. package/dist/commands/worker.js +1067 -0
  205. package/dist/commands/worker.js.map +1 -0
  206. package/dist/commands/worker.test.d.ts +1 -0
  207. package/dist/commands/worker.test.js +427 -0
  208. package/dist/commands/worker.test.js.map +1 -0
  209. package/dist/commands/workspace-ops.d.ts +35 -0
  210. package/dist/commands/workspace-ops.js +153 -0
  211. package/dist/commands/workspace-ops.js.map +1 -0
  212. package/dist/index.d.ts +6 -6
  213. package/dist/index.js +1043 -186
  214. package/dist/index.js.map +1 -1
  215. package/dist/lib/agent-connections.d.ts +31 -0
  216. package/dist/lib/agent-connections.js +33 -0
  217. package/dist/lib/agent-connections.js.map +1 -0
  218. package/dist/lib/agent-detect.d.ts +27 -0
  219. package/dist/lib/agent-detect.js +71 -0
  220. package/dist/lib/agent-detect.js.map +1 -0
  221. package/dist/lib/agent-door.d.ts +136 -0
  222. package/dist/lib/agent-door.js +429 -0
  223. package/dist/lib/agent-door.js.map +1 -0
  224. package/dist/lib/agents-config.d.ts +2 -0
  225. package/dist/lib/agents-config.js +4 -9
  226. package/dist/lib/agents-config.js.map +1 -1
  227. package/dist/lib/approval-poll.d.ts +31 -2
  228. package/dist/lib/approval-poll.js +20 -7
  229. package/dist/lib/approval-poll.js.map +1 -1
  230. package/dist/lib/atomic-file.d.ts +48 -0
  231. package/dist/lib/atomic-file.js +129 -0
  232. package/dist/lib/atomic-file.js.map +1 -0
  233. package/dist/lib/auth.d.ts +17 -11
  234. package/dist/lib/auth.js +47 -64
  235. package/dist/lib/auth.js.map +1 -1
  236. package/dist/lib/batch-approval.d.ts +85 -0
  237. package/dist/lib/batch-approval.js +170 -0
  238. package/dist/lib/batch-approval.js.map +1 -0
  239. package/dist/lib/box/egress.d.ts +82 -0
  240. package/dist/lib/box/egress.js +264 -0
  241. package/dist/lib/box/egress.js.map +1 -0
  242. package/dist/lib/box/evidence.d.ts +86 -0
  243. package/dist/lib/box/evidence.js +121 -0
  244. package/dist/lib/box/evidence.js.map +1 -0
  245. package/dist/lib/box/job-server.d.ts +72 -0
  246. package/dist/lib/box/job-server.js +246 -0
  247. package/dist/lib/box/job-server.js.map +1 -0
  248. package/dist/lib/box/provisioner.d.ts +83 -0
  249. package/dist/lib/box/provisioner.js +312 -0
  250. package/dist/lib/box/provisioner.js.map +1 -0
  251. package/dist/lib/box/proxmox.d.ts +112 -0
  252. package/dist/lib/box/proxmox.js +211 -0
  253. package/dist/lib/box/proxmox.js.map +1 -0
  254. package/dist/lib/box/wire.d.ts +98 -0
  255. package/dist/lib/box/wire.js +70 -0
  256. package/dist/lib/box/wire.js.map +1 -0
  257. package/dist/lib/capture-lane.d.ts +6 -5
  258. package/dist/lib/capture-lane.js +6 -5
  259. package/dist/lib/capture-lane.js.map +1 -1
  260. package/dist/lib/capture-structure.d.ts +230 -11
  261. package/dist/lib/capture-structure.js +251 -13
  262. package/dist/lib/capture-structure.js.map +1 -1
  263. package/dist/lib/catalog-templates.d.ts +59 -0
  264. package/dist/lib/catalog-templates.js +126 -0
  265. package/dist/lib/catalog-templates.js.map +1 -0
  266. package/dist/lib/cli-build.d.ts +19 -0
  267. package/dist/lib/cli-build.js +37 -0
  268. package/dist/lib/cli-build.js.map +1 -0
  269. package/dist/lib/client-header.test.d.ts +1 -0
  270. package/dist/lib/client-header.test.js +85 -0
  271. package/dist/lib/client-header.test.js.map +1 -0
  272. package/dist/lib/conversation-headers.d.ts +33 -0
  273. package/dist/lib/conversation-headers.js +69 -0
  274. package/dist/lib/conversation-headers.js.map +1 -0
  275. package/dist/lib/cp-packages.d.ts +167 -11
  276. package/dist/lib/cp-packages.js +253 -21
  277. package/dist/lib/cp-packages.js.map +1 -1
  278. package/dist/lib/credential-class.d.ts +144 -0
  279. package/dist/lib/credential-class.js +138 -0
  280. package/dist/lib/credential-class.js.map +1 -0
  281. package/dist/lib/describe-lens.d.ts +35 -0
  282. package/dist/lib/describe-lens.js +40 -0
  283. package/dist/lib/describe-lens.js.map +1 -1
  284. package/dist/lib/device-connect.d.ts +125 -0
  285. package/dist/lib/device-connect.js +256 -0
  286. package/dist/lib/device-connect.js.map +1 -0
  287. package/dist/lib/directory-lens.d.ts +99 -0
  288. package/dist/lib/directory-lens.js +187 -0
  289. package/dist/lib/directory-lens.js.map +1 -0
  290. package/dist/lib/exporter-coverage.d.ts +71 -0
  291. package/dist/lib/exporter-coverage.js +97 -0
  292. package/dist/lib/exporter-coverage.js.map +1 -0
  293. package/dist/lib/goal-words.d.ts +38 -0
  294. package/dist/lib/goal-words.js +112 -0
  295. package/dist/lib/goal-words.js.map +1 -0
  296. package/dist/lib/hub-client.d.ts +57 -15
  297. package/dist/lib/hub-client.js +396 -82
  298. package/dist/lib/hub-client.js.map +1 -1
  299. package/dist/lib/init-connect.d.ts +41 -0
  300. package/dist/lib/init-connect.js +75 -0
  301. package/dist/lib/init-connect.js.map +1 -0
  302. package/dist/lib/init-exit.d.ts +24 -0
  303. package/dist/lib/init-exit.js +41 -0
  304. package/dist/lib/init-exit.js.map +1 -0
  305. package/dist/lib/init-flow.d.ts +25 -0
  306. package/dist/lib/init-flow.js +40 -0
  307. package/dist/lib/init-flow.js.map +1 -0
  308. package/dist/lib/init-handoff.d.ts +24 -0
  309. package/dist/lib/init-handoff.js +26 -0
  310. package/dist/lib/init-handoff.js.map +1 -0
  311. package/dist/lib/init-output.d.ts +18 -0
  312. package/dist/lib/init-output.js +43 -0
  313. package/dist/lib/init-output.js.map +1 -0
  314. package/dist/lib/init-pod.d.ts +45 -0
  315. package/dist/lib/init-pod.js +36 -0
  316. package/dist/lib/init-pod.js.map +1 -0
  317. package/dist/lib/installed.d.ts +210 -11
  318. package/dist/lib/installed.js +234 -36
  319. package/dist/lib/installed.js.map +1 -1
  320. package/dist/lib/key-approval.d.ts +57 -0
  321. package/dist/lib/key-approval.js +117 -0
  322. package/dist/lib/key-approval.js.map +1 -0
  323. package/dist/lib/key-diagnosis.d.ts +56 -0
  324. package/dist/lib/key-diagnosis.js +227 -0
  325. package/dist/lib/key-diagnosis.js.map +1 -0
  326. package/dist/lib/key-doctor.d.ts +136 -0
  327. package/dist/lib/key-doctor.js +286 -0
  328. package/dist/lib/key-doctor.js.map +1 -0
  329. package/dist/lib/key-locations.d.ts +120 -0
  330. package/dist/lib/key-locations.js +326 -0
  331. package/dist/lib/key-locations.js.map +1 -0
  332. package/dist/lib/key-source.d.ts +68 -0
  333. package/dist/lib/key-source.js +109 -0
  334. package/dist/lib/key-source.js.map +1 -0
  335. package/dist/lib/key-state.d.ts +70 -0
  336. package/dist/lib/key-state.js +115 -0
  337. package/dist/lib/key-state.js.map +1 -0
  338. package/dist/lib/kind-package.d.ts +181 -0
  339. package/dist/lib/kind-package.js +679 -0
  340. package/dist/lib/kind-package.js.map +1 -0
  341. package/dist/lib/knowledge-title.d.ts +25 -0
  342. package/dist/lib/knowledge-title.js +47 -0
  343. package/dist/lib/knowledge-title.js.map +1 -0
  344. package/dist/lib/knowledge-title.test.d.ts +1 -0
  345. package/dist/lib/knowledge-title.test.js +34 -0
  346. package/dist/lib/knowledge-title.test.js.map +1 -0
  347. package/dist/lib/machine-instance.d.ts +64 -0
  348. package/dist/lib/machine-instance.js +142 -0
  349. package/dist/lib/machine-instance.js.map +1 -0
  350. package/dist/lib/mcp-bridge.d.ts +49 -0
  351. package/dist/lib/mcp-bridge.js +180 -0
  352. package/dist/lib/mcp-bridge.js.map +1 -0
  353. package/dist/lib/mcp-bridge.test.d.ts +1 -0
  354. package/dist/lib/mcp-bridge.test.js +118 -0
  355. package/dist/lib/mcp-bridge.test.js.map +1 -0
  356. package/dist/lib/mcp-call.d.ts +30 -0
  357. package/dist/lib/mcp-call.js +107 -0
  358. package/dist/lib/mcp-call.js.map +1 -0
  359. package/dist/lib/mcp-snippets.d.ts +53 -0
  360. package/dist/lib/mcp-snippets.js +82 -0
  361. package/dist/lib/mcp-snippets.js.map +1 -0
  362. package/dist/lib/next-steps.d.ts +8 -0
  363. package/dist/lib/next-steps.js +31 -1
  364. package/dist/lib/next-steps.js.map +1 -1
  365. package/dist/lib/openclaw.js +3 -2
  366. package/dist/lib/openclaw.js.map +1 -1
  367. package/dist/lib/package-wire.d.ts +179 -0
  368. package/dist/lib/package-wire.js +68 -0
  369. package/dist/lib/package-wire.js.map +1 -0
  370. package/dist/lib/pair-link.d.ts +38 -0
  371. package/dist/lib/pair-link.js +68 -0
  372. package/dist/lib/pair-link.js.map +1 -0
  373. package/dist/lib/pod-moved.d.ts +70 -0
  374. package/dist/lib/pod-moved.js +146 -0
  375. package/dist/lib/pod-moved.js.map +1 -0
  376. package/dist/lib/pod-reach.d.ts +39 -0
  377. package/dist/lib/pod-reach.js +117 -0
  378. package/dist/lib/pod-reach.js.map +1 -0
  379. package/dist/lib/pod-reach.test.d.ts +1 -0
  380. package/dist/lib/pod-reach.test.js +67 -0
  381. package/dist/lib/pod-reach.test.js.map +1 -0
  382. package/dist/lib/pod-wide.d.ts +40 -0
  383. package/dist/lib/pod-wide.js +46 -0
  384. package/dist/lib/pod-wide.js.map +1 -0
  385. package/dist/lib/pod.d.ts +74 -112
  386. package/dist/lib/pod.js +146 -415
  387. package/dist/lib/pod.js.map +1 -1
  388. package/dist/lib/project-ref.d.ts +9 -3
  389. package/dist/lib/project-ref.js +10 -4
  390. package/dist/lib/project-ref.js.map +1 -1
  391. package/dist/lib/register-claude-code-mcp.test.d.ts +1 -0
  392. package/dist/lib/register-claude-code-mcp.test.js +78 -0
  393. package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
  394. package/dist/lib/review-credential.d.ts +119 -0
  395. package/dist/lib/review-credential.js +149 -0
  396. package/dist/lib/review-credential.js.map +1 -0
  397. package/dist/lib/safe-open.d.ts +49 -0
  398. package/dist/lib/safe-open.js +119 -0
  399. package/dist/lib/safe-open.js.map +1 -0
  400. package/dist/lib/session-feed.d.ts +185 -0
  401. package/dist/lib/session-feed.js +257 -0
  402. package/dist/lib/session-feed.js.map +1 -0
  403. package/dist/lib/session-lens.d.ts +40 -1
  404. package/dist/lib/session-lens.js +54 -4
  405. package/dist/lib/session-lens.js.map +1 -1
  406. package/dist/lib/superwhisper-import.d.ts +8 -0
  407. package/dist/lib/superwhisper-import.js +14 -7
  408. package/dist/lib/superwhisper-import.js.map +1 -1
  409. package/dist/lib/superwhisper-title.test.d.ts +1 -0
  410. package/dist/lib/superwhisper-title.test.js +18 -0
  411. package/dist/lib/superwhisper-title.test.js.map +1 -0
  412. package/dist/lib/targets.d.ts +152 -10
  413. package/dist/lib/targets.js +974 -325
  414. package/dist/lib/targets.js.map +1 -1
  415. package/dist/lib/template-file.d.ts +4 -0
  416. package/dist/lib/template-file.js.map +1 -1
  417. package/dist/lib/template-lifecycle.d.ts +217 -0
  418. package/dist/lib/template-lifecycle.js +433 -0
  419. package/dist/lib/template-lifecycle.js.map +1 -0
  420. package/dist/lib/template-steps.d.ts +88 -0
  421. package/dist/lib/template-steps.js +118 -0
  422. package/dist/lib/template-steps.js.map +1 -0
  423. package/dist/lib/time-ago.d.ts +2 -0
  424. package/dist/lib/time-ago.js +15 -0
  425. package/dist/lib/time-ago.js.map +1 -0
  426. package/dist/lib/wake-hook-settings.d.ts +57 -0
  427. package/dist/lib/wake-hook-settings.js +153 -0
  428. package/dist/lib/wake-hook-settings.js.map +1 -0
  429. package/dist/lib/wake-state.d.ts +65 -0
  430. package/dist/lib/wake-state.js +122 -0
  431. package/dist/lib/wake-state.js.map +1 -0
  432. package/dist/utils/logger.js +5 -2
  433. package/dist/utils/logger.js.map +1 -1
  434. package/package.json +26 -17
  435. package/skills/README.md +13 -11
  436. package/skills/agent-os/SKILL.md +214 -99
  437. package/skills/manifest.json +1 -1
  438. package/skills/onboard/SKILL.md +55 -26
  439. package/skills/synap/README.md +5 -8
  440. package/skills/synap/SKILL.md +1149 -289
  441. package/skills/synap/_order.txt +7 -0
  442. package/skills/synap/_skill.yaml +1 -1
  443. package/skills/synap/automations.md +15 -0
  444. package/skills/synap/capture.md +5 -0
  445. package/skills/synap/cli-operations.md +24 -18
  446. package/skills/synap/code-skills.md +70 -0
  447. package/skills/synap/concepts.md +36 -0
  448. package/skills/synap/content-os.md +10 -1
  449. package/skills/synap/creative-loop.md +15 -10
  450. package/skills/synap/crm.md +21 -52
  451. package/skills/synap/document-embeds.md +143 -47
  452. package/skills/synap/escalation-ladder.md +20 -10
  453. package/skills/synap/focus-sessions.md +56 -21
  454. package/skills/synap/from-intent.md +158 -0
  455. package/skills/synap/governance-rules.md +5 -5
  456. package/skills/synap/governance.md +10 -7
  457. package/skills/synap/hand-off.md +33 -0
  458. package/skills/synap/inline-patterns.md +15 -7
  459. package/skills/synap/lenses.md +34 -16
  460. package/skills/synap/linking.md +42 -41
  461. package/skills/synap/mcp-remote-servers.md +64 -0
  462. package/skills/synap/mental-model.md +17 -15
  463. package/skills/synap/operating-mode-rules.md +2 -2
  464. package/skills/synap/processes.md +118 -0
  465. package/skills/synap/quick-reference.md +7 -2
  466. package/skills/synap/reading.md +3 -1
  467. package/skills/synap/reflexes.md +12 -42
  468. package/skills/synap/viewframe-cells.md +38 -5
  469. package/skills/synap/work-flow.md +1 -1
  470. package/skills/synap/work-model.md +110 -0
  471. package/skills/synap/worked-examples.md +4 -5
  472. package/skills/synap/workspace-design.md +15 -11
  473. package/skills/synap/writes.md +105 -25
  474. package/skills/synap/writing-titles.md +63 -0
  475. package/skills/synap-app/SKILL.md +149 -67
  476. package/skills/synap-app/_skill.yaml +1 -1
  477. package/skills/synap-app/creating-the-base-app.md +12 -7
  478. package/skills/synap-app/governance.md +27 -16
  479. package/skills/synap-app/install-commands.md +18 -9
  480. package/skills/synap-app/overview.md +16 -9
  481. package/skills/synap-app/using-the-sdk.md +75 -25
  482. package/skills/synap-design/SKILL.md +474 -0
  483. package/skills/synap-design/_order.txt +4 -0
  484. package/skills/synap-design/_skill.yaml +21 -0
  485. package/skills/synap-design/loop.md +134 -0
  486. package/skills/synap-design/overview.md +44 -0
  487. package/skills/synap-design/principles.md +130 -0
  488. package/skills/synap-design/system.md +133 -0
  489. package/skills/synap-market/SKILL.md +306 -16
  490. package/skills/synap-market/_skill.yaml +1 -1
  491. package/skills/synap-market/author-and-publish.md +145 -8
  492. package/skills/synap-market/governance-and-catalog.md +7 -0
  493. package/skills/synap-market/install.md +79 -1
  494. package/skills/synap-market/overview.md +74 -6
  495. package/skills/synap-schema/SKILL.md +172 -10
  496. package/skills/synap-schema/_order.txt +2 -0
  497. package/skills/synap-schema/_skill.yaml +4 -2
  498. package/skills/synap-schema/common-mistakes.md +4 -2
  499. package/skills/synap-schema/discover-profiles.md +1 -1
  500. package/skills/synap-schema/entity-scope.md +15 -3
  501. package/skills/synap-schema/extend-first.md +29 -0
  502. package/skills/synap-schema/extend-vs-create.md +1 -1
  503. package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
  504. package/skills/synap-schema/property-types.md +1 -1
  505. package/skills/synap-schema/relations.md +1 -1
  506. package/skills/synap-ui/SKILL.md +19 -12
  507. package/skills/synap-ui/_skill.yaml +1 -1
  508. package/skills/synap-ui/ai-companion.md +1 -1
  509. package/skills/synap-ui/arranging-bento.md +2 -0
  510. package/skills/synap-ui/bento-layouts.md +10 -10
  511. package/skills/synap-ui/bento-recipes.md +313 -543
  512. package/skills/synap-ui/four-builds.md +5 -0
  513. package/skills/synap-ui/view-types.md +2 -2
  514. package/skills/synap-ui/widget-catalog.md +22 -278
  515. package/templates/automations/bookmark-enrichment.automation.json +290 -13
  516. package/templates/automations/url-bookmark-capture.automation.json +73 -11
  517. package/templates/box/runner.py +206 -0
  518. package/templates/skills/authoring-playbooks/SKILL.md +6 -3
  519. package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
  520. package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
  521. package/dist/commands/infra.d.ts +0 -21
  522. package/dist/commands/infra.js +0 -262
  523. package/dist/commands/infra.js.map +0 -1
  524. package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -1261
  525. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -1647
  526. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -1647
  527. package/node_modules/@synap/hub-rest-client/dist/index.js +0 -1231
  528. package/node_modules/@synap/hub-rest-client/package.json +0 -45
  529. package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1631
  530. package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
  531. package/node_modules/@synap/hub-rest-client/src/index.ts +0 -153
  532. package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -133
  533. package/node_modules/@synap/hub-rest-client/src/types.ts +0 -1299
@@ -25,7 +25,7 @@
25
25
  { "userId": "{userId}",
26
26
  "sourceEntityId": "ent_new_task",
27
27
  "targetEntityId": "ent_acme",
28
- "type": "related_to" }
28
+ "type": "relates_to" }
29
29
  ```
30
30
 
31
31
  5. Confirm: "Task created and linked to Acme, due Friday."
@@ -57,18 +57,17 @@
57
57
  You are authoring this text yourself — it is not a file you have. Don't create
58
58
  a `file`/`document`-kind entity and stuff the Markdown into it.
59
59
 
60
- 1. Search for an existing plan: `GET /entities?q=Q3 launch&profileSlug=knowledge&workspaceId=…` → none
60
+ 1. Search for an existing plan: `GET /entities?q=Q3 launch&profileSlug=note&workspaceId=…` → none
61
61
  2. Create a CONTENT-kind entity carrying the plan as `content` (the doc auto-materializes):
62
62
 
63
63
  ```json
64
64
  POST /api/hub/entities
65
65
  { "userId": "{userId}", "workspaceId": "{wsId}",
66
- "profileSlug": "knowledge",
66
+ "profileSlug": "note",
67
67
  "title": "Q3 launch strategic plan",
68
- "properties": { "ek_type": "reference" },
69
68
  "content": "# Q3 Launch Plan\n\n## Goals\n…\n\n## Timeline\n…"
70
69
  }
71
70
  ```
72
71
 
73
- 3. Link it to the relevant project: `POST /api/hub/relations` `{ sourceEntityId: "ent_new_plan", targetEntityId: "ent_project_q3", type: "related_to" }`.
72
+ 3. Link it to the relevant project: `POST /api/hub/relations` `{ sourceEntityId: "ent_new_plan", targetEntityId: "ent_project_q3", type: "relates_to" }`.
74
73
  4. Confirm: "Plan captured and linked to Q3 launch." No upload, no `file` entity, no separate `synap_create_document` call.
@@ -1,6 +1,8 @@
1
1
  ## Workspace design — is this concern a WORKSPACE, or something smaller?
2
2
 
3
- Before you create a workspace, run the decision rule. A workspace (an operational **domain**) is the heaviest structure in the pod — it owns kinds, confers roles, carries its own team and automations. Most new concerns are NOT domains; they are a **hat**, an **initiative**, or a **stage**. Creating a workspace for one of those is the anti-pattern that fragments the graph. Decide first, then create.
3
+ Before you create a workspace, run the decision rule. A workspace (an operational **domain**) is the heaviest structure in the pod — it owns kinds, confers roles, carries its own team and automations. Most new concerns are NOT domains; they are a **hat**, an **initiative**, a **lasting goal** (a goal — `track` in tools), or a **status**. Creating a workspace for one of those is the anti-pattern that fragments the graph. Decide first, then create. What each word means: `concepts` (the one glossary).
4
+
5
+ **One space per domain:** A space is a domain, installed once (Content, Brand, CRM…). A project is a filter across spaces. To make something “for project X”: file it into X inside the domain's space (`file_into_project`), and link X to the space (`project_use_workspace`). Never create a space named after a project, a brand or a client.
4
6
 
5
7
  ## The decision rule — a concern earns a workspace ONLY if ALL FOUR hold
6
8
 
@@ -11,20 +13,22 @@ Before you create a workspace, run the decision rule. A workspace (an operationa
11
13
 
12
14
  **All four, or it is not a workspace.** Then fork it to the right lighter structure:
13
15
 
14
- | If the concern is… | It is a… | Substrate | Example |
15
- | ----------------------------------------------------------- | -------------- | -------------------------------------- | ------------------------------------------- |
16
- | a **role/hat** an existing entity wears in a domain | **Facet** | `attach_facet` (`profileKind: "role"`) | `client`, `sponsor`, `prospect`, `investor` |
17
- | a **cross-cutting, time-bound initiative** spanning domains | **Project** | `create_project` (a lens) | a campaign, an engagement, a launch |
18
- | a **stage/filter WITHIN a domain** | **State/View** | a `status` property def + a view | pipeline stage, "active"/"archived" |
16
+ | If the concern is… | It is a… | Substrate | Example |
17
+ | ----------------------------------------------------------- | ----------- | -------------------------------------- | ------------------------------------------- |
18
+ | a **role/hat** an existing entity wears in a domain | **Facet** | `attach_facet` (`profileKind: "role"`) | `client`, `sponsor`, `prospect`, `investor` |
19
+ | a **cross-cutting, time-bound initiative** spanning domains | **Project** | `create_project` (a lens) | a campaign, an engagement, a launch |
20
+ | a **lasting goal** a project pursues (worked in sessions) | **Goal** | `start_track` (no method needed) | grow the newsletter, win ten clients |
21
+ | a **stage/filter WITHIN a domain** | **Status** | an option of the kind's lifecycle | pipeline stage, "active"/"archived" |
19
22
 
20
23
  ## The decision procedure (follow in order)
21
24
 
22
25
  1. **Name the source-of-truth noun.** What kind would this workspace _own_ that no existing workspace owns? Run `list_profiles` — if the noun already lives in another domain, you have a facet or a project, not a domain. STOP.
23
26
  2. **Test all four conditions.** Owns kinds AND own team AND native automations AND stable. Any one fails → fork below.
24
- 3. **If it's a hat** (a status/role on an entity that already exists elsewhere) → resolve the entity, `attach_facet`. Never a workspace, never a second entity.
25
- 4. **If it's time-bound work across domains** → `create_project` and set it as the lens; the work files into it from whatever workspace holds the data. **A project is a COMMITMENT WITH GRAVITY** — a real initiative that ties work together (a campaign, an engagement, a client, a launch). Tasks, plans, repos, themes, and topics are **entities**, never projects. Before you create one: (a) **search existing projects first** (`synap orient` / `GET /api/hub/projects`) and prefer **linking into an existing project** via `belongs_to_project` — near-duplicate names are rejected with the existing candidates; (b) an agent-created project must cite **≥5 existing entities** that would belong to it as `evidenceEntityIds` — the backend rejects a project with no gravity and tells you to store it as an entity or reuse an existing project instead; (c) **never create a project for the pod owner's own company** — the company _is_ the pod, not a project inside it.
26
- 5. **If it's a stage inside a domain** → add a `status` property def (`create_property_def`) and a view; don't split the stage into its own space.
27
- 6. **Only if all four held** → **template first** (escalation ladder L3):
27
+ 3. **If it's a hat** (a status/role on an entity that already exists elsewhere) → resolve the entity, `attach_facet`. Never a workspace, never a second entity. One role per name, pod-wide: a role several workspaces use is ONE role, each workspace adding properties by overlay — never a per-workspace twin (`concepts`).
28
+ 4. **If it's time-bound work across domains** → `create_project` and set it as the lens; the work files into it from whatever workspace holds the data. **A project is a COMMITMENT WITH GRAVITY** — a real initiative that ties work together (a campaign, an engagement, a client, a launch). Tasks, plans, repos, themes, and topics are **entities**, never projects. Before you create one: (a) **search existing projects first** (`synap orient` / `GET /api/hub/projects`) and prefer **linking into an existing project** via `belongs_to_project` — a near-duplicate name is filed for the person to review, showing the existing project; (b) an agent-created project must cite **≥5 existing entities** that would belong to it as `evidenceEntityIds` — the backend rejects a project with no gravity and tells you to store it as an entity or reuse an existing project instead; (c) **never create a project for the pod owner's own company** — the company _is_ the pod, not a project inside it.
29
+ 5. **If it's a lasting goal a project pursues** ("keep the content side of the launch going") → a **goal**: `list_tracks`, else `start_track` (`name`, `direction`); work in it with `start_session` + `trackId`. Never a workspace, never a twin project.
30
+ 6. **If it's a stage inside a domain** → it is an option of the kind's or role's declared lifecycle, never a role and never a space. Its pipeline is computed from the lifecycle: open it, don't build one. A kind with no lifecycle yet gets a `status` property def (`create_property_def`).
31
+ 7. **Only if all four held** → **template first** (escalation ladder L3):
28
32
  `market.search({query, kind: "template"})` and propose install of a matching
29
33
  template before freehand `create_workspace`. Freehand create is last resort
30
34
  and always proposed — a deliberate move, offer it to the user (see
@@ -32,7 +36,7 @@ Before you create a workspace, run the decision rule. A workspace (an operationa
32
36
 
33
37
  ## The CRM corollary — the load-bearing example
34
38
 
35
- Operational state — **prospect → client → delivered** — is a **FLOW across domains**, expressed as **facets + a triggered project**, NEVER as workspaces and NEVER by bolting delivery onto the identity domain.
39
+ Operational state — **prospect → client → delivered** — is a **FLOW across domains**, expressed as **facets + an engagement project** (its delivery runs as a goal), NEVER as workspaces and NEVER by bolting delivery onto the identity domain.
36
40
 
37
41
  - CRM = **who** (owns `person`/`company`, confers the `lead`/`client` facets).
38
42
  - Operations = **what we do for them** (owns `engagement`/`contract`/`deliverable`).
@@ -1,11 +1,33 @@
1
1
  ## Core writes
2
2
 
3
- **Two write doors, one gradient.** `create_entity` is for exactly ONE
3
+ > **Scope of this page.** It covers writes that produce ENTITY-shaped data.
4
+ > There are ~30 other write tools (sessions, capabilities, automations, cells,
5
+ > playbooks, views, channels…) that this page does not orient across — reach for
6
+ > `synap_list_capabilities` / the escalation ladder for those. If you are about
7
+ > to pick a tool and the choice feels ambiguous, that ambiguity is real: the
8
+ > tools below differ in ATOMICITY and COLLISION policy, not just in shape.
9
+
10
+ **Two entity-write doors, one gradient.** `create_entity` is for exactly ONE
4
11
  fully-structured, typed entity you already have. For anything unstructured,
5
12
  several entities, or a graph — or **when in doubt** — use the capture door
6
13
  (`synap_capture`, see `capture.md`): precision comes from sending more structure
7
14
  in the SAME call, never from picking a different tool or a second commit step.
8
15
 
16
+ The difference that is NOT visible in either tool's description: `create_entity`
17
+ writes one entity with per-entity governance; capture-with-`entities[]` files ONE
18
+ atomic proposal for the whole graph. Neither rejects a look-alike: a record (or
19
+ one of your own pending proposals) of the same kind with the same name or
20
+ identity makes the write a proposal carrying `duplicateCheck`, and the person
21
+ decides (keep both, use the existing one, fill its empty fields). Only a strong
22
+ identity (email, phone, url, handle, external id) links to the existing record
23
+ on its own. Pick by whether you want a partial write to be possible, not by how
24
+ structured your data feels.
25
+
26
+ **Every title is linted.** Both doors return `titleLint` in the receipt when a
27
+ title breaks the rubric (too long, cut off, status words, ids, a placeholder…);
28
+ the title is stored as sent, so rewrite it. Over 200 characters the write is
29
+ refused. Title rules and what counts as knowledge: `writing-titles.md`.
30
+
9
31
  ### Create an entity (one exact typed entity)
10
32
 
11
33
  Before this call, use `/discover?userId=…&profileSlugs=<kind>` to read the
@@ -31,9 +53,10 @@ The response has legacy `status`/`id` fields plus `writeReceipt`:
31
53
  `pending`/`proposed` means a proposal exists and no entity is live yet;
32
54
  `applied` means the reported direct write completed; `partial` means a follow-up
33
55
  (for example a facet) failed after the entity applied. **A `proposed`/`pending`
34
- receipt is a governed success, not an error** — surface its `reviewUrl`, never
35
- claim completion, and only enrich again when the receipt identifies a real
36
- missing fact.
56
+ receipt is a governed success, not an error** — you MUST surface its
57
+ `reviewUrl` as a clickable markdown link in the same reply (see
58
+ `inline-patterns.md`), never claim completion, and only enrich again when the
59
+ receipt identifies a real missing fact.
37
60
 
38
61
  For several entities, creation-time roles/facets, or relations that need one
39
62
  review, send the whole graph through the capture door (`synap_capture` with
@@ -59,6 +82,28 @@ PATCH /api/hub/entities/{entityId}
59
82
 
60
83
  **Properties are deep-merged — send only the keys you want to change.** An update with `{ "status": "done" }` leaves all other properties untouched. You never need to re-send the full properties object.
61
84
 
85
+ **Many changes → ONE call: `synap_update_entities`** (up to 500 items
86
+ `{id, patch, expected?}`; Hub: `POST /api/hub/entities/batch-update`). Never
87
+ script a loop of single updates, and never apply a change set over Hub REST with
88
+ a user key. Governance is per item: some apply now, the rest ride ONE review for
89
+ the person; the answer lists `applied` / `proposed` / `denied` / `skipped` — a
90
+ partial result is normal. Send `validate: true` first to see each verdict without
91
+ writing, and an `idempotencyKey` so a retry never acts twice.
92
+
93
+ **A write blocked on a space join is KEPT.** When you write into a space your
94
+ agent has not joined (`synap_orient` marks it `joined: false`), the answer is
95
+ `proposed` with `proposalType: "join"`, `deferred: true` and a `ref`: the write
96
+ rides the join request and is replayed for you once it is approved. Do not
97
+ resend it, and do not retry it into another space.
98
+
99
+ **Moving, not recreating.** A session into another space:
100
+ `synap_update_session` with `moveToWorkspaceId` (never `workspaceId` — that is
101
+ the connection's lens). A kind another space needs: `synap_change_kind_scope`
102
+ (`scope: "shared"` + `allowedWorkspaceIds`), never a twin kind. Records:
103
+ `synap_move_entities`. All three are reviewed.
104
+
105
+ **Removing one: `synap_delete_entity`** (`entityId`, optional `reasoning`). For an agent it is always a proposal — nothing is deleted until the person approves, and no rule can widen that. An approved delete hides the entity (its body is kept) and the person can undo it from the proposal. Do not retry a `proposed` answer.
106
+
62
107
  ### Authored text is content, not a `file`
63
108
 
64
109
  Something **you** author — a pitch deck, a strategic plan, a note body — is
@@ -67,8 +112,8 @@ kind (`note`, `knowledge`, or a fitting domain kind) with `content` set to the
67
112
  Markdown body; Synap **auto-materializes** that `content` into a real
68
113
  versioned document behind the scenes (`entities WHERE documentId = ?`) — no
69
114
  upload step needed. `file` is reserved for real uploaded bytes you actually
70
- have (the upload door / `synap upload`) — an agent has no filesystem, so it
71
- rarely touches `file` at all. Reach for `synap_create_document` /
115
+ have (`synap_store_file`; over 10MB `synap_request_upload`) — authored text
116
+ never becomes a `file`. Reach for `synap_create_document` /
72
117
  `POST /api/hub/documents` directly only for a standalone rich document that
73
118
  isn't itself a title-worthy entity (see below) — never as a substitute for an
74
119
  entity's `content`.
@@ -81,10 +126,19 @@ You CAN store content you **hold** — you send it inline. Pick by what you have
81
126
  | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
82
127
  | **Content in hand** — a report/CSV/image/PDF/etc. you generated or received (text or bytes) | **`synap_store_file`** (`content` for text, `contentBase64` for binary) + `mimeType`/`filename` | a `file` entity, content stored **as-is, never read** (≤10MB inline) |
83
128
  | Text you're **authoring as a note/idea** (not "a file") — a plan, a thought | `synap_create_entity` with `content` (a content kind) | body auto-becomes a document — NOT a `file` |
84
- | Only a **URL/link** (no bytes) — a Google Doc, a PDF url, an article | `synap_create_document` with **`url`**, or attach via `entityId` | an external **reference** document (no bytes) |
85
- | A **large file on a local disk** you don't hold in context | the CLI `synap upload <path>` (streams it) — an agent can't send bytes it doesn't have | a `file` entity backed by stored bytes |
129
+ | Only a **URL/link** (no bytes) — a Google Doc, a PDF url, an article | `synap_create_document` with **`url`**; `entityId` only for a thing with no body yet | an external **reference** document (no bytes) |
130
+ | A **large file** (over 10MB, up to 500MB video) | `synap_request_upload` → PUT the bytes to `uploadUrl` → `synap_store_file({ uploadToken })` | a `file` entity backed by stored bytes |
86
131
  | Only a file's **name**, nothing else | you **cannot** invent it — ask the human/client to provide the content or a link | — |
87
132
 
133
+ **A typed thing with a file → the KIND first, the bytes on it.** When a kind
134
+ exists for the thing (a logo is a `brand-asset`, not a `file`; check the space
135
+ brief or `synap_list_profiles`): (1) resolve-or-create that entity
136
+ (`synap_ask`, then `synap_create_entity`); (2) `synap_store_file` with
137
+ `attachToEntityId` = its id (`content` for SVG/text, `contentBase64` for
138
+ binary, ≤10MB inline; larger: `synap_request_upload`, then `uploadToken`); (3) link it /
139
+ `synap_file_into_project` if asked. A `proposed` create has no live id yet —
140
+ attach after approval. A bare `file` is only for bytes with no kind.
141
+
88
142
  **Store ≠ analyze.** `synap_store_file` / `synap_create_document` store content
89
143
  **deterministically — the file is NEVER read by an LLM.** Only fetch a document
90
144
  and reason over it when the user explicitly says "read/analyze this file."
@@ -106,11 +160,19 @@ POST /api/hub/documents
106
160
  "type": "markdown", // "markdown" | "html" | "text" | "code"
107
161
  "entityId": "ent_event_..." // attach to an entity for context
108
162
  }
163
+ // → { "id": "doc_abc", "documentId": "doc_abc", "status": "created", "ackState": "applied",
164
+ // "attached": { "entityId": "ent_event_...", "documentId": "doc_abc", "status": "updated" } }
109
165
  ```
110
166
 
167
+ `attached` reports the attach outcome: it is a governed entity update, so it can
168
+ be `proposed`, and it is `skipped` (with a `reason`) while the document itself is
169
+ awaiting review. Other optional fields: `url` (an https link — creates a reference
170
+ document with no stored bytes), `idempotencyKey` (a retry with the same key returns
171
+ the prior document), `expectedLabel` (the session-output slot it fulfils).
172
+
111
173
  `type: "html"` stores self-contained HTML. The browser renders it via the `html-doc` cell in a sandboxed iframe. Use for AI-generated reports, rich visualisations, custom charts, or anything beyond markdown.
112
174
 
113
- **Full HTML cell workflow** (AI → visible custom UI in any bento):
175
+ **HTML document workflow:**
114
176
 
115
177
  ```json
116
178
  // 1. Create the HTML document
@@ -119,35 +181,51 @@ POST /api/hub/documents
119
181
  "title": "Q2 Revenue Report", "type": "html",
120
182
  "content": "<!DOCTYPE html><html>…</html>",
121
183
  "entityId": "ent_project_..." }
122
- // → { "document": { "id": "doc_abc" }, ... }
123
-
124
- // 2. Place the html-doc cell in any bento view
125
- POST /api/hub/views/{bentoViewId}/arrange
126
- { "userId": "{userId}", "workspaceId": "{workspaceId}",
127
- "widgets": [
128
- { "id": "b1", "kind": "html-doc", "config": { "documentId": "doc_abc" },
129
- "layout": { "x": 0, "y": 0, "w": 8, "h": 6 } }
130
- ] }
184
+ // → { "id": "doc_abc", "documentId": "doc_abc", "status": "created", ... }
131
185
 
132
- // 3. Update the HTML (cell auto-refreshes)
186
+ // 2. Replace the HTML (read it first: GET → `revision`)
133
187
  PATCH /api/hub/documents/doc_abc
134
- { "userId": "{userId}", "content": "<!DOCTYPE html>…updated…</html>" }
188
+ { "userId": "{userId}", "content": "<!DOCTYPE html>…updated…</html>", "baseRevision": 3 }
189
+ // → a pending proposal; readers see the new HTML only once it is approved
135
190
  ```
136
191
 
192
+ `html-doc` is **not** an agent-placeable bento widget: `arrange` rejects it. The
193
+ document renders where it is opened (the Files app, or the entity it is attached
194
+ to). For HTML you want to embed elsewhere, create an HTML cell instance
195
+ (`POST /api/hub/cell-instances/html`) and embed it by `instanceId`.
196
+
137
197
  The iframe uses `sandbox="allow-scripts"` — scripts run but have no same-origin access to the parent app. The HTML is fully isolated.
138
198
 
139
- ### Update a document (title and/or content)
199
+ ### Update a document's content (a patch, reviewed)
200
+
201
+ Change the part you mean, not the whole body. Read it first —
202
+ `GET /api/hub/documents/{id}?userId={userId}` → `content`, `revision`,
203
+ `sections` (id + owner) — then:
140
204
 
141
205
  ```json
142
- PATCH /api/hub/documents/{documentId}
206
+ POST /api/hub/documents/{documentId}/patch
143
207
  {
144
208
  "userId": "{userId}",
145
- "title": "Updated title", // optional
146
- "content": "# Full replacement\n…" // full string — not a diff
209
+ "baseRevision": 3,
210
+ "ops": [
211
+ { "op": "replace_text", "old": "ships on Friday", "new": "ships on Monday" },
212
+ { "op": "upsert_section", "id": "risks", "title": "Risks", "body": "None yet." }
213
+ ]
147
214
  }
148
215
  ```
149
216
 
150
- Content is a **full replacement**, not a patch. Fetch the current content first if you want to append: `GET /api/hub/documents/{id}?userId={userId}` → `.content`, append, then PATCH.
217
+ Ops: `upsert_section {id, title, body}` (one section by id), `replace_text {old,
218
+ new}` (`old` must match **exactly once**, else 400 with the count), `append
219
+ {body}`, `replace_all {content}`, `set_title {title}` (renames the document, a
220
+ human name). An agent's edit is filed as a proposal (a
221
+ governance rule may apply it directly); a person's section (`owner="human"`) is
222
+ never changed and an embed is never dropped unless you pass
223
+ `"allowRemovingEmbeds": true` (403 otherwise). A moved document answers 409 and
224
+ nothing is written: read again. An applied or approved edit reaches open editors
225
+ (`document:content-replaced`), so they reload instead of overwriting it. `PATCH /api/hub/documents/{id}` with `content` is the same door with
226
+ one `replace_all` — it cannot rename (a `title` is refused with 400; to rename the
227
+ document, send a `set_title` op to `POST /api/hub/documents/{id}/patch`). MCP: `synap_update_document`;
228
+ full syntax in `document-embeds.md`.
151
229
 
152
230
  The reverse lookup is `entities WHERE documentId = ?`. Always attach the document to a meaningful entity (the meeting event, the project, the person) — a floating document is another orphan.
153
231
 
@@ -202,6 +280,8 @@ POST /api/hub/entities
202
280
 
203
281
  This creates a first-class decision entity linked to Project Eve. It shows up in traversals, can be superseded later (`supersededBy: newDecisionId`), and survives governance. Memory can't do any of that.
204
282
 
283
+ **A decision the PERSON must make** — create it with `decisionStatus: "proposed"` and the pod asks them for you: pass `decisionOptions` (≤8 of `{label, value?, description?}`) and `recommendedOption` (an option's `value`, else its `label`); set `sourceSessionId` to keep the question in your session. With no options the person sees its `title` with Accept / Reject, each saying what it does. So give it a short `title` (the decision itself, never "Decide: …") and a `summary` that says what the title does not. Only a decision YOU propose asks: a person's own proposed decision is their note, and the pod never asks them about it. Their answer UPDATES that decision — never create a second one. Every answered `confirm`/`choose` ask already files its decision (`slot.decisionId`): don't create one for it. A person-owned slot blocked on a decision is ANSWERED by them (Yes/No or a choice) — it is never closed by marking it done. **Before you recommend**, recall the user's past decisions (`synap_ask`, or find `decision` entities) so your pick follows their past choices.
284
+
205
285
  ### Post to the user's personal channel
206
286
 
207
287
  ```
@@ -0,0 +1,63 @@
1
+ ## Writing titles and knowledge
2
+
3
+ Every write receipt runs the title rubric and returns `titleLint` when a title
4
+ breaks it. The title is stored as you sent it — **rewrite it** (update the
5
+ title) instead of leaving it. The pod never shortens a title for you, and over
6
+ 200 characters it refuses the write.
7
+
8
+ ### Title rules (every kind, every pod)
9
+
10
+ 1. **One complete phrase, 80 characters at most** (aim for 40–70; a question
11
+ may take 110). If it does not fit, rewrite it — never cut it, never end it
12
+ with "…".
13
+ 2. **Name the lasting thing, not the event.** No SHIPPED, LIVE, FIXED, DONE,
14
+ VERIFIED, CORRECTION, no emoji. Status goes in a status property; the date
15
+ is already on the record.
16
+ 3. **No machinery in the title:** no hashes, ids, file paths, line numbers,
17
+ markdown, URLs. They go in the body as evidence.
18
+ 4. **Do not repeat the kind** ("Lesson:", "Decision:", "Caution:", "Finding:").
19
+ The kind and `knowledgeForm` already say it.
20
+ 5. **Plain words.** A code is allowed only when the pod's glossary has it;
21
+ plan codes (T1, D3, W4, Wave A) are replaced by words.
22
+ 6. **Same language as the body.**
23
+ 7. **Search before you create** (`synap_ask`) and keep a title stable on
24
+ update. A superseded decision gets a title that says what replaced it.
25
+ 8. **Never empty, never a placeholder** ("Untitled", "Test", a URL, the first
26
+ words of a transcript).
27
+
28
+ | Kind | Title shape | Example |
29
+ | --- | --- | --- |
30
+ | Knowledge | The claim as a short sentence | Space skills are linked by the brief, not by a row |
31
+ | Decision | What was decided, as a fact | Connection data lives in one package: @synap-core/integrations |
32
+ | Question | A real question ending in ? | Should Grida replace or complement the tldraw whiteboard? |
33
+ | Task | Verb + object (+ who/when) | Send signed agreement to Harbor Goods |
34
+ | Research | Subject + what was assessed | Excalidraw evaluated as a Synap capability |
35
+ | Issue | The problem as a statement | Capture reads the URL but never feeds it to the structurer |
36
+ | Note | What it is about | Farm-to-Client Market — idea brief |
37
+ | Work session | The outcome, short | Frontend package consolidation: 4 layer packages |
38
+ | Run | Run name + instance | Daily client briefing — 12 Oct |
39
+ | Report | Scope + period | Builder weekly report — week of 5 Oct |
40
+
41
+ ### What counts as knowledge
42
+
43
+ Knowledge is something that will **still be true and useful in three months**,
44
+ whenever it was learned. It takes one `knowledgeForm`:
45
+
46
+ - `fact` — how something works.
47
+ - `caution` — a pitfall and how to avoid it.
48
+ - `convention` — how we do things here.
49
+
50
+ The full sentence goes in `ek_claim`; the title is its short handle, never the
51
+ claim cut off. Everything else goes elsewhere:
52
+
53
+ | It is really… | File it as |
54
+ | --- | --- |
55
+ | progress, "shipped", "verified", "done" | the session's outcome or report — not a lasting entity |
56
+ | a choice that was made | `decision` |
57
+ | an open bug or problem | `issue` |
58
+ | a plan, an idea, a hypothesis | `note` (or `question` if it is one) |
59
+ | steps to follow | a skill |
60
+ | a fact about an outside tool, vendor or market | `research` |
61
+
62
+ When unsure, ask: "will this still help someone in three months, and is it a
63
+ fact, a pitfall or a rule?" If not, it is not knowledge.