agent-relay-server 0.60.1 → 0.61.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 (157) hide show
  1. package/docs/openapi.json +361 -1
  2. package/package.json +3 -2
  3. package/public/assets/{MessageBubble-vzupFQD8.js → MessageBubble-CX63ZV4X.js} +2 -2
  4. package/public/assets/{MessageBubble-vzupFQD8.js.map → MessageBubble-CX63ZV4X.js.map} +1 -1
  5. package/public/assets/{PlanGraphPanel-DQvycBMW.js → PlanGraphPanel-Dby7wq9c.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-DQvycBMW.js.map → PlanGraphPanel-Dby7wq9c.js.map} +1 -1
  7. package/public/assets/{activity-gmfkOBhQ.js → activity-2xPOScu_.js} +2 -2
  8. package/public/assets/{activity-gmfkOBhQ.js.map → activity-2xPOScu_.js.map} +1 -1
  9. package/public/assets/{agent-profiles-7X8gFuwj.js → agent-profiles-BfGTTbeY.js} +2 -2
  10. package/public/assets/{agent-profiles-7X8gFuwj.js.map → agent-profiles-BfGTTbeY.js.map} +1 -1
  11. package/public/assets/agents-Bg3WOBRV.js +2 -0
  12. package/public/assets/{agents-D201CuTR.js.map → agents-Bg3WOBRV.js.map} +1 -1
  13. package/public/assets/{analytics-CkOTrr5t.js → analytics-De0cEZGx.js} +3 -3
  14. package/public/assets/{analytics-CkOTrr5t.js.map → analytics-De0cEZGx.js.map} +1 -1
  15. package/public/assets/{automation-_5u-nVs8.js → automation-CHxhzq2t.js} +2 -2
  16. package/public/assets/{automation-_5u-nVs8.js.map → automation-CHxhzq2t.js.map} +1 -1
  17. package/public/assets/{badge-Cy6qO_Jz.js → badge-DhLyCPag.js} +2 -2
  18. package/public/assets/{badge-Cy6qO_Jz.js.map → badge-DhLyCPag.js.map} +1 -1
  19. package/public/assets/branch-state-badge-DSyWKluD.js +2 -0
  20. package/public/assets/{branch-state-badge-BPXXLpQG.js.map → branch-state-badge-DSyWKluD.js.map} +1 -1
  21. package/public/assets/{button-73wpRw65.js → button-K20wAZG1.js} +2 -2
  22. package/public/assets/{button-73wpRw65.js.map → button-K20wAZG1.js.map} +1 -1
  23. package/public/assets/card-CcZ9hLI7.js +2 -0
  24. package/public/assets/{card-BU6PvVHv.js.map → card-CcZ9hLI7.js.map} +1 -1
  25. package/public/assets/{channels-BsJu5TXR.js → channels-BG0Nib7y.js} +2 -2
  26. package/public/assets/{channels-BsJu5TXR.js.map → channels-BG0Nib7y.js.map} +1 -1
  27. package/public/assets/chat-CjP_crSl.js +2 -0
  28. package/public/assets/{chat-CHgPGHQD.js.map → chat-CjP_crSl.js.map} +1 -1
  29. package/public/assets/{connectors-arjfBQvc.js → connectors-DWh7MwV_.js} +2 -2
  30. package/public/assets/{connectors-arjfBQvc.js.map → connectors-DWh7MwV_.js.map} +1 -1
  31. package/public/assets/{copy-button-HRopUwui.js → copy-button-eF3cKp4Q.js} +2 -2
  32. package/public/assets/{copy-button-HRopUwui.js.map → copy-button-eF3cKp4Q.js.map} +1 -1
  33. package/public/assets/display-DzNvOu1j.js +3 -0
  34. package/public/assets/{display-CketawEF.js.map → display-DzNvOu1j.js.map} +1 -1
  35. package/public/assets/{dist-Kkpnjx_M.js → dist-1dhfdhm9.js} +2 -2
  36. package/public/assets/{dist-Kkpnjx_M.js.map → dist-1dhfdhm9.js.map} +1 -1
  37. package/public/assets/dist-BLBF7qqr.js +2 -0
  38. package/public/assets/{dist-De2oguBm.js.map → dist-BLBF7qqr.js.map} +1 -1
  39. package/public/assets/{dist-T7u7IZGJ.js → dist-BrQsqBbc.js} +2 -2
  40. package/public/assets/{dist-T7u7IZGJ.js.map → dist-BrQsqBbc.js.map} +1 -1
  41. package/public/assets/{dist-Cko2KPW8.js → dist-COQuunEv.js} +2 -2
  42. package/public/assets/{dist-Cko2KPW8.js.map → dist-COQuunEv.js.map} +1 -1
  43. package/public/assets/{dist-CLHMeXYi.js → dist-Ci5Y37nj.js} +2 -2
  44. package/public/assets/{dist-CLHMeXYi.js.map → dist-Ci5Y37nj.js.map} +1 -1
  45. package/public/assets/{dist-Ci1MM51P.js → dist-CoROafNg.js} +2 -2
  46. package/public/assets/{dist-Ci1MM51P.js.map → dist-CoROafNg.js.map} +1 -1
  47. package/public/assets/{dist-CC5f7oYw.js → dist-I-MFUv51.js} +2 -2
  48. package/public/assets/{dist-CC5f7oYw.js.map → dist-I-MFUv51.js.map} +1 -1
  49. package/public/assets/{dist-DFLciw0h.js → dist-UQGKwqZH.js} +2 -2
  50. package/public/assets/{dist-DFLciw0h.js.map → dist-UQGKwqZH.js.map} +1 -1
  51. package/public/assets/dist-YpHfnnIA.js +2 -0
  52. package/public/assets/{dist-DUoZnlB2.js.map → dist-YpHfnnIA.js.map} +1 -1
  53. package/public/assets/dist-qd198ib9.js +2 -0
  54. package/public/assets/{dist-D41tzJYg.js.map → dist-qd198ib9.js.map} +1 -1
  55. package/public/assets/{dist-DmN94rc8.js → dist-yGOq6sB3.js} +2 -2
  56. package/public/assets/{dist-DmN94rc8.js.map → dist-yGOq6sB3.js.map} +1 -1
  57. package/public/assets/{es2015-Df08Opjx.js → es2015-CRxz9lOj.js} +2 -2
  58. package/public/assets/{es2015-Df08Opjx.js.map → es2015-CRxz9lOj.js.map} +1 -1
  59. package/public/assets/{formatted-body-impl-DBt5tnS0.js → formatted-body-impl-u0W_hWYA.js} +2 -2
  60. package/public/assets/{formatted-body-impl-DBt5tnS0.js.map → formatted-body-impl-u0W_hWYA.js.map} +1 -1
  61. package/public/assets/index-BwfVOzUG.js +21 -0
  62. package/public/assets/{index-D7js3XlH.js.map → index-BwfVOzUG.js.map} +1 -1
  63. package/public/assets/index-Dn_GDXbi.css +2 -0
  64. package/public/assets/{input-B2EDz-BE.js → input-BHYNpXAG.js} +2 -2
  65. package/public/assets/{input-B2EDz-BE.js.map → input-BHYNpXAG.js.map} +1 -1
  66. package/public/assets/{insights-BvjkOXk9.js → insights-CAF9Hi5D.js} +2 -2
  67. package/public/assets/{insights-BvjkOXk9.js.map → insights-CAF9Hi5D.js.map} +1 -1
  68. package/public/assets/{integrations-7L1f3eIE.js → integrations-CG9qyHUf.js} +2 -2
  69. package/public/assets/{integrations-7L1f3eIE.js.map → integrations-CG9qyHUf.js.map} +1 -1
  70. package/public/assets/{lib-BZrjIp-o.js → lib-Df4aph5u.js} +2 -2
  71. package/public/assets/{lib-BZrjIp-o.js.map → lib-Df4aph5u.js.map} +1 -1
  72. package/public/assets/lucide-react-L2UxFDic.js +9 -0
  73. package/public/assets/lucide-react-L2UxFDic.js.map +1 -0
  74. package/public/assets/{maintenance-BBoL--vs.js → maintenance-DgHA35ve.js} +2 -2
  75. package/public/assets/{maintenance-BBoL--vs.js.map → maintenance-DgHA35ve.js.map} +1 -1
  76. package/public/assets/{managed-agents-BjYBzVZt.js → managed-agents-Rk6ghKR9.js} +2 -2
  77. package/public/assets/{managed-agents-BjYBzVZt.js.map → managed-agents-Rk6ghKR9.js.map} +1 -1
  78. package/public/assets/{markdown-preview-impl-BnwjZsmO.js → markdown-preview-impl-NWMtJdYz.js} +2 -2
  79. package/public/assets/{markdown-preview-impl-BnwjZsmO.js.map → markdown-preview-impl-NWMtJdYz.js.map} +1 -1
  80. package/public/assets/memory-DamwWa9A.js +2 -0
  81. package/public/assets/{memory-SLycz2gC.js.map → memory-DamwWa9A.js.map} +1 -1
  82. package/public/assets/{messages-DfSCTe6N.js → messages--NU-YIL6.js} +2 -2
  83. package/public/assets/{messages-DfSCTe6N.js.map → messages--NU-YIL6.js.map} +1 -1
  84. package/public/assets/{orchestrators-BwxdTQm_.js → orchestrators-DQnIn6qx.js} +2 -2
  85. package/public/assets/{orchestrators-BwxdTQm_.js.map → orchestrators-DQnIn6qx.js.map} +1 -1
  86. package/public/assets/{overview-Djy3qkY5.js → overview-DCmNgXDf.js} +2 -2
  87. package/public/assets/{overview-Djy3qkY5.js.map → overview-DCmNgXDf.js.map} +1 -1
  88. package/public/assets/{pairs-9KNduLnC.js → pairs-DNELeC9P.js} +2 -2
  89. package/public/assets/{pairs-9KNduLnC.js.map → pairs-DNELeC9P.js.map} +1 -1
  90. package/public/assets/{react-dom-WI6TjVe7.js → react-dom-CrP_AtcL.js} +2 -2
  91. package/public/assets/{react-dom-WI6TjVe7.js.map → react-dom-CrP_AtcL.js.map} +1 -1
  92. package/public/assets/{security-tG3q7fFW.js → security-Dd3Kh0oC.js} +2 -2
  93. package/public/assets/{security-tG3q7fFW.js.map → security-Dd3Kh0oC.js.map} +1 -1
  94. package/public/assets/{select-CGUdMNOG.js → select-DQbeJZX0.js} +2 -2
  95. package/public/assets/{select-CGUdMNOG.js.map → select-DQbeJZX0.js.map} +1 -1
  96. package/public/assets/settings-BMAJrBIH.js +4 -0
  97. package/public/assets/settings-BMAJrBIH.js.map +1 -0
  98. package/public/assets/store-B8xP6z6T.js +9 -0
  99. package/public/assets/store-B8xP6z6T.js.map +1 -0
  100. package/public/assets/tasks-BYR4L9GP.js +2 -0
  101. package/public/assets/{tasks-DWlKg218.js.map → tasks-BYR4L9GP.js.map} +1 -1
  102. package/public/assets/teams-CoTifrq_.js +2 -0
  103. package/public/assets/{teams-DRchUP_p.js.map → teams-CoTifrq_.js.map} +1 -1
  104. package/public/assets/{terminal-viewer-impl-D_Sqe-vo.js → terminal-viewer-impl-B1YzfpE6.js} +3 -3
  105. package/public/assets/{terminal-viewer-impl-D_Sqe-vo.js.map → terminal-viewer-impl-B1YzfpE6.js.map} +1 -1
  106. package/public/assets/{use-keyboard-viewport-fOL_3RHB.js → use-keyboard-viewport-DrRH_QzG.js} +2 -2
  107. package/public/assets/{use-keyboard-viewport-fOL_3RHB.js.map → use-keyboard-viewport-DrRH_QzG.js.map} +1 -1
  108. package/public/assets/{work-queue-HNcyjON9.js → work-queue-x57vlgyZ.js} +2 -2
  109. package/public/assets/{work-queue-HNcyjON9.js.map → work-queue-x57vlgyZ.js.map} +1 -1
  110. package/public/assets/{workspaces-CicYE2Ax.js → workspaces-CYm5bLg9.js} +3 -3
  111. package/public/assets/{workspaces-CicYE2Ax.js.map → workspaces-CYm5bLg9.js.map} +1 -1
  112. package/public/index.html +22 -22
  113. package/runner/src/config.ts +66 -2
  114. package/src/automations.ts +3 -4
  115. package/src/config-store.ts +5 -6
  116. package/src/connectors.ts +5 -0
  117. package/src/db/migrations.ts +6 -0
  118. package/src/db/schema.ts +1 -1
  119. package/src/index.ts +5 -2
  120. package/src/mcp-provider-catalog.ts +9 -0
  121. package/src/mcp.ts +4 -4
  122. package/src/provider-catalog-store.ts +33 -4
  123. package/src/provider-config-store.ts +216 -0
  124. package/src/recipe-runner.ts +2 -1
  125. package/src/recipe-validator.ts +4 -3
  126. package/src/routes/agents-spawn.ts +2 -2
  127. package/src/routes/index.ts +12 -2
  128. package/src/routes/insights.ts +4 -3
  129. package/src/routes/provider-config.ts +89 -41
  130. package/src/routes/settings.ts +127 -0
  131. package/src/routes/steward.ts +5 -5
  132. package/src/routes/tokens.ts +32 -1
  133. package/src/security.ts +34 -37
  134. package/src/settings/modules.ts +149 -0
  135. package/src/settings/registry.ts +397 -0
  136. package/src/spawn-command.ts +5 -1
  137. package/src/team-template-config.ts +2 -2
  138. package/src/token-db.ts +20 -0
  139. package/public/assets/agents-D201CuTR.js +0 -2
  140. package/public/assets/branch-state-badge-BPXXLpQG.js +0 -2
  141. package/public/assets/card-BU6PvVHv.js +0 -2
  142. package/public/assets/chat-CHgPGHQD.js +0 -2
  143. package/public/assets/display-CketawEF.js +0 -3
  144. package/public/assets/dist-D41tzJYg.js +0 -2
  145. package/public/assets/dist-DUoZnlB2.js +0 -2
  146. package/public/assets/dist-De2oguBm.js +0 -2
  147. package/public/assets/index-D7js3XlH.js +0 -21
  148. package/public/assets/index-DaNOQJci.css +0 -2
  149. package/public/assets/lucide-react-H_-8G79A.js +0 -9
  150. package/public/assets/lucide-react-H_-8G79A.js.map +0 -1
  151. package/public/assets/memory-SLycz2gC.js +0 -2
  152. package/public/assets/settings-CGcqyJ5L.js +0 -10
  153. package/public/assets/settings-CGcqyJ5L.js.map +0 -1
  154. package/public/assets/store-DXdfhiVf.js +0 -9
  155. package/public/assets/store-DXdfhiVf.js.map +0 -1
  156. package/public/assets/tasks-DWlKg218.js +0 -2
  157. package/public/assets/teams-DRchUP_p.js +0 -2
