@notis_ai/cli 0.2.18 → 0.2.19

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 (395) hide show
  1. package/README.md +542 -146
  2. package/bin/check-runtime.js +15 -0
  3. package/bin/notis.js +2 -0
  4. package/config/notis_app_design_rules.json +320 -0
  5. package/config/portal-route-roots.json +45 -0
  6. package/dist/agent-hooks/notis-agent-hook.mjs +42325 -18273
  7. package/dist/base-skills/notis-cli/.notis-base-skill.json +1 -0
  8. package/dist/base-skills/notis-cli/SKILL.md +51 -280
  9. package/dist/base-skills/notis-cli/references/app-delivery.md +17 -0
  10. package/dist/base-skills/notis-cli/references/intelligence.md +94 -0
  11. package/dist/base-skills/notis-cli/references/native-databases.md +21 -0
  12. package/dist/base-skills/notis-cli/references/tool-examples.md +56 -0
  13. package/dist/base-skills/notis-cli/references/troubleshooting.md +67 -0
  14. package/dist/base-skills/notis-query/.notis-base-skill.json +1 -0
  15. package/dist/base-skills/notis-query/SKILL.md +35 -699
  16. package/dist/base-skills/notis-query/references/database-discovery.md +59 -0
  17. package/dist/base-skills/notis-query/references/documents.md +74 -0
  18. package/dist/base-skills/notis-query/references/query.md +76 -0
  19. package/dist/base-skills/notis-spaces/.notis-base-skill.json +1 -0
  20. package/dist/base-skills/notis-spaces/SKILL.md +218 -0
  21. package/dist/base-skills/notis-spaces/references/architecture.md +116 -0
  22. package/dist/base-skills/notis-spaces/references/context.md +81 -0
  23. package/dist/base-skills/notis-spaces/references/design.md +141 -0
  24. package/dist/base-skills/notis-spaces/references/fixtures.md +29 -0
  25. package/dist/base-skills/notis-spaces/references/memory.md +58 -0
  26. package/dist/base-skills/notis-spaces/references/reading.md +73 -0
  27. package/dist/base-skills/notis-spaces/references/release.md +120 -0
  28. package/dist/base-skills/notis-spaces/references/reports.md +77 -0
  29. package/dist/base-skills/notis-spaces/references/sdk.md +273 -0
  30. package/dist/base-skills/notis-spaces/references/store.md +118 -0
  31. package/dist/base-skills/notis-spaces/references/troubleshooting.md +28 -0
  32. package/dist/base-skills/notis-spaces/references/views.md +229 -0
  33. package/{template/packages → dist}/sdk/package.json +9 -10
  34. package/dist/sdk/src/agentContext.ts +36 -0
  35. package/dist/sdk/src/bundleModule.ts +175 -0
  36. package/dist/sdk/src/components/Dialog.tsx +103 -0
  37. package/dist/sdk/src/components/DocumentEditor.tsx +113 -0
  38. package/dist/sdk/src/components/DocumentPage.tsx +184 -0
  39. package/{template/packages → dist}/sdk/src/components/Markdown.tsx +9 -3
  40. package/{template/packages → dist}/sdk/src/components/MarkdownEditor.tsx +26 -5
  41. package/{template/packages → dist}/sdk/src/components/MultiSelectActionBar.tsx +95 -12
  42. package/{template/packages → dist}/sdk/src/components/MultiSelectCheckbox.tsx +4 -2
  43. package/dist/sdk/src/components/NotisCommentBoundary.tsx +172 -0
  44. package/{template/packages → dist}/sdk/src/components/NotisSelectionBoundary.tsx +9 -5
  45. package/dist/sdk/src/components/RecordComponents.tsx +111 -0
  46. package/dist/sdk/src/components/Skeleton.tsx +38 -0
  47. package/dist/sdk/src/config.ts +31 -0
  48. package/{template/packages → dist}/sdk/src/documents.ts +21 -6
  49. package/dist/sdk/src/hooks/useAction.ts +28 -0
  50. package/dist/sdk/src/hooks/useAgentContext.ts +23 -0
  51. package/{template/packages → dist}/sdk/src/hooks/useBackend.ts +3 -2
  52. package/dist/sdk/src/hooks/useCloudComputer.ts +94 -0
  53. package/dist/sdk/src/hooks/useCloudComputerShell.ts +114 -0
  54. package/{template/packages → dist}/sdk/src/hooks/useCollectionInteractions.ts +157 -147
  55. package/dist/sdk/src/hooks/useDatabaseSchema.ts +50 -0
  56. package/{template/packages → dist}/sdk/src/hooks/useDatabaseSubscription.ts +2 -2
  57. package/dist/sdk/src/hooks/useDocument.ts +51 -0
  58. package/{template/packages → dist}/sdk/src/hooks/useDocuments.ts +25 -59
  59. package/{template/packages → dist}/sdk/src/hooks/useHandover.ts +7 -7
  60. package/dist/sdk/src/hooks/useLongPressSelection.ts +79 -0
  61. package/dist/sdk/src/hooks/useMarqueeSelection.ts +194 -0
  62. package/{template/packages → dist}/sdk/src/hooks/useMultiSelect.ts +2 -8
  63. package/dist/sdk/src/hooks/useNativeDocumentBody.ts +50 -0
  64. package/dist/sdk/src/hooks/useNativeDocuments.ts +143 -0
  65. package/{template/packages → dist}/sdk/src/hooks/useNotis.ts +6 -1
  66. package/dist/sdk/src/hooks/useNotisNavigation.ts +70 -0
  67. package/dist/sdk/src/hooks/useQuery.ts +81 -0
  68. package/dist/sdk/src/hooks/useToolQuery.ts +12 -0
  69. package/dist/sdk/src/hooks/useTopBarSearch.ts +102 -0
  70. package/dist/sdk/src/hooks/useTopBarTitleLeaf.ts +75 -0
  71. package/{template/packages → dist}/sdk/src/hooks/useUpsertDocument.ts +1 -1
  72. package/dist/sdk/src/hooks/useViewParams.ts +195 -0
  73. package/dist/sdk/src/hooks/useViewerReads.ts +129 -0
  74. package/{template/packages → dist}/sdk/src/index.ts +64 -1
  75. package/{template/packages → dist}/sdk/src/interactions/actions.ts +14 -1
  76. package/{template/packages → dist}/sdk/src/interactions/shortcuts.tsx +129 -23
  77. package/dist/sdk/src/interactions/visibility.ts +13 -0
  78. package/{template/packages → dist}/sdk/src/interactions.ts +5 -1
  79. package/dist/sdk/src/nativeData.ts +39 -0
  80. package/{template/packages → dist}/sdk/src/provider.tsx +9 -4
  81. package/dist/sdk/src/queryCache.ts +292 -0
  82. package/dist/sdk/src/queryErrors.ts +51 -0
  83. package/dist/sdk/src/runtime.ts +675 -0
  84. package/dist/sdk/src/runtimeModules.ts +33 -0
  85. package/dist/sdk/src/space.ts +442 -0
  86. package/dist/sdk/src/standardViewParams.ts +36 -0
  87. package/{template/packages → dist}/sdk/src/styles.css +81 -16
  88. package/dist/sdk/src/tailwind.ts +66 -0
  89. package/dist/sdk/src/ui/charts/RenderChartData.tsx +25 -0
  90. package/dist/sdk/src/ui/engine/core.ts +392 -0
  91. package/dist/sdk/src/ui/engine/dom.ts +183 -0
  92. package/dist/sdk/src/ui/engine/hooks.ts +195 -0
  93. package/dist/sdk/src/ui/engine/instance.ts +63 -0
  94. package/dist/sdk/src/ui/engine/keycapContext.ts +2 -0
  95. package/dist/sdk/src/ui/engine/registry.ts +262 -0
  96. package/dist/sdk/src/ui/engine/types.ts +62 -0
  97. package/dist/sdk/src/ui/icons.tsx +91 -0
  98. package/dist/sdk/src/ui/util.ts +83 -0
  99. package/dist/sdk/src/viewPeriod.ts +26 -0
  100. package/dist/sdk/src/vite.ts +92 -0
  101. package/dist/sdk/src/words/actions.ts +295 -0
  102. package/dist/sdk/src/words/clashes.ts +158 -0
  103. package/dist/sdk/src/words/format.ts +136 -0
  104. package/dist/sdk/src/words/index.ts +13 -0
  105. package/dist/sdk/src/words/keymap.ts +72 -0
  106. package/dist/sdk/src/words/keys.ts +297 -0
  107. package/dist/sdk/src/words/shell.ts +46 -0
  108. package/dist/sdk/src/words/types.ts +65 -0
  109. package/dist/skill-sync/index.js +832 -151
  110. package/dist/skill-sync/index.js.map +4 -4
  111. package/dist/skill-sync-worker.mjs +3941 -0
  112. package/dist/space-harness/host.js +1460 -0
  113. package/dist/space-sdk/dist/chunk-ZSN57ATH.js +5 -0
  114. package/dist/space-sdk/dist/index.js +15 -0
  115. package/dist/space-sdk/dist/ui.js +18 -0
  116. package/dist/space-sdk/package.json +33 -0
  117. package/dist/space-sdk/src/agentContext.d.ts +36 -0
  118. package/dist/space-sdk/src/components/Dialog.d.ts +20 -0
  119. package/dist/space-sdk/src/components/DocumentEditor.d.ts +46 -0
  120. package/dist/space-sdk/src/components/DocumentPage.d.ts +53 -0
  121. package/dist/space-sdk/src/components/Markdown.d.ts +18 -0
  122. package/dist/space-sdk/src/components/MarkdownEditor.d.ts +11 -0
  123. package/dist/space-sdk/src/components/MultiSelectActionBar.d.ts +31 -0
  124. package/dist/space-sdk/src/components/MultiSelectCheckbox.d.ts +14 -0
  125. package/dist/space-sdk/src/components/MultiSelectDragOverlay.d.ts +8 -0
  126. package/dist/space-sdk/src/components/NotisCommentBoundary.d.ts +36 -0
  127. package/dist/space-sdk/src/components/NotisSelectionBoundary.d.ts +16 -0
  128. package/dist/space-sdk/src/components/RecordComponents.d.ts +64 -0
  129. package/dist/space-sdk/src/components/ShortcutHints.d.ts +12 -0
  130. package/dist/space-sdk/src/components/Skeleton.d.ts +23 -0
  131. package/dist/space-sdk/src/config.ts +31 -0
  132. package/dist/space-sdk/src/documents.d.ts +59 -0
  133. package/dist/space-sdk/src/hooks/useAction.d.ts +8 -0
  134. package/dist/space-sdk/src/hooks/useActiveResource.d.ts +3 -0
  135. package/dist/space-sdk/src/hooks/useAgentContext.d.ts +7 -0
  136. package/dist/space-sdk/src/hooks/useBackend.d.ts +23 -0
  137. package/dist/space-sdk/src/hooks/useCloudComputer.d.ts +45 -0
  138. package/dist/space-sdk/src/hooks/useCloudComputerShell.d.ts +49 -0
  139. package/dist/space-sdk/src/hooks/useCollectionInteractions.d.ts +118 -0
  140. package/dist/space-sdk/src/hooks/useDatabaseSchema.d.ts +14 -0
  141. package/dist/space-sdk/src/hooks/useDatabaseSubscription.d.ts +26 -0
  142. package/dist/space-sdk/src/hooks/useDocument.d.ts +22 -0
  143. package/dist/space-sdk/src/hooks/useDocuments.d.ts +31 -0
  144. package/dist/space-sdk/src/hooks/useHandover.d.ts +43 -0
  145. package/dist/space-sdk/src/hooks/useLongPressSelection.d.ts +9 -0
  146. package/dist/space-sdk/src/hooks/useMarqueeSelection.d.ts +57 -0
  147. package/dist/space-sdk/src/hooks/useMultiSelect.d.ts +51 -0
  148. package/dist/space-sdk/src/hooks/useNativeDocumentBody.d.ts +24 -0
  149. package/dist/space-sdk/src/hooks/useNativeDocuments.d.ts +55 -0
  150. package/dist/space-sdk/src/hooks/useNotis.d.ts +25 -0
  151. package/dist/space-sdk/src/hooks/useNotisNavigation.d.ts +33 -0
  152. package/dist/space-sdk/src/hooks/useQuery.d.ts +22 -0
  153. package/dist/space-sdk/src/hooks/useTool.d.ts +20 -0
  154. package/dist/space-sdk/src/hooks/useToolQuery.d.ts +3 -0
  155. package/dist/space-sdk/src/hooks/useTools.d.ts +15 -0
  156. package/dist/space-sdk/src/hooks/useTopBarSearch.d.ts +48 -0
  157. package/dist/space-sdk/src/hooks/useTopBarTitleLeaf.d.ts +24 -0
  158. package/dist/space-sdk/src/hooks/useUpsertDocument.d.ts +27 -0
  159. package/dist/space-sdk/src/hooks/useViewParams.d.ts +76 -0
  160. package/dist/space-sdk/src/hooks/useViewerReads.d.ts +38 -0
  161. package/dist/space-sdk/src/index.d.ts +98 -0
  162. package/dist/space-sdk/src/interactions/actions.d.ts +33 -0
  163. package/dist/space-sdk/src/interactions/shortcuts.d.ts +42 -0
  164. package/dist/space-sdk/src/interactions/visibility.d.ts +2 -0
  165. package/dist/space-sdk/src/nativeData.d.ts +66 -0
  166. package/dist/space-sdk/src/provider.d.ts +17 -0
  167. package/dist/space-sdk/src/queryCache.d.ts +45 -0
  168. package/dist/space-sdk/src/queryErrors.ts +51 -0
  169. package/dist/space-sdk/src/runtime.d.ts +615 -0
  170. package/dist/space-sdk/src/runtimeModules.ts +33 -0
  171. package/dist/space-sdk/src/space.ts +442 -0
  172. package/dist/space-sdk/src/standardViewParams.d.ts +15 -0
  173. package/dist/space-sdk/src/tailwind-candidates.d.ts +3418 -0
  174. package/dist/space-sdk/src/tailwind.ts +66 -0
  175. package/dist/space-sdk/src/ui/actions/ActionToast.d.ts +15 -0
  176. package/dist/space-sdk/src/ui/actions/actionWords.d.ts +16 -0
  177. package/dist/space-sdk/src/ui/actions/index.d.ts +7 -0
  178. package/dist/space-sdk/src/ui/actions/useActions.d.ts +69 -0
  179. package/dist/space-sdk/src/ui/actions/useToast.d.ts +41 -0
  180. package/dist/space-sdk/src/ui/blocks/Tabs.d.ts +139 -0
  181. package/dist/space-sdk/src/ui/blocks/blocks.d.ts +217 -0
  182. package/dist/space-sdk/src/ui/blocks/index.d.ts +4 -0
  183. package/dist/space-sdk/src/ui/board/BoardView.d.ts +36 -0
  184. package/dist/space-sdk/src/ui/board/boardModel.d.ts +46 -0
  185. package/dist/space-sdk/src/ui/board/boardWords.d.ts +9 -0
  186. package/dist/space-sdk/src/ui/board/index.d.ts +5 -0
  187. package/dist/space-sdk/src/ui/calendar/CalendarView.d.ts +49 -0
  188. package/dist/space-sdk/src/ui/calendar/DayPicker.d.ts +23 -0
  189. package/dist/space-sdk/src/ui/calendar/calendarMath.d.ts +81 -0
  190. package/dist/space-sdk/src/ui/charts/Chart.d.ts +203 -0
  191. package/dist/space-sdk/src/ui/charts/ChartTable.d.ts +37 -0
  192. package/dist/space-sdk/src/ui/charts/RenderChartData.d.ts +16 -0
  193. package/dist/space-sdk/src/ui/charts/StatRow.d.ts +59 -0
  194. package/dist/space-sdk/src/ui/charts/chartData.d.ts +84 -0
  195. package/dist/space-sdk/src/ui/comments/CommentPane.d.ts +58 -0
  196. package/dist/space-sdk/src/ui/comments/commentModel.d.ts +157 -0
  197. package/dist/space-sdk/src/ui/comments/commentWords.d.ts +60 -0
  198. package/dist/space-sdk/src/ui/comments/index.d.ts +4 -0
  199. package/dist/space-sdk/src/ui/comments/useComments.d.ts +146 -0
  200. package/dist/space-sdk/src/ui/engine/HelpSheet.d.ts +12 -0
  201. package/dist/space-sdk/src/ui/engine/KeyboardEngine.d.ts +27 -0
  202. package/dist/space-sdk/src/ui/engine/core.d.ts +73 -0
  203. package/dist/space-sdk/src/ui/engine/hooks.d.ts +64 -0
  204. package/dist/space-sdk/src/ui/engine/index.d.ts +14 -0
  205. package/dist/space-sdk/src/ui/engine/instance.d.ts +21 -0
  206. package/dist/space-sdk/src/ui/engine/keycapContext.d.ts +2 -0
  207. package/dist/space-sdk/src/ui/engine/registry.d.ts +77 -0
  208. package/dist/space-sdk/src/ui/engine/step.d.ts +11 -0
  209. package/dist/space-sdk/src/ui/engine/types.d.ts +54 -0
  210. package/dist/space-sdk/src/ui/fields/fieldWords.d.ts +56 -0
  211. package/dist/space-sdk/src/ui/fields/fields.d.ts +162 -0
  212. package/dist/space-sdk/src/ui/fields/index.d.ts +5 -0
  213. package/dist/space-sdk/src/ui/fields/useFieldDraft.d.ts +22 -0
  214. package/dist/space-sdk/src/ui/gallery/AttachmentGallery.d.ts +53 -0
  215. package/dist/space-sdk/src/ui/gallery/ImageViewer.d.ts +27 -0
  216. package/dist/space-sdk/src/ui/gallery/galleryWords.d.ts +95 -0
  217. package/dist/space-sdk/src/ui/gallery/index.d.ts +5 -0
  218. package/dist/space-sdk/src/ui/icons.d.ts +13 -0
  219. package/dist/space-sdk/src/ui/index.d.ts +54 -0
  220. package/dist/space-sdk/src/ui/keycap/Keycap.d.ts +22 -0
  221. package/dist/space-sdk/src/ui/keycap/index.d.ts +2 -0
  222. package/dist/space-sdk/src/ui/layout/Panels.d.ts +50 -0
  223. package/dist/space-sdk/src/ui/layout/chatPanelEdge.d.ts +77 -0
  224. package/dist/space-sdk/src/ui/layout/index.d.ts +5 -0
  225. package/dist/space-sdk/src/ui/layout/panelMath.d.ts +91 -0
  226. package/dist/space-sdk/src/ui/list/ListReader.d.ts +380 -0
  227. package/dist/space-sdk/src/ui/list/Row.d.ts +145 -0
  228. package/dist/space-sdk/src/ui/list/SelectionBar.d.ts +65 -0
  229. package/dist/space-sdk/src/ui/list/index.d.ts +14 -0
  230. package/dist/space-sdk/src/ui/list/rowState.d.ts +22 -0
  231. package/dist/space-sdk/src/ui/list/useListKeys.d.ts +89 -0
  232. package/dist/space-sdk/src/ui/list/useReorder.d.ts +86 -0
  233. package/dist/space-sdk/src/ui/list/useSelection.d.ts +90 -0
  234. package/dist/space-sdk/src/ui/open/OpenAsMenu.d.ts +15 -0
  235. package/dist/space-sdk/src/ui/open/index.d.ts +6 -0
  236. package/dist/space-sdk/src/ui/open/openModeStore.d.ts +39 -0
  237. package/dist/space-sdk/src/ui/open/useOpenMode.d.ts +17 -0
  238. package/dist/space-sdk/src/ui/overlay/Menu.d.ts +88 -0
  239. package/dist/space-sdk/src/ui/overlay/Popover.d.ts +28 -0
  240. package/dist/space-sdk/src/ui/overlay/Tooltip.d.ts +19 -0
  241. package/dist/space-sdk/src/ui/overlay/index.d.ts +9 -0
  242. package/dist/space-sdk/src/ui/overlay/layerRoot.d.ts +24 -0
  243. package/dist/space-sdk/src/ui/overlay/position.d.ts +31 -0
  244. package/dist/space-sdk/src/ui/period/PeriodPicker.d.ts +30 -0
  245. package/dist/space-sdk/src/ui/period/dateFormat.d.ts +50 -0
  246. package/dist/space-sdk/src/ui/period/dateWords.d.ts +88 -0
  247. package/dist/space-sdk/src/ui/period/periods.d.ts +70 -0
  248. package/dist/space-sdk/src/ui/period/usePeriod.d.ts +23 -0
  249. package/dist/space-sdk/src/ui/present/index.d.ts +3 -0
  250. package/dist/space-sdk/src/ui/present/presentWords.d.ts +27 -0
  251. package/dist/space-sdk/src/ui/present/screens.d.ts +36 -0
  252. package/dist/space-sdk/src/ui/present/useAudienceScreen.d.ts +38 -0
  253. package/dist/space-sdk/src/ui/styles.d.ts +21 -0
  254. package/dist/space-sdk/src/ui/timeline/TimelineView.d.ts +44 -0
  255. package/dist/space-sdk/src/ui/timeline/timelineMath.d.ts +123 -0
  256. package/dist/space-sdk/src/viewPeriod.d.ts +8 -0
  257. package/dist/space-sdk/src/vite.ts +92 -0
  258. package/dist/space-sdk/src/words/actions.ts +295 -0
  259. package/dist/space-sdk/src/words/clashes.ts +158 -0
  260. package/dist/space-sdk/src/words/format.ts +136 -0
  261. package/dist/space-sdk/src/words/index.ts +13 -0
  262. package/dist/space-sdk/src/words/keymap.ts +72 -0
  263. package/dist/space-sdk/src/words/keys.ts +297 -0
  264. package/dist/space-sdk/src/words/shell.ts +46 -0
  265. package/dist/space-sdk/src/words/types.ts +65 -0
  266. package/dist/view-renderer/dist/host.css +1 -0
  267. package/dist/view-renderer/dist/host.js +2374 -0
  268. package/dist/view-renderer/dist/theme.css +73 -0
  269. package/dist/view-renderer/src/dom.js +212 -0
  270. package/dist/view-renderer/src/errors.js +8 -0
  271. package/dist/view-renderer/src/host.tsx +250 -0
  272. package/dist/view-renderer/src/index.js +4 -0
  273. package/dist/view-renderer/src/png.js +213 -0
  274. package/dist/view-renderer/src/pool.js +110 -0
  275. package/dist/view-renderer/src/remote-broker.js +59 -0
  276. package/dist/view-renderer/src/renderer.js +271 -0
  277. package/package.json +21 -11
  278. package/skills/notis-cli/AGENT_INSTRUCTIONS.md +63 -12
  279. package/skills/notis-onboarding/BRIEF.md +14 -9
  280. package/skills/notis-query/cli.md +1 -1
  281. package/skills/notis-spaces/cli.md +540 -0
  282. package/src/cli.js +8 -8
  283. package/src/command-specs/agents.js +121 -8
  284. package/src/command-specs/auth.js +3 -3
  285. package/src/command-specs/diagnostics.js +97 -20
  286. package/src/command-specs/documents.js +158 -0
  287. package/src/command-specs/files.js +29 -0
  288. package/src/command-specs/handover.js +331 -79
  289. package/src/command-specs/helpers.js +50 -40
  290. package/src/command-specs/index.js +14 -5
  291. package/src/command-specs/meta.js +38 -9
  292. package/src/command-specs/onboarding.js +1 -1
  293. package/src/command-specs/profile.js +42 -1
  294. package/src/command-specs/skills.js +314 -9
  295. package/src/command-specs/smoke.js +16 -4
  296. package/src/command-specs/spaces.js +783 -0
  297. package/src/command-specs/tools.js +118 -21
  298. package/src/command-specs/version-history.js +20 -0
  299. package/src/command-specs/views.js +69 -0
  300. package/src/runtime/agent-browser.js +178 -267
  301. package/src/runtime/agent-setup.js +172 -13
  302. package/src/runtime/app-boundary-validator.js +338 -2
  303. package/src/runtime/app-data-literals.js +82 -0
  304. package/src/runtime/app-platform.js +750 -1570
  305. package/src/runtime/auth-recovery.js +17 -0
  306. package/src/runtime/base-skills.d.ts +11 -0
  307. package/src/runtime/base-skills.js +100 -3
  308. package/src/runtime/computer-identity.d.ts +30 -0
  309. package/src/runtime/computer-identity.js +151 -0
  310. package/src/runtime/config-lock.js +135 -0
  311. package/src/runtime/confined-space-build.js +74 -0
  312. package/src/runtime/confined-space-verify.js +49 -0
  313. package/src/runtime/delegated-context.js +5 -21
  314. package/src/runtime/native-record-files.js +47 -0
  315. package/src/runtime/oauth.js +342 -31
  316. package/src/runtime/profiles.js +19 -112
  317. package/src/runtime/retired-sdk-files.js +24 -0
  318. package/src/runtime/retry.js +150 -0
  319. package/src/runtime/skill-sync/cloud-client.ts +33 -8
  320. package/src/runtime/skill-sync/index.ts +443 -106
  321. package/src/runtime/skill-sync/local-scanner.ts +248 -32
  322. package/src/runtime/skill-sync/native-identity.ts +102 -0
  323. package/src/runtime/skill-sync/native-plan.ts +70 -0
  324. package/src/runtime/skill-sync/symlink-manager.ts +66 -16
  325. package/src/runtime/skill-sync/sync-plan.ts +34 -2
  326. package/src/runtime/skill-sync/types.ts +54 -0
  327. package/src/runtime/skill-sync/write-cloud-skill.ts +4 -4
  328. package/src/runtime/skill-sync-service.js +109 -0
  329. package/src/runtime/source-root.js +32 -0
  330. package/src/runtime/space-collection-scaffold.js +107 -0
  331. package/src/runtime/space-database-structures.js +229 -0
  332. package/src/runtime/space-fixture-broker.js +68 -0
  333. package/src/runtime/space-lock.js +337 -0
  334. package/src/runtime/space-platform.js +133 -0
  335. package/src/runtime/space-source.js +290 -0
  336. package/src/runtime/space-test-server.js +354 -0
  337. package/src/runtime/space-verification.js +94 -0
  338. package/src/runtime/space-verify-browser-worker.js +51 -0
  339. package/src/runtime/space-view-manifest.js +368 -0
  340. package/src/runtime/sync-skills.d.ts +5 -1
  341. package/src/runtime/sync-skills.js +11 -2
  342. package/src/runtime/tool-confirmation.js +138 -0
  343. package/src/runtime/transport.js +118 -24
  344. package/src/runtime/upsell.js +219 -0
  345. package/src/runtime/view-render.js +49 -0
  346. package/src/skill-sync-worker-entry.js +2 -0
  347. package/src/skill-sync-worker.js +114 -0
  348. package/src/space-harness-host.ts +122 -0
  349. package/template/.harness/index.html.tmpl +9 -352
  350. package/template/app/globals.css +29 -3
  351. package/template/app/layout.tsx +2 -6
  352. package/template/components/ui/badge.tsx +7 -4
  353. package/template/components/ui/button.tsx +1 -1
  354. package/template/components/ui/native-select.tsx +24 -0
  355. package/template/notis.config.ts +4 -36
  356. package/template/package-lock.json +1800 -1867
  357. package/template/package.json +16 -14
  358. package/template/postcss.config.mjs +1 -1
  359. package/template/tailwind.config.ts +1 -6
  360. package/template/tsconfig.json +1 -0
  361. package/template/vite.config.ts +2 -2
  362. package/dist/base-skills/notis-apps/SKILL.md +0 -613
  363. package/skills/notis-apps/cli.md +0 -285
  364. package/src/command-specs/apps.js +0 -3011
  365. package/src/runtime/app-changelog.js +0 -79
  366. package/src/runtime/app-dev-consumers.js +0 -154
  367. package/src/runtime/app-dev-host-lock.js +0 -80
  368. package/src/runtime/app-dev-process-identity.js +0 -111
  369. package/src/runtime/app-dev-roots.js +0 -284
  370. package/src/runtime/app-dev-server.js +0 -1140
  371. package/src/runtime/app-dev-sessions.js +0 -185
  372. package/src/runtime/app-registry-scaffolds.js +0 -367
  373. package/src/runtime/assets/store-screenshot-dark.png +0 -0
  374. package/src/runtime/cli-mode.generated.js +0 -5
  375. package/src/runtime/cli-mode.js +0 -34
  376. package/src/runtime/store-screenshot.js +0 -143
  377. package/template/CHANGELOG.md +0 -5
  378. package/template/app/page.tsx +0 -60
  379. package/template/components/ui/card.tsx +0 -56
  380. package/template/packages/sdk/src/components/DocumentEditor.tsx +0 -103
  381. package/template/packages/sdk/src/config.ts +0 -259
  382. package/template/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
  383. package/template/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
  384. package/template/packages/sdk/src/hooks/useDocument.ts +0 -78
  385. package/template/packages/sdk/src/hooks/useNotisNavigation.ts +0 -52
  386. package/template/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
  387. package/template/packages/sdk/src/runtime.ts +0 -439
  388. package/template/packages/sdk/src/vite.ts +0 -56
  389. package/template/packages/sdk/tsconfig.json +0 -15
  390. /package/{template/packages → dist}/sdk/src/components/MultiSelectDragOverlay.tsx +0 -0
  391. /package/{template/packages → dist}/sdk/src/components/ShortcutHints.tsx +0 -0
  392. /package/{template/packages → dist}/sdk/src/hooks/useActiveResource.ts +0 -0
  393. /package/{template/packages → dist}/sdk/src/hooks/useTool.ts +0 -0
  394. /package/{template/packages → dist}/sdk/src/hooks/useTools.ts +0 -0
  395. /package/{template/packages → dist}/sdk/src/ui.ts +0 -0
