attention-manifest-protocol 0.4.2 → 0.4.3

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 (827) hide show
  1. package/CHANGELOG.md +341 -293
  2. package/CHANGELOG.zh-CN.md +41 -8
  3. package/README.md +250 -171
  4. package/README.zh-CN.md +251 -171
  5. package/lib/assignment/assign.d.ts +102 -0
  6. package/lib/assignment/assign.js +556 -0
  7. package/lib/assignment/binding.d.ts +103 -0
  8. package/lib/assignment/binding.js +575 -0
  9. package/lib/assignment/errors.d.ts +14 -0
  10. package/lib/assignment/errors.js +16 -0
  11. package/lib/assignment/guards.d.ts +18 -0
  12. package/lib/assignment/guards.js +28 -0
  13. package/lib/assignment/index.d.ts +10 -0
  14. package/lib/assignment/index.js +10 -0
  15. package/lib/assignment/types.d.ts +169 -0
  16. package/lib/assignment/types.js +1 -0
  17. package/lib/attention/budget.d.ts +1 -1
  18. package/lib/attention/budget.js +31 -9
  19. package/lib/bayes/engine.js +2 -1
  20. package/lib/bayes/reliability.js +25 -10
  21. package/lib/boundary/frame.d.ts +10 -4
  22. package/lib/boundary/frame.js +346 -109
  23. package/lib/boundary/kinds.d.ts +11 -0
  24. package/lib/boundary/kinds.js +33 -0
  25. package/lib/boundary/refTable.d.ts +19 -9
  26. package/lib/boundary/refTable.js +128 -30
  27. package/lib/boundary/toolCall.d.ts +22 -10
  28. package/lib/boundary/toolCall.js +798 -97
  29. package/lib/concept/conceptBudget.js +10 -1
  30. package/lib/concurrency/idempotency.d.ts +4 -3
  31. package/lib/concurrency/idempotency.js +57 -13
  32. package/lib/concurrency/retry.js +18 -3
  33. package/lib/context/agentContext.d.ts +13 -0
  34. package/lib/context/agentContext.js +14 -1
  35. package/lib/context/ast.d.ts +4 -1
  36. package/lib/context/ast.js +13 -3
  37. package/lib/context/contentStore.js +22 -9
  38. package/lib/context/contextBuilder.d.ts +457 -0
  39. package/lib/context/contextBuilder.js +1395 -0
  40. package/lib/context/contextPackage.d.ts +214 -0
  41. package/lib/context/contextPackage.js +191 -0
  42. package/lib/context/index.d.ts +14 -3
  43. package/lib/context/index.js +9 -1
  44. package/lib/context/relevance.d.ts +171 -0
  45. package/lib/context/relevance.js +250 -0
  46. package/lib/context/workspaceDiff.d.ts +105 -0
  47. package/lib/context/workspaceDiff.js +238 -0
  48. package/lib/context/workspaceService.d.ts +236 -1
  49. package/lib/context/workspaceService.js +1501 -73
  50. package/lib/cooperation/collaboration.d.ts +9 -0
  51. package/lib/cooperation/session.d.ts +4 -4
  52. package/lib/cooperation/session.js +3 -3
  53. package/lib/database/adapter/filesystemStore.d.ts +145 -0
  54. package/lib/database/adapter/filesystemStore.js +321 -0
  55. package/lib/database/adapter/index.d.ts +2 -0
  56. package/lib/database/adapter/index.js +2 -0
  57. package/lib/database/adapter/workspaceSessionStore.d.ts +118 -0
  58. package/lib/database/adapter/workspaceSessionStore.js +120 -0
  59. package/lib/database/entity/fileGraph.d.ts +53 -0
  60. package/lib/database/entity/fileGraph.js +15 -0
  61. package/lib/database/entity/fileTree.d.ts +76 -0
  62. package/lib/database/entity/fileTree.js +39 -0
  63. package/lib/database/entity/hook.d.ts +29 -0
  64. package/lib/database/entity/hook.js +18 -0
  65. package/lib/database/entity/index.d.ts +4 -0
  66. package/lib/database/entity/index.js +4 -0
  67. package/lib/database/entity/workspaceSession.d.ts +53 -0
  68. package/lib/database/entity/workspaceSession.js +28 -0
  69. package/lib/database/repository/fileAnnotationRepository.d.ts +75 -0
  70. package/lib/database/repository/fileAnnotationRepository.js +109 -0
  71. package/lib/database/repository/fileGraphRepository.d.ts +188 -0
  72. package/lib/database/repository/fileGraphRepository.js +648 -0
  73. package/lib/database/repository/fileNodeRepository.d.ts +116 -0
  74. package/lib/database/repository/fileNodeRepository.js +263 -0
  75. package/lib/database/repository/fileOutlineRepository.d.ts +40 -0
  76. package/lib/database/repository/fileOutlineRepository.js +104 -0
  77. package/lib/database/repository/fileWriteRepository.d.ts +41 -0
  78. package/lib/database/repository/fileWriteRepository.js +93 -0
  79. package/lib/database/repository/hookRepository.d.ts +67 -0
  80. package/lib/database/repository/hookRepository.js +150 -0
  81. package/lib/database/repository/index.d.ts +7 -0
  82. package/lib/database/repository/index.js +7 -0
  83. package/lib/database/repository/workspaceSessionRepository.d.ts +134 -0
  84. package/lib/database/repository/workspaceSessionRepository.js +327 -0
  85. package/lib/database/service/database.d.ts +14 -0
  86. package/lib/database/service/database.js +21 -0
  87. package/lib/database/sql/schema.js +187 -0
  88. package/lib/database/store/database.js +6 -1
  89. package/lib/delegate/team.d.ts +5 -0
  90. package/lib/delegate/team.js +83 -20
  91. package/lib/discover/classify.d.ts +20 -0
  92. package/lib/discover/classify.js +85 -0
  93. package/lib/discover/host.d.ts +20 -0
  94. package/lib/discover/host.js +89 -0
  95. package/lib/discover/index.d.ts +11 -0
  96. package/lib/discover/index.js +11 -0
  97. package/lib/discover/kinds.d.ts +14 -0
  98. package/lib/discover/kinds.js +23 -0
  99. package/lib/discover/tree.d.ts +7 -0
  100. package/lib/discover/tree.js +432 -0
  101. package/lib/discover/types.d.ts +115 -0
  102. package/lib/discover/types.js +1 -0
  103. package/lib/error/boundaryRejection.d.ts +1 -1
  104. package/lib/evaluation/agreement.js +2 -2
  105. package/lib/execution/handles.js +6 -0
  106. package/lib/execution/pin.js +2 -2
  107. package/lib/file/cfb.d.ts +56 -0
  108. package/lib/file/cfb.js +396 -0
  109. package/lib/file/dependency.d.ts +151 -0
  110. package/lib/file/dependency.js +568 -0
  111. package/lib/file/directory.d.ts +34 -0
  112. package/lib/file/directory.js +141 -0
  113. package/lib/file/errors.d.ts +20 -0
  114. package/lib/file/errors.js +18 -0
  115. package/lib/file/exportGraph.d.ts +31 -0
  116. package/lib/file/exportGraph.js +554 -0
  117. package/lib/file/file.d.ts +40 -0
  118. package/lib/file/file.js +339 -0
  119. package/lib/file/importGraph.d.ts +121 -0
  120. package/lib/file/importGraph.js +1022 -0
  121. package/lib/file/index.d.ts +45 -0
  122. package/lib/file/index.js +30 -0
  123. package/lib/file/metadata.d.ts +66 -0
  124. package/lib/file/metadata.js +470 -0
  125. package/lib/file/path.d.ts +60 -0
  126. package/lib/file/path.js +259 -0
  127. package/lib/file/read.d.ts +168 -0
  128. package/lib/file/read.js +541 -0
  129. package/lib/file/runtime.d.ts +95 -0
  130. package/lib/file/runtime.js +150 -0
  131. package/lib/file/service.d.ts +227 -0
  132. package/lib/file/service.js +663 -0
  133. package/lib/file/syntaxTree.d.ts +7 -0
  134. package/lib/file/syntaxTree.js +38 -0
  135. package/lib/file/time.d.ts +38 -0
  136. package/lib/file/time.js +44 -0
  137. package/lib/file/tree.d.ts +53 -0
  138. package/lib/file/tree.js +417 -0
  139. package/lib/file/types.d.ts +371 -0
  140. package/lib/file/types.js +1 -0
  141. package/lib/file/write.d.ts +159 -0
  142. package/lib/file/write.js +1028 -0
  143. package/lib/file/zip.d.ts +35 -0
  144. package/lib/file/zip.js +349 -0
  145. package/lib/fingerprint/algorithm.d.ts +97 -0
  146. package/lib/fingerprint/algorithm.js +271 -0
  147. package/lib/fingerprint/bytes.d.ts +18 -0
  148. package/lib/fingerprint/bytes.js +31 -0
  149. package/lib/fingerprint/error.d.ts +73 -0
  150. package/lib/fingerprint/error.js +86 -0
  151. package/lib/fingerprint/file.d.ts +71 -0
  152. package/lib/fingerprint/file.js +254 -0
  153. package/lib/fingerprint/index.d.ts +37 -0
  154. package/lib/fingerprint/index.js +12 -0
  155. package/lib/fingerprint/json.d.ts +41 -0
  156. package/lib/fingerprint/json.js +94 -0
  157. package/lib/fingerprint/number.d.ts +32 -0
  158. package/lib/fingerprint/number.js +95 -0
  159. package/lib/fingerprint/policy.d.ts +54 -0
  160. package/lib/fingerprint/policy.js +50 -0
  161. package/lib/fingerprint/preimage.d.ts +84 -0
  162. package/lib/fingerprint/preimage.js +133 -0
  163. package/lib/fingerprint/raw.d.ts +26 -0
  164. package/lib/fingerprint/raw.js +45 -0
  165. package/lib/fingerprint/ref.d.ts +39 -0
  166. package/lib/fingerprint/ref.js +178 -0
  167. package/lib/fingerprint/text.d.ts +42 -0
  168. package/lib/fingerprint/text.js +155 -0
  169. package/lib/fingerprint/tree.d.ts +56 -0
  170. package/lib/fingerprint/tree.js +288 -0
  171. package/lib/fingerprint/verify.d.ts +20 -0
  172. package/lib/fingerprint/verify.js +99 -0
  173. package/lib/global/filesystem.d.ts +43 -0
  174. package/lib/global/filesystem.js +75 -0
  175. package/lib/global/index.d.ts +8 -0
  176. package/lib/global/index.js +8 -0
  177. package/lib/global/service.d.ts +51 -0
  178. package/lib/global/service.js +98 -0
  179. package/lib/governance/transport.js +18 -6
  180. package/lib/hook/ast.d.ts +29 -0
  181. package/lib/hook/ast.js +22 -0
  182. package/lib/hook/code.d.ts +55 -0
  183. package/lib/hook/code.js +47 -0
  184. package/lib/hook/dependency.d.ts +45 -0
  185. package/lib/hook/dependency.js +28 -0
  186. package/lib/hook/diff.d.ts +114 -0
  187. package/lib/hook/diff.js +327 -0
  188. package/lib/hook/exportation.d.ts +31 -0
  189. package/lib/hook/exportation.js +24 -0
  190. package/lib/hook/file.d.ts +44 -0
  191. package/lib/hook/file.js +154 -0
  192. package/lib/hook/importation.d.ts +33 -0
  193. package/lib/hook/importation.js +22 -0
  194. package/lib/hook/index.d.ts +30 -0
  195. package/lib/hook/index.js +23 -0
  196. package/lib/hook/outline.d.ts +35 -0
  197. package/lib/hook/outline.js +27 -0
  198. package/lib/hook/project.d.ts +65 -0
  199. package/lib/hook/project.js +217 -0
  200. package/lib/hook/types.d.ts +114 -0
  201. package/lib/hook/types.js +407 -0
  202. package/lib/index.d.ts +9 -0
  203. package/lib/index.js +9 -0
  204. package/lib/lock/lease.js +28 -3
  205. package/lib/manifest/cardSign.d.ts +1 -1
  206. package/lib/manifest/cardSign.js +37 -7
  207. package/lib/manifest/federation.js +13 -6
  208. package/lib/manifest/trust.d.ts +2 -0
  209. package/lib/manifest/trust.js +27 -6
  210. package/lib/module/index.d.ts +4 -0
  211. package/lib/module/index.js +4 -0
  212. package/lib/module/mcp/client.js +21 -2
  213. package/lib/module/mcp/filesystemServer.d.ts +24 -0
  214. package/lib/module/mcp/filesystemServer.js +102 -0
  215. package/lib/module/mcp/http.js +32 -19
  216. package/lib/module/mcp/workspaceServer.js +20 -3
  217. package/lib/module/tool/filesystemExecutor.d.ts +18 -0
  218. package/lib/module/tool/filesystemExecutor.js +49 -0
  219. package/lib/module/tool/globalExecutor.d.ts +17 -0
  220. package/lib/module/tool/globalExecutor.js +39 -0
  221. package/lib/module/tool/globalFilesystemExecutor.d.ts +18 -0
  222. package/lib/module/tool/globalFilesystemExecutor.js +49 -0
  223. package/lib/module/tool/workspaceExecutor.d.ts +9 -0
  224. package/lib/module/tool/workspaceExecutor.js +16 -3
  225. package/lib/naming/aliases.d.ts +48 -0
  226. package/lib/naming/aliases.js +79 -0
  227. package/lib/naming/catalog.d.ts +117 -0
  228. package/lib/naming/catalog.js +108 -0
  229. package/lib/naming/grammar.d.ts +67 -0
  230. package/lib/naming/grammar.js +212 -0
  231. package/lib/naming/ids.d.ts +157 -0
  232. package/lib/naming/ids.js +119 -0
  233. package/lib/naming/index.d.ts +13 -0
  234. package/lib/naming/index.js +13 -0
  235. package/lib/outline/index.d.ts +9 -0
  236. package/lib/outline/index.js +8 -0
  237. package/lib/outline/office.d.ts +160 -0
  238. package/lib/outline/office.js +2375 -0
  239. package/lib/outline/officeBridge.d.ts +32 -0
  240. package/lib/outline/officeBridge.js +27 -0
  241. package/lib/outline/outline.d.ts +159 -0
  242. package/lib/outline/outline.js +837 -0
  243. package/lib/outline/outlineIndex.d.ts +97 -0
  244. package/lib/outline/outlineIndex.js +325 -0
  245. package/lib/outline/outlineKeywords.d.ts +59 -0
  246. package/lib/outline/outlineKeywords.js +143 -0
  247. package/lib/outline/outlineStrategies.d.ts +414 -0
  248. package/lib/outline/outlineStrategies.js +8324 -0
  249. package/lib/outline/reactOutline.d.ts +37 -0
  250. package/lib/outline/reactOutline.js +1070 -0
  251. package/lib/outline/shellOutline.d.ts +65 -0
  252. package/lib/outline/shellOutline.js +873 -0
  253. package/lib/outline/sqlOutline.d.ts +170 -0
  254. package/lib/outline/sqlOutline.js +1536 -0
  255. package/lib/outline/strategy.d.ts +46 -0
  256. package/lib/outline/strategy.js +1 -0
  257. package/lib/outline/types.d.ts +95 -0
  258. package/lib/outline/types.js +1 -0
  259. package/lib/outline/visualBasicOutline.d.ts +27 -0
  260. package/lib/outline/visualBasicOutline.js +750 -0
  261. package/lib/protocol/filesystem.d.ts +55 -0
  262. package/lib/protocol/filesystem.js +105 -0
  263. package/lib/protocol/global.d.ts +42 -0
  264. package/lib/protocol/global.js +63 -0
  265. package/lib/protocol/globalFilesystem.d.ts +40 -0
  266. package/lib/protocol/globalFilesystem.js +59 -0
  267. package/lib/protocol/index.d.ts +4 -0
  268. package/lib/protocol/index.js +4 -0
  269. package/lib/protocol/protocol.d.ts +4 -0
  270. package/lib/protocol/wire.js +5 -2
  271. package/lib/protocol/workspace.d.ts +305 -0
  272. package/lib/protocol/workspace.js +258 -0
  273. package/lib/receipt/receipt.d.ts +8 -0
  274. package/lib/registry/content.js +9 -3
  275. package/lib/runtime/kernelRuntime.js +9 -1
  276. package/lib/scenario/scenario.js +5 -4
  277. package/lib/semantic/canonical.d.ts +61 -0
  278. package/lib/semantic/canonical.js +135 -8
  279. package/lib/semantic/jsonValue.d.ts +31 -0
  280. package/lib/semantic/jsonValue.js +122 -0
  281. package/lib/semantic/sha256.js +3 -0
  282. package/lib/semantic/time.d.ts +14 -0
  283. package/lib/semantic/time.js +56 -0
  284. package/lib/session/context.d.ts +76 -0
  285. package/lib/session/context.js +419 -0
  286. package/lib/session/errors.d.ts +24 -0
  287. package/lib/session/errors.js +22 -0
  288. package/lib/session/identity.d.ts +24 -0
  289. package/lib/session/identity.js +56 -0
  290. package/lib/session/index.d.ts +14 -0
  291. package/lib/session/index.js +12 -0
  292. package/lib/session/registry.d.ts +130 -0
  293. package/lib/session/registry.js +908 -0
  294. package/lib/session/types.d.ts +227 -0
  295. package/lib/session/types.js +14 -0
  296. package/lib/structure/index.d.ts +1 -0
  297. package/lib/structure/index.js +1 -0
  298. package/lib/structure/trie.d.ts +88 -0
  299. package/lib/structure/trie.js +183 -0
  300. package/lib/syntax/byteIndex.d.ts +44 -0
  301. package/lib/syntax/byteIndex.js +148 -0
  302. package/lib/syntax/charset.d.ts +88 -0
  303. package/lib/syntax/charset.js +276 -0
  304. package/lib/syntax/index.d.ts +6 -0
  305. package/lib/syntax/index.js +5 -0
  306. package/lib/syntax/syntaxRegistry.d.ts +150 -0
  307. package/lib/syntax/syntaxRegistry.js +314 -0
  308. package/lib/syntax/syntaxTree.d.ts +106 -0
  309. package/lib/syntax/syntaxTree.js +668 -0
  310. package/lib/syntax/types.d.ts +15 -0
  311. package/lib/syntax/types.js +1 -0
  312. package/lib/types/common.d.ts +1 -1
  313. package/package.json +72 -193
  314. package/.editorconfig +0 -12
  315. package/.prettierignore +0 -17
  316. package/MCP-Token/347/250/216/344/270/216/344/270/213/344/270/200/344/273/243/345/267/245/345/205/267/345/215/217/350/256/256.html +0 -1763
  317. package/docs/annotation-campaign-A.csv +0 -54
  318. package/docs/annotation-campaign-B.csv +0 -54
  319. package/docs/annotation-campaign.csv +0 -54
  320. package/docs/eval/annotations-A.jsonl +0 -16
  321. package/docs/eval/annotations.json +0 -122
  322. package/docs/eval/recorded-labels.json +0 -12
  323. package/docs/eval/replay-cases.json +0 -14
  324. package/docs/eval/replay-labels-b.json +0 -14
  325. package/docs/examples/attention-request.json +0 -16
  326. package/docs/examples/checkpoint.json +0 -15
  327. package/docs/examples/claim.json +0 -66
  328. package/docs/examples/collaboration.json +0 -66
  329. package/docs/examples/concept-checkpoint.json +0 -15
  330. package/docs/examples/concept-prune-plan.json +0 -45
  331. package/docs/examples/federation.json +0 -126
  332. package/docs/examples/frame-chain.json +0 -77
  333. package/docs/examples/ledger-snapshot.json +0 -108
  334. package/docs/examples/manifest.json +0 -77
  335. package/docs/examples/message.json +0 -19
  336. package/docs/examples/other-model.json +0 -45
  337. package/docs/examples/plan.json +0 -50
  338. package/docs/examples/prune-plan.json +0 -48
  339. package/docs/examples/receipt.json +0 -22
  340. package/docs/examples/runtime-run.json +0 -573
  341. package/docs/examples/team.json +0 -66
  342. package/docs/examples/verb-note.json +0 -11
  343. package/docs/probes/bayes-scores.json +0 -1452
  344. package/docs/probes/calibration-imported.json +0 -141
  345. package/docs/probes/context-ast-deepseek.json +0 -1577
  346. package/docs/probes/deepseek-probe.json +0 -917
  347. package/docs/probes/eval-recorded-replay.json +0 -597
  348. package/docs/probes/eval-replay.json +0 -124
  349. package/docs/probes/eval-summary.json +0 -42
  350. package/docs/probes/runtime-eval.json +0 -4230
  351. package/docs/schemas/collaboration.schema.json +0 -73
  352. package/docs/schemas/common.schema.json +0 -125
  353. package/docs/schemas/compaction.schema.json +0 -121
  354. package/docs/schemas/concept-compaction.schema.json +0 -73
  355. package/docs/schemas/concept.schema.json +0 -97
  356. package/docs/schemas/epistemic.schema.json +0 -178
  357. package/docs/schemas/federation.schema.json +0 -66
  358. package/docs/schemas/frame.schema.json +0 -86
  359. package/docs/schemas/ledger-snapshot.schema.json +0 -30
  360. package/docs/schemas/manifest.schema.json +0 -169
  361. package/docs/schemas/message.schema.json +0 -41
  362. package/docs/schemas/plan.schema.json +0 -189
  363. package/docs/schemas/receipt.schema.json +0 -45
  364. package/docs/schemas/social.schema.json +0 -153
  365. package/docs/schemas/team.schema.json +0 -56
  366. package/docs/schemas/verb.schema.json +0 -120
  367. package/eslint.config.mts +0 -96
  368. package/index.html +0 -13
  369. package/lib/context/workspaceProtocol.d.ts +0 -30
  370. package/lib/context/workspaceProtocol.js +0 -49
  371. package/prettier.config.mts +0 -37
  372. package/public/favicon.svg +0 -1
  373. package/public/icons.svg +0 -24
  374. package/src/attention/attention.ts +0 -347
  375. package/src/attention/budget.ts +0 -72
  376. package/src/attention/cognition.ts +0 -519
  377. package/src/attention/index.ts +0 -8
  378. package/src/attention/interrupts.ts +0 -228
  379. package/src/attention/resource.ts +0 -316
  380. package/src/attention/social.ts +0 -217
  381. package/src/attention/socialTypes.ts +0 -115
  382. package/src/authz/authz.ts +0 -305
  383. package/src/authz/index.ts +0 -1
  384. package/src/bayes/calibration.ts +0 -204
  385. package/src/bayes/calibrationRegistry.ts +0 -111
  386. package/src/bayes/calibrationSelection.ts +0 -154
  387. package/src/bayes/engine.ts +0 -532
  388. package/src/bayes/index.ts +0 -6
  389. package/src/bayes/reliability.ts +0 -62
  390. package/src/bayes/scopedPriors.ts +0 -88
  391. package/src/boundary/frame.ts +0 -322
  392. package/src/boundary/ids.ts +0 -14
  393. package/src/boundary/index.ts +0 -12
  394. package/src/boundary/refTable.ts +0 -125
  395. package/src/boundary/toolCall.ts +0 -212
  396. package/src/concept/concept.ts +0 -75
  397. package/src/concept/conceptBudget.ts +0 -346
  398. package/src/concept/conceptBudgetTypes.ts +0 -79
  399. package/src/concept/index.ts +0 -3
  400. package/src/concurrency/idempotency.ts +0 -41
  401. package/src/concurrency/index.ts +0 -5
  402. package/src/concurrency/mutex.ts +0 -26
  403. package/src/concurrency/namedLocks.ts +0 -35
  404. package/src/concurrency/retry.ts +0 -50
  405. package/src/concurrency/worker.ts +0 -128
  406. package/src/context/agentContext.ts +0 -308
  407. package/src/context/ast.ts +0 -499
  408. package/src/context/contentStore.ts +0 -75
  409. package/src/context/context.ts +0 -65
  410. package/src/context/contextIndex.ts +0 -85
  411. package/src/context/document.ts +0 -137
  412. package/src/context/fileStorePath.ts +0 -14
  413. package/src/context/index.ts +0 -43
  414. package/src/context/lifecycle.ts +0 -221
  415. package/src/context/projections.ts +0 -151
  416. package/src/context/workspace.ts +0 -422
  417. package/src/context/workspaceProtocol.ts +0 -112
  418. package/src/context/workspaceService.ts +0 -423
  419. package/src/cooperation/board.ts +0 -104
  420. package/src/cooperation/collaboration.ts +0 -60
  421. package/src/cooperation/index.ts +0 -6
  422. package/src/cooperation/merge.ts +0 -190
  423. package/src/cooperation/metrics.ts +0 -57
  424. package/src/cooperation/session.ts +0 -131
  425. package/src/cooperation/unified.ts +0 -56
  426. package/src/counter.ts +0 -9
  427. package/src/database/adapter/adapters.ts +0 -35
  428. package/src/database/adapter/index.ts +0 -4
  429. package/src/database/adapter/runtimeSink.ts +0 -74
  430. package/src/database/adapter/sessionStore.ts +0 -32
  431. package/src/database/adapter/turnStore.ts +0 -23
  432. package/src/database/entity/agent.ts +0 -199
  433. package/src/database/entity/entity.ts +0 -1046
  434. package/src/database/entity/handle.ts +0 -79
  435. package/src/database/entity/index.ts +0 -32
  436. package/src/database/entity/message.ts +0 -74
  437. package/src/database/entity/meta.ts +0 -11
  438. package/src/database/entity/object.ts +0 -42
  439. package/src/database/entity/outbox.ts +0 -15
  440. package/src/database/entity/process.ts +0 -65
  441. package/src/database/entity/registry.ts +0 -155
  442. package/src/database/entity/runtimeApproval.ts +0 -30
  443. package/src/database/entity/runtimeSession.ts +0 -13
  444. package/src/database/entity/runtimeTurn.ts +0 -15
  445. package/src/database/entity/thread.ts +0 -85
  446. package/src/database/entity/window.ts +0 -85
  447. package/src/database/entity/worker.ts +0 -90
  448. package/src/database/index.ts +0 -6
  449. package/src/database/repository/addressSpaceRepository.ts +0 -72
  450. package/src/database/repository/agentRepository.ts +0 -460
  451. package/src/database/repository/base.ts +0 -41
  452. package/src/database/repository/executionRepository.ts +0 -477
  453. package/src/database/repository/handleRepository.ts +0 -64
  454. package/src/database/repository/index.ts +0 -20
  455. package/src/database/repository/messageRepository.ts +0 -52
  456. package/src/database/repository/objectRepository.ts +0 -69
  457. package/src/database/repository/outboxRepository.ts +0 -63
  458. package/src/database/repository/processRepository.ts +0 -58
  459. package/src/database/repository/registryRepository.ts +0 -119
  460. package/src/database/repository/repository.ts +0 -491
  461. package/src/database/repository/runtimeApprovalRepository.ts +0 -44
  462. package/src/database/repository/runtimeSessionRepository.ts +0 -27
  463. package/src/database/repository/runtimeTurnRepository.ts +0 -39
  464. package/src/database/repository/socialRepository.ts +0 -185
  465. package/src/database/repository/threadRepository.ts +0 -57
  466. package/src/database/repository/windowRepository.ts +0 -88
  467. package/src/database/repository/workerRepository.ts +0 -69
  468. package/src/database/service/database.ts +0 -90
  469. package/src/database/service/handleService.ts +0 -48
  470. package/src/database/service/index.ts +0 -16
  471. package/src/database/service/messageService.ts +0 -61
  472. package/src/database/service/objectService.ts +0 -59
  473. package/src/database/service/processService.ts +0 -61
  474. package/src/database/service/registryServices.ts +0 -88
  475. package/src/database/service/service.ts +0 -183
  476. package/src/database/service/stepService.ts +0 -53
  477. package/src/database/service/threadService.ts +0 -65
  478. package/src/database/service/windowService.ts +0 -30
  479. package/src/database/service/workerService.ts +0 -57
  480. package/src/database/sql/index.ts +0 -3
  481. package/src/database/sql/schema.ts +0 -418
  482. package/src/database/sql/sql.ts +0 -543
  483. package/src/database/store/database.ts +0 -210
  484. package/src/database/store/index.ts +0 -3
  485. package/src/database/store/store.ts +0 -266
  486. package/src/delegate/index.ts +0 -2
  487. package/src/delegate/team.ts +0 -268
  488. package/src/delegate/teamTypes.ts +0 -47
  489. package/src/diagnosis/checklist.ts +0 -74
  490. package/src/diagnosis/context.ts +0 -93
  491. package/src/diagnosis/frame.ts +0 -256
  492. package/src/diagnosis/index.ts +0 -5
  493. package/src/diagnosis/router.ts +0 -72
  494. package/src/diagnosis/types.ts +0 -89
  495. package/src/error/agentError.ts +0 -16
  496. package/src/error/ampError.ts +0 -20
  497. package/src/error/authzError.ts +0 -14
  498. package/src/error/boundaryRejection.ts +0 -20
  499. package/src/error/index.ts +0 -7
  500. package/src/error/kernelError.ts +0 -27
  501. package/src/error/mailboxError.ts +0 -9
  502. package/src/error/windowError.ts +0 -12
  503. package/src/evaluation/agreement.ts +0 -96
  504. package/src/evaluation/index.ts +0 -2
  505. package/src/evaluation/labels.ts +0 -241
  506. package/src/evidence/evidenceGraph.ts +0 -205
  507. package/src/evidence/index.ts +0 -4
  508. package/src/evidence/revalidation.ts +0 -191
  509. package/src/execution/exec.ts +0 -408
  510. package/src/execution/handles.ts +0 -65
  511. package/src/execution/index.ts +0 -3
  512. package/src/execution/pin.ts +0 -154
  513. package/src/frame/frame.ts +0 -70
  514. package/src/frame/index.ts +0 -1
  515. package/src/goal/goal.ts +0 -43
  516. package/src/goal/index.ts +0 -2
  517. package/src/goal/plan.ts +0 -196
  518. package/src/governance/attentionManifest.ts +0 -802
  519. package/src/governance/audit.ts +0 -362
  520. package/src/governance/budget.ts +0 -628
  521. package/src/governance/context.ts +0 -356
  522. package/src/governance/control.ts +0 -159
  523. package/src/governance/cooperation.ts +0 -479
  524. package/src/governance/credential.ts +0 -359
  525. package/src/governance/httpServer.ts +0 -99
  526. package/src/governance/index.ts +0 -32
  527. package/src/governance/legal.ts +0 -574
  528. package/src/governance/matrix.ts +0 -460
  529. package/src/governance/perspectives.ts +0 -406
  530. package/src/governance/signing.ts +0 -407
  531. package/src/governance/store.ts +0 -125
  532. package/src/governance/switching.ts +0 -459
  533. package/src/governance/toolPolicy.ts +0 -80
  534. package/src/governance/transport.ts +0 -204
  535. package/src/governance/types.ts +0 -380
  536. package/src/governance/workflow.ts +0 -743
  537. package/src/index.ts +0 -11
  538. package/src/interaction/index.ts +0 -1
  539. package/src/interaction/interaction.ts +0 -391
  540. package/src/ipc/index.ts +0 -4
  541. package/src/ipc/mailbox.ts +0 -132
  542. package/src/ipc/memorySocialStore.ts +0 -93
  543. package/src/ipc/social.ts +0 -93
  544. package/src/kernel/index.ts +0 -14
  545. package/src/kernel/scheduler.ts +0 -498
  546. package/src/ledger/checkpoint.ts +0 -304
  547. package/src/ledger/index.ts +0 -4
  548. package/src/ledger/ledger.ts +0 -31
  549. package/src/ledger/persistence.ts +0 -159
  550. package/src/ledger/share.ts +0 -80
  551. package/src/lock/index.ts +0 -2
  552. package/src/lock/lease.ts +0 -74
  553. package/src/main.ts +0 -199
  554. package/src/manifest/agentCard.ts +0 -72
  555. package/src/manifest/cardSign.ts +0 -87
  556. package/src/manifest/federation.ts +0 -237
  557. package/src/manifest/federationTypes.ts +0 -55
  558. package/src/manifest/index.ts +0 -8
  559. package/src/manifest/keys.ts +0 -643
  560. package/src/manifest/manifest.ts +0 -114
  561. package/src/manifest/sign.ts +0 -134
  562. package/src/manifest/trust.ts +0 -146
  563. package/src/mission/index.ts +0 -2
  564. package/src/mission/missionQueue.ts +0 -75
  565. package/src/module/index.ts +0 -9
  566. package/src/module/llm/deepseek.ts +0 -214
  567. package/src/module/llm/llm.ts +0 -84
  568. package/src/module/mcp/client.ts +0 -110
  569. package/src/module/mcp/http.ts +0 -102
  570. package/src/module/mcp/protocol.ts +0 -77
  571. package/src/module/mcp/server.ts +0 -148
  572. package/src/module/mcp/transport.ts +0 -30
  573. package/src/module/mcp/workspaceServer.ts +0 -111
  574. package/src/module/sandbox/sandbox.ts +0 -29
  575. package/src/module/tool/mcpExecutor.ts +0 -54
  576. package/src/module/tool/policy.ts +0 -52
  577. package/src/module/tool/redact.ts +0 -29
  578. package/src/module/tool/tool.ts +0 -53
  579. package/src/module/tool/workspaceExecutor.ts +0 -35
  580. package/src/policy/guard.ts +0 -240
  581. package/src/policy/index.ts +0 -2
  582. package/src/policy/policy.ts +0 -561
  583. package/src/process/agent.ts +0 -341
  584. package/src/process/agentService.ts +0 -236
  585. package/src/process/agentStore.ts +0 -378
  586. package/src/process/executionStore.ts +0 -151
  587. package/src/process/index.ts +0 -5
  588. package/src/process/process.ts +0 -240
  589. package/src/process/transitions.ts +0 -19
  590. package/src/progress/index.ts +0 -2
  591. package/src/progress/progress.ts +0 -85
  592. package/src/protocol/a2a.ts +0 -120
  593. package/src/protocol/channel.ts +0 -44
  594. package/src/protocol/envelope.ts +0 -655
  595. package/src/protocol/httpChannel.ts +0 -87
  596. package/src/protocol/index.ts +0 -6
  597. package/src/protocol/protocol.ts +0 -138
  598. package/src/protocol/wire.ts +0 -60
  599. package/src/receipt/index.ts +0 -1
  600. package/src/receipt/receipt.ts +0 -47
  601. package/src/registry/content.ts +0 -69
  602. package/src/registry/index.ts +0 -23
  603. package/src/registry/registry.ts +0 -599
  604. package/src/runtime/action.ts +0 -87
  605. package/src/runtime/behavior.ts +0 -330
  606. package/src/runtime/behaviorTuning.ts +0 -163
  607. package/src/runtime/cognitiveRuntime.ts +0 -703
  608. package/src/runtime/escalation.ts +0 -35
  609. package/src/runtime/governedTask.ts +0 -233
  610. package/src/runtime/index.ts +0 -15
  611. package/src/runtime/kernelRuntime.ts +0 -144
  612. package/src/runtime/operation.ts +0 -35
  613. package/src/runtime/replay.ts +0 -71
  614. package/src/runtime/routing.ts +0 -58
  615. package/src/runtime/safety.ts +0 -48
  616. package/src/runtime/session.ts +0 -341
  617. package/src/runtime/sessionStore.ts +0 -43
  618. package/src/runtime/telemetry.ts +0 -55
  619. package/src/runtime/turnStore.ts +0 -30
  620. package/src/scenario/index.ts +0 -1
  621. package/src/scenario/scenario.ts +0 -299
  622. package/src/semantic/canonical.ts +0 -24
  623. package/src/semantic/index.ts +0 -2
  624. package/src/semantic/sha256.ts +0 -82
  625. package/src/storage/appendLog.ts +0 -372
  626. package/src/storage/fileAppendSink.ts +0 -40
  627. package/src/storage/index.ts +0 -2
  628. package/src/store/bindCache.ts +0 -22
  629. package/src/store/cache.ts +0 -191
  630. package/src/store/context.ts +0 -31
  631. package/src/store/handleStore.ts +0 -31
  632. package/src/store/index.ts +0 -9
  633. package/src/store/messageStore.ts +0 -31
  634. package/src/store/objectStore.ts +0 -31
  635. package/src/store/processStore.ts +0 -31
  636. package/src/store/threadStore.ts +0 -31
  637. package/src/store/windowStore.ts +0 -31
  638. package/src/structure/abstractSyntaxTree.ts +0 -493
  639. package/src/structure/avlTree.ts +0 -408
  640. package/src/structure/binarySearchTree.ts +0 -352
  641. package/src/structure/binaryTree.ts +0 -525
  642. package/src/structure/bloomFilter.ts +0 -231
  643. package/src/structure/compare.ts +0 -110
  644. package/src/structure/cuckooFilter.ts +0 -337
  645. package/src/structure/deque.ts +0 -223
  646. package/src/structure/filterKey.ts +0 -36
  647. package/src/structure/hash.ts +0 -279
  648. package/src/structure/heap.ts +0 -268
  649. package/src/structure/index.ts +0 -20
  650. package/src/structure/iterator.ts +0 -22
  651. package/src/structure/lru.ts +0 -619
  652. package/src/structure/ordered.ts +0 -399
  653. package/src/structure/priority.ts +0 -915
  654. package/src/structure/queue.ts +0 -168
  655. package/src/structure/redBlackTree.ts +0 -680
  656. package/src/structure/segmentTree.ts +0 -248
  657. package/src/structure/stack.ts +0 -118
  658. package/src/structure/unordered.ts +0 -407
  659. package/src/style.css +0 -278
  660. package/src/thread/index.ts +0 -2
  661. package/src/thread/thread.ts +0 -176
  662. package/src/thread/transitions.ts +0 -17
  663. package/src/types/common.ts +0 -119
  664. package/src/types/index.ts +0 -23
  665. package/src/warrant/epistemic.ts +0 -154
  666. package/src/warrant/index.ts +0 -3
  667. package/src/warrant/inquiry.ts +0 -166
  668. package/src/warrant/warrant.ts +0 -179
  669. package/src/window/compaction.ts +0 -403
  670. package/src/window/compactionTypes.ts +0 -119
  671. package/src/window/index.ts +0 -7
  672. package/src/window/page.ts +0 -18
  673. package/src/window/window.ts +0 -244
  674. package/tools/_helpers.ts +0 -34
  675. package/tools/a2a-check.ts +0 -110
  676. package/tools/a2a-flow-check.ts +0 -78
  677. package/tools/agent-card-check.ts +0 -76
  678. package/tools/agent-check.ts +0 -236
  679. package/tools/agent-store-check.ts +0 -153
  680. package/tools/agreement-check.ts +0 -27
  681. package/tools/annotation-server-check.ts +0 -48
  682. package/tools/annotation-server.ts +0 -230
  683. package/tools/annotation-status.ts +0 -65
  684. package/tools/approval-access-check.ts +0 -66
  685. package/tools/arch-check.ts +0 -72
  686. package/tools/attention-core-check.ts +0 -48
  687. package/tools/attention-resource-check.ts +0 -169
  688. package/tools/audit-check.ts +0 -207
  689. package/tools/authority-check.ts +0 -124
  690. package/tools/authz-check.ts +0 -138
  691. package/tools/bayes-check.ts +0 -162
  692. package/tools/bayes-probe.ts +0 -154
  693. package/tools/behavior-tuning-check.ts +0 -53
  694. package/tools/board-check.ts +0 -87
  695. package/tools/boundary-check.ts +0 -199
  696. package/tools/bundle-trust-check.ts +0 -96
  697. package/tools/calibrate-imported.ts +0 -108
  698. package/tools/calibration-check.ts +0 -44
  699. package/tools/calibration-registry-check.ts +0 -40
  700. package/tools/calibration-sim.ts +0 -40
  701. package/tools/card-sign-check.ts +0 -71
  702. package/tools/card-trust-check.ts +0 -78
  703. package/tools/channel-check.ts +0 -86
  704. package/tools/checkpoint-check.ts +0 -620
  705. package/tools/cleanup-style-configs.ts +0 -29
  706. package/tools/cognition-check.ts +0 -648
  707. package/tools/cognitive-runtime-check.ts +0 -609
  708. package/tools/collaboration-demo.ts +0 -78
  709. package/tools/compaction-check.ts +0 -266
  710. package/tools/concept-check.ts +0 -260
  711. package/tools/concurrency-check.ts +0 -242
  712. package/tools/conformance-runtime.ts +0 -389
  713. package/tools/conformance.ts +0 -651
  714. package/tools/context-ast-check.ts +0 -90
  715. package/tools/context-ast-deepseek.ts +0 -242
  716. package/tools/context-graph-bench.ts +0 -50
  717. package/tools/context-graph-check.ts +0 -229
  718. package/tools/context-index-check.ts +0 -48
  719. package/tools/context-lifecycle-check.ts +0 -69
  720. package/tools/context-projection-check.ts +0 -73
  721. package/tools/context-scope-check.ts +0 -134
  722. package/tools/context-storage-check.ts +0 -113
  723. package/tools/cooperation-check.ts +0 -517
  724. package/tools/cooperation-http-check.ts +0 -125
  725. package/tools/deepseek-llm-check.ts +0 -147
  726. package/tools/deepseek-probe.ts +0 -494
  727. package/tools/diagnosis-check.ts +0 -109
  728. package/tools/diagnosis-router-check.ts +0 -50
  729. package/tools/document-context-check.ts +0 -237
  730. package/tools/envelope-check.ts +0 -659
  731. package/tools/eslint-rules/index.ts +0 -26
  732. package/tools/eslint-rules/rules/jsdoc-comment-format.ts +0 -105
  733. package/tools/eslint-rules/rules/no-function-keyword.ts +0 -60
  734. package/tools/eslint-rules/rules/no-multiline-parameters.ts +0 -71
  735. package/tools/eslint-rules/rules/no-multiline-type-parameters.ts +0 -57
  736. package/tools/eslint-rules/rules/no-undefined-comparison.ts +0 -115
  737. package/tools/eslint-rules/rules/prefer-template-for-string-conversion.ts +0 -97
  738. package/tools/eslint-rules/rules/require-typeof-parentheses.ts +0 -49
  739. package/tools/eslint-rules/rules/require-variable-type.ts +0 -36
  740. package/tools/eslint-rules/rules/variable-naming.ts +0 -175
  741. package/tools/eval-recorded-replay.ts +0 -215
  742. package/tools/eval-replay.ts +0 -139
  743. package/tools/eval-summary.ts +0 -136
  744. package/tools/evidence-revalidation-check.ts +0 -235
  745. package/tools/exec-check.ts +0 -217
  746. package/tools/federation-check.ts +0 -166
  747. package/tools/federation-demo.ts +0 -45
  748. package/tools/filter-check.ts +0 -243
  749. package/tools/governance-check.ts +0 -680
  750. package/tools/governance-store-check.ts +0 -131
  751. package/tools/governed-task-check.ts +0 -227
  752. package/tools/guard-check.ts +0 -122
  753. package/tools/http-channel-check.ts +0 -125
  754. package/tools/import-campaign.ts +0 -28
  755. package/tools/inquiry-check.ts +0 -126
  756. package/tools/interaction-check.ts +0 -171
  757. package/tools/interrupts-check.ts +0 -173
  758. package/tools/ipc-check.ts +0 -170
  759. package/tools/kernel-async-check.ts +0 -136
  760. package/tools/kernel-check.ts +0 -369
  761. package/tools/kernel-runtime-check.ts +0 -276
  762. package/tools/keys-check.ts +0 -559
  763. package/tools/label-audit.ts +0 -70
  764. package/tools/labels-workflow-check.ts +0 -49
  765. package/tools/linear-structure-check.ts +0 -524
  766. package/tools/live-exec.ts +0 -62
  767. package/tools/live-governance-eval.ts +0 -813
  768. package/tools/live-legacy.ts +0 -50
  769. package/tools/lru-check.ts +0 -182
  770. package/tools/make-annotation-campaign.ts +0 -57
  771. package/tools/mcp-executor-check.ts +0 -33
  772. package/tools/merge-annotations.ts +0 -32
  773. package/tools/merge-check.ts +0 -98
  774. package/tools/metrics-check.ts +0 -84
  775. package/tools/net-probe.ts +0 -107
  776. package/tools/oauth-probe.ts +0 -117
  777. package/tools/outbox-check.ts +0 -50
  778. package/tools/persistence-check.ts +0 -144
  779. package/tools/pin-check.ts +0 -116
  780. package/tools/platform-check.ts +0 -281
  781. package/tools/policy-check.ts +0 -514
  782. package/tools/prettier-plugin/index.mts +0 -84
  783. package/tools/priority-check.ts +0 -627
  784. package/tools/probe-context7.ts +0 -63
  785. package/tools/registry-check.ts +0 -252
  786. package/tools/reliability-check.ts +0 -25
  787. package/tools/retry-check.ts +0 -85
  788. package/tools/rewrite-declaration-extensions.ts +0 -98
  789. package/tools/runtime-check.ts +0 -165
  790. package/tools/runtime-deepseek-check.ts +0 -85
  791. package/tools/runtime-eval.ts +0 -358
  792. package/tools/scenario-check.ts +0 -161
  793. package/tools/scenario-incident.ts +0 -162
  794. package/tools/scoped-priors-check.ts +0 -35
  795. package/tools/scoped-priors-pooling.ts +0 -34
  796. package/tools/segment-ast-check.ts +0 -649
  797. package/tools/session-check.ts +0 -196
  798. package/tools/session-store-check.ts +0 -73
  799. package/tools/share-check.ts +0 -88
  800. package/tools/sign-check.ts +0 -95
  801. package/tools/signing-check.ts +0 -275
  802. package/tools/snapshot-demo.ts +0 -65
  803. package/tools/social-check.ts +0 -146
  804. package/tools/structure-compare-check.ts +0 -95
  805. package/tools/support/documentScanner.ts +0 -577
  806. package/tools/support/texScanner.ts +0 -631
  807. package/tools/support/workspaceScanner.ts +0 -476
  808. package/tools/team-check.ts +0 -163
  809. package/tools/team-demo.ts +0 -36
  810. package/tools/telemetry-check.ts +0 -44
  811. package/tools/tex-context-check.ts +0 -263
  812. package/tools/tool-gate-check.ts +0 -98
  813. package/tools/tree-structure-check.ts +0 -786
  814. package/tools/trust-flow-check.ts +0 -158
  815. package/tools/turn-store-check.ts +0 -57
  816. package/tools/unified-check.ts +0 -83
  817. package/tools/validate.ts +0 -309
  818. package/tools/wire-check.ts +0 -96
  819. package/tools/workspace-agent-check.ts +0 -486
  820. package/tools/workspace-agent-demo.ts +0 -62
  821. package/tools/workspace-agent-server.ts +0 -101
  822. package/tools/workspace-context-check.ts +0 -331
  823. package/tools/workspace-context.ts +0 -131
  824. package/tsconfig.build.json +0 -14
  825. package/tsconfig.json +0 -24
  826. package/tsconfig.tools.json +0 -31
  827. package/viz/context-ast.json +0 -1577
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Strict UTF-8 plus the `text` and `string` policies.
3
+ *
4
+ * `TextEncoder` replaces an unpaired surrogate with U+FFFD, so `"\uD800"` and
5
+ * `"\uFFFD"` would hash identically 鈥?the exact collision this module exists to
6
+ * prevent (the design audit measured it). `encodeUtf8Strict` therefore validates
7
+ * surrogate pairing before it writes a byte and is the only string-to-bytes
8
+ * path in the module; `json.ts`, `file.ts` and `tree.ts` all use it for that
9
+ * reason.
10
+ *
11
+ * The two policies answer two different questions and both are needed:
12
+ *
13
+ * - `text/utf8+nfc+lf` removes presentation differences that carry no content
14
+ * (one leading BOM, CRLF versus LF) and applies NFC, so `"茅"` and `"e\u0301"`
15
+ * are one value. NFC and not NFKC: compatibility decomposition is lossy
16
+ * (`铿乣 becomes `fi`), which would make distinct texts collide on purpose.
17
+ * - `string/utf16-strict` preserves the code units exactly. Sometimes the byte
18
+ * identity is what the caller wants to pin, and a generic `fingerprintOf`
19
+ * dispatcher must not silently normalise what it was given.
20
+ */
21
+ import { NormalizationRejected } from "./error.js";
22
+ import { Policy } from "./policy.js";
23
+ import { fingerprintPayload } from "./preimage.js";
24
+ const HexRadix = 16;
25
+ const SurrogateHighStart = 0xd800;
26
+ const SurrogateHighEnd = 0xdbff;
27
+ const SurrogateLowStart = 0xdc00;
28
+ const SurrogateLowEnd = 0xdfff;
29
+ const SurrogateBase = 0x10000;
30
+ const hex4 = (value) => value.toString(HexRadix).toUpperCase().padStart(4, "0");
31
+ /**
32
+ * Compute the UTF-8 length of `text` while rejecting any unpaired surrogate.
33
+ *
34
+ * The validation and the measurement happen in one pass because both walk the
35
+ * same code units: a separate validator would double the scans and could drift
36
+ * out of sync with the encoder. The returned length lets the encoder allocate
37
+ * once, so no intermediate array of code points is materialised.
38
+ */
39
+ const utf8ByteLength = (text) => {
40
+ let length = 0;
41
+ for (let index = 0; index < text.length; index += 1) {
42
+ const unit = text.charCodeAt(index);
43
+ if (unit < 0x80) {
44
+ length += 1;
45
+ continue;
46
+ }
47
+ if (unit < 0x800) {
48
+ length += 2;
49
+ continue;
50
+ }
51
+ if (unit >= SurrogateHighStart && unit <= SurrogateHighEnd) {
52
+ const next = index + 1 < text.length ? text.charCodeAt(index + 1) : -1;
53
+ if (next < SurrogateLowStart || next > SurrogateLowEnd) {
54
+ throw new NormalizationRejected([`text contains a lone high surrogate U+${hex4(unit)} at index ${index}`]);
55
+ }
56
+ length += 4;
57
+ index += 1;
58
+ continue;
59
+ }
60
+ if (unit >= SurrogateLowStart && unit <= SurrogateLowEnd) {
61
+ throw new NormalizationRejected([`text contains a lone low surrogate U+${hex4(unit)} at index ${index}`]);
62
+ }
63
+ length += 3;
64
+ }
65
+ return length;
66
+ };
67
+ /**
68
+ * Encode a JavaScript string as UTF-8 without ever substituting U+FFFD.
69
+ *
70
+ * Two passes: the first measures and validates, the second writes. A paired
71
+ * surrogate is written as one four-byte sequence and the loop skips its low
72
+ * half, so the output is standard UTF-8 (the CESU-8 spelling of a pair would be
73
+ * six bytes and would collide with different text).
74
+ */
75
+ export const encodeUtf8Strict = (text) => {
76
+ if (typeof (text) !== "string") {
77
+ throw new TypeError(`encodeUtf8Strict expects a string, received ${typeof (text)}`);
78
+ }
79
+ const bytes = new Uint8Array(utf8ByteLength(text));
80
+ let offset = 0;
81
+ for (let index = 0; index < text.length; index += 1) {
82
+ const unit = text.charCodeAt(index);
83
+ if (unit < 0x80) {
84
+ bytes[offset] = unit;
85
+ offset += 1;
86
+ continue;
87
+ }
88
+ if (unit < 0x800) {
89
+ bytes[offset] = 0xc0 | (unit >> 6);
90
+ bytes[offset + 1] = 0x80 | (unit & 0x3f);
91
+ offset += 2;
92
+ continue;
93
+ }
94
+ if (unit >= SurrogateHighStart && unit <= SurrogateHighEnd) {
95
+ const next = text.charCodeAt(index + 1);
96
+ const codePoint = SurrogateBase + ((unit - SurrogateHighStart) << 10) + (next - SurrogateLowStart);
97
+ bytes[offset] = 0xf0 | (codePoint >> 18);
98
+ bytes[offset + 1] = 0x80 | ((codePoint >> 12) & 0x3f);
99
+ bytes[offset + 2] = 0x80 | ((codePoint >> 6) & 0x3f);
100
+ bytes[offset + 3] = 0x80 | (codePoint & 0x3f);
101
+ offset += 4;
102
+ index += 1;
103
+ continue;
104
+ }
105
+ bytes[offset] = 0xe0 | (unit >> 12);
106
+ bytes[offset + 1] = 0x80 | ((unit >> 6) & 0x3f);
107
+ bytes[offset + 2] = 0x80 | (unit & 0x3f);
108
+ offset += 3;
109
+ }
110
+ return bytes;
111
+ };
112
+ /**
113
+ * Apply the `text/utf8+nfc+lf` normalisation, in the order the policy name
114
+ * implies: exactly one leading BOM is dropped (interior BOMs are content), CRLF
115
+ * and lone CR become LF, then NFC is applied.
116
+ *
117
+ * NUL is rejected rather than hashed: a NUL inside text truncates every C
118
+ * consumer of the string, so two texts that are equal only up to a NUL would be
119
+ * treated as identical downstream while this module would say they differ.
120
+ * Rejecting keeps the two views aligned.
121
+ */
122
+ export const normalizeTextNfc = (text) => {
123
+ const withoutBom = text.startsWith("\uFEFF") ? text.slice(1) : text;
124
+ const lfOnly = withoutBom.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
125
+ const normalized = lfOnly.normalize("NFC");
126
+ const nulIndex = normalized.indexOf("\u0000");
127
+ if (nulIndex !== -1) {
128
+ throw new NormalizationRejected([`text contains U+0000 at index ${nulIndex}; the text policy forbids NUL`]);
129
+ }
130
+ return normalized;
131
+ };
132
+ /**
133
+ * Fingerprint text under the NFC policy (default) or the raw policy.
134
+ *
135
+ * `raw` still uses the strict encoder: "no normalisation" means no BOM, newline
136
+ * or Unicode folding, not "let the platform substitute replacement characters".
137
+ */
138
+ export const fingerprintText = (text, options) => {
139
+ const policy = options?.policy ?? "nfc";
140
+ if (policy === "nfc") {
141
+ const payload = encodeUtf8Strict(normalizeTextNfc(text));
142
+ return fingerprintPayload("sha256", "text", Policy.textNfc, payload);
143
+ }
144
+ if (policy === "raw") {
145
+ return fingerprintPayload("sha256", "text", Policy.textRaw, encodeUtf8Strict(text));
146
+ }
147
+ throw new NormalizationRejected([`unknown text policy "${policy}"; expected "nfc" or "raw"`]);
148
+ };
149
+ /**
150
+ * Fingerprint the exact code units of a string: no BOM stripping, no newline
151
+ * folding, no NFC. `"茅"` (U+00E9) and `"e\u0301"` (e + U+0301) are different
152
+ * strings and therefore different fingerprints, which is the point of having a
153
+ * `string` kind next to `text`.
154
+ */
155
+ export const fingerprintString = (text) => fingerprintPayload("sha256", "string", Policy.stringStrict, encodeUtf8Strict(text));
@@ -0,0 +1,56 @@
1
+ import type { AlgorithmId } from "./algorithm.js";
2
+ import type { Fingerprint } from "./preimage.js";
3
+ /**
4
+ * One entry of the tree.
5
+ *
6
+ * `digest` is the *child* digest that goes into the leaf record: the file
7
+ * content digest for a regular file, `sha256(utf8(target))` for a symlink, and
8
+ * `sha256(empty)` for a directory. Keeping the child digest (rather than the
9
+ * leaf digest) means a consumer can compare a file against a CAS object while
10
+ * still being able to rebuild the leaf —and therefore the root —from the
11
+ * returned entries.
12
+ */
13
+ export interface TreeEntry {
14
+ readonly path: string;
15
+ readonly digest: string;
16
+ readonly size: number;
17
+ readonly mode: number;
18
+ }
19
+ /**
20
+ * A tree fingerprint plus its root and per-entry detail.
21
+ *
22
+ * `root` is the canonical tree root in bare lowercase hex; `ref.digest` is the
23
+ * same hex and `digest` is its CAS-compatible `<algorithm>:<hex>` spelling.
24
+ * `bytes` in the reference is the total length of the canonical leaf records
25
+ * that were folded, not the sum of the file sizes: it measures the serialised
26
+ * payload the Merkle tree was built from.
27
+ */
28
+ export interface TreeFingerprint extends Fingerprint {
29
+ readonly root: string;
30
+ readonly entries: readonly TreeEntry[];
31
+ readonly excluded: readonly string[];
32
+ }
33
+ /**
34
+ * Option shape for `fingerprintTree`.
35
+ *
36
+ * `exclude` replaces the default exclusion set rather than extending it; there
37
+ * would otherwise be no way to fingerprint a directory that contains a
38
+ * `node_modules` folder on purpose. The applied set is echoed in `excluded` so
39
+ * a verifier can see what was in scope.
40
+ */
41
+ export interface TreeFingerprintOptions {
42
+ readonly exclude?: readonly string[];
43
+ readonly algorithm?: AlgorithmId;
44
+ readonly chunkBytes?: number;
45
+ }
46
+ /**
47
+ * Fingerprint a directory tree.
48
+ *
49
+ * The returned entries are sorted by UTF-8 path bytes and carry the child digest
50
+ * each leaf was built from, so a caller can re-derive the root after changing
51
+ * one file without re-reading the whole tree. The algorithm is fixed to SHA-256
52
+ * in this build: the root composition in `amp.fp/1` is defined in terms of
53
+ * SHA-256, so naming another algorithm here would produce a reference whose
54
+ * verifier cannot exist.
55
+ */
56
+ export declare const fingerprintTree: (root: string, options?: TreeFingerprintOptions) => Promise<TreeFingerprint>;
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Canonical directory-tree fingerprints: a Merkle tree over a sorted flat leaf
3
+ * list.
4
+ *
5
+ * Hashing a directory is meaningless until its serialisation is defined —tar
6
+ * and zip are not canonical, which is why Nix hashes NAR rather than raw bytes.
7
+ * The serialisation used here is:
8
+ *
9
+ * leaf(pathBytes, mode, size, childDigest)
10
+ * = sha256( 0x00 || u32be(pathBytes.length) || pathBytes
11
+ * || u32be(mode) || u64be(size) || childDigest )
12
+ * node(left, right)
13
+ * = sha256( 0x01 || left || right )
14
+ * root
15
+ * = sha256( 0x02 || u64be(entryCount) || merkleRoot || sha256(utf8(treePolicy)) )
16
+ *
17
+ * The `0x00`/`0x01`/`0x02` prefixes are domain separation in the sense of RFC
18
+ * 6962 §2.1: without them a leaf digest could be replayed as an interior node,
19
+ * which breaks second-preimage resistance. `entryCount` in the root makes `{}`
20
+ * differ from a tree whose only entry is an empty directory even before the
21
+ * leaves are considered, and folding the policy hash into the root binds the
22
+ * exclusion/digest rules to the value.
23
+ *
24
+ * Paths are `/`-separated, relative to the root, and sorted by UTF-8 byte order
25
+ * (`Buffer.compare`), never by locale. `mode` binds the file type and the
26
+ * executable bit; `size` is in the leaf so a verifier compares length before
27
+ * digest, as OCI does. Directories get `sha256(empty)` as their child digest:
28
+ * their content is represented by the leaves of their children, and the leaf's
29
+ * mode field is what keeps the entry from colliding with an empty file at the
30
+ * same path.
31
+ *
32
+ * Symlinks are **never followed**. A symlink is recorded as mode 4 with its
33
+ * target string hashed as the child digest, so a link loop cannot hang the walk
34
+ * and the same tree produces the same root on machines where the link would
35
+ * resolve differently.
36
+ */
37
+ import { lstatSync, readdirSync, readlinkSync } from "node:fs";
38
+ import { join } from "node:path";
39
+ import { bytesToHex, createSha256, hexToBytes } from "./algorithm.js";
40
+ import { FingerprintIOError, UnsupportedAlgorithm, describeError } from "./error.js";
41
+ import { fileContentDigest, resolveChunkBytes } from "./file.js";
42
+ import { Policy } from "./policy.js";
43
+ import { SchemeName, shortForm } from "./preimage.js";
44
+ import { encodeUtf8Strict } from "./text.js";
45
+ const ModeFile = 1;
46
+ const ModeExecutableFile = 2;
47
+ const ModeDirectory = 3;
48
+ const ModeSymlink = 4;
49
+ const LeafPrefix = 0x00;
50
+ const NodePrefix = 0x01;
51
+ const RootPrefix = 0x02;
52
+ const DigestBytes = 32;
53
+ const LeafFixedBytes = 1 + 4 + 4 + 8 + DigestBytes;
54
+ const NodeBytes = 1 + DigestBytes + DigestBytes;
55
+ const RootFixedBytes = 1 + 8 + DigestBytes + DigestBytes;
56
+ const PathLengthOffset = 1;
57
+ const ModeOffsetBase = 5;
58
+ const SizeOffsetBase = 9;
59
+ const DigestOffsetBase = 17;
60
+ const NodeLeftOffset = 1;
61
+ const NodeRightOffset = 1 + DigestBytes;
62
+ const RootCountOffset = 1;
63
+ const RootMerkleOffset = 9;
64
+ const RootPolicyOffset = 41;
65
+ const Uint32Range = 0x100000000;
66
+ /**
67
+ * Default exclusions. Version-control metadata, dependency trees, caches and
68
+ * build output are not content: including them would make the same source tree
69
+ * produce different roots on two machines. The set is echoed in `excluded`
70
+ * because "what was ignored" changes the digest and has to be auditable.
71
+ */
72
+ const DefaultExclusions = ["node_modules", ".git", ".cache", "dist", "lib"];
73
+ /**
74
+ * Child digest used for directories, and the Merkle root of an empty tree.
75
+ * Both are `sha256(empty)`, which is unambiguous because the leaf records carry
76
+ * path, mode and size, so a directory entry can never be confused with an empty
77
+ * file entry at a different position.
78
+ */
79
+ const EmptyDigestHex = bytesToHex(createSha256().digest());
80
+ /**
81
+ * Compare two relative paths by their UTF-8 bytes.
82
+ *
83
+ * `Array.prototype.sort()` compares UTF-16 code units, which orders astral
84
+ * characters before U+E000–U+FFFF; RFC 8785 and every content-addressed format
85
+ * expect byte order. Decoding through `Buffer` is the cheapest way to get it,
86
+ * and `Buffer.compare` returns the sign `sort` needs.
87
+ */
88
+ const comparePaths = (left, right) => Buffer.compare(Buffer.from(left, "utf8"), Buffer.from(right, "utf8"));
89
+ /**
90
+ * Validate the exclusion set once.
91
+ *
92
+ * A pattern is a plain entry name, not a glob and not a path: a value containing
93
+ * a separator would silently exclude nothing, and a silent no-op in an exclusion
94
+ * rule is exactly the kind of mistake that later looks like a digest mismatch.
95
+ */
96
+ const resolveExclusions = (exclude) => {
97
+ const names = exclude ?? DefaultExclusions;
98
+ const unique = new Set();
99
+ for (let index = 0; index < names.length; index += 1) {
100
+ const name = names[index];
101
+ if (name.length === 0 || name.includes("/") || name.includes("\\")) {
102
+ throw new TypeError(`exclusion "${name}" must be a single path segment without separators`);
103
+ }
104
+ unique.add(name);
105
+ }
106
+ return [...unique];
107
+ };
108
+ const lstatOrThrow = (path) => {
109
+ try {
110
+ return lstatSync(path);
111
+ }
112
+ catch (error) {
113
+ throw new FingerprintIOError([`cannot stat ${path}: ${describeError(error)}`]);
114
+ }
115
+ };
116
+ const readDirectoryOrThrow = (path) => {
117
+ try {
118
+ return readdirSync(path);
119
+ }
120
+ catch (error) {
121
+ throw new FingerprintIOError([`cannot read directory ${path}: ${describeError(error)}`]);
122
+ }
123
+ };
124
+ const readLinkOrThrow = (path) => {
125
+ try {
126
+ return readlinkSync(path);
127
+ }
128
+ catch (error) {
129
+ throw new FingerprintIOError([`cannot read symlink ${path}: ${describeError(error)}`]);
130
+ }
131
+ };
132
+ /**
133
+ * Depth-first walk that records one entry per filesystem object and never
134
+ * descends through a symlink.
135
+ *
136
+ * Recursion is safe because the walk cannot loop: a symlink is recorded and
137
+ * skipped, so a cycle in the directory graph (which POSIX forbids anyway) is not
138
+ * reachable. Ordering is imposed later by a global sort, so the traversal order
139
+ * here only has to be deterministic, which sorting the child names provides.
140
+ */
141
+ const collectEntries = (directory, prefix, state) => {
142
+ const names = readDirectoryOrThrow(directory);
143
+ names.sort(comparePaths);
144
+ for (let index = 0; index < names.length; index += 1) {
145
+ const name = names[index];
146
+ if (state.excluded.has(name)) {
147
+ continue;
148
+ }
149
+ const fullPath = join(directory, name);
150
+ const relativePath = prefix.length === 0 ? name : `${prefix}/${name}`;
151
+ const stats = lstatOrThrow(fullPath);
152
+ if (stats.isSymbolicLink()) {
153
+ const target = readLinkOrThrow(fullPath);
154
+ const targetBytes = encodeUtf8Strict(target);
155
+ state.entries.push({
156
+ path: relativePath,
157
+ digest: bytesToHex(createSha256().update(targetBytes).digest()),
158
+ size: targetBytes.length,
159
+ mode: ModeSymlink,
160
+ });
161
+ continue;
162
+ }
163
+ if (stats.isDirectory()) {
164
+ state.entries.push({ path: relativePath, digest: EmptyDigestHex, size: 0, mode: ModeDirectory });
165
+ collectEntries(fullPath, relativePath, state);
166
+ continue;
167
+ }
168
+ if (!stats.isFile()) {
169
+ throw new FingerprintIOError([`${fullPath} is not a regular file, directory or symlink`]);
170
+ }
171
+ const mode = (stats.mode & 0o111) !== 0 ? ModeExecutableFile : ModeFile;
172
+ const digest = fileContentDigest(fullPath, stats.size, state.chunkBytes);
173
+ state.entries.push({ path: relativePath, digest, size: stats.size, mode });
174
+ }
175
+ };
176
+ /**
177
+ * Serialise one entry into its leaf record.
178
+ *
179
+ * `size` is written as a big-endian u64 from its high and low 32-bit halves,
180
+ * which avoids BigInt conversion on the hot path and is exact for every
181
+ * JavaScript number that can be a file size (`Number.isSafeInteger`).
182
+ */
183
+ const buildLeafRecord = (entry) => {
184
+ const pathBytes = encodeUtf8Strict(entry.path);
185
+ const record = new Uint8Array(LeafFixedBytes + pathBytes.length);
186
+ record[0] = LeafPrefix;
187
+ const view = new DataView(record.buffer);
188
+ view.setUint32(PathLengthOffset, pathBytes.length);
189
+ record.set(pathBytes, PathLengthOffset + 4);
190
+ const modeOffset = ModeOffsetBase + pathBytes.length;
191
+ const sizeOffset = SizeOffsetBase + pathBytes.length;
192
+ const digestOffset = DigestOffsetBase + pathBytes.length;
193
+ view.setUint32(modeOffset, entry.mode);
194
+ view.setUint32(sizeOffset, Math.floor(entry.size / Uint32Range));
195
+ view.setUint32(sizeOffset + 4, entry.size % Uint32Range);
196
+ record.set(hexToBytes(entry.digest), digestOffset);
197
+ return record;
198
+ };
199
+ /**
200
+ * Fold sorted leaf digests into a Merkle root.
201
+ *
202
+ * Adjacent pairs are combined bottom-up; an odd node is promoted unchanged to
203
+ * the next level, which is the Bitcoin/RFC 6962 style tree and keeps the fold
204
+ * well-defined for any entry count. The empty tree is `sha256(empty)` rather
205
+ * than a special constant, so the one-entry and zero-entry cases differ by an
206
+ * actual hash rather than by convention.
207
+ */
208
+ const merkleFold = (leaves) => {
209
+ if (leaves.length === 0) {
210
+ return createSha256().digest();
211
+ }
212
+ let level = [];
213
+ for (let index = 0; index < leaves.length; index += 1) {
214
+ level.push(leaves[index]);
215
+ }
216
+ while (level.length > 1) {
217
+ const next = [];
218
+ for (let index = 0; index < level.length; index += 2) {
219
+ if (index + 1 === level.length) {
220
+ next.push(level[index]);
221
+ continue;
222
+ }
223
+ const pair = new Uint8Array(NodeBytes);
224
+ pair[0] = NodePrefix;
225
+ pair.set(level[index], NodeLeftOffset);
226
+ pair.set(level[index + 1], NodeRightOffset);
227
+ next.push(createSha256().update(pair).digest());
228
+ }
229
+ level = next;
230
+ }
231
+ return level[0];
232
+ };
233
+ /**
234
+ * Fingerprint a directory tree.
235
+ *
236
+ * The returned entries are sorted by UTF-8 path bytes and carry the child digest
237
+ * each leaf was built from, so a caller can re-derive the root after changing
238
+ * one file without re-reading the whole tree. The algorithm is fixed to SHA-256
239
+ * in this build: the root composition in `amp.fp/1` is defined in terms of
240
+ * SHA-256, so naming another algorithm here would produce a reference whose
241
+ * verifier cannot exist.
242
+ */
243
+ export const fingerprintTree = async (root, options) => {
244
+ const algorithm = options?.algorithm ?? "sha256";
245
+ if (algorithm !== "sha256") {
246
+ throw new UnsupportedAlgorithm([`tree fingerprints compose with sha256; algorithm "${algorithm}" has no tree backend`]);
247
+ }
248
+ const chunkBytes = resolveChunkBytes(options?.chunkBytes);
249
+ const rootStats = lstatOrThrow(root);
250
+ if (rootStats.isSymbolicLink()) {
251
+ throw new FingerprintIOError([`${root} is a symbolic link; tree fingerprints never follow links`]);
252
+ }
253
+ if (!rootStats.isDirectory()) {
254
+ throw new FingerprintIOError([`${root} is not a directory`]);
255
+ }
256
+ const exclusions = resolveExclusions(options?.exclude);
257
+ const state = { excluded: new Set(exclusions), chunkBytes, entries: [] };
258
+ collectEntries(root, "", state);
259
+ const sorted = state.entries.slice();
260
+ sorted.sort((left, right) => comparePaths(left.path, right.path));
261
+ const leaves = [];
262
+ let totalBytes = 0;
263
+ for (let index = 0; index < sorted.length; index += 1) {
264
+ const record = buildLeafRecord(sorted[index]);
265
+ leaves.push(createSha256().update(record).digest());
266
+ totalBytes += record.byteLength;
267
+ }
268
+ const merkleRoot = merkleFold(leaves);
269
+ const policyDigest = createSha256().update(encodeUtf8Strict(Policy.treeV1)).digest();
270
+ const rootInput = new Uint8Array(RootFixedBytes);
271
+ rootInput[0] = RootPrefix;
272
+ const rootView = new DataView(rootInput.buffer);
273
+ rootView.setUint32(RootCountOffset, Math.floor(sorted.length / Uint32Range));
274
+ rootView.setUint32(RootCountOffset + 4, sorted.length % Uint32Range);
275
+ rootInput.set(merkleRoot, RootMerkleOffset);
276
+ rootInput.set(policyDigest, RootPolicyOffset);
277
+ const rootHex = bytesToHex(createSha256().update(rootInput).digest());
278
+ const excluded = [...exclusions].sort(comparePaths);
279
+ const ref = {
280
+ scheme: SchemeName,
281
+ algorithm,
282
+ kind: "tree",
283
+ policy: Policy.treeV1,
284
+ bytes: totalBytes,
285
+ digest: rootHex,
286
+ };
287
+ return { ref, digest: shortForm(algorithm, rootHex), root: rootHex, entries: sorted, excluded };
288
+ };
@@ -0,0 +1,20 @@
1
+ import type { FingerprintRef } from "./preimage.js";
2
+ /**
3
+ * True when both references name the same value under the same rules.
4
+ *
5
+ * Kind and policy are compared as strings because they are frozen vocabulary;
6
+ * digest comparison is constant-time-ish. `bytes` is deliberately not part of
7
+ * the identity here (RFC 6920 identity is algorithm + value), but `verify`
8
+ * compares it as well.
9
+ */
10
+ export declare const matches: (expected: FingerprintRef, actual: FingerprintRef) => boolean;
11
+ /**
12
+ * Assert that `actual` is the value `expected` names; throw `FingerprintMismatch`
13
+ * otherwise.
14
+ *
15
+ * The message contains both references (algorithm, kind, policy, bytes and hex)
16
+ * plus one line per differing field. A log line that only says "mismatch" cannot
17
+ * be acted on: the reader needs to know whether the policy changed or the bytes
18
+ * did.
19
+ */
20
+ export declare const verify: (expected: FingerprintRef, actual: FingerprintRef) => void;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Reference comparison and verification.
3
+ *
4
+ * Comparing digests alone is the bug this module exists to avoid: the same
5
+ * payload bytes hashed under two policies produce two different digests, so a
6
+ * verifier that only sees hex cannot know which rules to apply. `matches`
7
+ * therefore compares the identity quadruple — algorithm, kind, policy and
8
+ * digest — following RFC 6920 §2 (identity is algorithm + value; presentation
9
+ * fields are ignored) extended with the two fields that decide how the value was
10
+ * computed.
11
+ *
12
+ * `verify` is one step stricter and also compares the declared payload length,
13
+ * mirroring OCI's "compare size before digest" rule: a reference that claims a
14
+ * different length is a different descriptor even when the hash agrees. The
15
+ * length is cheap to compare and shrinks the space an attacker has to search.
16
+ *
17
+ * The hex comparison is length-checked first and then scans the whole string
18
+ * without an early exit, so a mismatch does not reveal the position of the first
19
+ * differing digit through timing. This is not a substitute for a MAC, but it
20
+ * costs nothing and avoids being the weakest link in an otherwise
21
+ * constant-time comparison chain.
22
+ */
23
+ import { FingerprintMismatch } from "./error.js";
24
+ /**
25
+ * Compare two equal-length strings without returning early.
26
+ *
27
+ * Different lengths fail immediately: the length is public (it is the algorithm
28
+ * identity), so no secret leaks, and scanning would need padding to be
29
+ * meaningful anyway.
30
+ */
31
+ const constantTimeEquals = (left, right) => {
32
+ if (left.length !== right.length) {
33
+ return false;
34
+ }
35
+ let difference = 0;
36
+ for (let index = 0; index < left.length; index += 1) {
37
+ difference |= left.charCodeAt(index) ^ right.charCodeAt(index);
38
+ }
39
+ return difference === 0;
40
+ };
41
+ /**
42
+ * Describe a reference for a human reader without re-validating it.
43
+ *
44
+ * `formatRef` cannot be used in the mismatch message: it validates the fields
45
+ * and throws, which would replace the `FingerprintMismatch` the caller is
46
+ * supposed to catch with an unrelated `invalid_ref`.
47
+ */
48
+ const describe = (ref) => `${ref.algorithm}:${ref.kind}:${ref.policy}:${ref.bytes}:${ref.digest}`;
49
+ /**
50
+ * True when both references name the same value under the same rules.
51
+ *
52
+ * Kind and policy are compared as strings because they are frozen vocabulary;
53
+ * digest comparison is constant-time-ish. `bytes` is deliberately not part of
54
+ * the identity here (RFC 6920 identity is algorithm + value), but `verify`
55
+ * compares it as well.
56
+ */
57
+ export const matches = (expected, actual) => {
58
+ if (expected.algorithm !== actual.algorithm) {
59
+ return false;
60
+ }
61
+ if (expected.kind !== actual.kind) {
62
+ return false;
63
+ }
64
+ if (expected.policy !== actual.policy) {
65
+ return false;
66
+ }
67
+ return constantTimeEquals(expected.digest, actual.digest);
68
+ };
69
+ /**
70
+ * Assert that `actual` is the value `expected` names; throw `FingerprintMismatch`
71
+ * otherwise.
72
+ *
73
+ * The message contains both references (algorithm, kind, policy, bytes and hex)
74
+ * plus one line per differing field. A log line that only says "mismatch" cannot
75
+ * be acted on: the reader needs to know whether the policy changed or the bytes
76
+ * did.
77
+ */
78
+ export const verify = (expected, actual) => {
79
+ const problems = [];
80
+ if (expected.algorithm !== actual.algorithm) {
81
+ problems.push(`algorithm differs: expected ${expected.algorithm}, received ${actual.algorithm}`);
82
+ }
83
+ if (expected.kind !== actual.kind) {
84
+ problems.push(`kind differs: expected ${expected.kind}, received ${actual.kind}`);
85
+ }
86
+ if (expected.policy !== actual.policy) {
87
+ problems.push(`policy differs: expected ${expected.policy}, received ${actual.policy}`);
88
+ }
89
+ if (!constantTimeEquals(expected.digest, actual.digest)) {
90
+ problems.push("digest differs");
91
+ }
92
+ if (expected.bytes !== actual.bytes) {
93
+ problems.push(`bytes differs: expected ${expected.bytes}, received ${actual.bytes}`);
94
+ }
95
+ if (problems.length === 0) {
96
+ return;
97
+ }
98
+ throw new FingerprintMismatch([`expected ${describe(expected)} but received ${describe(actual)}`, ...problems]);
99
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Global filesystem adapter.
3
+ *
4
+ * The adapter renames the local `amp_tool_filesystem_*` surface to
5
+ * `amp_tool_globalfs_*` and rewrites the response protocol. It owns no tree,
6
+ * cache or write journal of its own: every call goes through the bound
7
+ * `FilesystemSession`, so the session token, roots, quotas and isolation stay
8
+ * exactly as strong as the local surface. A future multi-root router can sit
9
+ * behind the same interface without changing the wire names.
10
+ */
11
+ import type { FilesystemSession } from "../file/service.js";
12
+ import type { FilesystemService } from "../file/service.js";
13
+ import type { FilesystemToolDefinition } from "../protocol/filesystem.js";
14
+ import type { GlobalFilesystemResponse } from "../protocol/globalFilesystem.js";
15
+ export declare class GlobalFilesystemService {
16
+ private readonly base;
17
+ constructor(base: FilesystemService);
18
+ /**
19
+ * Bind one authenticated session to the global namespace.
20
+ */
21
+ bind(sessionId: string, token: string): GlobalFilesystemSession;
22
+ dispose(sessionId: string): void;
23
+ }
24
+ export declare class GlobalFilesystemSession {
25
+ private readonly base;
26
+ constructor(base: FilesystemSession);
27
+ get sessionId(): string;
28
+ get descriptor(): FilesystemSession["descriptor"];
29
+ tools(): FilesystemToolDefinition[];
30
+ /**
31
+ * Typed delegates keep hook and direct-embedder code identical for the
32
+ * local and global surfaces.
33
+ */
34
+ read: FilesystemSession["read"];
35
+ write: FilesystemSession["write"];
36
+ outline: FilesystemSession["outline"];
37
+ imports: FilesystemSession["imports"];
38
+ exports: FilesystemSession["exports"];
39
+ dependency: FilesystemSession["dependency"];
40
+ ast: FilesystemSession["ast"];
41
+ revision: FilesystemSession["revision"];
42
+ call(name: string, raw: unknown): Promise<GlobalFilesystemResponse>;
43
+ }