@puddle-code/cli 0.2.21 → 0.3.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 (142) hide show
  1. package/CHANGELOG.md +7 -4
  2. package/README.md +4 -0
  3. package/dist/host-control.mjs +202 -22
  4. package/dist/index.js +223 -29
  5. package/dist/install-cli.sh +13 -2
  6. package/dist/public/assets/App-XpQccO6u.js +2 -0
  7. package/dist/public/assets/{Dashboard-BhAek_r4.js → Dashboard-DMEBtYwv.js} +1 -1
  8. package/dist/public/assets/{EditorTabClose-CSKAGWsA.js → EditorTabClose-PbgNs_rN.js} +1 -1
  9. package/dist/public/assets/{FindWidget-B6dVpkKr.js → FindWidget-ZDHywlX4.js} +1 -1
  10. package/dist/public/assets/LazyTerminal-DRgaFViU.js +2 -0
  11. package/dist/public/assets/{ModelRefcount-CrpDNwTn.js → ModelRefcount-CI3cYeQp.js} +1 -1
  12. package/dist/public/assets/{NewProjectDialog-D-hVQlA4.js → NewProjectDialog-Bhfj_sYl.js} +1 -1
  13. package/dist/public/assets/{PaneEditorBody--h9jLt1e.js → PaneEditorBody-Bz74yrKU.js} +3 -3
  14. package/dist/public/assets/{PdfViewer-CNzO040W.js → PdfViewer-73_UlYnM.js} +2 -2
  15. package/dist/public/assets/{SettingsDialog-DaxYdggs.js → SettingsDialog-DJmvzJHQ.js} +2 -2
  16. package/dist/public/assets/{Terminal-DQL8GETy.js → Terminal-BwuoWKED.js} +5 -5
  17. package/dist/public/assets/{Workspace-BDDSmIKE.js → Workspace-DPL1IKA6.js} +4 -4
  18. package/dist/public/assets/{abnfDiagram-VCTEODGH-Dj6CI3Nv.js → abnfDiagram-VCTEODGH-AawOhIcj.js} +1 -1
  19. package/dist/public/assets/architecture-7GRP2DOG-BbAArV9u.js +1 -0
  20. package/dist/public/assets/{architectureDiagram-5GKGNRK7-7n7HJQxV.js → architectureDiagram-5GKGNRK7-D9vP5DO8.js} +1 -1
  21. package/dist/public/assets/{blockDiagram-I7D4REHJ-Cmsxv8OS.js → blockDiagram-I7D4REHJ-Cm9i3cTT.js} +1 -1
  22. package/dist/public/assets/{buffer-store-NeRSjzSg.js → buffer-store-BIpSx_-b.js} +2 -2
  23. package/dist/public/assets/{button-hdghxls7.js → button-CgZcwDne.js} +1 -1
  24. package/dist/public/assets/{c4Diagram-7LVT6UL2-D23ryIme.js → c4Diagram-7LVT6UL2-BiN1-NKB.js} +1 -1
  25. package/dist/public/assets/channel-CUWW1WRo.js +1 -0
  26. package/dist/public/assets/{chunk-2E4U76K2-usroR3SM.js → chunk-2E4U76K2-BxAMvG2q.js} +1 -1
  27. package/dist/public/assets/{chunk-4HAMMTFA-B4mxD8f1.js → chunk-4HAMMTFA-D4UgoMR5.js} +1 -1
  28. package/dist/public/assets/{chunk-75Z2AOVW-BSDNHsOk.js → chunk-75Z2AOVW-ViSC5KeO.js} +1 -1
  29. package/dist/public/assets/{chunk-CLGD4ZFX-DpUm0L6C.js → chunk-CLGD4ZFX-C1obqh7u.js} +1 -1
  30. package/dist/public/assets/{chunk-DU6HZSFF-Cin9bFEJ.js → chunk-DU6HZSFF-Dd9xUi9L.js} +1 -1
  31. package/dist/public/assets/{chunk-F27PBJKO-BWPIZmRh.js → chunk-F27PBJKO-S5xJlLKg.js} +1 -1
  32. package/dist/public/assets/{chunk-GMAD6QVW-eS27qQYi.js → chunk-GMAD6QVW-DXbO7ojE.js} +1 -1
  33. package/dist/public/assets/{chunk-GVQU2GXP-DvZzuy44.js → chunk-GVQU2GXP-vZ5Z6XwC.js} +1 -1
  34. package/dist/public/assets/{chunk-IMKFNOWR-CKfEqBn8.js → chunk-IMKFNOWR-BGcGac3f.js} +1 -1
  35. package/dist/public/assets/{chunk-L3NEJ4N5-Gq2sL0Oq.js → chunk-L3NEJ4N5-BfxBma0T.js} +1 -1
  36. package/dist/public/assets/{chunk-OSK3NFVY-DSHFDm2K.js → chunk-OSK3NFVY-BaWjSKfn.js} +1 -1
  37. package/dist/public/assets/{chunk-P2QGCYS3-B0b6PsO0.js → chunk-P2QGCYS3-Ce8Ukv1J.js} +1 -1
  38. package/dist/public/assets/{chunk-POPQ4Y6H-B_whPWNN.js → chunk-POPQ4Y6H-lrRlaehc.js} +1 -1
  39. package/dist/public/assets/{chunk-PWAF6VOD-DfdxoQ_F.js → chunk-PWAF6VOD-DcoK5-E2.js} +1 -1
  40. package/dist/public/assets/{chunk-SHT3W25Y-CHrnqlvt.js → chunk-SHT3W25Y-BWdHabuP.js} +1 -1
  41. package/dist/public/assets/{chunk-SVP7TREG-keTkvLck.js → chunk-SVP7TREG-CfpAvBiO.js} +1 -1
  42. package/dist/public/assets/{chunk-TICWLB2K-ZF0XdA5t.js → chunk-TICWLB2K-BnqQqZIp.js} +1 -1
  43. package/dist/public/assets/{chunk-TLUHSLCS-B3xiw07r.js → chunk-TLUHSLCS-Cd6EShzW.js} +2 -2
  44. package/dist/public/assets/classDiagram-ZZMXUADV-Cve4a5Gc.js +1 -0
  45. package/dist/public/assets/classDiagram-v2-VYDZK3BY-Cve4a5Gc.js +1 -0
  46. package/dist/public/assets/{context-menu-fGutCa7q.js → context-menu-CtKnUzHa.js} +1 -1
  47. package/dist/public/assets/{copy-B38GDFbv.js → copy-Xz4fK2YI.js} +1 -1
  48. package/dist/public/assets/{cssMode-BBPxRrZH.js → cssMode-CNBJ-DrN.js} +1 -1
  49. package/dist/public/assets/{cynefin-OW5HDTMX-BKwXHhp6.js → cynefin-OW5HDTMX-C1-MjjCZ.js} +1 -1
  50. package/dist/public/assets/{cynefinDiagram-5FMLGOSQ-B59dmX8D.js → cynefinDiagram-5FMLGOSQ-xt5hQJ88.js} +1 -1
  51. package/dist/public/assets/{dagre-GXQ25YYZ-BysK_yGg.js → dagre-GXQ25YYZ-Bgahh86t.js} +1 -1
  52. package/dist/public/assets/{diagram-S7CK7UJ4-BTvgOprS.js → diagram-S7CK7UJ4-Djip7YHP.js} +1 -1
  53. package/dist/public/assets/{diagram-UQ7AKVKN-C1FXQfFT.js → diagram-UQ7AKVKN-StD7DYFa.js} +1 -1
  54. package/dist/public/assets/{diagram-VSXAHHWV-CTub3LLw.js → diagram-VSXAHHWV-C6W2XMTF.js} +1 -1
  55. package/dist/public/assets/{diagram-VX7I27RA-C8YSQsst.js → diagram-VX7I27RA-C5rBIjxM.js} +1 -1
  56. package/dist/public/assets/{diagram-Z3DM3KII-zBY2ZT-7.js → diagram-Z3DM3KII-DDzmZnRU.js} +1 -1
  57. package/dist/public/assets/dialog-_JRACgt4.js +41 -0
  58. package/dist/public/assets/disclosure-DBXM9uBm.js +1 -0
  59. package/dist/public/assets/{dist-DWt3BCrg.js → dist-Bl7vUoam.js} +1 -1
  60. package/dist/public/assets/{dist-1iWQMdtt.js → dist-CzEdee3K.js} +1 -1
  61. package/dist/public/assets/{ebnfDiagram-PWID7BFC-DZbYMMq9.js → ebnfDiagram-PWID7BFC-TJlh5Fea.js} +1 -1
  62. package/dist/public/assets/{erDiagram-RLTQ6QDP-BufFqh6K.js → erDiagram-RLTQ6QDP-BSNVCw_x.js} +1 -1
  63. package/dist/public/assets/{errors-0CwhraNS.js → errors-BzfxU_Kw.js} +1 -1
  64. package/dist/public/assets/eventmodeling-NTZA5JFV-DZ8G1RJ1.js +1 -0
  65. package/dist/public/assets/flowDiagram-HODETNUW-Dd9WpTU6.js +1 -0
  66. package/dist/public/assets/{ganttDiagram-EL5Y4UJY-CzBnAVfV.js → ganttDiagram-EL5Y4UJY-BGFNgCoM.js} +1 -1
  67. package/dist/public/assets/{gitGraph-4MIJSDKK-DzkiKDz3.js → gitGraph-4MIJSDKK-Du3WBCxU.js} +1 -1
  68. package/dist/public/assets/{gitGraphDiagram-WWUBYQGX-Cg5zqV71.js → gitGraphDiagram-WWUBYQGX-Dq_yAVmM.js} +1 -1
  69. package/dist/public/assets/{htmlMode-HP2zLptL.js → htmlMode-BWm5ayBQ.js} +1 -1
  70. package/dist/public/assets/index-BP-EF5G2.js +82 -0
  71. package/dist/public/assets/index-CAvJOpdz.css +2 -0
  72. package/dist/public/assets/{info-A6RAGUB7-DrzRcVCp.js → info-A6RAGUB7-V0hlAV3d.js} +1 -1
  73. package/dist/public/assets/{infoDiagram-27XIBGKW-DKhhQ6Mi.js → infoDiagram-27XIBGKW-DZM1jHkq.js} +1 -1
  74. package/dist/public/assets/{ishikawaDiagram-5VMMS53U-Sxvy6BP4.js → ishikawaDiagram-5VMMS53U-CZlO72MU.js} +1 -1
  75. package/dist/public/assets/{journeyDiagram-3NMN7TZE-DLCDGlAt.js → journeyDiagram-3NMN7TZE-DZZieltZ.js} +1 -1
  76. package/dist/public/assets/{jsonMode-3cqCCYan.js → jsonMode-DA3Di61-.js} +1 -1
  77. package/dist/public/assets/{kanban-definition-UXKFOSKX-BBHezsUK.js → kanban-definition-UXKFOSKX-BAFfgDCD.js} +1 -1
  78. package/dist/public/assets/{line-CXD0KIW6.js → line-DNRJuk5l.js} +1 -1
  79. package/dist/public/assets/{markdown-mermaid-gr78oRak.js → markdown-mermaid-zldCuMow.js} +2 -2
  80. package/dist/public/assets/{math-DD0qgOf_.js → math-Bl0zHVK2.js} +1 -1
  81. package/dist/public/assets/{media-refresh-store-DTLvGgrw.js → media-refresh-store-BemN_6sc.js} +1 -1
  82. package/dist/public/assets/{mermaid-parser.core-CQpv25sY.js → mermaid-parser.core-DpOHgT8D.js} +3 -3
  83. package/dist/public/assets/{mermaid.core-CO3okgIG.js → mermaid.core-DuO1Atct.js} +3 -3
  84. package/dist/public/assets/{mindmap-definition-YA3MSWOX-DnuqRR1y.js → mindmap-definition-YA3MSWOX-Bbgshnhk.js} +1 -1
  85. package/dist/public/assets/notification-delivery-DehaYHWS.js +1 -0
  86. package/dist/public/assets/{packet-AYTQ26CC--9UnHksn.js → packet-AYTQ26CC-H2b8zBMM.js} +1 -1
  87. package/dist/public/assets/{pdf-DFR5TvGJ.js → pdf-DTc2umrm.js} +1 -1
  88. package/dist/public/assets/{pegDiagram-XKGWAZYB-m8JdNNtC.js → pegDiagram-XKGWAZYB-BKdl5Qrn.js} +1 -1
  89. package/dist/public/assets/{pie-WAS4IAKB-GnDinOP5.js → pie-WAS4IAKB-SB8x1Dpp.js} +1 -1
  90. package/dist/public/assets/{pieDiagram-E7YTZNPT-u-NA8MFl.js → pieDiagram-E7YTZNPT-YXMNp-5O.js} +1 -1
  91. package/dist/public/assets/{project-abbrev-Ce2YQx3q.js → project-abbrev-D7aa-LGS.js} +1 -1
  92. package/dist/public/assets/{protocol-support-DM3D3Owq.js → protocol-support-Dm8bEo7Y.js} +1 -1
  93. package/dist/public/assets/{quadrantDiagram-AXDQQJYC-si_KhMBB.js → quadrantDiagram-AXDQQJYC-B2TAChhA.js} +1 -1
  94. package/dist/public/assets/{radar-RG4KPBEZ-CnJwODJt.js → radar-RG4KPBEZ-D2xzXNL8.js} +1 -1
  95. package/dist/public/assets/{railroad-74A4TZTK-Cgg0LWTI.js → railroad-74A4TZTK-CKug6hj8.js} +1 -1
  96. package/dist/public/assets/railroad-abnf-HS5TGJTU-cj9XZHow.js +1 -0
  97. package/dist/public/assets/railroad-ebnf-LZEXJU2U-CCIfyLjg.js +1 -0
  98. package/dist/public/assets/railroad-peg-WCYAUIDC-DkxYDi7O.js +1 -0
  99. package/dist/public/assets/{railroadDiagram-O6MQD6OU-DuQX8qaE.js → railroadDiagram-O6MQD6OU-Bft2oh-d.js} +1 -1
  100. package/dist/public/assets/{requirementDiagram-BXWQKSXE-Chwrn5Tf.js → requirementDiagram-BXWQKSXE-e0GCEfhM.js} +1 -1
  101. package/dist/public/assets/{sankeyDiagram-P5KCCOFB-FpJ30BIQ.js → sankeyDiagram-P5KCCOFB-Csb70YNA.js} +1 -1
  102. package/dist/public/assets/{scroll-restoration-B3J09_am.js → scroll-restoration-D7f4DDsJ.js} +1 -1
  103. package/dist/public/assets/{selection-actions-awCJJCSe.js → selection-actions-D5wKfiBu.js} +1 -1
  104. package/dist/public/assets/{sequenceDiagram-WJ2MYXX4-DVw87Ucm.js → sequenceDiagram-WJ2MYXX4-DcnD8T30.js} +1 -1
  105. package/dist/public/assets/{stateDiagram-D77RDMKH-qmBcs9VH.js → stateDiagram-D77RDMKH-GnwFUlNg.js} +1 -1
  106. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-Bktkoy9c.js +1 -0
  107. package/dist/public/assets/{swimlanes-42K2YHIH-ts5KQGMt.js → swimlanes-42K2YHIH-CPq_eKyi.js} +1 -1
  108. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-BmjIwfwd.js +8 -0
  109. package/dist/public/assets/{switch-DMkSxGf3.js → switch-DZbOKnZ0.js} +1 -1
  110. package/dist/public/assets/{timeline-definition-24CTP7MA-BDL_pzrt.js → timeline-definition-24CTP7MA-DjUPAJJx.js} +1 -1
  111. package/dist/public/assets/{treeView-Q6P3EWNA-B1vMOTkl.js → treeView-Q6P3EWNA-DBuhlxaq.js} +1 -1
  112. package/dist/public/assets/{treemap-WGGIJYW6-wi5T0FIb.js → treemap-WGGIJYW6-3TKwSIeh.js} +1 -1
  113. package/dist/public/assets/{tsMode-CsaS5imR.js → tsMode-BYwFH3pC.js} +1 -1
  114. package/dist/public/assets/{use-ui-state-2VprViGF.js → use-ui-state-BXROVbIw.js} +1 -1
  115. package/dist/public/assets/{vennDiagram-4TSXK5OY-Djvp5-2_.js → vennDiagram-4TSXK5OY-oDrGN_Dh.js} +1 -1
  116. package/dist/public/assets/{view-state-store-rOwEBYKn.js → view-state-store-vUrDt7wu.js} +1 -1
  117. package/dist/public/assets/{wardley-WFR3VGLG-Di-PFH_i.js → wardley-WFR3VGLG-Br5CacuJ.js} +1 -1
  118. package/dist/public/assets/{wardleyDiagram-VM6X3IG4-B5Y8UZiL.js → wardleyDiagram-VM6X3IG4-Cw_uOLXA.js} +1 -1
  119. package/dist/public/assets/{ws-DsytGlkr.js → ws-Ug1Tr2sh.js} +1 -1
  120. package/dist/public/assets/{xychartDiagram-S5SC5T6Z-d-pvxFe2.js → xychartDiagram-S5SC5T6Z-Cl8gNx_J.js} +1 -1
  121. package/dist/public/index.html +2 -2
  122. package/dist/public/notification-worker.js +104 -6
  123. package/dist/puddlang.js +17578 -0
  124. package/package.json +3 -2
  125. package/dist/public/assets/App-NrJUEV9p.js +0 -2
  126. package/dist/public/assets/LazyTerminal-fxF4IO4o.js +0 -2
  127. package/dist/public/assets/architecture-7GRP2DOG-CDcS1iVd.js +0 -1
  128. package/dist/public/assets/channel-B98_B4F2.js +0 -1
  129. package/dist/public/assets/classDiagram-ZZMXUADV-CalLaxUD.js +0 -1
  130. package/dist/public/assets/classDiagram-v2-VYDZK3BY-CalLaxUD.js +0 -1
  131. package/dist/public/assets/dialog-CVAp0B_q.js +0 -41
  132. package/dist/public/assets/disclosure-CWTUvRKU.js +0 -1
  133. package/dist/public/assets/eventmodeling-NTZA5JFV-CC5F0fZk.js +0 -1
  134. package/dist/public/assets/flowDiagram-HODETNUW-Dmt2DAB8.js +0 -1
  135. package/dist/public/assets/index-Bwl8S5Du.css +0 -2
  136. package/dist/public/assets/index-W9vnFL1i.js +0 -82
  137. package/dist/public/assets/notification-delivery-rQp5tkM8.js +0 -1
  138. package/dist/public/assets/railroad-abnf-HS5TGJTU-DPqD3hz7.js +0 -1
  139. package/dist/public/assets/railroad-ebnf-LZEXJU2U-9Jxyrh7e.js +0 -1
  140. package/dist/public/assets/railroad-peg-WCYAUIDC-gr2ZokSI.js +0 -1
  141. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-TK5UygAI.js +0 -1
  142. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-BUMN0oZf.js +0 -8