@@ -0,0 +1,292 @@
1
+ import { SdkQueryError } from './queryErrors';
2
+
3
+ /** In-memory read snapshots. The host owns the lifetime and authorization scope. */
4
+ export interface QuerySnapshot<T = unknown> {
5
+ data: T | undefined;
6
+ hasData: boolean;
7
+ isFetching: boolean;
8
+ error: Error | null;
9
+ updatedAt: number;
10
+ invalidation: number;
11
+ }
12
+
13
+ export interface QueryFetchOptions {
14
+ staleTimeMs?: number;
15
+ force?: boolean;
16
+ }
17
+
18
+ export interface NotisQueryClient {
19
+ getSnapshot<T>(key: string): QuerySnapshot<T>;
20
+ subscribe(key: string, listener: () => void): () => void;
21
+ fetch<T>(key: string, read: () => Promise<T>, options?: QueryFetchOptions): Promise<T>;
22
+ prefetch<T>(key: string, read: () => Promise<T>, options?: QueryFetchOptions): Promise<T>;
23
+ invalidate(key?: string): void;
24
+ clear(): void;
25
+ /** Host-only: permanently retire a revoked security scope. */
26
+ dispose?(): void;
27
+ getRevision?(): number;
28
+ /**
29
+ * Hides records (by `record_key` / `recordKey`) from every cached read at once, so a delete
30
+ * looks done before the server answers. `commit` keeps them hidden until each read that still
31
+ * holds them is read again; `restore` shows them again (a failed or undone delete).
32
+ */
33
+ hideRecords?(recordKeys: readonly string[]): HiddenRecords;
34
+ }
35
+
36
+ export interface HiddenRecords {
37
+ commit(recordKeys?: readonly string[]): void;
38
+ restore(recordKeys?: readonly string[]): void;
39
+ }
40
+
41
+ function recordKeyOf(item: unknown): string | undefined {
42
+ if (!item || typeof item !== 'object') return undefined;
43
+ const record = item as { record_key?: unknown; recordKey?: unknown };
44
+ const key = record.record_key ?? record.recordKey;
45
+ return typeof key === 'string' ? key : undefined;
46
+ }
47
+
48
+ /** Rows, documents or a bare list without the hidden records; the same reference when none are. */
49
+ function withoutRecords(data: unknown, hides: (key: string) => boolean, removed: string[]): unknown {
50
+ const filter = (list: unknown[]) => {
51
+ const kept = list.filter((item) => {
52
+ const key = recordKeyOf(item);
53
+ if (key === undefined || !hides(key)) return true;
54
+ removed.push(key);
55
+ return false;
56
+ });
57
+ return kept.length === list.length ? list : kept;
58
+ };
59
+ if (Array.isArray(data)) return filter(data);
60
+ if (!data || typeof data !== 'object') return data;
61
+ const record = data as Record<string, unknown>;
62
+ let result = record;
63
+ for (const field of ['rows', 'documents']) {
64
+ const list = record[field];
65
+ if (!Array.isArray(list)) continue;
66
+ const kept = filter(list);
67
+ if (kept !== list) result = { ...result, [field]: kept };
68
+ }
69
+ return result;
70
+ }
71
+
72
+ const EMPTY: QuerySnapshot = Object.freeze({
73
+ data: undefined, hasData: false, isFetching: false, error: null, updatedAt: 0, invalidation: 0,
74
+ });
75
+
76
+ /** Stable keys distinguish filters, pagination, and resource identities. */
77
+ export function queryKey(value: unknown): string {
78
+ if (value instanceof Date) return JSON.stringify(value.toISOString());
79
+ if (Array.isArray(value)) return `[${value.map(queryKey).join(',')}]`;
80
+ if (value && typeof value === 'object') {
81
+ const record = value as Record<string, unknown>;
82
+ return `{${Object.keys(record).filter((key) => record[key] !== undefined).sort()
83
+ .map((key) => `${JSON.stringify(key)}:${queryKey(record[key])}`).join(',')}}`;
84
+ }
85
+ return JSON.stringify(value) ?? 'null';
86
+ }
87
+
88
+ /** One shared queue can bound descriptor and data speculation together. */
89
+ export function createPrefetchQueue(concurrency = 2) {
90
+ let active = 0;
91
+ const waiting: Array<() => void> = [];
92
+ function drain() {
93
+ while (active < concurrency && waiting.length) waiting.shift()!();
94
+ }
95
+ return <T>(read: () => Promise<T>): Promise<T> => new Promise<T>((resolve, reject) => {
96
+ waiting.push(() => {
97
+ active += 1;
98
+ Promise.resolve().then(read).then(resolve, reject).finally(() => { active -= 1; drain(); });
99
+ });
100
+ drain();
101
+ });
102
+ }
103
+
104
+ type Entry = {
105
+ /** What the reads returned; `snapshot` is the same without hidden records. */
106
+ raw: QuerySnapshot;
107
+ snapshot: QuerySnapshot;
108
+ removed: string;
109
+ /** When the read behind `raw.data` started, on the client's `seq` clock. */
110
+ dataSeq: number;
111
+ listeners: Set<() => void>;
112
+ generation: number;
113
+ pending?: Promise<unknown>;
114
+ /** When the in-flight read started, including a first read with no raw snapshot yet. */
115
+ pendingSeq?: number;
116
+ };
117
+
118
+ export function createQueryClient(options: {
119
+ maxEntries?: number;
120
+ now?: () => number;
121
+ schedule?: ReturnType<typeof createPrefetchQueue>;
122
+ /** Bounds idempotent reads only; never retries the underlying callback. */
123
+ readTimeoutMs?: number;
124
+ } = {}): NotisQueryClient {
125
+ const entries = new Map<string, Entry>();
126
+ const now = options.now ?? Date.now;
127
+ const maxEntries = options.maxEntries ?? 100;
128
+ const schedule = options.schedule ?? createPrefetchQueue(2);
129
+ let epoch = 0;
130
+ let disposed = false;
131
+ let revision = 0;
132
+ let seq = 0;
133
+ // null while the delete runs; then the `seq` it committed at.
134
+ const hidden = new Map<string, number | null>();
135
+
136
+ function prune(keep?: string) {
137
+ for (const [oldKey, old] of entries) {
138
+ if (entries.size <= maxEntries) break;
139
+ if (oldKey !== keep && !old.listeners.size && !old.pending) entries.delete(oldKey);
140
+ }
141
+ }
142
+ function entry(key: string): Entry {
143
+ let value = entries.get(key);
144
+ if (!value) {
145
+ value = { raw: EMPTY, snapshot: EMPTY, removed: '', dataSeq: 0, listeners: new Set(), generation: 0 };
146
+ entries.set(key, value);
147
+ }
148
+ // Only operations, not getSnapshot during render, update the LRU.
149
+ entries.delete(key);
150
+ entries.set(key, value);
151
+ prune(key);
152
+ return value;
153
+ }
154
+ /** Recomputes the shown snapshot; without `rawChanged`, only when other records are hidden now. */
155
+ function view(value: Entry, rawChanged: boolean): boolean {
156
+ const removed: string[] = [];
157
+ const data = hidden.size && value.raw.hasData ? withoutRecords(value.raw.data, (key) => {
158
+ if (!hidden.has(key)) return false;
159
+ const committed = hidden.get(key);
160
+ return committed === null || committed === undefined || value.dataSeq < committed;
161
+ }, removed) : value.raw.data;
162
+ const signature = removed.sort().join('\u0000');
163
+ if (!rawChanged && value.removed === signature) return false;
164
+ value.removed = signature;
165
+ value.snapshot = data === value.raw.data ? value.raw : { ...value.raw, data };
166
+ return true;
167
+ }
168
+ function publish(value: Entry, raw: QuerySnapshot) {
169
+ value.raw = raw;
170
+ view(value, true);
171
+ for (const listener of value.listeners) listener();
172
+ }
173
+ /** A committed delete stays hidden while an older read holds or could still return the record. */
174
+ function sweep() {
175
+ for (const [key, committed] of hidden) {
176
+ if (committed === null) continue;
177
+ let held = false;
178
+ for (const value of entries.values()) {
179
+ if (value.pending && value.pendingSeq !== undefined && value.pendingSeq < committed) { held = true; break; }
180
+ if (value.dataSeq >= committed || !value.raw.hasData) continue;
181
+ const found: string[] = [];
182
+ withoutRecords(value.raw.data, (candidate) => candidate === key, found);
183
+ if (found.length) { held = true; break; }
184
+ }
185
+ if (!held) hidden.delete(key);
186
+ }
187
+ }
188
+ function refresh() {
189
+ for (const value of entries.values()) {
190
+ if (view(value, false)) for (const listener of value.listeners) listener();
191
+ }
192
+ }
193
+ const client: NotisQueryClient = {
194
+ getSnapshot<T>(key: string) { return (entries.get(key)?.snapshot ?? EMPTY) as QuerySnapshot<T>; },
195
+ subscribe(key, listener) {
196
+ const value = entry(key);
197
+ value.listeners.add(listener);
198
+ return () => { value.listeners.delete(listener); prune(); };
199
+ },
200
+ fetch<T>(key: string, read: () => Promise<T>, fetchOptions: QueryFetchOptions = {}) {
201
+ if (disposed) return Promise.reject(new SdkQueryError('scopeUnavailable'));
202
+ const value = entry(key);
203
+ if (value.pending) return value.pending as Promise<T>;
204
+ if (!fetchOptions.force && value.snapshot.hasData && value.snapshot.updatedAt > 0
205
+ && now() - value.snapshot.updatedAt < (fetchOptions.staleTimeMs ?? 30_000)) {
206
+ return Promise.resolve(value.snapshot.data as T);
207
+ }
208
+ const generation = ++value.generation;
209
+ const requestEpoch = epoch;
210
+ const startSeq = ++seq;
211
+ const canCommit = () => epoch === requestEpoch && value.generation === generation && entries.get(key) === value;
212
+ let timeout: ReturnType<typeof setTimeout>;
213
+ const deadline = new Promise<never>((_, reject) => {
214
+ timeout = setTimeout(() => reject(new SdkQueryError('timedOut')), options.readTimeoutMs ?? 30_000);
215
+ // Node-based verification must not stay alive for a retired browser read.
216
+ if (typeof timeout === 'object' && 'unref' in timeout) timeout.unref();
217
+ });
218
+ const request = Promise.race([Promise.resolve().then(read), deadline]).then((data) => {
219
+ if (canCommit()) {
220
+ value.dataSeq = startSeq;
221
+ publish(value, { ...value.raw, data, hasData: true, isFetching: false, error: null, updatedAt: now() });
222
+ if (hidden.size) sweep();
223
+ }
224
+ return data;
225
+ }, (reason) => {
226
+ const error = reason instanceof Error ? reason : new Error(String(reason));
227
+ if (canCommit()) publish(value, { ...value.raw, isFetching: false, error });
228
+ throw error;
229
+ }).finally(() => {
230
+ clearTimeout(timeout);
231
+ if (value.pending === request) { value.pending = undefined; value.pendingSeq = undefined; }
232
+ if (hidden.size) sweep();
233
+ prune();
234
+ });
235
+ value.pending = request;
236
+ value.pendingSeq = startSeq;
237
+ publish(value, { ...value.raw, isFetching: true, error: null });
238
+ return request;
239
+ },
240
+ prefetch<T>(key: string, read: () => Promise<T>, fetchOptions?: QueryFetchOptions) {
241
+ const requestEpoch = epoch;
242
+ return schedule(() => {
243
+ if (epoch !== requestEpoch) throw new SdkQueryError('scopeCleared');
244
+ return client.fetch(key, read, fetchOptions);
245
+ });
246
+ },
247
+ getRevision: () => revision,
248
+ invalidate(key) {
249
+ revision += 1;
250
+ for (const [entryKey, value] of entries) {
251
+ if (key !== undefined && entryKey !== key) continue;
252
+ value.generation += 1;
253
+ value.pending = undefined;
254
+ value.pendingSeq = undefined;
255
+ publish(value, { ...value.raw, updatedAt: 0, isFetching: false, invalidation: value.raw.invalidation + 1 });
256
+ }
257
+ },
258
+ dispose() { disposed = true; client.clear(); },
259
+ clear() {
260
+ revision += 1;
261
+ epoch += 1;
262
+ for (const value of entries.values()) {
263
+ value.generation += 1;
264
+ value.pending = undefined;
265
+ value.pendingSeq = undefined;
266
+ value.dataSeq = 0;
267
+ publish(value, { ...EMPTY, invalidation: value.raw.invalidation + 1 });
268
+ }
269
+ for (const [key, value] of entries) if (!value.listeners.size) entries.delete(key);
270
+ sweep();
271
+ },
272
+ hideRecords(recordKeys) {
273
+ const own = [...new Set(recordKeys.filter((key) => typeof key === 'string' && key))];
274
+ for (const key of own) hidden.set(key, null);
275
+ refresh();
276
+ const pick = (keys?: readonly string[]) => (keys ? own.filter((key) => keys.includes(key)) : own);
277
+ return {
278
+ commit(keys) {
279
+ const at = ++seq;
280
+ for (const key of pick(keys)) if (hidden.get(key) === null) hidden.set(key, at);
281
+ sweep();
282
+ refresh();
283
+ },
284
+ restore(keys) {
285
+ for (const key of pick(keys)) hidden.delete(key);
286
+ refresh();
287
+ },
288
+ };
289
+ },
290
+ };
291
+ return client;
292
+ }
@@ -0,0 +1,51 @@
1
+ /** SDK-owned read failures. The host still owns messages for server/action refusals. */
2
+ const copy = {
3
+ en: {
4
+ bindingUnavailable: 'This Space cannot read this database yet.',
5
+ actionUnavailable: 'This action is unavailable in this Space.',
6
+ readUnavailable: 'These data cannot be read in this Space.',
7
+ schemaChanged: 'This database changed. Refresh the page and try again.',
8
+ responseIncomplete: 'This database could not be loaded. Refresh the page and try again.',
9
+ listUnavailable: 'This list is unavailable in this view.',
10
+ timedOut: 'This read took too long. Please retry.',
11
+ scopeUnavailable: 'App query scope is no longer available.',
12
+ scopeCleared: 'App query scope was cleared.',
13
+ },
14
+ fr: {
15
+ bindingUnavailable: 'Ce Space ne peut pas encore lire cette base de données.',
16
+ actionUnavailable: 'Cette action n’est pas disponible dans ce Space.',
17
+ readUnavailable: 'Ces données ne sont pas accessibles dans ce Space.',
18
+ schemaChanged: 'Cette base de données a changé. Actualise la page et réessaie.',
19
+ responseIncomplete: 'Cette base de données n’a pas pu être chargée. Actualise la page et réessaie.',
20
+ listUnavailable: 'Cette liste n’est pas disponible dans cette vue.',
21
+ timedOut: 'Cette lecture a pris trop de temps. Réessaie.',
22
+ scopeUnavailable: 'Les données de cette vue ne sont plus accessibles.',
23
+ scopeCleared: 'Les données de cette vue ont été réinitialisées.',
24
+ },
25
+ } as const;
26
+
27
+ export type QueryErrorKey = keyof typeof copy.en;
28
+ const PREFIX = 'notis_sdk_query:';
29
+
30
+ /** Code and diagnostic survive localisation; only SDK-owned messages are translated. */
31
+ export class SdkQueryError extends Error {
32
+ readonly code: string;
33
+ readonly diagnostic?: string;
34
+ constructor(key: QueryErrorKey, diagnostic?: string, locale?: string, cause?: Error) {
35
+ super(copy[locale === 'fr' ? 'fr' : 'en'][key], cause ? { cause } : undefined);
36
+ this.name = 'SdkQueryError';
37
+ this.code = PREFIX + key;
38
+ this.diagnostic = diagnostic;
39
+ }
40
+ }
41
+
42
+ /** Called at render time, so a cached failure changes language without replaying its read. */
43
+ export function localizeQueryError(error: Error | null, locale?: string): Error | null {
44
+ const failure = error as (Error & { code?: unknown; diagnostic?: unknown }) | null;
45
+ if (!failure || typeof failure.code !== 'string' || !failure.code.startsWith(PREFIX)) return error;
46
+ const key = failure.code.slice(PREFIX.length);
47
+ if (!Object.hasOwn(copy.en, key)) return error;
48
+ const message = copy[locale === 'fr' ? 'fr' : 'en'][key as QueryErrorKey];
49
+ if (failure.message === message) return error;
50
+ return new SdkQueryError(key as QueryErrorKey, typeof failure.diagnostic === 'string' ? failure.diagnostic : undefined, locale, failure);
51
+ }