ryco-cli 0.1.6 → 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 (152) hide show
  1. package/dist/{AzureDevOpsSourceControlProvider-6holYS_D.cjs → AzureDevOpsSourceControlProvider-5exivY-1.cjs} +2 -2
  2. package/dist/{AzureDevOpsSourceControlProvider-CC2_COxP.mjs → AzureDevOpsSourceControlProvider-CF5LuCHp.mjs} +2 -2
  3. package/dist/{BitbucketSourceControlProvider-a0IsNFyG.cjs → BitbucketSourceControlProvider-1GWENqcl.cjs} +2 -2
  4. package/dist/{BitbucketSourceControlProvider-CYR_BD1d.mjs → BitbucketSourceControlProvider-CKH09tfT.mjs} +2 -2
  5. package/dist/{ClaudeDriver-C6tQNEWO.cjs → ClaudeDriver-BXLdjrht.cjs} +177 -4
  6. package/dist/{ClaudeDriver-D3nsxwH9.mjs → ClaudeDriver-WwWFTu61.mjs} +178 -5
  7. package/dist/{CodexDriver-BILrJG8o.mjs → CodexDriver-93-TmCrO.mjs} +6 -5
  8. package/dist/{CodexDriver-ms_YgFD7.cjs → CodexDriver-BboMT9uk.cjs} +5 -4
  9. package/dist/{CodexTextGeneration-CHEgoANm.cjs → CodexTextGeneration-0pRbJji3.cjs} +2 -2
  10. package/dist/{CodexTextGeneration-BIKHl7E3.mjs → CodexTextGeneration-BU9Myn87.mjs} +3 -3
  11. package/dist/{CopilotDriver-CmD3Ffyl.mjs → CopilotDriver-BASi8pJ0.mjs} +4 -4
  12. package/dist/{CopilotDriver-B0--ZwIK.cjs → CopilotDriver-DCsv-17W.cjs} +3 -3
  13. package/dist/{CursorDriver-DTVPXZ-R.cjs → CursorDriver-BTSiM3A8.cjs} +161 -14
  14. package/dist/{CursorDriver-CbeaIbdb.mjs → CursorDriver-D5LvIqUk.mjs} +162 -15
  15. package/dist/{ForgejoSourceControlProvider-DwAog76b.cjs → ForgejoSourceControlProvider-BTXRDCGB.cjs} +2 -2
  16. package/dist/{ForgejoSourceControlProvider-DX6d9gvz.mjs → ForgejoSourceControlProvider-e-4hvvZ_.mjs} +2 -2
  17. package/dist/{GitHubSourceControlProvider-C-LGwho3.mjs → GitHubSourceControlProvider-26IofDAO.mjs} +2 -2
  18. package/dist/{GitHubSourceControlProvider-9lJFzjsu.cjs → GitHubSourceControlProvider-DWmwkA_y.cjs} +2 -2
  19. package/dist/{GitLabSourceControlProvider-CvKA74lg.cjs → GitLabSourceControlProvider-D-YHnxRe.cjs} +2 -2
  20. package/dist/{GitLabSourceControlProvider-CkeT2aEx.mjs → GitLabSourceControlProvider-DePct78W.mjs} +2 -2
  21. package/dist/{OpenCodeDriver-ClWtCk0j.mjs → OpenCodeDriver-BhvLOmvn.mjs} +325 -38
  22. package/dist/{OpenCodeDriver-CXUsnl5o.cjs → OpenCodeDriver-CVeZ4n9-.cjs} +324 -37
  23. package/dist/{SourceControlProviderDiscoveryCatalog-_rg0mc1o.cjs → SourceControlProviderDiscoveryCatalog-DeFR5xH3.cjs} +1 -64
  24. package/dist/{SourceControlProviderDiscoveryCatalog-yMDer_Yh.mjs → SourceControlProviderDiscoveryCatalog-mJV_Xitr.mjs} +3 -48
  25. package/dist/bin.cjs +1280 -519
  26. package/dist/bin.mjs +1234 -474
  27. package/dist/client/assets/{AnimatedHeight-DgItDSis.js → AnimatedHeight-BSU0lzYs.js} +1 -1
  28. package/dist/client/assets/AppearanceSettings-D7q0ujGK.js +1 -0
  29. package/dist/client/assets/{BranchToolbar.logic-C_xHEt9C.js → BranchToolbar.logic-CZIFSvhd.js} +1 -1
  30. package/dist/client/assets/ChatRightPanel-CWHOIuiQ.js +188 -0
  31. package/dist/client/assets/{ChatThreadRouteView-CV6ETYG5.js → ChatThreadRouteView-bA7xWXzc.js} +1 -1
  32. package/dist/client/assets/{CommandPaletteDialog-C_H7R8S5.js → CommandPaletteDialog-DNYaVOZO.js} +1 -1
  33. package/dist/client/assets/CompositeRoot-B_KEfCUE.js +1 -0
  34. package/dist/client/assets/ConnectionsSettings-CLZPbx_K.js +1 -0
  35. package/dist/client/assets/{DiagnosticsSettings-B340S_mq.js → DiagnosticsSettings-DtzPCb6N.js} +1 -1
  36. package/dist/client/assets/{DialogHandle-BJY7cHCV.js → DialogHandle-DuHnmWoE.js} +1 -1
  37. package/dist/client/assets/{DialogRoot-Ej1FVk-_.js → DialogRoot-BV25qAcA.js} +1 -1
  38. package/dist/client/assets/DialogTitle-DQsi-RTa.js +1 -0
  39. package/dist/client/assets/DialogTrigger-D0fA01C6.js +1 -0
  40. package/dist/client/assets/{DialogViewport-DvjAl76K.js → DialogViewport-CMV_BePU.js} +1 -1
  41. package/dist/client/assets/{DraftChatThreadRouteView-pOkyeKPS.js → DraftChatThreadRouteView-BoiKnrii.js} +1 -1
  42. package/dist/client/assets/{JetBrainsIcons-DTTF47I0.js → JetBrainsIcons-BcPxJlMf.js} +1 -1
  43. package/dist/client/assets/{KeybindingsSettings-CW3RRi-7.js → KeybindingsSettings-LuI98pdF.js} +1 -1
  44. package/dist/client/assets/McpServersSettings-BFMuWYVV.js +6 -0
  45. package/dist/client/assets/{NoActiveThreadState-DVHwrkCp.js → NoActiveThreadState-C2q_O1kP.js} +1 -1
  46. package/dist/client/assets/{OpinionatedPluginsSettings-Cjj23Fs4.js → OpinionatedPluginsSettings-Bqwct37O.js} +1 -1
  47. package/dist/client/assets/{ProjectFavicon-TDP7HRfn.js → ProjectFavicon-D2imiJ8M.js} +1 -1
  48. package/dist/client/assets/{ProviderUpdateLaunchNotification.logic-6TpFsmiI.js → ProviderUpdateLaunchNotification.logic-CJgA--nK.js} +1 -1
  49. package/dist/client/assets/ProvidersSettingsPanel-B97vbeu6.js +1 -0
  50. package/dist/client/assets/{RedactedSensitiveText-BfoVjPsE.js → RedactedSensitiveText-B2GFTyfq.js} +1 -1
  51. package/dist/client/assets/RootAppShell-C1xTR98P.js +12 -0
  52. package/dist/client/assets/SettingsDialog-Q0Q8O5oH.js +2 -0
  53. package/dist/client/assets/SourceControlSettings-KAvoPTNi.js +1 -0
  54. package/dist/client/assets/StatisticsPanel-BzsQ444K.js +64 -0
  55. package/dist/client/assets/{ThreadStatusIndicators-B0leIJGD.js → ThreadStatusIndicators-Cw_jLVQf.js} +1 -1
  56. package/dist/client/assets/{ThreadTerminalDrawer-COq2Fk17.js → ThreadTerminalDrawer-D1WnSemH.js} +17 -17
  57. package/dist/client/assets/ThreadWorkspacePanel-L4qCPTOA.js +166 -0
  58. package/dist/client/assets/{alert-dialog-lMfKpG2t.js → alert-dialog-CNmKa0BK.js} +1 -1
  59. package/dist/client/assets/chart-column-BWSKYZ_a.js +1 -0
  60. package/dist/client/assets/{chatThreadActions-PPyTj_x0.js → chatThreadActions-TtDsiwDC.js} +1 -1
  61. package/dist/client/assets/chevron-up-zopJ_99l.js +1 -0
  62. package/dist/client/assets/{clamp-JiD4IZ0Z.js → clamp-Ds6WJu8j.js} +1 -1
  63. package/dist/client/assets/{clipboard-copy-CYBLSG2q.js → clipboard-copy-BoJGpdmJ.js} +1 -1
  64. package/dist/client/assets/clock-CzUHThzk.js +1 -0
  65. package/dist/client/assets/{commandPaletteStore-uVfCD7zE.js → commandPaletteStore-KebG835b.js} +1 -1
  66. package/dist/client/assets/composerDraftStore-DpPEQ6BN.js +21 -0
  67. package/dist/client/assets/{desktopUpdateAtoms-X6uM5SoD.js → desktopUpdateAtoms-BQ0GGEfM.js} +1 -1
  68. package/dist/client/assets/{download-DLBlpp4h.js → download-CUiRE0N9.js} +1 -1
  69. package/dist/client/assets/{draft-input-dLlVMl5P.js → draft-input-CwpGDtoT.js} +1 -1
  70. package/dist/client/assets/editorPreferences-jN7DKbyt.js +1 -0
  71. package/dist/client/assets/{empty-DlLY-Hhj.js → empty-CBuXePtg.js} +1 -1
  72. package/dist/client/assets/{group-zDBPF7rR.js → group-BpZvxjG5.js} +1 -1
  73. package/dist/client/assets/{index-Dq8sT2lF.js → index-BKzXTNJ_.js} +2 -2
  74. package/dist/client/assets/{input-B9-RWT56.js → input-CgDawd6k.js} +1 -1
  75. package/dist/client/assets/kbd-QYSL97CK.js +1 -0
  76. package/dist/client/assets/{keybindings-Dx4Nc1vY.js → keybindings-CUTRYI_A.js} +1 -1
  77. package/dist/client/assets/{keyboard-DDTWQkr0.js → keyboard-DFFiI7JY.js} +1 -1
  78. package/dist/client/assets/{keyedQuery-Ds4OGhX2.js → keyedQuery-DiOCbGH0.js} +0 -0
  79. package/dist/client/assets/{main-DxfpmoKJ.js → main-BgFGju3e.js} +3 -3
  80. package/dist/client/assets/main-D0UFdwts.css +2 -0
  81. package/dist/client/assets/{palette-BQcz-ZYV.js → palette-BXCL909c.js} +1 -1
  82. package/dist/client/assets/{play-QloDGe4R.js → play-DI2LZohg.js} +1 -1
  83. package/dist/client/assets/plus-DzgIfHUF.js +1 -0
  84. package/dist/client/assets/projectAtoms-DXXpuERK.js +1 -0
  85. package/dist/client/assets/providerDriverMeta-CRNNp0q3.js +1 -0
  86. package/dist/client/assets/providerIconUtils-D-DFhem2.js +47 -0
  87. package/dist/client/assets/radio-group-_PPYg3YY.js +1 -0
  88. package/dist/client/assets/{refresh-cw-DkBMGllm.js → refresh-cw-BsQTNBXl.js} +1 -1
  89. package/dist/client/assets/{resolveAriaLabelledBy-DDfIbj05.js → resolveAriaLabelledBy-CRHo_s16.js} +1 -1
  90. package/dist/client/assets/{rightPanelRouteSearch-DfuWVvXN.js → rightPanelRouteSearch-CfmZ7osj.js} +1 -1
  91. package/dist/client/assets/{scale-BActunFu.js → scale-DDEJ-tvn.js} +1 -1
  92. package/dist/client/assets/{scroll-area-D-YOUG02.js → scroll-area-HgsI-ErG.js} +1 -1
  93. package/dist/client/assets/{separator-TInKeIDo.js → separator-ClnL4mUB.js} +1 -1
  94. package/dist/client/assets/{server-BtEG3NAw.js → server-Bbs3L-6_.js} +1 -1
  95. package/dist/client/assets/{session-logic-DNf1aXq_.js → session-logic-CKQkgIwo.js} +1 -1
  96. package/dist/client/assets/settingsDialogStore-SG-W1q0A.js +1 -0
  97. package/dist/client/assets/{settingsLayout-D22Mm0u3.js → settingsLayout-G5xVm-ZT.js} +1 -1
  98. package/dist/client/assets/sidebar-_u7SGgmC.js +1 -0
  99. package/dist/client/assets/sidebarStatusText-BTYnwflG.js +1 -0
  100. package/dist/client/assets/{skeleton-DWaac_qp.js → skeleton-CmUvhZGP.js} +1 -1
  101. package/dist/client/assets/{storeSelectors-Cx1IYPA4.js → storeSelectors-DhJRpdiw.js} +1 -1
  102. package/dist/client/assets/threadSelectionStore-ygmA4DNA.js +1 -0
  103. package/dist/client/assets/toast-DmA_ziPT.js +1 -0
  104. package/dist/client/assets/toggle-DGS7tKuj.js +1 -0
  105. package/dist/client/assets/{toggle-group-CnLjaHSL.js → toggle-group-Dtv1ZUFW.js} +1 -1
  106. package/dist/client/assets/{tokenModePresentation-BSYdIvBm.js → tokenModePresentation-Dor1DnBx.js} +1 -1
  107. package/dist/client/assets/{trash-2-BI5xcbsm.js → trash-2-C2G3VGoV.js} +1 -1
  108. package/dist/client/assets/{triangle-alert-DJef_Uvh.js → triangle-alert-Bpz3xGu5.js} +1 -1
  109. package/dist/client/assets/{undo-2-DeZ2cMGS.js → undo-2-C3rtxuqZ.js} +1 -1
  110. package/dist/client/assets/{useHandleNewThread-XB82O6SA.js → useHandleNewThread-ypSbzG0P.js} +1 -1
  111. package/dist/client/assets/useLabelableId-Bc7KEnHU.js +1 -0
  112. package/dist/client/assets/{useNavigate-B2tgshhW.js → useNavigate-_4hWGSey.js} +1 -1
  113. package/dist/client/assets/useTheme-HcKmBfpF.js +1 -0
  114. package/dist/client/assets/{vscode-icons-DM9qFoEr.js → vscode-icons-DdSTtxYd.js} +1 -1
  115. package/dist/client/assets/{wrench-je4QOyG-.js → wrench-C4jdis40.js} +1 -1
  116. package/dist/client/assets/x-CG2WU63t.js +1 -0
  117. package/dist/client/index.html +1 -1
  118. package/dist/{collectUint8StreamText-C2z5Y8tF.mjs → collectUint8StreamText-Lv4GGI79.mjs} +269 -14
  119. package/dist/{collectUint8StreamText-TCG6xW_P.cjs → collectUint8StreamText-uNXVRHOf.cjs} +291 -12
  120. package/dist/{makeManagedServerProvider-DPFw9gV_.cjs → makeManagedServerProvider-3SD-Q5xh.cjs} +1 -1
  121. package/dist/{makeManagedServerProvider-BXO8QvzC.mjs → makeManagedServerProvider-CkPEptun.mjs} +1 -1
  122. package/package.json +1 -1
  123. package/dist/client/assets/AppearanceSettings-BlsMFBvJ.js +0 -1
  124. package/dist/client/assets/ChatRightPanel-CThudBb1.js +0 -188
  125. package/dist/client/assets/CompositeRoot-DjnzUIwC.js +0 -1
  126. package/dist/client/assets/ConnectionsSettings-hArR4Oe3.js +0 -1
  127. package/dist/client/assets/DialogTitle-H1yIMmA9.js +0 -1
  128. package/dist/client/assets/DialogTrigger-BHMq_K2G.js +0 -1
  129. package/dist/client/assets/McpServersSettings-dQ3BzOWY.js +0 -6
  130. package/dist/client/assets/ProvidersSettingsPanel-D15EeWAq.js +0 -1
  131. package/dist/client/assets/RootAppShell-CWBPSA2w.js +0 -12
  132. package/dist/client/assets/SettingsDialog-oJCE5foT.js +0 -2
  133. package/dist/client/assets/SourceControlSettings-CPnlMxNm.js +0 -1
  134. package/dist/client/assets/ThreadWorkspacePanel-qF9y6QT9.js +0 -166
  135. package/dist/client/assets/composerDraftStore-D12lUSfh.js +0 -21
  136. package/dist/client/assets/editorPreferences-BLeEBSD_.js +0 -1
  137. package/dist/client/assets/folder-open-DMjz0lpx.js +0 -1
  138. package/dist/client/assets/kbd-aeSsjiPI.js +0 -1
  139. package/dist/client/assets/main-C57RhHZ_.css +0 -2
  140. package/dist/client/assets/plus-4Oy56d-3.js +0 -1
  141. package/dist/client/assets/projectAtoms-DUEBb7Zz.js +0 -1
  142. package/dist/client/assets/providerDriverMeta-Dwi6Zqgd.js +0 -1
  143. package/dist/client/assets/providerIconUtils-uhWb4bdg.js +0 -47
  144. package/dist/client/assets/radio-group-DHyQlLeX.js +0 -1
  145. package/dist/client/assets/settingsDialogStore-BINi7pdD.js +0 -1
  146. package/dist/client/assets/sidebar-DHwNQmWp.js +0 -1
  147. package/dist/client/assets/threadSelectionStore-C0ig4405.js +0 -1
  148. package/dist/client/assets/toast-DE7a4wkW.js +0 -1
  149. package/dist/client/assets/toggle-BIW4AyPY.js +0 -1
  150. package/dist/client/assets/useLabelableId-DBAgv9qQ.js +0 -1
  151. package/dist/client/assets/useTheme-Dv42Z8uy.js +0 -1
  152. package/dist/client/assets/x-fI9snvD3.js +0 -1
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { In as ProviderDriverKind, Ln as ProviderInstanceId, R as OpenCodeSettings, mr as RuntimeRequestId, or as EventId, pr as RuntimeItemId, v as TextGenerationError, vr as TurnId } from "./collectUint8StreamText-C2z5Y8tF.mjs";
3
+ import { Bn as ProviderInstanceId, Sr as TurnId, V as OpenCodeSettings, _r as RuntimeRequestId, gr as RuntimeItemId, hr as ProviderItemId, lr as EventId, vr as RuntimeSubagentId, x as TextGenerationError, zn as ProviderDriverKind } from "./collectUint8StreamText-Lv4GGI79.mjs";
4
4
  import { U as sanitizeBranchFragment, W as sanitizeFeatureBranchName, Y as ServerConfig } from "./Metrics-6Xj17Se3.mjs";