package/CHANGELOG.md CHANGED
@@ -4,9 +4,12 @@ Archived release changelog. Governance lives in CLAUDE.md §"Changelog disciplin
4
4
 
5
5
  # Changelog
6
6
 
7
- ## [0.2.21] — 2026-10-14
7
+ ## [0.3.0] — 2026-10-14
8
8
 
9
- ### Fixed
9
+ ### Added
10
10
 
11
- - Align the shared API protocol assertion with protocol 22.4 so CI accepts the remote push notification changes.
12
- - Publish the npm CLI through GitHub OIDC trusted publishing with a compatible npm version instead of relying on a stored publishing token.
11
+ - Add puddlang: host-executed TypeScript agent workflows, Codex exact turns and structured replies, profile/account selection, durable run records, cancellation, CLI and stdio MCP access; bundle `puddlang` with existing CLI installers (daemon protocol 23.0, remote protocol unchanged).
12
+
13
+ ### Changed
14
+
15
+ - Bump daemon/cockpit protocol to 23.0 for the puddlang rollout; require matching clients and hosts through the existing approved upgrade flow, while retaining remote transport protocol 3.
package/README.md CHANGED
@@ -29,6 +29,10 @@ installer (replace the example host):
29
29
  curl -fsSL https://app.example.com/install.sh | sh
