@tutti-os/agent-gui 0.0.38 → 0.0.40

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 (62) hide show
  1. package/README.md +40 -0
  2. package/dist/{AgentMessageMarkdown-Cq-7DSV2.d.ts → AgentMessageMarkdown-GDgLA-im.d.ts} +7 -156
  3. package/dist/agent-conversation/index.d.ts +2 -1
  4. package/dist/agent-conversation/index.js +5 -5
  5. package/dist/agent-message-center/index.js +223 -14
  6. package/dist/agent-message-center/index.js.map +1 -1
  7. package/dist/app/renderer/agentactivity.css +67 -0
  8. package/dist/chunk-4K22O34C.js +123 -0
  9. package/dist/chunk-4K22O34C.js.map +1 -0
  10. package/dist/{chunk-7F4M55U3.js → chunk-DO7D7OOL.js} +24 -7
  11. package/dist/chunk-DO7D7OOL.js.map +1 -0
  12. package/dist/{chunk-MUZMBEFO.js → chunk-EFDGMXTB.js} +82 -8
  13. package/dist/chunk-EFDGMXTB.js.map +1 -0
  14. package/dist/{chunk-MKSRP5XS.js → chunk-EQ4RSPQE.js} +5 -5
  15. package/dist/{chunk-JNGYJ7GM.js → chunk-EU7RWKHE.js} +2 -2
  16. package/dist/{chunk-IXIGWLQY.js → chunk-F5DYXCY3.js} +1 -1
  17. package/dist/{chunk-IXIGWLQY.js.map → chunk-F5DYXCY3.js.map} +1 -1
  18. package/dist/{chunk-NCS7X3XY.js → chunk-R7XH3C4Y.js} +16 -4
  19. package/dist/chunk-R7XH3C4Y.js.map +1 -0
  20. package/dist/{chunk-XROBPALT.js → chunk-RE3AHBX6.js} +2 -2
  21. package/dist/{chunk-2ADVHCST.js → chunk-TXXWUG2J.js} +1 -1
  22. package/dist/chunk-TXXWUG2J.js.map +1 -0
  23. package/dist/{chunk-L7FBT3VR.js → chunk-UUM2GZXH.js} +98 -5
  24. package/dist/chunk-UUM2GZXH.js.map +1 -0
  25. package/dist/{chunk-44YASHVW.js → chunk-WC34LVH6.js} +433 -143
  26. package/dist/chunk-WC34LVH6.js.map +1 -0
  27. package/dist/{chunk-JL2WNRYC.js → chunk-WJPEKD3F.js} +17 -1
  28. package/dist/chunk-WJPEKD3F.js.map +1 -0
  29. package/dist/{chunk-WHWZZYBV.js → chunk-Y2DQJPTL.js} +2 -2
  30. package/dist/{chunk-SS5YEVAI.js → chunk-Y5SE2XMU.js} +2 -2
  31. package/dist/context-mention-palette/index.js +6 -6
  32. package/dist/i18n/index.d.ts +16 -0
  33. package/dist/i18n/index.js +1 -1
  34. package/dist/index.d.ts +124 -102
  35. package/dist/index.js +2298 -996
  36. package/dist/index.js.map +1 -1
  37. package/dist/types-xMz0lJWt.d.ts +173 -0
  38. package/dist/workbench/contribution.d.ts +1 -0
  39. package/dist/workbench/contribution.js +5 -4
  40. package/dist/workbench/index.d.ts +3 -1
  41. package/dist/workbench/index.js +5 -4
  42. package/dist/workbench/launch.d.ts +1 -0
  43. package/dist/workbench/launch.js +2 -2
  44. package/dist/workbench/providerCatalog.d.ts +1 -0
  45. package/dist/workbench/state.d.ts +7 -0
  46. package/dist/workbench/state.js +2 -1
  47. package/dist/workbench/types.d.ts +6 -0
  48. package/dist/workbench/types.js +1 -1
  49. package/dist/workspace-agent-generated-files.js +2 -2
  50. package/package.json +13 -12
  51. package/dist/chunk-2ADVHCST.js.map +0 -1
  52. package/dist/chunk-44YASHVW.js.map +0 -1
  53. package/dist/chunk-7F4M55U3.js.map +0 -1
  54. package/dist/chunk-JL2WNRYC.js.map +0 -1
  55. package/dist/chunk-L7FBT3VR.js.map +0 -1
  56. package/dist/chunk-MUZMBEFO.js.map +0 -1
  57. package/dist/chunk-NCS7X3XY.js.map +0 -1
  58. /package/dist/{chunk-MKSRP5XS.js.map → chunk-EQ4RSPQE.js.map} +0 -0
  59. /package/dist/{chunk-JNGYJ7GM.js.map → chunk-EU7RWKHE.js.map} +0 -0
  60. /package/dist/{chunk-XROBPALT.js.map → chunk-RE3AHBX6.js.map} +0 -0
  61. /package/dist/{chunk-WHWZZYBV.js.map → chunk-Y2DQJPTL.js.map} +0 -0
  62. /package/dist/{chunk-SS5YEVAI.js.map → chunk-Y5SE2XMU.js.map} +0 -0