5
- import { A as nonEmptyTrimmed, E as buildServerProvider, F as ProviderAdapterRequestError, I as ProviderAdapterSessionClosedError, L as ProviderAdapterSessionNotFoundError, M as providerModelsFromSettings, P as ProviderAdapterProcessError, Qt as makePackageManagedProviderMaintenanceResolver, R as ProviderAdapterValidationError, Xt as enrichProviderSnapshotWithVersionAdvisory, a as OpenCodeRuntime, c as openCodeQuestionId, d as runOpenCodeSdk, f as toOpenCodeFileParts, g as makeEventNdjsonLogger, h as ProviderEventLoggers, in as resolveAttachmentPath, j as parseGenericCliVersion, l as openCodeRuntimeErrorDetail, ln as getModelSelectionStringOptionValue, m as toOpenCodeQuestionAnswers, nn as resolveProviderMaintenanceCapabilitiesEffect, o as OpenCodeRuntimeError, p as toOpenCodePermissionReply, rn as compareCliVersions, s as buildOpenCodePermissionRules, sn as createModelCapabilities, t as makeServerQueueMetrics, tn as normalizeCommandPath, u as parseOpenCodeModelSlug, y as mergeProviderInstanceEnvironment, z as ProviderDriverError } from "./bin.mjs";
6
- import { a as buildIssueContentTitlePrompt, c as extractJsonObject, d as sanitizePrTitle, f as sanitizeThreadTitle, i as buildIssueContentPolishPrompt, n as buildBranchNamePrompt, o as buildPrContentPrompt, r as buildCommitMessagePrompt, s as buildThreadTitlePrompt, t as makeManagedServerProvider, u as sanitizeCommitSubject } from "./makeManagedServerProvider-BXO8QvzC.mjs";
5
+ import { A as nonEmptyTrimmed, E as buildServerProvider, F as ProviderAdapterRequestError, I as ProviderAdapterSessionClosedError, L as ProviderAdapterSessionNotFoundError, M as providerModelsFromSettings, P as ProviderAdapterProcessError, Qt as makePackageManagedProviderMaintenanceResolver, R as ProviderAdapterValidationError, Xt as enrichProviderSnapshotWithVersionAdvisory, a as OpenCodeRuntime, an as resolveAttachmentPath, c as openCodeQuestionId, cn as createModelCapabilities, d as runOpenCodeSdk, f as toOpenCodeFileParts, g as makeEventNdjsonLogger, h as ProviderEventLoggers, in as ServerSettingsService, j as parseGenericCliVersion, l as openCodeRuntimeErrorDetail, m as toOpenCodeQuestionAnswers, nn as resolveProviderMaintenanceCapabilitiesEffect, o as OpenCodeRuntimeError, p as toOpenCodePermissionReply, rn as compareCliVersions, s as buildOpenCodePermissionRules, t as makeServerQueueMetrics, tn as normalizeCommandPath, u as parseOpenCodeModelSlug, un as getModelSelectionStringOptionValue, y as mergeProviderInstanceEnvironment, z as ProviderDriverError } from "./bin.mjs";
6
+ import { a as buildIssueContentTitlePrompt, c as extractJsonObject, d as sanitizePrTitle, f as sanitizeThreadTitle, i as buildIssueContentPolishPrompt, n as buildBranchNamePrompt, o as buildPrContentPrompt, r as buildCommitMessagePrompt, s as buildThreadTitlePrompt, t as makeManagedServerProvider, u as sanitizeCommitSubject } from "./makeManagedServerProvider-CkPEptun.mjs";
7
7
  import { t as formatSourceControlContextsForAgent } from "./sourceControlContextFormatter-DEwpnVAH.mjs";
