ryco-cli 0.1.5 → 0.1.7

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 (187) hide show
  1. package/README.md +50 -2
  2. package/dist/{AzureDevOpsSourceControlProvider-CdgNqZ5j.cjs → AzureDevOpsSourceControlProvider-5exivY-1.cjs} +2 -2
  3. package/dist/{AzureDevOpsSourceControlProvider-OsyDSESj.mjs → AzureDevOpsSourceControlProvider-CF5LuCHp.mjs} +3 -3
  4. package/dist/{BitbucketSourceControlProvider-DBTH98i4.cjs → BitbucketSourceControlProvider-1GWENqcl.cjs} +2 -2
  5. package/dist/{BitbucketSourceControlProvider-SQ3gKdFs.mjs → BitbucketSourceControlProvider-CKH09tfT.mjs} +3 -3
  6. package/dist/{BunPTY-B_vjRZN4.mjs → BunPTY-BWhtEA50.mjs} +1 -1
  7. package/dist/{ClaudeDriver-D9yC2F0b.cjs → ClaudeDriver-BXLdjrht.cjs} +187 -8
  8. package/dist/{ClaudeDriver-2dTtrsFD.mjs → ClaudeDriver-WwWFTu61.mjs} +188 -9
  9. package/dist/{CodexDriver-CIDYevQX.mjs → CodexDriver-93-TmCrO.mjs} +16 -8
  10. package/dist/{CodexDriver-BC2B-qpT.cjs → CodexDriver-BboMT9uk.cjs} +15 -7
  11. package/dist/{CodexTextGeneration-DNeO-8GE.cjs → CodexTextGeneration-0pRbJji3.cjs} +3 -3
  12. package/dist/{CodexTextGeneration-CjknB1Xl.mjs → CodexTextGeneration-BU9Myn87.mjs} +4 -4
  13. package/dist/{CopilotDriver-NPhlLrk2.mjs → CopilotDriver-BASi8pJ0.mjs} +15 -8
  14. package/dist/{CopilotDriver-BGChrP5c.cjs → CopilotDriver-DCsv-17W.cjs} +14 -7
  15. package/dist/{CursorDriver-CYxn4_c1.cjs → CursorDriver-BTSiM3A8.cjs} +163 -16
  16. package/dist/{CursorDriver-BcAVbT8D.mjs → CursorDriver-D5LvIqUk.mjs} +164 -17
  17. package/dist/{ForgejoSourceControlProvider-D3wP2Cav.cjs → ForgejoSourceControlProvider-BTXRDCGB.cjs} +2 -2
  18. package/dist/{ForgejoSourceControlProvider-BjCE3730.mjs → ForgejoSourceControlProvider-e-4hvvZ_.mjs} +3 -3
  19. package/dist/{GitHubSourceControlProvider-DByZ_cnw.mjs → GitHubSourceControlProvider-26IofDAO.mjs} +3 -3
  20. package/dist/{GitHubSourceControlProvider-DU_7IvMa.cjs → GitHubSourceControlProvider-DWmwkA_y.cjs} +2 -2
  21. package/dist/{GitLabSourceControlProvider-BVJ5IqTS.cjs → GitLabSourceControlProvider-D-YHnxRe.cjs} +2 -2
  22. package/dist/{GitLabSourceControlProvider-BdMCIjXb.mjs → GitLabSourceControlProvider-DePct78W.mjs} +3 -3
  23. package/dist/{Metrics-BCOc3Ml2.mjs → Metrics-6Xj17Se3.mjs} +94 -2
  24. package/dist/{Metrics-DNOriWhP.cjs → Metrics-CIW1QH7M.cjs} +128 -0
  25. package/dist/{NodePTY-_u3kQLvd.mjs → NodePTY-C_cR3Ayy.mjs} +1 -1
  26. package/dist/{OpenCodeDriver-fwqXoVyH.mjs → OpenCodeDriver-BhvLOmvn.mjs} +336 -43
  27. package/dist/{OpenCodeDriver-DyR83FcY.cjs → OpenCodeDriver-CVeZ4n9-.cjs} +335 -42
  28. package/dist/{SourceControlProviderDiscoveryCatalog-DqQVhwYM.cjs → SourceControlProviderDiscoveryCatalog-DeFR5xH3.cjs} +98 -161
  29. package/dist/{SourceControlProviderDiscoveryCatalog-CQiMyDCC.mjs → SourceControlProviderDiscoveryCatalog-mJV_Xitr.mjs} +100 -145
  30. package/dist/bin.cjs +30639 -28744
  31. package/dist/bin.mjs +30602 -28709
  32. package/dist/client/assets/{AnimatedHeight-CYuVQOpY.js → AnimatedHeight-BSU0lzYs.js} +1 -1
  33. package/dist/client/assets/AppearanceSettings-D7q0ujGK.js +1 -0
  34. package/dist/client/assets/BranchToolbar.logic-CZIFSvhd.js +1 -0
  35. package/dist/client/assets/ChatRightPanel-CWHOIuiQ.js +188 -0
  36. package/dist/client/assets/ChatThreadRouteView-bA7xWXzc.js +1 -0
  37. package/dist/client/assets/CommandPaletteDialog-DNYaVOZO.js +1 -0
  38. package/dist/client/assets/CompositeRoot-B_KEfCUE.js +1 -0
  39. package/dist/client/assets/ConnectionsSettings-CLZPbx_K.js +1 -0
  40. package/dist/client/assets/DiagnosticsSettings-DtzPCb6N.js +1 -0
  41. package/dist/client/assets/DialogHandle-DuHnmWoE.js +1 -0
  42. package/dist/client/assets/{DialogRoot-DaMwpoP_.js → DialogRoot-BV25qAcA.js} +1 -1
  43. package/dist/client/assets/DialogTitle-DQsi-RTa.js +1 -0
  44. package/dist/client/assets/DialogTrigger-D0fA01C6.js +1 -0
  45. package/dist/client/assets/DialogViewport-CMV_BePU.js +1 -0
  46. package/dist/client/assets/DraftChatThreadRouteView-BoiKnrii.js +1 -0
  47. package/dist/client/assets/JetBrainsIcons-BcPxJlMf.js +1 -0
  48. package/dist/client/assets/KeybindingsSettings-LuI98pdF.js +7 -0
  49. package/dist/client/assets/McpServersSettings-BFMuWYVV.js +6 -0
  50. package/dist/client/assets/NoActiveThreadState-C2q_O1kP.js +1 -0
  51. package/dist/client/assets/OpinionatedPluginsSettings-Bqwct37O.js +1 -0
  52. package/dist/client/assets/ProjectFavicon-D2imiJ8M.js +1 -0
  53. package/dist/client/assets/{ProviderUpdateLaunchNotification.logic-BFzNCo3I.js → ProviderUpdateLaunchNotification.logic-CJgA--nK.js} +1 -1
  54. package/dist/client/assets/ProvidersSettingsPanel-B97vbeu6.js +1 -0
  55. package/dist/client/assets/{RedactedSensitiveText-UnZZJnFF.js → RedactedSensitiveText-B2GFTyfq.js} +1 -1
  56. package/dist/client/assets/RootAppShell-C1xTR98P.js +12 -0
  57. package/dist/client/assets/SettingsDialog-Q0Q8O5oH.js +2 -0
  58. package/dist/client/assets/SourceControlSettings-KAvoPTNi.js +1 -0
  59. package/dist/client/assets/StatisticsPanel-BzsQ444K.js +64 -0
  60. package/dist/client/assets/ThreadStatusIndicators-Cw_jLVQf.js +1 -0
  61. package/dist/client/assets/{ThreadTerminalDrawer-BXoXAbsR.js → ThreadTerminalDrawer-D1WnSemH.js} +17 -17
  62. package/dist/client/assets/ThreadWorkspacePanel-L4qCPTOA.js +166 -0
  63. package/dist/client/assets/{alert-dialog-BJQbh5gX.js → alert-dialog-CNmKa0BK.js} +1 -1
  64. package/dist/client/assets/chart-column-BWSKYZ_a.js +1 -0
  65. package/dist/client/assets/{chatThreadActions--n7v5mnB.js → chatThreadActions-TtDsiwDC.js} +1 -1
  66. package/dist/client/assets/chevron-up-zopJ_99l.js +1 -0
  67. package/dist/client/assets/{clamp-NYtK3f5s.js → clamp-Ds6WJu8j.js} +1 -1
  68. package/dist/client/assets/clipboard-copy-BoJGpdmJ.js +1 -0
  69. package/dist/client/assets/clock-CzUHThzk.js +1 -0
  70. package/dist/client/assets/commandPaletteStore-KebG835b.js +1 -0
  71. package/dist/client/assets/composerDraftStore-DpPEQ6BN.js +21 -0
  72. package/dist/client/assets/desktopUpdateAtoms-BQ0GGEfM.js +2 -0
  73. package/dist/client/assets/{download-Bi4-cFbc.js → download-CUiRE0N9.js} +1 -1
  74. package/dist/client/assets/{draft-input-BGSRgOW7.js → draft-input-CwpGDtoT.js} +1 -1
  75. package/dist/client/assets/editorPreferences-jN7DKbyt.js +1 -0
  76. package/dist/client/assets/empty-CBuXePtg.js +1 -0
  77. package/dist/client/assets/{group-Dwm-OV-r.js → group-BpZvxjG5.js} +1 -1
  78. package/dist/client/assets/{index-BI5yFj9n.js → index-BKzXTNJ_.js} +2 -2
  79. package/dist/client/assets/{input-BfUa3JUD.js → input-CgDawd6k.js} +1 -1
  80. package/dist/client/assets/kbd-QYSL97CK.js +1 -0
  81. package/dist/client/assets/{keybindings--G1bkIjA.js → keybindings-CUTRYI_A.js} +1 -1
  82. package/dist/client/assets/{keyboard-B87VTfPa.js → keyboard-DFFiI7JY.js} +1 -1
  83. package/dist/client/assets/keyedQuery-DiOCbGH0.js +0 -0
  84. package/dist/client/assets/main-BgFGju3e.js +9 -0
  85. package/dist/client/assets/main-D0UFdwts.css +2 -0
  86. package/dist/client/assets/palette-BXCL909c.js +1 -0
  87. package/dist/client/assets/play-DI2LZohg.js +1 -0
  88. package/dist/client/assets/plus-DzgIfHUF.js +1 -0
  89. package/dist/client/assets/projectAtoms-DXXpuERK.js +1 -0
  90. package/dist/client/assets/providerDriverMeta-CRNNp0q3.js +1 -0
  91. package/dist/client/assets/providerIconUtils-D-DFhem2.js +47 -0
  92. package/dist/client/assets/radio-group-_PPYg3YY.js +1 -0
  93. package/dist/client/assets/{refresh-cw-CRxaXR0E.js → refresh-cw-BsQTNBXl.js} +1 -1
  94. package/dist/client/assets/{resolveAriaLabelledBy-D4fWpj84.js → resolveAriaLabelledBy-CRHo_s16.js} +1 -1
  95. package/dist/client/assets/rightPanelRouteSearch-CfmZ7osj.js +1 -0
  96. package/dist/client/assets/scale-DDEJ-tvn.js +1 -0
  97. package/dist/client/assets/scroll-area-HgsI-ErG.js +1 -0
  98. package/dist/client/assets/separator-ClnL4mUB.js +1 -0
  99. package/dist/client/assets/{server-tdx7WxLI.js → server-Bbs3L-6_.js} +1 -1
  100. package/dist/client/assets/session-logic-CKQkgIwo.js +4 -0
  101. package/dist/client/assets/settingsDialogStore-SG-W1q0A.js +1 -0
  102. package/dist/client/assets/settingsLayout-G5xVm-ZT.js +1 -0
  103. package/dist/client/assets/shallow-Dmd-gez1.js +1 -0
  104. package/dist/client/assets/sidebar-_u7SGgmC.js +1 -0
  105. package/dist/client/assets/sidebarStatusText-BTYnwflG.js +1 -0
  106. package/dist/client/assets/skeleton-CmUvhZGP.js +1 -0
  107. package/dist/client/assets/storeSelectors-DhJRpdiw.js +1 -0
  108. package/dist/client/assets/threadSelectionStore-ygmA4DNA.js +1 -0
  109. package/dist/client/assets/toast-DmA_ziPT.js +1 -0
  110. package/dist/client/assets/toggle-DGS7tKuj.js +1 -0
  111. package/dist/client/assets/{toggle-group-DdKXHoT3.js → toggle-group-Dtv1ZUFW.js} +1 -1
  112. package/dist/client/assets/tokenModePresentation-Dor1DnBx.js +1 -0
  113. package/dist/client/assets/{trash-2-CZQem-sz.js → trash-2-C2G3VGoV.js} +1 -1
  114. package/dist/client/assets/triangle-alert-Bpz3xGu5.js +1 -0
  115. package/dist/client/assets/undo-2-C3rtxuqZ.js +1 -0
  116. package/dist/client/assets/useHandleNewThread-ypSbzG0P.js +1 -0
  117. package/dist/client/assets/useLabelableId-Bc7KEnHU.js +1 -0
  118. package/dist/client/assets/useNavigate-_4hWGSey.js +1 -0
  119. package/dist/client/assets/useTheme-HcKmBfpF.js +1 -0
  120. package/dist/client/assets/{vscode-icons-E8NUFd62.js → vscode-icons-DdSTtxYd.js} +1 -1
  121. package/dist/client/assets/{wrench-DEteICtk.js → wrench-C4jdis40.js} +1 -1
  122. package/dist/client/assets/x-CG2WU63t.js +1 -0
  123. package/dist/client/index.html +1 -1
  124. package/dist/{collectUint8StreamText-DuFJyaQh.mjs → collectUint8StreamText-Lv4GGI79.mjs} +488 -16
  125. package/dist/{collectUint8StreamText-DbCOJom3.cjs → collectUint8StreamText-uNXVRHOf.cjs} +510 -14
  126. package/dist/{makeManagedServerProvider-C3cQUDkZ.cjs → makeManagedServerProvider-3SD-Q5xh.cjs} +1 -1
  127. package/dist/{makeManagedServerProvider-wFGZ2-vd.mjs → makeManagedServerProvider-CkPEptun.mjs} +2 -2
  128. package/package.json +1 -1
  129. package/dist/client/assets/AppearanceSettings-BBbC8CV5.js +0 -1
  130. package/dist/client/assets/BranchToolbar.logic-Di2EkKiO.js +0 -1
  131. package/dist/client/assets/ChatRightPanel-BJ_cVP66.js +0 -188
  132. package/dist/client/assets/ChatThreadRouteView-DmxD3m2U.js +0 -1
  133. package/dist/client/assets/CommandPaletteDialog-CAzz6bsT.js +0 -1
  134. package/dist/client/assets/CompositeRoot-BvXCwn2c.js +0 -1
  135. package/dist/client/assets/ConnectionsSettings-Cmxm0y2u.js +0 -1
  136. package/dist/client/assets/DialogHandle-CXNAm3QY.js +0 -1
  137. package/dist/client/assets/DialogTitle-KXmfgzP3.js +0 -1
  138. package/dist/client/assets/DialogTrigger-NHyQnW3X.js +0 -1
  139. package/dist/client/assets/DialogViewport-CL0WR9a5.js +0 -1
  140. package/dist/client/assets/DraftChatThreadRouteView-C_hqauF6.js +0 -1
  141. package/dist/client/assets/JetBrainsIcons-BcR8pCma.js +0 -1
  142. package/dist/client/assets/KeybindingsSettings-m2AteGOl.js +0 -7
  143. package/dist/client/assets/McpServersSettings-DndIDxgA.js +0 -6
  144. package/dist/client/assets/NoActiveThreadState-Bt-Wkv-C.js +0 -1
  145. package/dist/client/assets/OpinionatedPluginsSettings-oDtdE6qx.js +0 -1
  146. package/dist/client/assets/ProjectFavicon-j9IX_7-B.js +0 -1
  147. package/dist/client/assets/ProvidersSettingsPanel-CvlIBNVJ.js +0 -1
  148. package/dist/client/assets/QueryClientProvider-BZxRKpeb.js +0 -1
  149. package/dist/client/assets/RootAppShell-CyHZ_F5P.js +0 -12
  150. package/dist/client/assets/SettingsDialog-BYJ8AhQp.js +0 -2
  151. package/dist/client/assets/SourceControlSettings-7xU6VH6N.js +0 -1
  152. package/dist/client/assets/ThreadStatusIndicators-M9FWDEex.js +0 -1
  153. package/dist/client/assets/ThreadWorkspacePanel-D1J63TVD.js +0 -166
  154. package/dist/client/assets/codexUsageLimits-BJQiZCqn.js +0 -1
  155. package/dist/client/assets/commandPaletteStore-oFMPKPmp.js +0 -1
  156. package/dist/client/assets/composerDraftStore-xu3n5gdX.js +0 -21
  157. package/dist/client/assets/desktopUpdateReactQuery-YSCkifKp.js +0 -2
  158. package/dist/client/assets/empty-BTxheW4B.js +0 -1
  159. package/dist/client/assets/environmentApi-BFHi_M02.js +0 -1
  160. package/dist/client/assets/folder-open-DJmHEPv9.js +0 -1
  161. package/dist/client/assets/kbd-Dd57M8OY.js +0 -1
  162. package/dist/client/assets/main-BQf5U-fz.js +0 -9
  163. package/dist/client/assets/main-DrwkwNo9.css +0 -2
  164. package/dist/client/assets/mutation-DJZgOJRu.js +0 -1
  165. package/dist/client/assets/plus-B10j9MbZ.js +0 -1
  166. package/dist/client/assets/providerDriverMeta-B6xuq7ij.js +0 -1
  167. package/dist/client/assets/providerIconUtils-Ch6hejVW.js +0 -47
  168. package/dist/client/assets/rightPanelRouteSearch-CTMFCS6R.js +0 -1
  169. package/dist/client/assets/scroll-area-BgFq7GRd.js +0 -1
  170. package/dist/client/assets/separator-CB3Ctlvi.js +0 -1
  171. package/dist/client/assets/session-logic-CaiGe4hy.js +0 -4
  172. package/dist/client/assets/settingsDialogStore-9vo22xKp.js +0 -1
  173. package/dist/client/assets/settingsLayout-B5o13iGO.js +0 -1
  174. package/dist/client/assets/sidebar-Bbdql7Af.js +0 -1
  175. package/dist/client/assets/skeleton-C8OZcsPq.js +0 -1
  176. package/dist/client/assets/storeSelectors-DBRyhCGm.js +0 -1
  177. package/dist/client/assets/threadRoutes-CfldSp4X.js +0 -1
  178. package/dist/client/assets/threadSelectionStore-BggKwzmQ.js +0 -1
  179. package/dist/client/assets/toast-DE-WwLMa.js +0 -1
  180. package/dist/client/assets/toggle-BFMa0a0Y.js +0 -1
  181. package/dist/client/assets/useHandleNewThread-DOPZAFqE.js +0 -1
  182. package/dist/client/assets/useLabelableId-BzWaBebJ.js +0 -1
  183. package/dist/client/assets/useNavigate-B1qgM5mt.js +0 -1
  184. package/dist/client/assets/useTheme-C7Ji7x06.js +0 -1
  185. package/dist/client/assets/x-b9324xm-.js +0 -1
  186. package/dist/{NodeSqliteClient-BXy61fAd.mjs → NodeSqliteClient-A1TEgwj_.mjs} +1 -1
  187. package/dist/{NodeSqliteClient-homCO8-6.cjs → NodeSqliteClient-B5aDHbNc.cjs} +2 -2
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ryco-cli
2
2
 