30
30
  ```
31
31
 
32
+ The CLI also includes `puddlang`, a TypeScript interface for coder/reviewer loops
33
+ and other agent workflows, available through the shell or stdio MCP. See the
34
+ [puddlang guide](docs/puddlang.md) for setup, examples and initial limitations.
35
+
32
36
  This installs the CLI under `~/.local/share/puddle/cli` and its launcher at
33
37
  `~/.local/bin/puddle`. Add `~/.local/bin` to your `PATH` if the installer asks.
34
38
  The standalone releases support Linux x64/arm64 and macOS arm64. The script and
@@ -14521,6 +14521,21 @@ function date4(params) {
14521
14521
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
14522
14522
  config(en_default());
14523
14523
 
14524
+ // ../shared/src/api/common.ts
14525
+ var errorResponseSchema = external_exports.object({
14526
+ error: external_exports.object({
14527
+ code: external_exports.string(),
14528
+ message: external_exports.string(),
14529
+ /** Optional machine-readable context for recoverable conflicts. */
14530
+ details: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
14531
+ })
14532
+ });
14533
+ var isoTimestamp = external_exports.iso.datetime({ offset: true });
14534
+ var rowId = external_exports.number().int().positive();
14535
+ var sessionId = external_exports.uuid();
14536
+ var projectId = external_exports.string().regex(/^[0-9a-f]{10}$/);
14537
+ var profileId = external_exports.string().regex(/^[0-9a-f]{10}$/);
14538
+
14524
14539
  // ../shared/src/notifications.ts
14525
14540
  var notificationPreferencesSchema = external_exports.object({
14526
14541
  desktop: external_exports.boolean().default(true),
@@ -14528,10 +14543,22 @@ var notificationPreferencesSchema = external_exports.object({
14528
14543
  when_focused: external_exports.boolean().default(true),
14529
14544
  muted_projects: external_exports.array(external_exports.string()).default([])
14530
14545
  });
14546
+ var notificationTargetSchema = external_exports.object({
14547
+ project: projectId,
14548
+ session: sessionId,
14549
+ host: external_exports.string().uuid().optional()
14550
+ }).strict();
14551
+ var notificationContentSchema = external_exports.object({
14552
+ title: external_exports.string().min(1).max(160),
14553
+ body: external_exports.string().min(1).max(256),
14554
+ project: projectId,
14555
+ session: sessionId
14556
+ }).strict();
14531
14557
  var desktopNotificationRequestSchema = external_exports.object({
14532
14558
  id: external_exports.string().min(1).max(128),
14533
14559
  title: external_exports.string().min(1).max(160),
14534
- body: external_exports.string().min(1).max(256)
14560
+ body: external_exports.string().min(1).max(256),
14561
+ target: notificationTargetSchema.optional()
14535
14562
  }).strict();
14536
14563
  var notificationDeliverySchema = external_exports.object({
14537
14564
  state: external_exports.enum(["unverified", "shown", "failed", "unsupported"]),
@@ -14541,29 +14568,16 @@ var agentNotificationSchema = external_exports.object({
14541
14568
  t: external_exports.literal("agent-notification"),
14542
14569
  id: external_exports.string().uuid(),
14543
14570
  session: external_exports.string().uuid(),
14544
- reason: external_exports.enum(["waiting_input", "exited"])
14571
+ reason: external_exports.enum(["waiting_input", "exited"]),
14572
+ content: notificationContentSchema.optional()
14545
14573
  });
14546
14574
 
14547
- // ../shared/src/api/common.ts
14548
- var errorResponseSchema = external_exports.object({
14549
- error: external_exports.object({
14550
- code: external_exports.string(),
14551
- message: external_exports.string(),
14552
- /** Optional machine-readable context for recoverable conflicts. */
14553
- details: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
14554
- })
14555
- });
14556
- var isoTimestamp = external_exports.iso.datetime({ offset: true });
14557
- var rowId = external_exports.number().int().positive();
14558
- var sessionId = external_exports.uuid();
14559
- var projectId = external_exports.string().regex(/^[0-9a-f]{10}$/);
14560
- var profileId = external_exports.string().regex(/^[0-9a-f]{10}$/);
14561
-
14562
14575
  // ../shared/src/api/version.ts
14563
14576
  var versionResponseSchema = external_exports.object({
14564
14577
  version: external_exports.string(),
14565
14578
  /** Added by the host connector; absent on direct daemon responses and older connectors. */
14566
14579
  remote_notifications: external_exports.boolean().optional(),
14580
+ remote_notification_previews: external_exports.boolean().optional(),
14567
14581
  remote_image_uploads: external_exports.boolean().optional(),
14568
14582
  protocol: external_exports.object({
14569
14583
  major: external_exports.number().int().nonnegative(),
@@ -15932,6 +15946,7 @@ var remoteHostSchema = external_exports.object({
15932
15946
  var remoteHostsSchema = external_exports.array(remoteHostSchema);
15933
15947
  var remoteServiceInfoSchema = external_exports.object({
15934
15948
  push_public_key: external_exports.string().max(100).optional(),
15949
+ push_encrypted_previews: external_exports.boolean().optional(),
15935
15950
  providers: external_exports.array(external_exports.enum(["google", "github"])),
15936
15951
  protocol: external_exports.literal(REMOTE_PROTOCOL_VERSION)
15937
15952
  });
@@ -16125,6 +16140,12 @@ var imageUploadProgressSchema = external_exports.object({
16125
16140
  });
16126
16141
 
16127
16142
  // ../shared/src/remote/notifications.ts
16143
+ var notificationPreviewKeySchema = external_exports.object({ id: remoteIdSchema, secret: remoteSecretSchema }).strict();
16144
+ var encryptedNotificationSchema = external_exports.object({
16145
+ key: remoteIdSchema,
16146
+ iv: external_exports.string().regex(/^[a-f0-9]{24}$/),
16147
+ ciphertext: external_exports.string().min(32).max(3072).regex(/^(?:[a-f0-9]{2})+$/)
16148
+ }).strict();
16128
16149
  var pushEndpointSchema = external_exports.string().max(2048).url().refine((value) => {
16129
16150
  let url2;
16130
16151
  try {
@@ -16143,18 +16164,177 @@ var pushSubscriptionSchema = external_exports.object({
16143
16164
  auth: external_exports.string().regex(/^[A-Za-z0-9_-]{22}={0,2}$/)
16144
16165
  }).strict()
16145
16166
  }).strict();
16146
- var pushPreferenceSchema = external_exports.object({ subscription: pushSubscriptionSchema.nullable() }).strict();
16147
- var pushRegistrationSchema = pushPreferenceSchema.extend({ credential: remoteSecretSchema, device: remoteIdSchema }).strict();
16167
+ var pushPreferenceSchema = external_exports.object({
16168
+ subscription: pushSubscriptionSchema.nullable(),
16169
+ preview_key: notificationPreviewKeySchema.optional()
16170
+ }).strict();
16171
+ var pushRegistrationSchema = pushPreferenceSchema.omit({ preview_key: true }).extend({ credential: remoteSecretSchema, device: remoteIdSchema }).strict();
16148
16172
  var pushDispatchSchema = external_exports.object({
16149
16173
  credential: remoteSecretSchema,
16150
16174
  devices: external_exports.array(remoteIdSchema).min(1).max(64),
16151
- id: remoteIdSchema
16175
+ id: remoteIdSchema,
16176
+ preview: encryptedNotificationSchema.optional()
16177
+ }).strict();
16178
+ var pushPayloadSchema = external_exports.object({
16179
+ id: remoteIdSchema,
16180
+ host: remoteIdSchema,
16181
+ preview: encryptedNotificationSchema.optional()
16182
+ }).strict();
16183
+ var connectorNotificationSchema = external_exports.object({
16184
+ t: external_exports.literal("notify"),
16185
+ id: remoteIdSchema,
16186
+ content: notificationContentSchema.optional()
16152
16187
  }).strict();
16153
- var pushPayloadSchema = external_exports.object({ id: remoteIdSchema, host: remoteIdSchema }).strict();
16154
- var connectorNotificationSchema = external_exports.object({ t: external_exports.literal("notify"), id: remoteIdSchema }).strict();
16155
16188
  var pushDispatchResultSchema = external_exports.object({ accepted: external_exports.number().int().nonnegative(), failed: external_exports.number().int().nonnegative() }).strict();
16156
16189
  var pushPreferenceResultSchema = external_exports.object({ enabled: external_exports.boolean() }).strict();
16157
16190
 
16191
+ // ../shared/src/api/puddlang.ts
16192
+ var PUDDLANG_MAX_SOURCE = 256 * 1024;
16193
+ var sourceSchema = external_exports.string().min(1).max(PUDDLANG_MAX_SOURCE).refine(
16194
+ (source) => new TextEncoder().encode(source).length <= PUDDLANG_MAX_SOURCE,
16195
+ "Source exceeds 256 KiB"
16196
+ );
16197
+ var puddlangSpawnSchema = external_exports.object({
16198
+ agent: external_exports.string().min(1).max(100),
16199
+ account: external_exports.union([external_exports.string().min(1).max(100), external_exports.number().int().positive()]).optional(),
16200
+ project: external_exports.string().min(1).max(200).optional(),
16201
+ worktree: external_exports.string().min(1).max(4096).optional(),
16202
+ path: external_exports.string().min(1).max(4096).optional(),
16203
+ title: external_exports.string().min(1).max(200).optional()
16204
+ }).refine((v) => Boolean(v.path) !== Boolean(v.project), "Choose path or project").refine((v) => !v.path || !v.worktree, "worktree requires project");
16205
+ var puddlangHandleSchema = external_exports.object({ runtime_id: external_exports.uuid(), session_id: sessionId });
16206
+ var puddlangAskSchema = external_exports.object({
16207
+ prompt: external_exports.string().min(1).max(128 * 1024),
16208
+ output_schema: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
16209
+ });
16210
+ var puddlangStartSchema = external_exports.object({
16211
+ id: external_exports.uuid(),
16212
+ source: sourceSchema,
16213
+ input: external_exports.unknown().optional(),
16214
+ accounts: external_exports.record(external_exports.string(), external_exports.union([external_exports.string(), external_exports.number().int().positive()])).default({}),
16215
+ max_turns: external_exports.number().int().min(1).max(1e3).default(50),
16216
+ max_agents: external_exports.number().int().min(1).max(32).default(8),
16217
+ timeout_ms: external_exports.number().int().min(1e3).max(24 * 60 * 60 * 1e3).default(60 * 60 * 1e3)
16218
+ });
16219
+ var puddlangRunSchema = external_exports.object({
16220
+ id: external_exports.uuid(),
16221
+ profile_id: profileId,
16222
+ source_hash: external_exports.string(),
16223
+ status: external_exports.enum(["running", "completed", "failed", "cancelled", "interrupted"]),
16224
+ result: external_exports.unknown().nullable(),
16225
+ error: external_exports.string().nullable(),
16226
+ created_at: external_exports.string(),
16227
+ updated_at: external_exports.string()
16228
+ });
16229
+ var puddlangEventSchema = external_exports.object({
16230
+ sequence: external_exports.number().int(),
16231
+ run_id: external_exports.uuid(),
16232
+ type: external_exports.string(),
16233
+ data: external_exports.unknown(),
16234
+ created_at: external_exports.string()
16235
+ });
16236
+ var puddlangEventsSchema = external_exports.object({ events: external_exports.array(puddlangEventSchema) });
16237
+ var puddlangOperationSchema = external_exports.discriminatedUnion("op", [
16238
+ external_exports.object({ op: external_exports.literal("spawn"), options: puddlangSpawnSchema }),
16239
+ external_exports.object({ op: external_exports.literal("attach"), reference: external_exports.string().min(1).max(100) }),
16240
+ external_exports.object({ op: external_exports.literal("ask"), handle: puddlangHandleSchema, request: puddlangAskSchema }),
16241
+ external_exports.object({ op: external_exports.literal("stop"), handle: puddlangHandleSchema })
16242
+ ]);
16243
+ var puddlangRunnerMessageSchema = external_exports.discriminatedUnion("type", [
16244
+ external_exports.object({
16245
+ type: external_exports.literal("operation"),
16246
+ id: external_exports.number().int(),
16247
+ operation: puddlangOperationSchema
16248
+ }),
16249
+ external_exports.object({
16250
+ type: external_exports.literal("finished"),
16251
+ result: external_exports.unknown().optional(),
16252
+ error: external_exports.string().max(8192).optional()
16253
+ })
16254
+ ]);
16255
+ var puddlangRunnerInputSchema = external_exports.discriminatedUnion("type", [
16256
+ external_exports.object({
16257
+ type: external_exports.literal("start"),
16258
+ source: sourceSchema,
16259
+ input: external_exports.unknown().optional()
16260
+ }),
16261
+ external_exports.object({
16262
+ type: external_exports.literal("reply"),
16263
+ id: external_exports.number().int(),
16264
+ value: external_exports.unknown().optional(),
16265
+ error: external_exports.string().optional()
16266
+ })
16267
+ ]);
16268
+ var puddlangContextSchema = external_exports.object({
16269
+ profile: external_exports.object({ id: profileId, name: external_exports.string() }),
16270
+ projects: external_exports.array(external_exports.object({ id: external_exports.string(), name: external_exports.string(), path: external_exports.string() })),
16271
+ accounts: external_exports.array(
16272
+ external_exports.object({ id: external_exports.number(), label: external_exports.string(), agent: external_exports.string(), logged_in: external_exports.boolean() })
16273
+ ),
16274
+ agents: external_exports.array(external_exports.object({ id: external_exports.string(), scripted_turns: external_exports.boolean() }))
16275
+ });
16276
+
16277
+ // ../shared/src/api/puddlang-mcp.ts
16278
+ var puddlangMcpRequestSchema = external_exports.object({
16279
+ jsonrpc: external_exports.literal("2.0"),
16280
+ id: external_exports.union([external_exports.string(), external_exports.number()]).optional(),
16281
+ method: external_exports.string(),
16282
+ params: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
16283
+ });
16284
+ var puddlangMcpCallSchema = external_exports.object({
16285
+ name: external_exports.string(),
16286
+ arguments: external_exports.unknown().optional()
16287
+ });
16288
+ var puddlangMcpRunSchema = puddlangStartSchema;
16289
+ var puddlangMcpIdSchema = external_exports.object({ id: external_exports.uuid() });
16290
+ var puddlangMcpEventsSchema = puddlangMcpIdSchema.extend({
16291
+ after: external_exports.number().int().nonnegative().default(0)
16292
+ });
16293
+ var puddlangMcpEmptySchema = external_exports.object({}).strict();
16294
+ var definitions = [
16295
+ [
16296
+ "puddlang_context",
16297
+ "List this host profile, projects, accounts and supported agents.",
16298
+ puddlangMcpEmptySchema,
16299
+ true
16300
+ ],
16301
+ [
16302
+ "puddlang_run",
16303
+ 'Execute a trusted single-file TypeScript programme on the host. Imports: puddlang (spawn, attach, input, z), zod, node: built-ins. Returns immediately with a durable run id; use status/events. Supply a fresh UUID id, or reuse it with identical input to recover an uncertain submission. spawn({agent:"codex",project:"name",account:"label"}); await agent.ask("task"); export default result. Supports structured ask({prompt,input,schema:z.object(...)}) and agent.stop().',
16304
+ puddlangMcpRunSchema,
16305
+ false
16306
+ ],
16307
+ [
16308
+ "puddlang_status",
16309
+ "Read a run and its final default export, if finished.",
16310
+ puddlangMcpIdSchema,
16311
+ true
16312
+ ],
16313
+ [
16314
+ "puddlang_events",
16315
+ "Read up to 100 events after a sequence; paginate until empty.",
16316
+ puddlangMcpEventsSchema,
16317
+ true
16318
+ ],
16319
+ [
16320
+ "puddlang_cancel",
16321
+ "Cancel a run, interrupt its pending asks, and stop agents it created. Attached agents are retained.",
16322
+ puddlangMcpIdSchema,
16323
+ false
16324
+ ]
16325
+ ];
16326
+ var puddlangMcpTools = definitions.map(([name, description, schema, readOnlyHint]) => ({
16327
+ name,
16328
+ description,
16329
+ inputSchema: external_exports.toJSONSchema(schema, { io: "input" }),
16330
+ annotations: {
16331
+ readOnlyHint,
16332
+ destructiveHint: !readOnlyHint,
16333
+ idempotentHint: true,
16334
+ openWorldHint: !readOnlyHint
16335
+ }
16336
+ }));
16337
+
16158
16338
  // ../shared/src/node/security.ts
16159
16339
  import { createHash, randomBytes } from "node:crypto";
16160
16340
  import {
package/dist/index.js CHANGED
@@ -3925,7 +3925,7 @@ import { createInterface } from "node:readline";
3925
3925
  import { Writable } from "node:stream";
3926
3926
 
3927
3927
  // ../shared/src/protocol.ts
3928
- var PROTOCOL_VERSION = { major: 22, minor: 4 };
3928
+ var PROTOCOL_VERSION = { major: 23, minor: 0 };
3929
3929
 
3930
3930
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
3931
3931
  var external_exports = {};
@@ -18441,6 +18441,21 @@ function date4(params) {
18441
18441
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
18442
18442
  config(en_default());
18443
18443
 
18444
+ // ../shared/src/api/common.ts
18445
+ var errorResponseSchema = external_exports.object({
18446
+ error: external_exports.object({
18447
+ code: external_exports.string(),
18448
+ message: external_exports.string(),
18449
+ /** Optional machine-readable context for recoverable conflicts. */
18450
+ details: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
18451
+ })
18452
+ });
18453
+ var isoTimestamp = external_exports.iso.datetime({ offset: true });
18454
+ var rowId = external_exports.number().int().positive();
18455
+ var sessionId = external_exports.uuid();
18456
+ var projectId = external_exports.string().regex(/^[0-9a-f]{10}$/);
18457
+ var profileId = external_exports.string().regex(/^[0-9a-f]{10}$/);
18458
+
18444
18459
  // ../shared/src/notifications.ts
18445
18460
  var notificationPreferencesSchema = external_exports.object({
18446
18461
  desktop: external_exports.boolean().default(true),
@@ -18448,10 +18463,22 @@ var notificationPreferencesSchema = external_exports.object({
18448
18463
  when_focused: external_exports.boolean().default(true),
18449
18464
  muted_projects: external_exports.array(external_exports.string()).default([])
18450
18465
  });
18466
+ var notificationTargetSchema = external_exports.object({
18467
+ project: projectId,
18468
+ session: sessionId,
18469
+ host: external_exports.string().uuid().optional()
18470
+ }).strict();
18471
+ var notificationContentSchema = external_exports.object({
18472
+ title: external_exports.string().min(1).max(160),
18473
+ body: external_exports.string().min(1).max(256),
18474
+ project: projectId,
18475
+ session: sessionId
18476
+ }).strict();
18451
18477
  var desktopNotificationRequestSchema = external_exports.object({
18452
18478
  id: external_exports.string().min(1).max(128),
18453
18479
  title: external_exports.string().min(1).max(160),
18454
- body: external_exports.string().min(1).max(256)
18480
+ body: external_exports.string().min(1).max(256),
18481
+ target: notificationTargetSchema.optional()
18455
18482
  }).strict();
18456
18483
  var notificationDeliverySchema = external_exports.object({
18457
18484
  state: external_exports.enum(["unverified", "shown", "failed", "unsupported"]),
@@ -18461,29 +18488,16 @@ var agentNotificationSchema = external_exports.object({
18461
18488
  t: external_exports.literal("agent-notification"),
18462
18489
  id: external_exports.string().uuid(),
18463
18490
  session: external_exports.string().uuid(),
18464
- reason: external_exports.enum(["waiting_input", "exited"])
18491
+ reason: external_exports.enum(["waiting_input", "exited"]),
18492
+ content: notificationContentSchema.optional()
18465
18493
  });
18466
18494
 
18467
- // ../shared/src/api/common.ts
18468
- var errorResponseSchema = external_exports.object({
18469
- error: external_exports.object({
18470
- code: external_exports.string(),
18471
- message: external_exports.string(),
18472
- /** Optional machine-readable context for recoverable conflicts. */
18473
- details: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
18474
- })
18475
- });
18476
- var isoTimestamp = external_exports.iso.datetime({ offset: true });
18477
- var rowId = external_exports.number().int().positive();
18478
- var sessionId = external_exports.uuid();
18479
- var projectId = external_exports.string().regex(/^[0-9a-f]{10}$/);
18480
- var profileId = external_exports.string().regex(/^[0-9a-f]{10}$/);
18481
-
18482
18495
  // ../shared/src/api/version.ts
18483
18496
  var versionResponseSchema = external_exports.object({
18484
18497
  version: external_exports.string(),
18485
18498
  /** Added by the host connector; absent on direct daemon responses and older connectors. */
18486
18499
  remote_notifications: external_exports.boolean().optional(),
18500
+ remote_notification_previews: external_exports.boolean().optional(),
18487
18501
  remote_image_uploads: external_exports.boolean().optional(),
18488
18502
  protocol: external_exports.object({
18489
18503
  major: external_exports.number().int().nonnegative(),
@@ -19852,6 +19866,7 @@ var remoteHostSchema = external_exports.object({
19852
19866
  var remoteHostsSchema = external_exports.array(remoteHostSchema);
19853
19867
  var remoteServiceInfoSchema = external_exports.object({
19854
19868
  push_public_key: external_exports.string().max(100).optional(),
19869
+ push_encrypted_previews: external_exports.boolean().optional(),
19855
19870
  providers: external_exports.array(external_exports.enum(["google", "github"])),
19856
19871
  protocol: external_exports.literal(REMOTE_PROTOCOL_VERSION)
19857
19872
  });
@@ -20045,6 +20060,12 @@ var imageUploadProgressSchema = external_exports.object({
20045
20060
  });
20046
20061
 
20047
20062
  // ../shared/src/remote/notifications.ts
20063
+ var notificationPreviewKeySchema = external_exports.object({ id: remoteIdSchema, secret: remoteSecretSchema }).strict();
20064
+ var encryptedNotificationSchema = external_exports.object({
20065
+ key: remoteIdSchema,
20066
+ iv: external_exports.string().regex(/^[a-f0-9]{24}$/),
20067
+ ciphertext: external_exports.string().min(32).max(3072).regex(/^(?:[a-f0-9]{2})+$/)
20068
+ }).strict();
20048
20069
  var pushEndpointSchema = external_exports.string().max(2048).url().refine((value) => {
20049
20070
  let url2;
20050
20071
  try {
@@ -20063,18 +20084,177 @@ var pushSubscriptionSchema = external_exports.object({
20063
20084
  auth: external_exports.string().regex(/^[A-Za-z0-9_-]{22}={0,2}$/)
20064
20085
  }).strict()
20065
20086
  }).strict();
20066
- var pushPreferenceSchema = external_exports.object({ subscription: pushSubscriptionSchema.nullable() }).strict();
20067
- var pushRegistrationSchema = pushPreferenceSchema.extend({ credential: remoteSecretSchema, device: remoteIdSchema }).strict();
20087
+ var pushPreferenceSchema = external_exports.object({
20088
+ subscription: pushSubscriptionSchema.nullable(),
20089
+ preview_key: notificationPreviewKeySchema.optional()
20090
+ }).strict();
20091
+ var pushRegistrationSchema = pushPreferenceSchema.omit({ preview_key: true }).extend({ credential: remoteSecretSchema, device: remoteIdSchema }).strict();
20068
20092
  var pushDispatchSchema = external_exports.object({
20069
20093
  credential: remoteSecretSchema,
20070
20094
  devices: external_exports.array(remoteIdSchema).min(1).max(64),
20071
- id: remoteIdSchema
20095
+ id: remoteIdSchema,
20096
+ preview: encryptedNotificationSchema.optional()
20097
+ }).strict();
20098
+ var pushPayloadSchema = external_exports.object({
20099
+ id: remoteIdSchema,
20100
+ host: remoteIdSchema,
20101
+ preview: encryptedNotificationSchema.optional()
20102
+ }).strict();
20103
+ var connectorNotificationSchema = external_exports.object({
20104
+ t: external_exports.literal("notify"),
20105
+ id: remoteIdSchema,
20106
+ content: notificationContentSchema.optional()
20072
20107
  }).strict();
20073
- var pushPayloadSchema = external_exports.object({ id: remoteIdSchema, host: remoteIdSchema }).strict();
20074
- var connectorNotificationSchema = external_exports.object({ t: external_exports.literal("notify"), id: remoteIdSchema }).strict();
20075
20108
  var pushDispatchResultSchema = external_exports.object({ accepted: external_exports.number().int().nonnegative(), failed: external_exports.number().int().nonnegative() }).strict();
20076
20109
  var pushPreferenceResultSchema = external_exports.object({ enabled: external_exports.boolean() }).strict();
20077
20110
 
20111
+ // ../shared/src/api/puddlang.ts
20112
+ var PUDDLANG_MAX_SOURCE = 256 * 1024;
20113
+ var sourceSchema = external_exports.string().min(1).max(PUDDLANG_MAX_SOURCE).refine(
20114
+ (source) => new TextEncoder().encode(source).length <= PUDDLANG_MAX_SOURCE,
20115
+ "Source exceeds 256 KiB"
20116
+ );
20117
+ var puddlangSpawnSchema = external_exports.object({
20118
+ agent: external_exports.string().min(1).max(100),
20119
+ account: external_exports.union([external_exports.string().min(1).max(100), external_exports.number().int().positive()]).optional(),
20120
+ project: external_exports.string().min(1).max(200).optional(),
20121
+ worktree: external_exports.string().min(1).max(4096).optional(),
20122
+ path: external_exports.string().min(1).max(4096).optional(),
20123
+ title: external_exports.string().min(1).max(200).optional()
20124
+ }).refine((v) => Boolean(v.path) !== Boolean(v.project), "Choose path or project").refine((v) => !v.path || !v.worktree, "worktree requires project");
20125
+ var puddlangHandleSchema = external_exports.object({ runtime_id: external_exports.uuid(), session_id: sessionId });
20126
+ var puddlangAskSchema = external_exports.object({
20127
+ prompt: external_exports.string().min(1).max(128 * 1024),
20128
+ output_schema: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
20129
+ });
20130
+ var puddlangStartSchema = external_exports.object({
20131
+ id: external_exports.uuid(),
20132
+ source: sourceSchema,
20133
+ input: external_exports.unknown().optional(),
20134
+ accounts: external_exports.record(external_exports.string(), external_exports.union([external_exports.string(), external_exports.number().int().positive()])).default({}),
20135
+ max_turns: external_exports.number().int().min(1).max(1e3).default(50),
20136
+ max_agents: external_exports.number().int().min(1).max(32).default(8),
20137
+ timeout_ms: external_exports.number().int().min(1e3).max(24 * 60 * 60 * 1e3).default(60 * 60 * 1e3)
20138
+ });
20139
+ var puddlangRunSchema = external_exports.object({
20140
+ id: external_exports.uuid(),
20141
+ profile_id: profileId,
20142
+ source_hash: external_exports.string(),
20143
+ status: external_exports.enum(["running", "completed", "failed", "cancelled", "interrupted"]),
20144
+ result: external_exports.unknown().nullable(),
20145
+ error: external_exports.string().nullable(),
20146
+ created_at: external_exports.string(),
20147
+ updated_at: external_exports.string()
20148
+ });
20149
+ var puddlangEventSchema = external_exports.object({
20150
+ sequence: external_exports.number().int(),
20151
+ run_id: external_exports.uuid(),
20152
+ type: external_exports.string(),
20153
+ data: external_exports.unknown(),
20154
+ created_at: external_exports.string()
20155
+ });
20156
+ var puddlangEventsSchema = external_exports.object({ events: external_exports.array(puddlangEventSchema) });
20157
+ var puddlangOperationSchema = external_exports.discriminatedUnion("op", [
20158
+ external_exports.object({ op: external_exports.literal("spawn"), options: puddlangSpawnSchema }),
20159
+ external_exports.object({ op: external_exports.literal("attach"), reference: external_exports.string().min(1).max(100) }),
20160
+ external_exports.object({ op: external_exports.literal("ask"), handle: puddlangHandleSchema, request: puddlangAskSchema }),
20161
+ external_exports.object({ op: external_exports.literal("stop"), handle: puddlangHandleSchema })
20162
+ ]);
20163
+ var puddlangRunnerMessageSchema = external_exports.discriminatedUnion("type", [
20164
+ external_exports.object({
20165
+ type: external_exports.literal("operation"),
20166
+ id: external_exports.number().int(),
20167
+ operation: puddlangOperationSchema
20168
+ }),
20169
+ external_exports.object({
20170
+ type: external_exports.literal("finished"),
20171
+ result: external_exports.unknown().optional(),
20172
+ error: external_exports.string().max(8192).optional()
20173
+ })
20174
+ ]);
20175
+ var puddlangRunnerInputSchema = external_exports.discriminatedUnion("type", [
20176
+ external_exports.object({
20177
+ type: external_exports.literal("start"),
20178
+ source: sourceSchema,
20179
+ input: external_exports.unknown().optional()
20180
+ }),
20181
+ external_exports.object({
20182
+ type: external_exports.literal("reply"),
20183
+ id: external_exports.number().int(),
20184
+ value: external_exports.unknown().optional(),
20185
+ error: external_exports.string().optional()
20186
+ })
20187
+ ]);
20188
+ var puddlangContextSchema = external_exports.object({
20189
+ profile: external_exports.object({ id: profileId, name: external_exports.string() }),
20190
+ projects: external_exports.array(external_exports.object({ id: external_exports.string(), name: external_exports.string(), path: external_exports.string() })),
20191
+ accounts: external_exports.array(
20192
+ external_exports.object({ id: external_exports.number(), label: external_exports.string(), agent: external_exports.string(), logged_in: external_exports.boolean() })
20193
+ ),
20194
+ agents: external_exports.array(external_exports.object({ id: external_exports.string(), scripted_turns: external_exports.boolean() }))
20195
+ });
20196
+
20197
+ // ../shared/src/api/puddlang-mcp.ts
20198
+ var puddlangMcpRequestSchema = external_exports.object({
20199
+ jsonrpc: external_exports.literal("2.0"),
20200
+ id: external_exports.union([external_exports.string(), external_exports.number()]).optional(),
20201
+ method: external_exports.string(),
20202
+ params: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
20203
+ });
20204
+ var puddlangMcpCallSchema = external_exports.object({
20205
+ name: external_exports.string(),
20206
+ arguments: external_exports.unknown().optional()
20207
+ });
20208
+ var puddlangMcpRunSchema = puddlangStartSchema;
20209
+ var puddlangMcpIdSchema = external_exports.object({ id: external_exports.uuid() });
20210
+ var puddlangMcpEventsSchema = puddlangMcpIdSchema.extend({
20211
+ after: external_exports.number().int().nonnegative().default(0)
20212
+ });
20213
+ var puddlangMcpEmptySchema = external_exports.object({}).strict();
20214
+ var definitions = [
20215
+ [
20216
+ "puddlang_context",
20217
+ "List this host profile, projects, accounts and supported agents.",
20218
+ puddlangMcpEmptySchema,
20219
+ true
20220
+ ],
20221
+ [
20222
+ "puddlang_run",
20223
+ 'Execute a trusted single-file TypeScript programme on the host. Imports: puddlang (spawn, attach, input, z), zod, node: built-ins. Returns immediately with a durable run id; use status/events. Supply a fresh UUID id, or reuse it with identical input to recover an uncertain submission. spawn({agent:"codex",project:"name",account:"label"}); await agent.ask("task"); export default result. Supports structured ask({prompt,input,schema:z.object(...)}) and agent.stop().',
20224
+ puddlangMcpRunSchema,
20225
+ false
20226
+ ],
20227
+ [
20228
+ "puddlang_status",
20229
+ "Read a run and its final default export, if finished.",
20230
+ puddlangMcpIdSchema,
20231
+ true
20232
+ ],
20233
+ [
20234
+ "puddlang_events",
20235
+ "Read up to 100 events after a sequence; paginate until empty.",
20236
+ puddlangMcpEventsSchema,
20237
+ true
20238
+ ],
20239
+ [
20240
+ "puddlang_cancel",
20241
+ "Cancel a run, interrupt its pending asks, and stop agents it created. Attached agents are retained.",
20242
+ puddlangMcpIdSchema,
20243
+ false
20244
+ ]
20245
+ ];
20246
+ var puddlangMcpTools = definitions.map(([name, description, schema, readOnlyHint]) => ({
20247
+ name,
20248
+ description,
20249
+ inputSchema: external_exports.toJSONSchema(schema, { io: "input" }),
20250
+ annotations: {
20251
+ readOnlyHint,
20252
+ destructiveHint: !readOnlyHint,
20253
+ idempotentHint: true,
20254
+ openWorldHint: !readOnlyHint
20255
+ }
20256
+ }));
20257
+
20078
20258
  // src/lib/transport/local.ts
20079
20259
  import { spawn } from "node:child_process";
20080
20260
  import { copyFileSync, mkdirSync, readFileSync } from "node:fs";
@@ -21613,7 +21793,7 @@ import { readFileSync as readFileSync4 } from "node:fs";
21613
21793
  import { dirname as dirname4, join as join5 } from "node:path";
21614
21794
  import { fileURLToPath as fileURLToPath2 } from "node:url";
21615
21795
  function cliVersion() {
21616
- if (true) return "0.2.21";
21796
+ if (true) return "0.3.0";
21617
21797
  const here = dirname4(fileURLToPath2(import.meta.url));
21618
21798
  for (const candidate of [
21619
21799
  join5(here, "..", "..", "package.json"),
@@ -22007,7 +22187,11 @@ var RELEASE_PROTOCOLS = {
22007
22187
  "0.2.18": { major: 22, minor: 0 },
22008
22188
  "0.2.19": { major: 22, minor: 0 },
22009
22189
  "0.2.20": { major: 22, minor: 4 },
22010
- "0.2.21": { major: 22, minor: 4 }
22190
+ "0.2.21": { major: 22, minor: 4 },
22191
+ "0.2.22": { major: 22, minor: 4 },
22192
+ "0.2.23": { major: 22, minor: 5 },
22193
+ "0.2.24": { major: 22, minor: 5 },
22194
+ "0.3.0": { major: 23, minor: 0 }
22011
22195
  };
22012
22196
  function validProtocol(value) {
22013
22197
  if (typeof value !== "object" || value === null) return false;
@@ -24277,9 +24461,14 @@ function standaloneInstallation(entryFile = fileURLToPath4(import.meta.url), exe
24277
24461
  try {
24278
24462
  const root = resolve5(release, "..", "..");
24279
24463
  const record2 = JSON.parse(readFileSync9(join15(root, "installation.json"), "utf8"));
24280
- if (readFileSync9(join15(release, "STANDALONE"), "utf8").trim() !== "puddle-cli" || readFileSync9(join15(root, "INSTALLATION"), "utf8").trim() !== "puddle-cli" || dirname9(release) !== join15(root, "versions") || realpathSync2(release) !== release || realpathSync2(execPath) !== join15(release, "bin/node") || record2.kind !== "puddle-cli" || typeof record2.launcher !== "string" || !isAbsolute(record2.launcher))
24464
+ if (readFileSync9(join15(release, "STANDALONE"), "utf8").trim() !== "puddle-cli" || readFileSync9(join15(root, "INSTALLATION"), "utf8").trim() !== "puddle-cli" || dirname9(release) !== join15(root, "versions") || realpathSync2(release) !== release || realpathSync2(execPath) !== join15(release, "bin/node") || record2.kind !== "puddle-cli" || typeof record2.launcher !== "string" || !isAbsolute(record2.launcher) || record2.scriptLauncher !== void 0 && record2.scriptLauncher !== join15(dirname9(record2.launcher), "puddlang"))
24281
24465
  throw new Error("Installation metadata does not match this CLI");
24282
- return { root, release, launcher: record2.launcher };
24466
+ return {
24467
+ root,
24468
+ release,
24469
+ launcher: record2.launcher,
24470
+ ...typeof record2.scriptLauncher === "string" ? { scriptLauncher: record2.scriptLauncher } : {}
24471
+ };
24283
24472
  } catch {
24284
24473
  throw new CliError(
24285
24474
  "not_installed",
@@ -24313,8 +24502,8 @@ function upgradeStandaloneCli(installation, version2, repo) {
24313
24502
  });
24314
24503
  });
24315
24504
  }
24316
- function standaloneLauncher(root) {
24317
- const quoted = `'${join15(root, "current/puddle").replaceAll("'", "'\\''")}'`;
24505
+ function standaloneLauncher(root, command = "puddle") {
24506
+ const quoted = `'${join15(root, `current/${command}`).replaceAll("'", "'\\''")}'`;
24318
24507
  return `#!/bin/sh
24319
24508
  # puddle standalone launcher
24320
24509
  exec ${quoted} "$@"
@@ -24330,6 +24519,11 @@ async function removeStandaloneCli(installation) {
24330
24519
  try {
24331
24520
  if (lstatSync2(installation.launcher).isSymbolicLink() || await readFile2(installation.launcher, "utf8") !== standaloneLauncher(installation.root))
24332
24521
  throw new CliError("not_installed", "the CLI launcher was replaced; refusing removal");
24522
+ if (installation.scriptLauncher && existsSync5(installation.scriptLauncher)) {
24523
+ if (!lstatSync2(installation.scriptLauncher).isFile() || await readFile2(installation.scriptLauncher, "utf8") !== standaloneLauncher(installation.root, "puddlang"))
24524
+ throw new CliError("not_installed", "the puddlang launcher was replaced; refusing removal");
24525
+ await unlink(installation.scriptLauncher);
24526
+ }
24333
24527
  await unlink(installation.launcher);
24334
24528
  await rm2(installation.root, { recursive: true, force: true });
24335
24529
  } finally {