@agent-native/core 0.94.3 → 0.95.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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +16 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +13 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +18 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +16 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +17 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +16 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +17 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +15 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +16 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +11 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +12 -0
- package/corpus/core/docs/content/pr-visual-recap.mdx +20 -12
- package/corpus/core/docs/content/template-design.mdx +16 -0
- package/corpus/core/package.json +2 -2
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +3 -0
- package/corpus/core/src/agent/engine/registry.ts +6 -1
- package/corpus/core/src/agent/engine/types.ts +2 -0
- package/corpus/core/src/agent/production-agent.ts +20 -0
- package/corpus/core/src/agent/thread-data-builder.ts +41 -17
- package/corpus/core/src/cli/code-agent-executor.ts +61 -1
- package/corpus/core/src/cli/pr-visual-recap-workflow.ts +1 -1
- package/corpus/core/src/cli/recap.ts +262 -25
- package/corpus/core/src/client/AssistantChat.tsx +250 -25
- package/corpus/core/src/client/chat/tool-call-display.tsx +1 -1
- package/corpus/core/src/client/chat/use-reconnect-reader-owner.ts +28 -0
- package/corpus/core/src/client/guided-questions.tsx +9 -1
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +6 -7
- package/corpus/core/src/client/settings/UsageSection.tsx +26 -5
- package/corpus/core/src/client/sse-event-processor.ts +90 -21
- package/corpus/core/src/connections/catalog.ts +2 -2
- package/corpus/core/src/deploy/build.ts +3 -0
- package/corpus/core/src/index.ts +2 -0
- package/corpus/core/src/integrations/catalog.ts +2 -2
- package/corpus/core/src/server/auth.ts +1 -1
- package/corpus/core/src/server/credential-provider.ts +7 -3
- package/corpus/core/src/shared/cache-control.ts +10 -4
- package/corpus/core/src/usage/store.ts +82 -20
- package/corpus/templates/analytics/app/lib/data-sources.ts +5 -4
- package/corpus/templates/analytics/changelog/2026-07-10-slack-token-setup-marked-legacy.md +6 -0
- package/corpus/templates/analytics/server/lib/credential-keys.ts +6 -2
- package/corpus/templates/brain/changelog/2026-07-10-slack-backfill-token-marked-legacy.md +6 -0
- package/corpus/templates/brain/server/register-secrets.ts +2 -2
- package/corpus/templates/clips/app/components/library/library-layout.tsx +7 -1
- package/corpus/templates/clips/app/components/library/page-header.tsx +19 -3
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +16 -12
- package/corpus/templates/clips/changelog/2026-07-10-new-recording-appears-once-when-the-library-sidebar-is-open.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-slack-token-fallback-guidance.md +6 -0
- package/corpus/templates/clips/server/register-secrets.ts +1 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +0 -66
- package/corpus/templates/content/app/routes/_app.local-files.tsx +7 -47
- package/corpus/templates/content/changelog/2026-07-10-local-folders-now-wait-for-an-explicit-pull-before-content-r.md +6 -0
- package/corpus/templates/content/package.json +1 -1
- package/corpus/templates/design/actions/generate-design.ts +128 -31
- package/corpus/templates/design/actions/present-design-variants.ts +37 -9
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +9 -3
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +32 -10
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +2 -2
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -1
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +7 -5
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +3 -0
- package/corpus/templates/design/app/global.css +10 -0
- package/corpus/templates/design/app/hooks/use-question-flow.ts +9 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/design/app/i18n-data.ts +21 -11
- package/corpus/templates/design/changelog/2026-07-10-editor-panels-are-easier-to-distinguish-and-design-intake-qu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-interact-mode-now-stays-on-the-full-canvas-matches-edit-visu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-web-designs-open-at-desktop-size-and-adapt-across-mobile.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-tweaks-now-link-to-full-documentation.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/mail/app/i18n/ar-SA.ts +3 -3
- package/corpus/templates/mail/app/i18n/de-DE.ts +3 -3
- package/corpus/templates/mail/app/i18n/en-US.ts +4 -3
- package/corpus/templates/mail/app/i18n/es-ES.ts +3 -3
- package/corpus/templates/mail/app/i18n/fr-FR.ts +3 -3
- package/corpus/templates/mail/app/i18n/hi-IN.ts +3 -3
- package/corpus/templates/mail/app/i18n/ja-JP.ts +3 -3
- package/corpus/templates/mail/app/i18n/ko-KR.ts +3 -3
- package/corpus/templates/mail/app/i18n/pt-BR.ts +3 -3
- package/corpus/templates/mail/app/i18n/zh-CN.ts +3 -3
- package/corpus/templates/mail/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/mail/changelog/2026-07-10-slack-intake-marked-legacy.md +6 -0
- package/corpus/templates/mail/server/lib/env-config.ts +5 -4
- package/corpus/templates/plan/actions/record-recap-usage-cost.ts +49 -0
- package/corpus/templates/plan/actions/record-recap-usage.ts +15 -22
- package/corpus/templates/plan/package.json +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +3 -0
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +2 -0
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +2 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +20 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +36 -18
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts +2 -0
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +52 -3
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +22 -2
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +199 -22
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +3 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +200 -28
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/chat/tool-call-display.js +1 -1
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/use-reconnect-reader-owner.d.ts +11 -0
- package/dist/client/chat/use-reconnect-reader-owner.d.ts.map +1 -0
- package/dist/client/chat/use-reconnect-reader-owner.js +21 -0
- package/dist/client/chat/use-reconnect-reader-owner.js.map +1 -0
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +5 -1
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +5 -7
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/settings/UsageSection.d.ts.map +1 -1
- package/dist/client/settings/UsageSection.js +12 -3
- package/dist/client/settings/UsageSection.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +67 -20
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +2 -2
- package/dist/connections/catalog.js +2 -2
- package/dist/connections/catalog.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +3 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/catalog.js +2 -2
- package/dist/integrations/catalog.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.js +1 -1
- package/dist/server/auth.js.map +1 -1
- package/dist/server/credential-provider.d.ts +5 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +7 -3
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/shared/cache-control.d.ts +8 -6
- package/dist/shared/cache-control.d.ts.map +1 -1
- package/dist/shared/cache-control.js +8 -3
- package/dist/shared/cache-control.js.map +1 -1
- package/dist/usage/store.d.ts +21 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +54 -19
- package/dist/usage/store.js.map +1 -1
- package/docs/content/locales/ar-SA/template-design.mdx +13 -0
- package/docs/content/locales/de-DE/template-design.mdx +18 -0
- package/docs/content/locales/es-ES/template-design.mdx +16 -0
- package/docs/content/locales/fr-FR/template-design.mdx +17 -0
- package/docs/content/locales/hi-IN/template-design.mdx +16 -0
- package/docs/content/locales/ja-JP/template-design.mdx +17 -0
- package/docs/content/locales/ko-KR/template-design.mdx +15 -0
- package/docs/content/locales/pt-BR/template-design.mdx +16 -0
- package/docs/content/locales/zh-CN/template-design.mdx +11 -0
- package/docs/content/locales/zh-TW/template-design.mdx +12 -0
- package/docs/content/pr-visual-recap.mdx +20 -12
- package/docs/content/template-design.mdx +16 -0
- package/package.json +2 -2
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
type PenPath,
|
|
43
43
|
} from "@shared/pen-path";
|
|
44
44
|
import {
|
|
45
|
+
IconArrowsMaximize,
|
|
45
46
|
IconCopy,
|
|
46
47
|
IconDots,
|
|
47
48
|
IconHandClick,
|
|
@@ -393,6 +394,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
393
394
|
hiddenScreenIds = EMPTY_SCREEN_IDS,
|
|
394
395
|
lockedScreenIds = EMPTY_SCREEN_IDS,
|
|
395
396
|
fullViewScreenIds,
|
|
397
|
+
interactMode = false,
|
|
396
398
|
activeScreenHasHoveredChild = false,
|
|
397
399
|
hoveredChildScreenId,
|
|
398
400
|
directlyHoveredScreenId,
|
|
@@ -7531,8 +7533,8 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
7531
7533
|
}}
|
|
7532
7534
|
editorChromeScaleX={canvasZoom / 100}
|
|
7533
7535
|
editorChromeScaleY={canvasZoom / 100}
|
|
7534
|
-
editMode={boardEditMode}
|
|
7535
|
-
interactMode={
|
|
7536
|
+
editMode={boardEditMode && !interactMode}
|
|
7537
|
+
interactMode={interactMode}
|
|
7536
7538
|
scaleMode={boardIsActive && effectiveTool === "scale"}
|
|
7537
7539
|
clearSelectionRequest={boardClearSelectionRequest}
|
|
7538
7540
|
selectedSelector={
|
|
@@ -7602,6 +7604,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
|
|
|
7602
7604
|
!isBreakpointSelectionTarget(screen)
|
|
7603
7605
|
}
|
|
7604
7606
|
showFullView={fullViewIdSet.has(screen.id)}
|
|
7607
|
+
interactMode={interactMode}
|
|
7605
7608
|
isDirectlyHovered={screen.id === directlyHoveredScreenId}
|
|
7606
7609
|
isFileDragOver={
|
|
7607
7610
|
fileDragOverFrameId !== null &&
|
|
@@ -8859,6 +8862,7 @@ interface ScreenProps {
|
|
|
8859
8862
|
isSelected: boolean;
|
|
8860
8863
|
isTopScreen: boolean;
|
|
8861
8864
|
showFullView: boolean;
|
|
8865
|
+
interactMode: boolean;
|
|
8862
8866
|
isDirectlyHovered: boolean;
|
|
8863
8867
|
/** True while a native OS file drag is hovering this frame (Figma parity §1). */
|
|
8864
8868
|
isFileDragOver: boolean;
|
|
@@ -8926,6 +8930,7 @@ const Screen = memo(function Screen({
|
|
|
8926
8930
|
isSelected,
|
|
8927
8931
|
isTopScreen,
|
|
8928
8932
|
showFullView,
|
|
8933
|
+
interactMode,
|
|
8929
8934
|
isDirectlyHovered,
|
|
8930
8935
|
isFileDragOver,
|
|
8931
8936
|
hasHoveredChild,
|
|
@@ -9022,9 +9027,12 @@ const Screen = memo(function Screen({
|
|
|
9022
9027
|
const frameLabelHeight = FRAME_LABEL_HEIGHT * chromeScale;
|
|
9023
9028
|
const frameScreenWidth = geometry.width / Math.max(chromeScale, 0.001);
|
|
9024
9029
|
// Keep frame actions inside their own frame so closely spaced screens cannot
|
|
9025
|
-
// cover one another. Narrow frames collapse
|
|
9030
|
+
// cover one another. Narrow frames collapse the action to its familiar icon;
|
|
9026
9031
|
// the accessible name and native tooltip preserve the action's meaning.
|
|
9027
9032
|
const compactFullView = frameScreenWidth < FRAME_HEADER_BUTTON_COMPACT_WIDTH;
|
|
9033
|
+
const frameActionLabel = interactMode
|
|
9034
|
+
? t("multiScreenCanvas.fullView")
|
|
9035
|
+
: t("designEditor.modes.interact");
|
|
9028
9036
|
const labelInfoMaxWidth = Math.max(
|
|
9029
9037
|
64,
|
|
9030
9038
|
frameScreenWidth -
|
|
@@ -9157,8 +9165,8 @@ const Screen = memo(function Screen({
|
|
|
9157
9165
|
transformOrigin: "right center",
|
|
9158
9166
|
transition: getChromeLabelTransition(chromeSettling),
|
|
9159
9167
|
}}
|
|
9160
|
-
aria-label={
|
|
9161
|
-
title={
|
|
9168
|
+
aria-label={frameActionLabel}
|
|
9169
|
+
title={frameActionLabel}
|
|
9162
9170
|
onClick={(event) => onEdit(screen.id, event)}
|
|
9163
9171
|
onMouseDown={(event) => {
|
|
9164
9172
|
event.preventDefault();
|
|
@@ -9167,9 +9175,13 @@ const Screen = memo(function Screen({
|
|
|
9167
9175
|
onMouseEnter={() => updateDirectHover(true)}
|
|
9168
9176
|
onMouseLeave={() => updateDirectHover(false)}
|
|
9169
9177
|
>
|
|
9170
|
-
|
|
9178
|
+
{interactMode ? (
|
|
9179
|
+
<IconArrowsMaximize className="size-3 shrink-0" />
|
|
9180
|
+
) : (
|
|
9181
|
+
<IconHandClick className="size-3 shrink-0" />
|
|
9182
|
+
)}
|
|
9171
9183
|
<span className={cn("truncate", compactFullView && "sr-only")}>
|
|
9172
|
-
{
|
|
9184
|
+
{frameActionLabel}
|
|
9173
9185
|
</span>
|
|
9174
9186
|
</button>
|
|
9175
9187
|
</div>
|
|
@@ -9394,6 +9406,7 @@ const Screen = memo(function Screen({
|
|
|
9394
9406
|
renderBreakpointContent={renderBreakpointContent}
|
|
9395
9407
|
activeBreakpointWidth={screen.activeBreakpointWidth}
|
|
9396
9408
|
isScreenSelected={isSelected}
|
|
9409
|
+
interactMode={interactMode}
|
|
9397
9410
|
penActive={penActive}
|
|
9398
9411
|
creationToolActive={creationToolActive}
|
|
9399
9412
|
cullTier={cullTier}
|
|
@@ -9518,6 +9531,7 @@ function BreakpointPreviewRow({
|
|
|
9518
9531
|
renderBreakpointContent,
|
|
9519
9532
|
activeBreakpointWidth,
|
|
9520
9533
|
isScreenSelected,
|
|
9534
|
+
interactMode,
|
|
9521
9535
|
penActive,
|
|
9522
9536
|
creationToolActive,
|
|
9523
9537
|
cullTier,
|
|
@@ -9559,6 +9573,7 @@ function BreakpointPreviewRow({
|
|
|
9559
9573
|
* mirrors `Screen`'s own `isSelected`, used so a breakpoint frame's chrome
|
|
9560
9574
|
* reads as "part of a selected group" the same way the base frame does. */
|
|
9561
9575
|
isScreenSelected: boolean;
|
|
9576
|
+
interactMode: boolean;
|
|
9562
9577
|
penActive: boolean;
|
|
9563
9578
|
creationToolActive: boolean;
|
|
9564
9579
|
/** Uses the owning screen's exact culling lifecycle: never-seen/evicted
|
|
@@ -9595,6 +9610,9 @@ function BreakpointPreviewRow({
|
|
|
9595
9610
|
canEdit?: boolean;
|
|
9596
9611
|
}) {
|
|
9597
9612
|
const t = useT();
|
|
9613
|
+
const frameActionLabel = interactMode
|
|
9614
|
+
? t("multiScreenCanvas.fullView")
|
|
9615
|
+
: t("designEditor.modes.interact");
|
|
9598
9616
|
const breakpointWidths = screen.breakpointWidths ?? [];
|
|
9599
9617
|
// Place additional frames to the right of the primary, starting after the gap
|
|
9600
9618
|
let offsetX = primaryGeometry.width + BREAKPOINT_FRAME_GAP;
|
|
@@ -9884,8 +9902,8 @@ function BreakpointPreviewRow({
|
|
|
9884
9902
|
transform: `scale(${chromeScale})`,
|
|
9885
9903
|
transformOrigin: "right center",
|
|
9886
9904
|
}}
|
|
9887
|
-
aria-label={
|
|
9888
|
-
title={
|
|
9905
|
+
aria-label={frameActionLabel}
|
|
9906
|
+
title={frameActionLabel}
|
|
9889
9907
|
onClick={(e) => {
|
|
9890
9908
|
e.stopPropagation();
|
|
9891
9909
|
activateThisFrame(e);
|
|
@@ -9896,7 +9914,11 @@ function BreakpointPreviewRow({
|
|
|
9896
9914
|
e.stopPropagation();
|
|
9897
9915
|
}}
|
|
9898
9916
|
>
|
|
9899
|
-
|
|
9917
|
+
{interactMode ? (
|
|
9918
|
+
<IconArrowsMaximize className="size-3" />
|
|
9919
|
+
) : (
|
|
9920
|
+
<IconHandClick className="size-3" />
|
|
9921
|
+
)}
|
|
9900
9922
|
</button>
|
|
9901
9923
|
) : null}
|
|
9902
9924
|
<span
|
|
@@ -340,7 +340,7 @@ function OptionButton({
|
|
|
340
340
|
compact ? "px-2.5 py-1.5" : "px-3 py-2",
|
|
341
341
|
selected
|
|
342
342
|
? "border-[var(--design-editor-accent-color)] bg-[var(--design-editor-selection-color)] text-foreground"
|
|
343
|
-
: "border-[var(--design-editor-control-border)] bg-[var(--design-editor-
|
|
343
|
+
: "border-[var(--design-editor-control-border)] bg-[var(--design-editor-question-option-bg)] text-foreground hover:bg-[var(--design-editor-control-bg)]",
|
|
344
344
|
)}
|
|
345
345
|
>
|
|
346
346
|
<span
|
|
@@ -418,7 +418,7 @@ function ColorOptions({
|
|
|
418
418
|
"group inline-flex min-h-8 min-w-0 max-w-full cursor-pointer items-center gap-2 rounded-md border px-2.5 py-1.5 text-start transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--design-editor-accent-color)] focus-visible:ring-offset-0",
|
|
419
419
|
selected
|
|
420
420
|
? "border-[var(--design-editor-accent-color)] bg-[var(--design-editor-selection-color)] text-foreground"
|
|
421
|
-
: "border-[var(--design-editor-control-border)] bg-[var(--design-editor-
|
|
421
|
+
: "border-[var(--design-editor-control-border)] bg-[var(--design-editor-question-option-bg)] text-foreground hover:bg-[var(--design-editor-control-bg)]",
|
|
422
422
|
)}
|
|
423
423
|
>
|
|
424
424
|
<span
|
|
@@ -77,7 +77,15 @@ export function TweaksPanelContent({
|
|
|
77
77
|
data-tweaks-help
|
|
78
78
|
className="mt-2 border-t border-border/60 pt-2 !text-[10px] leading-relaxed text-muted-foreground/70"
|
|
79
79
|
>
|
|
80
|
-
{t("designEditor.tweaksHelp")}
|
|
80
|
+
{t("designEditor.tweaksHelp")}{" "}
|
|
81
|
+
<a
|
|
82
|
+
href="/docs/template-design#tweaks"
|
|
83
|
+
target="_blank"
|
|
84
|
+
rel="noreferrer"
|
|
85
|
+
className="font-medium text-foreground/80 underline-offset-2 hover:text-foreground hover:underline"
|
|
86
|
+
>
|
|
87
|
+
{t("designEditor.tweaksDocs")}
|
|
88
|
+
</a>
|
|
81
89
|
</p>
|
|
82
90
|
</div>
|
|
83
91
|
);
|
|
@@ -910,10 +910,12 @@ declare var __RUNTIME_LAYER_SNAPSHOT_ENABLED__: boolean;
|
|
|
910
910
|
|
|
911
911
|
function selectionTargetForHit(hit: Element | null): Element | null {
|
|
912
912
|
if (!hit || isDocumentRootElement(hit)) return hit;
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
913
|
+
// Select the deepest element under the pointer on the first click. The
|
|
914
|
+
// bridge can mint a pending node id and build a source-equivalent selector
|
|
915
|
+
// for id-less descendants, so climbing to the nearest tagged ancestor is
|
|
916
|
+
// no longer necessary and makes ordinary list labels select their parent
|
|
917
|
+
// container instead.
|
|
918
|
+
return hit;
|
|
917
919
|
}
|
|
918
920
|
|
|
919
921
|
function freshRuntimeNodeId(prefix: string): string {
|
|
@@ -1929,7 +1931,7 @@ declare var __RUNTIME_LAYER_SNAPSHOT_ENABLED__: boolean;
|
|
|
1929
1931
|
var transformBadge = document.createElement("div");
|
|
1930
1932
|
transformBadge.setAttribute("data-agent-native-transform-badge", "");
|
|
1931
1933
|
transformBadge.style.cssText =
|
|
1932
|
-
"position:fixed;z-index:100000;display:none;pointer-events:none;border:1px solid
|
|
1934
|
+
"position:fixed;z-index:100000;display:none;pointer-events:none;border:1px solid rgba(255,255,255,0.16);border-radius:4px;background:rgba(24,24,27,0.96);color:rgba(255,255,255,0.96);font:11px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;padding:3px 5px;box-shadow:0 8px 20px rgba(0,0,0,0.28);";
|
|
1933
1935
|
document.body.appendChild(transformBadge);
|
|
1934
1936
|
|
|
1935
1937
|
var spacingBadge = document.createElement("div");
|
|
@@ -130,6 +130,9 @@ export interface MultiScreenCanvasProps {
|
|
|
130
130
|
* transformed directly from the overview canvas. */
|
|
131
131
|
lockedScreenIds?: ReadonlySet<string> | readonly string[];
|
|
132
132
|
fullViewScreenIds?: string[];
|
|
133
|
+
/** Lets every live frame receive native pointer interaction while the
|
|
134
|
+
* overview camera and frame chrome remain available. */
|
|
135
|
+
interactMode?: boolean;
|
|
133
136
|
activeScreenHasHoveredChild?: boolean;
|
|
134
137
|
hoveredChildScreenId?: string | null;
|
|
135
138
|
directlyHoveredScreenId?: string | null;
|
|
@@ -84,6 +84,11 @@
|
|
|
84
84
|
--design-editor-panel-raised-bg: hsl(var(--secondary));
|
|
85
85
|
--design-editor-control-bg: hsl(var(--muted));
|
|
86
86
|
--design-editor-control-border: hsl(var(--border));
|
|
87
|
+
--design-editor-question-option-bg: color-mix(
|
|
88
|
+
in srgb,
|
|
89
|
+
var(--design-editor-control-bg) 58%,
|
|
90
|
+
transparent
|
|
91
|
+
);
|
|
87
92
|
--design-editor-canvas-bg: hsl(0 0% 92%);
|
|
88
93
|
--design-editor-skeleton-canvas-bg: hsl(0 0% 92%);
|
|
89
94
|
--design-editor-skeleton-panel-ghost-bg: color-mix(
|
|
@@ -162,6 +167,11 @@
|
|
|
162
167
|
--design-editor-panel-raised-bg: hsl(0 0% 18%);
|
|
163
168
|
--design-editor-control-bg: hsl(0 0% 18%);
|
|
164
169
|
--design-editor-control-border: hsl(0 0% 24%);
|
|
170
|
+
--design-editor-question-option-bg: color-mix(
|
|
171
|
+
in srgb,
|
|
172
|
+
var(--design-editor-control-bg) 58%,
|
|
173
|
+
transparent
|
|
174
|
+
);
|
|
165
175
|
--design-editor-canvas-bg: hsl(0 0% 10%);
|
|
166
176
|
--design-editor-skeleton-canvas-bg: hsl(0 0% 11%);
|
|
167
177
|
}
|
|
@@ -16,6 +16,9 @@ function designQuestionsStateKey(designId: string | undefined): string {
|
|
|
16
16
|
return designId ? `show-questions:${designId}` : "show-questions";
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
const RESPONSIVE_GENERATION_REQUIREMENTS =
|
|
20
|
+
'Responsive behavior is mandatory for every web design. Read the form-factor answer above: for Desktop or Both/responsive, call generate-design with `primaryViewport: "desktop"` and a 1440x1024 canvas frame; use `primaryViewport: "mobile"` only for an explicitly mobile-primary choice. Use mobile-first responsive CSS, then take desktop and mobile screenshots and fix any overflow before reporting the design complete.';
|
|
21
|
+
|
|
19
22
|
/**
|
|
20
23
|
* Polls design-scoped question state. When the agent writes structured
|
|
21
24
|
* questions, the editor surfaces a full-canvas overlay for only this design.
|
|
@@ -40,6 +43,8 @@ export function useQuestionFlow(
|
|
|
40
43
|
"Answers:",
|
|
41
44
|
formattedAnswers,
|
|
42
45
|
"",
|
|
46
|
+
RESPONSIVE_GENERATION_REQUIREMENTS,
|
|
47
|
+
"",
|
|
43
48
|
designId
|
|
44
49
|
? 'Now continue the design. Honor any answer about variations: if the user asked to explore options, call present-design-variants with 2-5 concise directions using label, description, accentColor, and feature bullets; omit large content HTML when needed because the action can render compact representative screens - wait for their chat pick, delete each unchosen variant screen at most once, call get-design-snapshot exactly once with fileId for the kept screen, then call edit-design exactly once on that same fileId in a bounded pass. Use mode "replace-file" when expanding the representative placeholder into a complete but compact product UI in the chosen direction. Prioritize the primary workflow and render secondary details as visible controls, states, or affordances if the feature list is too large for one reliable edit. Do not repeat delete/snapshot cycles. Do not call generate-design after a variant pick. Stop after the first successful edit-design save. Otherwise call generate-design with one complete, renderable index.html first. Do not ask another question unless a required decision is still genuinely missing.'
|
|
45
50
|
: "Now continue the design. Honor any answer about variations: use variants only if requested; otherwise generate one polished direction.",
|
|
@@ -89,6 +94,8 @@ export function useQuestionFlow(
|
|
|
89
94
|
"Answers:",
|
|
90
95
|
formattedAnswers,
|
|
91
96
|
"",
|
|
97
|
+
RESPONSIVE_GENERATION_REQUIREMENTS,
|
|
98
|
+
"",
|
|
92
99
|
designId
|
|
93
100
|
? 'Now continue the design. Honor any answer about variations: if the user asked to explore options, call present-design-variants with 2-5 concise directions using label, description, accentColor, and feature bullets; omit large content HTML when needed because the action can render compact representative screens - wait for their chat pick, delete each unchosen variant screen at most once, call get-design-snapshot exactly once with fileId for the kept screen, then call edit-design exactly once on that same fileId in a bounded pass. Use mode "replace-file" when expanding the representative placeholder into a complete but compact product UI in the chosen direction. Prioritize the primary workflow and render secondary details as visible controls, states, or affordances if the feature list is too large for one reliable edit. Do not repeat delete/snapshot cycles. Do not call generate-design after a variant pick. Stop after the first successful edit-design save. Otherwise call generate-design with one complete, renderable index.html first. Do not ask another question unless a required decision is still genuinely missing.'
|
|
94
101
|
: "Now continue the design. Honor any answer about variations: use variants only if requested; otherwise generate one polished direction.",
|
|
@@ -105,8 +112,8 @@ export function useQuestionFlow(
|
|
|
105
112
|
sendContinuation(
|
|
106
113
|
"Skip the questions — decide for me.",
|
|
107
114
|
designId
|
|
108
|
-
? `The user skipped the pre-generation questions for design ${designId}. Proceed with reasonable defaults. Generate one polished first direction unless the original prompt explicitly requested options.`
|
|
109
|
-
:
|
|
115
|
+
? `The user skipped the pre-generation questions for design ${designId}. Proceed with reasonable defaults. ${RESPONSIVE_GENERATION_REQUIREMENTS} Generate one polished first direction unless the original prompt explicitly requested options.`
|
|
116
|
+
: `The user skipped the pre-generation questions. Proceed with reasonable defaults. ${RESPONSIVE_GENERATION_REQUIREMENTS} Generate one polished first direction unless the original prompt explicitly requested options.`,
|
|
110
117
|
);
|
|
111
118
|
}, [designId, sendContinuation]);
|
|
112
119
|
|
|
@@ -846,6 +846,7 @@ const enUS = {
|
|
|
846
846
|
closeTweaks: "Close tweaks",
|
|
847
847
|
tweaksHelp:
|
|
848
848
|
"Tweaks are breakpoint- and state-specific visual overrides layered on the base design. Reset a control to return to the inherited value.",
|
|
849
|
+
tweaksDocs: "Learn more.",
|
|
849
850
|
noTweakControls: "No tweak controls yet.",
|
|
850
851
|
extensions: "Extensions",
|
|
851
852
|
addExtension: "Extension",
|
|
@@ -1041,7 +1042,7 @@ const enUS = {
|
|
|
1041
1042
|
multiScreenCanvas: {
|
|
1042
1043
|
duplicate: "Duplicate",
|
|
1043
1044
|
fork: "Fork",
|
|
1044
|
-
fullView: "
|
|
1045
|
+
fullView: "Full view",
|
|
1045
1046
|
preview: "Preview",
|
|
1046
1047
|
openAndDuplicate: "Select {{display}}. Use Interact for focused scrolling.",
|
|
1047
1048
|
openAndPreview: "Select {{display}}. Use Interact for focused scrolling.",
|
|
@@ -5339,6 +5340,7 @@ const designRawLiteralOverrides = {
|
|
|
5339
5340
|
addTweaks: "添加调整",
|
|
5340
5341
|
addTweakControls: "添加调整控件",
|
|
5341
5342
|
closeTweaks: "关闭调整",
|
|
5343
|
+
tweaksDocs: "了解详情。",
|
|
5342
5344
|
noTweakControls: "还没有调整控件。",
|
|
5343
5345
|
extensions: "扩展",
|
|
5344
5346
|
addExtension: "扩展",
|
|
@@ -5494,6 +5496,7 @@ const designRawLiteralOverrides = {
|
|
|
5494
5496
|
addTweaks: "Agregar ajustes",
|
|
5495
5497
|
addTweakControls: "Agregar controles de ajuste",
|
|
5496
5498
|
closeTweaks: "Cerrar ajustes",
|
|
5499
|
+
tweaksDocs: "Más información.",
|
|
5497
5500
|
noTweakControls: "Aún no hay controles de ajuste.",
|
|
5498
5501
|
extensions: "Extensiones",
|
|
5499
5502
|
addExtension: "Extensión",
|
|
@@ -5654,6 +5657,7 @@ const designRawLiteralOverrides = {
|
|
|
5654
5657
|
addTweaks: "Ajouter des ajustements",
|
|
5655
5658
|
addTweakControls: "Ajouter des contrôles de réglage",
|
|
5656
5659
|
closeTweaks: "Fermer les réglages",
|
|
5660
|
+
tweaksDocs: "En savoir plus.",
|
|
5657
5661
|
noTweakControls: "Pas encore de contrôles de réglage.",
|
|
5658
5662
|
extensions: "Extensions",
|
|
5659
5663
|
addExtension: "Extension",
|
|
@@ -5814,6 +5818,7 @@ const designRawLiteralOverrides = {
|
|
|
5814
5818
|
addTweaks: "Fügen Sie Optimierungen hinzu",
|
|
5815
5819
|
addTweakControls: "Fügen Sie Optimierungssteuerelemente hinzu",
|
|
5816
5820
|
closeTweaks: "Enge Optimierungen",
|
|
5821
|
+
tweaksDocs: "Mehr erfahren.",
|
|
5817
5822
|
noTweakControls: "Noch keine Optimierungssteuerung.",
|
|
5818
5823
|
extensions: "Erweiterungen",
|
|
5819
5824
|
addExtension: "Erweiterung",
|
|
@@ -5975,6 +5980,7 @@ const designRawLiteralOverrides = {
|
|
|
5975
5980
|
addTweaks: "微調整を追加する",
|
|
5976
5981
|
addTweakControls: "微調整コントロールを追加する",
|
|
5977
5982
|
closeTweaks: "微調整を閉じる",
|
|
5983
|
+
tweaksDocs: "詳細を見る。",
|
|
5978
5984
|
noTweakControls: "まだ調整コントロールはありません。",
|
|
5979
5985
|
extensions: "拡張機能",
|
|
5980
5986
|
addExtension: "拡張機能",
|
|
@@ -6131,6 +6137,7 @@ const designRawLiteralOverrides = {
|
|
|
6131
6137
|
addTweaks: "조정 추가",
|
|
6132
6138
|
addTweakControls: "조정 컨트롤 추가",
|
|
6133
6139
|
closeTweaks: "조정 닫기",
|
|
6140
|
+
tweaksDocs: "자세히 알아보기.",
|
|
6134
6141
|
noTweakControls: "아직 조정 컨트롤이 없습니다.",
|
|
6135
6142
|
extensions: "확장",
|
|
6136
6143
|
addExtension: "확장",
|
|
@@ -6286,6 +6293,7 @@ const designRawLiteralOverrides = {
|
|
|
6286
6293
|
addTweaks: "Adicionar ajustes",
|
|
6287
6294
|
addTweakControls: "Adicionar controles de ajuste",
|
|
6288
6295
|
closeTweaks: "Fechar ajustes",
|
|
6296
|
+
tweaksDocs: "Saiba mais.",
|
|
6289
6297
|
noTweakControls: "Nenhum controle de ajuste ainda.",
|
|
6290
6298
|
extensions: "Extensões",
|
|
6291
6299
|
addExtension: "Extensão",
|
|
@@ -6446,6 +6454,7 @@ const designRawLiteralOverrides = {
|
|
|
6446
6454
|
addTweaks: "बदलाव जोड़ें",
|
|
6447
6455
|
addTweakControls: "ट्विक नियंत्रण जोड़ें",
|
|
6448
6456
|
closeTweaks: "बदलाव बंद करें",
|
|
6457
|
+
tweaksDocs: "और जानें।",
|
|
6449
6458
|
noTweakControls: "अभी तक कोई ट्विक नियंत्रण नहीं है.",
|
|
6450
6459
|
extensions: "एक्सटेंशन",
|
|
6451
6460
|
addExtension: "एक्सटेंशन",
|
|
@@ -6601,6 +6610,7 @@ const designRawLiteralOverrides = {
|
|
|
6601
6610
|
addTweaks: "أضف تعديلات",
|
|
6602
6611
|
addTweakControls: "إضافة الضوابط القرص",
|
|
6603
6612
|
closeTweaks: "إغلاق القرص",
|
|
6613
|
+
tweaksDocs: "معرفة المزيد.",
|
|
6604
6614
|
noTweakControls: "لا توجد ضوابط قرص حتى الآن.",
|
|
6605
6615
|
extensions: "الإضافات",
|
|
6606
6616
|
addExtension: "إضافة",
|
|
@@ -7709,7 +7719,7 @@ const designModeFeatureOverrides = {
|
|
|
7709
7719
|
multiScreenCanvas: {
|
|
7710
7720
|
duplicate: "複製",
|
|
7711
7721
|
fork: "分支",
|
|
7712
|
-
fullView: "
|
|
7722
|
+
fullView: "完整檢視",
|
|
7713
7723
|
preview: "預覽",
|
|
7714
7724
|
openAndDuplicate: "選取 {{display}}。使用互動模式進行聚焦捲動。",
|
|
7715
7725
|
openAndPreview: "選取 {{display}}。使用互動模式進行聚焦捲動。",
|
|
@@ -7873,7 +7883,7 @@ const designModeFeatureOverrides = {
|
|
|
7873
7883
|
multiScreenCanvas: {
|
|
7874
7884
|
duplicate: "复制",
|
|
7875
7885
|
fork: "分支",
|
|
7876
|
-
fullView: "
|
|
7886
|
+
fullView: "完整视图",
|
|
7877
7887
|
preview: "预览",
|
|
7878
7888
|
openAndDuplicate: "选择 {{display}}。使用互动模式进行聚焦滚动。",
|
|
7879
7889
|
openAndPreview: "选择 {{display}}。使用互动模式进行聚焦滚动。",
|
|
@@ -8038,7 +8048,7 @@ const designModeFeatureOverrides = {
|
|
|
8038
8048
|
multiScreenCanvas: {
|
|
8039
8049
|
duplicate: "Duplicar",
|
|
8040
8050
|
fork: "Bifurcar",
|
|
8041
|
-
fullView: "
|
|
8051
|
+
fullView: "Vista completa",
|
|
8042
8052
|
preview: "Vista previa",
|
|
8043
8053
|
openAndDuplicate:
|
|
8044
8054
|
"Selecciona {{display}}. Usa Interactuar para desplazamiento enfocado.",
|
|
@@ -8224,7 +8234,7 @@ const designModeFeatureOverrides = {
|
|
|
8224
8234
|
multiScreenCanvas: {
|
|
8225
8235
|
duplicate: "Dupliquer",
|
|
8226
8236
|
fork: "Créer une branche",
|
|
8227
|
-
fullView: "
|
|
8237
|
+
fullView: "Vue complète",
|
|
8228
8238
|
preview: "Aperçu",
|
|
8229
8239
|
openAndDuplicate:
|
|
8230
8240
|
"Sélectionner {{display}}. Utilisez Interagir pour le défilement ciblé.",
|
|
@@ -8407,7 +8417,7 @@ const designModeFeatureOverrides = {
|
|
|
8407
8417
|
multiScreenCanvas: {
|
|
8408
8418
|
duplicate: "Duplizieren",
|
|
8409
8419
|
fork: "Abzweigen",
|
|
8410
|
-
fullView: "
|
|
8420
|
+
fullView: "Vollansicht",
|
|
8411
8421
|
preview: "Vorschau",
|
|
8412
8422
|
openAndDuplicate:
|
|
8413
8423
|
"{{display}} auswählen. Verwenden Sie Interagieren zum fokussierten Scrollen.",
|
|
@@ -8595,7 +8605,7 @@ const designModeFeatureOverrides = {
|
|
|
8595
8605
|
multiScreenCanvas: {
|
|
8596
8606
|
duplicate: "複製",
|
|
8597
8607
|
fork: "分岐",
|
|
8598
|
-
fullView: "
|
|
8608
|
+
fullView: "全体表示",
|
|
8599
8609
|
preview: "プレビュー",
|
|
8600
8610
|
openAndDuplicate:
|
|
8601
8611
|
"{{display}} を選択します。集中してスクロールするには操作モードを使用。",
|
|
@@ -8778,7 +8788,7 @@ const designModeFeatureOverrides = {
|
|
|
8778
8788
|
multiScreenCanvas: {
|
|
8779
8789
|
duplicate: "복제",
|
|
8780
8790
|
fork: "분기",
|
|
8781
|
-
fullView: "
|
|
8791
|
+
fullView: "전체 보기",
|
|
8782
8792
|
preview: "미리보기",
|
|
8783
8793
|
openAndDuplicate:
|
|
8784
8794
|
"{{display}} 선택. 집중 스크롤에는 상호작용 모드를 사용하세요.",
|
|
@@ -8958,7 +8968,7 @@ const designModeFeatureOverrides = {
|
|
|
8958
8968
|
multiScreenCanvas: {
|
|
8959
8969
|
duplicate: "Duplicar",
|
|
8960
8970
|
fork: "Ramificar",
|
|
8961
|
-
fullView: "
|
|
8971
|
+
fullView: "Vista completa",
|
|
8962
8972
|
preview: "Prévia",
|
|
8963
8973
|
openAndDuplicate:
|
|
8964
8974
|
"Selecione {{display}}. Use Interagir para rolagem focada.",
|
|
@@ -9138,7 +9148,7 @@ const designModeFeatureOverrides = {
|
|
|
9138
9148
|
multiScreenCanvas: {
|
|
9139
9149
|
duplicate: "डुप्लिकेट",
|
|
9140
9150
|
fork: "फोर्क",
|
|
9141
|
-
fullView: "
|
|
9151
|
+
fullView: "पूर्ण दृश्य",
|
|
9142
9152
|
preview: "पूर्वावलोकन",
|
|
9143
9153
|
openAndDuplicate:
|
|
9144
9154
|
"{{display}} चुनें। केंद्रित स्क्रॉलिंग के लिए इंटरैक्ट मोड का उपयोग करें।",
|
|
@@ -9318,7 +9328,7 @@ const designModeFeatureOverrides = {
|
|
|
9318
9328
|
multiScreenCanvas: {
|
|
9319
9329
|
duplicate: "تكرار",
|
|
9320
9330
|
fork: "تفريع",
|
|
9321
|
-
fullView: "
|
|
9331
|
+
fullView: "عرض كامل",
|
|
9322
9332
|
preview: "معاينة",
|
|
9323
9333
|
openAndDuplicate: "حدد {{display}}. استخدم وضع التفاعل للتمرير المركّز.",
|
|
9324
9334
|
openAndPreview: "حدد {{display}}. استخدم وضع التفاعل للتمرير المركّز.",
|
|
@@ -54,6 +54,8 @@ export default createAgentChatPlugin({
|
|
|
54
54
|
|
|
55
55
|
When the user asks for a new design and the current navigation view is list, settings, design-systems, or otherwise has no designId, create a new design first. Do not reuse, delete screens from, or edit a previous design unless the user explicitly names that design or the current navigation state is an editor/present view with that designId.
|
|
56
56
|
|
|
57
|
+
Every web design must be responsive. Use mobile-first CSS, a viewport meta tag, and responsive layout changes for narrow widths; never ship a fixed-width desktop shell. Desktop is the default primary artboard: use a 1440×1024 canvas frame (or primaryViewport "desktop") unless the user explicitly asks for a mobile- or tablet-primary design. After generation, inspect desktop and mobile screenshots and correct overflow or broken reflow before reporting completion.
|
|
58
|
+
|
|
57
59
|
When the user asks to start from a template, call list-design-templates and then create-design-from-template. The copied files and canvas dimensions are already the starting point. If the user also supplied a prompt, call get-design-snapshot once and refine unlocked content with edit-design; do not call generate-design or replace the template with a fresh screen. Layers marked data-agent-native-locked="true" and their descendants must remain byte-for-byte unchanged. Ask the user to unlock one explicitly if they want it changed.
|
|
58
60
|
|
|
59
61
|
When the user asks you to refine an existing design, call view-screen if the open design is unclear, then read the live current file with get-design-snapshot before editing. For small localized changes, call edit-design with exact search/replace edits. For broad copy-only changes such as translating all visible text, call edit-design in replace-file mode with the complete updated file content from the snapshot so the HTML structure, scripts, styles, and tweaks are preserved without dozens of fragile search blocks. Do not claim the design is updated until the mutating action succeeds.
|
|
@@ -515,10 +515,10 @@ const messages = {
|
|
|
515
515
|
slackUpdateFailed: "فشل تحديث استقبال Slack",
|
|
516
516
|
slackConfigured: "تم تكوين بيانات اعتماد Slack.",
|
|
517
517
|
slackNeedsCredentials:
|
|
518
|
-
"
|
|
519
|
-
slackIntake: "استقبال Slack",
|
|
518
|
+
"يتطلب الاستقبال المخصص القديم SLACK_BOT_TOKEN وSLACK_SIGNING_SECRET. لأتمتة مراسلة Slack الجديدة، اربط مساحة عمل في الإعدادات > المراسلة.",
|
|
519
|
+
slackIntake: "استقبال Slack (قديم)",
|
|
520
520
|
slackDescription:
|
|
521
|
-
"
|
|
521
|
+
"تكامل مخصص قديم يتيح لأعضاء المؤسسة وضع مسودات البريد في قائمة الانتظار من Slack.",
|
|
522
522
|
enabled: "ممكّن",
|
|
523
523
|
disable: "تعطيل",
|
|
524
524
|
enable: "تمكين",
|
|
@@ -523,10 +523,10 @@ const messages = {
|
|
|
523
523
|
slackUpdateFailed: "Slack-Eingang konnte nicht aktualisiert werden",
|
|
524
524
|
slackConfigured: "Slack-Anmeldedaten sind konfiguriert.",
|
|
525
525
|
slackNeedsCredentials:
|
|
526
|
-
"
|
|
527
|
-
slackIntake: "Slack-Eingang",
|
|
526
|
+
"Der alte benutzerdefinierte Eingang benötigt SLACK_BOT_TOKEN und SLACK_SIGNING_SECRET. Verbinde für neue Slack-Nachrichtenautomatisierungen einen Workspace unter Einstellungen > Messaging.",
|
|
527
|
+
slackIntake: "Slack-Eingang (veraltet)",
|
|
528
528
|
slackDescription:
|
|
529
|
-
"
|
|
529
|
+
"Veraltete benutzerdefinierte Integration, mit der Organisationsmitglieder E-Mail-Entwürfe aus Slack einreihen können.",
|
|
530
530
|
enabled: "Aktiviert",
|
|
531
531
|
disable: "Deaktivieren",
|
|
532
532
|
enable: "Aktivieren",
|
|
@@ -513,9 +513,10 @@ const messages = {
|
|
|
513
513
|
slackUpdateFailed: "Failed to update Slack intake",
|
|
514
514
|
slackConfigured: "Slack credentials are configured.",
|
|
515
515
|
slackNeedsCredentials:
|
|
516
|
-
"
|
|
517
|
-
slackIntake: "Slack Intake",
|
|
518
|
-
slackDescription:
|
|
516
|
+
"Legacy custom intake requires SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET. For new Slack messaging automations, connect a workspace in Settings > Messaging.",
|
|
517
|
+
slackIntake: "Slack Intake (legacy)",
|
|
518
|
+
slackDescription:
|
|
519
|
+
"Legacy custom integration that lets organization members queue email drafts from Slack.",
|
|
519
520
|
enabled: "Enabled",
|
|
520
521
|
disable: "Disable",
|
|
521
522
|
enable: "Enable",
|
|
@@ -522,10 +522,10 @@ const messages = {
|
|
|
522
522
|
slackUpdateFailed: "No se pudo actualizar la entrada de Slack",
|
|
523
523
|
slackConfigured: "Las credenciales de Slack están configuradas.",
|
|
524
524
|
slackNeedsCredentials:
|
|
525
|
-
"
|
|
526
|
-
slackIntake: "Entrada de Slack",
|
|
525
|
+
"La entrada personalizada antigua requiere SLACK_BOT_TOKEN y SLACK_SIGNING_SECRET. Para nuevas automatizaciones de mensajería de Slack, conecta un espacio de trabajo en Configuración > Mensajería.",
|
|
526
|
+
slackIntake: "Entrada de Slack (antigua)",
|
|
527
527
|
slackDescription:
|
|
528
|
-
"
|
|
528
|
+
"Integración personalizada antigua que permite poner borradores de correo en cola desde Slack.",
|
|
529
529
|
enabled: "Activado",
|
|
530
530
|
disable: "Desactivar",
|
|
531
531
|
enable: "Activar",
|
|
@@ -523,10 +523,10 @@ const messages = {
|
|
|
523
523
|
slackUpdateFailed: "Échec de la mise à jour de l’entrée Slack",
|
|
524
524
|
slackConfigured: "Les identifiants Slack sont configurés.",
|
|
525
525
|
slackNeedsCredentials:
|
|
526
|
-
"
|
|
527
|
-
slackIntake: "Entrée Slack",
|
|
526
|
+
"L’entrée personnalisée héritée nécessite SLACK_BOT_TOKEN et SLACK_SIGNING_SECRET. Pour les nouvelles automatisations de messagerie Slack, connectez un espace de travail dans Paramètres > Messagerie.",
|
|
527
|
+
slackIntake: "Entrée Slack (héritée)",
|
|
528
528
|
slackDescription:
|
|
529
|
-
"
|
|
529
|
+
"Intégration personnalisée héritée permettant de mettre en file des brouillons depuis Slack.",
|
|
530
530
|
enabled: "Activé",
|
|
531
531
|
disable: "Désactiver",
|
|
532
532
|
enable: "Activer",
|
|
@@ -516,10 +516,10 @@ const messages = {
|
|
|
516
516
|
slackUpdateFailed: "Slack intake update करने में विफल",
|
|
517
517
|
slackConfigured: "Slack credentials configured हैं।",
|
|
518
518
|
slackNeedsCredentials:
|
|
519
|
-
"
|
|
520
|
-
slackIntake: "Slack intake",
|
|
519
|
+
"Legacy custom intake के लिए SLACK_BOT_TOKEN और SLACK_SIGNING_SECRET आवश्यक हैं। नए Slack messaging automations के लिए Settings > Messaging में workspace connect करें।",
|
|
520
|
+
slackIntake: "Slack intake (legacy)",
|
|
521
521
|
slackDescription:
|
|
522
|
-
"
|
|
522
|
+
"Legacy custom integration जो organization members को Slack से email drafts queue करने देता है।",
|
|
523
523
|
enabled: "सक्षम",
|
|
524
524
|
disable: "अक्षम करें",
|
|
525
525
|
enable: "सक्षम करें",
|
|
@@ -516,10 +516,10 @@ const messages = {
|
|
|
516
516
|
slackUpdateFailed: "Slack 取り込みを更新できませんでした",
|
|
517
517
|
slackConfigured: "Slack 認証情報は設定済みです。",
|
|
518
518
|
slackNeedsCredentials:
|
|
519
|
-
"
|
|
520
|
-
slackIntake: "Slack
|
|
519
|
+
"従来のカスタム取り込みには SLACK_BOT_TOKEN と SLACK_SIGNING_SECRET が必要です。新しい Slack メッセージ自動化では、設定 > メッセージングでワークスペースを接続してください。",
|
|
520
|
+
slackIntake: "Slack 取り込み(レガシー)",
|
|
521
521
|
slackDescription:
|
|
522
|
-
"組織メンバーが Slack
|
|
522
|
+
"組織メンバーが Slack からメール下書きをキューに入れられる従来のカスタム連携です。",
|
|
523
523
|
enabled: "有効",
|
|
524
524
|
disable: "無効化",
|
|
525
525
|
enable: "有効化",
|
|
@@ -517,10 +517,10 @@ const messages = {
|
|
|
517
517
|
slackUpdateFailed: "Slack 수신 설정을 업데이트하지 못했습니다",
|
|
518
518
|
slackConfigured: "Slack 자격 증명이 구성되었습니다.",
|
|
519
519
|
slackNeedsCredentials:
|
|
520
|
-
"
|
|
521
|
-
slackIntake: "Slack 수신",
|
|
520
|
+
"레거시 사용자 지정 수신에는 SLACK_BOT_TOKEN 및 SLACK_SIGNING_SECRET이 필요합니다. 새 Slack 메시징 자동화는 설정 > 메시징에서 워크스페이스를 연결하세요.",
|
|
521
|
+
slackIntake: "Slack 수신(레거시)",
|
|
522
522
|
slackDescription:
|
|
523
|
-
"조직 구성원이 Slack에서 이메일 초안을 대기열에 추가할 수
|
|
523
|
+
"조직 구성원이 Slack에서 이메일 초안을 대기열에 추가할 수 있는 레거시 사용자 지정 통합입니다.",
|
|
524
524
|
enabled: "활성화됨",
|
|
525
525
|
disable: "비활성화",
|
|
526
526
|
enable: "활성화",
|