@nextclaw/ui 0.23.0 → 0.24.0-beta.1

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 (123) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/assets/api-BqVIq0lF.js +13 -0
  3. package/dist/assets/{appearance-settings-page-C_AqxSF_.js → appearance-settings-page-CTWn1eAT.js} +1 -1
  4. package/dist/assets/{book-open-DYRapW_h.js → book-open-o2x7OLiO.js} +1 -1
  5. package/dist/assets/{channels-list-page-uR-M4Ls8.js → channels-list-page-Bzn-pzyJ.js} +2 -2
  6. package/dist/assets/{config-split-page-DJDp86Ne.js → config-split-page-CnRbXXlh.js} +1 -1
  7. package/dist/assets/{confirm-dialog-CHVBMpla.js → confirm-dialog-B_Hbcra2.js} +1 -1
  8. package/dist/assets/{createLucideIcon-CgM0rnsa.js → createLucideIcon-rwwpqyks.js} +1 -1
  9. package/dist/assets/{desktop-capabilities-page-phMuNq1B.js → desktop-capabilities-page-C2ayYQTr.js} +1 -1
  10. package/dist/assets/desktop-update-config-C13czpyL.js +1 -0
  11. package/dist/assets/{dist-N9zc5bkM.js → dist-BsF3hfOi.js} +1 -1
  12. package/dist/assets/{dist-BjYvUhPL.js → dist-aNN3iQxV.js} +1 -1
  13. package/dist/assets/{doc-browser-DwRLokCI.js → doc-browser-D8dIOo9E.js} +1 -1
  14. package/dist/assets/doc-browser-DcuOOtpP.js +1 -0
  15. package/dist/assets/{doc-browser-context-BDuypObS.js → doc-browser-context-Dhsit2Ma.js} +1 -1
  16. package/dist/assets/{extensions-CQKXTqTI.js → extensions-CD6xvKF_.js} +1 -1
  17. package/dist/assets/{form-actions-CzGmrPAv.js → form-actions-CC4Wz_lL.js} +1 -1
  18. package/dist/assets/index-BTsbdtv6.js +109 -0
  19. package/dist/assets/index-Bcfy2kTh.css +1 -0
  20. package/dist/assets/loader-circle-B6aFbB-8.js +1 -0
  21. package/dist/assets/mcp-marketplace-page-BtUAypA7.js +1 -0
  22. package/dist/assets/{mcp-marketplace-page-s9PTnSDT.js → mcp-marketplace-page-r2MmD9xO.js} +1 -1
  23. package/dist/assets/{model-config-page-CxnCUWRW.js → model-config-page-DboxoT-I.js} +1 -1
  24. package/dist/assets/{navigation-link-Ci4Z7Phi.js → navigation-link-C_6oj3zz.js} +1 -1
  25. package/dist/assets/plus-DRsq9Kvs.js +1 -0
  26. package/dist/assets/privacy-settings-page-C2sDBqhb.js +1 -0
  27. package/dist/assets/projects-BcPcx-uD.js +1 -0
  28. package/dist/assets/providers-config-page-CmUFl9RF.js +1 -0
  29. package/dist/assets/react-BjO9I4WZ.js +8 -0
  30. package/dist/assets/{refresh-cw-C-3_thgr.js → refresh-cw-DsT2kvXi.js} +1 -1
  31. package/dist/assets/remote-Ci6x91ES.js +1 -0
  32. package/dist/assets/{rotate-cw-DSFTq_yu.js → rotate-cw-BCAs6c3R.js} +1 -1
  33. package/dist/assets/runtime-config-page-cQKNeAjL.js +1 -0
  34. package/dist/assets/{save-CpPr78_S.js → save-CadRMTMQ.js} +1 -1
  35. package/dist/assets/{search-msqk2-rd.js → search-B6tB4fzB.js} +1 -1
  36. package/dist/assets/{search-config-page-D3_qNXbB.js → search-config-page-C8lOIkxn.js} +1 -1
  37. package/dist/assets/{secrets-config-page-Be4P1E8o.js → secrets-config-page-8clzAag2.js} +2 -2
  38. package/dist/assets/security-config-DPbM6IVT.js +1 -0
  39. package/dist/assets/{select-DPKCWajZ.js → select-CO9S_C2C.js} +1 -1
  40. package/dist/assets/skeleton-IHILNhIW.js +1 -0
  41. package/dist/assets/{tag-chip-Dc_NcCEe.js → tag-chip-BZKk0UkK.js} +1 -1
  42. package/dist/assets/x-BuvHIb1d.js +1 -0
  43. package/dist/index.html +21 -21
  44. package/package.json +6 -6
  45. package/src/app/configs/__tests__/app-navigation.config.test.ts +20 -0
  46. package/src/app/configs/app-navigation.config.ts +10 -0
  47. package/src/app/index.tsx +8 -1
  48. package/src/features/apps/components/__tests__/app-packages-panel.test.tsx +362 -241
  49. package/src/features/apps/components/app-document-access-section.tsx +187 -0
  50. package/src/features/apps/components/app-package-card.tsx +150 -275
  51. package/src/features/apps/hooks/use-app-packages.ts +91 -35
  52. package/src/features/chat/components/conversation/__tests__/chat-conversation-workspace-section.test.tsx +29 -0
  53. package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +4 -2
  54. package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +21 -0
  55. package/src/features/chat/components/layout/chat-page-shell.tsx +19 -4
  56. package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +1 -1
  57. package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +0 -1
  58. package/src/features/chat/features/conversation/utils/__tests__/session-message-composer.utils.test.ts +11 -4
  59. package/src/features/chat/features/conversation/utils/__tests__/session-queued-input.utils.test.ts +0 -1
  60. package/src/features/chat/features/conversation/utils/session-message-composer.utils.ts +10 -11
  61. package/src/features/chat/features/input/input-surface-plugins/__tests__/context-reference-plugin.test.ts +1 -0
  62. package/src/features/chat/features/message/hooks/use-chat-message-actions.tsx +0 -2
  63. package/src/features/chat/features/runtime/utils/chat-runtime.utils.ts +0 -14
  64. package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +70 -22
  65. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +79 -32
  66. package/src/features/chat/features/session/utils/__tests__/chat-sidebar-session-groups.utils.test.ts +2 -0
  67. package/src/features/chat/features/session/utils/chat-run-metadata.utils.ts +0 -6
  68. package/src/features/chat/features/session/utils/chat-sidebar-session-groups.utils.ts +2 -0
  69. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-project-options.utils.test.ts +1 -0
  70. package/src/features/chat/index.ts +5 -1
  71. package/src/features/chat/managers/__tests__/chat-session-list.manager.test.ts +27 -0
  72. package/src/features/chat/pages/__tests__/ncp-chat-page.test.ts +2 -14
  73. package/src/features/chat/types/chat-run.types.ts +0 -1
  74. package/src/features/projects/AGENTS.md +7 -0
  75. package/src/features/projects/components/project-agreement.tsx +92 -0
  76. package/src/features/projects/components/project-artifacts.test.tsx +77 -0
  77. package/src/features/projects/components/project-artifacts.tsx +188 -0
  78. package/src/features/projects/components/project-overview.tsx +81 -0
  79. package/src/features/projects/components/project-requests.tsx +57 -0
  80. package/src/features/projects/components/project-runs.tsx +60 -0
  81. package/src/features/projects/components/project-section.tsx +60 -0
  82. package/src/features/projects/components/project-skills.tsx +53 -0
  83. package/src/features/projects/components/work/project-work-item-drawer.test.tsx +65 -0
  84. package/src/features/projects/components/work/project-work-item-drawer.tsx +367 -0
  85. package/src/features/projects/components/work/project-work-items.test.tsx +98 -0
  86. package/src/features/projects/components/work/project-work-items.tsx +199 -0
  87. package/src/features/projects/components/work/project-work-state-settings.tsx +285 -0
  88. package/src/features/projects/hooks/use-project-observation.test.tsx +93 -0
  89. package/src/features/projects/hooks/use-project-observation.ts +115 -0
  90. package/src/features/projects/hooks/use-project-work.test.tsx +58 -0
  91. package/src/features/projects/hooks/use-project-work.ts +215 -0
  92. package/src/features/projects/index.ts +2 -0
  93. package/src/features/projects/pages/project-home-page.tsx +234 -0
  94. package/src/features/projects/pages/projects-page.test.tsx +137 -0
  95. package/src/features/projects/presenters/project-home.presenter.test.ts +74 -0
  96. package/src/features/projects/presenters/project-home.presenter.ts +55 -0
  97. package/src/features/projects/utils/project-artifact-view.utils.test.ts +63 -0
  98. package/src/features/projects/utils/project-artifact-view.utils.ts +62 -0
  99. package/src/features/projects/utils/project-request-response.utils.test.ts +44 -0
  100. package/src/features/projects/utils/project-request-response.utils.ts +39 -0
  101. package/src/shared/lib/i18n/index.ts +6 -2
  102. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +16 -1
  103. package/src/shared/lib/i18n/locales/en-US/projects.json +149 -0
  104. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +16 -1
  105. package/src/shared/lib/i18n/locales/zh-CN/projects.json +149 -0
  106. package/src/shared/lib/ui-document-title/__tests__/ui-document-title.test.ts +6 -0
  107. package/src/shared/lib/ui-document-title/index.ts +1 -0
  108. package/dist/assets/api-n96IfCKb.js +0 -13
  109. package/dist/assets/desktop-update-config-C77hkbor.js +0 -1
  110. package/dist/assets/doc-browser-JlXVLNRe.js +0 -1
  111. package/dist/assets/index-CLw9DuCJ.js +0 -109
  112. package/dist/assets/index-CwCTiMM9.css +0 -1
  113. package/dist/assets/loader-circle-D9etMT9f.js +0 -1
  114. package/dist/assets/mcp-marketplace-page-CbWOamyW.js +0 -1
  115. package/dist/assets/plus-DKGD04AO.js +0 -1
  116. package/dist/assets/privacy-settings-page-D8HZHHjL.js +0 -1
  117. package/dist/assets/providers-config-page-C0GIoGxm.js +0 -1
  118. package/dist/assets/react-CVFx225w.js +0 -8
  119. package/dist/assets/remote-DvTCSAxQ.js +0 -1
  120. package/dist/assets/runtime-config-page-VNJZui5f.js +0 -1
  121. package/dist/assets/security-config-BtcpKIhQ.js +0 -1
  122. package/dist/assets/skeleton-BsR5rwB7.js +0 -1
  123. package/dist/assets/x-Dp5GAFmP.js +0 -1
