@tequila99/githuman 0.11.2 → 0.13.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 (325) hide show
  1. package/README.md +74 -2
  2. package/dist/cli/commands/mcp.js +112 -0
  3. package/dist/cli/commands/pi-acp.js +21 -0
  4. package/dist/cli/config.js +10 -1
  5. package/dist/cli/index.js +19 -8
  6. package/dist/cli/server-runtime.js +5 -0
  7. package/dist/server/adapters/agents/artifact-permission.js +88 -0
  8. package/dist/server/adapters/pi-acp/agent.js +98 -0
  9. package/dist/server/adapters/pi-acp/compatibility.js +57 -0
  10. package/dist/server/adapters/pi-acp/control.js +76 -0
  11. package/dist/server/adapters/pi-acp/errors.js +17 -0
  12. package/dist/server/adapters/pi-acp/extension.js +255 -0
  13. package/dist/server/adapters/pi-acp/launch.js +16 -0
  14. package/dist/server/adapters/pi-acp/mcp.js +153 -0
  15. package/dist/server/adapters/pi-acp/process.js +199 -0
  16. package/dist/server/adapters/pi-acp/session.js +409 -0
  17. package/dist/server/adapters/pi-acp/vendor/LICENSE +21 -0
  18. package/dist/server/adapters/pi-acp/vendor/README.md +29 -0
  19. package/dist/server/adapters/pi-acp/vendor/prompt.js +56 -0
  20. package/dist/server/app.js +95 -5
  21. package/dist/server/config/agents.js +4 -6
  22. package/dist/server/db/artifact-graph-migrations.js +56 -0
  23. package/dist/server/db/artifact-migrations.js +70 -0
  24. package/dist/server/db/artifact-review-migrations.js +24 -0
  25. package/dist/server/db/artifact-search-migrations.js +31 -0
  26. package/dist/server/db/artifact-validation-migrations.js +70 -0
  27. package/dist/server/db/index.js +3 -0
  28. package/dist/server/db/migrations.js +10 -0
  29. package/dist/server/db/sqlite-error.js +15 -0
  30. package/dist/server/db/transaction.js +40 -0
  31. package/dist/server/errors/artifacts.js +28 -0
  32. package/dist/server/errors/database.js +2 -0
  33. package/dist/server/hooks/access/local-request.js +5 -0
  34. package/dist/server/hooks/access/require-access.js +13 -2
  35. package/dist/server/repositories/artifact-catalog.repo.js +283 -0
  36. package/dist/server/repositories/artifact-files.repo.js +181 -0
  37. package/dist/server/repositories/artifact-graph.repo.js +50 -0
  38. package/dist/server/repositories/artifact-search.repo.js +192 -0
  39. package/dist/server/repositories/artifact-transition.repo.js +85 -0
  40. package/dist/server/repositories/artifact-validation.repo.js +157 -0
  41. package/dist/server/repositories/notes-catalog.repo.js +2 -10
  42. package/dist/server/repositories/task.repo.js +114 -0
  43. package/dist/server/routes/agent.js +8 -1
  44. package/dist/server/routes/artifact-actions.js +129 -0
  45. package/dist/server/routes/artifact-agent.js +199 -0
  46. package/dist/server/routes/artifact-definitions.js +163 -0
  47. package/dist/server/routes/artifact-transitions.js +80 -0
  48. package/dist/server/routes/artifacts.js +111 -0
  49. package/dist/server/routes/events.js +5 -1
  50. package/dist/server/services/agent/agent-session.js +180 -10
  51. package/dist/server/services/agent/context-builder.js +30 -2
  52. package/dist/server/services/agent/session-registry.js +136 -10
  53. package/dist/server/services/agent/turn-task-context.js +1 -0
  54. package/dist/server/services/artifact-authorization.service.js +199 -0
  55. package/dist/server/services/artifact-definition.service.js +96 -0
  56. package/dist/server/services/artifact-export.service.js +44 -0
  57. package/dist/server/services/artifact-graph-validation.js +541 -0
  58. package/dist/server/services/artifact-graph.service.js +81 -0
  59. package/dist/server/services/artifact-lifecycle.service.js +431 -0
  60. package/dist/server/services/artifact-maintenance.service.js +55 -0
  61. package/dist/server/services/artifact-search.service.js +331 -0
  62. package/dist/server/services/artifact-storage.service.js +646 -0
  63. package/dist/server/services/artifact-transition.service.js +608 -0
  64. package/dist/server/services/artifact-type.service.js +74 -0
  65. package/dist/server/services/artifact-validation-jobs.service.js +848 -0
  66. package/dist/server/services/device-connections.js +9 -1
  67. package/dist/server/services/review.service.js +6 -5
  68. package/dist/server/services/task.service.js +225 -0
  69. package/dist/server/utils/artifact-actor.js +13 -0
  70. package/dist/server/utils/artifact-page.js +42 -0
  71. package/dist/server/utils/take-within-bytes.js +16 -0
  72. package/dist/server/utils/text.js +7 -0
  73. package/dist/shared/agents/schemas.js +30 -0
  74. package/dist/shared/app/storage-constants.js +2 -0
  75. package/dist/shared/artifact-tools/descriptions.js +17 -0
  76. package/dist/shared/artifact-tools/instructions.js +14 -0
  77. package/dist/shared/artifact-tools/schemas.js +124 -0
  78. package/dist/shared/artifact-transitions/constants.js +21 -0
  79. package/dist/shared/artifact-transitions/schemas.js +111 -0
  80. package/dist/shared/artifact-transitions/transitions.js +61 -0
  81. package/dist/shared/artifact-transitions/types.js +1 -0
  82. package/dist/shared/artifacts/constants.js +34 -0
  83. package/dist/shared/artifacts/mcp-constants.js +24 -0
  84. package/dist/shared/artifacts/normalize.js +9 -0
  85. package/dist/shared/artifacts/schemas.js +874 -0
  86. package/dist/shared/artifacts/search.js +101 -0
  87. package/dist/shared/artifacts/types.js +1 -0
  88. package/dist/shared/events/schemas.js +1 -1
  89. package/dist/shared/events/types.js +1 -0
  90. package/dist/shared/tasks/schemas.js +261 -0
  91. package/dist/shared/tasks/types.js +1 -0
  92. package/dist/shared/utils/artifact-body.js +10 -0
  93. package/dist/shared/utils/canonical-json.js +22 -0
  94. package/dist/shared/utils/is-safe-prefixed-filename.js +10 -0
  95. package/dist/shared/utils/is-uuid.js +4 -2
  96. package/dist/shared/utils/is-valid-artifact-type-id.js +9 -0
  97. package/dist/shared/utils/is-valid-filename-prefix.js +13 -0
  98. package/dist/web/assets/AccessPage-D9xfFUBC.js +1 -0
  99. package/dist/web/assets/AddButton-DKNKmS1i.js +4 -0
  100. package/dist/web/assets/AddToAgentButton-wC1dzbDE.js +1 -0
  101. package/dist/web/assets/AppPage-Cozv2vqG.js +1 -0
  102. package/dist/web/assets/ArtifactsPage-IHUO7SbH.js +2 -0
  103. package/dist/web/assets/ArtifactsPage-nRD9XiRm.css +1 -0
  104. package/dist/web/assets/CancelButton-mkxRHwoZ.js +1 -0
  105. package/dist/web/assets/ClosePopup-Bd5a-Lu_.js +1 -0
  106. package/dist/web/assets/CreateButton-zCmb7snC.js +1 -0
  107. package/dist/web/assets/CreateReviewFabButton-D58IHr36.js +1 -0
  108. package/dist/web/assets/DialogHeader-BVrtb0Ri.js +1 -0
  109. package/dist/web/assets/DialogHeader-CPL9OtDV.css +1 -0
  110. package/dist/web/assets/{ErrorNotFound-DucDzOUJ.js → ErrorNotFound-fXS367lZ.js} +1 -1
  111. package/dist/web/assets/{IndexPage-D5PvyGrX.css → IndexPage-5V5GLtgi.css} +1 -1
  112. package/dist/web/assets/IndexPage-BJ1EQdlT.js +1 -0
  113. package/dist/web/assets/MainLayout-C3Ie5yOo.css +1 -0
  114. package/dist/web/assets/MainLayout-CeogGMHH.js +7 -0
  115. package/dist/web/assets/{NoteVisualEditor-CawpxEFB.css → NoteVisualEditor-DE4ACTRJ.css} +1 -1
  116. package/dist/web/assets/NoteVisualEditor-DqAZZig1.js +1054 -0
  117. package/dist/web/assets/NotesPage-C_eoCUl7.css +1 -0
  118. package/dist/web/assets/NotesPage-DXgI-kwN.js +4 -0
  119. package/dist/web/assets/{PdfPreview-rlkcqoMF.js → PdfPreview-ByeBjQMQ.js} +2 -2
  120. package/dist/web/assets/ProjectFilePage-DV1anYfN.js +1 -0
  121. package/dist/web/assets/QBtn-V3VXtJXi.js +1 -0
  122. package/dist/web/assets/QFab-DJhLqo9i.js +1 -0
  123. package/dist/web/assets/{QForm-Be8-ucuJ.js → QForm-ClpSneeD.js} +1 -1
  124. package/dist/web/assets/QInput-BnqLJGXl.js +1 -0
  125. package/dist/web/assets/QScrollArea-qf2G1s2r.js +1 -0
  126. package/dist/web/assets/QSeparator-B8uLaDiI.js +1 -0
  127. package/dist/web/assets/QSpace-CVp0CPR_.js +1 -0
  128. package/dist/web/assets/QSplitter-K2LjbupZ.js +1 -0
  129. package/dist/web/assets/QTabs-Bl_rIz4_.js +1 -0
  130. package/dist/web/assets/QVirtualScroll-BeEkuL6x.js +1 -0
  131. package/dist/web/assets/ReviewDetailPage-BgxcsTqY.css +1 -0
  132. package/dist/web/assets/ReviewDetailPage-CL4Dmz0L.js +1 -0
  133. package/dist/web/assets/ReviewsPage-BPJFTulG.js +1 -0
  134. package/dist/web/assets/SaveButton-D1q2suzR.js +3 -0
  135. package/dist/web/assets/SaveButton-Vtjvcbt0.css +1 -0
  136. package/dist/web/assets/SearchInput-DapVXrFj.js +1 -0
  137. package/dist/web/assets/StatusSwitcher-BtbSIr5q.js +1 -0
  138. package/dist/web/assets/{StatusSwitcher-D6i8_OfR.css → StatusSwitcher-DaE1ufAA.css} +1 -1
  139. package/dist/web/assets/TagFilterField-CPl-BxtL.js +1 -0
  140. package/dist/web/assets/TagFilterField-DjUH0m3_.css +1 -0
  141. package/dist/web/assets/{TerminalView-D4elkzN4.js → TerminalView-B56cEx8g.js} +12 -12
  142. package/dist/web/assets/{TerminalView-617DZuPt.css → TerminalView-BCeke4xd.css} +1 -1
  143. package/dist/web/assets/{abnfDiagram-O67JEVCF-Cugru96L.js → abnfDiagram-O67JEVCF-D_6l0gCA.js} +1 -1
  144. package/dist/web/assets/{access-store-Cdg8oRAM.js → access-store-CwkOl71l.js} +1 -1
  145. package/dist/web/assets/{agent-store-D_W7iD_B.js → agent-store-Cs-hu1v1.js} +5 -5
  146. package/dist/web/assets/architecture-7GRP2DOG-KT2-_RA5.js +1 -0
  147. package/dist/web/assets/{architectureDiagram-NJMV4G6O-7rMsE4Wt.js → architectureDiagram-NJMV4G6O-BFgjp9nL.js} +1 -1
  148. package/dist/web/assets/{blockDiagram-BEXU5L5S-BvSnwUrI.js → blockDiagram-BEXU5L5S-BWfbJk26.js} +1 -1
  149. package/dist/web/assets/{c4Diagram-YGBWAQC7-CgmQlCVx.js → c4Diagram-YGBWAQC7-oIqgOwQa.js} +1 -1
  150. package/dist/web/assets/channel-CAhty-fl.js +1 -0
  151. package/dist/web/assets/{chunk-3FUC2YCW-_i8udThz.js → chunk-3FUC2YCW-WI2pliXT.js} +1 -1
  152. package/dist/web/assets/{chunk-5DYCD2WN-Mhk2LlLk.js → chunk-5DYCD2WN-DYvaF8o2.js} +1 -1
  153. package/dist/web/assets/{chunk-742MDFTN-CDVcwgEp.js → chunk-742MDFTN-xd7B3x5h.js} +1 -1
  154. package/dist/web/assets/{chunk-7INBJB4K-C2c1fi9s.js → chunk-7INBJB4K-nsyx3RGB.js} +1 -1
  155. package/dist/web/assets/{chunk-7M6MHVWA-BeGkoIBL.js → chunk-7M6MHVWA-BxPQ9AEv.js} +1 -1
  156. package/dist/web/assets/{chunk-7PRAP22T-BVWTh9sT.js → chunk-7PRAP22T-CvHw2y-F.js} +1 -1
  157. package/dist/web/assets/{chunk-GTNCS2PH-gVhX7NZP.js → chunk-GTNCS2PH-DIfN1SOI.js} +1 -1
  158. package/dist/web/assets/{chunk-GWA4HPMP-BPdnIcQH.js → chunk-GWA4HPMP-2WZX1fG-.js} +1 -1
  159. package/dist/web/assets/{chunk-MBY4JIJT-B2VfO_06.js → chunk-MBY4JIJT-BL7akw7q.js} +1 -1
  160. package/dist/web/assets/{chunk-NETBCI7D-DZF_gITO.js → chunk-NETBCI7D-CQX1tY3W.js} +1 -1
  161. package/dist/web/assets/{chunk-O7XYJQB3-CDpBWiLq.js → chunk-O7XYJQB3-CtGXf4J6.js} +1 -1
  162. package/dist/web/assets/{chunk-UA2S7LBM-Iv7TSRE_.js → chunk-UA2S7LBM-C_3M_IIp.js} +1 -1
  163. package/dist/web/assets/{chunk-WEXAMYUT-Ce6goZ2Y.js → chunk-WEXAMYUT-6MO559WJ.js} +1 -1
  164. package/dist/web/assets/{chunk-Z7XXMR3K-CY6E6_Ux.js → chunk-Z7XXMR3K-CHJ55IlF.js} +1 -1
  165. package/dist/web/assets/{chunk-ZIGJFQKS-BLzsXZBc.js → chunk-ZIGJFQKS-533qcfPb.js} +1 -1
  166. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-Dz0kD9P6.js → classDiagram-v2-NBCMYWYE-CFySVswx.js} +1 -1
  167. package/dist/web/assets/copy-code-XoEu_Yh6.js +1 -0
  168. package/dist/web/assets/create-DedXY-KP.js +1 -0
  169. package/dist/web/assets/{cynefin-OW5HDTMX-DWIx3wRm.js → cynefin-OW5HDTMX-Dfg_2VTu.js} +1 -1
  170. package/dist/web/assets/{cynefinDiagram-VND7K2PF-2D80uocv.js → cynefinDiagram-VND7K2PF-DaSXiPph.js} +1 -1
  171. package/dist/web/assets/{dagre-6A5THRUB-BLBhukn-.js → dagre-6A5THRUB-D7d1gbRO.js} +1 -1
  172. package/dist/web/assets/date-snFAXn1W.js +1 -0
  173. package/dist/web/assets/{devices-store-BfZKPOhg.js → devices-store-DB_tWC1Q.js} +1 -1
  174. package/dist/web/assets/{diagram-22UHCM2B-DY8dMLZ3.js → diagram-22UHCM2B-CNuTss_x.js} +1 -1
  175. package/dist/web/assets/{diagram-3UASUU5V-Bf6Od1NH.js → diagram-3UASUU5V--Rt3-ARV.js} +1 -1
  176. package/dist/web/assets/{diagram-ATOU4E4O-CjLGcYD5.js → diagram-ATOU4E4O-BP79L-gP.js} +1 -1
  177. package/dist/web/assets/{diagram-CDSNMT55-gIvaVNvs.js → diagram-CDSNMT55-CRO5cocs.js} +1 -1
  178. package/dist/web/assets/{diagram-MLGK6HIB-VR5kiCi5.js → diagram-MLGK6HIB-Difu0Zmh.js} +1 -1
  179. package/dist/web/assets/{diagram-MPIPVDR6-CdAdj25I.js → diagram-MPIPVDR6-grQ3ie17.js} +1 -1
  180. package/dist/web/assets/diff-store-D4XiTkfi.js +93 -0
  181. package/dist/web/assets/{dist-CBGyhCYv.js → dist-75uxNoTf.js} +1 -1
  182. package/dist/web/assets/{dist-CIMEaJAX.js → dist-9rzCziV2.js} +1 -1
  183. package/dist/web/assets/{dist-CEl-Ko94.js → dist-B9i6cUYu.js} +1 -1
  184. package/dist/web/assets/{dist-yzAhvE-V.js → dist-BU-fZfEv.js} +1 -1
  185. package/dist/web/assets/{dist-CTd7Kuqx.js → dist-BeUB43Ur.js} +1 -1
  186. package/dist/web/assets/{dist-C85t5q3z.js → dist-BxIdk5Al.js} +1 -1
  187. package/dist/web/assets/{dist-joQDFmfy.js → dist-By534Syk.js} +1 -1
  188. package/dist/web/assets/{dist-C54FrSb8.js → dist-DFjLCq-0.js} +1 -1
  189. package/dist/web/assets/{dist-lgw4kcVA.js → dist-DNrP7O-J.js} +1 -1
  190. package/dist/web/assets/{dist-BU8erXQF.js → dist-Du5VPTAq.js} +1 -1
  191. package/dist/web/assets/{dist-DLuI1PxH.js → dist-DyBqP777.js} +1 -1
  192. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-irTAlMFO.js → ebnfDiagram-ZINNZB2B-DX2rcvMK.js} +1 -1
  193. package/dist/web/assets/{elk-276RUBZZ-Dj5ligvC.js → elk-276RUBZZ-DSHIl9hv.js} +1 -1
  194. package/dist/web/assets/{erDiagram-OPXOYQCR-Bvn6rbL1.js → erDiagram-OPXOYQCR-BIZVJO8N.js} +1 -1
  195. package/dist/web/assets/eventmodeling-NTZA5JFV-Bh_xDKx6.js +1 -0
  196. package/dist/web/assets/flowDiagram-KWPJA3E3-DXkIxaXL.js +1 -0
  197. package/dist/web/assets/{ganttDiagram-FUAMR5RP-BNGAUF5H.js → ganttDiagram-FUAMR5RP-D4kPfh4X.js} +1 -1
  198. package/dist/web/assets/{gitGraph-4MIJSDKK-DYSHOl72.js → gitGraph-4MIJSDKK-B41R-oAb.js} +1 -1
  199. package/dist/web/assets/{gitGraphDiagram-X574FWY7-BGwRHrPq.js → gitGraphDiagram-X574FWY7-xXrZiSJI.js} +1 -1
  200. package/dist/web/assets/i18n-Cfw_OfRR.js +1 -0
  201. package/dist/web/assets/icons-BIOTvmdT.js +1 -0
  202. package/dist/web/assets/index-B1Bugudn.js +2 -0
  203. package/dist/web/assets/index-BQU3KK1E.css +1 -0
  204. package/dist/web/assets/{info-A6RAGUB7-DNWR20pW.js → info-A6RAGUB7-CgSmK-La.js} +1 -1
  205. package/dist/web/assets/{infoDiagram-VRGFBTTK-BhNwJLY5.js → infoDiagram-VRGFBTTK-CDNEJ_R-.js} +1 -1
  206. package/dist/web/assets/{init-app-cg-B_TFN.js → init-app-C3tD3faT.js} +1 -1
  207. package/dist/web/assets/{is-D0waCELe.js → is-B1kBQ5Va.js} +1 -1
  208. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-CSkDpn64.js → ishikawaDiagram-OU5B5YK6-ZcU1IxFn.js} +1 -1
  209. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-D2CEecC3.js → journeyDiagram-ZHPQQLJL-g-8ZRhJj.js} +1 -1
  210. package/dist/web/assets/{kanban-definition-PNTS6WVX-CQHlo4Hh.js → kanban-definition-PNTS6WVX-nfsfxVOE.js} +1 -1
  211. package/dist/web/assets/{line-C-izH1ks.js → line-BpuX_ban.js} +1 -1
  212. package/dist/web/assets/markdown-ogvtoQzt.js +16 -0
  213. package/dist/web/assets/mdi-Du7sIqtH.js +1 -0
  214. package/dist/web/assets/{mermaid-parser.core-CAGwq6D-.js → mermaid-parser.core-BBj_ep7Z.js} +3 -3
  215. package/dist/web/assets/{mermaid.core--xlI_0tK.js → mermaid.core-DP4USVSM.js} +4 -4
  216. package/dist/web/assets/{mindmap-definition-NLK3R4M7-BuCxhlwy.js → mindmap-definition-NLK3R4M7-C5GhUvi3.js} +1 -1
  217. package/dist/web/assets/{packet-AYTQ26CC-Bi7x5lJK.js → packet-AYTQ26CC-BIdb-vfg.js} +1 -1
  218. package/dist/web/assets/{pegDiagram-GJSIUBJH-qWzBPkCQ.js → pegDiagram-GJSIUBJH-DH-SdKj6.js} +1 -1
  219. package/dist/web/assets/{pie-WAS4IAKB-Di0wC4XB.js → pie-WAS4IAKB-Du3-jRjK.js} +1 -1
  220. package/dist/web/assets/{pieDiagram-5QR66LMP-BCDVY9q2.js → pieDiagram-5QR66LMP-CJh2ngqY.js} +1 -1
  221. package/dist/web/assets/pinia-BfqEuvsi.js +1 -0
  222. package/dist/web/assets/pinia-mdReENsc.js +1 -0
  223. package/dist/web/assets/preview-store-DOnSmm_C.js +2 -0
  224. package/dist/web/assets/{project-files-store-byqyG2ts.js → project-files-store-CHP6RYFI.js} +1 -1
  225. package/dist/web/assets/{quadrantDiagram-O4NWA36T-CpFObUjT.js → quadrantDiagram-O4NWA36T-DYsSScxc.js} +1 -1
  226. package/dist/web/assets/{radar-RG4KPBEZ-Br8yH8rq.js → radar-RG4KPBEZ-BBjvaVVB.js} +1 -1
  227. package/dist/web/assets/{railroad-74A4TZTK-CACSqhA-.js → railroad-74A4TZTK-B-CRncBU.js} +1 -1
  228. package/dist/web/assets/railroad-abnf-HS5TGJTU-D37zpoYN.js +1 -0
  229. package/dist/web/assets/railroad-ebnf-LZEXJU2U-ZnMxH6Ym.js +1 -0
  230. package/dist/web/assets/railroad-peg-WCYAUIDC-Dg3g-VsM.js +1 -0
  231. package/dist/web/assets/{railroadDiagram-XR7U4H2S-sYXRKGK1.js → railroadDiagram-XR7U4H2S-hqp-2UHb.js} +1 -1
  232. package/dist/web/assets/{render-C7fu7uYY.js → render-Brao9Nj2.js} +1 -1
  233. package/dist/web/assets/repository-store-DZgQ5H7J.js +1 -0
  234. package/dist/web/assets/{requirementDiagram-PLB6GJNP-C9I1JbQc.js → requirementDiagram-PLB6GJNP-Dhuw5jcQ.js} +1 -1
  235. package/dist/web/assets/runtime-core.esm-bundler-DDnHUoIy.js +1 -0
  236. package/dist/web/assets/{safe-storage-C76bPypO.js → safe-storage-BchoYSbq.js} +1 -1
  237. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-CuvFQhPh.js → sankeyDiagram-IPEJSGJF-D5rCIxGR.js} +1 -1
  238. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-CaVb9Y6e.js → sequenceDiagram-PO4LG4MO-YEHR4Mp-.js} +1 -1
  239. package/dist/web/assets/single-flight-CyDZB3rb.js +1 -0
  240. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-Dp_APryr.js → stateDiagram-v2-GCMORJYK-9iWmz6Xf.js} +1 -1
  241. package/dist/web/assets/{swimlanes-2SLR337P-FclUI-k0.js → swimlanes-2SLR337P-Cjwvgt_n.js} +1 -1
  242. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-gJwxhWoO.js +8 -0
  243. package/dist/web/assets/{terminal-store-BnEkXuBj.js → terminal-store-i7HHlWzR.js} +1 -1
  244. package/dist/web/assets/theme-CQ9InaWa.js +1 -0
  245. package/dist/web/assets/{timeline-definition-EJHVYXUP-BAqwqj3c.js → timeline-definition-EJHVYXUP-Cd5n2-Py.js} +1 -1
  246. package/dist/web/assets/{treeView-Q6P3EWNA-D87jJbUQ.js → treeView-Q6P3EWNA-C_QH9vtR.js} +1 -1
  247. package/dist/web/assets/{treemap-WGGIJYW6-B6nhGhRc.js → treemap-WGGIJYW6-CVnU7TVz.js} +1 -1
  248. package/dist/web/assets/use-add-agent-context-D5VqMr0p.js +1 -0
  249. package/dist/web/assets/use-app-theme-DgC4ivPF.js +1 -0
  250. package/dist/web/assets/use-countdown-D6_qSOZJ.js +1 -0
  251. package/dist/web/assets/use-notify-error-Dx2D9IEP.js +1 -0
  252. package/dist/web/assets/use-router-link-D7geCGQI.js +1 -0
  253. package/dist/web/assets/use-row-height-BgHg4-J-.js +1 -0
  254. package/dist/web/assets/use-server-events-CvcbsbIf.js +1 -0
  255. package/dist/web/assets/use-virtual-scroll-DixIsJk4.js +1 -0
  256. package/dist/web/assets/{use-workspace-navigation-CnebLvBV.js → use-workspace-navigation-Dq-Aw8Xq.js} +1 -1
  257. package/dist/web/assets/{usecaseDiagram-POWQR4AR-7YcIKxAb.js → usecaseDiagram-POWQR4AR-Cbj2Pvab.js} +1 -1
  258. package/dist/web/assets/{vennDiagram-UO4OBE2U-BZq5cFC4.js → vennDiagram-UO4OBE2U-2j79YqCN.js} +1 -1
  259. package/dist/web/assets/viewport-store-NqQS7itT.js +1 -0
  260. package/dist/web/assets/{vue-i18n.runtime-CEtihHHL.js → vue-i18n.runtime-JOo8b7-t.js} +2 -2
  261. package/dist/web/assets/{wardley-WFR3VGLG-BT8YO9H4.js → wardley-WFR3VGLG-wsMK7zm3.js} +1 -1
  262. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-rDpXFf6D.js → wardleyDiagram-VNRHLVJA-D6PKTQIJ.js} +1 -1
  263. package/dist/web/assets/weighted-lru-BFtZKA_y.js +1 -0
  264. package/dist/web/assets/workspace-navigation-CoXKJJpP.js +1 -0
  265. package/dist/web/assets/{xychartDiagram-PMCCYNJV-ClniUuZc.js → xychartDiagram-PMCCYNJV-D1fQN7KG.js} +1 -1
  266. package/dist/web/index.html +10 -9
  267. package/package.json +5 -3
  268. package/dist/web/assets/AccessPage-CX3w30zw.js +0 -1
  269. package/dist/web/assets/AppPage-PFJG281y.js +0 -1
  270. package/dist/web/assets/CreateButton-Ch0b7juj.js +0 -1
  271. package/dist/web/assets/CreateReviewFabButton-DTuJzw3q.js +0 -1
  272. package/dist/web/assets/IndexPage-tgW07Qvs.js +0 -1
  273. package/dist/web/assets/MainLayout-C6yBhQnf.css +0 -1
  274. package/dist/web/assets/MainLayout-Cw4jpB1x.js +0 -8
  275. package/dist/web/assets/NoteVisualEditor-DiGhLhQg.js +0 -1054
  276. package/dist/web/assets/NotesPage-CVyVr9tl.js +0 -4
  277. package/dist/web/assets/NotesPage-CxGnZuVQ.css +0 -1
  278. package/dist/web/assets/PanelResize-B6FP9ZVB.js +0 -1
  279. package/dist/web/assets/ProjectFilePage-CkxfX9b1.js +0 -1
  280. package/dist/web/assets/QBtn-CyyV1Bx_.js +0 -1
  281. package/dist/web/assets/QExpansionItem-Dp9lbdVb.js +0 -4
  282. package/dist/web/assets/QFab-LOmZ9rev.js +0 -1
  283. package/dist/web/assets/QInput-Dq6131uz.js +0 -1
  284. package/dist/web/assets/QSelect-B34OqtIH.js +0 -1
  285. package/dist/web/assets/QSpace-BhOVGpQh.js +0 -1
  286. package/dist/web/assets/QVirtualScroll-BYgJ1Kh2.js +0 -1
  287. package/dist/web/assets/ReviewDetailPage-CkCilMNW.css +0 -1
  288. package/dist/web/assets/ReviewDetailPage-GNjBa4X0.js +0 -1
  289. package/dist/web/assets/ReviewsPage-An5fRS92.js +0 -1
  290. package/dist/web/assets/StatusSwitcher-DrFHHwGm.js +0 -1
  291. package/dist/web/assets/architecture-7GRP2DOG-BPCNj4lR.js +0 -1
  292. package/dist/web/assets/channel-CzRYxuLe.js +0 -1
  293. package/dist/web/assets/create-B9Tn5Xvi.js +0 -1
  294. package/dist/web/assets/diff-store-B4adGxC2.js +0 -93
  295. package/dist/web/assets/eventmodeling-NTZA5JFV-BJsTZ_nG.js +0 -1
  296. package/dist/web/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff +0 -0
  297. package/dist/web/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 +0 -0
  298. package/dist/web/assets/flowDiagram-KWPJA3E3-CvXh1Df7.js +0 -1
  299. package/dist/web/assets/i18n-DnlAcIbT.js +0 -1
  300. package/dist/web/assets/index-Cw7GJi3K.js +0 -2
  301. package/dist/web/assets/index-wsOPzloa.css +0 -1
  302. package/dist/web/assets/markdown-CvtLTiBZ.js +0 -16
  303. package/dist/web/assets/pinia-DO0AdKGg.js +0 -1
  304. package/dist/web/assets/pinia-uOZCmBi-.js +0 -1
  305. package/dist/web/assets/preview-store-DyO8G-ox.js +0 -1
  306. package/dist/web/assets/railroad-abnf-HS5TGJTU-DTBsRB1c.js +0 -1
  307. package/dist/web/assets/railroad-ebnf-LZEXJU2U-D3mrY4ar.js +0 -1
  308. package/dist/web/assets/railroad-peg-WCYAUIDC-33ZjWX0u.js +0 -1
  309. package/dist/web/assets/repository-store-DtRDth1L.js +0 -1
  310. package/dist/web/assets/runtime-core.esm-bundler-CAvPiMpd.js +0 -1
  311. package/dist/web/assets/single-flight-fPyIy7h5.js +0 -1
  312. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CuUvsn0e.js +0 -8
  313. package/dist/web/assets/theme-CnbaLamF.js +0 -1
  314. package/dist/web/assets/use-add-agent-context-xHAjjOf1.js +0 -1
  315. package/dist/web/assets/use-app-theme-DEowpWRR.js +0 -1
  316. package/dist/web/assets/use-countdown-DlcwwJrs.js +0 -1
  317. package/dist/web/assets/use-panel-width-CjSWCFr4.js +0 -1
  318. package/dist/web/assets/use-router-link-CUoYaYUw.js +0 -1
  319. package/dist/web/assets/use-row-height-BsE9-rO2.js +0 -1
  320. package/dist/web/assets/use-server-events-C2X4Xz00.js +0 -1
  321. package/dist/web/assets/use-virtual-scroll-BAZGswHv.js +0 -1
  322. package/dist/web/assets/viewport-store-CCHiY2QG.js +0 -1
  323. package/dist/web/assets/weighted-lru-BGovtJ2a.js +0 -1
  324. package/dist/web/assets/workspace-navigation-DdW0rSGz.js +0 -1
  325. /package/dist/web/assets/{PanelResize-XjrbOj2S.css → AddToAgentButton-XjrbOj2S.css} +0 -0
