@ottocode/web-sdk 0.1.298 → 0.1.300

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 (60) hide show
  1. package/dist/components/agents/AgentEditor.d.ts +9 -0
  2. package/dist/components/agents/AgentEditor.d.ts.map +1 -0
  3. package/dist/components/agents/AgentList.d.ts +10 -0
  4. package/dist/components/agents/AgentList.d.ts.map +1 -0
  5. package/dist/components/agents/AgentProviderModelFields.d.ts +10 -0
  6. package/dist/components/agents/AgentProviderModelFields.d.ts.map +1 -0
  7. package/dist/components/agents/AgentToolList.d.ts +14 -0
  8. package/dist/components/agents/AgentToolList.d.ts.map +1 -0
  9. package/dist/components/agents/AgentsManagerModal.d.ts +2 -0
  10. package/dist/components/agents/AgentsManagerModal.d.ts.map +1 -0
  11. package/dist/components/agents/AgentsSidebar.d.ts +3 -0
  12. package/dist/components/agents/AgentsSidebar.d.ts.map +1 -0
  13. package/dist/components/agents/AgentsSidebarToggle.d.ts +2 -0
  14. package/dist/components/agents/AgentsSidebarToggle.d.ts.map +1 -0
  15. package/dist/components/agents/CreateAgentModal.d.ts +8 -0
  16. package/dist/components/agents/CreateAgentModal.d.ts.map +1 -0
  17. package/dist/components/agents/agentConstants.d.ts +50 -0
  18. package/dist/components/agents/agentConstants.d.ts.map +1 -0
  19. package/dist/components/agents/index.d.ts +10 -0
  20. package/dist/components/agents/index.d.ts.map +1 -0
  21. package/dist/components/chat/UnifiedModelSelector.d.ts +2 -1
  22. package/dist/components/chat/UnifiedModelSelector.d.ts.map +1 -1
  23. package/dist/components/common/UsageModal.d.ts.map +1 -1
  24. package/dist/components/common/UsageRing.d.ts.map +1 -1
  25. package/dist/components/file-browser/FileViewerPanel.d.ts.map +1 -1
  26. package/dist/components/index.d.ts +4 -0
  27. package/dist/components/index.d.ts.map +1 -1
  28. package/dist/components/index.js +3355 -1313
  29. package/dist/components/index.js.map +26 -17
  30. package/dist/components/messages/UserMessageGroup.d.ts.map +1 -1
  31. package/dist/components/ui/Modal.d.ts +1 -1
  32. package/dist/components/ui/Modal.d.ts.map +1 -1
  33. package/dist/components/workspace/ToolPreviewPanel.d.ts.map +1 -1
  34. package/dist/components/workspace/ViewerTabs.d.ts.map +1 -1
  35. package/dist/hooks/index.d.ts +1 -0
  36. package/dist/hooks/index.d.ts.map +1 -1
  37. package/dist/hooks/index.js +344 -20
  38. package/dist/hooks/index.js.map +10 -8
  39. package/dist/hooks/useAgents.d.ts +156 -0
  40. package/dist/hooks/useAgents.d.ts.map +1 -0
  41. package/dist/hooks/useConfig.d.ts.map +1 -1
  42. package/dist/hooks/useProviderUsage.d.ts.map +1 -1
  43. package/dist/hooks/useSessionStream.d.ts.map +1 -1
  44. package/dist/index.js +3406 -1356
  45. package/dist/index.js.map +26 -17
  46. package/dist/lib/api-client/config.d.ts +14 -0
  47. package/dist/lib/api-client/config.d.ts.map +1 -1
  48. package/dist/lib/api-client/index.d.ts +5 -0
  49. package/dist/lib/api-client/index.d.ts.map +1 -1
  50. package/dist/lib/index.js +48 -2
  51. package/dist/lib/index.js.map +4 -4
  52. package/dist/stores/agentsStore.d.ts +28 -0
  53. package/dist/stores/agentsStore.d.ts.map +1 -0
  54. package/dist/stores/index.d.ts +1 -0
  55. package/dist/stores/index.d.ts.map +1 -1
  56. package/dist/stores/index.js +74 -10
  57. package/dist/stores/index.js.map +5 -4
  58. package/dist/stores/viewerTabsStore.d.ts +4 -3
  59. package/dist/stores/viewerTabsStore.d.ts.map +1 -1
  60. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"UserMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages/UserMessageGroup.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAS/C,UAAU,qBAAqB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAgBD,eAAO,MAAM,gBAAgB,6DAsV5B,CAAC"}