@@ -0,0 +1,187 @@
1
+ import { useState } from "react";
2
+ import type { AppPackageView } from "@nextclaw/client-sdk";
3
+ import { FolderKey, ShieldCheck, Trash2 } from "lucide-react";
4
+ import { useAppDocumentAccessMutation } from "@/features/apps/hooks/use-app-packages";
5
+ import { ServerPathPickerDialog } from "@/shared/components/path-picker/server-path-picker-dialog";
6
+ import { Button } from "@/shared/components/ui/button";
7
+ import { t } from "@/shared/lib/i18n";
8
+
9
+ type DocumentScope = AppPackageView["documentAccess"][number];
10
+
11
+ export function AppDocumentAccessSection({
12
+ appId,
13
+ appName,
14
+ disabled,
15
+ scopes,
16
+ }: {
17
+ appId: string;
18
+ appName: string;
19
+ disabled: boolean;
20
+ scopes: DocumentScope[];
21
+ }) {
22
+ const mutation = useAppDocumentAccessMutation();
23
+ const [activeScopeId, setActiveScopeId] = useState<string | null>(null);
24
+ const [modes, setModes] = useState<Record<string, "read" | "read-write">>({});
25
+ const activeScope = scopes.find((scope) => scope.id === activeScopeId);
26
+ const effectiveMode = activeScope
27
+ ? (modes[activeScope.id] ?? activeScope.effectiveMode ?? "read")
28
+ : "read";
29
+
30
+ if (scopes.length === 0) return null;
31
+
32
+ const error = mutation.error instanceof Error ? mutation.error.message : null;
33
+
34
+ return (
35
+ <section className="border-t border-border/60 bg-muted/10 px-4 py-3">
36
+ <div className="mb-2 flex items-center gap-2">
37
+ <FolderKey className="h-3.5 w-3.5 text-muted-foreground" />
38
+ <h3 className="text-xs font-semibold text-foreground">
39
+ {t("appPackagesDocumentAccessTitle")}
40
+ </h3>
41
+ </div>
42
+ <div className="space-y-2">
43
+ {scopes.map((scope) => {
44
+ const selectedMode = modes[scope.id] ?? scope.effectiveMode ?? "read";
45
+ return (
46
+ <div
47
+ key={scope.id}
48
+ className="rounded-lg border border-border/60 bg-card px-3 py-2.5"
49
+ >
50
+ <div className="flex flex-wrap items-start justify-between gap-2">
51
+ <div className="min-w-0 flex-1">
52
+ <div className="flex items-center gap-1.5 text-xs font-medium text-foreground">
53
+ <ShieldCheck className="h-3.5 w-3.5 text-muted-foreground" />
54
+ <code>{scope.id}</code>
55
+ <span className="font-normal text-muted-foreground">
56
+ {scope.status === "ungranted"
57
+ ? t("appPackagesDocumentAccessUngranted")
58
+ : scope.status === "unavailable"
59
+ ? t("appPackagesDocumentAccessUnavailable")
60
+ : scope.effectiveMode === "read-write"
61
+ ? t("appPackagesDocumentAccessReadWrite")
62
+ : t("appPackagesDocumentAccessRead")}
63
+ </span>
64
+ </div>
65
+ {scope.description ? (
66
+ <p className="mt-1 text-[11px] leading-4 text-muted-foreground">
67
+ {scope.description}
68
+ </p>
69
+ ) : null}
70
+ {scope.grantedPath ? (
71
+ <code
72
+ className="mt-1 block truncate text-[10px] text-muted-foreground"
73
+ title={scope.grantedPath}
74
+ >
75
+ {scope.grantedPath}
76
+ </code>
77
+ ) : null}
78
+ </div>
79
+ <div className="flex shrink-0 items-center gap-1.5">
80
+ <label
81
+ className="sr-only"
82
+ htmlFor={`${appId}-${scope.id}-mode`}
83
+ >
84
+ {t("appPackagesDocumentAccessMode")}
85
+ </label>
86
+ <select
87
+ id={`${appId}-${scope.id}-mode`}
88
+ value={selectedMode}
89
+ disabled={disabled || mutation.isPending}
90
+ onChange={(event) =>
91
+ setModes((current) => ({
92
+ ...current,
93
+ [scope.id]: event.target.value as "read" | "read-write",
94
+ }))
95
+ }
96
+ className="h-8 rounded-md border border-input bg-background px-2 text-[11px] text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
97
+ >
98
+ <option value="read">
99
+ {t("appPackagesDocumentAccessRead")}
100
+ </option>
101
+ {scope.mode === "read-write" ? (
102
+ <option value="read-write">
103
+ {t("appPackagesDocumentAccessReadWrite")}
104
+ </option>
105
+ ) : null}
106
+ </select>
107
+ <Button
108
+ type="button"
109
+ size="sm"
110
+ variant="outline"
111
+ disabled={disabled || mutation.isPending}
112
+ onClick={() => {
113
+ mutation.reset();
114
+ setActiveScopeId(scope.id);
115
+ }}
116
+ >
117
+ {scope.granted
118
+ ? t("appPackagesDocumentAccessReplace")
119
+ : t("appPackagesDocumentAccessChoose")}
120
+ </Button>
121
+ {scope.granted ? (
122
+ <button
123
+ type="button"
124
+ aria-label={t("appPackagesDocumentAccessRevoke")}
125
+ title={t("appPackagesDocumentAccessRevoke")}
126
+ disabled={disabled || mutation.isPending}
127
+ onClick={() =>
128
+ mutation.mutate({
129
+ action: "revoke",
130
+ appId,
131
+ scopeId: scope.id,
132
+ })
133
+ }
134
+ className="rounded-md p-2 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50"
135
+ >
136
+ <Trash2 className="h-3.5 w-3.5" />
137
+ </button>
138
+ ) : null}
139
+ </div>
140
+ </div>
141
+ </div>
142
+ );
143
+ })}
144
+ </div>
145
+ {error ? (
146
+ <p role="alert" className="mt-2 text-xs text-destructive">
147
+ {error}
148
+ </p>
149
+ ) : null}
150
+ <ServerPathPickerDialog
151
+ open={Boolean(activeScope)}
152
+ currentPath={activeScope?.grantedPath}
153
+ isSaving={mutation.isPending}
154
+ onOpenChange={(open) => {
155
+ if (!open) setActiveScopeId(null);
156
+ }}
157
+ onConfirm={async (directoryPath) => {
158
+ if (!activeScope) return;
159
+ await mutation.mutateAsync({
160
+ action: "grant",
161
+ appId,
162
+ scopeId: activeScope.id,
163
+ directoryPath,
164
+ mode: effectiveMode,
165
+ });
166
+ setActiveScopeId(null);
167
+ }}
168
+ title={`${t("appPackagesDocumentAccessChooseTitle")} · ${appName}`}
169
+ description={
170
+ activeScope?.description ??
171
+ t("appPackagesDocumentAccessChooseDescription")
172
+ }
173
+ pathLabel={t("appPackagesDocumentAccessPath")}
174
+ confirmLabel={
175
+ activeScope?.granted
176
+ ? t("appPackagesDocumentAccessReplace")
177
+ : t("appPackagesDocumentAccessGrant")
178
+ }
179
+ hint={
180
+ effectiveMode === "read-write"
181
+ ? t("appPackagesDocumentAccessWriteWarning")
182
+ : t("appPackagesDocumentAccessReadHint")
183
+ }
184
+ />
185
+ </section>
186
+ );
187
+ }