@notis_ai/cli 0.2.14 → 0.2.16

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 (299) hide show
  1. package/README.md +83 -21
  2. package/dist/agent-hooks/notis-agent-hook.mjs +20168 -0
  3. package/{skills → dist/base-skills}/notis-apps/SKILL.md +167 -72
  4. package/{skills → dist/base-skills}/notis-cli/SKILL.md +86 -28
  5. package/dist/base-skills/notis-query/SKILL.md +705 -0
  6. package/dist/skill-sync/index.js +1528 -0
  7. package/dist/skill-sync/index.js.map +7 -0
  8. package/package.json +5 -2
  9. package/skills/notis-apps/cli.md +39 -18
  10. package/skills/notis-cli/AGENT_INSTRUCTIONS.md +39 -0
  11. package/skills/notis-onboarding/BRIEF.md +16 -0
  12. package/src/agent-hook-entry.js +5 -0
  13. package/src/cli.js +23 -14
  14. package/src/command-specs/agents.js +392 -0
  15. package/src/command-specs/apps.js +1021 -424
  16. package/src/command-specs/auth.js +63 -10
  17. package/src/command-specs/index.js +6 -0
  18. package/src/command-specs/onboarding.js +69 -5
  19. package/src/command-specs/skills.js +56 -0
  20. package/src/runtime/agent-memory-state.js +126 -0
  21. package/src/runtime/agent-setup.js +383 -0
  22. package/src/runtime/app-dev-consumers.js +154 -0
  23. package/src/runtime/app-dev-host-lock.js +80 -0
  24. package/src/runtime/app-dev-process-identity.js +111 -0
  25. package/src/runtime/app-dev-roots.js +284 -0
  26. package/src/runtime/app-dev-server.js +447 -29
  27. package/src/runtime/app-dev-sessions.js +105 -145
  28. package/src/runtime/app-platform.js +1314 -166
  29. package/src/runtime/app-registry-scaffolds.js +367 -0
  30. package/src/runtime/base-skills.d.ts +20 -0
  31. package/src/runtime/base-skills.js +167 -0
  32. package/src/runtime/login-listener.js +15 -0
  33. package/src/runtime/oauth.js +1506 -141
  34. package/src/runtime/output.js +7 -0
  35. package/src/runtime/ports.js +16 -0
  36. package/src/runtime/profiles.js +19 -16
  37. package/src/runtime/skill-sync/cloud-client.ts +96 -0
  38. package/src/runtime/skill-sync/index.ts +644 -0
  39. package/src/runtime/skill-sync/local-scanner.ts +1046 -0
  40. package/src/runtime/skill-sync/symlink-manager.ts +383 -0
  41. package/src/runtime/skill-sync/sync-plan.ts +22 -0
  42. package/src/runtime/skill-sync/types.ts +103 -0
  43. package/src/runtime/skill-sync/write-cloud-skill.ts +50 -0
  44. package/src/runtime/store-screenshot.js +6 -1
  45. package/src/runtime/sync-skills.d.ts +37 -0
  46. package/src/runtime/sync-skills.js +231 -0
  47. package/template/app/layout.tsx +5 -1
  48. package/template/notis.config.ts +1 -0
  49. package/template/packages/sdk/package.json +2 -1
  50. package/template/packages/sdk/src/components/DocumentEditor.tsx +13 -3
  51. package/template/packages/sdk/src/components/MarkdownEditor.tsx +121 -0
  52. package/template/packages/sdk/src/components/MultiSelectActionBar.tsx +43 -119
  53. package/template/packages/sdk/src/components/MultiSelectCheckbox.tsx +5 -1
  54. package/template/packages/sdk/src/components/MultiSelectDragOverlay.tsx +1 -1
  55. package/template/packages/sdk/src/components/NotisSelectionBoundary.tsx +55 -0
  56. package/template/packages/sdk/src/components/ShortcutHints.tsx +56 -0
  57. package/template/packages/sdk/src/config.ts +25 -0
  58. package/template/packages/sdk/src/documents.ts +7 -1
  59. package/template/packages/sdk/src/hooks/useActiveResource.ts +19 -0
  60. package/template/packages/sdk/src/hooks/useCollectionInteractions.ts +726 -0
  61. package/template/packages/sdk/src/hooks/useHandover.ts +3 -0
  62. package/template/packages/sdk/src/hooks/useMultiSelect.ts +44 -482
  63. package/template/packages/sdk/src/hooks/useNotis.ts +3 -0
  64. package/template/packages/sdk/src/hooks/useNotisNavigation.ts +7 -4
  65. package/template/packages/sdk/src/hooks/useTool.ts +5 -4
  66. package/template/packages/sdk/src/index.ts +47 -2
  67. package/template/packages/sdk/src/interactions/actions.ts +46 -0
  68. package/template/packages/sdk/src/interactions/shortcuts.tsx +634 -0
  69. package/template/packages/sdk/src/interactions.ts +41 -0
  70. package/template/packages/sdk/src/provider.tsx +2 -1
  71. package/template/packages/sdk/src/runtime.ts +92 -4
  72. package/dist/scaffolds/notis-database/CHANGELOG.md +0 -5
  73. package/dist/scaffolds/notis-database/app/globals.css +0 -44
  74. package/dist/scaffolds/notis-database/app/layout.tsx +0 -6
  75. package/dist/scaffolds/notis-database/app/page.tsx +0 -1088
  76. package/dist/scaffolds/notis-database/components/ui/badge.tsx +0 -28
  77. package/dist/scaffolds/notis-database/components/ui/button.tsx +0 -53
  78. package/dist/scaffolds/notis-database/components/ui/card.tsx +0 -56
  79. package/dist/scaffolds/notis-database/components/ui/table.tsx +0 -120
  80. package/dist/scaffolds/notis-database/components.json +0 -20
  81. package/dist/scaffolds/notis-database/index.html +0 -12
  82. package/dist/scaffolds/notis-database/lib/types.ts +0 -132
  83. package/dist/scaffolds/notis-database/lib/utils.ts +0 -6
  84. package/dist/scaffolds/notis-database/metadata/screenshot-1.png +0 -0
  85. package/dist/scaffolds/notis-database/metadata/screenshot-2.png +0 -0
  86. package/dist/scaffolds/notis-database/metadata/screenshot-3.png +0 -0
  87. package/dist/scaffolds/notis-database/metadata/screenshot-4.png +0 -0
  88. package/dist/scaffolds/notis-database/metadata/screenshot-5.png +0 -0
  89. package/dist/scaffolds/notis-database/metadata/screenshot-fixtures.json +0 -1839
  90. package/dist/scaffolds/notis-database/notis.config.ts +0 -73
  91. package/dist/scaffolds/notis-database/package-lock.json +0 -3935
  92. package/dist/scaffolds/notis-database/package.json +0 -32
  93. package/dist/scaffolds/notis-database/packages/sdk/package.json +0 -36
  94. package/dist/scaffolds/notis-database/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  95. package/dist/scaffolds/notis-database/packages/sdk/src/components/Markdown.tsx +0 -60
  96. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  97. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  98. package/dist/scaffolds/notis-database/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  99. package/dist/scaffolds/notis-database/packages/sdk/src/config.ts +0 -234
  100. package/dist/scaffolds/notis-database/packages/sdk/src/documents.ts +0 -250
  101. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useBackend.ts +0 -41
  102. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  103. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  104. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  105. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocument.ts +0 -78
  106. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useDocuments.ts +0 -121
  107. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useHandover.ts +0 -75
  108. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  109. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotis.ts +0 -34
  110. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  111. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTool.ts +0 -64
  112. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTools.ts +0 -56
  113. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  114. package/dist/scaffolds/notis-database/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  115. package/dist/scaffolds/notis-database/packages/sdk/src/index.ts +0 -100
  116. package/dist/scaffolds/notis-database/packages/sdk/src/provider.tsx +0 -43
  117. package/dist/scaffolds/notis-database/packages/sdk/src/runtime.ts +0 -351
  118. package/dist/scaffolds/notis-database/packages/sdk/src/styles.css +0 -186
  119. package/dist/scaffolds/notis-database/packages/sdk/src/ui.ts +0 -15
  120. package/dist/scaffolds/notis-database/packages/sdk/src/vite.ts +0 -56
  121. package/dist/scaffolds/notis-database/packages/sdk/tsconfig.json +0 -15
  122. package/dist/scaffolds/notis-database/postcss.config.mjs +0 -8
  123. package/dist/scaffolds/notis-database/src/dev-main.tsx +0 -23
  124. package/dist/scaffolds/notis-database/src/mock-runtime.ts +0 -561
  125. package/dist/scaffolds/notis-database/tailwind.config.ts +0 -59
  126. package/dist/scaffolds/notis-database/tsconfig.json +0 -23
  127. package/dist/scaffolds/notis-database/vite.config.ts +0 -22
  128. package/dist/scaffolds/notis-journal/CHANGELOG.md +0 -29
  129. package/dist/scaffolds/notis-journal/app/globals.css +0 -37
  130. package/dist/scaffolds/notis-journal/app/insights/page.tsx +0 -513
  131. package/dist/scaffolds/notis-journal/app/journal-core.tsx +0 -362
  132. package/dist/scaffolds/notis-journal/app/journal-ui.tsx +0 -337
  133. package/dist/scaffolds/notis-journal/app/layout.tsx +0 -6
  134. package/dist/scaffolds/notis-journal/app/page.tsx +0 -486
  135. package/dist/scaffolds/notis-journal/components/ui/badge.tsx +0 -28
  136. package/dist/scaffolds/notis-journal/components/ui/button.tsx +0 -53
  137. package/dist/scaffolds/notis-journal/components/ui/card.tsx +0 -56
  138. package/dist/scaffolds/notis-journal/components.json +0 -20
  139. package/dist/scaffolds/notis-journal/index.html +0 -12
  140. package/dist/scaffolds/notis-journal/lib/utils.ts +0 -6
  141. package/dist/scaffolds/notis-journal/metadata/screenshot-1.png +0 -0
  142. package/dist/scaffolds/notis-journal/metadata/screenshot-2.png +0 -0
  143. package/dist/scaffolds/notis-journal/metadata/screenshot-3.png +0 -0
  144. package/dist/scaffolds/notis-journal/metadata/screenshot-4.png +0 -0
  145. package/dist/scaffolds/notis-journal/metadata/screenshot-5.png +0 -0
  146. package/dist/scaffolds/notis-journal/metadata/screenshot-6.png +0 -0
  147. package/dist/scaffolds/notis-journal/metadata/screenshot-fixtures.json +0 -132
  148. package/dist/scaffolds/notis-journal/notis.config.ts +0 -93
  149. package/dist/scaffolds/notis-journal/package-lock.json +0 -4615
  150. package/dist/scaffolds/notis-journal/package.json +0 -34
  151. package/dist/scaffolds/notis-journal/packages/sdk/package.json +0 -36
  152. package/dist/scaffolds/notis-journal/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  153. package/dist/scaffolds/notis-journal/packages/sdk/src/components/Markdown.tsx +0 -60
  154. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  155. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  156. package/dist/scaffolds/notis-journal/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  157. package/dist/scaffolds/notis-journal/packages/sdk/src/config.ts +0 -234
  158. package/dist/scaffolds/notis-journal/packages/sdk/src/documents.ts +0 -250
  159. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useBackend.ts +0 -41
  160. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  161. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  162. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  163. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocument.ts +0 -78
  164. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useDocuments.ts +0 -121
  165. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useHandover.ts +0 -75
  166. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  167. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotis.ts +0 -34
  168. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  169. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTool.ts +0 -64
  170. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTools.ts +0 -56
  171. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  172. package/dist/scaffolds/notis-journal/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  173. package/dist/scaffolds/notis-journal/packages/sdk/src/index.ts +0 -100
  174. package/dist/scaffolds/notis-journal/packages/sdk/src/provider.tsx +0 -43
  175. package/dist/scaffolds/notis-journal/packages/sdk/src/runtime.ts +0 -351
  176. package/dist/scaffolds/notis-journal/packages/sdk/src/styles.css +0 -186
  177. package/dist/scaffolds/notis-journal/packages/sdk/src/ui.ts +0 -15
  178. package/dist/scaffolds/notis-journal/packages/sdk/src/vite.ts +0 -56
  179. package/dist/scaffolds/notis-journal/packages/sdk/tsconfig.json +0 -15
  180. package/dist/scaffolds/notis-journal/postcss.config.mjs +0 -8
  181. package/dist/scaffolds/notis-journal/skills/journal-onboarding/SKILL.md +0 -120
  182. package/dist/scaffolds/notis-journal/src/dev-main.tsx +0 -58
  183. package/dist/scaffolds/notis-journal/src/mock-runtime.ts +0 -199
  184. package/dist/scaffolds/notis-journal/tailwind.config.ts +0 -58
  185. package/dist/scaffolds/notis-journal/tsconfig.json +0 -23
  186. package/dist/scaffolds/notis-journal/vite.config.ts +0 -10
  187. package/dist/scaffolds/notis-notes/CHANGELOG.md +0 -5
  188. package/dist/scaffolds/notis-notes/app/globals.css +0 -3
  189. package/dist/scaffolds/notis-notes/app/layout.tsx +0 -6
  190. package/dist/scaffolds/notis-notes/app/page.tsx +0 -1943
  191. package/dist/scaffolds/notis-notes/app/phosphor-icons.ts +0 -596
  192. package/dist/scaffolds/notis-notes/components/ui/badge.tsx +0 -28
  193. package/dist/scaffolds/notis-notes/components/ui/button.tsx +0 -53
  194. package/dist/scaffolds/notis-notes/components/ui/card.tsx +0 -56
  195. package/dist/scaffolds/notis-notes/components.json +0 -20
  196. package/dist/scaffolds/notis-notes/lib/utils.ts +0 -6
  197. package/dist/scaffolds/notis-notes/lib/visible-properties.ts +0 -144
  198. package/dist/scaffolds/notis-notes/metadata/screenshot-1.png +0 -0
  199. package/dist/scaffolds/notis-notes/metadata/screenshot-2.png +0 -0
  200. package/dist/scaffolds/notis-notes/metadata/screenshot-3.png +0 -0
  201. package/dist/scaffolds/notis-notes/metadata/screenshot-4.png +0 -0
  202. package/dist/scaffolds/notis-notes/metadata/screenshot-5.png +0 -0
  203. package/dist/scaffolds/notis-notes/metadata/screenshot-fixtures.json +0 -752
  204. package/dist/scaffolds/notis-notes/notis.config.ts +0 -80
  205. package/dist/scaffolds/notis-notes/package-lock.json +0 -4636
  206. package/dist/scaffolds/notis-notes/package.json +0 -35
  207. package/dist/scaffolds/notis-notes/packages/sdk/package.json +0 -36
  208. package/dist/scaffolds/notis-notes/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  209. package/dist/scaffolds/notis-notes/packages/sdk/src/components/Markdown.tsx +0 -60
  210. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  211. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  212. package/dist/scaffolds/notis-notes/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  213. package/dist/scaffolds/notis-notes/packages/sdk/src/config.ts +0 -234
  214. package/dist/scaffolds/notis-notes/packages/sdk/src/documents.ts +0 -250
  215. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useBackend.ts +0 -41
  216. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  217. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  218. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  219. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocument.ts +0 -78
  220. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useDocuments.ts +0 -121
  221. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useHandover.ts +0 -75
  222. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  223. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotis.ts +0 -34
  224. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  225. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTool.ts +0 -64
  226. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTools.ts +0 -56
  227. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  228. package/dist/scaffolds/notis-notes/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  229. package/dist/scaffolds/notis-notes/packages/sdk/src/index.ts +0 -100
  230. package/dist/scaffolds/notis-notes/packages/sdk/src/provider.tsx +0 -43
  231. package/dist/scaffolds/notis-notes/packages/sdk/src/runtime.ts +0 -351
  232. package/dist/scaffolds/notis-notes/packages/sdk/src/styles.css +0 -186
  233. package/dist/scaffolds/notis-notes/packages/sdk/src/ui.ts +0 -15
  234. package/dist/scaffolds/notis-notes/packages/sdk/src/vite.ts +0 -56
  235. package/dist/scaffolds/notis-notes/packages/sdk/tsconfig.json +0 -15
  236. package/dist/scaffolds/notis-notes/postcss.config.mjs +0 -8
  237. package/dist/scaffolds/notis-notes/tailwind.config.ts +0 -58
  238. package/dist/scaffolds/notis-notes/tsconfig.json +0 -23
  239. package/dist/scaffolds/notis-notes/vite.config.ts +0 -10
  240. package/dist/scaffolds/notis-random/CHANGELOG.md +0 -15
  241. package/dist/scaffolds/notis-random/README.md +0 -33
  242. package/dist/scaffolds/notis-random/app/globals.css +0 -11
  243. package/dist/scaffolds/notis-random/app/history/page.tsx +0 -67
  244. package/dist/scaffolds/notis-random/app/layout.tsx +0 -7
  245. package/dist/scaffolds/notis-random/app/page.tsx +0 -289
  246. package/dist/scaffolds/notis-random/components/ui/button.tsx +0 -50
  247. package/dist/scaffolds/notis-random/components/ui/card.tsx +0 -16
  248. package/dist/scaffolds/notis-random/components/ui/input.tsx +0 -23
  249. package/dist/scaffolds/notis-random/components.json +0 -20
  250. package/dist/scaffolds/notis-random/index.html +0 -12
  251. package/dist/scaffolds/notis-random/lib/notis-tools.ts +0 -128
  252. package/dist/scaffolds/notis-random/lib/rng.ts +0 -202
  253. package/dist/scaffolds/notis-random/lib/roll-record.ts +0 -189
  254. package/dist/scaffolds/notis-random/lib/utils.ts +0 -25
  255. package/dist/scaffolds/notis-random/metadata/screenshot-1.png +0 -0
  256. package/dist/scaffolds/notis-random/metadata/screenshot-2.png +0 -0
  257. package/dist/scaffolds/notis-random/metadata/screenshot-3.png +0 -0
  258. package/dist/scaffolds/notis-random/metadata/screenshot-4.png +0 -0
  259. package/dist/scaffolds/notis-random/metadata/screenshot-5.png +0 -0
  260. package/dist/scaffolds/notis-random/metadata/screenshot-fixtures.json +0 -753
  261. package/dist/scaffolds/notis-random/notis.config.ts +0 -86
  262. package/dist/scaffolds/notis-random/package-lock.json +0 -4513
  263. package/dist/scaffolds/notis-random/package.json +0 -36
  264. package/dist/scaffolds/notis-random/packages/sdk/package.json +0 -36
  265. package/dist/scaffolds/notis-random/packages/sdk/src/components/DocumentEditor.tsx +0 -93
  266. package/dist/scaffolds/notis-random/packages/sdk/src/components/Markdown.tsx +0 -60
  267. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectActionBar.tsx +0 -278
  268. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectCheckbox.tsx +0 -91
  269. package/dist/scaffolds/notis-random/packages/sdk/src/components/MultiSelectDragOverlay.tsx +0 -39
  270. package/dist/scaffolds/notis-random/packages/sdk/src/config.ts +0 -234
  271. package/dist/scaffolds/notis-random/packages/sdk/src/documents.ts +0 -250
  272. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useBackend.ts +0 -41
  273. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  274. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  275. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDatabaseSubscription.ts +0 -76
  276. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocument.ts +0 -78
  277. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useDocuments.ts +0 -121
  278. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useHandover.ts +0 -75
  279. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useMultiSelect.ts +0 -539
  280. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotis.ts +0 -34
  281. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useNotisNavigation.ts +0 -49
  282. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTool.ts +0 -64
  283. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTools.ts +0 -56
  284. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  285. package/dist/scaffolds/notis-random/packages/sdk/src/hooks/useUpsertDocument.ts +0 -95
  286. package/dist/scaffolds/notis-random/packages/sdk/src/index.ts +0 -100
  287. package/dist/scaffolds/notis-random/packages/sdk/src/provider.tsx +0 -43
  288. package/dist/scaffolds/notis-random/packages/sdk/src/runtime.ts +0 -351
  289. package/dist/scaffolds/notis-random/packages/sdk/src/styles.css +0 -186
  290. package/dist/scaffolds/notis-random/packages/sdk/src/ui.ts +0 -15
  291. package/dist/scaffolds/notis-random/packages/sdk/src/vite.ts +0 -56
  292. package/dist/scaffolds/notis-random/packages/sdk/tsconfig.json +0 -15
  293. package/dist/scaffolds/notis-random/postcss.config.mjs +0 -6
  294. package/dist/scaffolds/notis-random/src/dev-main.tsx +0 -70
  295. package/dist/scaffolds/notis-random/src/mock-runtime.ts +0 -129
  296. package/dist/scaffolds/notis-random/tailwind.config.ts +0 -50
  297. package/dist/scaffolds/notis-random/tsconfig.json +0 -23
  298. package/dist/scaffolds/notis-random/vite.config.ts +0 -11
  299. package/dist/scaffolds.json +0 -49