3
- Ryco is a minimal web GUI for coding agents. The CLI starts the Ryco server, serves the bundled web app, and connects it to local provider CLIs such as Codex, Claude, GitHub Copilot, OpenCode, and Cursor.
3
+ Ryco is a minimal web GUI for coding agents. The CLI starts the Ryco server, serves the bundled web app, and connects it to local provider runtimes such as Codex, Claude, GitHub Copilot, OpenCode, and Cursor.
4
4
 
5
5
  Ryco is early WIP. Expect bugs and breaking changes.
6
6
 
@@ -26,8 +26,9 @@ Install and authenticate at least one provider before using Ryco:
26
26
  - Codex: install the Codex CLI and run `codex login`
27
27
  - Claude: install Claude Code and run `claude auth login`
28
28
  - OpenCode: install OpenCode and run `opencode auth login`
29
+ - GitHub Copilot and Cursor: install/authenticate the provider CLI expected by the corresponding SDK/runtime, then verify live status in Settings
29
30
 
30
- Ryco discovers available providers from the machine running the CLI.
31
+ Ryco discovers available providers from the machine running the CLI. Provider binaries, custom homes, server URLs, per-instance environment variables, display names, and accent colors are configured in Settings.
31
32
 
32
33
  ## Usage
33
34
 
