@stigmer/react 3.12.4 → 3.12.5
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.
- package/attachment/AttachmentChipList.js +16 -6
- package/attachment/AttachmentChipList.js.map +1 -1
- package/attachment/index.d.ts +1 -1
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js.map +1 -1
- package/attachment/useAttachments.d.ts +51 -8
- package/attachment/useAttachments.d.ts.map +1 -1
- package/attachment/useAttachments.js +74 -3
- package/attachment/useAttachments.js.map +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +17 -10
- package/composer/SessionComposer.js.map +1 -1
- package/conversation/ConversationComposer.d.ts +19 -3
- package/conversation/ConversationComposer.d.ts.map +1 -1
- package/conversation/ConversationComposer.js +4 -4
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationTemplatePickerDialog.d.ts +63 -0
- package/conversation/ConversationTemplatePickerDialog.d.ts.map +1 -0
- package/conversation/ConversationTemplatePickerDialog.js +151 -0
- package/conversation/ConversationTemplatePickerDialog.js.map +1 -0
- package/conversation/ConversationsWorkbench.d.ts.map +1 -1
- package/conversation/ConversationsWorkbench.js +16 -5
- package/conversation/ConversationsWorkbench.js.map +1 -1
- package/conversation/index.d.ts +3 -1
- package/conversation/index.d.ts.map +1 -1
- package/conversation/index.js +1 -0
- package/conversation/index.js.map +1 -1
- package/conversation/useConversationParticipation.d.ts +41 -4
- package/conversation/useConversationParticipation.d.ts.map +1 -1
- package/conversation/useConversationParticipation.js +13 -2
- package/conversation/useConversationParticipation.js.map +1 -1
- package/identity-account/AccountPreferencesPanel.d.ts +35 -0
- package/identity-account/AccountPreferencesPanel.d.ts.map +1 -0
- package/identity-account/AccountPreferencesPanel.js +187 -0
- package/identity-account/AccountPreferencesPanel.js.map +1 -0
- package/identity-account/index.d.ts +8 -0
- package/identity-account/index.d.ts.map +1 -1
- package/identity-account/index.js +4 -0
- package/identity-account/index.js.map +1 -1
- package/identity-account/useAccountExecutionDefaults.d.ts +36 -0
- package/identity-account/useAccountExecutionDefaults.d.ts.map +1 -0
- package/identity-account/useAccountExecutionDefaults.js +46 -0
- package/identity-account/useAccountExecutionDefaults.js.map +1 -0
- package/identity-account/useMyIdentityAccount.d.ts +55 -0
- package/identity-account/useMyIdentityAccount.d.ts.map +1 -0
- package/identity-account/useMyIdentityAccount.js +37 -0
- package/identity-account/useMyIdentityAccount.js.map +1 -0
- package/identity-account/useUpdateIdentityAccount.d.ts +42 -0
- package/identity-account/useUpdateIdentityAccount.d.ts.map +1 -0
- package/identity-account/useUpdateIdentityAccount.js +53 -0
- package/identity-account/useUpdateIdentityAccount.js.map +1 -0
- package/index.d.ts +11 -9
- package/index.d.ts.map +1 -1
- package/index.js +8 -5
- package/index.js.map +1 -1
- package/internal/StandingContextField.d.ts +37 -0
- package/internal/StandingContextField.d.ts.map +1 -0
- package/internal/StandingContextField.js +24 -0
- package/internal/StandingContextField.js.map +1 -0
- package/library/InstanceVisibilitySelector.d.ts.map +1 -1
- package/library/InstanceVisibilitySelector.js +9 -2
- package/library/InstanceVisibilitySelector.js.map +1 -1
- package/library/ResourceVisibilityControl.d.ts +13 -3
- package/library/ResourceVisibilityControl.d.ts.map +1 -1
- package/library/ResourceVisibilityControl.js +33 -5
- package/library/ResourceVisibilityControl.js.map +1 -1
- package/library/VisibilityOptionRow.d.ts +6 -0
- package/library/VisibilityOptionRow.d.ts.map +1 -1
- package/library/VisibilityOptionRow.js +11 -1
- package/library/VisibilityOptionRow.js.map +1 -1
- package/library/VisibilitySelector.d.ts.map +1 -1
- package/library/VisibilitySelector.js +14 -2
- package/library/VisibilitySelector.js.map +1 -1
- package/library/index.d.ts +4 -2
- package/library/index.d.ts.map +1 -1
- package/library/index.js +2 -1
- package/library/index.js.map +1 -1
- package/library/useCanSetPublicVisibility.d.ts +30 -0
- package/library/useCanSetPublicVisibility.d.ts.map +1 -0
- package/library/useCanSetPublicVisibility.js +41 -0
- package/library/useCanSetPublicVisibility.js.map +1 -0
- package/library/visibilityLevels.d.ts +32 -1
- package/library/visibilityLevels.d.ts.map +1 -1
- package/library/visibilityLevels.js +34 -14
- package/library/visibilityLevels.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +8 -5
- package/mcp-server/useMcpServerConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerConnect.js +2 -1
- package/mcp-server/useMcpServerConnect.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +7 -2
- package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts +2 -2
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +13 -4
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +32 -5
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/OrgPreferencesPanel.d.ts +32 -0
- package/organization/OrgPreferencesPanel.d.ts.map +1 -0
- package/organization/OrgPreferencesPanel.js +90 -0
- package/organization/OrgPreferencesPanel.js.map +1 -0
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +5 -4
- package/organization/OrgProfilePanel.js.map +1 -1
- package/organization/index.d.ts +2 -0
- package/organization/index.d.ts.map +1 -1
- package/organization/index.js +1 -0
- package/organization/index.js.map +1 -1
- package/package.json +4 -4
- package/session/NewSessionViewer.d.ts +10 -1
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +2 -1
- package/session/NewSessionViewer.js.map +1 -1
- package/session/useNewSessionFlow.d.ts +27 -1
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +45 -8
- package/session/useNewSessionFlow.js.map +1 -1
- package/settings/AccountPreferencesSection.d.ts +3 -0
- package/settings/AccountPreferencesSection.d.ts.map +1 -0
- package/settings/AccountPreferencesSection.js +10 -0
- package/settings/AccountPreferencesSection.js.map +1 -0
- package/settings/OrgPreferencesSection.d.ts +3 -0
- package/settings/OrgPreferencesSection.d.ts.map +1 -0
- package/settings/OrgPreferencesSection.js +13 -0
- package/settings/OrgPreferencesSection.js.map +1 -0
- package/settings/index.d.ts +2 -0
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +2 -0
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +17 -1
- package/settings/settings-nav.js.map +1 -1
- package/src/attachment/AttachmentChipList.tsx +19 -8
- package/src/attachment/__tests__/AttachmentChipList.test.tsx +12 -0
- package/src/attachment/__tests__/useAttachments.test.ts +293 -0
- package/src/attachment/index.ts +1 -0
- package/src/attachment/useAttachments.ts +143 -11
- package/src/composer/SessionComposer.tsx +23 -14
- package/src/conversation/ConversationComposer.tsx +38 -4
- package/src/conversation/ConversationTemplatePickerDialog.tsx +441 -0
- package/src/conversation/ConversationsWorkbench.tsx +40 -4
- package/src/conversation/__tests__/ConversationComposer.test.tsx +56 -1
- package/src/conversation/__tests__/ConversationTemplatePickerDialog.test.tsx +224 -0
- package/src/conversation/__tests__/useConversationParticipation.test.tsx +45 -4
- package/src/conversation/index.ts +4 -0
- package/src/conversation/useConversationParticipation.ts +58 -6
- package/src/identity-account/AccountPreferencesPanel.tsx +446 -0
- package/src/identity-account/__tests__/AccountPreferencesPanel.test.tsx +233 -0
- package/src/identity-account/__tests__/useAccountExecutionDefaults.test.tsx +116 -0
- package/src/identity-account/__tests__/useMyIdentityAccount.test.tsx +121 -0
- package/src/identity-account/index.ts +11 -0
- package/src/identity-account/useAccountExecutionDefaults.ts +63 -0
- package/src/identity-account/useMyIdentityAccount.ts +75 -0
- package/src/identity-account/useUpdateIdentityAccount.ts +73 -0
- package/src/index.ts +24 -2
- package/src/internal/StandingContextField.tsx +92 -0
- package/src/library/InstanceVisibilitySelector.tsx +9 -2
- package/src/library/ResourceVisibilityControl.tsx +46 -13
- package/src/library/VisibilityOptionRow.tsx +28 -6
- package/src/library/VisibilitySelector.tsx +14 -2
- package/src/library/__tests__/VisibilitySelector.test.tsx +48 -1
- package/src/library/__tests__/visibilityLevels.test.ts +67 -1
- package/src/library/index.ts +6 -1
- package/src/library/useCanSetPublicVisibility.ts +56 -0
- package/src/library/visibilityLevels.ts +65 -14
- package/src/mcp-server/__tests__/useMcpServerConnect.asyncLane.test.tsx +117 -0
- package/src/mcp-server/useMcpServerConnect.ts +9 -6
- package/src/mcp-server/useMcpServerOAuthConnect.ts +7 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +58 -3
- package/src/oauth-app/OAuthAppDetailPanel.tsx +84 -3
- package/src/organization/OrgPreferencesPanel.tsx +221 -0
- package/src/organization/OrgProfilePanel.tsx +5 -4
- package/src/organization/__tests__/OrgPreferencesPanel.test.tsx +145 -0
- package/src/organization/__tests__/OrgProfilePanel.test.tsx +108 -0
- package/src/organization/index.ts +2 -0
- package/src/session/NewSessionViewer.tsx +12 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +151 -0
- package/src/session/useNewSessionFlow.ts +76 -9
- package/src/settings/AccountPreferencesSection.tsx +25 -0
- package/src/settings/OrgPreferencesSection.tsx +35 -0
- package/src/settings/__tests__/settings-nav.test.ts +27 -0
- package/src/settings/index.ts +2 -0
- package/src/settings/settings-nav.ts +18 -0
- package/src/workflow/ApprovalFormBuilder.tsx +5 -27
- package/styles.css +1 -1
- package/workflow/ApprovalFormBuilder.d.ts.map +1 -1
- package/workflow/ApprovalFormBuilder.js +8 -5
- package/workflow/ApprovalFormBuilder.js.map +1 -1
|
@@ -58,9 +58,19 @@ function AttachmentChip({ entry, onRemove, onRetry, onPreview, disabled, }) {
|
|
|
58
58
|
}
|
|
59
59
|
/** Shared accessible name: filename, size, and upload status. */
|
|
60
60
|
function chipAriaLabel(entry) {
|
|
61
|
+
const isPreparing = entry.phase === "preparing";
|
|
61
62
|
const isUploading = entry.phase === "uploading";
|
|
62
63
|
const isError = entry.phase === "error";
|
|
63
|
-
return `${entry.file.name}, ${formatFileSize(entry.file.size)}${isUploading ? ", uploading" : ""}${isError ? ", upload failed" : ""}`;
|
|
64
|
+
return `${entry.file.name}, ${formatFileSize(entry.file.size)}${isPreparing ? ", preparing" : ""}${isUploading ? ", uploading" : ""}${isError ? ", upload failed" : ""}`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* True while the entry has work in flight (`preparing` or `uploading`) —
|
|
68
|
+
* the chips render both identically (dimmed + spinner): to the user each
|
|
69
|
+
* means "your file is on its way", and the split is audible in the
|
|
70
|
+
* accessible label where it actually informs.
|
|
71
|
+
*/
|
|
72
|
+
function isChipBusy(entry) {
|
|
73
|
+
return entry.phase === "preparing" || entry.phase === "uploading";
|
|
64
74
|
}
|
|
65
75
|
// ---------------------------------------------------------------------------
|
|
66
76
|
// Image chip — a preview-only thumbnail tile (#371, #372)
|
|
@@ -93,14 +103,14 @@ function ImageAttachmentChip({ entry, onRemove, onRetry, onPreview, disabled, })
|
|
|
93
103
|
return (_jsx(FileAttachmentChip, { entry: entry, onRemove: onRemove, onRetry: onRetry, disabled: disabled }));
|
|
94
104
|
}
|
|
95
105
|
const isError = entry.phase === "error";
|
|
96
|
-
const
|
|
106
|
+
const isBusy = isChipBusy(entry);
|
|
97
107
|
return (
|
|
98
108
|
// The remove badge and retry pill are SIBLINGS of the preview button,
|
|
99
109
|
// absolutely positioned over it — buttons cannot nest inside buttons.
|
|
100
|
-
_jsxs(Tooltip, { children: [_jsxs(TooltipTrigger, { render: _jsx("span", { role: "listitem", "aria-label": chipAriaLabel(entry), className: "stg:relative stg:inline-flex" }), children: [_jsxs("button", { type: "button", onClick: onPreview, "aria-label": `Preview ${entry.file.name}`, className: cn(UNSTYLED_BUTTON, "stg:relative stg:block stg:h-14 stg:w-14 stg:overflow-hidden stg:rounded-md stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring", isError && "stg:ring-1 stg:ring-destructive"), children: [url ? (_jsx("img", { src: url, alt: "", "aria-hidden": "true", onError: () => setLoadFailed(true), className: cn("stg:h-full stg:w-full stg:object-cover", (
|
|
110
|
+
_jsxs(Tooltip, { children: [_jsxs(TooltipTrigger, { render: _jsx("span", { role: "listitem", "aria-label": chipAriaLabel(entry), className: "stg:relative stg:inline-flex" }), children: [_jsxs("button", { type: "button", onClick: onPreview, "aria-label": `Preview ${entry.file.name}`, className: cn(UNSTYLED_BUTTON, "stg:relative stg:block stg:h-14 stg:w-14 stg:overflow-hidden stg:rounded-md stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring", isError && "stg:ring-1 stg:ring-destructive"), children: [url ? (_jsx("img", { src: url, alt: "", "aria-hidden": "true", onError: () => setLoadFailed(true), className: cn("stg:h-full stg:w-full stg:object-cover", (isBusy || isError) && "stg:opacity-50") })) : (
|
|
101
111
|
// One-frame placeholder until the object-URL effect runs; same
|
|
102
112
|
// footprint as the image, so no layout shift.
|
|
103
|
-
_jsx("span", { className: "stg:block stg:h-full stg:w-full stg:animate-pulse stg:bg-muted", "aria-hidden": "true" })),
|
|
113
|
+
_jsx("span", { className: "stg:block stg:h-full stg:w-full stg:animate-pulse stg:bg-muted", "aria-hidden": "true" })), isBusy && (_jsx("span", { className: "stg:absolute stg:inset-0 stg:flex stg:items-center stg:justify-center", children: _jsx(ChipSpinner, { size: 16 }) }))] }), isError && (_jsx("button", { type: "button", onClick: onRetry, disabled: disabled, "aria-label": `Retry uploading ${entry.file.name}`, className: cn(UNSTYLED_BUTTON, "stg:absolute stg:left-1/2 stg:top-1/2 stg:-translate-x-1/2 stg:-translate-y-1/2 stg:rounded-full stg:bg-destructive stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium stg:leading-none stg:text-destructive-foreground stg:shadow-sm stg:hover:bg-destructive-hover stg:disabled:pointer-events-none"), children: "Retry" })), _jsx("button", { type: "button", onClick: onRemove, disabled: disabled, "aria-label": `Remove ${entry.file.name}`, className: cn(UNSTYLED_BUTTON,
|
|
104
114
|
// The established corner-badge geometry (ContextPopover,
|
|
105
115
|
// ComposerToolbar). Solid bg + border keep it legible over any
|
|
106
116
|
// image without opacity-modified tokens (Dont-Do #4).
|
|
@@ -111,10 +121,10 @@ function ImageAttachmentChip({ entry, onRemove, onRetry, onPreview, disabled, })
|
|
|
111
121
|
// ---------------------------------------------------------------------------
|
|
112
122
|
function FileAttachmentChip({ entry, onRemove, onRetry, disabled, }) {
|
|
113
123
|
const isError = entry.phase === "error";
|
|
114
|
-
const
|
|
124
|
+
const isBusy = isChipBusy(entry);
|
|
115
125
|
return (_jsxs("span", { role: "listitem", "aria-label": chipAriaLabel(entry), className: cn("stg:inline-flex stg:max-w-[200px] stg:items-center stg:gap-1 stg:rounded-md stg:px-2 stg:py-0.5 stg:text-xs", isError
|
|
116
126
|
? "stg:border stg:border-destructive/30 stg:bg-destructive-subtle stg:text-destructive"
|
|
117
|
-
: "stg:bg-muted-subtle stg:text-foreground",
|
|
127
|
+
: "stg:bg-muted-subtle stg:text-foreground", isBusy && "stg:opacity-70"), children: [isBusy && _jsx(ChipSpinner, {}), isError && _jsx(ErrorDot, {}), !isBusy && !isError && _jsx(FileIcon, {}), _jsx("span", { className: "stg:truncate", children: entry.file.name }), _jsx("span", { className: "stg:shrink-0 stg:text-[0.6rem] stg:tabular-nums stg:text-muted-foreground", children: formatFileSize(entry.file.size) }), isError && _jsx(RetryButton, { filename: entry.file.name, onRetry: onRetry, disabled: disabled }), _jsx(RemoveButton, { filename: entry.file.name, onRemove: onRemove, disabled: disabled })] }));
|
|
118
128
|
}
|
|
119
129
|
// ---------------------------------------------------------------------------
|
|
120
130
|
// Shared chip actions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentChipList.js","sourceRoot":"","sources":["../../src/attachment/AttachmentChipList.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AttachmentChipList.js","sourceRoot":"","sources":["../../src/attachment/AttachmentChipList.tsx"],"names":[],"mappings":"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"}
|
package/attachment/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { useAttachments } from "./useAttachments.js";
|
|
2
|
-
export type { AttachmentPhase, AttachmentEntry, UseAttachmentsOptions, UseAttachmentsReturn, } from "./useAttachments.js";
|
|
2
|
+
export type { AddFilesOptions, AttachmentPhase, AttachmentEntry, UseAttachmentsOptions, UseAttachmentsReturn, } from "./useAttachments.js";
|
|
3
3
|
export { AttachmentChipList } from "./AttachmentChipList.js";
|
|
4
4
|
export type { AttachmentChipListProps } from "./AttachmentChipList.js";
|
|
5
5
|
export { MAX_ATTACHMENT_BYTES, detectContentType, formatFileSize, uniquifyFilename, validateAttachmentSize, } from "./attachment-utils.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/attachment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EACV,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/attachment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
package/attachment/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/attachment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/attachment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AASrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC"}
|
|
@@ -2,11 +2,16 @@ import type { AttachmentInput } from "@stigmer/sdk";
|
|
|
2
2
|
/**
|
|
3
3
|
* Lifecycle phase of a single attachment managed by {@link useAttachments}.
|
|
4
4
|
*
|
|
5
|
+
* - `preparing` — client-side image preparation is running (see
|
|
6
|
+
* {@link AddFilesOptions.prepareImages}); the entry exists so the UI can
|
|
7
|
+
* show the file from the instant it was added, but no bytes have been
|
|
8
|
+
* sent yet. Only entries added with `prepareImages` ever visit this
|
|
9
|
+
* phase — everything else starts at `uploading`.
|
|
5
10
|
* - `uploading` — bytes are being sent to the server
|
|
6
11
|
* - `ready` — upload succeeded, `storageKey` is available
|
|
7
12
|
* - `error` — upload failed, `error` describes the failure
|
|
8
13
|
*/
|
|
9
|
-
export type AttachmentPhase = "uploading" | "ready" | "error";
|
|
14
|
+
export type AttachmentPhase = "preparing" | "uploading" | "ready" | "error";
|
|
10
15
|
/**
|
|
11
16
|
* State for a single file being managed by the hook.
|
|
12
17
|
*
|
|
@@ -31,7 +36,12 @@ export type AttachmentPhase = "uploading" | "ready" | "error";
|
|
|
31
36
|
export interface AttachmentEntry {
|
|
32
37
|
/** Unique client-side identifier for this attachment. */
|
|
33
38
|
readonly id: string;
|
|
34
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* The `File` object backing this attachment. For entries added with
|
|
41
|
+
* {@link AddFilesOptions.prepareImages} this starts as the user's
|
|
42
|
+
* original file and swaps to the prepared file (possibly smaller, with
|
|
43
|
+
* a matching extension/MIME change) when the `preparing` phase ends.
|
|
44
|
+
*/
|
|
35
45
|
readonly file: File;
|
|
36
46
|
/** Current upload lifecycle phase. */
|
|
37
47
|
readonly phase: AttachmentPhase;
|
|
@@ -50,25 +60,58 @@ export interface UseAttachmentsOptions {
|
|
|
50
60
|
*/
|
|
51
61
|
readonly onValidationError?: (message: string) => void;
|
|
52
62
|
}
|
|
63
|
+
/** Per-call options for {@link UseAttachmentsReturn.addFiles}. */
|
|
64
|
+
export interface AddFilesOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Bound image files to provider vision resolution before upload (via
|
|
67
|
+
* {@link prepareImageForVision}) — the paste-to-attach treatment
|
|
68
|
+
* (stigmer/stigmer#284). Each file's entry appears immediately in the
|
|
69
|
+
* `preparing` phase, so a large screenshot shows a chip the instant it
|
|
70
|
+
* is pasted instead of after the 150-350 ms decode/downscale/re-encode
|
|
71
|
+
* (stigmer/stigmer#369). Non-image files pass through preparation
|
|
72
|
+
* untouched.
|
|
73
|
+
*
|
|
74
|
+
* Meant for pasted content only: a picked or dragged file may be the
|
|
75
|
+
* subject of the task ("read the EXIF"), and silently re-encoding it
|
|
76
|
+
* would be a regression — see prepare-image.ts for the doctrine.
|
|
77
|
+
*
|
|
78
|
+
* With this flag, size validation runs against the PREPARED bytes (the
|
|
79
|
+
* bytes that actually upload), so an oversized paste that downscales
|
|
80
|
+
* under the limit is accepted — identical to preparing before calling
|
|
81
|
+
* `addFiles`, which is what this option replaces. A file still
|
|
82
|
+
* oversized after preparation is removed and reported via
|
|
83
|
+
* `onValidationError`.
|
|
84
|
+
*/
|
|
85
|
+
readonly prepareImages?: boolean;
|
|
86
|
+
}
|
|
53
87
|
/** Return value of {@link useAttachments}. */
|
|
54
88
|
export interface UseAttachmentsReturn {
|
|
55
|
-
/** Current attachment entries (uploading, ready, or errored). */
|
|
89
|
+
/** Current attachment entries (preparing, uploading, ready, or errored). */
|
|
56
90
|
readonly entries: readonly AttachmentEntry[];
|
|
57
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* True while any entry has work in flight (`preparing` or
|
|
93
|
+
* `uploading`). This is the submit gate: `toAttachmentInputs()` carries
|
|
94
|
+
* only `ready` entries, so a send while this is true would silently
|
|
95
|
+
* drop the file the user just added.
|
|
96
|
+
*/
|
|
58
97
|
readonly isUploading: boolean;
|
|
98
|
+
/** True when at least one entry is in the `"preparing"` phase. */
|
|
99
|
+
readonly isPreparing: boolean;
|
|
59
100
|
/** Number of entries that are ready for submission. */
|
|
60
101
|
readonly readyCount: number;
|
|
61
|
-
/** True when there are entries and all are ready (none uploading or errored). */
|
|
102
|
+
/** True when there are entries and all are ready (none preparing, uploading, or errored). */
|
|
62
103
|
readonly allReady: boolean;
|
|
63
104
|
/** True when there is at least one entry (in any phase). */
|
|
64
105
|
readonly hasEntries: boolean;
|
|
65
106
|
/**
|
|
66
107
|
* Add one or more files. Each file is validated and uploaded
|
|
67
108
|
* immediately. Invalid files (e.g., too large) are rejected via
|
|
68
|
-
* `onValidationError` and not added.
|
|
109
|
+
* `onValidationError` and not added. With
|
|
110
|
+
* {@link AddFilesOptions.prepareImages}, images are bounded to vision
|
|
111
|
+
* resolution first — entries appear at once in the `preparing` phase.
|
|
69
112
|
*/
|
|
70
|
-
readonly addFiles: (files: FileList | File[]) => void;
|
|
71
|
-
/** Remove an entry by its stable ID. Aborts in-flight uploads. */
|
|
113
|
+
readonly addFiles: (files: FileList | File[], addOptions?: AddFilesOptions) => void;
|
|
114
|
+
/** Remove an entry by its stable ID. Aborts in-flight preparation and uploads. */
|
|
72
115
|
readonly removeEntry: (id: string) => void;
|
|
73
116
|
/** Retry a failed upload. */
|
|
74
117
|
readonly retryEntry: (id: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAttachments.d.ts","sourceRoot":"","sources":["../../src/attachment/useAttachments.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useAttachments.d.ts","sourceRoot":"","sources":["../../src/attachment/useAttachments.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAepD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,kDAAkD;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE,UAAU,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACpF,kFAAkF;IAClF,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,eAAe,EAAE,CAAC;CACtD;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,cAAc,CAC5B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,oBAAoB,CAmQtB"}
|
|
@@ -5,6 +5,7 @@ import { UploadAttachmentRequestSchema } from "@stigmer/protos/ai/stigmer/agenti
|
|
|
5
5
|
import { useStigmer } from "../hooks.js";
|
|
6
6
|
import { toError } from "../internal/toError.js";
|
|
7
7
|
import { detectContentType, uniquifyFilename, validateAttachmentSize, } from "./attachment-utils.js";
|
|
8
|
+
import { prepareImageForVision } from "./prepare-image.js";
|
|
8
9
|
// ---------------------------------------------------------------------------
|
|
9
10
|
// Hook
|
|
10
11
|
// ---------------------------------------------------------------------------
|
|
@@ -102,11 +103,75 @@ export function useAttachments(options) {
|
|
|
102
103
|
abortControllers.current.delete(id);
|
|
103
104
|
}
|
|
104
105
|
}, [stigmer]);
|
|
105
|
-
|
|
106
|
+
// The `preparing` half of the lifecycle (AddFilesOptions.prepareImages):
|
|
107
|
+
// runs prepareImageForVision on the raw file, then hands the result to
|
|
108
|
+
// the normal validate → uniquify → upload sequence. The entry already
|
|
109
|
+
// exists (created by addFiles in the `preparing` phase), so this
|
|
110
|
+
// transitions it rather than creating it.
|
|
111
|
+
const prepareEntry = useCallback(async (id, rawFile) => {
|
|
112
|
+
// Registered under the same id the upload path uses, so removeEntry
|
|
113
|
+
// and clear() cancel a preparation exactly like an upload. The
|
|
114
|
+
// signal is only ever read, never passed down — prepareImageForVision
|
|
115
|
+
// never throws and cannot be interrupted; cancellation means
|
|
116
|
+
// discarding its result.
|
|
117
|
+
const controller = new AbortController();
|
|
118
|
+
abortControllers.current.set(id, controller);
|
|
119
|
+
const prepared = await prepareImageForVision(rawFile);
|
|
120
|
+
if (controller.signal.aborted)
|
|
121
|
+
return;
|
|
122
|
+
// Hand-off point: from here the upload path owns the map slot
|
|
123
|
+
// (uploadFile registers its own controller under this id).
|
|
124
|
+
abortControllers.current.delete(id);
|
|
125
|
+
// Deferred validation — deliberately on the PREPARED bytes, the
|
|
126
|
+
// bytes that actually upload: a 12 MB screenshot that downscales
|
|
127
|
+
// under the limit must pass, exactly as it did when callers
|
|
128
|
+
// prepared before calling addFiles. Rejection removes the chip the
|
|
129
|
+
// user has been watching, so the toast is the explanation.
|
|
130
|
+
const sizeError = validateAttachmentSize(prepared);
|
|
131
|
+
if (sizeError) {
|
|
132
|
+
setEntries((prev) => prev.filter((e) => e.id !== id));
|
|
133
|
+
options?.onValidationError?.(sizeError);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Preparation may rename (extension follows the re-encode format),
|
|
137
|
+
// so uniquify now, against every OTHER entry's settled name —
|
|
138
|
+
// same downstream-breakage rule as the un-prepared path.
|
|
139
|
+
const takenNames = new Set(entriesRef.current.filter((e) => e.id !== id).map((e) => e.file.name));
|
|
140
|
+
const uniqueName = uniquifyFilename(prepared.name, takenNames);
|
|
141
|
+
const file = uniqueName === prepared.name
|
|
142
|
+
? prepared
|
|
143
|
+
: new File([prepared], uniqueName, {
|
|
144
|
+
type: prepared.type,
|
|
145
|
+
lastModified: prepared.lastModified,
|
|
146
|
+
});
|
|
147
|
+
const contentType = detectContentType(file);
|
|
148
|
+
setEntries((prev) => prev.map((e) => e.id === id
|
|
149
|
+
? { ...e, file, contentType, phase: "uploading" }
|
|
150
|
+
: e));
|
|
151
|
+
uploadFile(id, file, contentType);
|
|
152
|
+
}, [options, uploadFile]);
|
|
153
|
+
const addFiles = useCallback((files, addOptions) => {
|
|
106
154
|
const fileArray = Array.from(files);
|
|
107
155
|
const validEntries = [];
|
|
108
156
|
const takenNames = new Set(entriesRef.current.map((e) => e.file.name));
|
|
109
157
|
for (const rawFile of fileArray) {
|
|
158
|
+
if (addOptions?.prepareImages) {
|
|
159
|
+
// The entry must exist THIS tick — the whole point of the
|
|
160
|
+
// preparing phase is feedback during the decode/downscale gap.
|
|
161
|
+
// Size validation and name uniquification move to prepareEntry:
|
|
162
|
+
// both depend on the prepared file (final bytes, final name).
|
|
163
|
+
const id = generateId();
|
|
164
|
+
validEntries.push({
|
|
165
|
+
id,
|
|
166
|
+
file: rawFile,
|
|
167
|
+
phase: "preparing",
|
|
168
|
+
contentType: detectContentType(rawFile),
|
|
169
|
+
storageKey: null,
|
|
170
|
+
error: null,
|
|
171
|
+
});
|
|
172
|
+
void prepareEntry(id, rawFile);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
110
175
|
const sizeError = validateAttachmentSize(rawFile);
|
|
111
176
|
if (sizeError) {
|
|
112
177
|
options?.onValidationError?.(sizeError);
|
|
@@ -139,7 +204,7 @@ export function useAttachments(options) {
|
|
|
139
204
|
entriesRef.current = [...entriesRef.current, ...validEntries];
|
|
140
205
|
setEntries((prev) => [...prev, ...validEntries]);
|
|
141
206
|
}
|
|
142
|
-
}, [options, uploadFile]);
|
|
207
|
+
}, [options, uploadFile, prepareEntry]);
|
|
143
208
|
const removeEntry = useCallback((id) => {
|
|
144
209
|
const controller = abortControllers.current.get(id);
|
|
145
210
|
if (controller) {
|
|
@@ -175,13 +240,19 @@ export function useAttachments(options) {
|
|
|
175
240
|
contentType: e.contentType,
|
|
176
241
|
}));
|
|
177
242
|
}, [entries]);
|
|
178
|
-
const
|
|
243
|
+
const isPreparing = entries.some((e) => e.phase === "preparing");
|
|
244
|
+
// `preparing` counts as uploading-in-the-gate sense: both phases mean
|
|
245
|
+
// "this file will be lost if the message sends now" (see the
|
|
246
|
+
// isUploading doc). Hosts that gate submit on isUploading inherit the
|
|
247
|
+
// preparing gate without a code change.
|
|
248
|
+
const isUploading = entries.some((e) => e.phase === "preparing" || e.phase === "uploading");
|
|
179
249
|
const readyCount = entries.filter((e) => e.phase === "ready").length;
|
|
180
250
|
const hasEntries = entries.length > 0;
|
|
181
251
|
const allReady = hasEntries && readyCount === entries.length;
|
|
182
252
|
return {
|
|
183
253
|
entries,
|
|
184
254
|
isUploading,
|
|
255
|
+
isPreparing,
|
|
185
256
|
readyCount,
|
|
186
257
|
allReady,
|
|
187
258
|
hasEntries,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAttachments.js","sourceRoot":"","sources":["../../src/attachment/useAttachments.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,4DAA4D,CAAC;AAE3G,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,iBAAiB,EAEjB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAttachments.js","sourceRoot":"","sources":["../../src/attachment/useAttachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionComposer.d.ts","sourceRoot":"","sources":["../../src/composer/SessionComposer.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAkB,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAIlI,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAUxE,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAOhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionComposer.d.ts","sourceRoot":"","sources":["../../src/composer/SessionComposer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,6 @@ import { SessionVariablesInput } from "../execution/SessionVariablesInput.js";
|
|
|
22
22
|
import { useAttachments } from "../attachment/useAttachments.js";
|
|
23
23
|
import { AttachmentChipList } from "../attachment/AttachmentChipList.js";
|
|
24
24
|
import { extractClipboardFiles } from "../attachment/clipboard.js";
|
|
25
|
-
import { prepareImageForVision } from "../attachment/prepare-image.js";
|
|
26
25
|
import { useFileReferences } from "../file-reference/useFileReferences.js";
|
|
27
26
|
import { FileReferenceChipList } from "../file-reference/FileReferenceChipList.js";
|
|
28
27
|
import { FILE_REF_MIME } from "../internal/file-tree/index.js";
|
|
@@ -257,7 +256,13 @@ const SessionComposerInner = forwardRef(function SessionComposer({ onSubmit, isS
|
|
|
257
256
|
const visionNotice = useMemo(() => {
|
|
258
257
|
if (!enableAttachments || attachments.entries.length === 0)
|
|
259
258
|
return null;
|
|
260
|
-
const preflight = assessVisionPreflight(attachments.entries
|
|
259
|
+
const preflight = assessVisionPreflight(attachments.entries
|
|
260
|
+
// A `preparing` entry still carries pre-downscale bytes — judging
|
|
261
|
+
// those would flash a false "too large" that vanishes when
|
|
262
|
+
// preparation lands. Same tri-state discipline as the module
|
|
263
|
+
// itself: silent while the real size is unknown.
|
|
264
|
+
.filter((e) => e.phase !== "preparing")
|
|
265
|
+
.map((e) => ({
|
|
261
266
|
name: e.file.name,
|
|
262
267
|
sizeBytes: e.file.size,
|
|
263
268
|
contentType: e.contentType,
|
|
@@ -346,12 +351,11 @@ const SessionComposerInner = forwardRef(function SessionComposer({ onSubmit, isS
|
|
|
346
351
|
// paste never reaches this point and proceeds untouched.
|
|
347
352
|
e.preventDefault();
|
|
348
353
|
// Pasted images (and only pasted — see prepare-image.ts) are bounded
|
|
349
|
-
// to provider resolution before upload.
|
|
350
|
-
//
|
|
354
|
+
// to provider resolution before upload. The hook owns the whole
|
|
355
|
+
// pipeline: chips appear immediately in the `preparing` phase
|
|
356
|
+
// (stigmer/stigmer#369), then upload.
|
|
351
357
|
const addFiles = attachments.addFiles;
|
|
352
|
-
|
|
353
|
-
addFiles(prepared);
|
|
354
|
-
});
|
|
358
|
+
addFiles(files, { prepareImages: true });
|
|
355
359
|
}, [enableAttachments, isDisabled, attachments.addFiles]);
|
|
356
360
|
// ---------------------------------------------------------------------------
|
|
357
361
|
// Submit — aggregates one-time runtimeEnv from all setup flows
|
|
@@ -650,11 +654,12 @@ const SessionComposerInner = forwardRef(function SessionComposer({ onSubmit, isS
|
|
|
650
654
|
// Submission blocking: MCP servers must be fully configured before send
|
|
651
655
|
// ---------------------------------------------------------------------------
|
|
652
656
|
const mcpBlocked = showMcp && !mcpSetup.allReady;
|
|
653
|
-
// Send waits for in-flight
|
|
657
|
+
// Send waits for in-flight work: toAttachmentInputs() carries only
|
|
654
658
|
// "ready" entries, so a send racing an upload would silently drop the
|
|
655
659
|
// file the user just pasted — the worst failure for "what's wrong in
|
|
656
660
|
// this screenshot?". Errored entries never gate (their chip offers
|
|
657
|
-
// retry/remove);
|
|
661
|
+
// retry/remove); isUploading covers both the preparing and uploading
|
|
662
|
+
// phases (see its doc — same drop class).
|
|
658
663
|
const uploadsBlocked = enableAttachments && attachments.isUploading;
|
|
659
664
|
const canSend = composer.canSubmit && !mcpBlocked && !uploadsBlocked;
|
|
660
665
|
// True when the upload gate is the OPERATIVE blocker — the message would
|
|
@@ -834,7 +839,9 @@ const SessionComposerInner = forwardRef(function SessionComposer({ onSubmit, isS
|
|
|
834
839
|
return (_jsx("div", { role: "form", "aria-label": ariaLabel, className: cn("stg:shrink-0", className), children: _jsxs("div", { className: cn("stg:rounded-xl stg:border stg:border-border stg:bg-card stg:shadow-sm", "stg:focus-within:ring-2 stg:focus-within:ring-ring",
|
|
835
840
|
// Plan mode tints the frame so the active mode is visible at a
|
|
836
841
|
// glance, without opening the picker. Themeable via --stgm-primary-muted.
|
|
837
|
-
interactionMode === "plan" && "stg:border-primary-muted", isDisabled && !stopMode && "stg:opacity-50", isDragOver && "stg:ring-2 stg:ring-primary/50"), onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isEditing && (_jsxs("div", { role: "status", className: "stg:flex stg:items-center stg:justify-between stg:gap-2 stg:rounded-t-xl stg:border-b stg:border-border stg:bg-muted stg:px-3 stg:py-1.5", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Editing message" }), onCancelEdit && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx("button", { type: "button", onClick: onCancelEdit, "aria-label": "Cancel editing", className: "stg:rounded stg:p-0.5 stg:text-muted-foreground stg:transition-colors stg:hover:bg-accent stg:hover:text-foreground stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring" }), children: _jsx(XIcon, {}) }), _jsx(TooltipContent, { side: "top", children: "Cancel editing (Esc)" })] }))] })), _jsxs("div", { className: "stg:relative", children: [_jsx("textarea", { ...composer.textareaProps, onKeyDown: handleTextareaKeyDown, onPaste: handlePaste, placeholder: placeholder, rows: initialRows, autoFocus: autoFocus, className: "stg:block stg:w-full stg:resize-none stg:bg-transparent stg:px-4 stg:pt-3 stg:pb-2 stg:text-sm stg:text-foreground stg:placeholder:text-muted-foreground stg:focus:outline-none stg:disabled:cursor-not-allowed" }), isDragOver && (_jsx("div", { className: "stg:pointer-events-none stg:absolute stg:inset-0 stg:flex stg:items-center stg:justify-center stg:rounded-t-xl stg:bg-primary-subtle", children: _jsx("span", { className: "stg:text-xs stg:font-medium stg:text-primary", children: isDragOverFileRef ? "Reference workspace file" : "Drop files to attach" }) }))] }), showAttach && (_jsx("input", { ref: fileInputRef, type: "file", multiple: true, onChange: handleFileInputChange, className: "stg:hidden", "aria-hidden": "true", tabIndex: -1 })), (showAttach && attachments.hasEntries) || (enableFileReferences && fileRefs.hasRefs) ? (_jsxs("div", { className: "stg:space-y-1.5 stg:px-3 stg:pb-2", children: [showAttach && attachments.hasEntries && (_jsx(AttachmentChipList, { entries: attachments.entries, onRemove: attachments.removeEntry, onRetry: attachments.retryEntry, disabled: isDisabled })), enableFileReferences && fileRefs.hasRefs && (_jsx(FileReferenceChipList, { refs: fileRefs.refs, onRemove: fileRefs.remove, disabled: isDisabled }))] })) : null, showUploadWaitNotice && (_jsxs("div", { role: "status", className: "stg:mx-3 stg:mb-2 stg:flex stg:items-center stg:gap-2 stg:rounded-md stg:bg-muted stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-muted-foreground", children: [_jsx(ChipSpinner, {}), _jsx("span", { children:
|
|
842
|
+
interactionMode === "plan" && "stg:border-primary-muted", isDisabled && !stopMode && "stg:opacity-50", isDragOver && "stg:ring-2 stg:ring-primary/50"), onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isEditing && (_jsxs("div", { role: "status", className: "stg:flex stg:items-center stg:justify-between stg:gap-2 stg:rounded-t-xl stg:border-b stg:border-border stg:bg-muted stg:px-3 stg:py-1.5", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Editing message" }), onCancelEdit && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx("button", { type: "button", onClick: onCancelEdit, "aria-label": "Cancel editing", className: "stg:rounded stg:p-0.5 stg:text-muted-foreground stg:transition-colors stg:hover:bg-accent stg:hover:text-foreground stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring" }), children: _jsx(XIcon, {}) }), _jsx(TooltipContent, { side: "top", children: "Cancel editing (Esc)" })] }))] })), _jsxs("div", { className: "stg:relative", children: [_jsx("textarea", { ...composer.textareaProps, onKeyDown: handleTextareaKeyDown, onPaste: handlePaste, placeholder: placeholder, rows: initialRows, autoFocus: autoFocus, className: "stg:block stg:w-full stg:resize-none stg:bg-transparent stg:px-4 stg:pt-3 stg:pb-2 stg:text-sm stg:text-foreground stg:placeholder:text-muted-foreground stg:focus:outline-none stg:disabled:cursor-not-allowed" }), isDragOver && (_jsx("div", { className: "stg:pointer-events-none stg:absolute stg:inset-0 stg:flex stg:items-center stg:justify-center stg:rounded-t-xl stg:bg-primary-subtle", children: _jsx("span", { className: "stg:text-xs stg:font-medium stg:text-primary", children: isDragOverFileRef ? "Reference workspace file" : "Drop files to attach" }) }))] }), showAttach && (_jsx("input", { ref: fileInputRef, type: "file", multiple: true, onChange: handleFileInputChange, className: "stg:hidden", "aria-hidden": "true", tabIndex: -1 })), (showAttach && attachments.hasEntries) || (enableFileReferences && fileRefs.hasRefs) ? (_jsxs("div", { className: "stg:space-y-1.5 stg:px-3 stg:pb-2", children: [showAttach && attachments.hasEntries && (_jsx(AttachmentChipList, { entries: attachments.entries, onRemove: attachments.removeEntry, onRetry: attachments.retryEntry, disabled: isDisabled })), enableFileReferences && fileRefs.hasRefs && (_jsx(FileReferenceChipList, { refs: fileRefs.refs, onRemove: fileRefs.remove, disabled: isDisabled }))] })) : null, showUploadWaitNotice && (_jsxs("div", { role: "status", className: "stg:mx-3 stg:mb-2 stg:flex stg:items-center stg:gap-2 stg:rounded-md stg:bg-muted stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-muted-foreground", children: [_jsx(ChipSpinner, {}), _jsx("span", { children: attachments.isPreparing
|
|
843
|
+
? "Waiting for attachments to finish preparing…"
|
|
844
|
+
: "Waiting for attachments to finish uploading…" })] })), visionNotice && (_jsxs("div", { role: "status", className: "stg:mx-3 stg:mb-2 stg:flex stg:items-center stg:gap-2 stg:rounded-md stg:bg-warning/10 stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-warning", children: [_jsx(AlertTriangleIcon, {}), _jsx("span", { children: visionNotice })] })), showAgent &&
|
|
838
845
|
agentSetup.state.status === "needsEnvVars" &&
|
|
839
846
|
!agentRef && (_jsxs("div", { role: "status", className: "stg:mx-3 stg:mb-2 stg:flex stg:items-center stg:gap-2 stg:rounded-md stg:bg-warning/10 stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-warning", children: [_jsx(AlertTriangleIcon, {}), _jsx("span", { children: "Agent needs configuration before use" }), _jsx("button", { type: "button", onClick: () => {
|
|
840
847
|
setConfigOpen(true);
|