@@ -1,30 +1,77 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
3
- import { dirname, join, parse as parsePath } from 'node:path';
2
+ import { existsSync, lstatSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
4
  import { CONFIG_DIR } from './profiles.js';
5
5
 
6
6
  export const DEFAULT_APP_DEV_SESSIONS_FILE = join(CONFIG_DIR, 'app-dev-sessions.json');
7
7
  export const APP_DEV_SESSIONS_FILE = DEFAULT_APP_DEV_SESSIONS_FILE;
8
8
  export const APP_DEV_SESSIONS_VERSION = 1;
9
- export const APP_DEV_SESSION_MOUNT_ACKS_VERSION = 1;
9
+ const REGISTRY_LOCK_TIMEOUT_MS = 5_000;
10
+ const registryLockWait = new Int32Array(new SharedArrayBuffer(4));
11
+
12
+ function readRegistryLockOwner(lockPath) {
13
+ try {
14
+ return readFileSync(join(lockPath, 'owner'), 'utf8').trim();
15
+ } catch {
16
+ return null;
17
+ }
18
+ }
19
+
20
+ function withRegistryLock(filePath, callback) {
21
+ mkdirSync(dirname(filePath), { recursive: true, mode: 0o700 });
22
+ const lockPath = `${filePath}.lock`;
23
+ const ownerId = `${process.pid}.${randomUUID()}`;
24
+ const startedAt = Date.now();
25
+ while (true) {
26
+ try {
27
+ mkdirSync(lockPath, { mode: 0o700 });
28
+ try {
29
+ writeFileSync(join(lockPath, 'owner'), ownerId, { mode: 0o600 });
30
+ } catch (error) {
31
+ rmSync(lockPath, { recursive: true, force: true });
32
+ throw error;
33
+ }
34
+ break;
35
+ } catch (error) {
36
+ if (error?.code !== 'EEXIST') throw error;
37
+ try {
38
+ const lockStat = lstatSync(lockPath);
39
+ if (lockStat.isSymbolicLink() || !lockStat.isDirectory()) {
40
+ throw new Error(`Refusing unsafe app development registry lock: ${lockPath}`);
41
+ }
42
+ } catch (statError) {
43
+ if (statError?.code === 'ENOENT') continue;
44
+ throw statError;
45
+ }
46
+ if (Date.now() - startedAt >= REGISTRY_LOCK_TIMEOUT_MS) {
47
+ throw new Error(
48
+ `Timed out waiting for app development registry lock: ${filePath}. `
49
+ + `If no app development process is running, remove the orphaned lock: ${lockPath}`,
50
+ );
51
+ }
52
+ Atomics.wait(registryLockWait, 0, 0, 10);
53
+ }
54
+ }
55
+ try {
56
+ return callback();
57
+ } finally {
58
+ try {
59
+ if (readRegistryLockOwner(lockPath) === ownerId) {
60
+ rmSync(lockPath, { recursive: true, force: true });
61
+ }
62
+ } catch {
63
+ // Never remove or disrupt a lock that no longer belongs to this writer.
64
+ }
65
+ }
66
+ }
10
67
 
11
68
  export function getAppDevSessionsFile(filePath) {
12
69
  if (filePath) {
13
70
  return filePath;
14
71
  }
15
- const envPath = process.env.NOTIS_APP_DEV_SESSIONS_FILE;
16
- if (typeof envPath === 'string' && envPath.trim()) {
17
- return envPath.trim();
18
- }
19
72
  return DEFAULT_APP_DEV_SESSIONS_FILE;
20
73
  }
21
74
 
22
- export function getAppDevSessionMountAcksFile(sessionsFilePath) {
23
- const resolvedSessionsFile = getAppDevSessionsFile(sessionsFilePath);
24
- const parsed = parsePath(resolvedSessionsFile);
25
- return join(parsed.dir, `${parsed.name}-mount-acks${parsed.ext || '.json'}`);
26
- }
27
-
28
75
  function normalizeSessions(raw) {
29
76
  if (!raw || typeof raw !== 'object' || !Array.isArray(raw.sessions)) {
30
77
  return [];
@@ -62,7 +109,7 @@ export function readAppDevSessions(filePath) {
62
109
  }
63
110
  }
64
111
 
65
- export function writeAppDevSessions(registry, filePath) {
112
+ function writeAppDevSessionsUnlocked(registry, filePath) {
66
113
  const resolvedFilePath = getAppDevSessionsFile(filePath);
67
114
  mkdirSync(dirname(resolvedFilePath), { recursive: true, mode: 0o700 });
68
115
  const normalized = {
@@ -75,151 +122,64 @@ export function writeAppDevSessions(registry, filePath) {
75
122
  return normalized;
76
123
  }
77
124
 
125
+ export function writeAppDevSessions(registry, filePath) {
126
+ const resolvedFilePath = getAppDevSessionsFile(filePath);
127
+ return withRegistryLock(resolvedFilePath, () => writeAppDevSessionsUnlocked(registry, resolvedFilePath));
128
+ }
129
+
78
130
  export function upsertAppDevSessions(sessions, filePath) {
79
131
  const nextSessions = Array.isArray(sessions) ? sessions : [sessions];
80
- const registry = readAppDevSessions(filePath);
81
- const keys = new Set(nextSessions.map((session) => `${session.sessionId}:${session.appId}`));
82
- registry.sessions = [
83
- ...registry.sessions.filter((session) => !keys.has(`${session.sessionId}:${session.appId}`)),
84
- ...nextSessions,
85
- ];
86
- return writeAppDevSessions(registry, filePath);
132
+ const resolvedFilePath = getAppDevSessionsFile(filePath);
133
+ return withRegistryLock(resolvedFilePath, () => {
134
+ const registry = readAppDevSessions(resolvedFilePath);
135
+ const keys = new Set(nextSessions.map((session) => `${session.sessionId}:${session.appId}`));
136
+ registry.sessions = [
137
+ ...registry.sessions.filter((session) => !keys.has(`${session.sessionId}:${session.appId}`)),
138
+ ...nextSessions,
139
+ ];
140
+ return writeAppDevSessionsUnlocked(registry, resolvedFilePath);
141
+ });
87
142
  }
88
143
 
89
144
  export function heartbeatAppDevSession(sessionId, lastHeartbeatAt, filePath) {
90
- const registry = readAppDevSessions(filePath);
91
- registry.sessions = registry.sessions.map((session) =>
92
- session.sessionId === sessionId
93
- ? { ...session, lastHeartbeatAt }
94
- : session,
95
- );
96
- return writeAppDevSessions(registry, filePath);
145
+ const resolvedFilePath = getAppDevSessionsFile(filePath);
146
+ return withRegistryLock(resolvedFilePath, () => {
147
+ const registry = readAppDevSessions(resolvedFilePath);
148
+ registry.sessions = registry.sessions.map((session) =>
149
+ session.sessionId === sessionId ? { ...session, lastHeartbeatAt } : session,
150
+ );
151
+ return writeAppDevSessionsUnlocked(registry, resolvedFilePath);
152
+ });
97
153
  }
98
154
 
99
- export function linkAppDevSessionTarget({ appId, devSlug, targetAppId, lastHeartbeatAt = new Date().toISOString() }, filePath) {
155
+ export function linkAppDevSessionTarget({ sessionId, appId, devSlug, targetAppId, lastHeartbeatAt = new Date().toISOString() }, filePath) {
100
156
  const target = typeof targetAppId === 'string' ? targetAppId.trim() : '';
101
157
  if (!target) {
102
158
  return readAppDevSessions(filePath);
103
159
  }
104
- const registry = readAppDevSessions(filePath);
105
- registry.sessions = registry.sessions.map((session) => {
106
- const matchesApp = appId && session.appId === appId;
107
- const matchesSlug = devSlug && session.devSlug === devSlug;
108
- if (!matchesApp || !matchesSlug) {
109
- return session;
110
- }
111
- return {
112
- ...session,
113
- targetAppId: target,
114
- lastHeartbeatAt,
115
- };
160
+ const resolvedFilePath = getAppDevSessionsFile(filePath);
161
+ const result = withRegistryLock(resolvedFilePath, () => {
162
+ const registry = readAppDevSessions(resolvedFilePath);
163
+ registry.sessions = registry.sessions.map((session) => {
164
+ const hasSelector = Boolean(appId || devSlug);
165
+ const matchesSession = !sessionId || session.sessionId === sessionId;
166
+ const matchesApp = !appId || session.appId === appId;
167
+ const matchesSlug = !devSlug || session.devSlug === devSlug;
168
+ if ((!hasSelector && !sessionId) || !matchesSession || !matchesApp || !matchesSlug) return session;
169
+ const linked = { ...session, targetAppId: target, lastHeartbeatAt };
170
+ return linked;
171
+ });
172
+ return writeAppDevSessionsUnlocked(registry, resolvedFilePath);
116
173
  });
117
- return writeAppDevSessions(registry, filePath);
118
- }
119
-
120
- export function removeAppDevSession(sessionId, filePath) {
121
- const registry = readAppDevSessions(filePath);
122
- registry.sessions = registry.sessions.filter((session) => session.sessionId !== sessionId);
123
- const result = writeAppDevSessions(registry, filePath);
124
- removeAppDevSessionMountAcknowledgements(sessionId, filePath);
125
174
  return result;
126
175
  }
127
176
 
128
- function normalizeMountAcknowledgements(raw) {
129
- if (!raw || typeof raw !== 'object' || !Array.isArray(raw.acknowledgements)) {
130
- return [];
131
- }
132
- return raw.acknowledgements.filter((acknowledgement) =>
133
- acknowledgement &&
134
- typeof acknowledgement === 'object' &&
135
- typeof acknowledgement.sessionId === 'string' &&
136
- typeof acknowledgement.appId === 'string' &&
137
- typeof acknowledgement.devSlug === 'string' &&
138
- typeof acknowledgement.mountNonce === 'string' &&
139
- typeof acknowledgement.acknowledgedAt === 'string' &&
140
- ['listed', 'rendered'].includes(acknowledgement.stage),
141
- );
142
- }
143
-
144
- export function readAppDevSessionMountAcknowledgements(sessionsFilePath) {
145
- const filePath = getAppDevSessionMountAcksFile(sessionsFilePath);
146
- if (!existsSync(filePath)) {
147
- return { version: APP_DEV_SESSION_MOUNT_ACKS_VERSION, acknowledgements: [] };
148
- }
149
- try {
150
- const raw = JSON.parse(readFileSync(filePath, 'utf8'));
151
- return {
152
- version: APP_DEV_SESSION_MOUNT_ACKS_VERSION,
153
- acknowledgements: normalizeMountAcknowledgements(raw),
154
- };
155
- } catch {
156
- return { version: APP_DEV_SESSION_MOUNT_ACKS_VERSION, acknowledgements: [] };
157
- }
158
- }
159
-
160
- function writeAppDevSessionMountAcknowledgements(registry, sessionsFilePath) {
161
- const filePath = getAppDevSessionMountAcksFile(sessionsFilePath);
162
- mkdirSync(dirname(filePath), { recursive: true, mode: 0o700 });
163
- const normalized = {
164
- version: APP_DEV_SESSION_MOUNT_ACKS_VERSION,
165
- acknowledgements: normalizeMountAcknowledgements(registry),
166
- };
167
- const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
168
- writeFileSync(tempPath, JSON.stringify(normalized, null, 2), { mode: 0o600 });
169
- renameSync(tempPath, filePath);
170
- return normalized;
171
- }
172
-
173
- export function removeAppDevSessionMountAcknowledgements(sessionId, sessionsFilePath) {
174
- const filePath = getAppDevSessionMountAcksFile(sessionsFilePath);
175
- if (!existsSync(filePath)) {
176
- return { version: APP_DEV_SESSION_MOUNT_ACKS_VERSION, acknowledgements: [] };
177
- }
178
- const registry = readAppDevSessionMountAcknowledgements(sessionsFilePath);
179
- registry.acknowledgements = registry.acknowledgements.filter(
180
- (acknowledgement) => acknowledgement.sessionId !== sessionId,
181
- );
182
- return writeAppDevSessionMountAcknowledgements(registry, sessionsFilePath);
183
- }
184
-
185
- function mountAcknowledgementKey(value, fallbackStage = 'listed') {
186
- return `${value.sessionId}:${value.appId}:${value.devSlug}:${value.mountNonce}:${value.stage || fallbackStage}`;
187
- }
188
-
189
- export async function waitForAppDevSessionMountAcknowledgements(expectedSessions, options = {}) {
190
- const expected = Array.isArray(expectedSessions) ? expectedSessions : [expectedSessions];
191
- const stage = options.stage === 'rendered' ? 'rendered' : 'listed';
192
- const timeoutMs = Number.isFinite(options.timeoutMs) ? Math.max(0, options.timeoutMs) : 15_000;
193
- const pollIntervalMs = Number.isFinite(options.pollIntervalMs)
194
- ? Math.max(1, options.pollIntervalMs)
195
- : 100;
196
- const now = typeof options.now === 'function' ? options.now : Date.now;
197
- const sleep = typeof options.sleep === 'function'
198
- ? options.sleep
199
- : (delayMs) => new Promise((resolve) => setTimeout(resolve, delayMs));
200
- const startedAt = now();
201
-
202
- while (true) {
203
- const registry = readAppDevSessionMountAcknowledgements(options.sessionsFilePath);
204
- const acknowledgedKeys = new Set(registry.acknowledgements.map(mountAcknowledgementKey));
205
- const missing = expected.filter(
206
- (session) => !acknowledgedKeys.has(mountAcknowledgementKey(session, stage)),
207
- );
208
- if (missing.length === 0) {
209
- return { mounted: true, missing: [], acknowledgements: registry.acknowledgements };
210
- }
211
-
212
- const elapsedMs = now() - startedAt;
213
- if (elapsedMs >= timeoutMs) {
214
- return { mounted: false, missing, acknowledgements: registry.acknowledgements };
215
- }
216
- await sleep(Math.min(pollIntervalMs, timeoutMs - elapsedMs));
217
- }
218
- }
219
-
220
- export function waitForAppDevSessionRenderAcknowledgements(expectedSessions, options = {}) {
221
- return waitForAppDevSessionMountAcknowledgements(expectedSessions, {
222
- ...options,
223
- stage: 'rendered',
177
+ export function removeAppDevSession(sessionId, filePath) {
178
+ const resolvedFilePath = getAppDevSessionsFile(filePath);
179
+ const result = withRegistryLock(resolvedFilePath, () => {
180
+ const registry = readAppDevSessions(resolvedFilePath);
181
+ registry.sessions = registry.sessions.filter((session) => session.sessionId !== sessionId);
182
+ return writeAppDevSessionsUnlocked(registry, resolvedFilePath);
224
183
  });
184
+ return result;
225
185
  }