8
8
  import { t as defaultProviderContinuationIdentity } from "./ProviderDriver-kCV60GKk.mjs";
9
9
  import { Cause, Data, Effect, Exit, Fiber, Queue, Random, Ref, Schema, Scope, Stream } from "effect";
@@ -279,6 +279,68 @@ const PROVIDER$1 = ProviderDriverKind.make("opencode");
279
279
  function nowIso() {
280
280
  return (/* @__PURE__ */ new Date()).toISOString();
281
281
  }
282
+ function nonEmptyString(value) {
283
+ const trimmed = value?.trim();
284
+ return trimmed && trimmed.length > 0 ? trimmed : void 0;
285
+ }
286
+ function scopedOpenCodeId(sessionId, id) {
287
+ return `${sessionId}:${id}`;
288
+ }
289
+ function openCodeSubagentId(kind, id) {
290
+ return RuntimeSubagentId.make(`opencode:${kind}:${id}`);
291
+ }
292
+ function subagentKey(subagentId) {
293
+ return String(subagentId);
294
+ }
295
+ function statusFromOpenCodeSubagentState(status) {
296
+ return status;
297
+ }
298
+ function subagentCompletionStatus(status) {
299
+ return status;
300
+ }
301
+ function metadataWithEntries(entries) {
302
+ const metadata = Object.fromEntries(entries.filter(([, value]) => value !== void 0 && value !== null && value !== ""));
303
+ return Object.keys(metadata).length > 0 ? metadata : void 0;
304
+ }
305
+ function makeSubtaskSubagentRef(part) {
306
+ const description = nonEmptyString(part.description) ?? nonEmptyString(part.prompt);
307
+ const label = nonEmptyString(part.agent) ?? nonEmptyString(part.command) ?? (description ? "OpenCode subtask" : void 0);
308
+ return {
309
+ subagentId: openCodeSubagentId("subtask", part.id),
310
+ origin: "native",
311
+ capability: "summary",
312
+ ...label ? { label } : {},
313
+ ...description ? { description } : {},
314
+ parentProviderItemId: ProviderItemId.make(part.id),
315
+ metadata: metadataWithEntries([
316
+ ["source", "opencode.subtask"],
317
+ ["prompt", nonEmptyString(part.prompt)],
318
+ ["agent", nonEmptyString(part.agent)],
319
+ ["command", nonEmptyString(part.command)],
320
+ ["model", part.model]
321
+ ])
322
+ };
323
+ }
324
+ function mergeOpenCodeChildSessionRef(existing, session, parentSessionId) {
325
+ const label = nonEmptyString(session.title) ?? existing?.label ?? "OpenCode subagent";
326
+ return {
327
+ subagentId: existing?.subagentId ?? openCodeSubagentId("session", session.id),
328
+ origin: "native",
329
+ capability: "transcript",
330
+ label,
331
+ ...existing?.description ? { description: existing.description } : {},
332
+ providerSessionId: session.id,
333
+ providerThreadId: session.id,
334
+ ...existing?.parentProviderItemId && { parentProviderItemId: existing.parentProviderItemId },
335
+ metadata: {
336
+ ...existing?.metadata,
337
+ source: "opencode.session",
338
+ parentSessionId,
339
+ slug: session.slug,
340
+ directory: session.directory
341
+ }
342
+ };
343
+ }
282
344
  /**
283
345
  * Map a tagged OpenCodeRuntimeError produced by {@link runOpenCodeSdk} into
284
346
  * the adapter-boundary `ProviderAdapterRequestError`. SDK-method-level call
@@ -422,7 +484,7 @@ function isoFromEpochMs(value) {
422
484
  return new Date(value).toISOString();
423
485
  }
424
486
  function messageRoleForPart(context, part) {
425
- const known = context.messageRoleById.get(part.messageID);
487
+ const known = context.messageRoleById.get(scopedOpenCodeId(part.sessionID, part.messageID));
426
488
  if (known) return known;
427
489
  return part.type === "tool" ? "assistant" : void 0;
428
490
  }
@@ -493,6 +555,122 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
493
555
  const emit = (event) => Queue.offer(runtimeEvents, event).pipe(Effect.andThen(runtimeEventQueueMetrics.recordEnqueued()), Effect.asVoid);
494
556
  const writeNativeEvent = (threadId, event) => nativeEventLogger ? nativeEventLogger.write(event, threadId) : Effect.void;
495
557
  const writeNativeEventBestEffort = (threadId, event) => writeNativeEvent(threadId, event).pipe(Effect.catchCause(() => Effect.void));
558
+ const emitOpenCodeSubagentStarted = Effect.fn("emitOpenCodeSubagentStarted")(function* (context, subagent, raw) {
559
+ const key = subagentKey(subagent.subagentId);
560
+ if (context.startedSubagentIds.has(key)) return;
561
+ context.startedSubagentIds.add(key);
562
+ yield* emit({
563
+ ...yield* buildEventBase({
564
+ threadId: context.session.threadId,
565
+ turnId: context.activeTurnId,
566
+ raw
567
+ }),
568
+ type: "subagent.started",
569
+ payload: { subagent }
570
+ });
571
+ });
572
+ const emitOpenCodeSubagentUpdated = Effect.fn("emitOpenCodeSubagentUpdated")(function* (context, input) {
573
+ yield* emitOpenCodeSubagentStarted(context, input.subagent, input.raw);
574
+ yield* emit({
575
+ ...yield* buildEventBase({
576
+ threadId: context.session.threadId,
577
+ turnId: context.activeTurnId,
578
+ raw: input.raw
579
+ }),
580
+ type: "subagent.updated",
581
+ payload: {
582
+ subagent: input.subagent,
583
+ ...input.status ? { status: input.status } : {},
584
+ ...input.summary ? { summary: input.summary } : {},
585
+ ...input.detail ? { detail: input.detail } : {}
586
+ }
587
+ });
588
+ });
589
+ const emitOpenCodeSubagentCompleted = Effect.fn("emitOpenCodeSubagentCompleted")(function* (context, input) {
590
+ const key = subagentKey(input.subagent.subagentId);
591
+ if (context.completedSubagentIds.has(key)) return;
592
+ yield* emitOpenCodeSubagentStarted(context, input.subagent, input.raw);
593
+ context.completedSubagentIds.add(key);
594
+ yield* emit({
595
+ ...yield* buildEventBase({
596
+ threadId: context.session.threadId,
597
+ turnId: context.activeTurnId,
598
+ raw: input.raw
599
+ }),
600
+ type: "subagent.completed",
601
+ payload: {
602
+ subagent: input.subagent,
603
+ status: input.status,
604
+ ...input.summary ? { summary: input.summary } : {}
605
+ }
606
+ });
607
+ });
608
+ const bindOpenCodeSubtaskPart = Effect.fn("bindOpenCodeSubtaskPart")(function* (context, part, raw) {
609
+ const partKey = scopedOpenCodeId(part.sessionID, part.id);
610
+ const existing = context.subagentBySubtaskPartId.get(partKey);
611
+ const subagent = existing ?? makeSubtaskSubagentRef(part);
612
+ context.subagentBySubtaskPartId.set(partKey, subagent);
613
+ if (!existing && !context.unboundSubtaskPartIds.includes(partKey)) context.unboundSubtaskPartIds.push(partKey);
614
+ yield* emitOpenCodeSubagentUpdated(context, {
615
+ subagent,
616
+ status: statusFromOpenCodeSubagentState("starting"),
617
+ summary: nonEmptyString(part.description) ?? nonEmptyString(part.prompt),
618
+ detail: nonEmptyString(part.prompt),
619
+ raw
620
+ });
621
+ return subagent;
622
+ });
623
+ const takeUnboundOpenCodeSubtask = (context) => {
624
+ const partKey = context.unboundSubtaskPartIds.shift();
625
+ if (!partKey) return;
626
+ return context.subagentBySubtaskPartId.get(partKey);
627
+ };
628
+ const registerOpenCodeChildSession = Effect.fn("registerOpenCodeChildSession")(function* (context, session, raw) {
629
+ if (session.parentID !== context.openCodeSessionId) return;
630
+ const subagent = mergeOpenCodeChildSessionRef(context.subagentBySessionId.get(session.id) ?? takeUnboundOpenCodeSubtask(context), session, context.openCodeSessionId);
631
+ const known = context.childSessionIds.has(session.id);
632
+ context.childSessionIds.add(session.id);
633
+ context.subagentBySessionId.set(session.id, subagent);
634
+ if (known) {
635
+ yield* emitOpenCodeSubagentUpdated(context, {
636
+ subagent,
637
+ status: statusFromOpenCodeSubagentState("running"),
638
+ raw
639
+ });
640
+ return subagent;
641
+ }
642
+ const wasStartedFromSubtask = context.startedSubagentIds.has(subagentKey(subagent.subagentId));
643
+ yield* emitOpenCodeSubagentStarted(context, subagent, raw);
644
+ if (wasStartedFromSubtask) yield* emitOpenCodeSubagentUpdated(context, {
645
+ subagent,
646
+ status: statusFromOpenCodeSubagentState("running"),
647
+ raw
648
+ });
649
+ return subagent;
650
+ });
651
+ const hydrateOpenCodeChildSessions = Effect.fn("hydrateOpenCodeChildSessions")(function* (context) {
652
+ const children = yield* runOpenCodeSdk("session.children", () => context.client.session.children({ sessionID: context.openCodeSessionId })).pipe(Effect.map((response) => {
653
+ const value = response;
654
+ if (Array.isArray(value)) return value;
655
+ const data = value.data;
656
+ return Array.isArray(data) ? data : [];
657
+ }), Effect.catchCause((cause) => Effect.gen(function* () {
658
+ const error = Cause.squash(cause);
659
+ yield* emit({
660
+ ...yield* buildEventBase({ threadId: context.session.threadId }),
661
+ type: "runtime.warning",
662
+ payload: {
663
+ message: "OpenCode child session hydration failed.",
664
+ detail: OpenCodeRuntimeError.is(error) ? error.detail : openCodeRuntimeErrorDetail(error)
665
+ }
666
+ });
667
+ return [];
668
+ })));
669
+ for (const child of children) yield* registerOpenCodeChildSession(context, child, {
670
+ method: "session.children",
671
+ child
672
+ });
673
+ });
496
674
  const emitUnexpectedExit = Effect.fn("emitUnexpectedExit")(function* (context, message) {
497
675
  if (yield* Ref.getAndSet(context.stopped, true)) return;
498
676
  const turnId = context.activeTurnId;
@@ -527,29 +705,52 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
527
705
  const emitAssistantTextDelta = Effect.fn("emitAssistantTextDelta")(function* (context, part, turnId, raw) {
528
706
  const text = textFromPart(part);
529
707
  if (text === void 0) return;
530
- const { latestText, deltaToEmit } = mergeOpenCodeAssistantText(context.emittedTextByPartId.get(part.id), text);
531
- context.emittedTextByPartId.set(part.id, latestText);
532
- if (latestText !== text) context.partById.set(part.id, part.type === "text" || part.type === "reasoning" ? {
708
+ const partKey = scopedOpenCodeId(part.sessionID, part.id);
709
+ const { latestText, deltaToEmit } = mergeOpenCodeAssistantText(context.emittedTextByPartId.get(partKey), text);
710
+ context.emittedTextByPartId.set(partKey, latestText);
711
+ if (latestText !== text) context.partById.set(partKey, part.type === "text" || part.type === "reasoning" ? {
533
712
  ...part,
534
713
  text: latestText
535
714
  } : part);
536
- if (deltaToEmit.length > 0) yield* emit({
537
- ...yield* buildEventBase({
538
- threadId: context.session.threadId,
539
- turnId,
540
- itemId: part.id,
541
- createdAt: part.type === "text" || part.type === "reasoning" ? isoFromEpochMs(part.time?.start) : void 0,
542
- raw
543
- }),
544
- type: "content.delta",
545
- payload: {
546
- streamKind: resolveTextStreamKind(part),
547
- delta: deltaToEmit
548
- }
549
- });
550
- if (part.type === "text" && part.time?.end !== void 0 && !context.completedAssistantPartIds.has(part.id)) {
551
- context.completedAssistantPartIds.add(part.id);
552
- yield* emit({
715
+ if (deltaToEmit.length > 0) {
716
+ const subagent = context.subagentBySessionId.get(part.sessionID);
717
+ if (subagent) yield* emit({
718
+ ...yield* buildEventBase({
719
+ threadId: context.session.threadId,
720
+ turnId,
721
+ itemId: part.id,
722
+ createdAt: part.type === "text" || part.type === "reasoning" ? isoFromEpochMs(part.time?.start) : void 0,
723
+ raw
724
+ }),
725
+ type: "subagent.message.delta",
726
+ payload: {
727
+ subagentId: subagent.subagentId,
728
+ delta: deltaToEmit,
729
+ streamKind: resolveTextStreamKind(part),
730
+ role: "assistant",
731
+ providerSessionId: part.sessionID,
732
+ providerThreadId: part.sessionID,
733
+ providerMessageId: part.messageID
734
+ }
735
+ });
736
+ else yield* emit({
737
+ ...yield* buildEventBase({
738
+ threadId: context.session.threadId,
739
+ turnId,
740
+ itemId: part.id,
741
+ createdAt: part.type === "text" || part.type === "reasoning" ? isoFromEpochMs(part.time?.start) : void 0,
742
+ raw
743
+ }),
744
+ type: "content.delta",
745
+ payload: {
746
+ streamKind: resolveTextStreamKind(part),
747
+ delta: deltaToEmit
748
+ }
749
+ });
750
+ }
751
+ if (part.type === "text" && part.time?.end !== void 0 && !context.completedAssistantPartIds.has(partKey)) {
752
+ context.completedAssistantPartIds.add(partKey);
753
+ if (!context.subagentBySessionId.get(part.sessionID)) yield* emit({
553
754
  ...yield* buildEventBase({
554
755
  threadId: context.session.threadId,
555
756
  turnId,
@@ -568,45 +769,73 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
568
769
  }
569
770
  });
570
771
  const handleSubscribedEvent = Effect.fn("handleSubscribedEvent")(function* (context, event) {
571
- if (("properties" in event ? event.properties.sessionID : void 0) !== context.openCodeSessionId) return;
772
+ const payloadSessionId = "properties" in event ? event.properties.sessionID : void 0;
773
+ const eventSessionId = typeof payloadSessionId === "string" ? payloadSessionId : void 0;
774
+ const isRootSessionEvent = eventSessionId === context.openCodeSessionId;
775
+ const isKnownChildSessionEvent = eventSessionId !== void 0 && context.childSessionIds.has(eventSessionId);
776
+ const isChildSessionCreatedEvent = event.type === "session.created" && event.properties.info.parentID === context.openCodeSessionId;
777
+ if (!isRootSessionEvent && !isKnownChildSessionEvent && !isChildSessionCreatedEvent) return;
572
778
  const turnId = context.activeTurnId;
573
779
  yield* writeNativeEventBestEffort(context.session.threadId, {
574
780
  observedAt: nowIso(),
575
781
  event: {
576
782
  provider: PROVIDER$1,
577
783
  threadId: context.session.threadId,
578
- providerThreadId: context.openCodeSessionId,
784
+ providerThreadId: eventSessionId ?? context.openCodeSessionId,
579
785
  type: event.type,
580
786
  ...turnId ? { turnId } : {},
581
787
  payload: event
582
788
  }
583
789
  });
584
790
  switch (event.type) {
791
+ case "session.created":
792
+ yield* registerOpenCodeChildSession(context, event.properties.info, event);
793
+ break;
585
794
  case "message.updated":
586
- context.messageRoleById.set(event.properties.info.id, event.properties.info.role);
795
+ context.messageRoleById.set(scopedOpenCodeId(event.properties.sessionID, event.properties.info.id), event.properties.info.role);
587
796
  if (event.properties.info.role === "assistant") for (const part of context.partById.values()) {
588
- if (part.messageID !== event.properties.info.id) continue;
797
+ if (part.sessionID !== event.properties.sessionID || part.messageID !== event.properties.info.id) continue;
589
798
  yield* emitAssistantTextDelta(context, part, turnId, event);
590
799
  }
591
800
  break;
592
801
  case "message.removed":
593
- context.messageRoleById.delete(event.properties.messageID);
802
+ context.messageRoleById.delete(scopedOpenCodeId(event.properties.sessionID, event.properties.messageID));
594
803
  break;
595
804
  case "message.part.delta": {
596
- const existingPart = context.partById.get(event.properties.partID);
805
+ const partKey = scopedOpenCodeId(event.properties.sessionID, event.properties.partID);
806
+ const existingPart = context.partById.get(partKey);
597
807
  if (!existingPart) break;
598
808
  if (messageRoleForPart(context, existingPart) !== "assistant") break;
599
809
  const streamKind = resolveTextStreamKind(existingPart);
600
810
  const delta = event.properties.delta;
601
811
  if (delta.length === 0) break;
602
- const { nextText, deltaToEmit } = appendOpenCodeAssistantTextDelta(context.emittedTextByPartId.get(event.properties.partID) ?? textFromPart(existingPart) ?? "", delta);
812
+ const { nextText, deltaToEmit } = appendOpenCodeAssistantTextDelta(context.emittedTextByPartId.get(partKey) ?? textFromPart(existingPart) ?? "", delta);
603
813
  if (deltaToEmit.length === 0) break;
604
- context.emittedTextByPartId.set(event.properties.partID, nextText);
605
- if (existingPart.type === "text" || existingPart.type === "reasoning") context.partById.set(event.properties.partID, {
814
+ context.emittedTextByPartId.set(partKey, nextText);
815
+ if (existingPart.type === "text" || existingPart.type === "reasoning") context.partById.set(partKey, {
606
816
  ...existingPart,
607
817
  text: nextText
608
818
  });
609
- yield* emit({
819
+ const subagent = context.subagentBySessionId.get(event.properties.sessionID);
820
+ if (subagent) yield* emit({
821
+ ...yield* buildEventBase({
822
+ threadId: context.session.threadId,
823
+ turnId,
824
+ itemId: event.properties.partID,
825
+ raw: event
826
+ }),
827
+ type: "subagent.message.delta",
828
+ payload: {
829
+ subagentId: subagent.subagentId,
830
+ delta: deltaToEmit,
831
+ streamKind,
832
+ role: "assistant",
833
+ providerSessionId: event.properties.sessionID,
834
+ providerThreadId: event.properties.sessionID,
835
+ providerMessageId: event.properties.messageID
836
+ }
837
+ });
838
+ else yield* emit({
610
839
  ...yield* buildEventBase({
611
840
  threadId: context.session.threadId,
612
841
  turnId,
@@ -623,12 +852,24 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
623
852
  }
624
853
  case "message.part.updated": {
625
854
  const part = event.properties.part;
626
- context.partById.set(part.id, part);
855
+ context.partById.set(scopedOpenCodeId(part.sessionID, part.id), part);
627
856
  if (messageRoleForPart(context, part) === "assistant") yield* emitAssistantTextDelta(context, part, turnId, event);
857
+ if (part.type === "subtask" && part.sessionID === context.openCodeSessionId) yield* bindOpenCodeSubtaskPart(context, part, event);
628
858
  if (part.type === "tool") {
629
859
  const itemType = toToolLifecycleItemType(part.tool);
630
860
  const title = part.state.status === "running" ? part.state.title ?? part.tool : part.tool;
631
861
  const detail = detailFromToolPart(part);
862
+ const childSubagent = context.subagentBySessionId.get(part.sessionID);
863
+ if (childSubagent) {
864
+ yield* emitOpenCodeSubagentUpdated(context, {
865
+ subagent: childSubagent,
866
+ status: statusFromOpenCodeSubagentState("running"),
867
+ summary: title,
868
+ detail,
869
+ raw: event
870
+ });
871
+ break;
872
+ }
632
873
  const payload = {
633
874
  itemType,
634
875
  ...part.state.status === "error" ? { status: "failed" } : part.state.status === "completed" ? { status: "completed" } : { status: "inProgress" },
@@ -730,7 +971,25 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
730
971
  payload: { answers: {} }
731
972
  });
732
973
  break;
733
- case "session.status":
974
+ case "session.status": {
975
+ const childSubagent = context.subagentBySessionId.get(event.properties.sessionID);
976
+ if (childSubagent) {
977
+ if (event.properties.status.type === "idle") {
978
+ yield* emitOpenCodeSubagentCompleted(context, {
979
+ subagent: childSubagent,
980
+ status: subagentCompletionStatus("completed"),
981
+ raw: event
982
+ });
983
+ break;
984
+ }
985
+ yield* emitOpenCodeSubagentUpdated(context, {
986
+ subagent: childSubagent,
987
+ status: statusFromOpenCodeSubagentState("running"),
988
+ ...event.properties.status.type === "retry" ? { detail: event.properties.status.message } : {},
989
+ raw: event
990
+ });
991
+ break;
992
+ }
734
993
  if (event.properties.status.type === "busy") updateProviderSession(context, {
735
994
  status: "running",
736
995
  activeTurnId: turnId
@@ -764,8 +1023,28 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
764
1023
  });
765
1024
  }
766
1025
  break;
1026
+ }
1027
+ case "session.idle": {
1028
+ const childSubagent = context.subagentBySessionId.get(event.properties.sessionID);
1029
+ if (childSubagent) yield* emitOpenCodeSubagentCompleted(context, {
1030
+ subagent: childSubagent,
1031
+ status: subagentCompletionStatus("completed"),
1032
+ raw: event
1033
+ });
1034
+ break;
1035
+ }
767
1036
  case "session.error": {
768
1037
  const message = sessionErrorMessage(event.properties.error);
1038
+ const childSubagent = event.properties.sessionID !== void 0 ? context.subagentBySessionId.get(event.properties.sessionID) : void 0;
1039
+ if (childSubagent) {
1040
+ yield* emitOpenCodeSubagentCompleted(context, {
1041
+ subagent: childSubagent,
1042
+ status: subagentCompletionStatus("failed"),
1043
+ summary: message,
1044
+ raw: event
1045
+ });
1046
+ break;
1047
+ }
769
1048
  const activeTurnId = context.activeTurnId;
770
1049
  context.activeTurnId = void 0;
771
1050
  updateProviderSession(context, {
@@ -893,6 +1172,12 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
893
1172
  emittedTextByPartId: /* @__PURE__ */ new Map(),
