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,908 @@
1
+ /**
2
+ * Session registry: identity, lifecycle, capacity and isolated context.
3
+ *
4
+ * A session binds a host-approved agent identity to real root directories, a
5
+ * permission set, a TTL and a private context. The registry is the authority
6
+ * boundary for that record: it mints the one-time credential, verifies it in
7
+ * constant time, serialises every lifecycle transition and persists only the
8
+ * token hash. It never shares mutable state with `runtime/session.ts`, which is
9
+ * the cognitive memory of a turn loop rather than a data-isolation record.
10
+ *
11
+ * All methods are synchronous. That is deliberate: the registry is single
12
+ * threaded, and an async API would invite an `await` between the status check
13
+ * and the state update that lets two callers observe different lifetimes.
14
+ */
15
+ import { realpathSync, statSync } from "node:fs";
16
+ import { isAbsolute } from "node:path";
17
+ import { SessionContexts } from "./context.js";
18
+ import { fail } from "./errors.js";
19
+ import { createSessionId, createSessionToken, hashSessionToken, verifySessionToken } from "./identity.js";
20
+ const DefaultLimits = {
21
+ maxSessions: 256,
22
+ maxRootsPerSession: 16,
23
+ maxContextEntries: 256,
24
+ maxContextBytes: 1024 * 1024,
25
+ maxTokenRotations: 8,
26
+ };
27
+ const DefaultDefaults = {
28
+ ttlMs: 8 * 60 * 60 * 1000,
29
+ idleTtlMs: 30 * 60 * 1000,
30
+ label: "session",
31
+ };
32
+ const DefaultPermissions = {
33
+ read: true,
34
+ write: false,
35
+ create: false,
36
+ remove: false,
37
+ maxReadBytes: 8 * 1024 * 1024,
38
+ maxWriteBytes: 4 * 1024 * 1024,
39
+ maxTreeNodes: 20000,
40
+ maxContextEntries: 256,
41
+ maxContextBytes: 1024 * 1024,
42
+ };
43
+ const ControlCharacters = /[\u0000-\u001f\u007f-\u009f]/;
44
+ const SystemClock = { now: () => new Date() };
45
+ const clone = (value) => structuredClone(value);
46
+ /**
47
+ * Reject lone surrogates before a value reaches a store that binds UTF-8:
48
+ * `JSON.stringify` can escape them, but a SQLite/JSON column cannot preserve
49
+ * them, so a restored record would no longer name the same agent or root.
50
+ */
51
+ const isWellFormed = (value) => {
52
+ for (let index = 0; index < value.length; index += 1) {
53
+ const unit = value.charCodeAt(index);
54
+ if (unit >= 0xd800 && unit <= 0xdbff) {
55
+ const next = index + 1 < value.length ? value.charCodeAt(index + 1) : 0;
56
+ if (next < 0xdc00 || next > 0xdfff) {
57
+ return false;
58
+ }
59
+ index += 1;
60
+ }
61
+ else if (unit >= 0xdc00 && unit <= 0xdfff) {
62
+ return false;
63
+ }
64
+ }
65
+ return true;
66
+ };
67
+ /**
68
+ * Identifiers, labels and metadata are host text: non-blank, no control
69
+ * characters and well-formed Unicode. There is deliberately no length ceiling
70
+ * here; the explicit 128-code-unit ceiling belongs to context namespaces/keys.
71
+ */
72
+ const textIsValid = (value) => typeof (value) === "string" && value.trim().length > 0 && !ControlCharacters.test(value) && isWellFormed(value);
73
+ const requireText = (value) => (textIsValid(value) ? value : fail("invalid_arguments"));
74
+ /**
75
+ * A blank label is a host convenience, not an invalid session: it falls back to
76
+ * the configured default. Other bad types still fail loudly.
77
+ */
78
+ const resolveLabel = (value, fallback) => {
79
+ if (value === (void 0)) {
80
+ return fallback;
81
+ }
82
+ if (typeof (value) === "string" && value.trim().length === 0) {
83
+ return fallback;
84
+ }
85
+ return requireText(value);
86
+ };
87
+ const loadRotationCount = (store, sessionId) => {
88
+ const candidate = store;
89
+ if (typeof (candidate.loadRotations) !== "function") {
90
+ return 0;
91
+ }
92
+ let rotations;
93
+ try {
94
+ rotations = candidate.loadRotations(sessionId);
95
+ }
96
+ catch {
97
+ return fail("store_failure");
98
+ }
99
+ if (rotations === (void 0)) {
100
+ return 0;
101
+ }
102
+ if (!Number.isSafeInteger(rotations) || rotations < 0) {
103
+ return fail("store_failure");
104
+ }
105
+ return rotations;
106
+ };
107
+ const persistRotationCount = (request) => {
108
+ const candidate = request.store;
109
+ if (typeof (candidate.saveRotations) !== "function") {
110
+ return;
111
+ }
112
+ try {
113
+ candidate.saveRotations(request.sessionId, request.rotations);
114
+ }
115
+ catch {
116
+ fail("store_failure");
117
+ }
118
+ };
119
+ /**
120
+ * Best-effort rollback for a rotation whose descriptor save failed. The
121
+ * original failure is more useful than a rollback failure, so this never
122
+ * throws.
123
+ */
124
+ const restoreRotationCount = (request) => {
125
+ try {
126
+ persistRotationCount(request);
127
+ }
128
+ catch {
129
+ return;
130
+ }
131
+ };
132
+ const requirePositive = (value, fallback) => {
133
+ if (value === (void 0)) {
134
+ return fallback;
135
+ }
136
+ if (!Number.isSafeInteger(value) || value < 1) {
137
+ return fail("invalid_arguments");
138
+ }
139
+ return value;
140
+ };
141
+ const requireNonNegative = (value, fallback) => {
142
+ if (value === (void 0)) {
143
+ return fallback;
144
+ }
145
+ if (!Number.isSafeInteger(value) || value < 0) {
146
+ return fail("invalid_arguments");
147
+ }
148
+ return value;
149
+ };
150
+ const requireFlag = (value, fallback) => {
151
+ if (value === (void 0)) {
152
+ return fallback;
153
+ }
154
+ if (typeof (value) !== "boolean") {
155
+ return fail("invalid_arguments");
156
+ }
157
+ return value;
158
+ };
159
+ const parseTime = (value) => {
160
+ const parsed = Date.parse(value);
161
+ return Number.isFinite(parsed) ? parsed : (void 0);
162
+ };
163
+ const MaxDateMs = 8_640_000_000_000_000;
164
+ /**
165
+ * Convert epoch milliseconds to an ISO timestamp. A duration large enough to
166
+ * leave the `Date` range is an argument error, not a `RangeError` that escapes
167
+ * the closed error taxonomy.
168
+ */
169
+ const isoAt = (milliseconds) => {
170
+ if (!Number.isFinite(milliseconds) || milliseconds < -MaxDateMs || milliseconds > MaxDateMs) {
171
+ return fail("invalid_arguments");
172
+ }
173
+ return new Date(milliseconds).toISOString();
174
+ };
175
+ const isDue = (descriptor, nowMs) => {
176
+ const expires = parseTime(descriptor.expiresAt);
177
+ if (expires === (void 0) || nowMs >= expires) {
178
+ return true;
179
+ }
180
+ const idle = parseTime(descriptor.idleExpiresAt);
181
+ return idle === (void 0) || nowMs >= idle;
182
+ };
183
+ const normalizeExclude = (input) => {
184
+ if (input === (void 0)) {
185
+ return [];
186
+ }
187
+ if (!Array.isArray(input)) {
188
+ return fail("invalid_arguments");
189
+ }
190
+ const seen = new Set();
191
+ const excludes = [];
192
+ for (let index = 0; index < input.length; index += 1) {
193
+ const entry = input[index];
194
+ if (typeof (entry) !== "string" || ControlCharacters.test(entry) || !isWellFormed(entry)) {
195
+ return fail("invalid_arguments");
196
+ }
197
+ const normalized = entry
198
+ .trim()
199
+ .replace(/\\/g, "/")
200
+ .replace(/^\.?\//, "")
201
+ .replace(/^\/+/, "")
202
+ .replace(/\/+$/, "");
203
+ if (normalized.length === 0 || seen.has(normalized)) {
204
+ continue;
205
+ }
206
+ seen.add(normalized);
207
+ excludes.push(normalized);
208
+ }
209
+ return excludes;
210
+ };
211
+ const pathIdentity = (value) => (process.platform === "win32" ? value.toLowerCase() : value);
212
+ const normalizeMetadata = (input) => {
213
+ if (input === (void 0)) {
214
+ return {};
215
+ }
216
+ if (input === null || typeof (input) !== "object" || Array.isArray(input)) {
217
+ return fail("invalid_arguments");
218
+ }
219
+ const source = input;
220
+ const keys = Object.keys(source);
221
+ const metadata = {};
222
+ for (let index = 0; index < keys.length; index += 1) {
223
+ const key = keys[index];
224
+ const value = source[key];
225
+ if (key.length === 0 || ControlCharacters.test(key) || !isWellFormed(key) || typeof (value) !== "string" || !isWellFormed(value)) {
226
+ return fail("invalid_arguments");
227
+ }
228
+ metadata[key] = value;
229
+ }
230
+ return metadata;
231
+ };
232
+ const resolvePermissions = (options) => {
233
+ const source = options.input ?? {};
234
+ return {
235
+ read: requireFlag(source.read, DefaultPermissions.read),
236
+ write: requireFlag(source.write, DefaultPermissions.write),
237
+ create: requireFlag(source.create, DefaultPermissions.create),
238
+ remove: requireFlag(source.remove, DefaultPermissions.remove),
239
+ maxReadBytes: requirePositive(source.maxReadBytes, DefaultPermissions.maxReadBytes),
240
+ maxWriteBytes: requirePositive(source.maxWriteBytes, DefaultPermissions.maxWriteBytes),
241
+ maxTreeNodes: requirePositive(source.maxTreeNodes, DefaultPermissions.maxTreeNodes),
242
+ maxContextEntries: Math.min(requirePositive(source.maxContextEntries, DefaultPermissions.maxContextEntries), options.limits.maxContextEntries),
243
+ maxContextBytes: Math.min(requirePositive(source.maxContextBytes, DefaultPermissions.maxContextBytes), options.limits.maxContextBytes),
244
+ };
245
+ };
246
+ export class SessionRegistry {
247
+ context;
248
+ limits;
249
+ defaults;
250
+ store;
251
+ clock;
252
+ records = new Map();
253
+ constructor(options = {}) {
254
+ this.limits = {
255
+ maxSessions: requirePositive(options.limits?.maxSessions, DefaultLimits.maxSessions),
256
+ maxRootsPerSession: requirePositive(options.limits?.maxRootsPerSession, DefaultLimits.maxRootsPerSession),
257
+ maxContextEntries: requirePositive(options.limits?.maxContextEntries, DefaultLimits.maxContextEntries),
258
+ maxContextBytes: requirePositive(options.limits?.maxContextBytes, DefaultLimits.maxContextBytes),
259
+ maxTokenRotations: requireNonNegative(options.limits?.maxTokenRotations, DefaultLimits.maxTokenRotations),
260
+ };
261
+ this.defaults = {
262
+ ttlMs: requirePositive(options.defaults?.ttlMs, DefaultDefaults.ttlMs),
263
+ idleTtlMs: requirePositive(options.defaults?.idleTtlMs, DefaultDefaults.idleTtlMs),
264
+ label: options.defaults?.label === (void 0) ? DefaultDefaults.label : requireText(options.defaults.label),
265
+ };
266
+ this.store = options.store;
267
+ this.clock = options.clock ?? SystemClock;
268
+ this.context = new SessionContexts({
269
+ persistence: options.contextStore,
270
+ clock: this.clock,
271
+ limits: { maxContextEntries: this.limits.maxContextEntries, maxContextBytes: this.limits.maxContextBytes },
272
+ });
273
+ this.restore();
274
+ }
275
+ /**
276
+ * Open a new session. Roots are resolved through `realpathSync` once, at
277
+ * this boundary, so replacing a parent directory later cannot move an
278
+ * already-authorized root. The raw token is returned exactly once.
279
+ */
280
+ open(input) {
281
+ if (input === null || typeof (input) !== "object") {
282
+ return fail("invalid_arguments");
283
+ }
284
+ const agentId = requireText(input.agentId);
285
+ const roots = this.normalizeRoots(input.roots);
286
+ const permissions = resolvePermissions({ input: input.permissions, limits: this.limits });
287
+ const label = resolveLabel(input.label, this.defaults.label);
288
+ const ttlMs = requirePositive(input.ttlMs, this.defaults.ttlMs);
289
+ const idleTtlMs = requirePositive(input.idleTtlMs, this.defaults.idleTtlMs);
290
+ const metadata = normalizeMetadata(input.metadata);
291
+ const parentId = input.parentId === (void 0) ? (void 0) : requireText(input.parentId);
292
+ this.assertCapacity();
293
+ const now = this.clock.now();
294
+ const nowMs = now.getTime();
295
+ const expiresAt = isoAt(nowMs + ttlMs);
296
+ const idleExpiresAt = isoAt(Math.min(nowMs + idleTtlMs, nowMs + ttlMs));
297
+ const sessionId = createSessionId();
298
+ const token = createSessionToken();
299
+ const tokenHash = hashSessionToken(token);
300
+ const descriptor = {
301
+ id: sessionId,
302
+ agentId,
303
+ label,
304
+ status: "active",
305
+ roots,
306
+ permissions,
307
+ createdAt: now.toISOString(),
308
+ expiresAt,
309
+ idleExpiresAt,
310
+ revision: 0,
311
+ ...(parentId === (void 0) ? {} : { parentId }),
312
+ metadata,
313
+ };
314
+ this.persist(descriptor, tokenHash);
315
+ this.records.set(sessionId, { descriptor: clone(descriptor), tokenHash, rotations: 0, idleTtlMs });
316
+ return { descriptor: clone(descriptor), credential: { sessionId, token } };
317
+ }
318
+ /**
319
+ * Verify a bearer token and refresh the idle deadline. The absolute deadline
320
+ * is never extended; a successful call advances `revision` and is persisted.
321
+ */
322
+ authenticate(sessionId, token) {
323
+ const record = this.require(sessionId);
324
+ const now = this.clock.now();
325
+ const nowMs = now.getTime();
326
+ if (record.descriptor.status === "revoked") {
327
+ return fail("session_revoked");
328
+ }
329
+ if (record.descriptor.status === "expired") {
330
+ return fail("session_expired");
331
+ }
332
+ if (isDue(record.descriptor, nowMs)) {
333
+ this.markExpired(record);
334
+ return fail("session_expired");
335
+ }
336
+ if (record.descriptor.status === "suspended") {
337
+ return fail("session_suspended");
338
+ }
339
+ const storedHash = record.tokenHash;
340
+ if (storedHash === (void 0) || !verifySessionToken(token, storedHash)) {
341
+ return fail("invalid_identity");
342
+ }
343
+ const expiresMs = parseTime(record.descriptor.expiresAt);
344
+ const idleMs = expiresMs === (void 0) ? nowMs : Math.min(nowMs + record.idleTtlMs, expiresMs);
345
+ record.descriptor = {
346
+ ...record.descriptor,
347
+ idleExpiresAt: isoAt(idleMs),
348
+ revision: record.descriptor.revision + 1,
349
+ };
350
+ this.saveRecord(record);
351
+ return { descriptor: clone(record.descriptor), tokenHash: storedHash };
352
+ }
353
+ /**
354
+ * Host-side descriptor lookup. It is safe to call for an expired or revoked
355
+ * session: the terminal status is returned for audit rather than revived.
356
+ * `authenticate` is the operation that refuses terminal sessions.
357
+ */
358
+ get(sessionId) {
359
+ const record = this.require(sessionId);
360
+ this.expireIfDue(record, this.clock.now().getTime());
361
+ return clone(record.descriptor);
362
+ }
363
+ /**
364
+ * List descriptors, optionally filtered to one agent. Terminal records are
365
+ * included; a host that needs only live sessions filters on `status`.
366
+ */
367
+ list(agentId) {
368
+ const records = [...this.records.values()];
369
+ const descriptors = [];
370
+ for (let index = 0; index < records.length; index += 1) {
371
+ const descriptor = records[index].descriptor;
372
+ if (agentId !== (void 0) && descriptor.agentId !== agentId) {
373
+ continue;
374
+ }
375
+ descriptors.push(clone(descriptor));
376
+ }
377
+ descriptors.sort((left, right) => {
378
+ if (left.createdAt === right.createdAt) {
379
+ return 0;
380
+ }
381
+ return left.createdAt < right.createdAt ? -1 : 1;
382
+ });
383
+ return descriptors;
384
+ }
385
+ /**
386
+ * Diagnostics summary for one session. Terminal sessions stay inspectable.
387
+ */
388
+ summary(sessionId) {
389
+ const record = this.require(sessionId);
390
+ const now = this.clock.now();
391
+ this.expireIfDue(record, now.getTime());
392
+ const descriptor = record.descriptor;
393
+ const expiresMs = parseTime(descriptor.expiresAt);
394
+ const live = descriptor.status === "active" || descriptor.status === "suspended";
395
+ const remainingMs = live && expiresMs !== (void 0) ? Math.max(0, expiresMs - now.getTime()) : 0;
396
+ const roots = descriptor.roots.map((root) => ({
397
+ id: root.id,
398
+ writable: root.writable,
399
+ }));
400
+ return {
401
+ id: descriptor.id,
402
+ agentId: descriptor.agentId,
403
+ label: descriptor.label,
404
+ status: descriptor.status,
405
+ roots,
406
+ createdAt: descriptor.createdAt,
407
+ expiresAt: descriptor.expiresAt,
408
+ remainingMs,
409
+ revision: descriptor.revision,
410
+ };
411
+ }
412
+ /**
413
+ * Refresh the idle deadline for an active session without checking a token.
414
+ * Host-only keepalive; a caller that needs the token path uses
415
+ * `authenticate`.
416
+ */
417
+ touch(sessionId) {
418
+ const record = this.require(sessionId);
419
+ const now = this.clock.now();
420
+ this.expireIfDue(record, now.getTime());
421
+ if (record.descriptor.status === "revoked") {
422
+ return fail("session_revoked");
423
+ }
424
+ if (record.descriptor.status === "expired") {
425
+ return fail("session_expired");
426
+ }
427
+ if (record.descriptor.status === "suspended") {
428
+ return fail("session_suspended");
429
+ }
430
+ const expiresMs = parseTime(record.descriptor.expiresAt);
431
+ if (expiresMs === (void 0)) {
432
+ this.markExpired(record);
433
+ return fail("session_expired");
434
+ }
435
+ record.descriptor = {
436
+ ...record.descriptor,
437
+ idleExpiresAt: isoAt(Math.min(now.getTime() + record.idleTtlMs, expiresMs)),
438
+ revision: record.descriptor.revision + 1,
439
+ };
440
+ this.saveRecord(record);
441
+ return clone(record.descriptor);
442
+ }
443
+ /**
444
+ * Suspend an active session. Suspending an already suspended session is
445
+ * idempotent; terminal sessions are never revived.
446
+ */
447
+ suspend(sessionId) {
448
+ const record = this.require(sessionId);
449
+ this.expireIfDue(record, this.clock.now().getTime());
450
+ if (record.descriptor.status === "revoked") {
451
+ return fail("session_revoked");
452
+ }
453
+ if (record.descriptor.status === "expired") {
454
+ return fail("session_expired");
455
+ }
456
+ if (record.descriptor.status === "suspended") {
457
+ return clone(record.descriptor);
458
+ }
459
+ record.descriptor = { ...record.descriptor, status: "suspended", revision: record.descriptor.revision + 1 };
460
+ this.saveRecord(record);
461
+ return clone(record.descriptor);
462
+ }
463
+ /**
464
+ * Resume a suspended session. Only the absolute deadline blocks a resume;
465
+ * the idle deadline is refreshed by this call, so a host that explicitly
466
+ * reactivates a session does not have to race the idle timer.
467
+ */
468
+ resume(sessionId) {
469
+ const record = this.require(sessionId);
470
+ const now = this.clock.now();
471
+ if (record.descriptor.status === "revoked") {
472
+ return fail("session_revoked");
473
+ }
474
+ if (record.descriptor.status === "expired") {
475
+ return fail("session_expired");
476
+ }
477
+ if (record.descriptor.status !== "suspended") {
478
+ return fail("session_forbidden");
479
+ }
480
+ const expiresMs = parseTime(record.descriptor.expiresAt);
481
+ if (expiresMs === (void 0) || now.getTime() >= expiresMs) {
482
+ this.markExpired(record);
483
+ return fail("session_expired");
484
+ }
485
+ record.descriptor = {
486
+ ...record.descriptor,
487
+ status: "active",
488
+ idleExpiresAt: isoAt(Math.min(now.getTime() + record.idleTtlMs, expiresMs)),
489
+ revision: record.descriptor.revision + 1,
490
+ };
491
+ this.saveRecord(record);
492
+ return clone(record.descriptor);
493
+ }
494
+ /**
495
+ * Revoke a session permanently. The descriptor and context are retained for
496
+ * audit, but the stored secret is replaced with an empty hash, so a restored
497
+ * registry cannot authenticate the old token either. `authenticate` checks
498
+ * `revoked` before the token, which makes the failure unambiguous. A session
499
+ * whose deadline has already passed is reported as `session_expired`; the
500
+ * host uses `close` to remove it.
501
+ */
502
+ revoke(sessionId) {
503
+ const record = this.require(sessionId);
504
+ this.expireIfDue(record, this.clock.now().getTime());
505
+ if (record.descriptor.status === "revoked") {
506
+ return clone(record.descriptor);
507
+ }
508
+ if (record.descriptor.status === "expired") {
509
+ return fail("session_expired");
510
+ }
511
+ record.descriptor = { ...record.descriptor, status: "revoked", revision: record.descriptor.revision + 1 };
512
+ record.tokenHash = (void 0);
513
+ this.saveRecord(record);
514
+ return clone(record.descriptor);
515
+ }
516
+ /**
517
+ * Replace the bearer token, invalidating the previous one immediately.
518
+ * Active and suspended sessions may rotate, up to `maxTokenRotations`. When
519
+ * the store implements {@link SessionRotationStore}, the counter is persisted
520
+ * before the descriptor so a restart keeps the same budget.
521
+ */
522
+ rotate(sessionId) {
523
+ const record = this.require(sessionId);
524
+ this.expireIfDue(record, this.clock.now().getTime());
525
+ if (record.descriptor.status === "revoked") {
526
+ return fail("session_revoked");
527
+ }
528
+ if (record.descriptor.status === "expired") {
529
+ return fail("session_expired");
530
+ }
531
+ if (record.rotations >= this.limits.maxTokenRotations) {
532
+ return fail("session_forbidden");
533
+ }
534
+ const previousHash = record.tokenHash;
535
+ const previousRevision = record.descriptor.revision;
536
+ const previousRotations = record.rotations;
537
+ const token = createSessionToken();
538
+ const tokenHash = hashSessionToken(token);
539
+ record.tokenHash = tokenHash;
540
+ record.rotations = previousRotations + 1;
541
+ record.descriptor = { ...record.descriptor, revision: record.descriptor.revision + 1 };
542
+ const store = this.store;
543
+ try {
544
+ if (store !== (void 0)) {
545
+ persistRotationCount({ store, sessionId: record.descriptor.id, rotations: record.rotations });
546
+ }
547
+ this.saveRecord(record);
548
+ }
549
+ catch (error) {
550
+ if (store !== (void 0)) {
551
+ restoreRotationCount({ store, sessionId: record.descriptor.id, rotations: previousRotations });
552
+ }
553
+ record.tokenHash = previousHash;
554
+ record.rotations = previousRotations;
555
+ record.descriptor = { ...record.descriptor, revision: previousRevision };
556
+ throw error;
557
+ }
558
+ return { sessionId: record.descriptor.id, token };
559
+ }
560
+ /**
561
+ * Fork an active session. The child copies roots, permissions and context
562
+ * by value, gets a fresh id and token, and cannot outlive the absolute
563
+ * deadline of its parent.
564
+ */
565
+ fork(parentId, input = {}) {
566
+ const parent = this.require(parentId);
567
+ const now = this.clock.now();
568
+ this.expireIfDue(parent, now.getTime());
569
+ if (parent.descriptor.status === "revoked") {
570
+ return fail("session_revoked");
571
+ }
572
+ if (parent.descriptor.status === "expired") {
573
+ return fail("session_expired");
574
+ }
575
+ if (parent.descriptor.status !== "active") {
576
+ return fail("session_suspended");
577
+ }
578
+ if (input === null || typeof (input) !== "object") {
579
+ return fail("invalid_arguments");
580
+ }
581
+ const ttlMs = requirePositive(input.ttlMs, this.defaults.ttlMs);
582
+ const label = resolveLabel(input.label, this.defaults.label);
583
+ const metadata = input.metadata === (void 0) ? clone(parent.descriptor.metadata) : normalizeMetadata(input.metadata);
584
+ this.assertCapacity();
585
+ const nowMs = now.getTime();
586
+ const parentExpiresMs = parseTime(parent.descriptor.expiresAt);
587
+ const expiresMs = parentExpiresMs === (void 0) ? nowMs + ttlMs : Math.min(nowMs + ttlMs, parentExpiresMs);
588
+ if (expiresMs <= nowMs) {
589
+ this.markExpired(parent);
590
+ return fail("session_expired");
591
+ }
592
+ const idleTtlMs = parent.idleTtlMs;
593
+ const sessionId = createSessionId();
594
+ const token = createSessionToken();
595
+ const tokenHash = hashSessionToken(token);
596
+ const descriptor = {
597
+ id: sessionId,
598
+ agentId: parent.descriptor.agentId,
599
+ label,
600
+ status: "active",
601
+ roots: clone(parent.descriptor.roots),
602
+ permissions: clone(parent.descriptor.permissions),
603
+ createdAt: now.toISOString(),
604
+ expiresAt: isoAt(expiresMs),
605
+ idleExpiresAt: isoAt(Math.min(nowMs + idleTtlMs, expiresMs)),
606
+ revision: 0,
607
+ parentId: parent.descriptor.id,
608
+ metadata,
609
+ };
610
+ this.context.fork(parent.descriptor.id, sessionId);
611
+ try {
612
+ this.persist(descriptor, tokenHash);
613
+ }
614
+ catch (error) {
615
+ this.discardContext(sessionId);
616
+ throw error;
617
+ }
618
+ this.records.set(sessionId, { descriptor: clone(descriptor), tokenHash, rotations: 0, idleTtlMs });
619
+ return { descriptor: clone(descriptor), credential: { sessionId, token } };
620
+ }
621
+ /**
622
+ * Lazily expire every active or suspended session whose absolute or idle
623
+ * deadline has passed. Returns the number of transitions performed.
624
+ */
625
+ sweep(now = this.clock.now()) {
626
+ const nowMs = now.getTime();
627
+ const records = [...this.records.values()];
628
+ let expired = 0;
629
+ for (let index = 0; index < records.length; index += 1) {
630
+ const record = records[index];
631
+ if (record.descriptor.status !== "active" && record.descriptor.status !== "suspended") {
632
+ continue;
633
+ }
634
+ if (!isDue(record.descriptor, nowMs)) {
635
+ continue;
636
+ }
637
+ this.markExpired(record);
638
+ expired += 1;
639
+ }
640
+ return expired;
641
+ }
642
+ /**
643
+ * Revoke and forget a session: descriptor index, context and persisted row
644
+ * are removed. `revoke` is the audit-friendly variant that keeps the
645
+ * descriptor; `close` is the end-of-life cleanup.
646
+ */
647
+ close(sessionId) {
648
+ const record = this.require(sessionId);
649
+ if (record.descriptor.status !== "revoked") {
650
+ record.descriptor = { ...record.descriptor, status: "revoked", revision: record.descriptor.revision + 1 };
651
+ record.tokenHash = (void 0);
652
+ this.saveRecord(record);
653
+ }
654
+ this.context.remove(record.descriptor.id);
655
+ this.deletePersisted(record.descriptor.id);
656
+ this.records.delete(record.descriptor.id);
657
+ }
658
+ /**
659
+ * Load persisted descriptors and token hashes at construction. Terminal
660
+ * statuses are preserved exactly. The descriptor carries only the idle
661
+ * deadline, not the configured idle window, so the window is recovered from
662
+ * `idleExpiresAt - createdAt` and capped by the current registry default; a
663
+ * persisted store that exceeds `maxSessions` is rejected rather than
664
+ * silently breaking the capacity invariant.
665
+ */
666
+ restore() {
667
+ const store = this.store;
668
+ if (store === (void 0) || typeof (store.list) !== "function") {
669
+ return;
670
+ }
671
+ let listed;
672
+ try {
673
+ listed = store.list();
674
+ }
675
+ catch {
676
+ return fail("store_failure");
677
+ }
678
+ if (!Array.isArray(listed)) {
679
+ return fail("store_failure");
680
+ }
681
+ for (let index = 0; index < listed.length; index += 1) {
682
+ const descriptor = listed[index];
683
+ if (!this.storedDescriptorIsValid(descriptor)) {
684
+ return fail("store_failure");
685
+ }
686
+ let secret;
687
+ try {
688
+ secret = typeof (store.loadSecret) === "function" ? store.loadSecret(descriptor.id) : (void 0);
689
+ }
690
+ catch {
691
+ return fail("store_failure");
692
+ }
693
+ const createdMs = parseTime(descriptor.createdAt);
694
+ const idleExpiresMs = parseTime(descriptor.idleExpiresAt);
695
+ const idleWindow = createdMs === (void 0) || idleExpiresMs === (void 0) ? 0 : idleExpiresMs - createdMs;
696
+ this.records.set(descriptor.id, {
697
+ descriptor: clone(descriptor),
698
+ tokenHash: typeof (secret) === "string" && secret.length > 0 ? secret : (void 0),
699
+ rotations: loadRotationCount(store, descriptor.id),
700
+ idleTtlMs: idleWindow > 0 ? Math.min(this.defaults.idleTtlMs, idleWindow) : this.defaults.idleTtlMs,
701
+ });
702
+ }
703
+ if (this.records.size > this.limits.maxSessions) {
704
+ return fail("session_capacity");
705
+ }
706
+ }
707
+ storedDescriptorIsValid(descriptor) {
708
+ try {
709
+ if (descriptor === null || typeof (descriptor) !== "object" || Array.isArray(descriptor)) {
710
+ return false;
711
+ }
712
+ const status = descriptor.status;
713
+ if (!textIsValid(descriptor.id) ||
714
+ !textIsValid(descriptor.agentId) ||
715
+ !textIsValid(descriptor.label) ||
716
+ (status !== "active" && status !== "suspended" && status !== "revoked" && status !== "expired") ||
717
+ !Number.isSafeInteger(descriptor.revision) ||
718
+ descriptor.revision < 0) {
719
+ return false;
720
+ }
721
+ const created = parseTime(descriptor.createdAt);
722
+ const expires = parseTime(descriptor.expiresAt);
723
+ const idleExpires = parseTime(descriptor.idleExpiresAt);
724
+ if (created === (void 0) || expires === (void 0) || idleExpires === (void 0) || expires < created || idleExpires > expires) {
725
+ return false;
726
+ }
727
+ if (descriptor.parentId !== (void 0) && !textIsValid(descriptor.parentId)) {
728
+ return false;
729
+ }
730
+ if (!Array.isArray(descriptor.roots) || descriptor.roots.length === 0 || descriptor.roots.length > this.limits.maxRootsPerSession) {
731
+ return false;
732
+ }
733
+ const rootIds = new Set();
734
+ const rootPaths = new Set();
735
+ for (let index = 0; index < descriptor.roots.length; index += 1) {
736
+ const root = descriptor.roots[index];
737
+ if (root === null ||
738
+ typeof (root) !== "object" ||
739
+ !textIsValid(root.id) ||
740
+ rootIds.has(root.id) ||
741
+ typeof (root.path) !== "string" ||
742
+ !isAbsolute(root.path) ||
743
+ typeof (root.writable) !== "boolean" ||
744
+ !Array.isArray(root.exclude) ||
745
+ root.exclude.some((entry) => typeof (entry) !== "string" || ControlCharacters.test(entry) || !isWellFormed(entry))) {
746
+ return false;
747
+ }
748
+ let resolved;
749
+ if (!statSync(root.path).isDirectory()) {
750
+ return false;
751
+ }
752
+ resolved = realpathSync(root.path);
753
+ if (pathIdentity(resolved) !== pathIdentity(root.path) || rootPaths.has(pathIdentity(resolved))) {
754
+ return false;
755
+ }
756
+ rootIds.add(root.id);
757
+ rootPaths.add(pathIdentity(resolved));
758
+ }
759
+ const permissions = descriptor.permissions;
760
+ if (permissions === null || typeof (permissions) !== "object" || Array.isArray(permissions)) {
761
+ return false;
762
+ }
763
+ const flags = [permissions.read, permissions.write, permissions.create, permissions.remove];
764
+ if (flags.some((flag) => typeof (flag) !== "boolean")) {
765
+ return false;
766
+ }
767
+ const permissionLimits = [
768
+ permissions.maxReadBytes,
769
+ permissions.maxWriteBytes,
770
+ permissions.maxTreeNodes,
771
+ permissions.maxContextEntries,
772
+ permissions.maxContextBytes,
773
+ ];
774
+ if (permissionLimits.some((limit) => !Number.isSafeInteger(limit) || limit < 1)) {
775
+ return false;
776
+ }
777
+ if (permissions.maxContextEntries > this.limits.maxContextEntries || permissions.maxContextBytes > this.limits.maxContextBytes) {
778
+ return false;
779
+ }
780
+ const metadata = descriptor.metadata;
781
+ if (metadata === null || typeof (metadata) !== "object" || Array.isArray(metadata)) {
782
+ return false;
783
+ }
784
+ return Object.entries(metadata).every(([key, value]) => key.length > 0 && !ControlCharacters.test(key) && isWellFormed(key) && typeof (value) === "string" && isWellFormed(value));
785
+ }
786
+ catch {
787
+ return false;
788
+ }
789
+ }
790
+ normalizeRoots(input) {
791
+ if (!Array.isArray(input) || input.length === 0 || input.length > this.limits.maxRootsPerSession) {
792
+ return fail("invalid_arguments");
793
+ }
794
+ const seen = new Set();
795
+ const seenPaths = new Set();
796
+ const roots = [];
797
+ for (let index = 0; index < input.length; index += 1) {
798
+ const root = input[index];
799
+ if (root === null || typeof (root) !== "object") {
800
+ return fail("invalid_arguments");
801
+ }
802
+ const id = requireText(root.id);
803
+ if (seen.has(id)) {
804
+ return fail("invalid_arguments");
805
+ }
806
+ seen.add(id);
807
+ const path = root.path;
808
+ if (typeof (path) !== "string" || path.length === 0 || !isAbsolute(path)) {
809
+ return fail("invalid_arguments");
810
+ }
811
+ let directory;
812
+ try {
813
+ directory = statSync(path).isDirectory();
814
+ }
815
+ catch {
816
+ return fail("invalid_arguments");
817
+ }
818
+ if (!directory) {
819
+ return fail("invalid_arguments");
820
+ }
821
+ let resolved;
822
+ try {
823
+ resolved = realpathSync(path);
824
+ }
825
+ catch {
826
+ return fail("invalid_arguments");
827
+ }
828
+ const identity = pathIdentity(resolved);
829
+ if (seenPaths.has(identity)) {
830
+ return fail("invalid_arguments");
831
+ }
832
+ seenPaths.add(identity);
833
+ roots.push({ id, path: resolved, writable: root.writable === true, exclude: normalizeExclude(root.exclude) });
834
+ }
835
+ return roots;
836
+ }
837
+ /**
838
+ * Capacity counts retained descriptors, including terminal records kept
839
+ * for audit. `close` is the operation that frees a slot.
840
+ */
841
+ assertCapacity() {
842
+ if (this.records.size >= this.limits.maxSessions) {
843
+ fail("session_capacity");
844
+ }
845
+ }
846
+ require(sessionId) {
847
+ if (typeof (sessionId) !== "string" || sessionId.length === 0) {
848
+ return fail("session_not_found");
849
+ }
850
+ const record = this.records.get(sessionId);
851
+ return record === (void 0) ? fail("session_not_found") : record;
852
+ }
853
+ expireIfDue(record, nowMs) {
854
+ if (record.descriptor.status !== "active" && record.descriptor.status !== "suspended") {
855
+ return;
856
+ }
857
+ if (isDue(record.descriptor, nowMs)) {
858
+ this.markExpired(record);
859
+ }
860
+ }
861
+ markExpired(record) {
862
+ if (record.descriptor.status === "expired") {
863
+ return;
864
+ }
865
+ record.descriptor = { ...record.descriptor, status: "expired", revision: record.descriptor.revision + 1 };
866
+ this.saveRecord(record);
867
+ }
868
+ saveRecord(record) {
869
+ this.persist(record.descriptor, record.tokenHash ?? "");
870
+ }
871
+ persist(descriptor, tokenHash) {
872
+ const store = this.store;
873
+ if (store === (void 0)) {
874
+ return;
875
+ }
876
+ try {
877
+ store.save(clone(descriptor), tokenHash);
878
+ }
879
+ catch {
880
+ fail("store_failure");
881
+ }
882
+ }
883
+ deletePersisted(sessionId) {
884
+ const store = this.store;
885
+ if (store === (void 0)) {
886
+ return;
887
+ }
888
+ try {
889
+ store.delete(sessionId);
890
+ }
891
+ catch {
892
+ fail("store_failure");
893
+ }
894
+ }
895
+ /**
896
+ * Best-effort rollback for a fork whose descriptor could not be persisted.
897
+ * The original store error is more useful than a cleanup error, so this
898
+ * never throws.
899
+ */
900
+ discardContext(sessionId) {
901
+ try {
902
+ this.context.remove(sessionId);
903
+ }
904
+ catch {
905
+ return;
906
+ }
907
+ }
908
+ }