package/docs/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Agent Relay API",
5
- "version": "0.60.1",
5
+ "version": "0.61.0",
6
6
  "description": "Real-time message bus for inter-agent communication. Agent-first: this spec is designed for machine consumption — agents can self-discover the full API surface via GET /api/spec.",
7
7
  "license": {
8
8
  "name": "MIT",
@@ -3706,6 +3706,35 @@
3706
3706
  ]
3707
3707
  }
3708
3708
  },
3709
+ "/api/tokens/me": {
3710
+ "get": {
3711
+ "operationId": "getTokenMe",
3712
+ "summary": "Inspect current token scopes",
3713
+ "tags": [
3714
+ "Tokens"
3715
+ ],
3716
+ "description": "Returns the authenticated caller's actor kind and effective scope list so dashboards can decide which settings and token-scoped controls to show. Component and integration tokens can call this for themselves without `token:read`; invalid tokens still return 401.",
3717
+ "responses": {
3718
+ "200": {
3719
+ "description": "Success",
3720
+ "content": {
3721
+ "application/json": {}
3722
+ }
3723
+ }
3724
+ },
3725
+ "security": [
3726
+ {
3727
+ "bearerAuth": []
3728
+ },
3729
+ {
3730
+ "tokenHeader": []
3731
+ },
3732
+ {
3733
+ "tokenQuery": []
3734
+ }
3735
+ ]
3736
+ }
3737
+ },
3709
3738
  "/api/runtime-tokens/renew": {
3710
3739
  "post": {
3711
3740
  "operationId": "postRuntimeTokenRenew",
@@ -4576,6 +4605,203 @@
4576
4605
  ]
4577
4606
  }
4578
4607
  },
4608
+ "/api/settings": {
4609
+ "get": {
4610
+ "operationId": "getSettingsRoute",
4611
+ "summary": "List schema-driven settings",
4612
+ "tags": [
4613
+ "Other"
4614
+ ],
4615
+ "description": "Returns `{ settings: [...] }`, one entry per readable registered setting. Each entry includes the descriptor fields (`namespace`, `key`, `schema`, `defaults`, `scope`, `tier`, `display`), current `value`, version metadata, and `readable`/`writable` flags. Read/write flags are evaluated from the descriptor's opaque scope strings.",
4616
+ "responses": {
4617
+ "200": {
4618
+ "description": "Success",
4619
+ "content": {
4620
+ "application/json": {}
4621
+ }
4622
+ }
4623
+ },
4624
+ "security": [
4625
+ {
4626
+ "bearerAuth": []
4627
+ },
4628
+ {
4629
+ "tokenHeader": []
4630
+ },
4631
+ {
4632
+ "tokenQuery": []
4633
+ }
4634
+ ]
4635
+ }
4636
+ },
4637
+ "/api/settings/{namespace}": {
4638
+ "get": {
4639
+ "operationId": "getSettingsNamespaceRoute",
4640
+ "summary": "List settings in a namespace",
4641
+ "tags": [
4642
+ "Other"
4643
+ ],
4644
+ "description": "Returns `{ settings: [...] }` for one namespace, filtered to descriptors the caller can read. Use `GET /api/settings` to discover namespaces.",
4645
+ "parameters": [
4646
+ {
4647
+ "name": "namespace",
4648
+ "in": "path",
4649
+ "required": true,
4650
+ "schema": {
4651
+ "type": "string"
4652
+ }
4653
+ }
4654
+ ],
4655
+ "responses": {
4656
+ "200": {
4657
+ "description": "Success",
4658
+ "content": {
4659
+ "application/json": {}
4660
+ }
4661
+ }
4662
+ },
4663
+ "security": [
4664
+ {
4665
+ "bearerAuth": []
4666
+ },
4667
+ {
4668
+ "tokenHeader": []
4669
+ },
4670
+ {
4671
+ "tokenQuery": []
4672
+ }
4673
+ ]
4674
+ },
4675
+ "put": {
4676
+ "operationId": "putSettingsDefaultRoute",
4677
+ "summary": "Set default setting value",
4678
+ "tags": [
4679
+ "Other"
4680
+ ],
4681
+ "description": "Updates key `default` in the namespace. Body: `{ value, updatedBy? }`. The value is validated against the registered JSON Schema via ajv before writing through the config store and emitting `config.changed`.",
4682
+ "parameters": [
4683
+ {
4684
+ "name": "namespace",
4685
+ "in": "path",
4686
+ "required": true,
4687
+ "schema": {
4688
+ "type": "string"
4689
+ }
4690
+ }
4691
+ ],
4692
+ "responses": {
4693
+ "200": {
4694
+ "description": "Success",
4695
+ "content": {
4696
+ "application/json": {}
4697
+ }
4698
+ }
4699
+ },
4700
+ "security": [
4701
+ {
4702
+ "bearerAuth": []
4703
+ },
4704
+ {
4705
+ "tokenHeader": []
4706
+ },
4707
+ {
4708
+ "tokenQuery": []
4709
+ }
4710
+ ]
4711
+ }
4712
+ },
4713
+ "/api/settings/{namespace}/{key}": {
4714
+ "get": {
4715
+ "operationId": "getSettingRoute",
4716
+ "summary": "Get one schema-driven setting",
4717
+ "tags": [
4718
+ "Other"
4719
+ ],
4720
+ "description": "Returns one setting envelope with descriptor, current value, version metadata, and `readable`/`writable` flags. Keys containing `/` are addressed with URL encoding, for example `provider-config/{encodeURIComponent('<host>/<provider>')}`.",
4721
+ "parameters": [
4722
+ {
4723
+ "name": "namespace",
4724
+ "in": "path",
4725
+ "required": true,
4726
+ "schema": {
4727
+ "type": "string"
4728
+ }
4729
+ },
4730
+ {
4731
+ "name": "key",
4732
+ "in": "path",
4733
+ "required": true,
4734
+ "schema": {
4735
+ "type": "string"
4736
+ }
4737
+ }
4738
+ ],
4739
+ "responses": {
4740
+ "200": {
4741
+ "description": "Success",
4742
+ "content": {
4743
+ "application/json": {}
4744
+ }
4745
+ }
4746
+ },
4747
+ "security": [
4748
+ {
4749
+ "bearerAuth": []
4750
+ },
4751
+ {
4752
+ "tokenHeader": []
4753
+ },
4754
+ {
4755
+ "tokenQuery": []
4756
+ }
4757
+ ]
4758
+ },
4759
+ "put": {
4760
+ "operationId": "putSettingRoute",
4761
+ "summary": "Set setting value",
4762
+ "tags": [
4763
+ "Other"
4764
+ ],
4765
+ "description": "Updates one setting. Body: `{ value, updatedBy? }`. The value is validated against the registered JSON Schema via ajv before writing through the config store and emitting `config.changed`. Write authorization delegates to the descriptor's opaque `scope.write` token.",
4766
+ "parameters": [
4767
+ {
4768
+ "name": "namespace",
4769
+ "in": "path",
4770
+ "required": true,
4771
+ "schema": {
4772
+ "type": "string"
4773
+ }
4774
+ },
4775
+ {
4776
+ "name": "key",
4777
+ "in": "path",
4778
+ "required": true,
4779
+ "schema": {
4780
+ "type": "string"
4781
+ }
4782
+ }
4783
+ ],
4784
+ "responses": {
4785
+ "200": {
4786
+ "description": "Success",
4787
+ "content": {
4788
+ "application/json": {}
4789
+ }
4790
+ }
4791
+ },
4792
+ "security": [
4793
+ {
4794
+ "bearerAuth": []
4795
+ },
4796
+ {
4797
+ "tokenHeader": []
4798
+ },
4799
+ {
4800
+ "tokenQuery": []
4801
+ }
4802
+ ]
4803
+ }
4804
+ },
4579
4805
  "/api/config/{namespace}": {
4580
4806
  "get": {
4581
4807
  "operationId": "getConfigNamespace",
@@ -5206,6 +5432,140 @@
5206
5432
  ]
5207
5433
  }
5208
5434
  },