1
+ {"version":3,"file":"UserMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages/UserMessageGroup.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAS/C,UAAU,qBAAqB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAkBD,eAAO,MAAM,gBAAgB,6DAsV5B,CAAC"}
@@ -7,7 +7,7 @@ interface ModalProps {
7
7
  showCloseButton?: boolean;
8
8
  closeOnBackdropClick?: boolean;
9
9
  closeOnEscape?: boolean;
10
- maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl';
10
+ maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '5xl';
11
11
  position?: 'fixed' | 'absolute';
12
12
  }
13
13
  export declare function Modal({ isOpen, onClose, title, children, showCloseButton, closeOnBackdropClick, closeOnEscape, maxWidth, position, }: ModalProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlD,UAAU,UAAU;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAChC;AAWD,wBAAgB,KAAK,CAAC,EACrB,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,eAAsB,EACtB,oBAA2B,EAC3B,aAAoB,EACpB,QAAe,EACf,QAAkB,GAClB,EAAE,UAAU,+BA4GZ"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlD,UAAU,UAAU;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAChC;AAYD,wBAAgB,KAAK,CAAC,EACrB,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,eAAsB,EACtB,oBAA2B,EAC3B,aAAoB,EACpB,QAAe,EACf,QAAkB,GAClB,EAAE,UAAU,+BA4GZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreviewPanel.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ToolPreviewPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,SAAS,EAEd,MAAM,8BAA8B,CAAC;AAUtC,UAAU,qBAAqB;IAC9B,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;CAClD;AAOD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAujBD,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI,CAsGzB;AAoFD,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,qBAAqB,+BA+Q9D"}
1
+ {"version":3,"file":"ToolPreviewPanel.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ToolPreviewPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,SAAS,EAEd,MAAM,8BAA8B,CAAC;AAUtC,UAAU,qBAAqB;IAC9B,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;CAClD;AAOD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAukBD,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI,CAsGzB;AAwFD,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,qBAAqB,+BAgR9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerTabs.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ViewerTabs.tsx"],"names":[],"mappings":"AAyPA,eAAO,MAAM,UAAU,8CA+LrB,CAAC"}
1
+ {"version":3,"file":"ViewerTabs.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ViewerTabs.tsx"],"names":[],"mappings":"AA2PA,eAAO,MAAM,UAAU,8CA+LrB,CAAC"}
@@ -26,6 +26,7 @@ export * from './useProviderUsage';
26
26
  export * from './useFileBrowser';
27
27
  export * from './useMCP';
28
28
  export * from './useSkills';
29
+ export * from './useAgents';
29
30
  export * from './useContainerWidth';
30
31
  export * from './useVoiceInput';
31
32
  export * from './useDictationModels';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
