@rubytech/create-sitedesk-code 0.1.427 → 0.1.431

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 (317) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/embed-client/dist/index.d.ts +5 -1
  3. package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/embed-client/dist/index.js +114 -36
  5. package/payload/platform/lib/embed-client/dist/index.js.map +1 -1
  6. package/payload/platform/lib/embed-client/src/index.ts +141 -34
  7. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +72 -4
  8. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  9. package/payload/platform/plugins/docs/references/admin-ui.md +2 -0
  10. package/payload/platform/plugins/docs/references/internals.md +3 -3
  11. package/payload/platform/plugins/docs/references/workflows.md +61 -0
  12. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.d.ts +2 -0
  13. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.d.ts.map +1 -0
  14. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.js +92 -0
  15. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-throughput.test.js.map +1 -0
  16. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.d.ts +2 -0
  17. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.d.ts.map +1 -0
  18. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.js +56 -0
  19. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embed-timeout.test.js.map +1 -0
  20. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +56 -0
  21. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -1
  22. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts +8 -1
  23. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.d.ts.map +1 -1
  24. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js +8 -1
  25. package/payload/platform/plugins/whatsapp/mcp/dist/resolve-read-account.js.map +1 -1
  26. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts +9 -3
  27. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts.map +1 -1
  28. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js +19 -15
  29. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js.map +1 -1
  30. package/payload/platform/plugins/workflows/PLUGIN.md +29 -9
  31. package/payload/platform/plugins/workflows/mcp/dist/index.js +34 -0
  32. package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
  33. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.d.ts +1 -1
  34. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.d.ts.map +1 -1
  35. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.js +7 -18
  36. package/payload/platform/plugins/workflows/mcp/dist/lib/embeddings.js.map +1 -1
  37. package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts +2 -2
  38. package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.d.ts.map +1 -1
  39. package/payload/platform/plugins/workflows/mcp/dist/lib/step-resolver.js.map +1 -1
  40. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts +25 -0
  41. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.d.ts.map +1 -1
  42. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js +14 -1
  43. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-create.js.map +1 -1
  44. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts +25 -1
  45. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.d.ts.map +1 -1
  46. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +79 -15
  47. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
  48. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts +2 -0
  49. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.d.ts.map +1 -1
  50. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js +4 -0
  51. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-get.js.map +1 -1
  52. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts +3 -1
  53. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.d.ts.map +1 -1
  54. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js +8 -1
  55. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-update.js.map +1 -1
  56. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +24 -3
  57. package/payload/platform/services/telegram-channel/dist/instructions.js +1 -1
  58. package/payload/platform/services/telegram-channel/dist/instructions.js.map +1 -1
  59. package/payload/platform/services/telegram-channel/dist/notification.d.ts +10 -5
  60. package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
  61. package/payload/platform/services/telegram-channel/dist/notification.js +9 -6
  62. package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
  63. package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
  64. package/payload/platform/services/telegram-channel/dist/server.js +15 -5
  65. package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
  66. package/payload/platform/services/webchat-channel/dist/instructions.js +1 -1
  67. package/payload/platform/services/webchat-channel/dist/instructions.js.map +1 -1
  68. package/payload/platform/services/webchat-channel/dist/notification.d.ts +12 -10
  69. package/payload/platform/services/webchat-channel/dist/notification.d.ts.map +1 -1
  70. package/payload/platform/services/webchat-channel/dist/notification.js +12 -11
  71. package/payload/platform/services/webchat-channel/dist/notification.js.map +1 -1
  72. package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
  73. package/payload/platform/services/webchat-channel/dist/server.js +12 -1
  74. package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
  75. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +11 -6
  76. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  77. package/payload/platform/services/whatsapp-channel/dist/notification.js +11 -8
  78. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  79. package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
  80. package/payload/platform/services/whatsapp-channel/dist/server.js +39 -14
  81. package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
  82. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts +17 -2
  83. package/payload/platform/services/whatsapp-channel/dist/targets.d.ts.map +1 -1
  84. package/payload/platform/services/whatsapp-channel/dist/targets.js +37 -2
  85. package/payload/platform/services/whatsapp-channel/dist/targets.js.map +1 -1
  86. package/payload/premium-plugins/sitedesk/lib/mcp-lifeline/dist/index.d.ts +8 -0
  87. package/payload/premium-plugins/sitedesk/lib/mcp-lifeline/dist/index.d.ts.map +1 -0
  88. package/payload/premium-plugins/sitedesk/lib/mcp-lifeline/dist/index.js +71 -0
  89. package/payload/premium-plugins/sitedesk/lib/mcp-lifeline/dist/index.js.map +1 -0
  90. package/payload/premium-plugins/sitedesk/lib/mcp-lifeline/package.json +7 -0
  91. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/PLUGIN.md +39 -3
  92. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/index.d.ts +2 -0
  93. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/index.d.ts.map +1 -0
  94. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/index.js +32 -0
  95. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/index.js.map +1 -0
  96. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/account.d.ts +10 -0
  97. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/account.d.ts.map +1 -0
  98. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/account.js +21 -0
  99. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/account.js.map +1 -0
  100. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/engine-run.d.ts +24 -0
  101. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/engine-run.d.ts.map +1 -0
  102. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/engine-run.js +59 -0
  103. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/engine-run.js.map +1 -0
  104. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/gates.d.ts +22 -0
  105. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/gates.d.ts.map +1 -0
  106. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/gates.js +40 -0
  107. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/gates.js.map +1 -0
  108. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/geometry.d.ts +47 -0
  109. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/geometry.d.ts.map +1 -0
  110. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/geometry.js +60 -0
  111. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/geometry.js.map +1 -0
  112. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/log.d.ts +7 -0
  113. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/log.d.ts.map +1 -0
  114. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/log.js +9 -0
  115. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/log.js.map +1 -0
  116. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/render-run.d.ts +29 -0
  117. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/render-run.d.ts.map +1 -0
  118. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/render-run.js +113 -0
  119. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/lib/render-run.js.map +1 -0
  120. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-engine-run.d.ts +3 -0
  121. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-engine-run.d.ts.map +1 -0
  122. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-engine-run.js +48 -0
  123. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-engine-run.js.map +1 -0
  124. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-render.d.ts +3 -0
  125. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-render.d.ts.map +1 -0
  126. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-render.js +50 -0
  127. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/quote-render.js.map +1 -0
  128. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/takeoff-compute.d.ts +3 -0
  129. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/takeoff-compute.d.ts.map +1 -0
  130. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/takeoff-compute.js +42 -0
  131. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/dist/tools/takeoff-compute.js.map +1 -0
  132. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/package-lock.json +2684 -0
  133. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/package.json +21 -0
  134. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/index.ts +39 -0
  135. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/__tests__/account.test.ts +49 -0
  136. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/__tests__/engine-run.test.ts +105 -0
  137. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/__tests__/gates.test.ts +51 -0
  138. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/__tests__/geometry.test.ts +83 -0
  139. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/__tests__/render-run.test.ts +111 -0
  140. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/account.ts +20 -0
  141. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/engine-run.ts +80 -0
  142. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/gates.ts +39 -0
  143. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/geometry.ts +93 -0
  144. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/log.ts +8 -0
  145. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/lib/render-run.ts +125 -0
  146. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/tools/quote-engine-run.ts +66 -0
  147. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/tools/quote-render.ts +66 -0
  148. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/src/tools/takeoff-compute.ts +51 -0
  149. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/mcp/tsconfig.json +20 -0
  150. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/skills/quotation/references/quote-engine.md +24 -0
  151. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/skills/quotation/references/quote-generation.md +67 -51
  152. package/payload/premium-plugins/sitedesk/plugins/sitedesk-job/skills/takeoff/SKILL.md +12 -0
  153. package/payload/server/{chunk-3Z5WE53X.js → chunk-UUG6ZSO5.js} +65 -9
  154. package/payload/server/maxy-edge.js +1 -1
  155. package/payload/server/public/assets/AdminLoginScreens-CcW3pAAZ.js +1 -0
  156. package/payload/server/public/assets/AdminShell-BfLQQ27Z.js +2 -0
  157. package/payload/server/public/assets/{Checkbox-B_lfjsqd.js → Checkbox-BC0c_gbn.js} +1 -1
  158. package/payload/server/public/assets/admin-Co3hOTNp.js +1 -0
  159. package/payload/server/public/assets/{arc-dVLpR-ec.js → arc-qKfXIt8v.js} +1 -1
  160. package/payload/server/public/assets/architecture-YZFGNWBL-FPHT7s-C.js +1 -0
  161. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C6u_CVzb.js → architectureDiagram-Q4EWVU46-DkVrGn7G.js} +1 -1
  162. package/payload/server/public/assets/audio-attachment-mime-CwYrV1pg.js +2 -0
  163. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cy8F5b8O.js → blockDiagram-DXYQGD6D-DqavswGH.js} +1 -1
  164. package/payload/server/public/assets/{browser-CCWufeXr.js → browser-CvZxNdKw.js} +1 -1
  165. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DRXrlepj.js → c4Diagram-AHTNJAMY-B7fyKiXe.js} +1 -1
  166. package/payload/server/public/assets/calendar-DXxLMF2J.js +1 -0
  167. package/payload/server/public/assets/channel-j70eMvcL.js +1 -0
  168. package/payload/server/public/assets/chat-rxbGimwf.js +1 -0
  169. package/payload/server/public/assets/chevron-left-CLPxfjDV.js +1 -0
  170. package/payload/server/public/assets/{chunk-2KRD3SAO-fEyfhRLz.js → chunk-2KRD3SAO-DsgMtGkv.js} +1 -1
  171. package/payload/server/public/assets/{chunk-336JU56O-NUWO4y7q.js → chunk-336JU56O-CkdISfNt.js} +2 -2
  172. package/payload/server/public/assets/chunk-426QAEUC-D-NcAlTW.js +1 -0
  173. package/payload/server/public/assets/{chunk-4BX2VUAB-BnfiNR3l.js → chunk-4BX2VUAB-CYpiF2bl.js} +1 -1
  174. package/payload/server/public/assets/{chunk-4TB4RGXK-Bj_aJOz8.js → chunk-4TB4RGXK-CWyc_F7v.js} +1 -1
  175. package/payload/server/public/assets/{chunk-55IACEB6-aK0DNSKb.js → chunk-55IACEB6-BbzKMw2Z.js} +1 -1
  176. package/payload/server/public/assets/{chunk-5FUZZQ4R-DeqAkq5C.js → chunk-5FUZZQ4R-u19Nai9e.js} +1 -1
  177. package/payload/server/public/assets/{chunk-5PVQY5BW-SShlujAQ.js → chunk-5PVQY5BW-Ba8by6Uy.js} +1 -1
  178. package/payload/server/public/assets/{chunk-67CJDMHE-CZpzQ0DL.js → chunk-67CJDMHE-BwUuxtyb.js} +1 -1
  179. package/payload/server/public/assets/{chunk-7N4EOEYR-COnjO6jy.js → chunk-7N4EOEYR-BRH9iM9L.js} +1 -1
  180. package/payload/server/public/assets/{chunk-AA7GKIK3-C9V31L2z.js → chunk-AA7GKIK3-BGoztgLL.js} +1 -1
  181. package/payload/server/public/assets/{chunk-BSJP7CBP-DSwnSGe3.js → chunk-BSJP7CBP-C5GDAZTl.js} +1 -1
  182. package/payload/server/public/assets/{chunk-CIAEETIT-CnRUTuta.js → chunk-CIAEETIT-ChY32VPS.js} +1 -1
  183. package/payload/server/public/assets/{chunk-EDXVE4YY-BexiL2LH.js → chunk-EDXVE4YY-CPSD3p6p.js} +1 -1
  184. package/payload/server/public/assets/{chunk-ENJZ2VHE-aTklWdJQ.js → chunk-ENJZ2VHE-D1oL-iUr.js} +1 -1
  185. package/payload/server/public/assets/{chunk-FMBD7UC4-svcEBQzs.js → chunk-FMBD7UC4-CPvYEr54.js} +1 -1
  186. package/payload/server/public/assets/{chunk-FOC6F5B3-CG7R7Xri.js → chunk-FOC6F5B3-9Yyj7Vbz.js} +1 -1
  187. package/payload/server/public/assets/{chunk-ICPOFSXX-CGN7Z4x9.js → chunk-ICPOFSXX-BaYgh8FR.js} +2 -2
  188. package/payload/server/public/assets/{chunk-K5T4RW27-CWBh78jw.js → chunk-K5T4RW27-5ucpeRvm.js} +1 -1
  189. package/payload/server/public/assets/{chunk-KGLVRYIC-Ctiq4q-5.js → chunk-KGLVRYIC-DW-FHk7T.js} +1 -1
  190. package/payload/server/public/assets/{chunk-LIHQZDEY-BII77Q7K.js → chunk-LIHQZDEY-CGGVfAyG.js} +1 -1
  191. package/payload/server/public/assets/{chunk-ORNJ4GCN-DT7R01H8.js → chunk-ORNJ4GCN-Bv8EUa5d.js} +1 -1
  192. package/payload/server/public/assets/{chunk-OYMX7WX6-y-Jkbd4C.js → chunk-OYMX7WX6-C1mXJnyw.js} +1 -1
  193. package/payload/server/public/assets/chunk-QZHKN3VN-CAwbQBtf.js +1 -0
  194. package/payload/server/public/assets/{chunk-U2HBQHQK-DzFo6KbQ.js → chunk-U2HBQHQK-PwSQz6EP.js} +1 -1
  195. package/payload/server/public/assets/{chunk-X2U36JSP-CYSwgtLV.js → chunk-X2U36JSP--NPHTBlU.js} +1 -1
  196. package/payload/server/public/assets/{chunk-XPW4576I-DHlM4tOn.js → chunk-XPW4576I-Bbc7Da32.js} +1 -1
  197. package/payload/server/public/assets/{chunk-YZCP3GAM-B20rTmLl.js → chunk-YZCP3GAM-D-9v8e--.js} +1 -1
  198. package/payload/server/public/assets/{chunk-ZZ45TVLE-C7hP4J8m.js → chunk-ZZ45TVLE-CMPg670Q.js} +1 -1
  199. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Ct6Rn0vt.js +1 -0
  200. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-B_2XCIFv.js +1 -0
  201. package/payload/server/public/assets/clone-DjPWA_NH.js +1 -0
  202. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-nKjTv9sR.js → cose-bilkent-S5V4N54A-NVSb1Bhy.js} +1 -1
  203. package/payload/server/public/assets/{dagre-KV5264BT-BNJYTnls.js → dagre-KV5264BT-V2Ai1DFl.js} +1 -1
  204. package/payload/server/public/assets/{dagre-Cx8LiiUZ.js → dagre-QfLcO-1j.js} +1 -1
  205. package/payload/server/public/assets/data-D0YFYP1i.js +1 -0
  206. package/payload/server/public/assets/{diagram-5BDNPKRD-CoAN5_f9.js → diagram-5BDNPKRD-Caw21693.js} +1 -1
  207. package/payload/server/public/assets/{diagram-G4DWMVQ6-pRmsN4_x.js → diagram-G4DWMVQ6-CgwVkT2q.js} +1 -1
  208. package/payload/server/public/assets/{diagram-MMDJMWI5-CRoylyp4.js → diagram-MMDJMWI5-DFUrLZhs.js} +1 -1
  209. package/payload/server/public/assets/{diagram-TYMM5635-BT3ZtG5b.js → diagram-TYMM5635-CEEiEuZJ.js} +1 -1
  210. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DSKws1ZV.js → erDiagram-SMLLAGMA-CG10NrT3.js} +1 -1
  211. package/payload/server/public/assets/file-download-B2B2DTar.js +1 -0
  212. package/payload/server/public/assets/{flatten-jn8bZgcI.js → flatten-DAO0sfCM.js} +1 -1
  213. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-C2L38ZE5.js → flowDiagram-DWJPFMVM-BqkV9Okv.js} +1 -1
  214. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Bm2h-vjm.js → ganttDiagram-T4ZO3ILL-DRiCDQF6.js} +1 -1
  215. package/payload/server/public/assets/gitGraph-7Q5UKJZL-B8Hx7f-D.js +1 -0
  216. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BoowbF7u.js → gitGraphDiagram-UUTBAWPF-BZV2voyy.js} +1 -1
  217. package/payload/server/public/assets/graph-DRNzDBTV.js +51 -0
  218. package/payload/server/public/assets/{graph-labels-BLx-0vyT.js → graph-labels-DxqDdO7G.js} +1 -1
  219. package/payload/server/public/assets/{graphlib-BvT2s_o1.js → graphlib-DGPThX8M.js} +1 -1
  220. package/payload/server/public/assets/info-OMHHGYJF-BicCJTqU.js +1 -0
  221. package/payload/server/public/assets/infoDiagram-42DDH7IO-tf-8rOez.js +2 -0
  222. package/payload/server/public/assets/{isEmpty-Dkk6_L-B.js → isEmpty-Cb_U81C6.js} +1 -1
  223. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-nxcmj-IX.js → ishikawaDiagram-UXIWVN3A-BKsAxSvp.js} +1 -1
  224. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-q5SNIvmS.js → journeyDiagram-VCZTEJTY-CmliuOd-.js} +1 -1
  225. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BugG9Q1o.js → kanban-definition-6JOO6SKY-DAlElMb-.js} +1 -1
  226. package/payload/server/public/assets/{line-MZCQLR-q.js → line-DKZqLKAC.js} +1 -1
  227. package/payload/server/public/assets/{linear-DmQGNk-g.js → linear-CbSGdh1x.js} +1 -1
  228. package/payload/server/public/assets/{maximize-2-CnNQnj_v.js → maximize-2-DKx6OBKv.js} +1 -1
  229. package/payload/server/public/assets/{mermaid-parser.core-DvoeqLxw.js → mermaid-parser.core-DFvbao9C.js} +2 -2
  230. package/payload/server/public/assets/{mermaid.core-BLaw7iG4.js → mermaid.core-C0vEBxDm.js} +3 -3
  231. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DMkt10Vc.js → mindmap-definition-QFDTVHPH-CShASUKd.js} +1 -1
  232. package/payload/server/public/assets/operator-Djv3MdcL.js +1 -0
  233. package/payload/server/public/assets/{ordinal-DuJYM7p1.js → ordinal-H0tVmBDP.js} +1 -1
  234. package/payload/server/public/assets/packet-4T2RLAQJ-Ckn_5hq0.js +1 -0
  235. package/payload/server/public/assets/page-Ci27UrJz.js +32 -0
  236. package/payload/server/public/assets/page-D1EAVC_9.js +1 -0
  237. package/payload/server/public/assets/{pdf-render-riHufgrn.js → pdf-render-jAQU0nXt.js} +1 -1
  238. package/payload/server/public/assets/pie-ZZUOXDRM-DzlGQW3J.js +1 -0
  239. package/payload/server/public/assets/{pieDiagram-DEJITSTG-DRp4lD2B.js → pieDiagram-DEJITSTG-CBZHpDAJ.js} +1 -1
  240. package/payload/server/public/assets/{play-yEkd7ouW.js → play-DHttF4fl.js} +1 -1
  241. package/payload/server/public/assets/public-C6k-fPfx.js +1 -0
  242. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DkT63Dn4.js → quadrantDiagram-34T5L4WZ-n3bB3K91.js} +1 -1
  243. package/payload/server/public/assets/radar-PYXPWWZC-BHo2YD8b.js +1 -0
  244. package/payload/server/public/assets/{reduce-COyotL2V.js → reduce-DAvwat-a.js} +1 -1
  245. package/payload/server/public/assets/{requirementDiagram-MS252O5E-65GGtDkc.js → requirementDiagram-MS252O5E-DiDvQK3c.js} +1 -1
  246. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-D1vRwLWd.js → sankeyDiagram-XADWPNL6-DWDQQZmd.js} +1 -1
  247. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-Bp47ZSN2.js → sequenceDiagram-FGHM5R23-DmAqRlBT.js} +1 -1
  248. package/payload/server/public/assets/square-CHcQHtK8.js +1 -0
  249. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BZHHcP_e.js → stateDiagram-FHFEXIEX-D4R-n6bZ.js} +1 -1
  250. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BcFRbGRu.js +1 -0
  251. package/payload/server/public/assets/tasks-ClfJU1CK.js +1 -0
  252. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-DZ1wUyj-.js → timeline-definition-GMOUNBTQ-CjiHGP4l.js} +1 -1
  253. package/payload/server/public/assets/treeView-SZITEDCU-BtRr5vXp.js +1 -0
  254. package/payload/server/public/assets/treemap-W4RFUUIX-D8p0sbyo.js +1 -0
  255. package/payload/server/public/assets/useCopyFeedback-CPEOUSGU.js +1 -0
  256. package/payload/server/public/assets/{useSubAccountSwitcher-ayajZz8T.css → useSubAccountSwitcher-CdS1CorH.css} +1 -1
  257. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CttBahsn.js → vennDiagram-DHZGUBPP-CBdDQ7c-.js} +1 -1
  258. package/payload/server/public/assets/wardley-RL74JXVD-DgMn-9ZJ.js +1 -0
  259. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Y5tWieZg.js → wardleyDiagram-NUSXRM2D-BlIQPKLb.js} +1 -1
  260. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-C78A9qbe.js → xychartDiagram-5P7HB3ND-CslKgh9B.js} +1 -1
  261. package/payload/server/public/browser.html +6 -6
  262. package/payload/server/public/calendar.html +7 -7
  263. package/payload/server/public/chat.html +13 -14
  264. package/payload/server/public/data.html +10 -10
  265. package/payload/server/public/graph.html +11 -11
  266. package/payload/server/public/index.html +14 -15
  267. package/payload/server/public/operator.html +15 -16
  268. package/payload/server/public/public.html +13 -14
  269. package/payload/server/public/tasks.html +5 -5
  270. package/payload/server/server.js +321 -32
  271. package/payload/server/public/assets/AdminLoginScreens-yAIhWcGc.js +0 -1
  272. package/payload/server/public/assets/AdminShell-Bk1AFQ4D.js +0 -2
  273. package/payload/server/public/assets/Transcript-D67OZnVM.js +0 -2
  274. package/payload/server/public/assets/admin-DuOhkvrZ.js +0 -1
  275. package/payload/server/public/assets/admin-types-ClHBm0ni.js +0 -1
  276. package/payload/server/public/assets/architecture-YZFGNWBL-CgeA3HPD.js +0 -1
  277. package/payload/server/public/assets/calendar-CNk1iPrA.js +0 -1
  278. package/payload/server/public/assets/channel-B04VBWf7.js +0 -1
  279. package/payload/server/public/assets/chat-7qB-dwBq.js +0 -1
  280. package/payload/server/public/assets/chevron-left-CpcDbHIz.js +0 -1
  281. package/payload/server/public/assets/chunk-426QAEUC-DZkHcXRA.js +0 -1
  282. package/payload/server/public/assets/chunk-QZHKN3VN-D9Mwgzti.js +0 -1
  283. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CIo_TzfF.js +0 -1
  284. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-SzQYvAUZ.js +0 -1
  285. package/payload/server/public/assets/clone-BVjcjsBA.js +0 -1
  286. package/payload/server/public/assets/data-BnHcS27X.js +0 -1
  287. package/payload/server/public/assets/file-download-Hf_UILaA.js +0 -1
  288. package/payload/server/public/assets/gitGraph-7Q5UKJZL-DzQ18i0T.js +0 -1
  289. package/payload/server/public/assets/graph-klLugHEK.js +0 -51
  290. package/payload/server/public/assets/info-OMHHGYJF-CwsoaVzV.js +0 -1
  291. package/payload/server/public/assets/infoDiagram-42DDH7IO-ieNsH2bV.js +0 -2
  292. package/payload/server/public/assets/operator-CRcySYv9.js +0 -1
  293. package/payload/server/public/assets/packet-4T2RLAQJ-DxB-bO4L.js +0 -1
  294. package/payload/server/public/assets/page-CVo3CWIY.js +0 -1
  295. package/payload/server/public/assets/page-DPTbZRwl.js +0 -32
  296. package/payload/server/public/assets/pie-ZZUOXDRM-PSdKvB8-.js +0 -1
  297. package/payload/server/public/assets/public-Fi6ccYaE.js +0 -1
  298. package/payload/server/public/assets/radar-PYXPWWZC-D8FqRiWq.js +0 -1
  299. package/payload/server/public/assets/rotate-ccw-xHksz9mr.js +0 -1
  300. package/payload/server/public/assets/square-BZqaxg7D.js +0 -1
  301. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-qVtoGx56.js +0 -1
  302. package/payload/server/public/assets/tasks-COWmfts8.js +0 -1
  303. package/payload/server/public/assets/treeView-SZITEDCU-i-w4rJmQ.js +0 -1
  304. package/payload/server/public/assets/treemap-W4RFUUIX-Dij6AlAj.js +0 -1
  305. package/payload/server/public/assets/wardley-RL74JXVD-BJhOQVqW.js +0 -1
  306. /package/payload/server/public/assets/{_baseFor-Bjj9It3Q.js → _baseFor-D3BqAOBr.js} +0 -0
  307. /package/payload/server/public/assets/{array-BrrxEo12.js → array-iYP9fzJp.js} +0 -0
  308. /package/payload/server/public/assets/{cytoscape.esm-CTWJxUxo.js → cytoscape.esm-BQSBzPsB.js} +0 -0
  309. /package/payload/server/public/assets/{defaultLocale-CFDbRV4k.js → defaultLocale-BrdA1gDi.js} +0 -0
  310. /package/payload/server/public/assets/{dist-CRpLAnCP.js → dist-Cvgxm7qv.js} +0 -0
  311. /package/payload/server/public/assets/{init-dXCzGgLP.js → init-Bx0S6pkp.js} +0 -0
  312. /package/payload/server/public/assets/{katex-CHA1JFYJ.js → katex-BsiH_a6d.js} +0 -0
  313. /package/payload/server/public/assets/{path-CCRpdXhK.js → path-BLSgTy3w.js} +0 -0
  314. /package/payload/server/public/assets/{preload-helper-CH6UZRzu.js → preload-helper-ClBMtM1g.js} +0 -0
  315. /package/payload/server/public/assets/{rough.esm-Bud4g4fh.js → rough.esm-BMOtDaaS.js} +0 -0
  316. /package/payload/server/public/assets/{src-xN1oULc8.js → src-DV4LKv2E.js} +0 -0
  317. /package/payload/server/public/assets/{useSubAccountSwitcher-DADvGnr1.js → useSubAccountSwitcher-DyjTbzQR.js} +0 -0
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapWithLifeline = wrapWithLifeline;
4
+ exports.lifelineTool = lifelineTool;
5
+ let callCounter = 0;
6
+ function nextToken() {
7
+ return (++callCounter).toString(16).padStart(6, "0");
8
+ }
9
+ function censusHandles() {
10
+ try {
11
+ const resources = process.getActiveResourcesInfo?.();
12
+ if (!resources)
13
+ return "unavailable";
14
+ if (resources.length === 0)
15
+ return "none";
16
+ const counts = {};
17
+ for (const r of resources) {
18
+ counts[r] = (counts[r] ?? 0) + 1;
19
+ }
20
+ return Object.entries(counts)
21
+ .map(([k, v]) => `${k}:${v}`)
22
+ .join(" ");
23
+ }
24
+ catch {
25
+ return "unavailable";
26
+ }
27
+ }
28
+ function wrapWithLifeline(name, handler) {
29
+ return async (...args) => {
30
+ const plugin = process.env.MCP_SPAWN_TEE_NAME ?? "unknown";
31
+ const token = nextToken();
32
+ try {
33
+ process.stderr.write(`[${plugin}] op=request tool=${name} token=${token}\n`);
34
+ }
35
+ catch {
36
+ try {
37
+ process.stderr.write(`[mcp-lifeline] op=self-error tool=${name}\n`);
38
+ }
39
+ catch {
40
+ // stderr completely broken — still run handler
41
+ }
42
+ return handler(...args);
43
+ }
44
+ const start = process.hrtime.bigint();
45
+ let outcome = "ok";
46
+ let thrown;
47
+ let result;
48
+ try {
49
+ result = await handler(...args);
50
+ }
51
+ catch (err) {
52
+ outcome = "error";
53
+ thrown = err;
54
+ }
55
+ const ms = Number((process.hrtime.bigint() - start) / BigInt(1_000_000));
56
+ const handles = censusHandles();
57
+ try {
58
+ process.stderr.write(`[${plugin}] op=result tool=${name} token=${token} outcome=${outcome} ms=${ms} handles=${handles}\n`);
59
+ }
60
+ catch {
61
+ // broken pipe on result write — ignore, handler outcome takes priority
62
+ }
63
+ if (outcome === "error")
64
+ throw thrown;
65
+ return result;
66
+ };
67
+ }
68
+ function lifelineTool(server, name, description, inputSchema, handler) {
69
+ server.registerTool(name, { description, inputSchema }, wrapWithLifeline(name, handler));
70
+ }
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@maxy/mcp-lifeline",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "commonjs",
6
+ "main": "dist/index.js"
7
+ }
@@ -1,7 +1,28 @@
1
1
  ---
