@neuralis/brain-core 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/README.md +79 -1409
  2. package/app/README.md +1 -1
  3. package/app/cards/FilesystemCardShell.tsx +42 -4
  4. package/app/cards/FilesystemChangeCard.tsx +34 -11
  5. package/app/cards/README.md +6 -5
  6. package/app/cards/diffUtils.ts +99 -1
  7. package/app/filesystem/FilesystemHost.tsx +17 -2
  8. package/app/filesystem/api/README.md +3 -3
  9. package/app/filesystem/api/index.ts +35 -11
  10. package/app/filesystem/api/projectPackages.ts +13 -102
  11. package/app/filesystem/domain/types.ts +30 -10
  12. package/app/filesystem/hooks/README.md +3 -3
  13. package/app/filesystem/hooks/useDiscoverableSources.ts +19 -30
  14. package/app/filesystem/hooks/useFilesystemSSE.ts +1 -1
  15. package/app/filesystem/host/README.md +5 -3
  16. package/app/filesystem/host/buildFilesystemHostValue.ts +19 -0
  17. package/app/filesystem/host/installFilesystemHostComponents.tsx +1 -1
  18. package/app/filesystem/lib/sourceKindForm.ts +118 -39
  19. package/app/filesystem/lib/treeVisualState.tsx +98 -4
  20. package/app/filesystem/store/README.md +1 -0
  21. package/app/filesystem/store/filesystemStore.ts +86 -5
  22. package/app/filesystem/store/gitSlice.ts +5 -0
  23. package/app/filesystem/store/helpers.ts +17 -0
  24. package/app/filesystem/store/listSlice.ts +8 -0
  25. package/app/filesystem/ui/CodeEditor.tsx +18 -3
  26. package/app/filesystem/ui/FileEditor.tsx +15 -10
  27. package/app/filesystem/ui/FileTree.tsx +41 -16
  28. package/app/filesystem/ui/FolderPicker.tsx +251 -0
  29. package/app/filesystem/ui/GitControlPanel.tsx +5 -0
  30. package/app/filesystem/ui/PackagesPanel.tsx +52 -374
  31. package/app/filesystem/ui/PolicyEditor.tsx +109 -24
  32. package/app/filesystem/ui/README.md +17 -11
  33. package/app/filesystem/ui/RawMediaPreview.tsx +58 -0
  34. package/app/filesystem/ui/SourceBranchHeader.tsx +4 -4
  35. package/app/filesystem/ui/SourcesPanel.tsx +420 -360
  36. package/app/filesystem/ui/Toolbar.tsx +1 -2
  37. package/app/shared/filesystem.png +0 -0
  38. package/dist/app/host.js +57 -49
  39. package/dist/scripts/sourceRootPairV1.d.ts +47 -0
  40. package/dist/scripts/sourceRootPairV1.d.ts.map +1 -0
  41. package/dist/scripts/sourceRootPairV1.js +147 -0
  42. package/dist/scripts/sourceRootPairV1.js.map +1 -0
  43. package/dist/scripts/sourceToFolderV1.d.ts +56 -0
  44. package/dist/scripts/sourceToFolderV1.d.ts.map +1 -0
  45. package/dist/scripts/sourceToFolderV1.js +152 -0
  46. package/dist/scripts/sourceToFolderV1.js.map +1 -0
  47. package/dist/scripts/sourceToHostV1.d.ts +56 -0
  48. package/dist/scripts/sourceToHostV1.d.ts.map +1 -0
  49. package/dist/scripts/sourceToHostV1.js +132 -0
  50. package/dist/scripts/sourceToHostV1.js.map +1 -0
  51. package/dist/src/connectors/AppSourceConfigStore.d.ts +17 -3
  52. package/dist/src/connectors/AppSourceConfigStore.d.ts.map +1 -1
  53. package/dist/src/connectors/AppSourceConfigStore.js +46 -6
  54. package/dist/src/connectors/AppSourceConfigStore.js.map +1 -1
  55. package/dist/src/connectors/HostConnector.d.ts +201 -0
  56. package/dist/src/connectors/HostConnector.d.ts.map +1 -0
  57. package/dist/src/connectors/HostConnector.js +903 -0
  58. package/dist/src/connectors/HostConnector.js.map +1 -0
  59. package/dist/src/connectors/inProcessTransport.d.ts +131 -0
  60. package/dist/src/connectors/inProcessTransport.d.ts.map +1 -0
  61. package/dist/src/connectors/inProcessTransport.js +447 -0
  62. package/dist/src/connectors/inProcessTransport.js.map +1 -0
  63. package/dist/src/domain/access/callerPermissions.d.ts +29 -0
  64. package/dist/src/domain/access/callerPermissions.d.ts.map +1 -1
  65. package/dist/src/domain/access/callerPermissions.js +85 -5
  66. package/dist/src/domain/access/callerPermissions.js.map +1 -1
  67. package/dist/src/domain/access/nativeLocalFence.d.ts +65 -0
  68. package/dist/src/domain/access/nativeLocalFence.d.ts.map +1 -0
  69. package/dist/src/domain/access/nativeLocalFence.js +171 -0
  70. package/dist/src/domain/access/nativeLocalFence.js.map +1 -0
  71. package/dist/src/domain/access/uriPermission.js +3 -3
  72. package/dist/src/domain/access/uriPermission.js.map +1 -1
  73. package/dist/src/domain/byteRange.d.ts +15 -0
  74. package/dist/src/domain/byteRange.d.ts.map +1 -0
  75. package/dist/src/domain/byteRange.js +30 -0
  76. package/dist/src/domain/byteRange.js.map +1 -0
  77. package/dist/src/domain/defaultPermissions.d.ts.map +1 -1
  78. package/dist/src/domain/defaultPermissions.js +29 -0
  79. package/dist/src/domain/defaultPermissions.js.map +1 -1
  80. package/dist/src/domain/mime.d.ts +8 -16
  81. package/dist/src/domain/mime.d.ts.map +1 -1
  82. package/dist/src/domain/mime.js +10 -99
  83. package/dist/src/domain/mime.js.map +1 -1
  84. package/dist/src/domain/paths.d.ts.map +1 -1
  85. package/dist/src/domain/paths.js +5 -3
  86. package/dist/src/domain/paths.js.map +1 -1
  87. package/dist/src/domain/sourceConfig.d.ts +52 -19
  88. package/dist/src/domain/sourceConfig.d.ts.map +1 -1
  89. package/dist/src/domain/sourceConfig.js +103 -19
  90. package/dist/src/domain/sourceConfig.js.map +1 -1
  91. package/dist/src/domain/sourcePackages.d.ts +8 -8
  92. package/dist/src/domain/sourcePackages.d.ts.map +1 -1
  93. package/dist/src/domain/sourceRootPair.d.ts +88 -0
  94. package/dist/src/domain/sourceRootPair.d.ts.map +1 -0
  95. package/dist/src/domain/sourceRootPair.js +108 -0
  96. package/dist/src/domain/sourceRootPair.js.map +1 -0
  97. package/dist/src/domain/syncTypes.d.ts +8 -1
  98. package/dist/src/domain/syncTypes.d.ts.map +1 -1
  99. package/dist/src/domain/syncTypes.js +1 -0
  100. package/dist/src/domain/syncTypes.js.map +1 -1
  101. package/dist/src/domain/types.d.ts +24 -1
  102. package/dist/src/domain/types.d.ts.map +1 -1
  103. package/dist/src/domain/uri.d.ts.map +1 -1
  104. package/dist/src/domain/uri.js +3 -2
  105. package/dist/src/domain/uri.js.map +1 -1
  106. package/dist/src/embeddings/clients/GeminiEmbedder.d.ts.map +1 -1
  107. package/dist/src/embeddings/clients/GeminiEmbedder.js +2 -5
  108. package/dist/src/embeddings/clients/GeminiEmbedder.js.map +1 -1
  109. package/dist/src/embeddings/clients/OpenAIEmbedder.d.ts.map +1 -1
  110. package/dist/src/embeddings/clients/OpenAIEmbedder.js +2 -3
  111. package/dist/src/embeddings/clients/OpenAIEmbedder.js.map +1 -1
  112. package/dist/src/embeddings/clients/QwenEmbedder.d.ts +2 -0
  113. package/dist/src/embeddings/clients/QwenEmbedder.d.ts.map +1 -1
  114. package/dist/src/embeddings/clients/QwenEmbedder.js +10 -2
  115. package/dist/src/embeddings/clients/QwenEmbedder.js.map +1 -1
  116. package/dist/src/embeddings/clients/VoyageEmbedder.d.ts +2 -0
  117. package/dist/src/embeddings/clients/VoyageEmbedder.d.ts.map +1 -1
  118. package/dist/src/embeddings/clients/VoyageEmbedder.js +8 -1
  119. package/dist/src/embeddings/clients/VoyageEmbedder.js.map +1 -1
  120. package/dist/src/embeddings/factory.d.ts +5 -3
  121. package/dist/src/embeddings/factory.d.ts.map +1 -1
  122. package/dist/src/embeddings/factory.js +7 -3
  123. package/dist/src/embeddings/factory.js.map +1 -1
  124. package/dist/src/embeddings/models.d.ts +1 -1
  125. package/dist/src/embeddings/models.d.ts.map +1 -1
  126. package/dist/src/embeddings/retry.js +1 -1
  127. package/dist/src/embeddings/retry.js.map +1 -1
  128. package/dist/src/embeddings/types.d.ts +6 -0
  129. package/dist/src/embeddings/types.d.ts.map +1 -1
  130. package/dist/src/embeddings/types.js +11 -0
  131. package/dist/src/embeddings/types.js.map +1 -1
  132. package/dist/src/git/GitRunner.d.ts +110 -30
  133. package/dist/src/git/GitRunner.d.ts.map +1 -1
  134. package/dist/src/git/GitRunner.js +511 -199
  135. package/dist/src/git/GitRunner.js.map +1 -1
  136. package/dist/src/git/GitWatchRegistry.d.ts +41 -35
  137. package/dist/src/git/GitWatchRegistry.d.ts.map +1 -1
  138. package/dist/src/git/GitWatchRegistry.js +61 -79
  139. package/dist/src/git/GitWatchRegistry.js.map +1 -1
  140. package/dist/src/git/gitPlace.d.ts +61 -0
  141. package/dist/src/git/gitPlace.d.ts.map +1 -0
  142. package/dist/src/git/gitPlace.js +74 -0
  143. package/dist/src/git/gitPlace.js.map +1 -0
  144. package/dist/src/git/sourceGitControl.d.ts +31 -19
  145. package/dist/src/git/sourceGitControl.d.ts.map +1 -1
  146. package/dist/src/git/sourceGitControl.js +208 -92
  147. package/dist/src/git/sourceGitControl.js.map +1 -1
  148. package/dist/src/git/sourceGitStatus.js +1 -1
  149. package/dist/src/git/sourceGitStatus.js.map +1 -1
  150. package/dist/src/git/untrackedStats.js +1 -1
  151. package/dist/src/git/untrackedStats.js.map +1 -1
  152. package/dist/src/index.d.ts +2 -1
  153. package/dist/src/index.d.ts.map +1 -1
  154. package/dist/src/index.js +2 -1
  155. package/dist/src/index.js.map +1 -1
  156. package/dist/src/lifecycle.d.ts +8 -11
  157. package/dist/src/lifecycle.d.ts.map +1 -1
  158. package/dist/src/lifecycle.js +2 -1
  159. package/dist/src/lifecycle.js.map +1 -1
  160. package/dist/src/routes/git.d.ts.map +1 -1
  161. package/dist/src/routes/git.js +183 -54
  162. package/dist/src/routes/git.js.map +1 -1
  163. package/dist/src/routes/helpers/uriGuard.d.ts +1 -1
  164. package/dist/src/routes/helpers/uriGuard.d.ts.map +1 -1
  165. package/dist/src/routes/helpers/uriGuard.js +3 -2
  166. package/dist/src/routes/helpers/uriGuard.js.map +1 -1
  167. package/dist/src/routes/helpers.d.ts +10 -3
  168. package/dist/src/routes/helpers.d.ts.map +1 -1
  169. package/dist/src/routes/helpers.js +12 -5
  170. package/dist/src/routes/helpers.js.map +1 -1
  171. package/dist/src/routes/list.d.ts.map +1 -1
  172. package/dist/src/routes/list.js +2 -3
  173. package/dist/src/routes/list.js.map +1 -1
  174. package/dist/src/routes/policies.d.ts +6 -4
  175. package/dist/src/routes/policies.d.ts.map +1 -1
  176. package/dist/src/routes/policies.js +22 -16
  177. package/dist/src/routes/policies.js.map +1 -1
  178. package/dist/src/routes/raw.d.ts.map +1 -1
  179. package/dist/src/routes/raw.js +65 -11
  180. package/dist/src/routes/raw.js.map +1 -1
  181. package/dist/src/routes/sources.d.ts +60 -18
  182. package/dist/src/routes/sources.d.ts.map +1 -1
  183. package/dist/src/routes/sources.js +411 -299
  184. package/dist/src/routes/sources.js.map +1 -1
  185. package/dist/src/services/BridgeService.d.ts +15 -35
  186. package/dist/src/services/BridgeService.d.ts.map +1 -1
  187. package/dist/src/services/BridgeService.js +30 -88
  188. package/dist/src/services/BridgeService.js.map +1 -1
  189. package/dist/src/services/FilesystemService.d.ts +3 -2
  190. package/dist/src/services/FilesystemService.d.ts.map +1 -1
  191. package/dist/src/services/FilesystemService.js +110 -32
  192. package/dist/src/services/FilesystemService.js.map +1 -1
  193. package/dist/src/services/FilesystemUiService.d.ts +4 -1
  194. package/dist/src/services/FilesystemUiService.d.ts.map +1 -1
  195. package/dist/src/services/FilesystemUiService.js +66 -25
  196. package/dist/src/services/FilesystemUiService.js.map +1 -1
  197. package/dist/src/services/SyncScheduler.d.ts +12 -4
  198. package/dist/src/services/SyncScheduler.d.ts.map +1 -1
  199. package/dist/src/services/SyncScheduler.js +37 -8
  200. package/dist/src/services/SyncScheduler.js.map +1 -1
  201. package/dist/src/services/baselineRepair.d.ts +13 -3
  202. package/dist/src/services/baselineRepair.d.ts.map +1 -1
  203. package/dist/src/services/baselineRepair.js +13 -3
  204. package/dist/src/services/baselineRepair.js.map +1 -1
  205. package/dist/src/services/declaredSources.d.ts +125 -42
  206. package/dist/src/services/declaredSources.d.ts.map +1 -1
  207. package/dist/src/services/declaredSources.js +117 -45
  208. package/dist/src/services/declaredSources.js.map +1 -1
  209. package/dist/src/store/dataFormats.d.ts +17 -2
  210. package/dist/src/store/dataFormats.d.ts.map +1 -1
  211. package/dist/src/store/dataFormats.js +18 -3
  212. package/dist/src/store/dataFormats.js.map +1 -1
  213. package/dist/src/sync/DeltaSyncRunner.d.ts.map +1 -1
  214. package/dist/src/sync/DeltaSyncRunner.js +144 -4
  215. package/dist/src/sync/DeltaSyncRunner.js.map +1 -1
  216. package/dist/src/sync/SyncJobQueue.d.ts +7 -2
  217. package/dist/src/sync/SyncJobQueue.d.ts.map +1 -1
  218. package/dist/src/sync/SyncJobQueue.js +16 -10
  219. package/dist/src/sync/SyncJobQueue.js.map +1 -1
  220. package/dist/src/sync/SyncWatchService.d.ts +21 -4
  221. package/dist/src/sync/SyncWatchService.d.ts.map +1 -1
  222. package/dist/src/sync/SyncWatchService.js +115 -10
  223. package/dist/src/sync/SyncWatchService.js.map +1 -1
  224. package/dist/src/sync/categoryInference.d.ts +1 -1
  225. package/dist/src/sync/categoryInference.js +1 -1
  226. package/dist/src/usecases/admitSourceRoot.d.ts +65 -0
  227. package/dist/src/usecases/admitSourceRoot.d.ts.map +1 -0
  228. package/dist/src/usecases/admitSourceRoot.js +85 -0
  229. package/dist/src/usecases/admitSourceRoot.js.map +1 -0
  230. package/dist/src/usecases/browseSourceFolders.d.ts +85 -0
  231. package/dist/src/usecases/browseSourceFolders.d.ts.map +1 -0
  232. package/dist/src/usecases/browseSourceFolders.js +210 -0
  233. package/dist/src/usecases/browseSourceFolders.js.map +1 -0
  234. package/dist/src/usecases/createDeclaredSources.d.ts +13 -2
  235. package/dist/src/usecases/createDeclaredSources.d.ts.map +1 -1
  236. package/dist/src/usecases/createDeclaredSources.js +39 -0
  237. package/dist/src/usecases/createDeclaredSources.js.map +1 -1
  238. package/dist/src/usecases/list.d.ts.map +1 -1
  239. package/dist/src/usecases/list.js +83 -26
  240. package/dist/src/usecases/list.js.map +1 -1
  241. package/dist/src/usecases/listAttachableDevices.d.ts +13 -0
  242. package/dist/src/usecases/listAttachableDevices.d.ts.map +1 -0
  243. package/dist/src/usecases/listAttachableDevices.js +10 -0
  244. package/dist/src/usecases/listAttachableDevices.js.map +1 -0
  245. package/dist/src/usecases/listSourcePackages.d.ts.map +1 -1
  246. package/dist/src/usecases/listSourcePackages.js +2 -5
  247. package/dist/src/usecases/listSourcePackages.js.map +1 -1
  248. package/dist/src/usecases/purgeExcludedPoints.d.ts.map +1 -1
  249. package/dist/src/usecases/purgeExcludedPoints.js +3 -2
  250. package/dist/src/usecases/purgeExcludedPoints.js.map +1 -1
  251. package/dist/src/usecases/readFiles.d.ts.map +1 -1
  252. package/dist/src/usecases/readFiles.js +15 -0
  253. package/dist/src/usecases/readFiles.js.map +1 -1
  254. package/dist/src/usecases/reconcileSourcePackageRoots.d.ts +1 -1
  255. package/dist/src/usecases/reconcileSourcePackageRoots.d.ts.map +1 -1
  256. package/dist/src/usecases/reconcileSourcePackageRoots.js +2 -1
  257. package/dist/src/usecases/reconcileSourcePackageRoots.js.map +1 -1
  258. package/dist/src/usecases/revokePrincipal.d.ts +7 -5
  259. package/dist/src/usecases/revokePrincipal.d.ts.map +1 -1
  260. package/dist/src/usecases/revokePrincipal.js +29 -7
  261. package/dist/src/usecases/revokePrincipal.js.map +1 -1
  262. package/dist/src/usecases/scheduleSourceSync.d.ts +7 -0
  263. package/dist/src/usecases/scheduleSourceSync.d.ts.map +1 -1
  264. package/dist/src/usecases/scheduleSourceSync.js +6 -5
  265. package/dist/src/usecases/scheduleSourceSync.js.map +1 -1
  266. package/dist/src/usecases/triggerSourceSync.d.ts +46 -0
  267. package/dist/src/usecases/triggerSourceSync.d.ts.map +1 -0
  268. package/dist/src/usecases/triggerSourceSync.js +75 -0
  269. package/dist/src/usecases/triggerSourceSync.js.map +1 -0
  270. package/dist/src/usecases/uploadBinary.d.ts +2 -1
  271. package/dist/src/usecases/uploadBinary.d.ts.map +1 -1
  272. package/dist/src/usecases/uploadBinary.js +2 -2
  273. package/dist/src/usecases/uploadBinary.js.map +1 -1
  274. package/dist/src/usecases/vector/endpointGuard.d.ts +1 -1
  275. package/dist/src/usecases/vector/endpointGuard.js +1 -1
  276. package/dist/src/vector/qdrantClient.d.ts +1 -1
  277. package/dist/src/vector/qdrantClient.js +1 -1
  278. package/dist/src/wiring.d.ts +3 -0
  279. package/dist/src/wiring.d.ts.map +1 -1
  280. package/dist/src/wiring.js +72 -6
  281. package/dist/src/wiring.js.map +1 -1
  282. package/package.json +145 -54
  283. package/skills/connect-business-data/SKILL.md +2 -2
  284. package/skills/create-package/SKILL.md +18 -18
  285. package/skills/create-package/references/config-and-credentials.md +16 -13
  286. package/skills/create-package/references/connectors-and-uri-policies.md +36 -27
  287. package/skills/create-package/references/manifest-and-discovery.md +12 -12
  288. package/skills/create-package/references/runtime-and-build.md +18 -18
  289. package/skills/create-package/references/skills-and-context.md +35 -19
  290. package/skills/create-package/references/surfaces-and-design.md +16 -16
  291. package/skills/create-package/references/team-and-workflows.md +2 -2
  292. package/skills/create-package/references/test-and-ship.md +17 -17
  293. package/skills/create-package/references/tools-and-schemas.md +5 -5
  294. package/skills/create-package/scripts/{check-package.sh → check-package.mjs} +78 -64
  295. package/skills/create-package/scripts/{verify-loaded.sh → verify-loaded.mjs} +156 -162
  296. package/skills/git/SKILL.md +31 -29
  297. package/skills/manage-files/SKILL.md +11 -14
  298. package/skills/manage-sources/SKILL.md +85 -45
  299. package/skills/manage-uri-policy/SKILL.md +9 -6
  300. package/skills/sync/SKILL.md +1 -1
  301. package/dist/src/connectors/LocalDiskConnector.d.ts +0 -171
  302. package/dist/src/connectors/LocalDiskConnector.d.ts.map +0 -1
  303. package/dist/src/connectors/LocalDiskConnector.js +0 -1233
  304. package/dist/src/connectors/LocalDiskConnector.js.map +0 -1
  305. package/skills/manage-files/scripts/copy.sh +0 -7
  306. package/skills/manage-files/scripts/create.sh +0 -7
  307. package/skills/manage-files/scripts/mkdir.sh +0 -7
  308. package/skills/manage-files/scripts/modify.sh +0 -7
  309. package/skills/manage-files/scripts/upload.sh +0 -16
  310. package/skills/manage-files/scripts/write.sh +0 -29
  311. package/skills/manage-sources/scripts/reembed.sh +0 -23