@@ -0,0 +1,199 @@
1
+ import { piFailureReason } from "./errors.js";
2
+ import { terminateProcesses } from "../../services/terminal/processes.js";
3
+ import { spawn } from 'node:child_process';
4
+ import { randomBytes, randomUUID } from 'node:crypto';
5
+ import { Socket } from 'node:net';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { JsonChannel, CONTROL_VERSION, BRIDGE_TIMEOUT_MS, MAX_CONTROL_BYTES, MAX_PENDING_CALLS } from "./control.js";
8
+ import { piLaunchArgs } from "./compatibility.js";
9
+ import { isRecord } from "../../../shared/utils/guards.js";
10
+ export class PiProcess {
11
+ #pending = new Map();
12
+ #nonce = randomBytes(32).toString('hex');
13
+ #child;
14
+ #channel;
15
+ #closed = false;
16
+ #rpcBuffer = Buffer.alloc(0);
17
+ #hello = false;
18
+ #ready = false;
19
+ onControl = () => { };
20
+ onEvent = () => { };
21
+ onFailure = () => { };
22
+ async start(cwd, profile, config, env = process.env) {
23
+ const command = env.PI_ACP_PI_COMMAND || 'pi';
24
+ const extension = fileURLToPath(new URL(import.meta.url.endsWith('.ts') ? './extension.ts' : './extension.js', import.meta.url));
25
+ const args = await piLaunchArgs(command, profile, extension);
26
+ if (this.#closed) {
27
+ throw new Error('Pi bridge closed during runtime discovery');
28
+ }
29
+ const piEnv = { ...env, GITHUMAN_PI_NONCE: this.#nonce };
30
+ for (const key of [
31
+ 'GITHUMAN_AGENT_KEY',
32
+ 'GITHUMAN_AGENT_URL',
33
+ 'GITHUMAN_PI_PROFILE'
34
+ ]) {
35
+ delete piEnv[key];
36
+ }
37
+ const child = spawn(command, args, {
38
+ cwd,
39
+ env: piEnv,
40
+ stdio: ['pipe', 'pipe', 'pipe', 'pipe', 'pipe'],
41
+ detached: true
42
+ });
43
+ this.#child = child;
44
+ child.stdin.on('error', () => this.fail());
45
+ child.stderr.resume();
46
+ child.on('error', () => this.fail());
47
+ child.on('exit', () => this.fail());
48
+ const startup = new Promise((resolve, reject) => {
49
+ const timer = setTimeout(() => {
50
+ reject(new Error('Pi bridge startup deadline exceeded'));
51
+ this.fail();
52
+ }, BRIDGE_TIMEOUT_MS);
53
+ this.#pending.set('startup', {
54
+ resolve: () => {
55
+ clearTimeout(timer);
56
+ resolve();
57
+ },
58
+ reject: error => {
59
+ clearTimeout(timer);
60
+ reject(error);
61
+ }
62
+ });
63
+ });
64
+ const requestPipe = child.stdio[3];
65
+ const responsePipe = child.stdio[4];
66
+ if (!(requestPipe instanceof Socket) || !(responsePipe instanceof Socket)) {
67
+ throw new Error('Pi control pipes unavailable');
68
+ }
69
+ this.#channel = new JsonChannel(requestPipe, responsePipe, frame => {
70
+ if (frame.nonce !== this.#nonce)
71
+ return this.fail();
72
+ if (frame.type === 'fatal') {
73
+ this.fail(frame.reason === 'tool_name_collision'
74
+ ? 'Pi MCP tool name collision with an installed extension.'
75
+ : 'Pi extension reload requires a new chat.');
76
+ return;
77
+ }
78
+ if (frame.type === 'hello') {
79
+ if (this.#hello)
80
+ return this.fail();
81
+ this.#hello = true;
82
+ this.send('configure', { ...config, profile });
83
+ }
84
+ else if (frame.type === 'ready') {
85
+ if (!this.#hello ||
86
+ this.#ready ||
87
+ frame.profile !== profile ||
88
+ frame.registryGeneration !== 1) {
89
+ return this.fail();
90
+ }
91
+ this.#ready = true;
92
+ this.#pending.get('startup')?.resolve({});
93
+ this.#pending.delete('startup');
94
+ }
95
+ else if (this.#ready) {
96
+ this.onControl(frame);
97
+ }
98
+ else {
99
+ this.fail();
100
+ }
101
+ }, () => this.fail());
102
+ child.stdout.on('data', (chunk) => this.readRpc(chunk));
103
+ await startup;
104
+ }
105
+ send(type, fields = {}) {
106
+ if (!this.#channel || this.#closed) {
107
+ throw new Error('Pi bridge control channel unavailable');
108
+ }
109
+ this.#channel.send({
110
+ ...fields,
111
+ type,
112
+ nonce: this.#nonce,
113
+ version: CONTROL_VERSION
114
+ });
115
+ }
116
+ request(type, fields = {}) {
117
+ if (this.#closed ||
118
+ !this.#child?.stdin ||
119
+ this.#pending.size >= MAX_PENDING_CALLS) {
120
+ return Promise.reject(new Error('Pi RPC unavailable or pending limit exceeded'));
121
+ }
122
+ const id = randomUUID();
123
+ return new Promise((resolve, reject) => {
124
+ const timer = setTimeout(() => {
125
+ this.#pending.delete(id);
126
+ reject(new Error('Pi RPC deadline exceeded'));
127
+ this.fail();
128
+ }, type === 'prompt' ? 300000 : BRIDGE_TIMEOUT_MS);
129
+ this.#pending.set(id, {
130
+ resolve: value => {
131
+ clearTimeout(timer);
132
+ this.#pending.delete(id);
133
+ resolve(value);
134
+ },
135
+ reject: error => {
136
+ clearTimeout(timer);
137
+ this.#pending.delete(id);
138
+ reject(error);
139
+ }
140
+ });
141
+ this.#child.stdin.write(JSON.stringify({ ...fields, type, id }) + '\n');
142
+ });
143
+ }
144
+ readRpc(chunk) {
145
+ if (this.#rpcBuffer.length + chunk.length > MAX_CONTROL_BYTES) {
146
+ return this.fail();
147
+ }
148
+ this.#rpcBuffer = Buffer.concat([this.#rpcBuffer, chunk]);
149
+ let index;
150
+ while ((index = this.#rpcBuffer.indexOf(10)) >= 0) {
151
+ const line = this.#rpcBuffer.subarray(0, index).toString();
152
+ this.#rpcBuffer = this.#rpcBuffer.subarray(index + 1);
153
+ let event;
154
+ try {
155
+ event = JSON.parse(line);
156
+ }
157
+ catch {
158
+ continue;
159
+ }
160
+ if (!isRecord(event))
161
+ return this.fail();
162
+ if (event.type === 'response') {
163
+ const request = this.#pending.get(String(event.id));
164
+ if (request) {
165
+ if (event.success === true) {
166
+ request.resolve(isRecord(event.data) ? event.data : {});
167
+ }
168
+ else {
169
+ request.reject(new Error(piFailureReason(event.error)));
170
+ }
171
+ }
172
+ }
173
+ else {
174
+ this.onEvent(event);
175
+ }
176
+ }
177
+ }
178
+ fail(reason) {
179
+ if (this.#closed)
180
+ return;
181
+ this.close(reason);
182
+ this.onFailure();
183
+ }
184
+ close(reason = 'Pi bridge process or control channel closed') {
185
+ if (this.#closed)
186
+ return;
187
+ this.#closed = true;
188
+ for (const pending of this.#pending.values()) {
189
+ pending.reject(new Error(reason));
190
+ }
191
+ this.#pending.clear();
192
+ const child = this.#child;
193
+ if (!child?.pid) {
194
+ this.#channel?.close();
195
+ return;
196
+ }
197
+ void terminateProcesses(child.pid).finally(() => this.#channel?.close());
198
+ }
199
+ }
@@ -0,0 +1,409 @@
1
+ import { piFailureReason } from "./errors.js";
2
+ import { promptToPiMessage } from "./vendor/prompt.js";
3
+ import { randomUUID } from 'node:crypto';
4
+ import { McpRegistry } from "./mcp.js";
5
+ import { PiProcess } from "./process.js";
6
+ import { BRIDGE_TIMEOUT_MS, MAX_PENDING_CALLS } from "./control.js";
7
+ import { ARTIFACT_TASK_INSTRUCTIONS } from "../../../shared/artifact-tools/instructions.js";
8
+ import { isRecord } from "../../../shared/utils/guards.js";
9
+ export class PiSession {
10
+ id = randomUUID();
11
+ registry = new McpRegistry();
12
+ process = new PiProcess();
13
+ #generation = 0;
14
+ #turn;
15
+ #seen = new Set();
16
+ #pending = 0;
17
+ #ready = false;
18
+ #closed = false;
19
+ #cancelled = false;
20
+ #stopReason = 'end_turn';
21
+ #agentStarted = false;
22
+ #thinking = [];
23
+ #completion;
24
+ #begun;
25
+ #models = [];
26
+ #state = {};
27
+ profile;
28
+ callbacks;
29
+ constructor(profile, callbacks) {
30
+ this.profile = profile;
31
+ this.callbacks = callbacks;
32
+ const failure = () => {
33
+ const wasReady = this.#ready;
34
+ this.close();
35
+ if (wasReady)
36
+ callbacks.failure();
37
+ };
38
+ this.process.onFailure = failure;
39
+ this.registry.onFailure = failure;
40
+ this.process.onControl = frame => {
41
+ if (frame.type === 'begun' &&
42
+ frame.generation === this.#generation &&
43
+ this.#begun) {
44
+ this.#begun();
45
+ this.#begun = undefined;
46
+ }
47
+ else if (frame.type === 'call') {
48
+ void this.call(frame).catch(failure);
49
+ }
50
+ else {
51
+ failure();
52
+ }
53
+ };
54
+ this.process.onEvent = event => {
55
+ void this.event(event).catch(failure);
56
+ };
57
+ }
58
+ async start(cwd, servers) {
59
+ try {
60
+ await this.registry.connect(servers);
61
+ if (this.#closed)
62
+ throw new Error('Pi bridge closed during discovery');
63
+ await this.process.start(cwd, this.profile, {
64
+ tools: this.registry.tools,
65
+ instructions: `${this.registry.instructions}\n\n${ARTIFACT_TASK_INSTRUCTIONS}`
66
+ });
67
+ this.#state = await this.process.request('get_state');
68
+ if (!isRecord(this.#state.model)) {
69
+ throw new Error('Pi bridge requires a configured model and authorization in the installed pi');
70
+ }
71
+ const available = await this.process.request('get_available_models');
72
+ if (!Array.isArray(available.models)) {
73
+ throw new Error('Pi runtime did not return its model catalog');
74
+ }
75
+ this.#models = available.models.filter(isRecord).flatMap(model => typeof model.id === 'string' && typeof model.provider === 'string'
76
+ ? [
77
+ {
78
+ id: model.id,
79
+ provider: model.provider,
80
+ name: typeof model.name === 'string' ? model.name : model.id
81
+ }
82
+ ]
83
+ : []);
84
+ await this.refreshThinking();
85
+ this.#ready = true;
86
+ }
87
+ catch (error) {
88
+ this.close();
89
+ throw error;
90
+ }
91
+ }
92
+ assertSession(id) {
93
+ if (!this.#ready || this.#closed || id !== this.id) {
94
+ throw new Error('Unknown or unavailable pi session');
95
+ }
96
+ }
97
+ get config() {
98
+ const model = this.#state.model;
99
+ const options = [
100
+ {
101
+ type: 'select',
102
+ id: 'thought_level',
103
+ category: 'thought_level',
104
+ name: 'Thinking',
105
+ currentValue: String(this.#state.thinkingLevel),
106
+ options: this.#thinking.map(value => ({ value, name: value }))
107
+ }
108
+ ];
109
+ if (!isRecord(model) || !this.#models.length)
110
+ return options;
111
+ return [
112
+ ...options,
113
+ {
114
+ type: 'select',
115
+ id: 'model',
116
+ category: 'model',
117
+ name: 'Model',
118
+ currentValue: `${String(model.provider)}/${String(model.id)}`,
119
+ options: this.#models.map(value => ({
120
+ value: `${value.provider}/${value.id}`,
121
+ name: value.name
122
+ }))
123
+ }
124
+ ];
125
+ }
126
+ async setConfig(id, value) {
127
+ if (this.#turn) {
128
+ throw new Error('Pi setting is unavailable');
129
+ }
130
+ if (id === 'thought_level' && this.#thinking.includes(value)) {
131
+ await this.process.request('set_thinking_level', { level: value });
132
+ this.#state = await this.process.request('get_state');
133
+ return;
134
+ }
135
+ if (id !== 'model')
136
+ throw new Error('Unknown pi setting');
137
+ const model = this.#models.find(candidate => `${candidate.provider}/${candidate.id}` === value);
138
+ if (!model)
139
+ throw new Error('Unknown pi model');
140
+ await this.process.request('set_model', {
141
+ provider: model.provider,
142
+ modelId: model.id
143
+ });
144
+ this.#state = await this.process.request('get_state');
145
+ await this.refreshThinking();
146
+ }
147
+ async refreshThinking() {
148
+ const thinking = await this.process.request('get_available_thinking_levels');
149
+ if (!Array.isArray(thinking.levels) ||
150
+ !thinking.levels.every(value => typeof value === 'string')) {
151
+ throw new Error('Pi thinking levels unavailable');
152
+ }
153
+ this.#thinking = thinking.levels;
154
+ }
155
+ async prompt(blocks) {
156
+ if (this.#turn || !this.#ready || this.#closed) {
157
+ throw new Error('Pi session is not ready for a prompt');
158
+ }
159
+ const { message, images } = promptToPiMessage(blocks);
160
+ if (this.profile === 'validator' && message.trimStart().startsWith('/')) {
161
+ throw new Error('Validator slash commands are unavailable');
162
+ }
163
+ if (/^\s*\/reload(?:\s|$)/.test(message)) {
164
+ throw new Error('Pi bridge reload requires a new chat');
165
+ }
166
+ const turn = new AbortController();
167
+ this.#turn = turn;
168
+ this.#generation++;
169
+ this.#cancelled = false;
170
+ this.#agentStarted = false;
171
+ this.#stopReason = 'end_turn';
172
+ this.#seen.clear();
173
+ try {
174
+ await new Promise((resolve, reject) => {
175
+ const timer = setTimeout(() => {
176
+ this.#begun = undefined;
177
+ reject(new Error('Pi turn control acknowledgement timed out'));
178
+ }, BRIDGE_TIMEOUT_MS);
179
+ this.#begun = () => {
180
+ clearTimeout(timer);
181
+ resolve();
182
+ };
183
+ this.process.send('begin', { generation: this.#generation });
184
+ });
185
+ if (turn.signal.aborted)
186
+ return { stopReason: 'cancelled' };
187
+ const completion = new Promise((resolve, reject) => {
188
+ this.#completion = { resolve, reject };
189
+ });
190
+ completion.catch(() => { });
191
+ const deadline = setTimeout(() => {
192
+ this.#completion?.reject(new Error('Pi turn deadline exceeded'));
193
+ this.close();
194
+ }, 300000);
195
+ try {
196
+ await this.process.request('prompt', { message, images });
197
+ if (message.trimStart().startsWith('/') && !this.#agentStarted) {
198
+ this.#completion?.resolve();
199
+ }
200
+ await completion;
201
+ }
202
+ finally {
203
+ clearTimeout(deadline);
204
+ this.#completion = undefined;
205
+ }
206
+ return {
207
+ stopReason: this.#cancelled ? 'cancelled' : this.#stopReason
208
+ };
209
+ }
210
+ catch (error) {
211
+ if (this.#cancelled)
212
+ return { stopReason: 'cancelled' };
213
+ throw error;
214
+ }
215
+ finally {
216
+ turn.abort();
217
+ this.#turn = undefined;
218
+ this.#seen.clear();
219
+ }
220
+ }
221
+ async cancel() {
222
+ if (!this.#turn)
223
+ return;
224
+ this.#cancelled = true;
225
+ this.#turn.abort();
226
+ this.process.send('cancel', { generation: this.#generation });
227
+ await this.process.request('abort');
228
+ }
229
+ async call(frame) {
230
+ const turn = this.#turn;
231
+ if (!turn ||
232
+ turn.signal.aborted ||
233
+ frame.generation !== this.#generation ||
234
+ typeof frame.id !== 'string' ||
235
+ typeof frame.name !== 'string' ||
236
+ this.#seen.has(frame.id) ||
237
+ this.#seen.size >= 10000 ||
238
+ this.#pending >= MAX_PENDING_CALLS) {
239
+ throw new Error('Invalid, repeated or stale pi call');
240
+ }
241
+ this.#seen.add(frame.id);
242
+ this.#pending++;
243
+ const generation = this.#generation;
244
+ const id = frame.id;
245
+ let result;
246
+ try {
247
+ const snapshot = this.registry.snapshot(frame.name, frame.arguments);
248
+ const signal = AbortSignal.any([
249
+ turn.signal,
250
+ AbortSignal.timeout(BRIDGE_TIMEOUT_MS)
251
+ ]);
252
+ const permissionRequest = this.callbacks.permission({
253
+ sessionId: this.id,
254
+ toolCall: {
255
+ toolCallId: id,
256
+ title: snapshot.descriptor.name,
257
+ name: snapshot.descriptor.name,
258
+ kind: 'execute',
259
+ rawInput: structuredClone(snapshot.arguments),
260
+ _meta: {
261
+ githumanPi: {
262
+ server: snapshot.descriptor.server,
263
+ tool: snapshot.descriptor.originalName,
264
+ registryGeneration: 1
265
+ }
266
+ }
267
+ },
268
+ options: [
269
+ { optionId: 'allow_once', name: 'Allow once', kind: 'allow_once' },
270
+ {
271
+ optionId: 'reject_once',
272
+ name: 'Reject once',
273
+ kind: 'reject_once'
274
+ }
275
+ ]
276
+ }, signal);
277
+ let abortPermission;
278
+ let permission;
279
+ try {
280
+ permission = await Promise.race([
281
+ permissionRequest,
282
+ new Promise((_resolve, reject) => {
283
+ abortPermission = () => reject(new Error('Pi permission deadline exceeded or call cancelled'));
284
+ if (signal.aborted) {
285
+ abortPermission();
286
+ }
287
+ else {
288
+ signal.addEventListener('abort', abortPermission, { once: true });
289
+ }
290
+ })
291
+ ]);
292
+ }
293
+ finally {
294
+ if (abortPermission) {
295
+ signal.removeEventListener('abort', abortPermission);
296
+ }
297
+ }
298
+ if (signal.aborted ||
299
+ turn !== this.#turn ||
300
+ generation !== this.#generation ||
301
+ permission.outcome.outcome !== 'selected' ||
302
+ permission.outcome.optionId !== 'allow_once') {
303
+ throw new Error('Pi MCP permission denied or cancelled');
304
+ }
305
+ result = await this.registry.call(frame.name, snapshot.arguments, signal);
306
+ }
307
+ catch {
308
+ result = {
309
+ isError: true,
310
+ content: [
311
+ {
312
+ type: 'text',
313
+ text: 'Pi MCP call failed, was denied, or was cancelled.'
314
+ }
315
+ ]
316
+ };
317
+ }
318
+ finally {
319
+ this.#pending--;
320
+ }
321
+ if (!this.#closed &&
322
+ turn === this.#turn &&
323
+ !turn.signal.aborted &&
324
+ generation === this.#generation) {
325
+ this.process.send('result', { id, generation, result });
326
+ }
327
+ }
328
+ async event(event) {
329
+ if (!this.#turn)
330
+ return;
331
+ if (event.type === 'agent_start')
332
+ this.#agentStarted = true;
333
+ if (event.type === 'message_end' && isRecord(event.message)) {
334
+ if (event.message.stopReason === 'length')
335
+ this.#stopReason = 'max_tokens';
336
+ if (event.message.stopReason === 'refusal')
337
+ this.#stopReason = 'refusal';
338
+ }
339
+ if (event.type === 'agent_end') {
340
+ this.#completion?.resolve();
341
+ return;
342
+ }
343
+ if (event.type === 'message_end' &&
344
+ isRecord(event.message) &&
345
+ event.message.stopReason === 'error') {
346
+ this.#completion?.reject(new Error(piFailureReason(event.message.errorMessage)));
347
+ return;
348
+ }
349
+ if (this.#turn.signal.aborted)
350
+ return;
351
+ let update;
352
+ if (event.type === 'message_update' &&
353
+ isRecord(event.assistantMessageEvent)) {
354
+ const delta = event.assistantMessageEvent;
355
+ if ((delta.type === 'text_delta' || delta.type === 'thinking_delta') &&
356
+ typeof delta.delta === 'string') {
357
+ update = {
358
+ sessionUpdate: delta.type === 'text_delta'
359
+ ? 'agent_message_chunk'
360
+ : 'agent_thought_chunk',
361
+ content: { type: 'text', text: delta.delta }
362
+ };
363
+ }
364
+ }
365
+ else if (event.type === 'tool_execution_start' &&
366
+ typeof event.toolCallId === 'string') {
367
+ update = {
368
+ sessionUpdate: 'tool_call',
369
+ toolCallId: event.toolCallId,
370
+ title: String(event.toolName),
371
+ name: String(event.toolName),
372
+ rawInput: event.args,
373
+ status: 'in_progress',
374
+ kind: 'execute'
375
+ };
376
+ }
377
+ else if (event.type === 'tool_execution_end' &&
378
+ typeof event.toolCallId === 'string') {
379
+ const result = event.result;
380
+ const content = isRecord(result) && Array.isArray(result.content)
381
+ ? result.content.filter(isRecord).flatMap(block => block.type === 'text' && typeof block.text === 'string'
382
+ ? [
383
+ {
384
+ type: 'content',
385
+ content: { type: 'text', text: block.text }
386
+ }
387
+ ]
388
+ : [])
389
+ : [];
390
+ update = {
391
+ sessionUpdate: 'tool_call_update',
392
+ toolCallId: event.toolCallId,
393
+ status: event.isError ? 'failed' : 'completed',
394
+ content
395
+ };
396
+ }
397
+ if (update)
398
+ await this.callbacks.update(this.id, update);
399
+ }
400
+ close() {
401
+ if (this.#closed)
402
+ return;
403
+ this.#closed = true;
404
+ this.#turn?.abort();
405
+ this.#completion?.reject(new Error('Pi session closed'));
406
+ this.process.close();
407
+ void this.registry.close();
408
+ }
409
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Sergii Kozak
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # pi-acp provenance
2
+
3
+ Baseline: published MIT pi-acp@0.0.34 tarball, compared to upstream commit
4
+ 04d0a15d6bb42bb65cce5c9caedcdcb2cdcb6905 before reuse.
5
+
6
+ Tarball: https://registry.npmjs.org/pi-acp/-/pi-acp-0.0.34.tgz
7
+ SHA-256: 4b3bf6bc71bed2b7f43dd7fcfa1906e464828e471740da593107e4f1608f2650
8
+ SHA-512 (npm integrity): MrCp37UbpUzkTkzTIMJQf1RYrT+kr4fgGDGFoLmBN26UupuCZp0XxVIY+7XYsMo3yDnzDeZUJ0jPyM3Si6Bkkg==
9
+ Published bundle SHA-256: 324aeb8bba1228937e16b1326fb3e014e2a625b2dea549dbcd49b006cd5df6a2
10
+
11
+ The tarball source map has 17 sources. Four differ from the git commit:
12
+ acp/agent.ts, acp/session.ts, acp/pi-sessions.ts, acp/translate/prompt.ts.
13
+ The published tarball is the selected baseline, including prompt.ts.
14
+
15
+ | Layer | Local difference |
16
+ | ----------------------------------------------- | ---------------------------------------------------------------------- |
17
+ | prompt.ts | Formatting and comment conventions; imported from published source map |
18
+ | ACP agent/session | New SDK 1.5 builder API; one session; no restore/history handlers |
19
+ | RPC process | New bounded transport; no session files; no Windows launchers |
20
+ | MCP/control/permissions | New GitHuman-owned registry, extension and ACP gate |
21
+ | Upstream history, session store, slash commands | Excluded |
22
+
23
+ Keep LICENSE with the redistributed prompt conversion code. Runtime npx and
24
+ pi SDK dependencies are not required. Maintainers compare upstream changes
25
+ when supported pi versions or upstream security fixes change. Reconsider the
26
+ SDK-runtime ADR if the fork can no longer be reviewed as a bounded change.
27
+
28
+ macOS verification was explicitly skipped by the user because no host was
29
+ available. Linux tests do not establish macOS support.