894
1173
  messageRoleById: /* @__PURE__ */ new Map(),
895
1174
  completedAssistantPartIds: /* @__PURE__ */ new Set(),
1175
+ childSessionIds: /* @__PURE__ */ new Set(),
1176
+ subagentBySessionId: /* @__PURE__ */ new Map(),
1177
+ subagentBySubtaskPartId: /* @__PURE__ */ new Map(),
1178
+ unboundSubtaskPartIds: [],
1179
+ startedSubagentIds: /* @__PURE__ */ new Set(),
1180
+ completedSubagentIds: /* @__PURE__ */ new Set(),
896
1181
  turns: [],
897
1182
  activeTurnId: void 0,
898
1183
  activeAgent: void 0,
@@ -901,7 +1186,6 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
901
1186
  sessionScope: started.sessionScope
902
1187
  };
903
1188
  sessions.set(input.threadId, context);
904
- yield* startEventPump(context);
905
1189
  yield* emit({
906
1190
  ...yield* buildEventBase({ threadId: input.threadId }),
907
1191
  type: "session.started",
@@ -912,6 +1196,8 @@ function makeOpenCodeAdapter(openCodeSettings, options) {
912
1196
  type: "thread.started",
913
1197
  payload: { providerThreadId: started.openCodeSession.id }
914
1198
  });
1199
+ yield* startEventPump(context);
1200
+ yield* hydrateOpenCodeChildSessions(context).pipe(Effect.forkIn(context.sessionScope));
915
1201
  return session;
916
1202
  });