@@ -0,0 +1,447 @@
1
+ /**
2
+ * The `local` transport of the `host` connector: this process's own
3
+ * filesystem — a Docker mount, the native project zone, `data`, `packages`, the
4
+ * App Zone. It clamps every path to the source root (`resolveAndGuard`: no
5
+ * `..`, no symlink anywhere on the way) and runs the kernel's ONE folder walk
6
+ * (`folderOps`) on the clamped path; the server additionally searches with a
7
+ * real search binary (`rg`, `git grep`, `grep`) where the device has only the
8
+ * JS engine.
9
+ *
10
+ * Also the ONE owner of how a local source's ROOT is found on this plane
11
+ * (`resolveLocalRoot`, the os-mount host pair) — every gate, the shell index,
12
+ * source-package discovery and `<runtime_stack>` resolve the SAME root.
13
+ */
14
+ import fs from 'node:fs/promises';
15
+ import { constants as fsConstants } from 'node:fs';
16
+ import path from 'node:path';
17
+ import { execFile } from 'node:child_process';
18
+ import { discoverOsMounts, hostTreeRoot, isPathInside, neuralisTreeRoot } from '@neuralis/package-system/paths';
19
+ import { isPackageFolderPath } from '@neuralis/package-system/contracts';
20
+ import { foldPolicyCase } from '@neuralis/package-system/policies';
21
+ import { countTree, getFsWatchHub, readFileRange, scanContentTree, scanDeltaTree, walkTree, } from '@neuralis/package-system/data';
22
+ import { resolveSearchBinaries } from '../search/binaryResolver.js';
23
+ import { getBrainConfigNumber, resolveWatchRecovery } from '../config/env.js';
24
+ /** PATH-only child env — never this process's env (it carries infra secrets no helper needs). */
25
+ export const CHILD_ENV = { PATH: process.env.PATH ?? '/usr/local/bin:/usr/bin:/bin' };
26
+ const SCAN_TIMEOUT_MS = 120_000;
27
+ const SCAN_MAX_BUFFER = 10 * 1024 * 1024;
28
+ function runSearchBinary(bin, args, cwd) {
29
+ const scanTimeoutMs = getBrainConfigNumber('brainScanTimeoutMs', undefined, SCAN_TIMEOUT_MS);
30
+ return new Promise((resolve, reject) => {
31
+ execFile(bin, args, { cwd, timeout: scanTimeoutMs, maxBuffer: SCAN_MAX_BUFFER, env: CHILD_ENV }, (error, stdout, stderr) => {
32
+ const code = error && 'code' in error && typeof error.code === 'number' ? error.code : 0;
33
+ if (error && code !== 1 && code !== 0) {
34
+ if ('killed' in error && error.killed)
35
+ return reject(new Error(`Search timed out after ${scanTimeoutMs}ms`));
36
+ return reject(new Error(`Search binary failed (${bin}): ${String(stderr || error.message)}`));
37
+ }
38
+ resolve(String(stdout ?? ''));
39
+ });
40
+ });
41
+ }
42
+ /**
43
+ * Resolve `target` under `basePath`, refusing `..` and a symlink at ANY segment
44
+ * (each existing segment is `lstat`ed and real-path re-checked).
45
+ * `allowMissingTail` lets a create name a path that does not exist yet.
46
+ *
47
+ * The real path is the OS's own canonical one (`fs/promises` `realpath` is the
48
+ * native call: on Windows the on-disk case and the long name, NTFS stream
49
+ * suffixes dropped). A requested segment whose canonical name differs from it by
50
+ * MORE than letter case — an 8.3 short name (`NEURAL~1`), an NTFS stream
51
+ * (`meta.json::$DATA`, `conversations::$INDEX_ALLOCATION`), another Unicode
52
+ * normalization — is an ALIAS the uri-policy never saw: it is refused exactly
53
+ * like a missing path, and a create never names a stream (`:` is no file-name
54
+ * character on Windows). A letter-case difference passes: the policy folds case
55
+ * itself (`foldPolicyCase`, the one fold both seats use). Linux case-insensitive
56
+ * mounts (drvfs, CIFS, ext4 casefold) answer the requested spelling, so only
57
+ * the policy fold applies there.
58
+ */
59
+ export async function resolveAndGuard(basePath, target, options) {
60
+ const normalizedTarget = path.isAbsolute(target) ? `.${target}` : target;
61
+ const normalizedBase = path.resolve(basePath);
62
+ const rootReal = await fs.realpath(normalizedBase).catch(() => normalizedBase);
63
+ const resolved = path.resolve(normalizedBase, normalizedTarget);
64
+ if (!isPathInside(normalizedBase, resolved)) {
65
+ throw new Error(`Path traversal blocked: "${target}" escapes base "${basePath}"`);
66
+ }
67
+ const segments = path.relative(normalizedBase, resolved).split(path.sep).filter(Boolean);
68
+ let current = rootReal;
69
+ for (let index = 0; index < segments.length; index += 1) {
70
+ const segment = segments[index];
71
+ const candidate = path.join(current, segment);
72
+ let real;
73
+ try {
74
+ const stat = await fs.lstat(candidate);
75
+ if (stat.isSymbolicLink())
76
+ throw new Error(`Symlink traversal blocked: "${target}"`);
77
+ real = await fs.realpath(candidate).catch(() => candidate);
78
+ if (!isPathInside(rootReal, real)) {
79
+ throw new Error(`Path traversal blocked: "${target}" escapes base "${basePath}"`);
80
+ }
81
+ }
82
+ catch (error) {
83
+ if (error.code === 'ENOENT' && options?.allowMissingTail) {
84
+ const tail = segments.slice(index);
85
+ if (process.platform === 'win32' && tail.some((name) => name.includes(':')))
86
+ throw notFound(candidate);
87
+ return path.join(current, ...tail);
88
+ }
89
+ throw error;
90
+ }
91
+ if (foldPolicyCase(path.basename(real)) !== foldPolicyCase(segment))
92
+ throw notFound(candidate);
93
+ current = real;
94
+ }
95
+ return current;
96
+ }
97
+ /** The error `lstat` raises for a missing path — the alias refusal answers with exactly it. */
98
+ function notFound(candidate) {
99
+ return Object.assign(new Error(`ENOENT: no such file or directory, lstat '${candidate}'`), {
100
+ code: 'ENOENT',
101
+ errno: process.platform === 'win32' ? -4058 : -2,
102
+ syscall: 'lstat',
103
+ path: candidate,
104
+ });
105
+ }
106
+ /**
107
+ * Structured failure of `resolveOsUri` inside Docker with no host-pair root:
108
+ * returning a container-internal path would corrupt vector payloads and
109
+ * `os_uri` fields with paths that do not exist on the machine. Callers skip
110
+ * the field (`os_uri: undefined`) instead.
111
+ */
112
+ export class OsUriUnresolvableError extends Error {
113
+ code;
114
+ source;
115
+ uri;
116
+ constructor(params) {
117
+ super(`os_uri unresolvable for "${params.uri}" on source "${params.source}": ` +
118
+ `running in Docker, but the source config has no \`hostRoot\` and no ` +
119
+ `\`NEURALIS_MOUNT_*\` os-mount covers its root` +
120
+ (params.root ? ` ("${params.root}")` : '') +
121
+ `. Refusing to emit container-internal paths into vectors/os_uri. ` +
122
+ `Add the path via \`neuralis mount add\` (which registers the ` +
123
+ `host-pair env); a \`sources.privileged\` caller may set \`hostRoot\` on the source.`);
124
+ this.name = 'OsUriUnresolvableError';
125
+ this.code = 'os_uri_host_pair_missing';
126
+ this.source = params.source;
127
+ this.uri = params.uri;
128
+ }
129
+ }
130
+ /**
131
+ * The host-side root of `resolvedRoot` from the os-mount table: the LONGEST
132
+ * mount whose `containerPath` is the root or a path-boundary-correct ancestor
133
+ * (`/mounts/repo` matches `/mounts/repo/sub`, never `/mounts/repo2`). Mounts
134
+ * without a host pair are skipped; no match ⇒ `undefined` (the caller then
135
+ * fails loud with `OsUriUnresolvableError` in Docker).
136
+ */
137
+ export function deriveHostRootFromOsMounts(resolvedRoot, mounts) {
138
+ const target = path.resolve(resolvedRoot);
139
+ let best;
140
+ for (const mount of mounts) {
141
+ if (!mount.hostPath)
142
+ continue;
143
+ const container = path.resolve(mount.containerPath);
144
+ const isMatch = target === container || target.startsWith(`${container}${path.sep}`);
145
+ if (!isMatch)
146
+ continue;
147
+ if (!best || container.length > best.containerPath.length) {
148
+ const tail = target.slice(container.length);
149
+ best = { containerPath: container, hostRoot: path.join(path.resolve(mount.hostPath), tail) };
150
+ }
151
+ }
152
+ return best?.hostRoot;
153
+ }
154
+ /**
155
+ * The ONE logical root a stored folder may carry instead of a path:
156
+ * `neuralis-tree:<relative path>` — a folder of THIS plane's Neuralis tree
157
+ * (`neuralisTreeRoot`: the `--neuralis` overlay in Docker, the host's own tree
158
+ * natively), so a source attached on one plane opens on the other. `<relative
159
+ * path>` is source-relative (`isPackageFolderPath`: no `..`, never absolute);
160
+ * `neuralis-tree:` alone is the tree itself. Nothing else is a logical root.
161
+ */
162
+ export const NEURALIS_TREE_ANCHOR = 'neuralis-tree:';
163
+ /** The anchored path of a stored root, or `null` when the root is not an anchor; a malformed anchor is `false`. */
164
+ export function treeAnchorPath(configured) {
165
+ if (!configured.startsWith(NEURALIS_TREE_ANCHOR))
166
+ return null;
167
+ const rel = configured.slice(NEURALIS_TREE_ANCHOR.length);
168
+ return rel === '' || isPackageFolderPath(rel) ? rel : false;
169
+ }
170
+ /**
171
+ * A `neuralis-tree:` root this plane cannot open: Docker without the
172
+ * `--neuralis` overlay (the image's own folder is never an attachable zone), or
173
+ * a malformed anchor. The message carries no path.
174
+ */
175
+ export class SourceAnchorUnresolvableError extends Error {
176
+ source;
177
+ code = 'source_anchor_unresolvable';
178
+ constructor(source) {
179
+ super(`source "${source}": its Neuralis-tree root is not available on this server`);
180
+ this.source = source;
181
+ this.name = 'SourceAnchorUnresolvableError';
182
+ }
183
+ }
184
+ /**
185
+ * THE root resolver for an in-process source on THIS plane:
186
+ * - a `neuralis-tree:` anchor resolves into this plane's Neuralis tree, or
187
+ * THROWS `SourceAnchorUnresolvableError` (never a guess, never the image);
188
+ * - a relative `configured` joins onto the plane's own `projectRoot`;
189
+ * - an absolute one is the path as written in a container;
190
+ * - natively it is the absolute `hostRoot` beside it when there is one (the
191
+ * pair's machine half, `domain/sourceRootPair.ts`), else the path as written.
192
+ * An absolute path is never re-targeted by a segment that spells the project id.
193
+ */
194
+ export function resolveLocalRoot(params) {
195
+ const { configured, hostRoot, projectRoot, isDocker } = params;
196
+ const anchored = treeAnchorPath(configured);
197
+ if (anchored !== null) {
198
+ const tree = anchored === false ? null : neuralisTreeRoot({
199
+ isDocker,
200
+ osMounts: discoverOsMounts(process.env),
201
+ neuralisTree: hostTreeRoot(process.cwd()),
202
+ });
203
+ if (tree === null)
204
+ throw new SourceAnchorUnresolvableError(params.source);
205
+ return { resolvedRoot: path.resolve(tree, anchored) };
206
+ }
207
+ if (!path.isAbsolute(configured)) {
208
+ return { resolvedRoot: projectRoot ? path.join(projectRoot, configured) : configured };
209
+ }
210
+ if (!isDocker && typeof hostRoot === 'string' && path.isAbsolute(hostRoot)) {
211
+ return { resolvedRoot: path.resolve(hostRoot) };
212
+ }
213
+ return { resolvedRoot: path.resolve(configured) };
214
+ }
215
+ /**
216
+ * `resolveLocalRoot` for a LISTING: an anchored root this plane cannot open is
217
+ * `null` (the row is skipped or shown unreachable), so one such source never
218
+ * breaks the listing of every other.
219
+ */
220
+ export function resolvedLocalRootOrNull(params) {
221
+ try {
222
+ return resolveLocalRoot(params).resolvedRoot;
223
+ }
224
+ catch (error) {
225
+ if (error instanceof SourceAnchorUnresolvableError)
226
+ return null;
227
+ throw error;
228
+ }
229
+ }
230
+ /** The largest range one local `readRange` serves (the connector loops above it). */
231
+ const LOCAL_MAX_RANGE_BYTES = 64 * 1024 * 1024;
232
+ /** The in-process transport over one source root. */
233
+ export class InProcessTransport {
234
+ kind = 'local';
235
+ flavour = (path.sep === '\\' ? 'win32' : 'posix');
236
+ id = 'local';
237
+ maxRangeBytes = LOCAL_MAX_RANGE_BYTES;
238
+ #root;
239
+ constructor(root) {
240
+ this.#root = path.resolve(root);
241
+ }
242
+ get root() {
243
+ return this.#root;
244
+ }
245
+ /** The clamp: `abs` must name a path under the root, symlink-free. */
246
+ #guard(abs, allowMissingTail = false) {
247
+ const rel = path.relative(this.#root, path.resolve(abs));
248
+ return resolveAndGuard(this.#root, rel === '' ? '.' : rel, allowMissingTail ? { allowMissingTail } : undefined);
249
+ }
250
+ available() {
251
+ return true;
252
+ }
253
+ async probe() {
254
+ try {
255
+ await fs.access(this.#root, fsConstants.R_OK);
256
+ return { connected: true };
257
+ }
258
+ catch (error) {
259
+ const code = error.code;
260
+ return { connected: false, reason: code === 'ENOENT' ? 'fs_unreachable' : 'fs_permission' };
261
+ }
262
+ }
263
+ async localPath(abs) {
264
+ return this.#guard(abs);
265
+ }
266
+ async list(abs) {
267
+ const dir = await this.#guard(abs);
268
+ const dirents = await fs.readdir(dir, { withFileTypes: true });
269
+ const out = [];
270
+ for (const entry of dirents) {
271
+ if (entry.isSymbolicLink())
272
+ continue;
273
+ const isDirectory = entry.isDirectory();
274
+ let size;
275
+ let modifiedAt;
276
+ if (!isDirectory) {
277
+ try {
278
+ const st = await fs.stat(path.join(dir, entry.name));
279
+ size = st.size;
280
+ modifiedAt = st.mtime.toISOString();
281
+ }
282
+ catch { /* one unreadable entry never fails the listing */ }
283
+ }
284
+ out.push({ name: entry.name, isDirectory, ...(size === undefined ? {} : { size }), ...(modifiedAt ? { modifiedAt } : {}) });
285
+ }
286
+ return out;
287
+ }
288
+ async stat(abs) {
289
+ let target;
290
+ try {
291
+ target = await this.#guard(abs);
292
+ }
293
+ catch (error) {
294
+ if (error?.code === 'ENOENT')
295
+ return null;
296
+ throw error;
297
+ }
298
+ try {
299
+ const info = await fs.lstat(target);
300
+ return { isDirectory: info.isDirectory(), size: info.size, modifiedAt: info.mtime.toISOString() };
301
+ }
302
+ catch (error) {
303
+ if (error?.code === 'ENOENT')
304
+ return null;
305
+ throw error;
306
+ }
307
+ }
308
+ async readRange(abs, offset, length) {
309
+ return readFileRange(await this.#guard(abs), offset, Math.min(length, LOCAL_MAX_RANGE_BYTES));
310
+ }
311
+ async write(abs, bytes) {
312
+ const target = await this.#guard(abs, true);
313
+ await fs.mkdir(path.dirname(target), { recursive: true });
314
+ await fs.writeFile(target, bytes);
315
+ }
316
+ async delete(abs) {
317
+ await fs.unlink(await this.#guard(abs));
318
+ }
319
+ async move(from, to) {
320
+ const source = await this.#guard(from);
321
+ const target = await this.#guard(to, true);
322
+ await fs.mkdir(path.dirname(target), { recursive: true });
323
+ await fs.rename(source, target);
324
+ }
325
+ async mkdir(abs) {
326
+ await fs.mkdir(await this.#guard(abs, true), { recursive: true });
327
+ }
328
+ async rmdir(abs) {
329
+ // Empty-directory removal only: a populated one throws ENOTEMPTY (the
330
+ // folder-delete usecase unlinks every contained file first).
331
+ await fs.rmdir(await this.#guard(abs));
332
+ }
333
+ async walk(abs, opts) {
334
+ return walkTree(await this.#guard(abs), opts);
335
+ }
336
+ async scanDelta(abs, opts) {
337
+ return scanDeltaTree(await this.#guard(abs), opts);
338
+ }
339
+ async count(abs, opts) {
340
+ return countTree(await this.#guard(abs), opts);
341
+ }
342
+ /**
343
+ * The server's content scan: a real search binary (`git grep` inside a
344
+ * checkout, else `rg`, else `grep`), LITERAL (`-F`) on every engine; the JS
345
+ * engine only when no binary exists. Paths come back walk-root-relative.
346
+ */
347
+ async scanContent(abs, query, opts) {
348
+ const root = await this.#guard(abs);
349
+ const bins = await resolveSearchBinaries();
350
+ const caseSensitive = opts.caseSensitive === true;
351
+ let hasGit = false;
352
+ try {
353
+ hasGit = (await fs.stat(path.join(root, '.git'))).isDirectory();
354
+ }
355
+ catch { /* not a checkout */ }
356
+ if (hasGit && bins.gitGrep) {
357
+ const args = ['grep', '-n', '--column', '--no-color', '-F'];
358
+ if (!caseSensitive)
359
+ args.push('-i');
360
+ args.push('-e', query, '--');
361
+ // Pathspecs are case-SENSITIVE by default (`:(icase)` restores -i parity)
362
+ // and a plain `*` crosses `/` — best-effort parity with rg's globs.
363
+ for (const pat of opts.includeGlobs ?? [])
364
+ args.push(caseSensitive ? pat : `:(icase)${pat}`);
365
+ for (const pat of opts.excludeGlobs ?? [])
366
+ args.push(`:(exclude)${pat}`);
367
+ return parseGrepOutput(root, await runSearchBinary(bins.gitGrep, args, root), opts.maxMatches);
368
+ }
369
+ if (bins.rg) {
370
+ const args = ['-n', '--column', '--no-heading', '--color=never', '-F'];
371
+ if (!caseSensitive)
372
+ args.push('-i');
373
+ for (const pat of opts.includeGlobs ?? [])
374
+ args.push('--glob', pat);
375
+ for (const pat of opts.excludeGlobs ?? [])
376
+ args.push('--glob', `!${pat}`);
377
+ args.push('-e', query, root);
378
+ return parseGrepOutput(root, await runSearchBinary(bins.rg, args, root), opts.maxMatches);
379
+ }
380
+ if (bins.grep) {
381
+ const args = ['-R', '-n', '--color=never', '-F'];
382
+ if (!caseSensitive)
383
+ args.push('-i');
384
+ // GNU grep `--include` matches the BASENAME only — best-effort.
385
+ for (const pat of opts.includeGlobs ?? [])
386
+ args.push(`--include=${pat}`);
387
+ for (const pat of opts.excludeGlobs ?? [])
388
+ args.push('--exclude-dir', pat.replace(/\/\*\*$/, '').replace(/^\*\*\//, ''));
389
+ args.push('-e', query, root);
390
+ return parseGrepOutput(root, await runSearchBinary(bins.grep, args, root), opts.maxMatches);
391
+ }
392
+ return scanContentTree(root, query, opts);
393
+ }
394
+ watch(abs, listener, opts) {
395
+ const watchRoot = path.resolve(abs);
396
+ if (watchRoot !== this.#root && !watchRoot.startsWith(`${this.#root}${path.sep}`)) {
397
+ throw new Error('watch root escapes the source root');
398
+ }
399
+ // The exclude set is pushed down to the watcher as globs relative to the
400
+ // WATCHED path (the device broker reads them alike) and compiled by the
401
+ // kernel's ONE predicate in the hub's worker: excluded trees are never entered.
402
+ const handle = getFsWatchHub().acquire(watchRoot, (events) => {
403
+ // One ordered batch, unrolled in order.
404
+ for (const event of events) {
405
+ if (event.kind === 'overflow') {
406
+ listener({ kind: 'overflow', at: event.at, ...(event.reason ? { reason: event.reason } : {}), ...(event.code ? { code: event.code } : {}) });
407
+ }
408
+ else {
409
+ listener({ kind: event.kind, path: event.absPath, at: event.at, ...(event.entry ? { entry: event.entry } : {}) });
410
+ }
411
+ }
412
+ }, {
413
+ ...(opts?.excludeGlobs?.length ? { excludeGlobs: opts.excludeGlobs } : {}),
414
+ ...(opts?.maxFolders !== undefined ? { maxFolders: opts.maxFolders } : {}),
415
+ // Per listener: the hub shares one watcher per (root, exclude set) and
416
+ // keeps the conservative maximum of every live listener's policy.
417
+ recovery: resolveWatchRecovery(),
418
+ });
419
+ return {
420
+ unsubscribe: () => { void handle.release(); },
421
+ watchState: () => handle.state(),
422
+ };
423
+ }
424
+ }
425
+ /** `path:line[:col]:preview` lines → walk-root-relative matches. Relative output is resolved against `root`. */
426
+ function parseGrepOutput(root, output, maxMatches) {
427
+ const results = [];
428
+ for (const line of output.split('\n')) {
429
+ if (results.length >= maxMatches)
430
+ break;
431
+ if (!line)
432
+ continue;
433
+ const m = /^(.+?):(\d+)(?::(\d+))?:(.*)$/.exec(line);
434
+ if (!m)
435
+ continue;
436
+ const abs = path.resolve(root, m[1]);
437
+ const col = m[3] ? Number.parseInt(m[3], 10) : undefined;
438
+ results.push({
439
+ rel: isPathInside(root, abs) ? path.relative(root, abs).split(path.sep).join('/') : '',
440
+ line: Number.parseInt(m[2], 10),
441
+ ...(col !== undefined && Number.isFinite(col) ? { column: col } : {}),
442
+ preview: m[4],
443
+ });
444
+ }
445
+ return results;
446
+ }
447
+ //# sourceMappingURL=inProcessTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inProcessTransport.js","sourceRoot":"","sources":["../../../src/connectors/inProcessTransport.ts"],"names":[],"mappings":"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"}
@@ -18,4 +18,33 @@ import type { SourceConfig, SourcePermissions } from '../sourceConfig.js';
18
18
  * `$creator` stays the SOURCE's `createdBy` — never the resource creator.
19
19
  */
20
20
  export declare function resolveCallerPermissions(config: SourceConfig, uri: string, ctx: ExecutionContext, source: string): Promise<SourcePermissions>;
21
+ /**
22
+ * The LITERAL heads of the path rules that certainly GRANT the caller `read` on
23
+ * `config` — each a normalized directory uri ending in `/` (`x://a/sec/` for
24
+ * `x://a/sec/**`; the bare `x://` for a pattern whose first segment is a glob).
25
+ * The head is the pattern's segments before the first one holding `*` or `?`,
26
+ * after token resolution; it is what the rule itself SPELLS, so naming it
27
+ * discloses nothing the grant does not already state.
28
+ *
29
+ * "Certainly" is the kernel's own subtree classifier over that one rule alone
30
+ * (every bit false, the rule re-pointed at `<head>**`): only a rule that turns
31
+ * `read` on for the WHOLE head, for THIS caller, counts — a role/user/priority
32
+ * miss, a non-override allow (it cannot lift a `false`) and an undecidable
33
+ * `$owner` row all read `false`. A floor row never grants. A head the full
34
+ * config denies uniformly (a floor over it) is dropped too.
35
+ *
36
+ * Consumers: source admission and the list-only ancestor reveal. Absent `role`
37
+ * ⇒ no heads (the weakest interpretation).
38
+ */
39
+ export declare function callerReadGrantHeads(config: SourceConfig, ctx: ExecutionContext): string[];
40
+ /**
41
+ * The folder uris a caller's grant heads put on its way: every head and every
42
+ * strict ancestor of it, as normalized directory uris (`x://a/`, `x://a/sec/`),
43
+ * never the source root. A LIST may name these folders (names only) and be
44
+ * scoped into them; nothing else — search, discovery and the git listings —
45
+ * reads this set.
46
+ */
47
+ export declare function grantPathFolders(heads: readonly string[]): Set<string>;
48
+ /** A uri as the directory key {@link grantPathFolders} holds: normalized, ending in `/`. */
49
+ export declare function folderKey(uri: string): string;
21
50
  //# sourceMappingURL=callerPermissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"callerPermissions.d.ts","sourceRoot":"","sources":["../../../../src/domain/access/callerPermissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAY5B"}
1
+ {"version":3,"file":"callerPermissions.d.ts","sourceRoot":"","sources":["../../../../src/domain/access/callerPermissions.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAO5B;AAgBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAAE,CA2B1F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAStE;AAED,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7C"}
@@ -1,4 +1,4 @@
1
- import { resolveResourceOwner } from '@neuralis/package-system/policies';
1
+ import { classifyUriSubtree, normalizePolicyUri, resolvePolicyPatternTokens, resolveResourceOwner, } from '@neuralis/package-system/policies';
2
2
  import { resolvePermissions } from '../permissionResolver.js';
3
3
  /**
4
4
  * The caller's EFFECTIVE per-path permission on `uri` — the ONE place a
@@ -20,14 +20,94 @@ import { resolvePermissions } from '../permissionResolver.js';
20
20
  export async function resolveCallerPermissions(config, uri, ctx, source) {
21
21
  const resourceOwnerUserId = await resolveResourceOwner({ projectId: ctx.projectId, uri });
22
22
  return resolvePermissions(config.permissions, uri, {
23
+ ...callerPolicyContext(config, ctx, ctx.role ?? 'member'),
24
+ source,
25
+ ...(resourceOwnerUserId ? { resourceOwnerUserId } : {}),
26
+ });
27
+ }
28
+ function callerPolicyContext(config, ctx, role) {
29
+ return {
23
30
  userId: ctx.userId,
24
- role: ctx.role ?? 'member',
31
+ role,
25
32
  priority: ctx.priority,
26
33
  rolePriorities: ctx.rolePriorities,
27
34
  agentId: ctx.agentId,
28
35
  creatorUserId: config.createdBy,
29
- source,
30
- ...(resourceOwnerUserId ? { resourceOwnerUserId } : {}),
31
- });
36
+ source: config.source,
37
+ };
38
+ }
39
+ const NO_BITS = { read: false, write: false, exec: false };
40
+ /**
41
+ * The LITERAL heads of the path rules that certainly GRANT the caller `read` on
42
+ * `config` — each a normalized directory uri ending in `/` (`x://a/sec/` for
43
+ * `x://a/sec/**`; the bare `x://` for a pattern whose first segment is a glob).
44
+ * The head is the pattern's segments before the first one holding `*` or `?`,
45
+ * after token resolution; it is what the rule itself SPELLS, so naming it
46
+ * discloses nothing the grant does not already state.
47
+ *
48
+ * "Certainly" is the kernel's own subtree classifier over that one rule alone
49
+ * (every bit false, the rule re-pointed at `<head>**`): only a rule that turns
50
+ * `read` on for the WHOLE head, for THIS caller, counts — a role/user/priority
51
+ * miss, a non-override allow (it cannot lift a `false`) and an undecidable
52
+ * `$owner` row all read `false`. A floor row never grants. A head the full
53
+ * config denies uniformly (a floor over it) is dropped too.
54
+ *
55
+ * Consumers: source admission and the list-only ancestor reveal. Absent `role`
56
+ * ⇒ no heads (the weakest interpretation).
57
+ */
58
+ export function callerReadGrantHeads(config, ctx) {
59
+ if (!ctx.role)
60
+ return [];
61
+ const policyCtx = callerPolicyContext(config, ctx, ctx.role);
62
+ const root = `${config.source}://`;
63
+ const heads = [];
64
+ for (const rule of config.permissions.paths ?? []) {
65
+ if (rule.floor === true || rule.permissions.read !== true)
66
+ continue;
67
+ const pattern = resolvePolicyPatternTokens(rule.pattern, policyCtx);
68
+ if (pattern === null)
69
+ continue;
70
+ const normalized = normalizePolicyUri(pattern);
71
+ if (!normalized.startsWith(root))
72
+ continue;
73
+ const literal = [];
74
+ for (const segment of normalized.slice(root.length).split('/')) {
75
+ if (segment === '' || /[*?]/.test(segment))
76
+ break;
77
+ literal.push(segment);
78
+ }
79
+ const head = `${root}${literal.map((s) => `${s}/`).join('')}`;
80
+ const alone = classifyUriSubtree({ default: { ...NO_BITS }, paths: [{ ...rule, pattern: `${head}**` }] }, head, policyCtx, { capabilities: ['read'] });
81
+ if (alone.kind !== 'uniform' || alone.permissions.read !== true)
82
+ continue;
83
+ const whole = classifyUriSubtree(config.permissions, head, policyCtx, { capabilities: ['read'] });
84
+ if (whole.kind === 'uniform' && whole.permissions.read === false)
85
+ continue;
86
+ if (!heads.includes(head))
87
+ heads.push(head);
88
+ }
89
+ return heads;
90
+ }
91
+ /**
92
+ * The folder uris a caller's grant heads put on its way: every head and every
93
+ * strict ancestor of it, as normalized directory uris (`x://a/`, `x://a/sec/`),
94
+ * never the source root. A LIST may name these folders (names only) and be
95
+ * scoped into them; nothing else — search, discovery and the git listings —
96
+ * reads this set.
97
+ */
98
+ export function grantPathFolders(heads) {
99
+ const folders = new Set();
100
+ for (const head of heads) {
101
+ const sep = head.indexOf('://') + 3;
102
+ for (let at = head.indexOf('/', sep); at !== -1; at = head.indexOf('/', at + 1)) {
103
+ folders.add(head.slice(0, at + 1));
104
+ }
105
+ }
106
+ return folders;
107
+ }
108
+ /** A uri as the directory key {@link grantPathFolders} holds: normalized, ending in `/`. */
109
+ export function folderKey(uri) {
110
+ const normalized = normalizePolicyUri(uri);
111
+ return normalized.endsWith('/') ? normalized : `${normalized}/`;
32
112
  }
33
113
  //# sourceMappingURL=callerPermissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"callerPermissions.js","sourceRoot":"","sources":["../../../../src/domain/access/callerPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAoB,EACpB,GAAW,EACX,GAAqB,EACrB,MAAc;IAEd,MAAM,mBAAmB,GAAG,MAAM,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1F,OAAO,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,aAAa,EAAE,MAAM,CAAC,SAAS;QAC/B,MAAM;QACN,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"callerPermissions.js","sourceRoot":"","sources":["../../../../src/domain/access/callerPermissions.ts"],"names":[],"mappings":"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"}