@notis_ai/cli 0.2.18 → 0.2.20

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 +279 -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
@@ -2,7 +2,15 @@ import { accessSync, constants as fsConstants, createReadStream, existsSync, rea
2
2
  import { createHash } from 'node:crypto';
3
3
  import { basename } from 'node:path';
4
4
  import { usageError } from '../runtime/errors.js';
5
- import { assertToolNotDelegated } from '../runtime/delegated-context.js';
5
+ import {
6
+ canPrompt,
7
+ createStderrPrompter,
8
+ extractToolResult,
9
+ findConfirmationPreview,
10
+ renderPreview,
11
+ resolveConfirmation,
12
+ } from '../runtime/tool-confirmation.js';
13
+ import { findUpsell, renderUpsell } from '../runtime/upsell.js';
6
14
  import {
7
15
  COMPOSIO_GET_TOOL_SCHEMAS,
8
16
  COMPOSIO_MULTI_EXECUTE_TOOL,
@@ -174,6 +182,11 @@ function classifySqlMutation(query) {
174
182
 
175
183
  export function classifyToolMutation(toolName, args = {}) {
176
184
  const normalized = localNotisToolSlug(toolName).toUpperCase();
185
+ if (normalized === 'LOCAL_NOTIS_SANDBOX_PREVIEW') {
186
+ if (args.action === 'status') return false;
187
+ if (['register', 'open', 'heartbeat', 'stop'].includes(args.action)) return true;
188
+ return null;
189
+ }
177
190
  if (normalized.includes('EXECUTE_SQL') && typeof args.query === 'string') {
178
191
  const query = args.query
179
192
  .replace(/\/\*[\s\S]*?\*\//g, ' ')
@@ -293,18 +306,19 @@ function ensureLongRunningToolTimeout(ctx, toolNames) {
293
306
  }
294
307
 
295
308
  async function toolsToolkitsHandler(ctx) {
296
- const toolkits = await fetchToolkits(ctx.runtime);
309
+ const { toolkits, coverage, warnings } = await fetchToolkits(ctx.runtime);
297
310
  return ctx.output.emitSuccess({
298
311
  command: ctx.spec.command_path.join(' '),
299
- data: { toolkits },
300
- humanSummary: `Found ${toolkits.length} toolkits`,
312
+ data: { toolkits, coverage },
313
+ warnings,
314
+ humanSummary: `Found ${toolkits.length} toolkits${coverage.complete ? '' : ' (incomplete inventory)'}`,
301
315
  hints: [
302
316
  { command: 'notis tools search <query>', reason: 'Search canonical tools and schemas' },
303
317
  ],
304
318
  renderHuman: () =>
305
319
  toolkits
306
320
  .map((entry) => {
307
- const status = entry.has_active_connection ? 'connected' : 'needs auth';
321
+ const status = entry.availability === 'not_probed' ? 'configured' : entry.has_active_connection ? 'connected' : 'needs auth';
308
322
  return `${entry.id} ${status} ${entry.description}`;
309
323
  })
310
324
  .join('\n'),
@@ -381,9 +395,6 @@ async function toolsDescribeHandler(ctx) {
381
395
 
382
396
  async function toolsExecHandler(ctx) {
383
397
  const requestedToolName = localNotisToolSlug(ctx.args.toolName);
384
- // `tools exec` is the escape hatch around every first-class command, so the
385
- // hand-over guard has to live here too or it guards nothing.
386
- assertToolNotDelegated(requestedToolName);
387
398
  let targetMutating = classifyToolMutation(requestedToolName);
388
399
  ensureLongRunningToolTimeout(ctx, requestedToolName);
389
400
  ctx.output.emitProgress({
@@ -471,17 +482,94 @@ async function toolsExecHandler(ctx) {
471
482
  requestId: result.requestId,
472
483
  });
473
484
 
485
+ const meta = {
486
+ mutating: targetMutating,
487
+ mutation_classification: targetMutating === null ? 'unknown' : 'name_hint_only',
488
+ idempotency_key: result.idempotencyKey ?? idempotencyKey,
489
+ attempts: result.attempts ?? 1,
490
+ };
491
+ const preview = findConfirmationPreview(result.payload);
492
+ if (preview) {
493
+ return confirmAndApply(ctx, { requestedToolName, args, preview, result, idempotencyKey, fileBindings, meta });
494
+ }
495
+ return emitToolResult(ctx, { requestedToolName, result, meta });
496
+ }
497
+
498
+ function toolResultUpsell(payload) {
499
+ const toolResult = extractToolResult(payload);
500
+ return toolResult ? findUpsell(toolResult) : null;
501
+ }
502
+
503
+ function emitToolResult(ctx, { requestedToolName, result, meta, humanSummary }) {
504
+ const upsellBody = toolResultUpsell(result.payload);
505
+ const rendered = upsellBody ? renderUpsell(upsellBody, { apiBase: ctx.runtime.apiBase }) : null;
474
506
  return ctx.output.emitSuccess({
475
507
  command: ctx.spec.command_path.join(' '),
476
508
  data: result.payload,
477
- humanSummary: `Executed tool ${requestedToolName}`,
509
+ humanSummary: rendered ? rendered.message : (humanSummary || `Executed tool ${requestedToolName}`),
478
510
  requestId: result.requestId,
479
- meta: {
480
- mutating: targetMutating,
481
- mutation_classification: targetMutating === null ? 'unknown' : 'name_hint_only',
482
- idempotency_key: idempotencyKey,
483
- },
484
- renderHuman: () => JSON.stringify(result.payload, null, 2),
511
+ hints: rendered ? rendered.hints : [],
512
+ meta: rendered ? { ...meta, upsell: rendered.upsell } : meta,
513
+ renderHuman: () => (rendered ? rendered.text : JSON.stringify(result.payload, null, 2)),
514
+ });
515
+ }
516
+
517
+ function confirmationKey(idempotencyKey, globalOptions) {
518
+ // A key the caller chose must not replay the preview, so the confirming call
519
+ // gets a derived key; a generated key is simply replaced by a fresh one.
520
+ return globalOptions.idempotencyKey ? `${idempotencyKey}.confirm` : nextIdempotencyKey({});
521
+ }
522
+
523
+ async function confirmAndApply(ctx, { requestedToolName, args, preview, result, idempotencyKey, fileBindings, meta }) {
524
+ const yes = Boolean(ctx.options.yes);
525
+ const interactive = canPrompt({ runtime: ctx.runtime, output: ctx.output });
526
+ const previewText = renderPreview(preview);
527
+ if (interactive && !yes) {
528
+ process.stderr.write(`${previewText}\n`);
529
+ }
530
+ const prompter = interactive && !yes ? createStderrPrompter() : null;
531
+ let decision;
532
+ try {
533
+ decision = await resolveConfirmation({ preview, args, yes, interactive, ask: (question) => prompter.ask(question) });
534
+ } finally {
535
+ prompter?.close();
536
+ }
537
+
538
+ if (decision.decision !== 'apply') {
539
+ const reason = decision.decision === 'not_interactive'
540
+ ? 'Nothing has changed. Run the same command with --yes to apply it.'
541
+ : decision.reason;
542
+ const rerunArgs = decision.decision === 'needs_input' ? { ...args, [decision.field]: '<value>' } : args;
543
+ return ctx.output.emitSuccess({
544
+ command: ctx.spec.command_path.join(' '),
545
+ data: result.payload,
546
+ humanSummary: reason,
547
+ requestId: result.requestId,
548
+ hints: decision.decision === 'declined' ? [] : [{
549
+ command: `notis tools exec ${requestedToolName} --arguments '${JSON.stringify(rerunArgs)}' --yes`,
550
+ reason: 'Apply this change',
551
+ }],
552
+ meta: { ...meta, confirmation: decision.decision, applied: false },
553
+ renderHuman: () => (interactive && !yes ? reason : `${previewText}\n\n${reason}`),
554
+ });
555
+ }
556
+
557
+ const confirmKey = confirmationKey(idempotencyKey, ctx.globalOptions);
558
+ ctx.output.emitProgress({ phase: 'execute', message: `Applying ${requestedToolName}` });
559
+ const applied = await runToolCommand({
560
+ runtime: ctx.runtime,
561
+ toolName: COMPOSIO_MULTI_EXECUTE_TOOL,
562
+ arguments_: { tools: [{ tool_slug: requestedToolName, arguments: decision.arguments }] },
563
+ mutating: true,
564
+ idempotencyKey: confirmKey,
565
+ fileBindings,
566
+ });
567
+ ctx.output.emitProgress({ phase: 'complete', message: `Finished ${requestedToolName}`, requestId: applied.requestId });
568
+ return emitToolResult(ctx, {
569
+ requestedToolName,
570
+ result: applied,
571
+ humanSummary: `Applied ${requestedToolName}`,
572
+ meta: { ...meta, idempotency_key: applied.idempotencyKey ?? confirmKey, attempts: applied.attempts ?? 1, preview_idempotency_key: result.idempotencyKey ?? idempotencyKey, confirmation: 'confirmed', applied: true },
485
573
  });
486
574
  }
487
575
 
@@ -499,8 +587,6 @@ async function toolsExecParallelHandler(ctx) {
499
587
  if (!call.tool_name || typeof call.tool_name !== 'string') {
500
588
  throw usageError(`calls[${i}] missing required "tool_name" string`);
501
589
  }
502
- // A batch is just as good an escape hatch as a single exec.
503
- assertToolNotDelegated(localNotisToolSlug(call.tool_name));
504
590
  }
505
591
  ensureLongRunningToolTimeout(ctx, calls.map((call) => localNotisToolSlug(call.tool_name)));
506
592
 
@@ -515,8 +601,18 @@ async function toolsExecParallelHandler(ctx) {
515
601
  mutating: true,
516
602
  idempotencyKey: nextIdempotencyKey(ctx.globalOptions),
517
603
  })
518
- .then((r) => ({ tool_name: call.tool_name, status: 'ok', payload: r.payload }))
519
- .catch((e) => ({ tool_name: call.tool_name, status: 'error', error: e.message }))
604
+ .then((r) => ({
605
+ tool_name: call.tool_name,
606
+ status: 'ok',
607
+ payload: r.payload,
608
+ attempts: r.attempts ?? 1,
609
+ }))
610
+ .catch((e) => ({
611
+ tool_name: call.tool_name,
612
+ status: 'error',
613
+ error: e.message,
614
+ attempts: e?.details?.attempts ?? 1,
615
+ }))
520
616
  )
521
617
  );
522
618
 
@@ -582,11 +678,11 @@ export const toolsCommandSpecs = [
582
678
  when_to_use: 'Use this to inspect connection state before searching or executing generic tools.',
583
679
  args_schema: { arguments: [], options: [] },
584
680
  examples: ['notis tools toolkits', 'notis tools toolkits --json'],
585
- output_schema: 'Returns toolkit_connection_statuses from COMPOSIO_SEARCH_TOOLS, rendered as toolkit rows.',
681
+ output_schema: 'Returns deterministic toolkit namespaces, connection statuses and explicit completeness coverage.',
586
682
  mutates: false,
587
683
  idempotent: true,
588
684
  related_commands: ['notis tools search <query>', 'notis tools describe <tool-name>'],
589
- backend_call: { type: 'tool', name: COMPOSIO_SEARCH_TOOLS },
685
+ backend_call: { type: 'toolkit_inventory', method: 'POST', path: '/cli_tools' },
590
686
  handler: toolsToolkitsHandler,
591
687
  },
592
688
  {
@@ -633,6 +729,7 @@ export const toolsCommandSpecs = [
633
729
  { flags: '--file <argument-path=local-path>', description: 'Upload a local file into a file-uploadable tool argument. Repeatable.', collect: true },
634
730
  { flags: '--get-schema', description: 'Display the tool parameter schema without executing.' },
635
731
  { flags: '--dry-run', description: 'Validate arguments against the tool schema without executing.' },
732
+ { flags: '--yes', description: 'Apply a change that asks for confirmation without the Continue? [y/N] prompt.' },
636
733
  ],
637
734
  },
638
735
  examples: [
@@ -0,0 +1,20 @@
1
+ import { usageError } from '../runtime/errors.js';
2
+
3
+ /** The human output of a version comparison: the unified diff text, then its totals. */
4
+ export function unifiedDiffSummary(payload) {
5
+ const diff = payload && typeof payload === 'object' ? payload : {};
6
+ const text = typeof diff.unified_diff === 'string' ? diff.unified_diff.replace(/\n$/, '') : '';
7
+ const files = Array.isArray(diff.files) ? diff.files.length : 0;
8
+ const count = Number.isInteger(diff.file_count) ? diff.file_count : files;
9
+ const totals = `${count} ${count === 1 ? 'file' : 'files'} changed, +${diff.additions ?? 0} -${diff.deletions ?? 0}`
10
+ + (diff.truncated ? ' (comparison cut short; narrow it with --path or use --json)' : '');
11
+ return text ? `${text}\n\n${totals}` : `No changes. ${totals}`;
12
+ }
13
+
14
+ /** `--name <name>` sets a version name, `--clear` removes it; exactly one of the two. */
15
+ export function versionName(options) {
16
+ const hasName = typeof options.name === 'string';
17
+ if (hasName === Boolean(options.clear)) throw usageError('Pass --name <name>, or --clear to remove the name.');
18
+ if (hasName && !options.name.trim()) throw usageError('Pass a non-empty --name, or --clear to remove the name.');
19
+ return hasName ? options.name : null;
20
+ }
@@ -0,0 +1,69 @@
1
+ import { httpRequest } from '../runtime/transport.js';
2
+ import { usageError } from '../runtime/errors.js';
3
+ import { renderViewWithCliRuntime } from '../runtime/view-render.js';
4
+ import { resolve } from 'node:path';
5
+ import { randomUUID } from 'node:crypto';
6
+
7
+ export function viewRenderCommandSpec({ screenshotOnly = false } = {}) {
8
+ const command_path = screenshotOnly ? ['spaces', 'screenshot'] : ['views', 'render'];
9
+ return {
10
+ command_path, summary: screenshotOnly ? 'Capture a full-height PNG of a live view with your current access.' : 'Render a live view as Markdown and a full-height PNG with your current access.',
11
+ when_to_use: 'Check the actual deployed view; writes are blocked and current access is checked again before any output is saved.',
12
+ args_schema: { arguments: [{ token: '<url>', key: 'url', description: 'Current view-qualified or record link.' }], options: [
13
+ ...(!screenshotOnly ? [{ flags: '--outputs <kinds>', description: 'Comma-separated markdown,screenshot (default both).' }] : []),
14
+ { flags: '--width <pixels>', description: '1440 (default) or 390.' },
15
+ { flags: '--output-dir <path>', description: 'New output directory; defaults to a unique .notis/renders directory. Existing files are never overwritten.' },
16
+ ] }, examples: [screenshotOnly ? 'notis spaces screenshot <view-link> --width 390' : 'notis views render <view-link> --outputs markdown,screenshot'],
17
+ mutates: false, idempotent: true, require_auth: true,
18
+ backend_call: { type: 'http', path: '/portal_view_render/prepare' },
19
+ async handler(ctx) {
20
+ const outputs = screenshotOnly ? ['screenshot'] : (ctx.options.outputs || 'markdown,screenshot').split(',');
21
+ if (!outputs.length || new Set(outputs).size !== outputs.length || outputs.some(value => !['markdown', 'screenshot'].includes(value))) {
22
+ throw usageError('Choose markdown, screenshot, or markdown,screenshot.');
23
+ }
24
+ const width = ctx.options.width === undefined ? 1440 : Number(ctx.options.width);
25
+ const directory = resolve(ctx.options.outputDir || `.notis/renders/${randomUUID()}`);
26
+ const controller = new AbortController(), cancel = () => controller.abort();
27
+ process.once('SIGINT', cancel); process.once('SIGTERM', cancel);
28
+ try {
29
+ const { result, artifacts } = await renderViewWithCliRuntime({ runtime: ctx.runtime,
30
+ url: ctx.args.url, outputs, width, directory, signal: controller.signal });
31
+ const data = { ...result, artifacts };
32
+ if (data.screenshot) {
33
+ const { data_base64: _bytes, ...metadata } = data.screenshot;
34
+ data.screenshot = { ...metadata, path: artifacts.screenshot };
35
+ }
36
+ return ctx.output.emitSuccess({ command: command_path.join(' '), data,
37
+ humanSummary: `Rendered ${result.url}. Saved ${Object.values(artifacts).join(' and ')}.`, meta: { mutating: false } });
38
+ } finally { process.removeListener('SIGINT', cancel); process.removeListener('SIGTERM', cancel); }
39
+ },
40
+ };
41
+ }
42
+
43
+ export const viewsCommandSpecs = [{
44
+ command_path: ['views', 'find'],
45
+ summary: 'Find the views you can open for a record, database, view link, Space or search.',
46
+ when_to_use: 'Get fresh view-qualified links and declared URL parameters before citing or opening a view.',
47
+ args_schema: { options: [
48
+ { flags: '--record-key <id>', description: 'Find views that show this exact native record.' },
49
+ { flags: '--database-id <id>', description: 'Find views over this database.' },
50
+ { flags: '--url <url>', description: 'Resolve this view link and its current parameters.' },
51
+ { flags: '--space-id <id>', description: 'Describe this Space view.' },
52
+ { flags: '--query <text>', description: 'Search accessible view names, descriptions and readable context.' },
53
+ ] },
54
+ examples: ['notis views find --record-key <record-key>', 'notis views find --url <view-link>', 'notis views find --query inbox'],
55
+ mutates: false, idempotent: true, require_auth: true,
56
+ backend_call: { type: 'http', path: '/portal_spaces/find-views' },
57
+ async handler(ctx) {
58
+ const options = { record_key: ctx.options.recordKey, database_id: ctx.options.databaseId,
59
+ url: ctx.options.url, space_id: ctx.options.spaceId, query: ctx.options.query };
60
+ const selected = Object.entries(options).filter(([, value]) => value !== undefined);
61
+ if (selected.length !== 1 || typeof selected[0][1] !== 'string' || !selected[0][1].trim()) {
62
+ throw usageError('Choose exactly one of --record-key, --database-id, --url, --space-id or --query.');
63
+ }
64
+ const result = await httpRequest({ runtime: ctx.runtime, method: 'POST', path: '/portal_spaces/find-views',
65
+ body: Object.fromEntries(selected), spacesProtocol: true });
66
+ return ctx.output.emitSuccess({ command: 'views find', data: result.payload,
67
+ humanSummary: JSON.stringify(result.payload, null, 2), meta: { mutating: false, request_id: result.requestId } });
68
+ },
69
+ }, viewRenderCommandSpec()];