917
1203
  const sendTurn = Effect.fn("sendTurn")(function* (input) {
@@ -1434,6 +1720,7 @@ const OpenCodeDriver = {
1434
1720
  const openCodeRuntime = yield* OpenCodeRuntime;
1435
1721
  const serverConfig = yield* ServerConfig;
1436
1722
  const httpClient = yield* HttpClient.HttpClient;
1723
+ const serverSettings = yield* ServerSettingsService;
1437
1724
  const eventLoggers = yield* ProviderEventLoggers;
1438
1725
  const processEnv = mergeProviderInstanceEnvironment(environment);
1439
1726
  const continuationIdentity = defaultProviderContinuationIdentity({
@@ -1475,7 +1762,7 @@ const OpenCodeDriver = {
1475
1762
  haveSettingsChanged: () => false,
1476
1763
  initialSnapshot: (settings) => stampIdentity(makePendingOpenCodeProvider(settings)),
1477
1764
  checkProvider,
1478
- enrichSnapshot: ({ snapshot, publishSnapshot }) => enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(Effect.provideService(HttpClient.HttpClient, httpClient), Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot))),
1765
+ enrichSnapshot: ({ snapshot, publishSnapshot }) => enrichProviderSnapshotWithVersionAdvisory(snapshot, maintenanceCapabilities).pipe(Effect.provideService(HttpClient.HttpClient, httpClient), Effect.provideService(ServerSettingsService, serverSettings), Effect.flatMap((enrichedSnapshot) => publishSnapshot(enrichedSnapshot))),
1479
1766
  refreshInterval: null
1480
1767
  }).pipe(Effect.mapError((cause) => new ProviderDriverError({
1481
1768
  driver: DRIVER_KIND,