@@ -63,6 +64,8 @@ Common options:
63
64
  - `--mode web|desktop`: runtime mode
64
65
  - `--no-browser`: disable automatic browser opening
65
66
  - `--auto-bootstrap-project-from-cwd`: create a project for the current working directory on startup when missing
67
+ - `--tailscale-serve`: expose this backend over HTTPS on the Tailnet through Tailscale Serve
68
+ - `--log-websocket-events`: emit server-side WebSocket traffic logs for debugging
66
69
 
67
70
  Useful commands:
68
71
 
@@ -85,6 +88,51 @@ ryco auth session revoke <session-id>
85
88
 
86
89
  Run `ryco --help` or `ryco <command> --help` for the full command reference.
87
90
 
91
+ ## Testing
92
+
93
+ ### `WsTestClient` (websocket integration tests)
94
+
95
+ `src/test/WsTestClient.ts` is a small harness for server-side websocket RPC
96
+ integration tests. It replaces ad-hoc per-test socket wiring (`RpcClient.make` +
97
+ protocol layer + cookie/origin parsing) with a single scoped `connect()` plus a
98
+ few combinators. Connections are bound to the surrounding `Scope` (e.g.
99
+ `Effect.scoped`).
100
+
101
+ ```ts
102
+ import * as WsTestClient from "./test/WsTestClient.ts";
103
+
104
+ // `wsUrl` already carries auth (e.g. `?wsToken=...`), as produced by the test
105
+ // harness' `getWsServerUrl("/ws")`.
106
+ yield *
107
+ Effect.scoped(
108
+ Effect.gen(function* () {
109
+ const ws = yield* WsTestClient.connect(wsUrl);
110
+
111
+ // Request/response RPC:
112
+ const config = yield* ws.rpc(WS_METHODS.serverGetConfig, {});
113
+
114
+ // Wait for the lifecycle welcome event:
115
+ const welcome = yield* ws.awaitWelcome();
116
+
117
+ // Wait for the first push on a subscription matching a predicate:
118
+ const ready = yield* ws.awaitPush(
119
+ WS_METHODS.subscribeServerLifecycle,
120
+ (event) => event.type === "ready",
121
+ );
122
+
123
+ // Record an ordered push sequence and await N events:
124
+ const sequence = yield* ws.trackPushSequence(WS_METHODS.subscribeServerConfig);
125
+ const [snapshot, update] = yield* sequence.waitForCount(2);
126
+ }),
127
+ );
128
+ ```
129
+
130
+ `makeWsTestClientConnector(group)` builds the same surface for an arbitrary RPC
131
+ group, and `makeConnectedWsTestClient(client)` wraps an already-constructed RPC
132
+ client (used by `WsTestClient.test.ts` to unit-test the combinators without a
133
+ socket). See `src/test/WsTestClient.test.ts` and the migrated cases in
134
+ `src/server.test.ts` for examples.
135
+
88
136
  ## Links