@@ -108,6 +108,73 @@
108
108
  color: var(--text-primary);
109
109
  }
110
110
 
111
+ .tsh-zoom-dialog__image-actions {
112
+ position: fixed;
113
+ top: max(20px, calc(var(--cove-titlebar-reserve, 0px) + 10px));
114
+ right: 72px;
115
+ z-index: 100301;
116
+ display: flex;
117
+ gap: 8px;
118
+ }
119
+
120
+ .tsh-image-context-menu {
121
+ position: fixed;
122
+ z-index: 100302;
123
+ min-width: 148px;
124
+ overflow: hidden;
125
+ border: 1px solid var(--line-2);
126
+ border-radius: 8px;
127
+ background: var(--background-panel);
128
+ box-shadow: 0 18px 40px color-mix(in srgb, black 26%, transparent);
129
+ color: var(--text-primary);
130
+ padding: 4px;
131
+ -webkit-app-region: no-drag;
132
+ }
133
+
134
+ .tsh-zoom-dialog__image-actions button,
135
+ .tsh-image-context-menu button {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: 8px;
139
+ border: 0;
140
+ border-radius: 6px;
141
+ background: transparent;
142
+ color: inherit;
143
+ cursor: pointer;
144
+ font: inherit;
145
+ font-size: 13px;
146
+ line-height: 20px;
147
+ }
148
+
149
+ .tsh-zoom-dialog__image-actions button {
150
+ justify-content: center;
151
+ width: 40px;
152
+ height: 40px;
153
+ background: color-mix(in srgb, var(--background-panel) 78%, black 22%);
154
+ box-shadow:
155
+ 0 18px 40px color-mix(in srgb, black 26%, transparent),
156
+ 0 0 0 1px color-mix(in srgb, white 12%, transparent);
157
+ }
158
+
159
+ .tsh-zoom-dialog__image-actions button span {
160
+ position: absolute;
161
+ width: 1px;
162
+ height: 1px;
163
+ overflow: hidden;
164
+ clip: rect(0 0 0 0);
165
+ white-space: nowrap;
166
+ }
167
+
168
+ .tsh-image-context-menu button {
169
+ width: 100%;
170
+ padding: 7px 10px;
171
+ }
172
+
173
+ .tsh-zoom-dialog__image-actions button:hover,
174
+ .tsh-image-context-menu button:hover {
175
+ background: color-mix(in srgb, var(--background-panel) 82%, white 12%);
176
+ }
177
+
111
178
  .workspace-agents-status-panel {
112
179
  --workspace-agents-status-panel-chrome-gap: 8px;
113
180
  --workspace-room-top-bar-safe-area: 52px;
@@ -0,0 +1,123 @@
1
+ // providerTargets.ts
2
+ var agentGUIProviderTargetFallbackLabels = {
3
+ "claude-code": "Claude Code",
4
+ codex: "Codex",
5
+ gemini: "Gemini",
6
+ hermes: "Hermes",
7
+ nexight: "Nexight",
8
+ openclaw: "OpenClaw"
9
+ };
10
+ var agentGUIDefaultTargetProviders = [
11
+ "codex",
12
+ "claude-code",
13
+ "nexight",
14
+ "hermes",
15
+ "gemini",
16
+ "openclaw"
17
+ ];
18
+ function createLocalAgentGUIProviderTarget(provider) {
19
+ return {
20
+ targetId: localAgentGUIProviderTargetId(provider),
21
+ provider,
22
+ ref: {
23
+ kind: "local",
24
+ provider
25
+ },
26
+ label: agentGUIProviderTargetFallbackLabels[provider] ?? provider
27
+ };
28
+ }
29
+ function createLocalAgentGUIProviderTargets(providers = agentGUIDefaultTargetProviders) {
30
+ return providers.map(
31
+ (provider) => createLocalAgentGUIProviderTarget(provider)
32
+ );
33
+ }
34
+ function localAgentGUIProviderTargetId(provider) {
35
+ return `local:${provider}`;
36
+ }
37
+ function normalizeAgentGUIProviderTargets(targets, options) {
38
+ const fallbackToLocal = options?.fallbackToLocal !== false;
39
+ const source = targets && targets.length > 0 ? targets : [];
40
+ const normalizedTargets = [];
41
+ const seenTargetKeys = /* @__PURE__ */ new Set();
42
+ for (const target of source) {
43
+ const normalized = normalizeAgentGUIProviderTarget(target);
44
+ if (!normalized) {
45
+ continue;
46
+ }
47
+ const dedupeKey = `${normalized.provider}\0${normalized.targetId}`;
48
+ if (seenTargetKeys.has(dedupeKey)) {
49
+ continue;
50
+ }
51
+ seenTargetKeys.add(dedupeKey);
52
+ normalizedTargets.push(normalized);
53
+ }
54
+ return normalizedTargets.length > 0 || !fallbackToLocal ? normalizedTargets : createLocalAgentGUIProviderTargets();
55
+ }
56
+ function resolveAgentGUIProviderTarget(input) {
57
+ const providerTargets = input.providerTargets.filter(
58
+ (target) => target.provider === input.provider
59
+ );
60
+ const targetById = new Map(
61
+ providerTargets.map((target) => [target.targetId, target])
62
+ );
63
+ return targetById.get(input.providerTargetId?.trim() ?? "") ?? targetById.get(input.defaultProviderTargetId?.trim() ?? "") ?? targetById.get(localAgentGUIProviderTargetId(input.provider)) ?? providerTargets.find((target) => target.disabled !== true) ?? providerTargets[0] ?? createLocalAgentGUIProviderTarget(input.provider);
64
+ }
65
+ function agentGUIProviderTargetRefsEqual(left, right) {
66
+ if (left === right) {
67
+ return true;
68
+ }
69
+ if (!left && !right) {
70
+ return true;
71
+ }
72
+ if (!left || !right) {
73
+ return false;
74
+ }
75
+ return stableProviderTargetRefKey(left) === stableProviderTargetRefKey(right);
76
+ }
77
+ function normalizeAgentGUIProviderTarget(target) {
78
+ const targetId = target.targetId.trim();
79
+ const label = target.label.trim();
80
+ const kind = typeof target.ref.kind === "string" ? target.ref.kind.trim() : "";
81
+ if (!targetId || !label || !kind || target.ref.provider !== target.provider) {
82
+ return null;
83
+ }
84
+ return {
85
+ ...target,
86
+ targetId,
87
+ provider: target.provider,
88
+ ref: {
89
+ ...target.ref,
90
+ kind,
91
+ provider: target.provider
92
+ },
93
+ label,
94
+ ...target.description?.trim() ? { description: target.description.trim() } : {},
95
+ ...target.ownerLabel?.trim() ? { ownerLabel: target.ownerLabel.trim() } : {},
96
+ ...target.unavailableReason?.trim() ? { unavailableReason: target.unavailableReason.trim() } : {}
97
+ };
98
+ }
99
+ function stableProviderTargetRefKey(ref) {
100
+ return JSON.stringify(sortProviderTargetRefValue(ref));
101
+ }
102
+ function sortProviderTargetRefValue(value) {
103
+ if (Array.isArray(value)) {
104
+ return value.map(sortProviderTargetRefValue);
105
+ }
106
+ if (!value || typeof value !== "object") {
107
+ return value;
108
+ }
109
+ return Object.fromEntries(
110
+ Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entryValue]) => [key, sortProviderTargetRefValue(entryValue)])
111
+ );
112
+ }
113
+
114
+ export {
115
+ agentGUIDefaultTargetProviders,
116
+ createLocalAgentGUIProviderTarget,
117
+ createLocalAgentGUIProviderTargets,
118
+ localAgentGUIProviderTargetId,
119
+ normalizeAgentGUIProviderTargets,
120
+ resolveAgentGUIProviderTarget,
121
+ agentGUIProviderTargetRefsEqual
122
+ };
123
+ //# sourceMappingURL=chunk-4K22O34C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../providerTargets.ts"],"sourcesContent":["import type {\n AgentGUIProvider,\n AgentGUIProviderTarget,\n AgentGUIProviderTargetRef\n} from \"./types.ts\";\n\nconst agentGUIProviderTargetFallbackLabels: Record<AgentGUIProvider, string> = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n gemini: \"Gemini\",\n hermes: \"Hermes\",\n nexight: \"Nexight\",\n openclaw: \"OpenClaw\"\n};\n\nexport const agentGUIDefaultTargetProviders = [\n \"codex\",\n \"claude-code\",\n \"nexight\",\n \"hermes\",\n \"gemini\",\n \"openclaw\"\n] as const satisfies readonly AgentGUIProvider[];\n\nexport function createLocalAgentGUIProviderTarget(\n provider: AgentGUIProvider\n): AgentGUIProviderTarget {\n return {\n targetId: localAgentGUIProviderTargetId(provider),\n provider,\n ref: {\n kind: \"local\",\n provider\n },\n label: agentGUIProviderTargetFallbackLabels[provider] ?? provider\n };\n}\n\nexport function createLocalAgentGUIProviderTargets(\n providers: readonly AgentGUIProvider[] = agentGUIDefaultTargetProviders\n): AgentGUIProviderTarget[] {\n return providers.map((provider) =>\n createLocalAgentGUIProviderTarget(provider)\n );\n}\n\nexport function localAgentGUIProviderTargetId(\n provider: AgentGUIProvider\n): string {\n return `local:${provider}`;\n}\n\nexport function normalizeAgentGUIProviderTargets(\n targets: readonly AgentGUIProviderTarget[] | null | undefined,\n options?: { fallbackToLocal?: boolean }\n): AgentGUIProviderTarget[] {\n const fallbackToLocal = options?.fallbackToLocal !== false;\n const source = targets && targets.length > 0 ? targets : [];\n const normalizedTargets: AgentGUIProviderTarget[] = [];\n const seenTargetKeys = new Set<string>();\n for (const target of source) {\n const normalized = normalizeAgentGUIProviderTarget(target);\n if (!normalized) {\n continue;\n }\n const dedupeKey = `${normalized.provider}\\u0000${normalized.targetId}`;\n if (seenTargetKeys.has(dedupeKey)) {\n continue;\n }\n seenTargetKeys.add(dedupeKey);\n normalizedTargets.push(normalized);\n }\n return normalizedTargets.length > 0 || !fallbackToLocal\n ? normalizedTargets\n : createLocalAgentGUIProviderTargets();\n}\n\nexport function resolveAgentGUIProviderTarget(input: {\n defaultProviderTargetId?: string | null;\n provider: AgentGUIProvider;\n providerTargetId?: string | null;\n providerTargets: readonly AgentGUIProviderTarget[];\n}): AgentGUIProviderTarget {\n const providerTargets = input.providerTargets.filter(\n (target) => target.provider === input.provider\n );\n const targetById = new Map(\n providerTargets.map((target) => [target.targetId, target])\n );\n return (\n targetById.get(input.providerTargetId?.trim() ?? \"\") ??\n targetById.get(input.defaultProviderTargetId?.trim() ?? \"\") ??\n targetById.get(localAgentGUIProviderTargetId(input.provider)) ??\n providerTargets.find((target) => target.disabled !== true) ??\n providerTargets[0] ??\n createLocalAgentGUIProviderTarget(input.provider)\n );\n}\n\nexport function agentGUIProviderTargetRefsEqual(\n left: AgentGUIProviderTargetRef | null | undefined,\n right: AgentGUIProviderTargetRef | null | undefined\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left && !right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return stableProviderTargetRefKey(left) === stableProviderTargetRefKey(right);\n}\n\nfunction normalizeAgentGUIProviderTarget(\n target: AgentGUIProviderTarget\n): AgentGUIProviderTarget | null {\n const targetId = target.targetId.trim();\n const label = target.label.trim();\n const kind =\n typeof target.ref.kind === \"string\" ? target.ref.kind.trim() : \"\";\n if (!targetId || !label || !kind || target.ref.provider !== target.provider) {\n return null;\n }\n return {\n ...target,\n targetId,\n provider: target.provider,\n ref: {\n ...target.ref,\n kind,\n provider: target.provider\n },\n label,\n ...(target.description?.trim()\n ? { description: target.description.trim() }\n : {}),\n ...(target.ownerLabel?.trim()\n ? { ownerLabel: target.ownerLabel.trim() }\n : {}),\n ...(target.unavailableReason?.trim()\n ? { unavailableReason: target.unavailableReason.trim() }\n : {})\n };\n}\n\nfunction stableProviderTargetRefKey(ref: AgentGUIProviderTargetRef): string {\n return JSON.stringify(sortProviderTargetRefValue(ref));\n}\n\nfunction sortProviderTargetRefValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortProviderTargetRefValue);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, sortProviderTargetRefValue(entryValue)])\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AgentGUIConversation_styles_default,
3
3
  AgentMessageMarkdown,