2
2
  name: sitedesk-job
3
3
  description: "Job-centric workflows for an independent service business: one-shot quoting and recurring interim valuation. Measures quantities off a drawing when one is supplied (reading printed dimensions, working to a scale or one known dimension, and counting fixtures), then captures the operator's own pricing/quotation method — the things they price, how each is quantified and priced, the roll-up rules, and the documents they issue — and applies it to produce the live quote; and issues a building contractor's recurring interim valuation (progress claim) from carried job state plus a per-cycle delta, with a deterministic roll-up that reconciles to the penny. Carries no business content: every item, unit, rate, margin, figure and template is the operator's own data, never written into the plugin (no client numbers ever ship in this tree)."
4
- tools: []
4
+ mcp:
5
+ command: node
6
+ args:
7
+ - ${PLATFORM_ROOT}/lib/mcp-spawn-tee/dist/index.js
8
+ - ${PREMIUM_PLUGINS_ROOT}/sitedesk/plugins/sitedesk-job/mcp/dist/index.js
9
+ env:
10
+ MCP_SPAWN_TEE_NAME: sitedesk-job
11
+ LOG_DIR: ${LOG_DIR}
12
+ PLATFORM_ROOT: ${PLATFORM_ROOT}
13
+ ACCOUNT_ID: ${ACCOUNT_ID}
14
+ SESSION_ID: ${SESSION_ID}
15
+ mcp-manifest: skip
16
+ tools:
17
+ - name: quote-engine-run
18
+ publicAllowlist: false
19
+ adminAllowlist: true
20
+ - name: quote-render
21
+ publicAllowlist: false
22
+ adminAllowlist: true
23
+ - name: takeoff-compute
24
+ publicAllowlist: false
25
+ adminAllowlist: true
5
26
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
6
27
  keywords: ["pricing", "quotation", "valuation", "quoting", "estimating", "pricing-method", "quote-generation", "construction", "interim-valuation", "progress-claim", "variations", "job", "timesheet", "invoice", "check-in", "CIS", "takeoff", "quantities", "measure", "drawing", "dimensions", "scale"]