89
137
 
90
138
  - Repository: https://github.com/sak0a/ryco
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const require_collectUint8StreamText = require("./collectUint8StreamText-DbCOJom3.cjs");
4
- const require_SourceControlProviderDiscoveryCatalog = require("./SourceControlProviderDiscoveryCatalog-DqQVhwYM.cjs");
3
+ const require_collectUint8StreamText = require("./collectUint8StreamText-uNXVRHOf.cjs");
4
+ const require_SourceControlProviderDiscoveryCatalog = require("./SourceControlProviderDiscoveryCatalog-DeFR5xH3.cjs");
5
5
  const require_bin = require("./bin.cjs");
6
6
  let effect = require("effect");
7
7
  //#region src/sourceControl/AzureDevOpsSourceControlProvider.ts
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { Cn as SourceControlProviderError, Tn as truncateSourceControlDetailContent } from "./collectUint8StreamText-DuFJyaQh.mjs";
4
- import { p as sourceControlRefFromInput, t as azureDevOpsDiscovery, u as SourceControlProvider } from "./SourceControlProviderDiscoveryCatalog-CQiMyDCC.mjs";
5
- import { T as AzureDevOpsCli } from "./bin.mjs";
3
+ import { En as SourceControlProviderError, On as truncateSourceControlDetailContent } from "./collectUint8StreamText-Lv4GGI79.mjs";
4
+ import { l as sourceControlRefFromInput, o as SourceControlProvider, t as azureDevOpsDiscovery } from "./SourceControlProviderDiscoveryCatalog-mJV_Xitr.mjs";
5
+ import { Yt as AzureDevOpsCli } from "./bin.mjs";
6
6
  import { DateTime, Effect, Layer, Option } from "effect";