4
+ ConversationImageContextMenu,
4
5
  CustomScrollArea,
5
6
  MessageSquareMoreIcon,
6
7
  ZoomableImage,
@@ -10,14 +11,14 @@ import {
10
11
  resolveWorkspaceFileLinkAction,
11
12
  resolveWorkspaceFilePathCandidate,
12
13
  resolveWorkspaceLinkAction
13
- } from "./chunk-44YASHVW.js";
14
+ } from "./chunk-WC34LVH6.js";
14
15
  import {
15
16
  attrsToMentionItem,
16
17
  createAgentFileMentionExtension,
17
18
  formatAgentMentionMarkdown,
18
19
  mentionItemToAttrs,
19
20
  parseAgentMentionMarkdown
20
- } from "./chunk-XROBPALT.js";
21
+ } from "./chunk-RE3AHBX6.js";
21
22
  import {
22
23
  fileChangeCountFromChanges,
23
24
  fileChangeEntriesFromChanges,
@@ -27,13 +28,13 @@ import {
27
28
  import {
28
29
  getOptionalAgentActivityRuntime,
29
30
  useOptionalAgentHostApi
30
- } from "./chunk-2ADVHCST.js";
31
+ } from "./chunk-TXXWUG2J.js";
31
32
  import {
32
33
  workspaceAgentProviderLabel
33
34
  } from "./chunk-TYGL25EL.js";
34
35
  import {
35
36
  translate
36
- } from "./chunk-JL2WNRYC.js";
37
+ } from "./chunk-WJPEKD3F.js";
37
38
 