7
28
  ---
@@ -46,5 +67,20 @@ core back-office one. Other brands' `business-assistant` no longer carries it.
46
67
 
47
68
  ## Tools Used
48
69
 
49
- No MCP server. The skill operates via existing platform tools (Read, Write, Edit,
50
- Bash, Grep) and the operator's stored method data.
70
+ An MCP server (`mcp/`) exposes three admin-only tools for the **apply path**: the
71
+ deterministic money-math and its render. This makes the quote pipeline a fixed,
72
+ tested I/O boundary that can be sequenced as `workflows` Workflow steps. Each tool
73
+ is a **pure executor** over the operator's persisted per-account artifacts under
74
+ `$ACCOUNT_DIR/quoting/` plus provided inputs. None embeds an item, rate, margin,
75
+ roll-up formula, document template, or fixed schema. The build, verification,
76
+ maintenance, vision, and elicitation halves of `takeoff` and `quotation` remain
77
+ skills operating via existing platform tools.
78
+
79
+ | Tool | Does |
80
+ |------|------|
81
+ | `quote-engine-run` | Executes the already-persisted engine (`quoting/engine.mjs`) against a job (`{methodPath, job, mode}` on stdin, figures JSON on stdout), persists them to `quoting/jobs/<jobId>/figures.json`, and returns line prices, group subtotals and total. `mode=verify` returns the per-level reproduction delta. Faults (engine-absent, method-absent, script-error) return zero figures, never a partial total |
82
+ | `quote-render` | Runs the persisted render script (`quoting/render.mjs`) to emit the three reconciling **HTML** documents from figures, enforcing the reconcile, margin-leak and link-liveness gates, and files each by scope. HTML only; the PDF is produced downstream by the `browser` plugin's `browser-pdf-save`. A failing gate files nothing |
83
+ | `takeoff-compute` | Deterministic takeoff geometry over agent-supplied measured inputs (scale to a real dimension, a scaled area from two sides, count roll-up, and a scaled-vs-printed cross-check), returning the tagged quantity list. Reading the drawing and eliciting inputs stay in the `takeoff` skill |
84
+
85
+ Every invocation emits one structured stderr line correlated by `jobId`
86
+ (`journalctl --user | grep -E '\[quote-engine\]|\[quote-render\]|\[takeoff-compute\]'`).
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ // sitedesk-job MCP server — apply-path toolification (Task 1540).
2
+ //
3
+ // Three pure-executor tools, all admin-side, over the operator's persisted
4
+ // per-account artifacts under $ACCOUNT_DIR/quoting/ plus provided inputs:
5
+ // quote-engine-run execute the already-persisted pricing engine → figures
6
+ // quote-render figures + persisted render script → three reconciling HTML docs
7
+ // takeoff-compute deterministic scale/area/count geometry → tagged quantity list
8
+ //
9
+ // The server embeds no item, rate, margin, roll-up, template, or fixed schema:
10
+ // it runs the operator's own scripts, it is not a pricing model. Module init
11
+ // never reads per-account env, so plugin enumeration with empty env boots the
12
+ // registry without faulting (CLAUDE.md spawn-enumeration invariant).
13
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
+ import { logLine } from "./lib/log.js";
16
+ import { registerTakeoffCompute } from "./tools/takeoff-compute.js";
17
+ import { registerQuoteEngineRun } from "./tools/quote-engine-run.js";
18
+ import { registerQuoteRender } from "./tools/quote-render.js";
19
+ const accountId = process.env.ACCOUNT_ID ?? "local";
20
+ const server = new McpServer({ name: "maxy-sitedesk-job", version: "0.1.0" });
21
+ logLine(`[sitedesk-job] server started, account=${accountId}`);
22
+ registerTakeoffCompute(server);
23
+ registerQuoteEngineRun(server);
24
+ registerQuoteRender(server);
25
+ const transport = new StdioServerTransport();
26
+ await server.connect(transport);
27
+ function shutdown() {
28
+ process.exit(0);
29
+ }
30
+ process.on("SIGINT", shutdown);
31
+ process.on("SIGTERM", shutdown);
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,8EAA8E;AAC9E,uFAAuF;AACvF,sFAAsF;AACtF,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,8EAA8E;AAC9E,qEAAqE;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAE9E,OAAO,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;AAE/D,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,SAAS,QAAQ;IACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolve the account-scoped workspace root. `ACCOUNT_DIR` is the canonical
3
+ * spawn-set var; fall back to `PLATFORM_ROOT` + `ACCOUNT_ID` exactly as the
4
+ * memory plugin's kd-classify resolver does. Returns `null` when neither is
5
+ * resolvable — the caller raises a precise no-account-context fault rather than
6
+ * running an engine at an empty path. Reading env per call (never at module
7
+ * init) keeps plugin enumeration with empty env from faulting.
8
+ */
9
+ export declare function resolveAccountDir(): string | null;
10
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/lib/account.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CASjD"}
@@ -0,0 +1,21 @@
1
+ import { join } from "node:path";
2
+ /**
3
+ * Resolve the account-scoped workspace root. `ACCOUNT_DIR` is the canonical
4
+ * spawn-set var; fall back to `PLATFORM_ROOT` + `ACCOUNT_ID` exactly as the
5
+ * memory plugin's kd-classify resolver does. Returns `null` when neither is
6
+ * resolvable — the caller raises a precise no-account-context fault rather than
7
+ * running an engine at an empty path. Reading env per call (never at module
8
+ * init) keeps plugin enumeration with empty env from faulting.
9
+ */
10
+ export function resolveAccountDir() {
11
+ const direct = process.env.ACCOUNT_DIR;
12
+ if (direct && direct.trim())
13
+ return direct;
14
+ const platformRoot = process.env.PLATFORM_ROOT;
15
+ const accountId = process.env.ACCOUNT_ID;
16
+ if (platformRoot && accountId && !accountId.includes("/") && !accountId.includes("..")) {
17
+ return join(platformRoot, "..", "data", "accounts", accountId);
18
+ }
19
+ return null;
20
+ }
21
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/lib/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,YAAY,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvF,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type EngineFault = "engine-absent" | "method-absent" | "script-error";
2
+ export type EngineMode = "quote" | "verify";
3
+ export type EngineResult = {
4
+ ok: true;
5
+ figures: Record<string, unknown>;
6
+ } | {
7
+ ok: false;
8
+ reason: EngineFault;
9
+ detail: string;
10
+ };
11
+ export interface RunEngineArgs {
12
+ accountDir: string;
13
+ enginePath: string;
14
+ methodPath: string;
15
+ job: unknown;
16
+ mode: EngineMode;
17
+ }
18
+ /** Spawn `node <enginePath>` in the account workspace, feed the job on stdin,
19
+ * and return the parsed figures. Existence of engine and method is gated first
20
+ * so a missing artifact is a named fault, never a script crash. */
21
+ export declare function runEngine(a: RunEngineArgs): Promise<EngineResult>;
22
+ /** Persist figures to quoting/jobs/<jobId>/figures.json and return the path. */
23
+ export declare function writeFigures(accountDir: string, jobId: string, figures: unknown): string;
24
+ //# sourceMappingURL=engine-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-run.d.ts","sourceRoot":"","sources":["../../src/lib/engine-run.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,CAAC;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;oEAEoE;AACpE,wBAAsB,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CvE;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAKxF"}
@@ -0,0 +1,59 @@
1
+ // Execute the operator's already-persisted pricing engine as a child process.
2
+ // The engine is the operator's own bespoke script; this module never regenerates
3
+ // it, never parses the method, and embeds no rate/catalogue/roll-up. It fixes the
4
+ // I/O boundary a generated engine conforms to: {methodPath, job, mode} on stdin,
5
+ // figures JSON on stdout. A fault returns zero figures and a distinct cause.
6
+ import { spawn } from "node:child_process";
7
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
8
+ import { dirname, join } from "node:path";
9
+ /** Spawn `node <enginePath>` in the account workspace, feed the job on stdin,
10
+ * and return the parsed figures. Existence of engine and method is gated first
11
+ * so a missing artifact is a named fault, never a script crash. */
12
+ export async function runEngine(a) {
13
+ if (!existsSync(a.enginePath)) {
14
+ return { ok: false, reason: "engine-absent", detail: `no engine at ${a.enginePath}` };
15
+ }
16
+ if (!existsSync(a.methodPath)) {
17
+ return { ok: false, reason: "method-absent", detail: `no method at ${a.methodPath}` };
18
+ }
19
+ const payload = JSON.stringify({ methodPath: a.methodPath, job: a.job, mode: a.mode });
20
+ const { code, stdout, stderr } = await new Promise((resolve) => {
21
+ const child = spawn("node", [a.enginePath], { cwd: a.accountDir });
22
+ let out = "";
23
+ let err = "";
24
+ child.stdout.on("data", (d) => (out += d));
25
+ child.stderr.on("data", (d) => (err += d));
26
+ child.on("error", (e) => resolve({ code: -1, stdout: out, stderr: String(e) }));
27
+ child.on("close", (c) => resolve({ code: c, stdout: out, stderr: err }));
28
+ // A script that exits before draining stdin closes the read end mid-write,
29
+ // raising EPIPE. Swallow it: the exit code from `close` carries the fault, so
30
+ // an early exit surfaces as script-error rather than crashing the server.
31
+ child.stdin.on("error", () => { });
32
+ child.stdin.write(payload);
33
+ child.stdin.end();
34
+ });
35
+ if (code !== 0) {
36
+ return { ok: false, reason: "script-error", detail: `engine exited ${code}: ${stderr.trim().slice(0, 400)}` };
37
+ }
38
+ let figures;
39
+ try {
40
+ figures = JSON.parse(stdout);
41
+ }
42
+ catch {
43
+ return { ok: false, reason: "script-error", detail: `engine stdout was not JSON: ${stdout.trim().slice(0, 200)}` };
44
+ }
45
+ const required = a.mode === "quote" ? ["total", "reconcile"] : ["deltas"];
46
+ const missing = required.filter((k) => !(k in figures));
47
+ if (missing.length > 0) {
48
+ return { ok: false, reason: "script-error", detail: `engine output missing required field(s): ${missing.join(", ")}` };
49
+ }
50
+ return { ok: true, figures };
51
+ }
52
+ /** Persist figures to quoting/jobs/<jobId>/figures.json and return the path. */
53
+ export function writeFigures(accountDir, jobId, figures) {
54
+ const path = join(accountDir, "quoting", "jobs", jobId, "figures.json");
55
+ mkdirSync(dirname(path), { recursive: true });
56
+ writeFileSync(path, JSON.stringify(figures, null, 2));
57
+ return path;
58
+ }
59
+ //# sourceMappingURL=engine-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-run.js","sourceRoot":"","sources":["../../src/lib/engine-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface ReconcileVerdict {
2
+ pass: boolean;
3
+ shown?: number;
4
+ }
5
+ export interface LeakVerdict {
6
+ pass: boolean;
7
+ }
8
+ export interface SignLinkVerdict {
9
+ pass: boolean;
10
+ href?: string;
11
+ reason?: "no-anchor" | "empty" | "fragment" | "non-https" | "relative";
12
+ }
13
+ /** The document's displayed grand total (data-quote-total) must equal the
14
+ * engine total. No marker → fail closed (an unverifiable total is not shipped). */
15
+ export declare function gateReconcile(html: string, engineTotal: number): ReconcileVerdict;
16
+ /** A client document carrying a cost/margin marker (data-internal-only) is a
17
+ * leak — the boundary is structural, not a matter of remembering to omit. */
18
+ export declare function gateMarginLeak(html: string): LeakVerdict;
19
+ /** The client quote's Sign-Online anchor href must be an absolute https URL —
20
+ * the same verdict ladder the quote-generation link-liveness gate applies. */
21
+ export declare function gateSignLink(html: string): SignLinkVerdict;
22
+ //# sourceMappingURL=gates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../src/lib/gates.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;AACnE,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,OAAO,CAAA;CAAE;AAC9C,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAA;CAAE;AAEzI;oFACoF;AACpF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAMjF;AAED;8EAC8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAExD;AAED;+EAC+E;AAC/E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAS1D"}
@@ -0,0 +1,40 @@
1
+ // The three deterministic, fail-closed gates quote-render enforces on the HTML
2
+ // the operator's render script emits. They are structural checks over stable
3
+ // attributes the render script marks — not business content:
4
+ // data-quote-total the displayed grand total (reconcile against the engine)
5
+ // data-internal-only cost/margin-bearing figures (must be absent from client docs)
6
+ // data-esign-accept the client quote's Sign-Online anchor (absolute https only)
7
+ /** The document's displayed grand total (data-quote-total) must equal the
8
+ * engine total. No marker → fail closed (an unverifiable total is not shipped). */
9
+ export function gateReconcile(html, engineTotal) {
10
+ const m = html.match(/data-quote-total="([^"]*)"/i);
11
+ if (!m || m[1].trim() === "")
12
+ return { pass: false };
13
+ const shown = Number(m[1]);
14
+ if (!Number.isFinite(shown))
15
+ return { pass: false };
16
+ return { pass: shown === engineTotal, shown };
17
+ }
18
+ /** A client document carrying a cost/margin marker (data-internal-only) is a
19
+ * leak — the boundary is structural, not a matter of remembering to omit. */
20
+ export function gateMarginLeak(html) {
21
+ return { pass: !/\bdata-internal-only\b/i.test(html) };
22
+ }
23
+ /** The client quote's Sign-Online anchor href must be an absolute https URL —
24
+ * the same verdict ladder the quote-generation link-liveness gate applies. */
25
+ export function gateSignLink(html) {
26
+ const tag = html.match(/<a[^>]*\bdata-esign-accept\b[^>]*>/i)?.[0];
27
+ if (!tag)
28
+ return { pass: false, reason: "no-anchor" };
29
+ const href = tag.match(/href="([^"]*)"/i)?.[1] ?? "";
30
+ if (/^https:\/\//i.test(href))
31
+ return { pass: true, href };
32
+ if (href === "")
33
+ return { pass: false, href, reason: "empty" };
34
+ if (href.startsWith("#"))
35
+ return { pass: false, href, reason: "fragment" };
36
+ if (/^[a-z][a-z0-9+.-]*:/i.test(href))
37
+ return { pass: false, href, reason: "non-https" };
38
+ return { pass: false, href, reason: "relative" };
39
+ }
40
+ //# sourceMappingURL=gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.js","sourceRoot":"","sources":["../../src/lib/gates.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,6DAA6D;AAC7D,gFAAgF;AAChF,qFAAqF;AACrF,mFAAmF;AAMnF;oFACoF;AACpF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,WAAmB;IAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED;8EAC8E;AAC9E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,EAAE,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3D,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC3E,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACzF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,47 @@
1
+ export type Basis = "printed" | "scaled" | "count" | "operator";
2
+ /** A drawing scale: a stated ratio (1:R → R), or a known-dimension calibration
3
+ * where `actual/measuredRef` is the factor. */
4
+ export type Scale = {
5
+ ratio: number;
6
+ } | {
7
+ measuredRef: number;
8
+ actual: number;
9
+ };
10
+ export interface InLine {
11
+ element: string;
12
+ basis: Basis;
13
+ value?: number;
14
+ unit?: string;
15
+ measured?: number;
16
+ measuredB?: number;
17
+ kind?: "length" | "area";
18
+ count?: number | number[];
19
+ crossCheck?: {
20
+ value: number;
21
+ unit?: string;
22
+ tolerance?: number;
23
+ };
24
+ }
25
+ export interface OutLine {
26
+ element: string;
27
+ quantity: number;
28
+ unit?: string;
29
+ basis: Basis;
30
+ crossCheck?: {
31
+ printed: number;
32
+ delta: number;
33
+ disagree: boolean;
34
+ };
35
+ }
36
+ export interface TakeoffResult {
37
+ lines: OutLine[];
38
+ counts: {
39
+ exact: number;
40
+ scaled: number;
41
+ };
42
+ }
43
+ export declare function computeTakeoff(input: {
44
+ scale?: Scale;
45
+ lines: InLine[];
46
+ }): TakeoffResult;
47
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/lib/geometry.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAEhE;gDACgD;AAChD,MAAM,MAAM,KAAK,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CACpE;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AA0CD,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,aAAa,CAevF"}
@@ -0,0 +1,60 @@
1
+ // Deterministic takeoff geometry. Pure arithmetic over agent-supplied measured
2
+ // inputs — scale to a real dimension, a scaled area from two sides, and a count
3
+ // roll-up — plus a cross-check of a scaled quantity against a printed figure.
4
+ // Reading the drawing and eliciting the inputs is the takeoff skill's job, not
5
+ // this module's. No business content: it multiplies numbers, it prices nothing.
6
+ function scaleFactor(scale, element) {
7
+ if (!scale)
8
+ throw new Error(`takeoff: line "${element}" is scale-derived but no scale was supplied`);
9
+ const factor = "ratio" in scale ? scale.ratio : scale.actual / scale.measuredRef;
10
+ if (!Number.isFinite(factor)) {
11
+ throw new Error(`takeoff: line "${element}" has a degenerate scale (factor=${factor})`);
12
+ }
13
+ return factor;
14
+ }
15
+ function quantityFor(line, scale) {
16
+ switch (line.basis) {
17
+ case "printed":
18
+ case "operator": {
19
+ if (typeof line.value !== "number") {
20
+ throw new Error(`takeoff: line "${line.element}" (${line.basis}) is missing its value`);
21
+ }
22
+ return line.value;
23
+ }
24
+ case "count": {
25
+ if (line.count === undefined) {
26
+ throw new Error(`takeoff: line "${line.element}" (count) is missing its count`);
27
+ }
28
+ return Array.isArray(line.count) ? line.count.reduce((a, b) => a + b, 0) : line.count;
29
+ }
30
+ case "scaled": {
31
+ if (typeof line.measured !== "number") {
32
+ throw new Error(`takeoff: line "${line.element}" (scaled) is missing its measured length`);
33
+ }
34
+ const factor = scaleFactor(scale, line.element);
35
+ if (line.kind === "area") {
36
+ if (typeof line.measuredB !== "number") {
37
+ throw new Error(`takeoff: line "${line.element}" (scaled area) is missing its second side`);
38
+ }
39
+ return line.measured * line.measuredB * factor * factor;
40
+ }
41
+ return line.measured * factor;
42
+ }
43
+ }
44
+ }
45
+ export function computeTakeoff(input) {
46
+ const lines = input.lines.map((line) => {
47
+ const quantity = quantityFor(line, input.scale);
48
+ const out = { element: line.element, quantity, unit: line.unit, basis: line.basis };
49
+ if (line.basis === "scaled" && line.crossCheck) {
50
+ const printed = line.crossCheck.value;
51
+ const delta = quantity - printed;
52
+ const tolerance = line.crossCheck.tolerance ?? 0;
53
+ out.crossCheck = { printed, delta, disagree: Math.abs(delta) > tolerance };
54
+ }
55
+ return out;
56
+ });
57
+ const scaled = lines.filter((l) => l.basis === "scaled").length;
58
+ return { lines, counts: { exact: lines.length - scaled, scaled } };
59
+ }
60
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/lib/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Emit one structured observability line to stderr. Every tool invocation logs
3
+ * one line here, correlated by `jobId`; journald captures stderr, so the
4
+ * diagnostic path is `journalctl --user | grep -E '\\[quote-engine\\]|...'`.
5
+ */
6
+ export declare function logLine(s: string): void;
7
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAEvC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Emit one structured observability line to stderr. Every tool invocation logs
3
+ * one line here, correlated by `jobId`; journald captures stderr, so the
4
+ * diagnostic path is `journalctl --user | grep -E '\\[quote-engine\\]|...'`.
5
+ */
6
+ export function logLine(s) {
7
+ process.stderr.write(s + "\n");
8
+ }
9
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type SignLinkVerdict } from "./gates.js";
2
+ export type RenderFault = "render-absent" | "render-error" | "reconcile-fail" | "margin-leak" | "sign-link";
3
+ export interface RunRenderArgs {
4
+ accountDir: string;
5
+ renderScriptPath: string;
6
+ figures: Record<string, unknown>;
7
+ signUrl?: string;
8
+ jobId: string;
9
+ }
10
+ export type RenderResult = {
11
+ ok: true;
12
+ docs: {
13
+ internal: string;
14
+ breakdown: string;
15
+ quote: string;
16
+ };
17
+ reconcile: {
18
+ internal: boolean;
19
+ breakdown: boolean;
20
+ quote: boolean;
21
+ };
22
+ signLink: SignLinkVerdict;
23
+ } | {
24
+ ok: false;
25
+ reason: RenderFault;
26
+ detail: string;
27
+ };
28
+ export declare function runRender(a: RunRenderArgs): Promise<RenderResult>;
29
+ //# sourceMappingURL=render-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-run.d.ts","sourceRoot":"","sources":["../../src/lib/render-run.ts"],"names":[],"mappings":"AAYA,OAAO,EAA+C,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/F,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,cAAc,GAAG,gBAAgB,GAAG,aAAa,GAAG,WAAW,CAAC;AAE5G,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,YAAY,GACpB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,SAAS,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,QAAQ,EAAE,eAAe,CAAC;CAC3B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvD,wBAAsB,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAyFvE"}