7
7
  //#region src/sourceControl/AzureDevOpsSourceControlProvider.ts
8
8
  function providerError(operation, cause) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const require_collectUint8StreamText = require("./collectUint8StreamText-DbCOJom3.cjs");
4
- const require_SourceControlProviderDiscoveryCatalog = require("./SourceControlProviderDiscoveryCatalog-DqQVhwYM.cjs");
3
+ const require_collectUint8StreamText = require("./collectUint8StreamText-uNXVRHOf.cjs");
4
+ const require_SourceControlProviderDiscoveryCatalog = require("./SourceControlProviderDiscoveryCatalog-DeFR5xH3.cjs");
5
5
  const require_bin = require("./bin.cjs");
6
6
  let effect = require("effect");
7
7
  //#region src/sourceControl/BitbucketSourceControlProvider.ts
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { Cn as SourceControlProviderError, Tn as truncateSourceControlDetailContent } from "./collectUint8StreamText-DuFJyaQh.mjs";
4
- import { i as makeBitbucketDiscovery, p as sourceControlRefFromInput, u as SourceControlProvider } from "./SourceControlProviderDiscoveryCatalog-CQiMyDCC.mjs";
5
- import { w as BitbucketApi } from "./bin.mjs";
3
+ import { En as SourceControlProviderError, On as truncateSourceControlDetailContent } from "./collectUint8StreamText-Lv4GGI79.mjs";
4
+ import { i as makeBitbucketDiscovery, l as sourceControlRefFromInput, o as SourceControlProvider } from "./SourceControlProviderDiscoveryCatalog-mJV_Xitr.mjs";
5
+ import { Jt as BitbucketApi } from "./bin.mjs";
6
6
  import { DateTime, Effect, Layer, Option } from "effect";
7
7
  //#region src/sourceControl/BitbucketSourceControlProvider.ts