38
39
  // shared/imageGenerationTool.ts
39
40
  var KNOWN_IMAGE_GENERATION_TOOL_NAMES = /* @__PURE__ */ new Set([
@@ -3904,6 +3905,21 @@ function dedupeFiles(files) {
3904
3905
  byPath.set(file.path, file);
3905
3906
  return;
3906
3907
  }
3908
+ if (existing.changeType === "deleted" && file.changeType === "created") {
3909
+ byPath.set(file.path, {
3910
+ ...file,
3911
+ changeType: "modified",
3912
+ unifiedDiff: null,
3913
+ oldString: existing.oldString ?? existing.content ?? existing.unifiedDiff ?? null,
3914
+ newString: file.newString ?? file.content ?? file.unifiedDiff ?? null,
3915
+ content: null
3916
+ });
3917
+ return;
3918
+ }
3919
+ if (file.changeType === "deleted" || existing.changeType === "deleted") {
3920
+ byPath.set(file.path, file);
3921
+ return;
3922
+ }
3907
3923
  if (existing.changeType === "modified" && file.changeType === "created") {
3908
3924
  byPath.set(file.path, file);
3909
3925
  return;
@@ -6876,7 +6892,7 @@ function AgentUserImageGrid({
6876
6892
  "div",
6877
6893
  {
6878
6894
  className: "max-h-20 min-w-0 overflow-hidden rounded-[6px]",
6879
- children: src ? /* @__PURE__ */ jsx12(
6895
+ children: src ? /* @__PURE__ */ jsx12(ConversationImageContextMenu, { src, children: /* @__PURE__ */ jsx12(
6880
6896
  ZoomableImage,
6881
6897
  {
6882
6898
  src,
@@ -6884,7 +6900,7 @@ function AgentUserImageGrid({
6884
6900
  className: "block max-h-20 w-full rounded-[6px] object-contain",
6885
6901
  draggable: false
6886
6902
  }
6887
- ) : loading ? /* @__PURE__ */ jsx12(
6903
+ ) }) : loading ? /* @__PURE__ */ jsx12(
6888
6904
  "div",
6889
6905
  {
6890
6906
  className: "flex h-20 w-full items-center justify-center bg-[color-mix(in_srgb,var(--text-primary)_6%,transparent)]",
@@ -10592,6 +10608,7 @@ function ImageGenerationPreview({
10592
10608
  className: cn(
10593
10609
  "block max-h-[360px] max-w-full rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] object-contain"
10594
10610
  ),
10611
+ downloadName: localPath ? localPath.split(/[\\/]/).pop() : "image.png",
10595
10612
  src,
10596
10613
  wrapElement: "span"
10597
10614
  }
@@ -12715,4 +12732,4 @@ export {
12715
12732
  AgentConversationFlow,
12716
12733
  useProjectedAgentConversation
12717
12734
  };
12718
- //# sourceMappingURL=chunk-7F4M55U3.js.map
12735
+ //# sourceMappingURL=chunk-DO7D7OOL.js.map