5435
+ "/api/providers/{provider}/models/{alias}": {
5436
+ "put": {
5437
+ "operationId": "putProviderModelRoute",
5438
+ "summary": "Put Provider Model",
5439
+ "tags": [
5440
+ "Providers"
5441
+ ],
5442
+ "parameters": [
5443
+ {
5444
+ "name": "provider",
5445
+ "in": "path",
5446
+ "required": true,
5447
+ "schema": {
5448
+ "type": "string"
5449
+ }
5450
+ },
5451
+ {
5452
+ "name": "alias",
5453
+ "in": "path",
5454
+ "required": true,
5455
+ "schema": {
5456
+ "type": "string"
5457
+ }
5458
+ }
5459
+ ],
5460
+ "responses": {
5461
+ "200": {
5462
+ "description": "Success",
5463
+ "content": {
5464
+ "application/json": {}
5465
+ }
5466
+ }
5467
+ },
5468
+ "security": [
5469
+ {
5470
+ "bearerAuth": []
5471
+ },
5472
+ {
5473
+ "tokenHeader": []
5474
+ },
5475
+ {
5476
+ "tokenQuery": []
5477
+ }
5478
+ ]
5479
+ },
5480
+ "patch": {
5481
+ "operationId": "patchProviderModelRoute",
5482
+ "summary": "Patch Provider Model",
5483
+ "tags": [
5484
+ "Providers"
5485
+ ],
5486
+ "parameters": [
5487
+ {
5488
+ "name": "provider",
5489
+ "in": "path",
5490
+ "required": true,
5491
+ "schema": {
5492
+ "type": "string"
5493
+ }
5494
+ },
5495
+ {
5496
+ "name": "alias",
5497
+ "in": "path",
5498
+ "required": true,
5499
+ "schema": {
5500
+ "type": "string"
5501
+ }
5502
+ }
5503
+ ],
5504
+ "responses": {
5505
+ "200": {
5506
+ "description": "Success",
5507
+ "content": {
5508
+ "application/json": {}
5509
+ }
5510
+ }
5511
+ },
5512
+ "security": [
5513
+ {
5514
+ "bearerAuth": []
5515
+ },
5516
+ {
5517
+ "tokenHeader": []
5518
+ },
5519
+ {
5520
+ "tokenQuery": []
5521
+ }
5522
+ ]
5523
+ },
5524
+ "delete": {
5525
+ "operationId": "deleteProviderModelRoute",
5526
+ "summary": "Delete Provider Model",
5527
+ "tags": [
5528
+ "Providers"
5529
+ ],
5530
+ "parameters": [
5531
+ {
5532
+ "name": "provider",
5533
+ "in": "path",
5534
+ "required": true,
5535
+ "schema": {
5536
+ "type": "string"
5537
+ }
5538
+ },
5539
+ {
5540
+ "name": "alias",
5541
+ "in": "path",
5542
+ "required": true,
5543
+ "schema": {
5544
+ "type": "string"
5545
+ }
5546
+ }
5547
+ ],
5548
+ "responses": {
5549
+ "200": {
5550
+ "description": "Success",
5551
+ "content": {
5552
+ "application/json": {}
5553
+ }
5554
+ }
5555
+ },
5556
+ "security": [
5557
+ {
5558
+ "bearerAuth": []
5559
+ },
5560
+ {
5561
+ "tokenHeader": []
5562
+ },
5563
+ {
5564
+ "tokenQuery": []
5565
+ }
5566
+ ]
5567
+ }
5568
+ },
5209
5569
  "/api/providers/{provider}/config": {
5210
5570
  "get": {
5211
5571
  "operationId": "getProviderConfigRoute",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay-server",
3
- "version": "0.60.1",
3
+ "version": "0.61.0",
4
4
  "description": "Lightweight HTTP message relay for inter-agent communication across machines",
5
5
  "module": "src/index.ts",
6
6
  "type": "module",
@@ -33,7 +33,8 @@
33
33
  "CONTRIBUTING.md"
34
34
  ],
35
35
  "dependencies": {
36
- "agent-relay-sdk": "0.2.36"
36
+ "agent-relay-sdk": "0.2.37",
37
+ "ajv": "^8.20.0"
37
38
  },
38
39
  "scripts": {
39
40
  "prepack": "bun run build:dashboard:bundle >&2",
@@ -1,2 +1,2 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{$t as t,En as n,Fn as r,L as i,Ln as a,Nn as o,Nt as s,P as c,Qt as l,St as u,Vt as d,Yt as f,an as p,b as m,c as h,cn as g,g as _,gn as v,i as y,in as b,ln as x,on as S,ot as C,p as w,qn as T,r as E,rt as D,un as O,xt as k}from"./lucide-react-H_-8G79A.js";import{n as A,p as j,t as M}from"./store-DXdfhiVf.js";import{D as N,I as P,M as F,W as I,it as L,j as R,w as z,z as ee}from"./display-CketawEF.js";import{a as te,i as ne,o as re,t as B,x as ie}from"./index-D7js3XlH.js";var V=e(T(),1),H={online:`came online`,offline:`went offline`,shutdown:`shut down`,restarted:`restarted`,"compaction-requested":`compaction requested`,compacting:`compaction started`,compacted:`context compacted`,"compaction-stalled":`compaction stalled — may need manual intervention`,"clear-requested":`clear requested`,"clearing-context":`clear started`,"context-cleared":`context cleared`,"clear-stalled":`context clear stalled — may need manual intervention`,"shutting-down":`shutting down`},ae=new Set(Object.keys(H)),oe=3e3;function U(e){return new Date(e.occurredAt??e.createdAt).getTime()}function se(e){if(e.kind!==`session`)return null;let t=e.payload?.session;return!t||t.type!==`narration`&&t.type!==`reasoning`&&t.type!==`tool`?null:{id:e.id,kind:t.type,label:typeof t.label==`string`?t.label:void 0,text:e.body,ts:U(e),turnId:typeof t.turnId==`string`?t.turnId:void 0}}function ce(e){if(e.kind!==`session`)return null;let t=e.payload?.session;if(t?.type!==`notice`)return null;let n=typeof t.label==`string`&&t.label?t.label:`compacted`;return{id:`notice-${e.id}`,status:n,timestamp:U(e)}}function W(e,t){let n=e.trim();for(let e of t){let t=e.trim();if(t){if(n===t)break;n.startsWith(`${t}\n\n`)&&(n=n.slice(t.length+2).trimStart())}}return n.trim()||e.trim()}function le(e){return e.kind===`system`&&e.from===`system`}var ue=new Set([`agent.ready`,`agent.exited`,`agent.spawn_failed`]);function G(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function de(e){let t=e.filter(e=>ae.has(e.status)).slice().sort((e,t)=>e.timestamp-t.timestamp),n=[];for(let e of t)n.some(t=>t.id===e.id)||n.some(t=>t.status===e.status&&Math.abs(t.timestamp-e.timestamp)<=oe)||n.push(e);return n}function fe(e,t,n,r=[],i){let a=[];for(let e of r){let t=e.entries.reduce((e,t)=>Math.min(e,I(t.originalCreatedAt)),1/0),n=Number.isFinite(t)?t-1:e.importedAt;a.push({ts:n,entry:{type:`import-boundary`,history:e,timestamp:n}});for(let t of e.entries)a.push({ts:I(t.originalCreatedAt),entry:{type:`imported-message`,history:e,entry:t}})}if(n){let e=new Date(n).getTime();Number.isFinite(e)&&a.push({ts:e,entry:{type:`created`,timestamp:e}})}if(i?.spawnedBy){let e=n?new Date(n).getTime():0,t=Number.isFinite(e)?e:0;a.push({ts:t,entry:{type:`agent-action`,direction:`spawned-by`,agentId:i.spawnedBy.agentId,provider:i.spawnedBy.provider,status:`ready`,timestamp:t}})}let o=new Map,s=new Map,c=new Map;for(let t of e){if(t.kind!==`session`)continue;let e=t.payload?.session;if(e?.type===`narration`&&typeof e.turnId==`string`){let n=s.get(e.turnId)??[];n.push({id:t.id,body:t.body.trim()}),s.set(e.turnId,n)}else if(e?.type===`response`&&typeof e.turnId==`string`){let n=o.get(e.turnId)??[];n.push(t.body.trim()),o.set(e.turnId,n)}}let l=new Map;for(let[e,t]of o){let n=(s.get(e)??[]).map(e=>e.body);l.set(e,t.map(e=>W(e,n)))}for(let t of e){if(t.kind!==`session`)continue;let e=t.payload?.session;if(e?.type!==`response`||typeof e.turnId!=`string`)continue;let n=W(t.body,(s.get(e.turnId)??[]).map(e=>e.body));n&&n!==t.body&&c.set(t.id,n)}let u=new Set;for(let[e,t]of l){let n=s.get(e)??[];for(let e of t)for(let t=n.length-1;t>=0;t--){let r=n[t];if(!u.has(r.id)&&ee(e,r.body)){u.add(r.id);break}}}let d=new Map,f=[];for(let t of e){if(le(t)){let e=typeof t.payload?.kind==`string`?t.payload.kind:``;if(ue.has(e)){let n=t.payload,r=typeof n.agentId==`string`?n.agentId:``,i=U(t);if(!r){a.push({ts:i,entry:{type:`notice`,msg:t}});continue}let o=e===`agent.ready`?`ready`:e===`agent.exited`?`exited`:`failed`,s=d.get(r);if(s)s.entry.status=o,typeof n.reason==`string`&&(s.entry.reason=n.reason),s.entry.timestamp=i,s.ts=i;else{let e={ts:i,entry:{type:`agent-action`,direction:`spawned-child`,agentId:r,provider:typeof n.provider==`string`?n.provider:void 0,status:o,reason:typeof n.reason==`string`?n.reason:void 0,timestamp:i}};d.set(r,e),a.push(e)}continue}a.push({ts:U(t),entry:{type:`notice`,msg:t}});continue}let e=ce(t);if(e){f.push(e);continue}let n=se(t);if(n){if(n.kind===`narration`&&u.has(n.id))continue;a.push({ts:n.ts,entry:{type:`activity`,steps:[n],timestamp:n.ts}});continue}if(t.kind===`session`){let e=t.payload?.session;if(e?.type===`response`&&typeof e.turnId==`string`){let e=c.get(t.id);if(e&&e!==t.body){a.push({ts:U(t),entry:{type:`message`,msg:{...t,body:e}}});continue}}}a.push({ts:U(t),entry:{type:`message`,msg:t}})}for(let e of de([...t,...f]))a.push({ts:e.timestamp,entry:{type:`status`,event:e}});let p={created:0,date:1,"import-boundary":2,"imported-message":3,message:4,activity:4,notice:4,"agent-action":4,status:5};a.sort((e,t)=>{let n=e.ts-t.ts;return Math.abs(n)<3e3&&p[e.entry.type]-p[t.entry.type]||n});let m=[],h=``;for(let{ts:e,entry:t}of a){if(t.type===`created`){m.push(t);continue}let n=G(e);if(n!==h&&(m.push({type:`date`,date:n,timestamp:e}),h=n),t.type===`activity`){let e=m[m.length-1];if(e&&e.type===`activity`&&pe(e,t)){e.steps.push(...t.steps);continue}}m.push(t)}return m}function pe(e,t){let n=e.steps[e.steps.length-1]?.turnId,r=t.steps[0]?.turnId;return n&&r?n===r:!n&&!r}function me(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function he(e,t){if(t.startsWith(`/`))return t;let n=`${e.replace(/\/+$/,``)}/${t}`.split(`/`),r=[];for(let e of n)!e||e===`.`||(e===`..`?r.pop():r.push(e));return`/`+r.join(`/`)}function ge(e){let t=e.replace(/\/+$/,``),n=t.lastIndexOf(`/`);return n>0?t.slice(0,n):`/`}function _e(e,t){return e.filter(e=>e.status===`online`&&P(t,e.baseDir)).sort((e,t)=>R(t.baseDir).length-R(e.baseDir).length)[0]||e.find(e=>e.status===`online`)}function ve(){return typeof window<`u`&&window.matchMedia(`(min-width: 1280px)`).matches}function K(){return typeof window<`u`&&!!window.getSelection()?.toString()}function ye(e){let t=e.payload?.attachments;return Array.isArray(t)?t.filter(e=>!!(e&&typeof e==`object`&&typeof e.artifactId==`string`)):[]}var be=[`👍`,`❤️`,`✅`,`👀`];function xe(e){let t=new Map;for(let n of e.reactions||[]){let e=F(n.emoji),r=t.get(e)??{emoji:e,count:0,mine:!1,actors:[]};r.count+=1,r.mine=r.mine||n.actorId===`user`,r.actors.push(n.actorId),t.set(e,r)}return[...t.values()].sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))}function q(e){return z(e)}function Se(e,t){let n=e.readBy||[],r=e.resolvedToAgent||t||e.to,i=r?n.includes(r):!1,a=n.some(e=>e!==L);if(i||a){let e=i?r:n.find(e=>e!==L);return{label:`read`,title:e?`Read by ${e}`:`Read by agent`,tone:`ok`,icon:O}}if(e.deliveryStatus===`delivered`)return{label:`delivered`,title:`Delivered to agent inbox`,tone:`ok`,icon:O};if(e.deliveryStatus===`queued`)return{label:`queued`,title:`Queued until the target agent is available`,tone:`warn`,icon:f};if(e.deliveryStatus===`failed`||e.deliveryStatus===`dead`){let t=e.deliveryPoisonReason||e.deliveryLastError||e.deliveryStatus;return{label:e.deliveryStatus,title:t,tone:`danger`,icon:b}}return{label:`sent`,title:`Accepted by Relay`,tone:`muted`,icon:x}}function Ce(e){let t=I(e.createdAt);return(e.reactions||[]).reduce((e,t)=>Math.max(e,I(t.updatedAt||t.createdAt)),t)}function we(e){return e?e.messages.reduce((e,t)=>Math.max(e,Ce(t)),0):0}function J(e){return new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function Te(e){for(let t of e)t.previewUrl&&URL.revokeObjectURL(t.previewUrl)}function Ee(e,t,n,r){if(e?.teamId)return{teamId:e.teamId};let i=[...t];n&&!i.some(e=>e.id===n.id)&&i.push(n);let a=i.filter(e=>e.threadId).reverse(),o=a.find(e=>!!r[A(e.threadId,e.channel)])??a[0];return o?.threadId?{threadId:o.threadId,...o.channel?{channel:o.channel}:{}}:null}var Y=r(),De={online:`text-emerald-400`,offline:`text-zinc-400`,shutdown:`text-zinc-400`,restarted:`text-blue-400`,"compaction-requested":`text-zinc-400`,compacting:`text-amber-400`,compacted:`text-amber-400`,"compaction-stalled":`text-red-400`,"clear-requested":`text-zinc-400`,"clearing-context":`text-amber-400`,"context-cleared":`text-amber-400`,"clear-stalled":`text-red-400`,"shutting-down":`text-zinc-400`};function Oe(e){let t=new Date,[n,r,i]=e.split(`-`).map(Number),a=new Date(n,r-1,i);if(e===G(t.getTime()))return`Today`;let o=new Date(t);return o.setDate(o.getDate()-1),e===G(o.getTime())?`Yesterday`:a.toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`,year:a.getFullYear()===t.getFullYear()?void 0:`numeric`})}function ke({event:e}){return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Y.jsx)(l,{className:o(`w-2 h-2 fill-current`,De[e.status]||`text-zinc-400`)}),(0,Y.jsx)(`span`,{children:H[e.status]||e.status}),(0,Y.jsx)(`span`,{className:`text-muted-foreground/60`,children:J(e.timestamp)})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}var Ae={"branch.landed":k,"context.warning":w},je={"branch.landed":`branch landed`,"context.warning":`context warning`};function Me({msg:e}){let t=typeof e.payload?.kind==`string`?e.payload.kind:``,n=Ae[t]??c,r=je[t]??(t||`system signal`);return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-full border border-border bg-muted/30 px-2.5 py-1 text-xs text-muted-foreground`,children:[(0,Y.jsx)(n,{className:`h-3 w-3`}),(0,Y.jsx)(`span`,{children:r}),(0,Y.jsx)(`span`,{className:`text-muted-foreground/60`,children:J(e.occurredAt??e.createdAt)})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}var Ne={"spawned-child":{ready:`spawned`,exited:`spawned · exited`,failed:`spawn failed`},"spawned-by":{ready:`spawned by`,exited:`spawned by`,failed:`spawned by`}},Pe={"spawned-child-ready":i,"spawned-child-exited":D,"spawned-child-failed":b,"spawned-by-ready":n,"spawned-by-exited":n,"spawned-by-failed":n},Fe={"spawned-child-ready":`text-emerald-400`,"spawned-child-exited":`text-zinc-400`,"spawned-child-failed":`text-red-400`,"spawned-by-ready":`text-blue-400`,"spawned-by-exited":`text-blue-400`,"spawned-by-failed":`text-blue-400`};function Ie({entry:e}){let t=M(e=>e.agentsById),n=M(e=>e.openInboxThread),r=M(e=>e.switchView),i=t[e.agentId]||null,a=i?.label??e.agentId,s=`${e.direction}-${e.status}`,l=Ne[e.direction]?.[e.status]??e.direction,u=Pe[s]??c,d=Fe[s]??`text-muted-foreground`,f=e.status===`failed`;function p(){n(e.agentId),r(`chat`)}return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:o(`flex items-center gap-1.5 rounded-full border bg-muted/30 px-2.5 py-1 text-xs`,f?`border-red-500/30`:`border-border`),children:[(0,Y.jsx)(u,{className:o(`h-3 w-3 shrink-0`,d)}),(0,Y.jsx)(`span`,{className:`text-muted-foreground`,children:l}),(0,Y.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded hover:text-foreground text-muted-foreground transition-colors hover:bg-muted/50 px-1`,onClick:p,title:`Open chat for ${a}`,children:[(0,Y.jsx)(ie,{agent:i,className:`w-4 h-4 text-[10px]`}),(0,Y.jsx)(`span`,{className:`max-w-[160px] truncate`,children:a})]}),e.reason&&f&&(0,Y.jsxs)(`span`,{className:`text-red-400/80 max-w-[120px] truncate`,title:e.reason,children:[`— `,e.reason]}),(0,Y.jsx)(`span`,{className:`text-muted-foreground/60 shrink-0`,children:J(e.timestamp)})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function Le({blockedLabel:e,onInterrupt:n}){return e?(0,Y.jsx)(`div`,{className:`flex justify-start mb-3`,children:(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 rounded-2xl rounded-bl-sm bg-card ring-1 ring-red-500/30 px-4 py-2.5`,children:[(0,Y.jsx)(b,{className:`w-3.5 h-3.5 text-red-400`}),(0,Y.jsxs)(`span`,{className:`text-xs text-red-300`,children:[`blocked: `,e]})]})}):(0,Y.jsx)(`div`,{className:`flex justify-start mb-3`,children:(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 rounded-2xl rounded-bl-sm bg-card ring-1 ring-foreground/10 px-4 py-2.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Y.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-yellow-400 animate-[pulse_1.4s_ease-in-out_infinite]`}),(0,Y.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-yellow-400 animate-[pulse_1.4s_ease-in-out_0.2s_infinite]`}),(0,Y.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-yellow-400 animate-[pulse_1.4s_ease-in-out_0.4s_infinite]`})]}),(0,Y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`working`}),n&&(0,Y.jsxs)(`button`,{onClick:n,title:`Interrupt`,className:`ml-1 flex items-center gap-1 rounded-full px-1.5 py-0.5 text-xs text-muted-foreground hover:text-red-300 hover:bg-red-500/10 transition-colors`,children:[(0,Y.jsx)(t,{className:`w-3.5 h-3.5`}),`Stop`]})]})})}var X=`agent-relay:chat-hide-tools`,Z=(()=>{let e=new Set,t=(()=>{try{return window.localStorage.getItem(X)===`on`}catch{return!1}})(),n=()=>e.forEach(e=>e());return typeof window<`u`&&window.addEventListener(`storage`,e=>{e.key===X&&(t=e.newValue===`on`,n())}),{subscribe(t){return e.add(t),()=>e.delete(t)},get:()=>t,toggle(){t=!t;try{window.localStorage.setItem(X,t?`on`:`off`)}catch{}n()}}})();function Re(){return[(0,V.useSyncExternalStore)(Z.subscribe,Z.get,()=>!1),Z.toggle]}function Q({steps:e,showReasoning:t}){let[n,r]=Re(),i=t?e:e.filter(e=>e.kind!==`reasoning`);if(!i.length)return null;let a=i.filter(e=>e.kind===`tool`).length;return(0,Y.jsx)(`div`,{className:`flex justify-start mb-2`,children:(0,Y.jsxs)(`div`,{className:`max-w-[85%] md:max-w-[75%] min-w-0 space-y-1.5`,children:[i.map(e=>e.kind===`narration`?(0,Y.jsx)(B,{text:e.text,className:`text-sm leading-relaxed break-words text-foreground/90 min-w-0`},e.id):e.kind===`reasoning`?(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5 text-xs leading-relaxed text-muted-foreground/80`,children:[(0,Y.jsx)(v,{className:`w-3.5 h-3.5 mt-0.5 shrink-0 opacity-70`}),(0,Y.jsx)(B,{text:e.text,className:`italic break-words min-w-0`})]},e.id):n?null:(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5 text-xs leading-relaxed text-muted-foreground`,children:[(0,Y.jsx)(_,{className:`w-3 h-3 mt-0.5 shrink-0 opacity-70`}),(0,Y.jsxs)(`span`,{className:`min-w-0 break-words`,children:[(0,Y.jsx)(`span`,{className:`font-medium`,children:e.label||`tool`}),e.text?(0,Y.jsxs)(`span`,{className:`opacity-70`,children:[` — `,e.text]}):null]})]},e.id)),a>0&&(0,Y.jsxs)(`button`,{onClick:r,className:`flex items-center gap-1 text-[11px] text-muted-foreground/50 hover:text-muted-foreground transition-colors text-left`,children:[(0,Y.jsx)(S,{className:o(`w-3 h-3 shrink-0 transition-transform`,!n&&`rotate-90`)}),(0,Y.jsx)(`span`,{children:n?`show ${a} tool step${a===1?``:`s`}`:`hide tool steps`})]})]})})}function ze({date:e}){return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-3 py-3 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:Oe(e)}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function Be({timestamp:e}){let t=new Date(e).toLocaleString(void 0,{month:`short`,day:`numeric`,year:`numeric`,hour:`2-digit`,minute:`2-digit`});return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`span`,{className:`text-xs text-muted-foreground/60`,children:[`created `,t]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function Ve({history:e}){let t=e.sourceAgentLabel||e.sourcePeerId,n=e.entries.length;return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-full border border-dashed border-border bg-muted/30 px-2 py-1 text-[11px] text-muted-foreground`,children:[(0,Y.jsx)(u,{className:`h-3 w-3`}),(0,Y.jsxs)(`span`,{children:[`forked history from `,t]}),(0,Y.jsxs)(`span`,{className:`text-muted-foreground/60`,children:[n,` `,n===1?`entry`:`entries`]})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function He({entry:e,sourceLabel:t}){let n=e.message,r=N(n),i=e.originalFrom===L;return(0,Y.jsx)(`div`,{className:o(`flex mb-3 opacity-80`,i?`justify-end`:`justify-start`),children:(0,Y.jsx)(`div`,{className:`max-w-[85%] md:max-w-[75%]`,children:(0,Y.jsxs)(`div`,{className:o(`rounded-2xl border border-dashed px-3.5 py-2 text-sm select-text`,i?`border-primary/25 bg-primary/10 text-foreground rounded-br-sm`:`border-border bg-card/70 rounded-bl-sm`),children:[(0,Y.jsxs)(`div`,{className:o(`mb-1 text-[10px] uppercase tracking-normal`,i?`text-primary/70`:`text-muted-foreground`),children:[`forked history · `,i?`you`:t||e.originalFrom]}),(0,Y.jsx)(B,{text:r,rawBody:n.body,className:`leading-relaxed`}),(0,Y.jsxs)(`p`,{className:o(`mt-1 flex items-center justify-end gap-1.5 text-xs`,i?`text-primary/60`:`text-muted-foreground`),children:[(0,Y.jsxs)(`span`,{className:`opacity-40`,children:[`#`,e.originalMessageId]}),(0,Y.jsx)(`span`,{children:J(e.originalCreatedAt)})]})]})})})}function Ue({scrollRef:e,timeline:t}){let[n,r]=(0,V.useState)(!0),[i,a]=(0,V.useState)(null),[s,c]=(0,V.useState)(null),[l,u]=(0,V.useState)(!0),d=(0,V.useMemo)(()=>{for(let e=t.length-1;e>=0;e--){let n=t[e];if(!(!n||n.type!==`message`)&&n.msg.from===`user`)return{id:n.msg.id,body:N(n.msg)}}return null},[t]);if((0,V.useEffect)(()=>{let t=e.current;if(!d||!t){r(!0);return}let n=t.querySelector(`[data-msg-id="${d.id}"]`);if(!n){r(!0);return}let i=new IntersectionObserver(([e])=>{if(e&&(r(e.isIntersecting),!e.isIntersecting)){let n=e.rootBounds?.top??t.getBoundingClientRect().top;u(e.boundingClientRect.top<n)}},{root:t,threshold:0});i.observe(n);let a=()=>{let e=n.getBoundingClientRect(),r=t.getBoundingClientRect();u(e.top<r.top)};return t.addEventListener(`scroll`,a,{passive:!0}),()=>{i.disconnect(),t.removeEventListener(`scroll`,a)}},[d?.id,e]),n||!d||!d.body.trim())return null;let f=i?.id===d.id?i.value:!1,m=s?.id===d.id?s.value:!1;function h(){let t=e.current;!t||!d||t.querySelector(`[data-msg-id="${d.id}"]`)?.scrollIntoView({behavior:`smooth`,block:`center`})}let _=l?`↑`:`↓`;return m?(0,Y.jsx)(`div`,{className:`sticky top-0 z-10 -mx-3 md:-mx-4 -mt-3 md:-mt-4 bg-background`,children:(0,Y.jsxs)(`button`,{type:`button`,className:`w-full flex items-center justify-center gap-1.5 py-1 text-[11px] text-primary/60 hover:text-primary border-b border-primary/10 transition-colors`,onClick:()=>c({id:d.id,value:!1}),children:[(0,Y.jsx)(`span`,{children:`Your prompt`}),(0,Y.jsx)(g,{className:`w-3 h-3`})]})}):(0,Y.jsxs)(`div`,{className:`sticky top-0 z-10 -mx-3 md:-mx-4 -mt-3 md:-mt-4 px-2 md:px-3 pt-2 pb-1.5 bg-background border-b border-primary/10`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] text-muted-foreground mb-0.5`,children:[(0,Y.jsx)(`span`,{className:`font-medium text-primary/70`,children:`Your prompt`}),(0,Y.jsxs)(`button`,{type:`button`,className:`ml-auto hover:text-foreground transition-colors`,onClick:h,children:[_,` scroll to original`]}),(0,Y.jsx)(`button`,{type:`button`,className:`hover:text-foreground transition-colors`,onClick:()=>c({id:d.id,value:!0}),title:`Minimize`,children:(0,Y.jsx)(p,{className:`w-3 h-3`})})]}),(0,Y.jsx)(`p`,{className:o(`text-sm text-foreground leading-snug cursor-pointer`,!f&&`line-clamp-2`),onClick:()=>a({id:d.id,value:!f}),children:d.body})]})}function We(){return(0,V.useSyncExternalStore)(e=>j.subscribe(e),()=>j.getPlayingKey(),()=>null)}function Ge({attachment:e,outbound:t}){let n=e.kind===`image`,r=e.title||e.artifactId,[i,c]=(0,V.useState)(null),[l,u]=(0,V.useState)(null),[f,p]=(0,V.useState)(!1),[m,h]=(0,V.useState)(!1);(0,V.useEffect)(()=>{let t=!1,n=null;async function r(){p(!0),u(null),c(null);try{let r=await a(`/artifacts/${encodeURIComponent(e.artifactId)}/content`);if(t)return;n=URL.createObjectURL(r),c(n)}catch(e){t||u(e.message)}finally{t||p(!1)}}return r(),()=>{t=!0,n&&URL.revokeObjectURL(n)}},[e.artifactId]);function g(){if(!i)return;let e=document.createElement(`a`);e.href=i,e.download=r,document.body.appendChild(e),e.click(),e.remove()}return n?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`button`,{type:`button`,onClick:()=>i&&h(!0),disabled:!i,className:`group/img mt-2 block overflow-hidden rounded-md border border-foreground/10 bg-black/10 text-left disabled:cursor-default relative`,children:i?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`img`,{src:i,alt:r,loading:`lazy`,className:`block max-h-72 max-w-full object-contain`}),(0,Y.jsx)(`span`,{className:`absolute inset-0 flex items-center justify-center bg-black/0 group-hover/img:bg-black/30 transition-colors`,children:(0,Y.jsx)(E,{className:`w-6 h-6 text-white opacity-0 group-hover/img:opacity-100 transition-opacity drop-shadow-md`})})]}):(0,Y.jsxs)(`span`,{className:o(`flex min-h-20 items-center gap-2 px-3 py-2 text-xs`,l?`text-red-400`:`text-muted-foreground`),children:[f?(0,Y.jsx)(C,{className:`h-4 w-4 animate-spin`}):(0,Y.jsx)(b,{className:`h-4 w-4`}),l||`Loading image`]})}),i&&(0,Y.jsx)(ne,{open:m,onOpenChange:h,children:(0,Y.jsxs)(te,{className:`max-w-[95vw] max-h-[95vh] w-auto p-0 bg-black/95 border-zinc-800 gap-0 overflow-hidden`,showCloseButton:!1,children:[(0,Y.jsx)(re,{className:`sr-only`,children:r}),(0,Y.jsxs)(`div`,{className:`relative flex items-center justify-center min-h-[200px]`,children:[(0,Y.jsx)(`img`,{src:i,alt:r,className:`max-w-[93vw] max-h-[90vh] object-contain`}),(0,Y.jsxs)(`div`,{className:`absolute top-2 right-2 flex gap-1`,children:[(0,Y.jsx)(`button`,{type:`button`,onClick:g,className:`rounded-md bg-black/60 hover:bg-black/80 p-2 text-white transition-colors`,title:`Download`,children:(0,Y.jsx)(d,{className:`w-4 h-4`})}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>h(!1),className:`rounded-md bg-black/60 hover:bg-black/80 p-2 text-white transition-colors`,title:`Close`,children:(0,Y.jsx)(y,{className:`w-4 h-4`})})]})]})]})})]}):(0,Y.jsxs)(`button`,{type:`button`,onClick:g,disabled:!i,className:o(`mt-2 flex w-full items-center gap-2 rounded-md border px-2.5 py-2 text-left text-xs transition-colors disabled:cursor-default disabled:opacity-70`,t?`border-primary-foreground/20 bg-primary-foreground/10 hover:bg-primary-foreground/15`:`border-border bg-background hover:bg-muted`),children:[f?(0,Y.jsx)(C,{className:`h-4 w-4 shrink-0 animate-spin`}):l?(0,Y.jsx)(b,{className:`h-4 w-4 shrink-0 text-red-400`}):(0,Y.jsx)(s,{className:`h-4 w-4 shrink-0`}),(0,Y.jsx)(`span`,{className:o(`min-w-0 flex-1 truncate`,l&&`text-red-400`),children:l||r}),(0,Y.jsx)(d,{className:`h-3.5 w-3.5 shrink-0`})]})}function $({open:e,onToggle:t,onReact:n}){return(0,Y.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,Y.jsx)(`button`,{type:`button`,title:`Add reaction`,onClick:t,className:o(`inline-flex h-5 w-6 items-center justify-center rounded-full border border-border bg-popover text-muted-foreground shadow-sm transition hover:bg-muted hover:text-foreground`,e?`opacity-100`:`opacity-0 pointer-events-none md:group-hover/msg:opacity-100 md:group-hover/msg:pointer-events-auto`),children:(0,Y.jsx)(m,{className:`h-3 w-3`})}),e&&(0,Y.jsx)(`div`,{className:`absolute bottom-full left-0 z-30 mb-1 flex gap-0.5 rounded-full border border-border bg-popover p-0.5 shadow-md`,children:be.map(e=>(0,Y.jsx)(`button`,{type:`button`,title:`React ${e}`,onClick:()=>n(e),className:`inline-flex h-6 w-7 items-center justify-center rounded-full text-xs transition-colors hover:bg-muted`,children:e},e))})]})}var Ke=(0,V.memo)(function({msg:e,peer:n,onOpenReferencedPath:r,onPreviewReferencedPath:i,onPreviewReferencedPathEnd:a}){let s=e.from!==`user`&&e.to!==`user`,c=s?e.from===n:e.from===L,l=s?c?`→ ${e.to}`:`from ${e.from}`:null,u=M(e=>e.reactToMessage),d=M(e=>e.voiceTtsEnabled),f=We(),p=M(e=>{let t=e.agentsById[n]?.meta?.cwd;return typeof t==`string`?t:``}),[m,g]=(0,V.useState)(!1),_=(0,V.useRef)(null),v=(0,V.useRef)(null),y=(0,V.useRef)(!1),b=N(e),x=J(e.occurredAt??e.createdAt),S=ye(e),C=xe(e),w=c?Se(e,n):null,T=w?.icon,E=f===String(e.id),D=d&&!c&&!s&&!q(e)&&b.trim().length>0;function O(t){t.stopPropagation(),E?j.bargeIn():j.speak(e.body,String(e.id))}(0,V.useEffect)(()=>{if(!m)return;function e(e){K()||_.current&&!_.current.contains(e.target)&&g(!1)}return document.addEventListener(`mousedown`,e),document.addEventListener(`touchstart`,e),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`touchstart`,e)}},[m]);function k(e){return he(p||`/`,e)}function A(e,t){let n=k(e);r?.(n,t)}function P(e,t,n){let r=k(e);i?.(r,t,n)}function F(t){u(e,t),g(!1)}function I(e){e.button===0&&(v.current={x:e.clientX,y:e.clientY},y.current=!1)}function R(e){let t=v.current;t&&(Math.abs(e.clientX-t.x)>3||Math.abs(e.clientY-t.y)>3)&&(y.current=!0)}function z(t){if(!(q(e)||c||s)&&!t.target.closest(`a,button,input,textarea,select,[role="button"]`)){if(y.current||K()){y.current=!1;return}g(e=>!e)}}return(0,Y.jsx)(`div`,{"data-msg-id":e.id,className:o(`group/msg flex mb-3`,c?`justify-end`:`justify-start`),children:(0,Y.jsxs)(`div`,{ref:_,className:`relative max-w-[85%] md:max-w-[75%]`,children:[D&&(0,Y.jsx)(`button`,{type:`button`,title:E?`Stop playback`:`Play aloud`,onClick:O,className:o(`absolute -top-2 -right-2 z-20 inline-flex h-6 w-6 items-center justify-center rounded-full border bg-popover shadow-sm transition`,E?`border-primary/50 text-primary opacity-100`:`border-border text-muted-foreground opacity-70 hover:bg-muted hover:text-foreground hover:opacity-100 [@media(hover:hover)]:md:opacity-0 [@media(hover:hover)]:md:group-hover/msg:opacity-100`),children:E?(0,Y.jsx)(t,{className:`h-3.5 w-3.5 animate-pulse`}):(0,Y.jsx)(h,{className:`h-3.5 w-3.5`})}),(0,Y.jsxs)(`div`,{className:o(`rounded-2xl px-3.5 py-2 text-sm select-text`,!c&&!q(e)&&!s&&`cursor-pointer`,c?`bg-primary text-primary-foreground rounded-br-sm`:`bg-card ring-1 ring-foreground/10 rounded-bl-sm`),onPointerDown:I,onPointerMove:R,onClick:z,children:[l&&(0,Y.jsx)(`p`,{className:o(`text-xs font-medium mb-1 opacity-60`,c?`text-primary-foreground`:`text-muted-foreground`),children:l}),e.subject&&(0,Y.jsx)(`p`,{className:o(`text-xs font-semibold mb-1`,c?`text-primary-foreground/70`:`text-muted-foreground`),children:e.subject}),(0,Y.jsx)(B,{text:b,rawBody:e.body,className:`leading-relaxed`,onOpenPath:A,onPreviewPath:P,onPreviewPathEnd:a,resolvePathTitle:(e,t)=>`${k(e)}${t?`:${t}`:``}`}),S.map(t=>(0,Y.jsx)(Ge,{attachment:t,outbound:c},`${e.id}-${t.artifactId}-${t.role||``}`)),(0,Y.jsxs)(`p`,{className:o(`text-xs mt-1 flex items-center gap-1.5`,c?`justify-end text-primary-foreground/60`:`justify-end text-muted-foreground`),children:[(0,Y.jsxs)(`span`,{className:`opacity-40`,children:[`#`,e.id]}),(0,Y.jsx)(`span`,{children:x}),w&&T&&(0,Y.jsxs)(`span`,{className:o(`inline-flex items-center gap-1`,w.tone===`ok`&&`text-emerald-300`,w.tone===`warn`&&`text-amber-200`,w.tone===`danger`&&`text-red-200`),title:w.title,children:[(0,Y.jsx)(T,{className:`h-3 w-3`}),w.label]})]})]}),!q(e)&&C.length>0&&(0,Y.jsxs)(`div`,{className:o(`flex flex-wrap items-center gap-0.5 -mt-1 relative z-10`,c?`justify-end pr-2`:`justify-start pl-2`),children:[!c&&(0,Y.jsx)($,{open:m,onToggle:()=>g(e=>!e),onReact:F}),C.map(e=>(0,Y.jsxs)(`button`,{type:`button`,title:e.actors.join(`, `),onClick:()=>F(e.emoji),className:o(`inline-flex h-5 items-center gap-0.5 rounded-full border px-1.5 text-[11px] shadow-sm transition-colors`,e.mine?`border-primary/40 bg-primary/10 text-primary`:`border-border bg-background hover:bg-muted text-foreground`),children:[(0,Y.jsx)(`span`,{children:e.emoji}),e.count>1&&(0,Y.jsx)(`span`,{children:e.count})]},e.emoji))]}),!q(e)&&!c&&C.length===0&&(0,Y.jsx)(`div`,{className:`absolute -bottom-2.5 left-1 z-20`,children:(0,Y.jsx)($,{open:m,onToggle:()=>g(e=>!e),onReact:F})})]})})});export{ve as _,Be as a,He as c,Ue as d,me as f,Te as g,Ee as h,Le as i,Me as l,ge as m,Q as n,ze as o,_e as p,Ie as r,Ve as s,Ke as t,ke as u,we as v,fe as y};
2
- //# sourceMappingURL=MessageBubble-vzupFQD8.js.map
1
+ import{r as e}from"./chunk-CilyBKbf.js";import{$t as t,Dn as n,Ht as r,In as i,Jn as a,L as o,Mt as s,P as c,Pn as l,Rn as u,St as d,Xt as f,_n as p,an as m,c as h,dn as g,en as _,h as v,i as y,it as b,ln as x,on as S,p as C,r as w,sn as T,st as E,un as D,xt as O,y as k}from"./lucide-react-L2UxFDic.js";import{n as A,p as j,t as M}from"./store-B8xP6z6T.js";import{D as N,I as P,M as F,W as I,at as L,j as R,w as z,z as ee}from"./display-DzNvOu1j.js";import{a as te,i as ne,o as re,t as B,x as ie}from"./index-BwfVOzUG.js";var V=e(a(),1),H={online:`came online`,offline:`went offline`,shutdown:`shut down`,restarted:`restarted`,"compaction-requested":`compaction requested`,compacting:`compaction started`,compacted:`context compacted`,"compaction-stalled":`compaction stalled — may need manual intervention`,"clear-requested":`clear requested`,"clearing-context":`clear started`,"context-cleared":`context cleared`,"clear-stalled":`context clear stalled — may need manual intervention`,"shutting-down":`shutting down`},ae=new Set(Object.keys(H)),oe=3e3;function U(e){return new Date(e.occurredAt??e.createdAt).getTime()}function se(e){if(e.kind!==`session`)return null;let t=e.payload?.session;return!t||t.type!==`narration`&&t.type!==`reasoning`&&t.type!==`tool`?null:{id:e.id,kind:t.type,label:typeof t.label==`string`?t.label:void 0,text:e.body,ts:U(e),turnId:typeof t.turnId==`string`?t.turnId:void 0}}function ce(e){if(e.kind!==`session`)return null;let t=e.payload?.session;if(t?.type!==`notice`)return null;let n=typeof t.label==`string`&&t.label?t.label:`compacted`;return{id:`notice-${e.id}`,status:n,timestamp:U(e)}}function W(e,t){let n=e.trim();for(let e of t){let t=e.trim();if(t){if(n===t)break;n.startsWith(`${t}\n\n`)&&(n=n.slice(t.length+2).trimStart())}}return n.trim()||e.trim()}function le(e){return e.kind===`system`&&e.from===`system`}var ue=new Set([`agent.ready`,`agent.exited`,`agent.spawn_failed`]);function G(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function de(e){let t=e.filter(e=>ae.has(e.status)).slice().sort((e,t)=>e.timestamp-t.timestamp),n=[];for(let e of t)n.some(t=>t.id===e.id)||n.some(t=>t.status===e.status&&Math.abs(t.timestamp-e.timestamp)<=oe)||n.push(e);return n}function fe(e,t,n,r=[],i){let a=[];for(let e of r){let t=e.entries.reduce((e,t)=>Math.min(e,I(t.originalCreatedAt)),1/0),n=Number.isFinite(t)?t-1:e.importedAt;a.push({ts:n,entry:{type:`import-boundary`,history:e,timestamp:n}});for(let t of e.entries)a.push({ts:I(t.originalCreatedAt),entry:{type:`imported-message`,history:e,entry:t}})}if(n){let e=new Date(n).getTime();Number.isFinite(e)&&a.push({ts:e,entry:{type:`created`,timestamp:e}})}if(i?.spawnedBy){let e=n?new Date(n).getTime():0,t=Number.isFinite(e)?e:0;a.push({ts:t,entry:{type:`agent-action`,direction:`spawned-by`,agentId:i.spawnedBy.agentId,provider:i.spawnedBy.provider,status:`ready`,timestamp:t}})}let o=new Map,s=new Map,c=new Map;for(let t of e){if(t.kind!==`session`)continue;let e=t.payload?.session;if(e?.type===`narration`&&typeof e.turnId==`string`){let n=s.get(e.turnId)??[];n.push({id:t.id,body:t.body.trim()}),s.set(e.turnId,n)}else if(e?.type===`response`&&typeof e.turnId==`string`){let n=o.get(e.turnId)??[];n.push(t.body.trim()),o.set(e.turnId,n)}}let l=new Map;for(let[e,t]of o){let n=(s.get(e)??[]).map(e=>e.body);l.set(e,t.map(e=>W(e,n)))}for(let t of e){if(t.kind!==`session`)continue;let e=t.payload?.session;if(e?.type!==`response`||typeof e.turnId!=`string`)continue;let n=W(t.body,(s.get(e.turnId)??[]).map(e=>e.body));n&&n!==t.body&&c.set(t.id,n)}let u=new Set;for(let[e,t]of l){let n=s.get(e)??[];for(let e of t)for(let t=n.length-1;t>=0;t--){let r=n[t];if(!u.has(r.id)&&ee(e,r.body)){u.add(r.id);break}}}let d=new Map,f=[];for(let t of e){if(le(t)){let e=typeof t.payload?.kind==`string`?t.payload.kind:``;if(ue.has(e)){let n=t.payload,r=typeof n.agentId==`string`?n.agentId:``,i=U(t);if(!r){a.push({ts:i,entry:{type:`notice`,msg:t}});continue}let o=e===`agent.ready`?`ready`:e===`agent.exited`?`exited`:`failed`,s=d.get(r);if(s)s.entry.status=o,typeof n.reason==`string`&&(s.entry.reason=n.reason),s.entry.timestamp=i,s.ts=i;else{let e={ts:i,entry:{type:`agent-action`,direction:`spawned-child`,agentId:r,provider:typeof n.provider==`string`?n.provider:void 0,status:o,reason:typeof n.reason==`string`?n.reason:void 0,timestamp:i}};d.set(r,e),a.push(e)}continue}a.push({ts:U(t),entry:{type:`notice`,msg:t}});continue}let e=ce(t);if(e){f.push(e);continue}let n=se(t);if(n){if(n.kind===`narration`&&u.has(n.id))continue;a.push({ts:n.ts,entry:{type:`activity`,steps:[n],timestamp:n.ts}});continue}if(t.kind===`session`){let e=t.payload?.session;if(e?.type===`response`&&typeof e.turnId==`string`){let e=c.get(t.id);if(e&&e!==t.body){a.push({ts:U(t),entry:{type:`message`,msg:{...t,body:e}}});continue}}}a.push({ts:U(t),entry:{type:`message`,msg:t}})}for(let e of de([...t,...f]))a.push({ts:e.timestamp,entry:{type:`status`,event:e}});let p={created:0,date:1,"import-boundary":2,"imported-message":3,message:4,activity:4,notice:4,"agent-action":4,status:5};a.sort((e,t)=>{let n=e.ts-t.ts;return Math.abs(n)<3e3&&p[e.entry.type]-p[t.entry.type]||n});let m=[],h=``;for(let{ts:e,entry:t}of a){if(t.type===`created`){m.push(t);continue}let n=G(e);if(n!==h&&(m.push({type:`date`,date:n,timestamp:e}),h=n),t.type===`activity`){let e=m[m.length-1];if(e&&e.type===`activity`&&pe(e,t)){e.steps.push(...t.steps);continue}}m.push(t)}return m}function pe(e,t){let n=e.steps[e.steps.length-1]?.turnId,r=t.steps[0]?.turnId;return n&&r?n===r:!n&&!r}function me(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function he(e,t){if(t.startsWith(`/`))return t;let n=`${e.replace(/\/+$/,``)}/${t}`.split(`/`),r=[];for(let e of n)!e||e===`.`||(e===`..`?r.pop():r.push(e));return`/`+r.join(`/`)}function ge(e){let t=e.replace(/\/+$/,``),n=t.lastIndexOf(`/`);return n>0?t.slice(0,n):`/`}function _e(e,t){return e.filter(e=>e.status===`online`&&P(t,e.baseDir)).sort((e,t)=>R(t.baseDir).length-R(e.baseDir).length)[0]||e.find(e=>e.status===`online`)}function ve(){return typeof window<`u`&&window.matchMedia(`(min-width: 1280px)`).matches}function K(){return typeof window<`u`&&!!window.getSelection()?.toString()}function ye(e){let t=e.payload?.attachments;return Array.isArray(t)?t.filter(e=>!!(e&&typeof e==`object`&&typeof e.artifactId==`string`)):[]}var be=[`👍`,`❤️`,`✅`,`👀`];function xe(e){let t=new Map;for(let n of e.reactions||[]){let e=F(n.emoji),r=t.get(e)??{emoji:e,count:0,mine:!1,actors:[]};r.count+=1,r.mine=r.mine||n.actorId===`user`,r.actors.push(n.actorId),t.set(e,r)}return[...t.values()].sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))}function q(e){return z(e)}function Se(e,t){let n=e.readBy||[],r=e.resolvedToAgent||t||e.to,i=r?n.includes(r):!1,a=n.some(e=>e!==L);if(i||a){let e=i?r:n.find(e=>e!==L);return{label:`read`,title:e?`Read by ${e}`:`Read by agent`,tone:`ok`,icon:g}}if(e.deliveryStatus===`delivered`)return{label:`delivered`,title:`Delivered to agent inbox`,tone:`ok`,icon:g};if(e.deliveryStatus===`queued`)return{label:`queued`,title:`Queued until the target agent is available`,tone:`warn`,icon:f};if(e.deliveryStatus===`failed`||e.deliveryStatus===`dead`){let t=e.deliveryPoisonReason||e.deliveryLastError||e.deliveryStatus;return{label:e.deliveryStatus,title:t,tone:`danger`,icon:m}}return{label:`sent`,title:`Accepted by Relay`,tone:`muted`,icon:D}}function Ce(e){let t=I(e.createdAt);return(e.reactions||[]).reduce((e,t)=>Math.max(e,I(t.updatedAt||t.createdAt)),t)}function we(e){return e?e.messages.reduce((e,t)=>Math.max(e,Ce(t)),0):0}function J(e){return new Date(e).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}function Te(e){for(let t of e)t.previewUrl&&URL.revokeObjectURL(t.previewUrl)}function Ee(e,t,n,r){if(e?.teamId)return{teamId:e.teamId};let i=[...t];n&&!i.some(e=>e.id===n.id)&&i.push(n);let a=i.filter(e=>e.threadId).reverse(),o=a.find(e=>!!r[A(e.threadId,e.channel)])??a[0];return o?.threadId?{threadId:o.threadId,...o.channel?{channel:o.channel}:{}}:null}var Y=i(),De={online:`text-emerald-400`,offline:`text-zinc-400`,shutdown:`text-zinc-400`,restarted:`text-blue-400`,"compaction-requested":`text-zinc-400`,compacting:`text-amber-400`,compacted:`text-amber-400`,"compaction-stalled":`text-red-400`,"clear-requested":`text-zinc-400`,"clearing-context":`text-amber-400`,"context-cleared":`text-amber-400`,"clear-stalled":`text-red-400`,"shutting-down":`text-zinc-400`};function Oe(e){let t=new Date,[n,r,i]=e.split(`-`).map(Number),a=new Date(n,r-1,i);if(e===G(t.getTime()))return`Today`;let o=new Date(t);return o.setDate(o.getDate()-1),e===G(o.getTime())?`Yesterday`:a.toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`,year:a.getFullYear()===t.getFullYear()?void 0:`numeric`})}function ke({event:e}){return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Y.jsx)(t,{className:l(`w-2 h-2 fill-current`,De[e.status]||`text-zinc-400`)}),(0,Y.jsx)(`span`,{children:H[e.status]||e.status}),(0,Y.jsx)(`span`,{className:`text-muted-foreground/60`,children:J(e.timestamp)})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}var Ae={"branch.landed":O,"context.warning":C},je={"branch.landed":`branch landed`,"context.warning":`context warning`};function Me({msg:e}){let t=typeof e.payload?.kind==`string`?e.payload.kind:``,n=Ae[t]??c,r=je[t]??(t||`system signal`);return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-full border border-border bg-muted/30 px-2.5 py-1 text-xs text-muted-foreground`,children:[(0,Y.jsx)(n,{className:`h-3 w-3`}),(0,Y.jsx)(`span`,{children:r}),(0,Y.jsx)(`span`,{className:`text-muted-foreground/60`,children:J(e.occurredAt??e.createdAt)})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}var Ne={"spawned-child":{ready:`spawned`,exited:`spawned · exited`,failed:`spawn failed`},"spawned-by":{ready:`spawned by`,exited:`spawned by`,failed:`spawned by`}},Pe={"spawned-child-ready":o,"spawned-child-exited":b,"spawned-child-failed":m,"spawned-by-ready":n,"spawned-by-exited":n,"spawned-by-failed":n},Fe={"spawned-child-ready":`text-emerald-400`,"spawned-child-exited":`text-zinc-400`,"spawned-child-failed":`text-red-400`,"spawned-by-ready":`text-blue-400`,"spawned-by-exited":`text-blue-400`,"spawned-by-failed":`text-blue-400`};function Ie({entry:e}){let t=M(e=>e.agentsById),n=M(e=>e.openInboxThread),r=M(e=>e.switchView),i=t[e.agentId]||null,a=i?.label??e.agentId,o=`${e.direction}-${e.status}`,s=Ne[e.direction]?.[e.status]??e.direction,u=Pe[o]??c,d=Fe[o]??`text-muted-foreground`,f=e.status===`failed`;function p(){n(e.agentId),r(`chat`)}return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:l(`flex items-center gap-1.5 rounded-full border bg-muted/30 px-2.5 py-1 text-xs`,f?`border-red-500/30`:`border-border`),children:[(0,Y.jsx)(u,{className:l(`h-3 w-3 shrink-0`,d)}),(0,Y.jsx)(`span`,{className:`text-muted-foreground`,children:s}),(0,Y.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded hover:text-foreground text-muted-foreground transition-colors hover:bg-muted/50 px-1`,onClick:p,title:`Open chat for ${a}`,children:[(0,Y.jsx)(ie,{agent:i,className:`w-4 h-4 text-[10px]`}),(0,Y.jsx)(`span`,{className:`max-w-[160px] truncate`,children:a})]}),e.reason&&f&&(0,Y.jsxs)(`span`,{className:`text-red-400/80 max-w-[120px] truncate`,title:e.reason,children:[`— `,e.reason]}),(0,Y.jsx)(`span`,{className:`text-muted-foreground/60 shrink-0`,children:J(e.timestamp)})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function Le({blockedLabel:e,onInterrupt:t}){return e?(0,Y.jsx)(`div`,{className:`flex justify-start mb-3`,children:(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 rounded-2xl rounded-bl-sm bg-card ring-1 ring-red-500/30 px-4 py-2.5`,children:[(0,Y.jsx)(m,{className:`w-3.5 h-3.5 text-red-400`}),(0,Y.jsxs)(`span`,{className:`text-xs text-red-300`,children:[`blocked: `,e]})]})}):(0,Y.jsx)(`div`,{className:`flex justify-start mb-3`,children:(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 rounded-2xl rounded-bl-sm bg-card ring-1 ring-foreground/10 px-4 py-2.5`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Y.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-yellow-400 animate-[pulse_1.4s_ease-in-out_infinite]`}),(0,Y.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-yellow-400 animate-[pulse_1.4s_ease-in-out_0.2s_infinite]`}),(0,Y.jsx)(`span`,{className:`w-1.5 h-1.5 rounded-full bg-yellow-400 animate-[pulse_1.4s_ease-in-out_0.4s_infinite]`})]}),(0,Y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`working`}),t&&(0,Y.jsxs)(`button`,{onClick:t,title:`Interrupt`,className:`ml-1 flex items-center gap-1 rounded-full px-1.5 py-0.5 text-xs text-muted-foreground hover:text-red-300 hover:bg-red-500/10 transition-colors`,children:[(0,Y.jsx)(_,{className:`w-3.5 h-3.5`}),`Stop`]})]})})}var X=`agent-relay:chat-hide-tools`,Z=(()=>{let e=new Set,t=(()=>{try{return window.localStorage.getItem(X)===`on`}catch{return!1}})(),n=()=>e.forEach(e=>e());return typeof window<`u`&&window.addEventListener(`storage`,e=>{e.key===X&&(t=e.newValue===`on`,n())}),{subscribe(t){return e.add(t),()=>e.delete(t)},get:()=>t,toggle(){t=!t;try{window.localStorage.setItem(X,t?`on`:`off`)}catch{}n()}}})();function Re(){return[(0,V.useSyncExternalStore)(Z.subscribe,Z.get,()=>!1),Z.toggle]}function Q({steps:e,showReasoning:t}){let[n,r]=Re(),i=t?e:e.filter(e=>e.kind!==`reasoning`);if(!i.length)return null;let a=i.filter(e=>e.kind===`tool`).length;return(0,Y.jsx)(`div`,{className:`flex justify-start mb-2`,children:(0,Y.jsxs)(`div`,{className:`max-w-[85%] md:max-w-[75%] min-w-0 space-y-1.5`,children:[i.map(e=>e.kind===`narration`?(0,Y.jsx)(B,{text:e.text,className:`text-sm leading-relaxed break-words text-foreground/90 min-w-0`},e.id):e.kind===`reasoning`?(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5 text-xs leading-relaxed text-muted-foreground/80`,children:[(0,Y.jsx)(p,{className:`w-3.5 h-3.5 mt-0.5 shrink-0 opacity-70`}),(0,Y.jsx)(B,{text:e.text,className:`italic break-words min-w-0`})]},e.id):n?null:(0,Y.jsxs)(`div`,{className:`flex items-start gap-1.5 text-xs leading-relaxed text-muted-foreground`,children:[(0,Y.jsx)(v,{className:`w-3 h-3 mt-0.5 shrink-0 opacity-70`}),(0,Y.jsxs)(`span`,{className:`min-w-0 break-words`,children:[(0,Y.jsx)(`span`,{className:`font-medium`,children:e.label||`tool`}),e.text?(0,Y.jsxs)(`span`,{className:`opacity-70`,children:[` — `,e.text]}):null]})]},e.id)),a>0&&(0,Y.jsxs)(`button`,{onClick:r,className:`flex items-center gap-1 text-[11px] text-muted-foreground/50 hover:text-muted-foreground transition-colors text-left`,children:[(0,Y.jsx)(T,{className:l(`w-3 h-3 shrink-0 transition-transform`,!n&&`rotate-90`)}),(0,Y.jsx)(`span`,{children:n?`show ${a} tool step${a===1?``:`s`}`:`hide tool steps`})]})]})})}function ze({date:e}){return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-3 py-3 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:Oe(e)}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function Be({timestamp:e}){let t=new Date(e).toLocaleString(void 0,{month:`short`,day:`numeric`,year:`numeric`,hour:`2-digit`,minute:`2-digit`});return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`span`,{className:`text-xs text-muted-foreground/60`,children:[`created `,t]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function Ve({history:e}){let t=e.sourceAgentLabel||e.sourcePeerId,n=e.entries.length;return(0,Y.jsxs)(`div`,{className:`flex items-center justify-center gap-2 py-2 my-1`,children:[(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`}),(0,Y.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-full border border-dashed border-border bg-muted/30 px-2 py-1 text-[11px] text-muted-foreground`,children:[(0,Y.jsx)(d,{className:`h-3 w-3`}),(0,Y.jsxs)(`span`,{children:[`forked history from `,t]}),(0,Y.jsxs)(`span`,{className:`text-muted-foreground/60`,children:[n,` `,n===1?`entry`:`entries`]})]}),(0,Y.jsx)(`div`,{className:`h-px flex-1 bg-border`})]})}function He({entry:e,sourceLabel:t}){let n=e.message,r=N(n),i=e.originalFrom===L;return(0,Y.jsx)(`div`,{className:l(`flex mb-3 opacity-80`,i?`justify-end`:`justify-start`),children:(0,Y.jsx)(`div`,{className:`max-w-[85%] md:max-w-[75%]`,children:(0,Y.jsxs)(`div`,{className:l(`rounded-2xl border border-dashed px-3.5 py-2 text-sm select-text`,i?`border-primary/25 bg-primary/10 text-foreground rounded-br-sm`:`border-border bg-card/70 rounded-bl-sm`),children:[(0,Y.jsxs)(`div`,{className:l(`mb-1 text-[10px] uppercase tracking-normal`,i?`text-primary/70`:`text-muted-foreground`),children:[`forked history · `,i?`you`:t||e.originalFrom]}),(0,Y.jsx)(B,{text:r,rawBody:n.body,className:`leading-relaxed`}),(0,Y.jsxs)(`p`,{className:l(`mt-1 flex items-center justify-end gap-1.5 text-xs`,i?`text-primary/60`:`text-muted-foreground`),children:[(0,Y.jsxs)(`span`,{className:`opacity-40`,children:[`#`,e.originalMessageId]}),(0,Y.jsx)(`span`,{children:J(e.originalCreatedAt)})]})]})})})}function Ue({scrollRef:e,timeline:t}){let[n,r]=(0,V.useState)(!0),[i,a]=(0,V.useState)(null),[o,s]=(0,V.useState)(null),[c,u]=(0,V.useState)(!0),d=(0,V.useMemo)(()=>{for(let e=t.length-1;e>=0;e--){let n=t[e];if(!(!n||n.type!==`message`)&&n.msg.from===`user`)return{id:n.msg.id,body:N(n.msg)}}return null},[t]);if((0,V.useEffect)(()=>{let t=e.current;if(!d||!t){r(!0);return}let n=t.querySelector(`[data-msg-id="${d.id}"]`);if(!n){r(!0);return}let i=new IntersectionObserver(([e])=>{if(e&&(r(e.isIntersecting),!e.isIntersecting)){let n=e.rootBounds?.top??t.getBoundingClientRect().top;u(e.boundingClientRect.top<n)}},{root:t,threshold:0});i.observe(n);let a=()=>{let e=n.getBoundingClientRect(),r=t.getBoundingClientRect();u(e.top<r.top)};return t.addEventListener(`scroll`,a,{passive:!0}),()=>{i.disconnect(),t.removeEventListener(`scroll`,a)}},[d?.id,e]),n||!d||!d.body.trim())return null;let f=i?.id===d.id?i.value:!1,p=o?.id===d.id?o.value:!1;function m(){let t=e.current;!t||!d||t.querySelector(`[data-msg-id="${d.id}"]`)?.scrollIntoView({behavior:`smooth`,block:`center`})}let h=c?`↑`:`↓`;return p?(0,Y.jsx)(`div`,{className:`sticky top-0 z-10 -mx-3 md:-mx-4 -mt-3 md:-mt-4 bg-background`,children:(0,Y.jsxs)(`button`,{type:`button`,className:`w-full flex items-center justify-center gap-1.5 py-1 text-[11px] text-primary/60 hover:text-primary border-b border-primary/10 transition-colors`,onClick:()=>s({id:d.id,value:!1}),children:[(0,Y.jsx)(`span`,{children:`Your prompt`}),(0,Y.jsx)(x,{className:`w-3 h-3`})]})}):(0,Y.jsxs)(`div`,{className:`sticky top-0 z-10 -mx-3 md:-mx-4 -mt-3 md:-mt-4 px-2 md:px-3 pt-2 pb-1.5 bg-background border-b border-primary/10`,children:[(0,Y.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] text-muted-foreground mb-0.5`,children:[(0,Y.jsx)(`span`,{className:`font-medium text-primary/70`,children:`Your prompt`}),(0,Y.jsxs)(`button`,{type:`button`,className:`ml-auto hover:text-foreground transition-colors`,onClick:m,children:[h,` scroll to original`]}),(0,Y.jsx)(`button`,{type:`button`,className:`hover:text-foreground transition-colors`,onClick:()=>s({id:d.id,value:!0}),title:`Minimize`,children:(0,Y.jsx)(S,{className:`w-3 h-3`})})]}),(0,Y.jsx)(`p`,{className:l(`text-sm text-foreground leading-snug cursor-pointer`,!f&&`line-clamp-2`),onClick:()=>a({id:d.id,value:!f}),children:d.body})]})}function We(){return(0,V.useSyncExternalStore)(e=>j.subscribe(e),()=>j.getPlayingKey(),()=>null)}function Ge({attachment:e,outbound:t}){let n=e.kind===`image`,i=e.title||e.artifactId,[a,o]=(0,V.useState)(null),[c,d]=(0,V.useState)(null),[f,p]=(0,V.useState)(!1),[h,g]=(0,V.useState)(!1);(0,V.useEffect)(()=>{let t=!1,n=null;async function r(){p(!0),d(null),o(null);try{let r=await u(`/artifacts/${encodeURIComponent(e.artifactId)}/content`);if(t)return;n=URL.createObjectURL(r),o(n)}catch(e){t||d(e.message)}finally{t||p(!1)}}return r(),()=>{t=!0,n&&URL.revokeObjectURL(n)}},[e.artifactId]);function _(){if(!a)return;let e=document.createElement(`a`);e.href=a,e.download=i,document.body.appendChild(e),e.click(),e.remove()}return n?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`button`,{type:`button`,onClick:()=>a&&g(!0),disabled:!a,className:`group/img mt-2 block overflow-hidden rounded-md border border-foreground/10 bg-black/10 text-left disabled:cursor-default relative`,children:a?(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`img`,{src:a,alt:i,loading:`lazy`,className:`block max-h-72 max-w-full object-contain`}),(0,Y.jsx)(`span`,{className:`absolute inset-0 flex items-center justify-center bg-black/0 group-hover/img:bg-black/30 transition-colors`,children:(0,Y.jsx)(w,{className:`w-6 h-6 text-white opacity-0 group-hover/img:opacity-100 transition-opacity drop-shadow-md`})})]}):(0,Y.jsxs)(`span`,{className:l(`flex min-h-20 items-center gap-2 px-3 py-2 text-xs`,c?`text-red-400`:`text-muted-foreground`),children:[f?(0,Y.jsx)(E,{className:`h-4 w-4 animate-spin`}):(0,Y.jsx)(m,{className:`h-4 w-4`}),c||`Loading image`]})}),a&&(0,Y.jsx)(ne,{open:h,onOpenChange:g,children:(0,Y.jsxs)(te,{className:`max-w-[95vw] max-h-[95vh] w-auto p-0 bg-black/95 border-zinc-800 gap-0 overflow-hidden`,showCloseButton:!1,children:[(0,Y.jsx)(re,{className:`sr-only`,children:i}),(0,Y.jsxs)(`div`,{className:`relative flex items-center justify-center min-h-[200px]`,children:[(0,Y.jsx)(`img`,{src:a,alt:i,className:`max-w-[93vw] max-h-[90vh] object-contain`}),(0,Y.jsxs)(`div`,{className:`absolute top-2 right-2 flex gap-1`,children:[(0,Y.jsx)(`button`,{type:`button`,onClick:_,className:`rounded-md bg-black/60 hover:bg-black/80 p-2 text-white transition-colors`,title:`Download`,children:(0,Y.jsx)(r,{className:`w-4 h-4`})}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>g(!1),className:`rounded-md bg-black/60 hover:bg-black/80 p-2 text-white transition-colors`,title:`Close`,children:(0,Y.jsx)(y,{className:`w-4 h-4`})})]})]})]})})]}):(0,Y.jsxs)(`button`,{type:`button`,onClick:_,disabled:!a,className:l(`mt-2 flex w-full items-center gap-2 rounded-md border px-2.5 py-2 text-left text-xs transition-colors disabled:cursor-default disabled:opacity-70`,t?`border-primary-foreground/20 bg-primary-foreground/10 hover:bg-primary-foreground/15`:`border-border bg-background hover:bg-muted`),children:[f?(0,Y.jsx)(E,{className:`h-4 w-4 shrink-0 animate-spin`}):c?(0,Y.jsx)(m,{className:`h-4 w-4 shrink-0 text-red-400`}):(0,Y.jsx)(s,{className:`h-4 w-4 shrink-0`}),(0,Y.jsx)(`span`,{className:l(`min-w-0 flex-1 truncate`,c&&`text-red-400`),children:c||i}),(0,Y.jsx)(r,{className:`h-3.5 w-3.5 shrink-0`})]})}function $({open:e,onToggle:t,onReact:n}){return(0,Y.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,Y.jsx)(`button`,{type:`button`,title:`Add reaction`,onClick:t,className:l(`inline-flex h-5 w-6 items-center justify-center rounded-full border border-border bg-popover text-muted-foreground shadow-sm transition hover:bg-muted hover:text-foreground`,e?`opacity-100`:`opacity-0 pointer-events-none md:group-hover/msg:opacity-100 md:group-hover/msg:pointer-events-auto`),children:(0,Y.jsx)(k,{className:`h-3 w-3`})}),e&&(0,Y.jsx)(`div`,{className:`absolute bottom-full left-0 z-30 mb-1 flex gap-0.5 rounded-full border border-border bg-popover p-0.5 shadow-md`,children:be.map(e=>(0,Y.jsx)(`button`,{type:`button`,title:`React ${e}`,onClick:()=>n(e),className:`inline-flex h-6 w-7 items-center justify-center rounded-full text-xs transition-colors hover:bg-muted`,children:e},e))})]})}var Ke=(0,V.memo)(function({msg:e,peer:t,onOpenReferencedPath:n,onPreviewReferencedPath:r,onPreviewReferencedPathEnd:i}){let a=e.from!==`user`&&e.to!==`user`,o=a?e.from===t:e.from===L,s=a?o?`→ ${e.to}`:`from ${e.from}`:null,c=M(e=>e.reactToMessage),u=M(e=>e.voiceTtsEnabled),d=We(),f=M(e=>{let n=e.agentsById[t]?.meta?.cwd;return typeof n==`string`?n:``}),[p,m]=(0,V.useState)(!1),g=(0,V.useRef)(null),v=(0,V.useRef)(null),y=(0,V.useRef)(!1),b=N(e),x=J(e.occurredAt??e.createdAt),S=ye(e),C=xe(e),w=o?Se(e,t):null,T=w?.icon,E=d===String(e.id),D=u&&!o&&!a&&!q(e)&&b.trim().length>0;function O(t){t.stopPropagation(),E?j.bargeIn():j.speak(e.body,String(e.id))}(0,V.useEffect)(()=>{if(!p)return;function e(e){K()||g.current&&!g.current.contains(e.target)&&m(!1)}return document.addEventListener(`mousedown`,e),document.addEventListener(`touchstart`,e),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`touchstart`,e)}},[p]);function k(e){return he(f||`/`,e)}function A(e,t){let r=k(e);n?.(r,t)}function P(e,t,n){let i=k(e);r?.(i,t,n)}function F(t){c(e,t),m(!1)}function I(e){e.button===0&&(v.current={x:e.clientX,y:e.clientY},y.current=!1)}function R(e){let t=v.current;t&&(Math.abs(e.clientX-t.x)>3||Math.abs(e.clientY-t.y)>3)&&(y.current=!0)}function z(t){if(!(q(e)||o||a)&&!t.target.closest(`a,button,input,textarea,select,[role="button"]`)){if(y.current||K()){y.current=!1;return}m(e=>!e)}}return(0,Y.jsx)(`div`,{"data-msg-id":e.id,className:l(`group/msg flex mb-3`,o?`justify-end`:`justify-start`),children:(0,Y.jsxs)(`div`,{ref:g,className:`relative max-w-[85%] md:max-w-[75%]`,children:[D&&(0,Y.jsx)(`button`,{type:`button`,title:E?`Stop playback`:`Play aloud`,onClick:O,className:l(`absolute -top-2 -right-2 z-20 inline-flex h-6 w-6 items-center justify-center rounded-full border bg-popover shadow-sm transition`,E?`border-primary/50 text-primary opacity-100`:`border-border text-muted-foreground opacity-70 hover:bg-muted hover:text-foreground hover:opacity-100 [@media(hover:hover)]:md:opacity-0 [@media(hover:hover)]:md:group-hover/msg:opacity-100`),children:E?(0,Y.jsx)(_,{className:`h-3.5 w-3.5 animate-pulse`}):(0,Y.jsx)(h,{className:`h-3.5 w-3.5`})}),(0,Y.jsxs)(`div`,{className:l(`rounded-2xl px-3.5 py-2 text-sm select-text`,!o&&!q(e)&&!a&&`cursor-pointer`,o?`bg-primary text-primary-foreground rounded-br-sm`:`bg-card ring-1 ring-foreground/10 rounded-bl-sm`),onPointerDown:I,onPointerMove:R,onClick:z,children:[s&&(0,Y.jsx)(`p`,{className:l(`text-xs font-medium mb-1 opacity-60`,o?`text-primary-foreground`:`text-muted-foreground`),children:s}),e.subject&&(0,Y.jsx)(`p`,{className:l(`text-xs font-semibold mb-1`,o?`text-primary-foreground/70`:`text-muted-foreground`),children:e.subject}),(0,Y.jsx)(B,{text:b,rawBody:e.body,className:`leading-relaxed`,onOpenPath:A,onPreviewPath:P,onPreviewPathEnd:i,resolvePathTitle:(e,t)=>`${k(e)}${t?`:${t}`:``}`}),S.map(t=>(0,Y.jsx)(Ge,{attachment:t,outbound:o},`${e.id}-${t.artifactId}-${t.role||``}`)),(0,Y.jsxs)(`p`,{className:l(`text-xs mt-1 flex items-center gap-1.5`,o?`justify-end text-primary-foreground/60`:`justify-end text-muted-foreground`),children:[(0,Y.jsxs)(`span`,{className:`opacity-40`,children:[`#`,e.id]}),(0,Y.jsx)(`span`,{children:x}),w&&T&&(0,Y.jsxs)(`span`,{className:l(`inline-flex items-center gap-1`,w.tone===`ok`&&`text-emerald-300`,w.tone===`warn`&&`text-amber-200`,w.tone===`danger`&&`text-red-200`),title:w.title,children:[(0,Y.jsx)(T,{className:`h-3 w-3`}),w.label]})]})]}),!q(e)&&C.length>0&&(0,Y.jsxs)(`div`,{className:l(`flex flex-wrap items-center gap-0.5 -mt-1 relative z-10`,o?`justify-end pr-2`:`justify-start pl-2`),children:[!o&&(0,Y.jsx)($,{open:p,onToggle:()=>m(e=>!e),onReact:F}),C.map(e=>(0,Y.jsxs)(`button`,{type:`button`,title:e.actors.join(`, `),onClick:()=>F(e.emoji),className:l(`inline-flex h-5 items-center gap-0.5 rounded-full border px-1.5 text-[11px] shadow-sm transition-colors`,e.mine?`border-primary/40 bg-primary/10 text-primary`:`border-border bg-background hover:bg-muted text-foreground`),children:[(0,Y.jsx)(`span`,{children:e.emoji}),e.count>1&&(0,Y.jsx)(`span`,{children:e.count})]},e.emoji))]}),!q(e)&&!o&&C.length===0&&(0,Y.jsx)(`div`,{className:`absolute -bottom-2.5 left-1 z-20`,children:(0,Y.jsx)($,{open:p,onToggle:()=>m(e=>!e),onReact:F})})]})})});export{ve as _,Be as a,He as c,Ue as d,me as f,Te as g,Ee as h,Le as i,Me as l,ge as m,Q as n,ze as o,_e as p,Ie as r,Ve as s,Ke as t,ke as u,we as v,fe as y};
2
+ //# sourceMappingURL=MessageBubble-CX63ZV4X.js.map