@@ -560,6 +560,11 @@ import {
560
560
  getConfig as apiGetConfig,
561
561
  getProviderModels as apiGetProviderModels,
562
562
  getAllModels as apiGetAllModels,
563
+ getAgentDetails as apiGetAgentDetails,
564
+ getAgent as apiGetAgent,
565
+ getConfigTools as apiGetConfigTools,
566
+ upsertAgent as apiUpsertAgent,
567
+ deleteAgent as apiDeleteAgent,
563
568
  discoverProviderModels as apiDiscoverProviderModels,
564
569
  updateDefaults as apiUpdateDefaults,
565
570
  updateProviderSettings as apiUpdateProviderSettings,
@@ -572,6 +577,42 @@ var configMixin = {
572
577
  throw new Error(extractErrorMessage(response.error));
573
578
  return response.data;
574
579
  },
580
+ async getAgentDetails() {
581
+ const response = await apiGetAgentDetails();
582
+ if (response.error)
583
+ throw new Error(extractErrorMessage(response.error));
584
+ return response.data;
585
+ },
586
+ async getAgent(name) {
587
+ const response = await apiGetAgent({ path: { agent: name } });
588
+ if (response.error)
589
+ throw new Error(extractErrorMessage(response.error));
590
+ return response.data;
591
+ },
592
+ async getConfigTools() {
593
+ const response = await apiGetConfigTools();
594
+ if (response.error)
595
+ throw new Error(extractErrorMessage(response.error));
596
+ return response.data;
597
+ },
598
+ async updateAgent(name, input) {
599
+ const response = await apiUpsertAgent({
600
+ path: { agent: name },
601
+ body: input
602
+ });
603
+ if (response.error)
604
+ throw new Error(extractErrorMessage(response.error));
605
+ return response.data;
606
+ },
607
+ async deleteAgent(name, scope = "local") {
608
+ const response = await apiDeleteAgent({
609
+ path: { agent: name },
610
+ query: { scope }
611
+ });
612
+ if (response.error)
613
+ throw new Error(extractErrorMessage(response.error));
614
+ return response.data;
615
+ },
575
616
  async getModels(providerId) {
576
617
  const response = await apiGetProviderModels({
577
618
  path: { provider: providerId }
@@ -613,7 +654,7 @@ var configMixin = {
613
654
  },
614
655
  async updateDefaults(data) {
615
656
  const response = await apiUpdateDefaults({
616
- body: data
657
+ body: { scope: "global", ...data }
617
658
  });
618
659
  if (response.error)
619
660
  throw new Error(extractErrorMessage(response.error));
@@ -1250,6 +1291,11 @@ class ApiClient {
1250
1291
  checkoutBranch = gitMixin.checkoutBranch;
1251
1292
  createGitBranch = gitMixin.createGitBranch;
1252
1293
  getConfig = configMixin.getConfig;
1294
+ getAgentDetails = configMixin.getAgentDetails;
1295
+ getAgent = configMixin.getAgent;
1296
+ getConfigTools = configMixin.getConfigTools;
1297
+ updateAgent = configMixin.updateAgent;
1298
+ deleteAgent = configMixin.deleteAgent;
1253
1299
  getModels = configMixin.getModels;
1254
1300
  getAllModels = configMixin.getAllModels;
1255
1301
  discoverProviderModels = configMixin.discoverProviderModels;
@@ -1535,6 +1581,9 @@ function upsertTab(tabs, tab) {
1535
1581
  next[existingIndex] = tab;
1536
1582
  return next;
1537
1583
  }
1584
+ function isPatchPreviewTool(toolName) {
1585
+ return toolName === "apply_patch" || toolName === "edit" || toolName === "multiedit";
1586
+ }
1538
1587
  function isSamePatchCall(existing, preview) {
1539
1588
  if (!existing)
1540
1589
  return false;
@@ -1707,8 +1756,8 @@ var useViewerTabsStore = create((set) => ({
1707
1756
  const targetPath = existingFile?.path ?? preview.path;
1708
1757
  const existing = state.tabs.find((tab) => tab.type === "tool-preview" && viewerPathsMatch(tab.path, preview.path));
1709
1758
  const tabs = state.tabs.filter((tab) => !((tab.type === "tool-preview" || tab.type === "file") && tab.id !== targetId && (viewerPathsMatch(tab.path, preview.path) || Boolean(preview.callId && "toolName" in tab && tab.callId === preview.callId))));
1710
- if (preview.toolName === "apply_patch") {
1711
- const existingPatchPreview = existingFile?.patchPreview ?? (existing?.toolName === "apply_patch" ? existing : undefined);
1759
+ if (isPatchPreviewTool(preview.toolName)) {
1760
+ const existingPatchPreview = existingFile?.patchPreview ?? (existing && isPatchPreviewTool(existing.toolName) ? existing : undefined);
1712
1761
  const samePatchCall = isSamePatchCall(existingPatchPreview, preview);
1713
1762
  const baseContent = preview.baseContent ?? (samePatchCall ? existingPatchPreview?.baseContent : existingPatchPreview?.resultContent ?? existingPatchPreview?.baseContent);
1714
1763
  const changedLines = samePatchCall ? preview.changedLines ?? existingPatchPreview?.changedLines : mergeChangedLines(existingPatchPreview?.changedLines, preview.changedLines);
@@ -1729,7 +1778,7 @@ var useViewerTabsStore = create((set) => ({
1729
1778
  writePreview: undefined,
1730
1779
  patchPreview: {
1731
1780
  path: targetPath,
1732
- toolName: "apply_patch",
1781
+ toolName: preview.toolName,
1733
1782
  callId: preview.callId ?? existingPatchPreview?.callId,
1734
1783
  baseContent,
1735
1784
  patch: preview.patch ?? existingPatchPreview?.patch,
@@ -3170,7 +3219,13 @@ ${argPatch.slice(-STREAMING_PATCH_PREVIEW_TAIL_CHARS)}`;
3170
3219
  ${bestEffortUnescapeJsonString(rawTail)}`;
3171
3220
  };
3172
3221
  const getResultRecord = (payload) => payload?.result && typeof payload.result === "object" && !Array.isArray(payload.result) ? payload.result : null;
3173
- const getArtifactRecord = (payload) => payload?.artifact && typeof payload.artifact === "object" && !Array.isArray(payload.artifact) ? payload.artifact : null;
3222
+ const getArtifactRecord = (payload) => {
3223
+ if (payload?.artifact && typeof payload.artifact === "object" && !Array.isArray(payload.artifact)) {
3224
+ return payload.artifact;
3225
+ }
3226
+ const result = getResultRecord(payload);
3227
+ return result?.artifact && typeof result.artifact === "object" && !Array.isArray(result.artifact) ? result.artifact : null;
3228
+ };
3174
3229
  const extractErrorMessage2 = (payload) => {
3175
3230
  const result = getResultRecord(payload);
3176
3231
  if (typeof payload?.error === "string")
@@ -3307,6 +3362,56 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
3307
3362
  }
3308
3363
  return lines.size > 0 ? [...lines] : undefined;
3309
3364
  };
3365
+ const getPatchTextLines = (value) => {
3366
+ if (value.length === 0)
3367
+ return [];
3368
+ const lines = value.split(`
3369
+ `);
3370
+ if (value.endsWith(`
3371
+ `))
3372
+ lines.pop();
3373
+ return lines;
3374
+ };
3375
+ const appendStringEditPatchHunk = (lines, edit) => {
3376
+ lines.push("@@");
3377
+ for (const line of getPatchTextLines(edit.oldString)) {
3378
+ lines.push(`-${line}`);
3379
+ }
3380
+ for (const line of getPatchTextLines(edit.newString)) {
3381
+ lines.push(`+${line}`);
3382
+ }
3383
+ };
3384
+ const buildStringEditPatchPreview = (path, edits) => {
3385
+ const validEdits = edits.filter((edit) => edit.oldString.length > 0 || edit.newString.length > 0);
3386
+ if (validEdits.length === 0)
3387
+ return;
3388
+ const lines = ["*** Begin Patch", `*** Update File: ${path}`];
3389
+ for (const edit of validEdits)
3390
+ appendStringEditPatchHunk(lines, edit);
3391
+ lines.push("*** End Patch", "");
3392
+ return lines.join(`
3393
+ `);
3394
+ };
3395
+ const getMultiEditPreviewEdits = (args) => {
3396
+ const edits = Array.isArray(args?.edits) ? args.edits : [];
3397
+ return edits.flatMap((edit) => {
3398
+ if (!edit || typeof edit !== "object" || Array.isArray(edit))
3399
+ return [];
3400
+ const record = edit;
3401
+ return typeof record.oldString === "string" && typeof record.newString === "string" ? [{ oldString: record.oldString, newString: record.newString }] : [];
3402
+ });
3403
+ };
3404
+ const getEditPreviewPatch = (toolName, path, args, buffer, artifact) => {
3405
+ if (typeof artifact?.patch === "string")
3406
+ return artifact.patch;
3407
+ if (toolName === "edit") {
3408
+ const oldString = getStringArg(args, buffer, "oldString");
3409
+ const newString = getStringArg(args, buffer, "newString");
3410
+ return oldString !== undefined && newString !== undefined ? buildStringEditPatchPreview(path, [{ oldString, newString }]) : undefined;
3411
+ }
3412
+ const edits = getMultiEditPreviewEdits(args);
3413
+ return buildStringEditPatchPreview(path, edits);
3414
+ };
3310
3415
  const handleReadToolActivity = (eventType, payload, delta) => {
3311
3416
  const name = getToolEventName(payload);
3312
3417
  if (name !== "read")
@@ -3441,6 +3546,51 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
3441
3546
  });
3442
3547
  }
3443
3548
  };
3549
+ const handleEditToolActivity = (eventType, payload, delta) => {
3550
+ const name = getToolEventName(payload);
3551
+ if (name !== "edit" && name !== "multiedit")
3552
+ return;
3553
+ const args = getToolArgsForViewer(payload, delta);
3554
+ const buffer = getBufferedToolInput(payload);
3555
+ const artifact = getArtifactRecord(payload);
3556
+ const result = getResultRecord(payload);
3557
+ const path = (typeof result?.path === "string" ? result.path : undefined) ?? getStringArg(args, buffer, "path", true);
3558
+ if (!path)
3559
+ return;
3560
+ const failed = result?.ok === false || eventType === "error";
3561
+ const status = failed ? "error" : eventType === "tool.result" ? "success" : "streaming";
3562
+ const callId = getToolEventCallId(payload) ?? undefined;
3563
+ const patch = getEditPreviewPatch(name, path, args, buffer, artifact);
3564
+ if (status === "success")
3565
+ invalidateFileContentCache(path);
3566
+ if (!patch)
3567
+ return;
3568
+ const previewKey = callId ?? `${name}:${path}`;
3569
+ const lineSignature = status === "streaming" ? getCompletedPatchChangeLineSignature(patch) : undefined;
3570
+ if (status === "streaming") {
3571
+ const last = toolPreviewEmitRef.current.get(previewKey);
3572
+ if (last?.lineSignature === lineSignature)
3573
+ return;
3574
+ }
3575
+ const viewerStore = useViewerTabsStore.getState();
3576
+ if (!viewerStore.followToolActivity)
3577
+ return;
3578
+ viewerStore.openToolPreviewTab({
3579
+ path,
3580
+ toolName: name,
3581
+ callId,
3582
+ patch,
3583
+ status,
3584
+ error: extractErrorMessage2(payload)
3585
+ });
3586
+ if (status === "streaming") {
3587
+ toolPreviewEmitRef.current.set(previewKey, {
3588
+ emittedAt: Date.now(),
3589
+ contentLength: buffer.length,
3590
+ lineSignature
3591
+ });
3592
+ }
3593
+ };
3444
3594
  const handleSimulatorToolActivity = (eventType, payload) => {
3445
3595
  if (eventType !== "tool.result")
3446
3596
  return;
@@ -3471,6 +3621,9 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
3471
3621
  handleReadToolActivity(eventType, payload, delta);
3472
3622
  if (name === "write")
3473
3623
  handleWriteToolActivity(eventType, payload, delta);
3624
+ if (name === "edit" || name === "multiedit") {
3625
+ handleEditToolActivity(eventType, payload, delta);
3626
+ }
3474
3627
  if (name === "apply_patch") {
3475
3628
  handleApplyPatchToolActivity(eventType, payload, delta);
3476
3629
  }
@@ -6787,7 +6940,7 @@ function useProviderUsage(provider, authType) {
6787
6940
  const isModalOpen = useUsageStore((s) => s.isModalOpen);
6788
6941
  const modalProvider = useUsageStore((s) => s.modalProvider);
6789
6942
  const usage = useUsageStore((s) => provider ? s.usage[provider] : undefined);
6790
- const isOAuthProvider = authType === "oauth" && (provider === "anthropic" || provider === "openai");
6943
+ const isOAuthProvider = authType === "oauth" && (provider === "anthropic" || provider === "openai" || provider === "xai");
6791
6944
  const fetchUsage = useCallback10(async (force = false) => {
6792
6945
  if (!provider || !isOAuthProvider)
6793
6946
  return;
@@ -7141,11 +7294,175 @@ function useSkillFileContent(name, filePath) {
7141
7294
  enabled: !!name && !!filePath
7142
7295
  });
7143
7296
  }
7297
+ // src/hooks/useAgents.ts
7298
+ import { useEffect as useEffect18 } from "react";
7299
+ import { useMutation as useMutation10, useQuery as useQuery14, useQueryClient as useQueryClient13 } from "@tanstack/react-query";
7300
+
7301
+ // src/stores/agentsStore.ts
7302
+ import { create as create22 } from "zustand";
7303
+ function collapseOtherRightPanels() {
7304
+ useGitStore.getState().collapseSidebar();
7305
+ useSessionFilesStore.getState().collapseSidebar();
7306
+ useResearchStore.getState().collapseSidebar();
7307
+ useSettingsStore.getState().collapseSidebar();
7308
+ useTunnelStore.getState().collapseSidebar();
7309
+ useFileBrowserStore.getState().collapseSidebar();
7310
+ useMCPStore.getState().collapseSidebar();
7311
+ useSkillsStore.getState().collapseSidebar();
7312
+ }
7313
+ var useAgentsStore = create22((set) => ({
7314
+ isExpanded: false,
7315
+ isManagerOpen: false,
7316
+ managerMode: "library",
7317
+ editorPage: "overview",
7318
+ agents: [],
7319
+ defaultAgent: null,
7320
+ selectedAgent: null,
7321
+ isCreateModalOpen: false,
7322
+ setManagerMode: (mode) => set({ managerMode: mode }),
7323
+ openManager: () => {
7324
+ collapseOtherRightPanels();
7325
+ set({ isManagerOpen: true, isExpanded: true, managerMode: "library" });
7326
+ },
7327
+ closeManager: () => set({
7328
+ isManagerOpen: false,
7329
+ isExpanded: false,
7330
+ isCreateModalOpen: false,
7331
+ managerMode: "library",
7332
+ editorPage: "overview"
7333
+ }),
7334
+ toggleManager: () => {
7335
+ const open = useAgentsStore.getState().isManagerOpen;
7336
+ if (open) {
7337
+ useAgentsStore.getState().closeManager();
7338
+ } else {
7339
+ useAgentsStore.getState().openManager();
7340
+ }
7341
+ },
7342
+ setAgents: (agents, defaultAgent) => set((state) => ({
7343
+ agents,
7344
+ defaultAgent,
7345
+ selectedAgent: state.selectedAgent && agents.some((a) => a.name === state.selectedAgent) ? state.selectedAgent : agents.find((a) => a.name === defaultAgent)?.name ?? agents[0]?.name ?? null
7346
+ })),
7347
+ selectAgent: (agent) => set({ selectedAgent: agent }),
7348
+ backToList: () => set({ selectedAgent: null, editorPage: "overview" }),
7349
+ openAgentInManager: (agent) => set({
7350
+ isManagerOpen: true,
7351
+ isExpanded: true,
7352
+ managerMode: "workspace",
7353
+ selectedAgent: agent,
7354
+ editorPage: "overview",
7355
+ isCreateModalOpen: false
7356
+ }),
7357
+ setEditorPage: (page) => set({ editorPage: page }),
7358
+ openCreateModal: () => set({ isManagerOpen: true, isExpanded: true, isCreateModalOpen: true }),
7359
+ closeCreateModal: () => set({ isCreateModalOpen: false })
7360
+ }));
7361
+
7362
+ // src/hooks/useAgents.ts
7363
+ function useAgentDetails(options = {}) {
7364
+ const managerOpen = useAgentsStore((s) => s.isManagerOpen);
7365
+ const createOpen = useAgentsStore((s) => s.isCreateModalOpen);
7366
+ const enabled = options.enabled ?? (managerOpen || createOpen);
7367
+ const setAgents = useAgentsStore((s) => s.setAgents);
7368
+ const selectedAgent = useAgentsStore((s) => s.selectedAgent);
7369
+ const selectAgent = useAgentsStore((s) => s.selectAgent);
7370
+ const query = useQuery14({
7371
+ queryKey: ["config", "agents"],
7372
+ queryFn: () => apiClient.getAgentDetails(),
7373
+ enabled,
7374
+ staleTime: 15000
7375
+ });
7376
+ useEffect18(() => {
7377
+ if (!query.data)
7378
+ return;
7379
+ setAgents(query.data.agents, query.data.default);
7380
+ if (!selectedAgent && query.data.agents.length > 0) {
7381
+ const defaultAgent = query.data.agents.find((agent) => agent.name === query.data.default);
7382
+ selectAgent(defaultAgent?.name ?? query.data.agents[0].name);
7383
+ }
7384
+ }, [query.data, selectAgent, selectedAgent, setAgents]);
7385
+ return query;
7386
+ }
7387
+ function useAgent(agentName) {
7388
+ return useQuery14({
7389
+ queryKey: ["config", "agents", agentName],
7390
+ queryFn: async () => {
7391
+ if (!agentName)
7392
+ return null;
7393
+ return apiClient.getAgent(agentName);
7394
+ },
7395
+ enabled: Boolean(agentName),
7396
+ staleTime: 15000
7397
+ });
7398
+ }
7399
+ function useConfigTools(options = {}) {
7400
+ const managerOpen = useAgentsStore((s) => s.isManagerOpen);
7401
+ const createOpen = useAgentsStore((s) => s.isCreateModalOpen);
7402
+ const enabled = options.enabled ?? (managerOpen || createOpen);
7403
+ return useQuery14({
7404
+ queryKey: ["config", "tools"],
7405
+ queryFn: () => apiClient.getConfigTools(),
7406
+ enabled,
7407
+ staleTime: 30000
7408
+ });
7409
+ }
7410
+ function useUpdateAgent() {
7411
+ const queryClient = useQueryClient13();
7412
+ return useMutation10({
7413
+ mutationFn: ({ name, input }) => apiClient.updateAgent(name, input),
7414
+ onSuccess: (data, variables) => {
7415
+ queryClient.setQueryData(["config", "agents", variables.name], data);
7416
+ queryClient.invalidateQueries({ queryKey: ["config", "agents"] });
7417
+ }
7418
+ });
7419
+ }
7420
+ function useDeleteAgent() {
7421
+ const queryClient = useQueryClient13();
7422
+ const setAgents = useAgentsStore((s) => s.setAgents);
7423
+ const selectAgent = useAgentsStore((s) => s.selectAgent);
7424
+ return useMutation10({
7425
+ mutationFn: ({
7426
+ name,
7427
+ scope = "local"
7428
+ }) => apiClient.deleteAgent(name, scope),
7429
+ onSuccess: async (_data, variables) => {
7430
+ await queryClient.invalidateQueries({ queryKey: ["config", "agents"] });
7431
+ const refreshed = await queryClient.fetchQuery({
7432
+ queryKey: ["config", "agents"],
7433
+ queryFn: () => apiClient.getAgentDetails()
7434
+ });
7435
+ setAgents(refreshed.agents, refreshed.default);
7436
+ if (variables.name === useAgentsStore.getState().selectedAgent) {
7437
+ const next = refreshed.agents.find((a) => a.name === refreshed.default)?.name ?? refreshed.agents[0]?.name ?? null;
7438
+ selectAgent(next);
7439
+ }
7440
+ }
7441
+ });
7442
+ }
7443
+ function useSetDefaultAgent() {
7444
+ const queryClient = useQueryClient13();
7445
+ return useMutation10({
7446
+ mutationFn: (name) => apiClient.updateDefaults({ agent: name, scope: "global" }),
7447
+ onSuccess: () => {
7448
+ queryClient.invalidateQueries({ queryKey: ["config", "agents"] });
7449
+ queryClient.invalidateQueries({ queryKey: ["config"] });
7450
+ }
7451
+ });
7452
+ }
7453
+ function getAgentToolCount(agent) {
7454
+ if (!agent)
7455
+ return 0;
7456
+ return Array.from(new Set([
7457
+ ...agent.toolConfig.firstClass ?? [],
7458
+ ...agent.toolConfig.loadable ?? []
7459
+ ])).length;
7460
+ }
7144
7461
  // src/hooks/useContainerWidth.ts
7145
- import { useEffect as useEffect18, useState as useState6 } from "react";
7462
+ import { useEffect as useEffect19, useState as useState6 } from "react";
7146
7463
  function useContainerWidth(ref) {
7147
7464
  const [width, setWidth] = useState6(0);
7148
- useEffect18(() => {
7465
+ useEffect19(() => {
7149
7466
  const el = ref.current;
7150
7467
  if (!el)
7151
7468
  return;
@@ -7158,7 +7475,7 @@ function useContainerWidth(ref) {
7158
7475
  return width;
7159
7476
  }
7160
7477
  // src/hooks/useVoiceInput.ts
7161
- import { useCallback as useCallback12, useEffect as useEffect19, useRef as useRef9, useState as useState7 } from "react";
7478
+ import { useCallback as useCallback12, useEffect as useEffect20, useRef as useRef9, useState as useState7 } from "react";
7162
7479
  var TARGET_SAMPLE_RATE = 16000;
7163
7480
  var PCM_FRAME_BYTES = 3200;
7164
7481
  function getAudioContextConstructor() {
@@ -7230,7 +7547,7 @@ function useVoiceInput({
7230
7547
  const onTranscriptRef = useRef9(onTranscript);
7231
7548
  const onErrorRef = useRef9(onError);
7232
7549
  const onNeedsInstallRef = useRef9(onNeedsInstall);
7233
- useEffect19(() => {
7550
+ useEffect20(() => {
7234
7551
  onTranscriptRef.current = onTranscript;
7235
7552
  onErrorRef.current = onError;
7236
7553
  onNeedsInstallRef.current = onNeedsInstall;
@@ -7441,7 +7758,7 @@ function useVoiceInput({
7441
7758
  isSupported,
7442
7759
  lang
7443
7760
  ]);
7444
- useEffect19(() => cleanup, [cleanup]);
7761
+ useEffect20(() => cleanup, [cleanup]);
7445
7762
  return {
7446
7763
  isListening,
7447
7764
  isTranscribing,
@@ -7453,8 +7770,8 @@ function useVoiceInput({
7453
7770
  };
7454
7771
  }
7455
7772
  // src/hooks/useDictationModels.ts
7456
- import { useCallback as useCallback13, useEffect as useEffect20, useRef as useRef10, useState as useState8 } from "react";
7457
- import { useMutation as useMutation10, useQuery as useQuery14, useQueryClient as useQueryClient13 } from "@tanstack/react-query";
7773
+ import { useCallback as useCallback13, useEffect as useEffect21, useRef as useRef10, useState as useState8 } from "react";
7774
+ import { useMutation as useMutation11, useQuery as useQuery15, useQueryClient as useQueryClient14 } from "@tanstack/react-query";
7458
7775
  var DICTATION_STATUS_QUERY_KEY = ["dictation", "status"];
7459
7776
  function mergeModelState(current, model) {
7460
7777
  if (!current)
@@ -7475,12 +7792,12 @@ function parseInstallEvent(raw) {
7475
7792
  }
7476
7793
  }
7477
7794
  function useDictationModels() {
7478
- const queryClient = useQueryClient13();
7795
+ const queryClient = useQueryClient14();
7479
7796
  const eventSourceRef = useRef10(null);
7480
7797
  const [activeInstallModelId, setActiveInstallModelId] = useState8(null);
7481
7798
  const [installProgress, setInstallProgress] = useState8(null);
7482
7799
  const [installStreamError, setInstallStreamError] = useState8(null);
7483
- const statusQuery = useQuery14({
7800
+ const statusQuery = useQuery15({
7484
7801
  queryKey: DICTATION_STATUS_QUERY_KEY,
7485
7802
  queryFn: () => apiClient.getDictationStatus(),
7486
7803
  refetchInterval: (query) => query.state.data?.models.some((model) => model.installing) ? 1000 : 30000
@@ -7522,8 +7839,8 @@ function useDictationModels() {
7522
7839
  });
7523
7840
  };
7524
7841
  }, [closeInstallStream, queryClient]);
7525
- useEffect20(() => closeInstallStream, [closeInstallStream]);
7526
- const installMutation = useMutation10({
7842
+ useEffect21(() => closeInstallStream, [closeInstallStream]);
7843
+ const installMutation = useMutation11({
7527
7844
  mutationFn: (input) => apiClient.installDictationModel(input),
7528
7845
  onSuccess: (data) => {
7529
7846
  setInstallProgress(data.model);
@@ -7539,7 +7856,7 @@ function useDictationModels() {
7539
7856
  }
7540
7857
  }
7541
7858
  });
7542
- const removeMutation = useMutation10({
7859
+ const removeMutation = useMutation11({
7543
7860
  mutationFn: (model) => apiClient.removeDictationModel(model),
7544
7861
  onSuccess: (data) => {
7545
7862
  queryClient.setQueryData(DICTATION_STATUS_QUERY_KEY, (current) => mergeModelState(current, data.model));
@@ -7573,6 +7890,7 @@ export {
7573
7890
  useUpdateSkillsConfig,
7574
7891
  useUpdateSession,
7575
7892
  useUpdateDefaults,
7893
+ useUpdateAgent,
7576
7894
  useUnstageFiles,
7577
7895
  useTunnelStream,
7578
7896
  useTunnelStatus,
@@ -7591,6 +7909,7 @@ export {
7591
7909
  useSkillDetail,
7592
7910
  useShareStatus,
7593
7911
  useSetSessionPinned,
7912
+ useSetDefaultAgent,
7594
7913
  useSessionsInfinite,
7595
7914
  useSessions,
7596
7915
  useSessionStream,
@@ -7637,12 +7956,14 @@ export {
7637
7956
  useDeleteSession,
7638
7957
  useDeleteResearchSession,
7639
7958
  useDeleteFiles,
7959
+ useDeleteAgent,
7640
7960
  useCreateSession,
7641
7961
  useCreateResearchSession,
7642
7962
  useCreateGitBranch,
7643
7963
  useCreateBranch,
7644
7964
  useCopilotDevicePoller,
7645
7965
  useContainerWidth,
7966
+ useConfigTools,
7646
7967
  useConfig,
7647
7968
  useCommitChanges,
7648
7969
  useClientEvents,
@@ -7651,11 +7972,14 @@ export {
7651
7972
  useAuthenticateMCPServer,
7652
7973
  useAuthStatus,
7653
7974
  useAllModels,
7975
+ useAgentDetails,
7976
+ useAgent,
7654
7977
  useAddRemote,
7655
7978
  useAddMCPServer,
7656
7979
  sessionsQueryKey,
7657
7980
  optimisticallyQueueMessage,
7658
- normalizeQueueState
7981
+ normalizeQueueState,
7982
+ getAgentToolCount
7659
7983
  };
7660
7984
 
7661
- //# debugId=21BA48969B41542064756E2164756E21
7985
+ //# debugId=B5B999D9CC12251A64756E2164756E21