@bevel-software/platform-core-backend 0.28.1 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/agent-guide/access-control.md +15 -0
  2. package/agent-guide/skills.md +8 -0
  3. package/dist/core/catalog-revision.d.ts.map +1 -1
  4. package/dist/core/catalog-revision.js +4 -2
  5. package/dist/core/catalog-revision.js.map +1 -1
  6. package/dist/core/compose-embed.d.ts +35 -0
  7. package/dist/core/compose-embed.d.ts.map +1 -0
  8. package/dist/core/compose-embed.js +14 -0
  9. package/dist/core/compose-embed.js.map +1 -0
  10. package/dist/core/core-ports.d.ts +10 -0
  11. package/dist/core/core-ports.d.ts.map +1 -1
  12. package/dist/core/core-ports.js.map +1 -1
  13. package/dist/core/create-core-server.d.ts.map +1 -1
  14. package/dist/core/create-core-server.js +7 -1
  15. package/dist/core/create-core-server.js.map +1 -1
  16. package/dist/core/create-core-services.d.ts +1 -1
  17. package/dist/core/create-core-services.d.ts.map +1 -1
  18. package/dist/core/create-core-services.js +25 -14
  19. package/dist/core/create-core-services.js.map +1 -1
  20. package/dist/core/lifecycle.d.ts +11 -6
  21. package/dist/core/lifecycle.d.ts.map +1 -1
  22. package/dist/core/lifecycle.js +13 -6
  23. package/dist/core/lifecycle.js.map +1 -1
  24. package/dist/modules/access/access-control.service.d.ts +36 -14
  25. package/dist/modules/access/access-control.service.d.ts.map +1 -1
  26. package/dist/modules/access/access-control.service.js +145 -43
  27. package/dist/modules/access/access-control.service.js.map +1 -1
  28. package/dist/modules/auth/index.d.ts +15 -0
  29. package/dist/modules/auth/index.d.ts.map +1 -0
  30. package/dist/modules/auth/index.js +20 -0
  31. package/dist/modules/auth/index.js.map +1 -0
  32. package/dist/modules/embed/embed.interface.d.ts +22 -0
  33. package/dist/modules/embed/embed.interface.d.ts.map +1 -1
  34. package/dist/modules/embed/embed.service.d.ts +28 -14
  35. package/dist/modules/embed/embed.service.d.ts.map +1 -1
  36. package/dist/modules/embed/embed.service.js +38 -17
  37. package/dist/modules/embed/embed.service.js.map +1 -1
  38. package/dist/modules/embed/embed.tools.d.ts.map +1 -1
  39. package/dist/modules/embed/embed.tools.js +10 -2
  40. package/dist/modules/embed/embed.tools.js.map +1 -1
  41. package/dist/modules/kb-fs/index.d.ts +7 -0
  42. package/dist/modules/kb-fs/index.d.ts.map +1 -0
  43. package/dist/modules/kb-fs/index.js +2 -0
  44. package/dist/modules/kb-fs/index.js.map +1 -0
  45. package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
  46. package/dist/modules/plugins/join-request-jobs.service.js +43 -8
  47. package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
  48. package/dist/modules/skills/skills.contract.d.ts.map +1 -1
  49. package/dist/modules/skills/skills.tools.d.ts +8 -1
  50. package/dist/modules/skills/skills.tools.d.ts.map +1 -1
  51. package/dist/modules/skills/skills.tools.js +115 -11
  52. package/dist/modules/skills/skills.tools.js.map +1 -1
  53. package/dist/modules/tool-helpers/default-branch-write.d.ts +69 -0
  54. package/dist/modules/tool-helpers/default-branch-write.d.ts.map +1 -0
  55. package/dist/modules/tool-helpers/default-branch-write.js +63 -0
  56. package/dist/modules/tool-helpers/default-branch-write.js.map +1 -0
  57. package/dist/modules/tool-helpers/index.d.ts +1 -0
  58. package/dist/modules/tool-helpers/index.d.ts.map +1 -1
  59. package/dist/modules/tool-helpers/index.js +1 -0
  60. package/dist/modules/tool-helpers/index.js.map +1 -1
  61. package/dist/modules/workflow/file-lock.service.d.ts +27 -5
  62. package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
  63. package/dist/modules/workflow/file-lock.service.js +70 -18
  64. package/dist/modules/workflow/file-lock.service.js.map +1 -1
  65. package/dist/modules/workflow/git/git.service.d.ts +13 -0
  66. package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
  67. package/dist/modules/workflow/git/git.service.js +24 -0
  68. package/dist/modules/workflow/git/git.service.js.map +1 -1
  69. package/dist/modules/workflow/index.d.ts +8 -0
  70. package/dist/modules/workflow/index.d.ts.map +1 -0
  71. package/dist/modules/workflow/index.js +8 -0
  72. package/dist/modules/workflow/index.js.map +1 -0
  73. package/dist/modules/workflow/pending-commits.service.d.ts +2 -17
  74. package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
  75. package/dist/modules/workflow/pending-commits.service.js +4 -24
  76. package/dist/modules/workflow/pending-commits.service.js.map +1 -1
  77. package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
  78. package/dist/modules/workflow/workflow.routes.js +20 -1
  79. package/dist/modules/workflow/workflow.routes.js.map +1 -1
  80. package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
  81. package/dist/modules/workflow/workflow.service.js +5 -3
  82. package/dist/modules/workflow/workflow.service.js.map +1 -1
  83. package/dist/modules/workspace/index.d.ts +10 -0
  84. package/dist/modules/workspace/index.d.ts.map +1 -0
  85. package/dist/modules/workspace/index.js +10 -0
  86. package/dist/modules/workspace/index.js.map +1 -0
  87. package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
  88. package/dist/modules/workspace/workspace.tools.js +106 -20
  89. package/dist/modules/workspace/workspace.tools.js.map +1 -1
  90. package/dist/shared/workspace-id.d.ts +17 -0
  91. package/dist/shared/workspace-id.d.ts.map +1 -1
  92. package/dist/shared/workspace-id.js +24 -0
  93. package/dist/shared/workspace-id.js.map +1 -1
  94. package/mcp-app/page.html +142 -8
  95. package/package.json +3 -3
  96. package/src/core/__tests__/compose-embed.test.ts +65 -0
  97. package/src/core/__tests__/lifecycle.test.ts +29 -26
  98. package/src/core/catalog-revision.ts +4 -2
  99. package/src/core/compose-embed.ts +50 -0
  100. package/src/core/core-ports.ts +10 -0
  101. package/src/core/create-core-server.ts +7 -1
  102. package/src/core/create-core-services.ts +27 -21
  103. package/src/core/lifecycle.ts +24 -12
  104. package/src/modules/access/__tests__/access-control.atref-cache.test.ts +303 -25
  105. package/src/modules/access/access-control.service.ts +162 -46
  106. package/src/modules/auth/index.ts +29 -0
  107. package/src/modules/embed/__tests__/embed.service.test.ts +76 -3
  108. package/src/modules/embed/__tests__/embed.tools.test.ts +29 -0
  109. package/src/modules/embed/embed.interface.ts +24 -0
  110. package/src/modules/embed/embed.service.ts +44 -19
  111. package/src/modules/embed/embed.tools.ts +10 -2
  112. package/src/modules/kb-fs/index.ts +6 -0
  113. package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +73 -6
  114. package/src/modules/plugins/join-request-jobs.service.ts +45 -8
  115. package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
  116. package/src/modules/skills/skills.contract.ts +4 -0
  117. package/src/modules/skills/skills.tools.ts +120 -10
  118. package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +581 -0
  119. package/src/modules/tool-helpers/default-branch-write.ts +90 -0
  120. package/src/modules/tool-helpers/index.ts +5 -0
  121. package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +36 -2
  122. package/src/modules/workflow/__tests__/fake-file-lock-db.ts +13 -2
  123. package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +168 -1
  124. package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +102 -6
  125. package/src/modules/workflow/file-lock.service.ts +79 -18
  126. package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +42 -0
  127. package/src/modules/workflow/git/git.service.ts +23 -0
  128. package/src/modules/workflow/index.ts +7 -0
  129. package/src/modules/workflow/pending-commits.service.ts +4 -23
  130. package/src/modules/workflow/workflow.routes.ts +24 -1
  131. package/src/modules/workflow/workflow.service.ts +3 -2
  132. package/src/modules/workspace/__tests__/workspace.tools.test.ts +21 -11
  133. package/src/modules/workspace/index.ts +14 -0
  134. package/src/modules/workspace/workspace.tools.ts +120 -20
  135. package/src/shared/workspace-id.ts +24 -0
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -379,7 +379,7 @@ async function releaseCore(deps, remaining, log) {
379
379
  // server is closed (or the tenant is no longer routed to), so this is the
380
380
  // earliest point the interval is dead weight. Synchronous and unfailing
381
381
  // — it just clears an interval — so it needs no budget of its own.
382
- deps.backgroundJobs?.stopSweeping();
382
+ deps.pluginJoinRequestJobs?.stopSweeping();
383
383
  // And the upload store's sweep, for the same reason and in the same breath:
384
384
  // synchronous, and it only clears an interval and tells a sweep already
385
385
  // running to stop deleting.
@@ -395,11 +395,18 @@ async function releaseCore(deps, remaining, log) {
395
395
  // Clearing the interval stops future ticks; it does nothing to a job a
396
396
  // tick already started, which holds a claim it heartbeats through the
397
397
  // pool and is mid-clone or mid-push. Awaited here, in the budget: a job
398
- // that finishes releases or marks its row; one that cannot in time is
399
- // killed with the process and its claim goes stale for the next sweep
400
- // — which is the recovery every crash already gets.
401
- if (deps.backgroundJobs) {
402
- await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
398
+ // that finishes releases or marks its row. One that cannot in time is
399
+ // NOT cancelled — the bounded wait only stops waiting — and what becomes
400
+ // of it depends on who is stopping: a process shutting down takes it
401
+ // along; a tenant host evicting one graph ends the pool under it, which
402
+ // cancels nothing already running — a clone or push in flight finishes
403
+ // on its own — but its next heartbeat or database write fails, so from
404
+ // there the job records nothing and stops. Either way its claim goes
405
+ // stale and the next sweep — the next boot's, or a live graph's — picks
406
+ // the row up and does the whole thing again, which is the recovery every
407
+ // crash already gets (and why each step is written to be redone).
408
+ if (deps.pluginJoinRequestJobs) {
409
+ await bounded(deps.pluginJoinRequestJobs.drain(), remaining(), 'finishing the join-request jobs', log);
403
410
  }
404
411
  // The sweep in flight when the interval was cleared: awaited so the next
405
412
  // graph for this tenant cannot start staging bytes while a store it has
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAiB,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAwB,MAAM,mDAAmD,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qDAAqD,CAAC;AAG3G,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACxC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AA4C3B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,MAAoB,EACpB,OAAyB,EAAE;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAEjF,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,IAAI,IAAI,GAAwB,IAAI,CAAC;IAErC,MAAM,UAAU,GAAG,GAAkB,EAAE;QACrC,IAAI,CAAC,aAAa;YAAE,OAAO,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACzD,aAAa,GAAG,KAAK,CAAC;QACtB,QAAQ,GAAG,MAAM;aACd,IAAI,EAAE;aACN,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACzE,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC,CAAC;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,GAAG,CAAC,+EAA+E,CAAC,CAAC;QACrF,KAAK,UAAU,EAAE,CAAC;QAClB,IAAI,EAAE,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;QACvB,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC;YAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,8CAA8C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC;gBACD,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;oBACxB,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,sEAAsE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAO;gBAAE,MAAM;YACpB,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,KAAK,CAAC,OAAO,CAAC;gBACd,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC5B,IAAI,GAAG,OAAO,CAAC;gBACjB,CAAC,CAAC;aACH,CAAC,CAAC;YACH,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,OAAO;QACL,IAAI,IAAI;YACN,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,IAAI;YACF,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;gBACtB,OAAO,GAAG,KAAK,CAAC;gBAChB,IAAI,EAAE,EAAE,CAAC;gBACT,MAAM,IAAI,CAAC;gBACX,qEAAqE;gBACrE,iEAAiE;gBACjE,gEAAgE;gBAChE,oEAAoE;gBACpE,MAAM,IAAI,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC;gBACzC,MAAM,UAAU,EAAE,CAAC;gBACnB,IAAI,IAAI;oBAAE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAoB,EACpB,IAAyB,EACzB,MAAiC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAE/E,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,OAAO;QACL,KAAK;YACH,QAAQ,KAAK,IAAI,EAAE;iBAChB,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG,CAAC,sDAAsD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACjG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;iBAC1B,OAAO,CAAC,GAAG,EAAE;gBACZ,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC,CAAC,CAAC;QACP,CAAC;QACD,KAAK,CAAC,IAAI;YACR,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC;YAC7B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC;AAaD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAoB;IAC3C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C;;;;;OAKG;IACH,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,MAAM,UAAU,GAAG,GAAkB,EAAE;QACrC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACtC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IACF,OAAO;QACL,KAAK;YACH,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,KAAK,CAAC;YACf,MAAM,UAAU,EAAE,CAAC;YACnB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,SAAS,CAAI,IAAsB;YACjC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;gBACvB,MAAM,UAAU,EAAE,CAAC;gBACnB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC,CAAC,EAAE,CAAC;YACL,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,GAAS,EAAE;gBACvB,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM;oBAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpD,CAAC,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAqBD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAO,EACP,MAAkD,EAAE;IAEpD,wEAAwE;IACxE,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAEzB,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,6EAA6E;IAC7E,mEAAmE;IACnE,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yEAAyE;QACzE,uEAAuE;QACvE,6DAA6D;QAC7D,UAAU,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAClE,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACpE,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,sEAAsE;IACtE,uEAAuE;IACvE,EAAE;IACF,wEAAwE;IACxE,4EAA4E;IAC5E,uEAAuE;IACvE,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0EAA0E;QAC1E,qEAAqE;QACrE,0EAA0E;QAC1E,2EAA2E;QAC3E,0EAA0E;QAC1E,uEAAuE;QACvE,qEAAqE;QACrE,0EAA0E;QAC1E,uEAAuE;QACvE,sEAAsE;QACtE,0EAA0E;QAC1E,sEAAsE;QACtE,wEAAwE;QACxE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACpC,UAAU,CAAC,KAAK,CAAC,+EAA+E,EAAE;YAChG,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACzD,CAAC,CAAC;QACH,mEAAmE;QACnE,qEAAqE;QACrE,0BAA0B;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC;IAClE,CAAC;IAED,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,yEAAyE;IACzE,uEAAuE;IACvE,wEAAwE;IACxE,sEAAsE;IACtE,uEAAuE;IACvE,0EAA0E;IAC1E,2EAA2E;IAC3E,iCAAiC;IACjC,KAAK,IAAI,CAAC,eAAe;SACtB,sCAAsC,EAAE;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACV,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,2EAA2E;QAC3E,yEAAyE;QACzE,kDAAkD;SACjD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC;IAErD,2EAA2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,EAAE;IACF,sEAAsE;IACtE,qEAAqE;IACrE,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,iDAAiD;IACjD,EAAE;IACF,4EAA4E;IAC5E,yEAAyE;IACzE,4DAA4D;IAC5D,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC;AAC7C,CAAC;AAiED,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAE3C,6FAA6F;AAC7F,KAAK,UAAU,OAAO,CAAC,OAAyB,EAAE,EAAU,EAAE,KAAa,EAAE,GAAwB;IACnG,IAAI,KAAiC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACjD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACnF,IAAI,OAAO,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,KAAK,0BAA0B,EAAE,8BAA8B,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,KAAK,YAAY,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,IAAkB,EAAE,SAAuB,EAAE,GAAwB;IAC9F,uEAAuE;IACvE,wEAAwE;IACxE,wEAAwE;IACxE,mEAAmE;IACnE,oEAAoE;IACpE,0EAA0E;IAC1E,wEAAwE;IACxE,mEAAmE;IACnE,IAAI,CAAC,cAAc,EAAE,YAAY,EAAE,CAAC;IACpC,4EAA4E;IAC5E,wEAAwE;IACxE,4BAA4B;IAC5B,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACtC,IAAI,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC;IACxC,uEAAuE;IACvE,iEAAiE;IACjE,uDAAuD;IACvD,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAC1B,2EAA2E;IAC3E,uCAAuC;IACvC,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC;IACpC,uEAAuE;IACvE,sEAAsE;IACtE,wEAAwE;IACxE,sEAAsE;IACtE,sEAAsE;IACtE,oDAAoD;IACpD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,+BAA+B,EAAE,GAAG,CAAC,CAAC;IAChG,CAAC;IACD,yEAAyE;IACzE,wEAAwE;IACxE,sDAAsD;IACtD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,4BAA4B,EAAE,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACxG,CAAC;IACD,0EAA0E;IAC1E,qEAAqE;IACrE,+DAA+D;IAC/D,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,4BAA4B,EAAE,GAAG,CAAC,CAAC;IACxF,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;QAAE,oCAAoC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7F,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,0BAA0B,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB,EAAE,OAAwB,EAAE;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,4BAA4B,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAkB,EAClB,OAAwB,EAAE;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,4BAA4B,CAAC;IACnE,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAE1C,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,QAAQ,KAAK,CAAC,KAAK,IAAI,EAAE;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;YAC3E,GAAG,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;YAEhC,MAAM,OAAO,CACX,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACpC,CAAC,CAAC,EACF,SAAS,EAAE,EACX,oBAAoB,EACpB,GAAG,CACJ,CAAC;YACF,MAAM,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YAExC,GAAG,CAAC,wBAAwB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -102,20 +102,29 @@ export declare class AccessControlService implements IAccessControl {
102
102
  *
103
103
  * This is what makes the change-request gates affordable. One detail read
104
104
  * plus one approval click runs six at-ref gates, and before this cache
105
- * every one of them rebuilt the model from git: an `ls-tree -r` plus a
106
- * `git show` per `access.md`, ~270ms each on a real knowledge base. Six
107
- * builds per click was the lag behind the approve checkmark.
105
+ * every one of them rebuilt the model from git. A build is two git calls
106
+ * (`buildModelAtCommit`: one `ls-tree`, one `cat-file --batch` for every
107
+ * file the model reads), and each call forks the server process, which
108
+ * costs tens of milliseconds on a server holding a large heap.
108
109
  *
109
- * Bounded FIFO, so a long-lived server holds the last few tips rather than
110
- * one model per commit it ever gated against. A build that found no usable
111
- * roles.yaml is deliberately NOT cached, and a build that saw any git read
112
- * fail never becomes a model at all: it throws AccessUnreadableError and the
113
- * gate fails closed for that call. Both are what a transient failure looks
114
- * like, and pinning either to a commit would turn one hiccup into a wrong
115
- * verdict, denying or granting, until the base branch moved. Concurrent
116
- * misses on the same commit share one build via `atRefInFlight`.
110
+ * Bounded FIFO. The bound is sized for a listing that resolves access at
111
+ * every open change request's two refs: one commit per open request plus
112
+ * the targets, and a knowledge base with a hundred open requests was
113
+ * evicting in a cycle under the old bound of 64, rebuilding every model on
114
+ * every listing — thousands of forks, minutes of the main thread, and
115
+ * every other request waiting behind them. A commit's tree never changes,
116
+ * so a model is good for as long as it is held; the bound only caps memory.
117
+ *
118
+ * A commit with no roles.yaml is remembered too (`atRefNoRoles`): the batch
119
+ * read answers "missing" for it from git itself, which is as final as the
120
+ * commit. What is never cached is a build that saw a git read FAIL: it
121
+ * throws AccessUnreadableError and the gate fails closed for that call, and
122
+ * pinning that to a commit would turn one hiccup into a wrong verdict until
123
+ * the branch moved. Concurrent misses on the same commit share one build
124
+ * via `atRefInFlight`.
117
125
  */
118
126
  private readonly atRefCache;
127
+ private readonly atRefNoRoles;
119
128
  private readonly atRefInFlight;
120
129
  private static readonly AT_REF_CACHE_MAX;
121
130
  /**
@@ -428,9 +437,12 @@ export declare class AccessControlService implements IAccessControl {
428
437
  /**
429
438
  * List every `access.md` path that exists at any depth as of `ref`.
430
439
  * The access tree is structure-agnostic: any `access.md` participates
431
- * regardless of where it sits. Uses `git ls-tree -r --name-only`.
432
- * `'error'` when git failed: a model built without its access files is
433
- * not the model, and the caller must not cache it as one.
440
+ * regardless of where it sits. Uses `git ls-tree -r -z --name-only`: `-z`
441
+ * puts a NUL between paths and prints them as they are, where the default
442
+ * output C-quotes a path with a non-ASCII or special character, which would
443
+ * then name nothing when read back. `'error'` when git failed: a model
444
+ * built without its access files is not the model, and the caller must not
445
+ * cache it as one.
434
446
  */
435
447
  private listAccessFilesAtRef;
436
448
  /**
@@ -459,6 +471,7 @@ export declare class AccessControlService implements IAccessControl {
459
471
  /** The commit `ref` points at in this clone, or null when it doesn't resolve. */
460
472
  private revParseCommit;
461
473
  private rememberAtRef;
474
+ private rememberNoRolesAtRef;
462
475
  /**
463
476
  * The uncached build behind `loadModelAtRef`: the whole access tree read
464
477
  * at `commit`. `label` is the candidate ref the commit came from, kept for
@@ -466,6 +479,15 @@ export declare class AccessControlService implements IAccessControl {
466
479
  * means the commit carries no roles.yaml (the caller tries its next
467
480
  * candidate); `'malformed'` means it does but it doesn't parse (the caller
468
481
  * answers null, as it always has).
482
+ *
483
+ * TWO git calls, whatever the tree holds: one `ls-tree` to learn which
484
+ * files the model is made of, then one `cat-file --batch` that reads all of
485
+ * them — roles.yaml, the groups sources, every access.md and every plugin
486
+ * manifest. It used to be one `git show` per file, and each git call forks
487
+ * the server process, which on a server holding a large heap costs tens of
488
+ * milliseconds of the main thread per call: a knowledge base with a few
489
+ * dozen access files paid a second or more per commit, times every ref a
490
+ * listing resolves.
469
491
  */
470
492
  private buildModelAtCommit;
471
493
  }
@@ -1 +1 @@
1
- {"version":3,"file":"access-control.service.d.ts","sourceRoot":"","sources":["../../../src/modules/access/access-control.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"access-control.service.d.ts","sourceRoot":"","sources":["../../../src/modules/access/access-control.service.ts"],"names":[],"mappings":"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"}
@@ -15,12 +15,11 @@ import { DIRECTORY_SYNC_BOT_EMAIL, DIRECTORY_SYNC_BOT_NAME, } from './directory-
15
15
  /**
16
16
  * Read many objects from a git repo in ONE `git cat-file --batch` process.
17
17
  * `specs` are `<ref>:<path>` lines; the result array is index-aligned with
18
- * them — the blob's text, or null when the spec is missing/ambiguous at the
19
- * ref or resolves to a non-blob (e.g. a directory). Output protocol per
20
- * request: `<oid> <type> <size>\n<size bytes>\n`, or `<spec> missing\n`
21
- * (the spec may itself contain spaces, hence the endsWith checks).
18
+ * them. Output protocol per request: `<oid> <type> <size>\n<size bytes>\n`,
19
+ * or `<spec> missing\n` (the spec may itself contain spaces, hence the
20
+ * endsWith checks).
22
21
  */
23
- async function catFileBatch(runner, repoDir, specs) {
22
+ async function catFileBatchOutcomes(runner, repoDir, specs) {
24
23
  // Bytes, not text: every `<size>` in the header counts bytes, and the walk
25
24
  // below has to step by that count through content that is not all ASCII.
26
25
  // One spec per LINE is the protocol, and this walk depends on getting back
@@ -42,7 +41,7 @@ async function catFileBatch(runner, repoDir, specs) {
42
41
  const header = out.subarray(off, nl).toString('utf-8');
43
42
  off = nl + 1;
44
43
  if (header.endsWith(' missing') || header.endsWith(' ambiguous')) {
45
- results.push(null);
44
+ results.push({ kind: 'missing' });
46
45
  continue;
47
46
  }
48
47
  const parts = header.split(' ');
@@ -50,13 +49,25 @@ async function catFileBatch(runner, repoDir, specs) {
50
49
  if (parts.length !== 3 || !Number.isInteger(size) || size < 0) {
51
50
  throw new Error(`unexpected git cat-file header: ${header}`);
52
51
  }
53
- // Non-blob (a directory path resolves to a tree) → null, but the
54
- // payload still has to be skipped to stay aligned.
55
- results.push(parts[1] === 'blob' ? out.subarray(off, off + size).toString('utf-8') : null);
52
+ // A non-blob (a directory path resolves to a tree) is reported as such,
53
+ // and its payload still has to be skipped to stay aligned.
54
+ results.push(parts[1] === 'blob'
55
+ ? { kind: 'blob', text: out.subarray(off, off + size).toString('utf-8') }
56
+ : { kind: 'non-blob', type: parts[1] });
56
57
  off += size + 1; // payload + trailing LF
57
58
  }
58
59
  return results;
59
60
  }
61
+ /**
62
+ * {@link catFileBatchOutcomes} for callers that want text or nothing: the
63
+ * blob's text, or null when the spec is missing at the ref or resolves to a
64
+ * non-blob — the own-entries reads, where a directory where a file was
65
+ * named simply carries no entries.
66
+ */
67
+ async function catFileBatch(runner, repoDir, specs) {
68
+ const outcomes = await catFileBatchOutcomes(runner, repoDir, specs);
69
+ return outcomes.map((o) => (o.kind === 'blob' ? o.text : null));
70
+ }
60
71
  function isBuiltInRole(canonicalRole) {
61
72
  return canonicalRole === EVERYONE_CANONICAL;
62
73
  }
@@ -1107,22 +1118,31 @@ export class AccessControlService {
1107
1118
  *
1108
1119
  * This is what makes the change-request gates affordable. One detail read
1109
1120
  * plus one approval click runs six at-ref gates, and before this cache
1110
- * every one of them rebuilt the model from git: an `ls-tree -r` plus a
1111
- * `git show` per `access.md`, ~270ms each on a real knowledge base. Six
1112
- * builds per click was the lag behind the approve checkmark.
1121
+ * every one of them rebuilt the model from git. A build is two git calls
1122
+ * (`buildModelAtCommit`: one `ls-tree`, one `cat-file --batch` for every
1123
+ * file the model reads), and each call forks the server process, which
1124
+ * costs tens of milliseconds on a server holding a large heap.
1125
+ *
1126
+ * Bounded FIFO. The bound is sized for a listing that resolves access at
1127
+ * every open change request's two refs: one commit per open request plus
1128
+ * the targets, and a knowledge base with a hundred open requests was
1129
+ * evicting in a cycle under the old bound of 64, rebuilding every model on
1130
+ * every listing — thousands of forks, minutes of the main thread, and
1131
+ * every other request waiting behind them. A commit's tree never changes,
1132
+ * so a model is good for as long as it is held; the bound only caps memory.
1113
1133
  *
1114
- * Bounded FIFO, so a long-lived server holds the last few tips rather than
1115
- * one model per commit it ever gated against. A build that found no usable
1116
- * roles.yaml is deliberately NOT cached, and a build that saw any git read
1117
- * fail never becomes a model at all: it throws AccessUnreadableError and the
1118
- * gate fails closed for that call. Both are what a transient failure looks
1119
- * like, and pinning either to a commit would turn one hiccup into a wrong
1120
- * verdict, denying or granting, until the base branch moved. Concurrent
1121
- * misses on the same commit share one build via `atRefInFlight`.
1134
+ * A commit with no roles.yaml is remembered too (`atRefNoRoles`): the batch
1135
+ * read answers "missing" for it from git itself, which is as final as the
1136
+ * commit. What is never cached is a build that saw a git read FAIL: it
1137
+ * throws AccessUnreadableError and the gate fails closed for that call, and
1138
+ * pinning that to a commit would turn one hiccup into a wrong verdict until
1139
+ * the branch moved. Concurrent misses on the same commit share one build
1140
+ * via `atRefInFlight`.
1122
1141
  */
1123
1142
  atRefCache = new Map();
1143
+ atRefNoRoles = new Set();
1124
1144
  atRefInFlight = new Map();
1125
- static AT_REF_CACHE_MAX = 64;
1145
+ static AT_REF_CACHE_MAX = 512;
1126
1146
  /**
1127
1147
  * Canonicalised deployment-owner emails (see `AccessModel.deploymentOwners`).
1128
1148
  * Held on the service rather than read per-model because it comes from the
@@ -2083,27 +2103,35 @@ export class AccessControlService {
2083
2103
  /**
2084
2104
  * List every `access.md` path that exists at any depth as of `ref`.
2085
2105
  * The access tree is structure-agnostic: any `access.md` participates
2086
- * regardless of where it sits. Uses `git ls-tree -r --name-only`.
2087
- * `'error'` when git failed: a model built without its access files is
2088
- * not the model, and the caller must not cache it as one.
2106
+ * regardless of where it sits. Uses `git ls-tree -r -z --name-only`: `-z`
2107
+ * puts a NUL between paths and prints them as they are, where the default
2108
+ * output C-quotes a path with a non-ASCII or special character, which would
2109
+ * then name nothing when read back. `'error'` when git failed: a model
2110
+ * built without its access files is not the model, and the caller must not
2111
+ * cache it as one.
2089
2112
  */
2090
2113
  async listAccessFilesAtRef(repoDir, ref) {
2091
2114
  try {
2092
- const { stdout } = await this.gitRunner.run(repoDir, ['ls-tree', '-r', '--name-only', ref]);
2115
+ const { stdout } = await this.gitRunner.run(repoDir, ['ls-tree', '-r', '-z', '--name-only', ref]);
2093
2116
  const out = [];
2094
2117
  const pluginDirs = [];
2118
+ // The fixed-name sources the tree carries (roles.yaml, the groups
2119
+ // files): a read of one of these that comes back empty is "absent"
2120
+ // only when the tree does not name it.
2121
+ const named = new Set();
2095
2122
  const { pluginsDir } = this.kb.layout;
2096
- for (const line of stdout.split('\n')) {
2097
- const p = line.trim();
2123
+ for (const p of stdout.split('\0')) {
2098
2124
  if (!p)
2099
2125
  continue;
2100
2126
  if (p === 'access.md' || p.endsWith('/access.md'))
2101
2127
  out.push(p);
2128
+ else if (p === 'roles.yaml' || p === SYNCED_GROUPS_YAML || p === GROUPS_YAML)
2129
+ named.add(p);
2102
2130
  else if (p.startsWith(`${pluginsDir}/`) && p.endsWith(`/${PLUGIN_MANIFEST_FILE}`)) {
2103
2131
  pluginDirs.push(p.slice(0, -(PLUGIN_MANIFEST_FILE.length + 1)));
2104
2132
  }
2105
2133
  }
2106
- return { accessFiles: out, pluginDirs };
2134
+ return { accessFiles: out, pluginDirs, named };
2107
2135
  }
2108
2136
  catch {
2109
2137
  return 'error';
@@ -2148,6 +2176,10 @@ export class AccessControlService {
2148
2176
  const hit = this.atRefCache.get(key);
2149
2177
  if (hit)
2150
2178
  return hit;
2179
+ // A commit known to carry no roles.yaml: the next candidate, without a
2180
+ // build (see `atRefNoRoles`).
2181
+ if (this.atRefNoRoles.has(key))
2182
+ continue;
2151
2183
  // Registered BEFORE the first await on the build path, so concurrent
2152
2184
  // misses on one commit share a single build instead of all racing past
2153
2185
  // an empty in-flight check together.
@@ -2157,6 +2189,8 @@ export class AccessControlService {
2157
2189
  .then((built) => {
2158
2190
  if (typeof built !== 'string')
2159
2191
  this.rememberAtRef(key, built);
2192
+ else if (built === 'no-roles')
2193
+ this.rememberNoRolesAtRef(key);
2160
2194
  return built;
2161
2195
  })
2162
2196
  .finally(() => {
@@ -2205,6 +2239,14 @@ export class AccessControlService {
2205
2239
  this.atRefCache.delete(oldest);
2206
2240
  }
2207
2241
  }
2242
+ rememberNoRolesAtRef(key) {
2243
+ this.atRefNoRoles.add(key);
2244
+ if (this.atRefNoRoles.size > AccessControlService.AT_REF_CACHE_MAX) {
2245
+ const oldest = this.atRefNoRoles.values().next().value;
2246
+ if (oldest !== undefined)
2247
+ this.atRefNoRoles.delete(oldest);
2248
+ }
2249
+ }
2208
2250
  /**
2209
2251
  * The uncached build behind `loadModelAtRef`: the whole access tree read
2210
2252
  * at `commit`. `label` is the candidate ref the commit came from, kept for
@@ -2212,6 +2254,15 @@ export class AccessControlService {
2212
2254
  * means the commit carries no roles.yaml (the caller tries its next
2213
2255
  * candidate); `'malformed'` means it does but it doesn't parse (the caller
2214
2256
  * answers null, as it always has).
2257
+ *
2258
+ * TWO git calls, whatever the tree holds: one `ls-tree` to learn which
2259
+ * files the model is made of, then one `cat-file --batch` that reads all of
2260
+ * them — roles.yaml, the groups sources, every access.md and every plugin
2261
+ * manifest. It used to be one `git show` per file, and each git call forks
2262
+ * the server process, which on a server holding a large heap costs tens of
2263
+ * milliseconds of the main thread per call: a knowledge base with a few
2264
+ * dozen access files paid a second or more per commit, times every ref a
2265
+ * listing resolves.
2215
2266
  */
2216
2267
  async buildModelAtCommit(repoDir, commit, label) {
2217
2268
  // Every read below tells "absent" apart from "git failed". A failure
@@ -2220,20 +2271,76 @@ export class AccessControlService {
2220
2271
  // and the caller fails closed (AccessUnreadableError, a 503) until a
2221
2272
  // retry reads the tree in full.
2222
2273
  const tag = `${label}@${commit.slice(0, 7)}`;
2274
+ const listed = await this.listAccessFilesAtRef(repoDir, commit);
2275
+ if (listed === 'error') {
2276
+ logger(`access@${tag}`).warn('listing access.md files failed; refusing to decide from a partial tree');
2277
+ throw new AccessUnreadableError(label, 'access.md (ls-tree)');
2278
+ }
2279
+ const wanted = [
2280
+ 'roles.yaml',
2281
+ SYNCED_GROUPS_YAML,
2282
+ GROUPS_YAML,
2283
+ ...listed.accessFiles,
2284
+ ...listed.pluginDirs.map((dir) => `${dir}/${PLUGIN_MANIFEST_FILE}`),
2285
+ ];
2286
+ let outcomes;
2287
+ try {
2288
+ outcomes = await catFileBatchOutcomes(this.gitRunner, repoDir, wanted.map((p) => `${commit}:${p}`));
2289
+ }
2290
+ catch (err) {
2291
+ // The operational signal: one line per failed build, naming the commit,
2292
+ // so a run of these is visible in the logs.
2293
+ logger(`access@${tag}`).warn(`git read of the access tree failed; refusing to decide from a partial tree: ${err instanceof Error ? err.message : String(err)}`);
2294
+ throw new AccessUnreadableError(label, 'access tree (cat-file)');
2295
+ }
2296
+ const fetched = new Map();
2297
+ wanted.forEach((p, i) => fetched.set(p, outcomes[i] ?? { kind: 'missing' }));
2298
+ const refuse = (relativePath, why) => {
2299
+ logger(`access@${tag}`).warn(`${relativePath} ${why}; refusing to decide from a partial tree`);
2300
+ throw new AccessUnreadableError(label, relativePath);
2301
+ };
2302
+ // What the build reads. "Missing" from the batch is "absent" only for a
2303
+ // groups source the tree does not name. A path the tree names — an
2304
+ // access.md, a plugin manifest, or a groups file the listing carried —
2305
+ // that comes back missing has a blob git could not read (a lost object),
2306
+ // and one that is not a file is a tree the model cannot be read from:
2307
+ // either way the build fails closed rather than drop what that file
2308
+ // would deny. A path the build did not prefetch (none today) is read on
2309
+ // its own, told apart from a git failure as before.
2310
+ const inTree = (relativePath) => listed.named.has(relativePath) || !(relativePath === SYNCED_GROUPS_YAML || relativePath === GROUPS_YAML);
2223
2311
  const read = async (relativePath) => {
2224
- const outcome = await this.showAtRefOutcome(repoDir, commit, relativePath);
2225
- if (outcome.kind === 'error') {
2226
- // The operational signal: one line per failed read, naming the commit
2227
- // and the path, so a run of these is visible in the logs.
2228
- logger(`access@${tag}`).warn(`git read of ${relativePath} failed; refusing to decide from a partial tree`);
2229
- throw new AccessUnreadableError(label, relativePath);
2312
+ const got = fetched.get(relativePath);
2313
+ if (got === undefined) {
2314
+ const outcome = await this.showAtRefOutcome(repoDir, commit, relativePath);
2315
+ if (outcome.kind === 'error')
2316
+ refuse(relativePath, 'could not be read');
2317
+ return outcome.kind === 'text' ? outcome.text : null;
2230
2318
  }
2231
- return outcome.kind === 'text' ? outcome.text : null;
2319
+ if (got.kind === 'blob')
2320
+ return got.text;
2321
+ if (got.kind === 'non-blob')
2322
+ return refuse(relativePath, `is a ${got.type}, not a file`);
2323
+ if (!inTree(relativePath))
2324
+ return null;
2325
+ return refuse(relativePath, 'is in the tree but its blob could not be read');
2232
2326
  };
2233
- const rolesYaml = await read('roles.yaml');
2234
- if (rolesYaml === null)
2327
+ // roles.yaml decides the build's outcome, so its states are read
2328
+ // directly. Absent from the tree is "no roles here" (the caller tries
2329
+ // its next candidate ref). In the tree but unreadable refuses the build:
2330
+ // answering "no roles" for it would be remembered for the commit and
2331
+ // would send a short ref through to origin, which may grant. A directory
2332
+ // of that name is as malformed as a file that does not parse (the caller
2333
+ // answers null, and never falls through to a ref that might grant what
2334
+ // this one does not).
2335
+ const roles = fetched.get('roles.yaml') ?? { kind: 'missing' };
2336
+ if (roles.kind === 'missing') {
2337
+ if (listed.named.has('roles.yaml'))
2338
+ refuse('roles.yaml', 'is in the tree but its blob could not be read');
2235
2339
  return 'no-roles';
2236
- const rolesParsed = parseRolesYaml(rolesYaml);
2340
+ }
2341
+ if (roles.kind === 'non-blob')
2342
+ return 'malformed';
2343
+ const rolesParsed = parseRolesYaml(roles.text);
2237
2344
  if (!rolesParsed.ok)
2238
2345
  return 'malformed';
2239
2346
  // Same group loading as the working-tree model, read AT THE COMMIT — the
@@ -2253,11 +2360,6 @@ export class AccessControlService {
2253
2360
  for (const w of mergeWarnings)
2254
2361
  logger(`access@${tag}`).warn(w);
2255
2362
  const accessFiles = new Map();
2256
- const listed = await this.listAccessFilesAtRef(repoDir, commit);
2257
- if (listed === 'error') {
2258
- logger(`access@${tag}`).warn('listing access.md files failed; refusing to decide from a partial tree');
2259
- throw new AccessUnreadableError(label, 'access.md (ls-tree)');
2260
- }
2261
2363
  for (const p of listed.accessFiles) {
2262
2364
  const text = await read(p);
2263
2365
  if (text === null)