8
8
  function providerError(operation, cause) {
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { n as PtyAdapter } from "./bin.mjs";
3
+ import { r as PtyAdapter } from "./bin.mjs";
4
4
  import { Effect, Layer } from "effect";
5
5
  //#region src/terminal/Layers/BunPTY.ts
6
6
  var BunPtyProcess = class {
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  const require_chunk = require("./chunk-jM1PLTSZ.cjs");
4
- const require_collectUint8StreamText = require("./collectUint8StreamText-DbCOJom3.cjs");
5
- const require_Metrics = require("./Metrics-DNOriWhP.cjs");
4
+ const require_collectUint8StreamText = require("./collectUint8StreamText-uNXVRHOf.cjs");
5
+ const require_Metrics = require("./Metrics-CIW1QH7M.cjs");
6
6
  const require_bin = require("./bin.cjs");
7
- const require_makeManagedServerProvider = require("./makeManagedServerProvider-C3cQUDkZ.cjs");
7
+ const require_makeManagedServerProvider = require("./makeManagedServerProvider-3SD-Q5xh.cjs");
8
8
  const require_sourceControlContextFormatter = require("./sourceControlContextFormatter-BDZqn-4T.cjs");
9
9
  const require_ProjectCustomSystemPrompt = require("./ProjectCustomSystemPrompt-B8SUlNGa.cjs");
10
10
  const require_ProviderDriver = require("./ProviderDriver--rNeAi3B.cjs");
@@ -50,6 +50,7 @@ const CLAUDE_PRESENTATION = {
50
50
  };
51
51
  const MINIMUM_CLAUDE_OPUS_4_8_VERSION = "2.1.154";
52
52
  const MINIMUM_CLAUDE_OPUS_4_7_VERSION = "2.1.111";
53
+ const MINIMUM_CLAUDE_FABLE_5_VERSION = "2.1.194";
53
54
  function buildClaudeEffortOption(value, defaultEffort) {
54
55
  const label = value === "xhigh" ? "Extra High" : value[0].toUpperCase() + value.slice(1).toLowerCase();
55
56
  return value === defaultEffort ? {
@@ -121,6 +122,18 @@ const CLAUDE_OPUS_LEGACY_EFFORT_LEVELS = [
121
122
  "max"
122
123
  ];
123
124
  const BUILT_IN_MODELS = [
125
+ {
126
+ slug: "claude-fable-5",
127
+ name: "Claude Fable 5",
128
+ shortName: "Fable 5",
129
+ isCustom: false,
130
+ capabilities: buildClaudeOpusCapabilities({
131
+ effortLevels: CLAUDE_OPUS_ADAPTIVE_EFFORT_LEVELS,
132
+ defaultEffort: "high",
133
+ supportsFastMode: false,
134
+ supportsContextWindow: false
135
+ })
136
+ },
124
137
  {
125
138
  slug: "claude-opus-4-8",
126
139
  name: "Claude Opus 4.8",
@@ -165,7 +178,7 @@ const BUILT_IN_MODELS = [
165
178
  capabilities: buildClaudeOpusCapabilities({
166
179
  effortLevels: CLAUDE_OPUS_LEGACY_EFFORT_LEVELS,
167
180
  defaultEffort: "high",
168
- supportsFastMode: true,
181
+ supportsFastMode: false,
169
182
  supportsContextWindow: false
170
183
  })
171
184
  },
@@ -230,8 +243,12 @@ function supportsClaudeOpus48(version) {
230
243
  function supportsClaudeOpus47(version) {
231
244
  return supportsMinimumClaudeVersion(version, MINIMUM_CLAUDE_OPUS_4_7_VERSION);
232
245
  }
246
+ function supportsClaudeFable5(version) {
247
+ return supportsMinimumClaudeVersion(version, MINIMUM_CLAUDE_FABLE_5_VERSION);
248
+ }
233
249
  function getBuiltInClaudeModelsForVersion(version) {
234
250
  return BUILT_IN_MODELS.filter((model) => {
251
+ if (model.slug === "claude-fable-5") return supportsClaudeFable5(version);
235
252
  if (model.slug === "claude-opus-4-8") return supportsClaudeOpus48(version);
236
253
  if (model.slug === "claude-opus-4-7") return supportsClaudeOpus47(version);
237
254
  return true;
@@ -943,6 +960,54 @@ function readClaudeResumeState(resumeCursor) {
943
960
  ...turnCountValue !== void 0 && Number.isInteger(turnCountValue) && turnCountValue >= 0 ? { turnCount: turnCountValue } : {}
944
961
  };
945
962
  }
963
+ function trimmedClaudeString(value) {
964
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
965
+ }
966
+ function claudeTaskField(message, field) {
967
+ return trimmedClaudeString(message[field]);
968
+ }
969
+ function hasClaudeSubagentNameSignal(value) {
970
+ return value !== void 0 && /\b(?:sub[-\s]?agent|agent|subtask|task)\b/i.test(value);
971
+ }
972
+ function hasClaudeSubagentDescriptionSignal(value) {
973
+ return value !== void 0 && /\b(?:sub[-\s]?agent|agent|teammate|worker|delegate[sd]?|reviewer)\b/i.test(value);
974
+ }
975
+ function isClaudeSubagentTaskMessage(message) {
976
+ return hasClaudeSubagentNameSignal(claudeTaskField(message, "task_type")) || hasClaudeSubagentNameSignal(claudeTaskField(message, "last_tool_name")) || hasClaudeSubagentDescriptionSignal(claudeTaskField(message, "description")) || hasClaudeSubagentDescriptionSignal(claudeTaskField(message, "summary"));
977
+ }
978
+ function claudeTaskSubagentStatus(status) {
979
+ return status;
980
+ }
981
+ function claudeTaskCompletionStatus(status) {
982
+ return status;
983
+ }
984
+ function claudeTaskMetadata(message) {
985
+ const metadata = Object.fromEntries([
986
+ ["source", "claude.task"],
987
+ ["taskType", claudeTaskField(message, "task_type")],
988
+ ["lastToolName", claudeTaskField(message, "last_tool_name")]
989
+ ].filter(([, value]) => value !== void 0));
990
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
991
+ }
992
+ function makeClaudeTaskSubagentRef(existing, message) {
993
+ const taskType = claudeTaskField(message, "task_type");
994
+ const lastToolName = claudeTaskField(message, "last_tool_name");
995
+ const description = claudeTaskField(message, "description") ?? existing?.description;
996
+ const label = taskType ?? lastToolName ?? existing?.label ?? "Claude task";
997
+ const taskMetadata = claudeTaskMetadata(message);
998
+ const metadata = {};
999
+ if (existing?.metadata) Object.assign(metadata, existing.metadata);
1000
+ if (taskMetadata) Object.assign(metadata, taskMetadata);
1001
+ return {
1002
+ subagentId: existing?.subagentId ?? require_collectUint8StreamText.RuntimeSubagentId.make(`claude-task:${message.task_id}`),
1003
+ origin: "native",
1004
+ capability: "summary",
1005
+ label,
1006
+ ...description && { description },
1007
+ providerTaskId: require_collectUint8StreamText.RuntimeTaskId.make(message.task_id),
1008
+ ...Object.keys(metadata).length > 0 && { metadata }
1009
+ };
1010
+ }
946
1011
  function classifyToolItemType(toolName) {
947
1012
  const normalized = toolName.toLowerCase();
948
1013
  if (normalized.includes("agent")) return "collab_agent_tool_call";
@@ -1235,13 +1300,95 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
1235
1300
  }));
1236
1301
  const sessions = /* @__PURE__ */ new Map();
1237
1302
  const runtimeEventQueue = yield* effect.Queue.unbounded();
1303
+ const runtimeEventQueueMetrics = yield* require_bin.makeServerQueueMetrics({
1304
+ queue: "provider.adapter.runtimeEvents",
1305
+ component: "ClaudeAdapter",
1306
+ provider: PROVIDER,
1307
+ providerInstanceId: boundInstanceId
1308
+ });
1238
1309
  const nowIso = effect.Effect.map(effect.DateTime.now, effect.DateTime.formatIso);
1239
1310
  const nextEventId = effect.Effect.map(effect.Random.nextUUIDv4, (id) => require_collectUint8StreamText.EventId.make(id));
1240
1311
  const makeEventStamp = () => effect.Effect.all({
1241
1312
  eventId: nextEventId,
1242
1313
  createdAt: nowIso
1243
1314
  });
1244
- const offerRuntimeEvent = (event) => effect.Queue.offer(runtimeEventQueue, event).pipe(effect.Effect.asVoid);
1315
+ const offerRuntimeEvent = (event) => effect.Queue.offer(runtimeEventQueue, event).pipe(effect.Effect.andThen(runtimeEventQueueMetrics.recordEnqueued()), effect.Effect.asVoid);
1316
+ const emitClaudeSubagentStarted = effect.Effect.fn("emitClaudeSubagentStarted")(function* (context, subagent, raw) {
1317
+ const key = String(subagent.subagentId);
1318
+ if (context.startedSubagentIds.has(key)) return;
1319
+ context.startedSubagentIds.add(key);
1320
+ const stamp = yield* makeEventStamp();
1321
+ yield* offerRuntimeEvent({
1322
+ type: "subagent.started",
1323
+ eventId: stamp.eventId,
1324
+ provider: PROVIDER,
1325
+ createdAt: stamp.createdAt,
1326
+ threadId: context.session.threadId,
1327
+ ...context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {},
1328
+ payload: { subagent },
1329
+ providerRefs: nativeProviderRefs(context),
1330
+ raw: {
1331
+ source: "claude.sdk.message",
1332
+ method: sdkNativeMethod(raw),
1333
+ messageType: `${raw.type}:${sdkMessageSubtype(raw) ?? ""}`,
1334
+ payload: raw
1335
+ }
1336
+ });
1337
+ });
1338
+ const emitClaudeSubagentUpdated = effect.Effect.fn("emitClaudeSubagentUpdated")(function* (context, input) {
1339
+ yield* emitClaudeSubagentStarted(context, input.subagent, input.raw);
1340
+ const stamp = yield* makeEventStamp();
1341
+ yield* offerRuntimeEvent({
1342
+ type: "subagent.updated",
1343
+ eventId: stamp.eventId,
1344
+ provider: PROVIDER,
1345
+ createdAt: stamp.createdAt,
1346
+ threadId: context.session.threadId,
1347
+ ...context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {},
1348
+ payload: {
1349
+ subagent: input.subagent,
1350
+ ...input.status ? { status: input.status } : {},
1351
+ ...input.summary ? { summary: input.summary } : {},
1352
+ ...input.detail ? { detail: input.detail } : {},
1353
+ ...input.usage !== void 0 ? { usage: input.usage } : {}
1354
+ },
1355
+ providerRefs: nativeProviderRefs(context),
1356
+ raw: {
1357
+ source: "claude.sdk.message",
1358
+ method: sdkNativeMethod(input.raw),
1359
+ messageType: `${input.raw.type}:${sdkMessageSubtype(input.raw) ?? ""}`,
1360
+ payload: input.raw
1361
+ }
1362
+ });
1363
+ });
1364
+ const emitClaudeSubagentCompleted = effect.Effect.fn("emitClaudeSubagentCompleted")(function* (context, input) {
1365
+ const key = String(input.subagent.subagentId);
1366
+ if (context.completedSubagentIds.has(key)) return;
1367
+ yield* emitClaudeSubagentStarted(context, input.subagent, input.raw);
1368
+ context.completedSubagentIds.add(key);
1369
+ const stamp = yield* makeEventStamp();
1370
+ yield* offerRuntimeEvent({
1371
+ type: "subagent.completed",
1372
+ eventId: stamp.eventId,
1373
+ provider: PROVIDER,
1374
+ createdAt: stamp.createdAt,
1375
+ threadId: context.session.threadId,
1376
+ ...context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {},
1377
+ payload: {
1378
+ subagent: input.subagent,
1379
+ status: input.status,
1380
+ ...input.summary ? { summary: input.summary } : {},
1381
+ ...input.usage !== void 0 ? { usage: input.usage } : {}
1382
+ },
1383
+ providerRefs: nativeProviderRefs(context),
1384
+ raw: {
1385
+ source: "claude.sdk.message",
1386
+ method: sdkNativeMethod(input.raw),
1387
+ messageType: `${input.raw.type}:${sdkMessageSubtype(input.raw) ?? ""}`,
1388
+ payload: input.raw
1389
+ }
1390
+ });
1391
+ });
1245
1392
  const logNativeSdkMessage = effect.Effect.fn("logNativeSdkMessage")(function* (context, message) {
1246
1393
  if (!nativeEventLogger) return;
1247
1394
  const observedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -2029,6 +2176,11 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
2029
2176
  ...message.task_type ? { taskType: message.task_type } : {}
2030
2177
  }
2031
2178
  });
2179
+ if (isClaudeSubagentTaskMessage(message)) {
2180
+ const subagent = makeClaudeTaskSubagentRef(context.subagentByTaskId.get(message.task_id), message);
2181
+ context.subagentByTaskId.set(message.task_id, subagent);
2182
+ yield* emitClaudeSubagentStarted(context, subagent, message);
2183
+ }
2032
2184
  return;
2033
2185
  case "task_progress":
2034
2186
  if (message.usage) {
@@ -2056,6 +2208,18 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
2056
2208
  ...message.last_tool_name ? { lastToolName: message.last_tool_name } : {}
2057
2209
  }
2058
2210
  });
2211
+ if (isClaudeSubagentTaskMessage(message) || context.subagentByTaskId.has(message.task_id)) {
2212
+ const subagent = makeClaudeTaskSubagentRef(context.subagentByTaskId.get(message.task_id), message);
2213
+ context.subagentByTaskId.set(message.task_id, subagent);
2214
+ yield* emitClaudeSubagentUpdated(context, {
2215
+ subagent,
2216
+ status: claudeTaskSubagentStatus("running"),
2217
+ ...message.summary ? { summary: message.summary } : {},
2218
+ detail: message.description,
2219
+ ...message.usage ? { usage: message.usage } : {},
2220
+ raw: message
2221
+ });
2222
+ }
2059
2223
  return;
2060
2224
  case "task_notification":
2061
2225
  if (message.usage) {
@@ -2082,6 +2246,17 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
2082
2246
  ...message.usage ? { usage: message.usage } : {}
2083
2247
  }
2084
2248
  });
2249
+ if (isClaudeSubagentTaskMessage(message) || context.subagentByTaskId.has(message.task_id)) {
2250
+ const subagent = makeClaudeTaskSubagentRef(context.subagentByTaskId.get(message.task_id), message);
2251
+ context.subagentByTaskId.set(message.task_id, subagent);
2252
+ yield* emitClaudeSubagentCompleted(context, {
2253
+ subagent,
2254
+ status: claudeTaskCompletionStatus(message.status),
2255
+ ...message.summary ? { summary: message.summary } : {},
2256
+ ...message.usage ? { usage: message.usage } : {},
2257
+ raw: message
2258
+ });
2259
+ }
2085
2260
  return;
2086
2261
  case "files_persisted":
2087
2262
  yield* offerRuntimeEvent({
@@ -2630,6 +2805,9 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
2630
2805
  lastKnownTokenUsage: void 0,
2631
2806
  lastAssistantUuid: resumeState?.resumeSessionAt,
2632
2807
  lastThreadStartedId: void 0,
2808
+ subagentByTaskId: /* @__PURE__ */ new Map(),
2809
+ startedSubagentIds: /* @__PURE__ */ new Set(),
2810
+ completedSubagentIds: /* @__PURE__ */ new Set(),
2633
2811
  stopped: false
2634
2812
  };
2635
2813
  yield* effect.Ref.set(contextRef, context);
@@ -2800,7 +2978,7 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
2800
2978
  return context !== void 0 && !context.stopped;
2801
2979
  });
2802
2980
  const stopAll = () => effect.Effect.forEach(sessions, ([, context]) => stopSessionInternal(context, { emitExitEvent: true }), { discard: true });
2803
- yield* effect.Effect.addFinalizer(() => effect.Effect.forEach(sessions, ([, context]) => stopSessionInternal(context, { emitExitEvent: false }), { discard: true }).pipe(effect.Effect.tap(() => effect.Queue.shutdown(runtimeEventQueue))));
2981
+ yield* effect.Effect.addFinalizer(() => effect.Effect.forEach(sessions, ([, context]) => stopSessionInternal(context, { emitExitEvent: false }), { discard: true }).pipe(effect.Effect.tap(() => runtimeEventQueueMetrics.reset), effect.Effect.tap(() => effect.Queue.shutdown(runtimeEventQueue))));
2804
2982
  return {
2805
2983
  provider: PROVIDER,
2806
2984
  capabilities: { sessionModelSwitch: "in-session" },
@@ -2816,7 +2994,7 @@ const makeClaudeAdapter = effect.Effect.fn("makeClaudeAdapter")(function* (claud
2816
2994
  hasSession,
2817
2995
  stopAll,
2818
2996
  get streamEvents() {
2819
- return effect.Stream.fromQueue(runtimeEventQueue);
2997
+ return effect.Stream.fromQueue(runtimeEventQueue).pipe(effect.Stream.tap(() => runtimeEventQueueMetrics.recordDequeued()));
2820
2998
  }
2821
2999
  };
2822
3000
  });
@@ -3066,6 +3244,7 @@ const ClaudeDriver = {
3066
3244
  const spawner = yield* effect_unstable_process.ChildProcessSpawner.ChildProcessSpawner;
3067
3245
  const path = yield* effect.Path.Path;
3068
3246
  const httpClient = yield* effect_unstable_http.HttpClient.HttpClient;
3247
+ const serverSettings = yield* require_bin.ServerSettingsService;
3069
3248
  const eventLoggers = yield* require_bin.ProviderEventLoggers;
3070
3249
  const processEnv = require_bin.mergeProviderInstanceEnvironment(environment);
3071
3250
  const fallbackContinuationIdentity = require_ProviderDriver.defaultProviderContinuationIdentity({
@@ -3112,7 +3291,7 @@ const ClaudeDriver = {
3112
3291
  haveSettingsChanged: () => false,
3113
3292
  initialSnapshot: (settings) => stampIdentity(makePendingClaudeProvider(settings)),
3114
3293
  checkProvider,
3115
- enrichSnapshot: ({ snapshot, publishSnapshot }) => require_bin.enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(effect.Effect.provideService(effect_unstable_http.HttpClient.HttpClient, httpClient), effect.Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot))),
3294
+ enrichSnapshot: ({ snapshot, publishSnapshot }) => require_bin.enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(effect.Effect.provideService(effect_unstable_http.HttpClient.HttpClient, httpClient), effect.Effect.provideService(require_bin.ServerSettingsService, serverSettings), effect.Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot))),
3116
3295
  refreshInterval: null
3117
3296
  }).pipe(effect.Effect.mapError((cause) => new require_bin.ProviderDriverError({
3118
3297
  driver: DRIVER_KIND,