@agent-native/core 0.178.0-nightly-20260909183543 → 0.178.0
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 +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +16 -0
- package/corpus/templates/calendar/CHANGELOG.md +19 -0
- package/corpus/templates/clips/CHANGELOG.md +6 -0
- package/corpus/templates/content/CHANGELOG.md +5 -0
- package/corpus/templates/content/app/i18n-data.ts +3 -3
- package/corpus/templates/content/app/lib/local-folder-picker-safety.ts +9 -0
- package/corpus/templates/content/app/routes/_app.local-files.tsx +5 -0
- package/corpus/templates/design/CHANGELOG.md +6 -0
- package/corpus/templates/factory/CHANGELOG.md +18 -0
- package/corpus/templates/mail/CHANGELOG.md +20 -0
- package/corpus/templates/plan/CHANGELOG.md +6 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +36 -152
- package/corpus/templates/slides/CHANGELOG.md +11 -0
- package/corpus/templates/slides/actions/add-slide.ts +1 -0
- package/corpus/templates/slides/actions/create-deck.ts +1 -1
- package/corpus/templates/slides/actions/export-html.ts +342 -12
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +69 -20
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +3 -2
- package/corpus/templates/slides/app/components/editor/SlideInlineEditor.tsx +49 -15
- package/corpus/templates/slides/app/global.css +27 -22
- package/corpus/templates/slides/app/hooks/use-deck-design-system.ts +19 -15
- package/corpus/templates/slides/app/lib/create-deck-generation.ts +2 -2
- package/corpus/templates/slides/app/lib/normalize-slide-padding.ts +2 -2
- package/corpus/templates/slides/app/pages/Index.tsx +2 -2
- package/corpus/templates/slides/changelog/2026-09-09-slides-default-generation-style.md +6 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/slides/shared/slide-background.ts +18 -2
- package/dist/cli/index.js +17 -0
- package/dist/client/org/OrgSwitcher.js +16 -21
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +3 -3
- package/dist/observability/routes.d.ts +2 -2
- package/dist/org/federation.d.ts +1 -1
- package/dist/org/federation.js +6 -4
- package/dist/org/index.d.ts +2 -1
- package/dist/org/index.js +2 -1
- package/dist/org/membership.js +1 -1
- package/dist/org/workspace-app-access.d.ts +1 -0
- package/dist/org/workspace-app-access.js +21 -7
- package/package.json +3 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isReconcileLeadClient } from "@agent-native/core/client/collab";
|
|
2
2
|
import { useT } from "@agent-native/core/client/i18n";
|
|
3
|
+
import { resolveSlideBackground } from "@shared/slide-background";
|
|
3
4
|
import { Extension } from "@tiptap/core";
|
|
4
5
|
import Collaboration from "@tiptap/extension-collaboration";
|
|
5
6
|
import CollaborationCaret from "@tiptap/extension-collaboration-caret";
|
|
@@ -14,7 +15,9 @@ import type { Awareness } from "y-protocols/awareness";
|
|
|
14
15
|
import type * as Y from "yjs";
|
|
15
16
|
|
|
16
17
|
import type { Slide } from "@/context/DeckContext";
|
|
18
|
+
import { sanitizeCssValue } from "@/lib/sanitize-slide-html";
|
|
17
19
|
|
|
20
|
+
import type { DesignSystemData } from "../../../shared/api";
|
|
18
21
|
import { SlideBubbleMenu } from "./SlideBubbleMenu";
|
|
19
22
|
import {
|
|
20
23
|
SlashCommandExtension,
|
|
@@ -29,6 +32,7 @@ import {
|
|
|
29
32
|
|
|
30
33
|
interface SlideInlineEditorProps {
|
|
31
34
|
slide: Slide;
|
|
35
|
+
designSystem?: DesignSystemData;
|
|
32
36
|
onContentChange: (html: string) => void;
|
|
33
37
|
onExitEdit: () => void;
|
|
34
38
|
/**
|
|
@@ -52,13 +56,16 @@ interface SlideInlineEditorProps {
|
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
/** Resolve bg class / style from slide.background */
|
|
55
|
-
function resolveBackground(
|
|
59
|
+
function resolveBackground(
|
|
60
|
+
bg?: string,
|
|
61
|
+
designSystem?: DesignSystemData,
|
|
62
|
+
): {
|
|
56
63
|
bgClass: string;
|
|
57
64
|
bgStyle?: React.CSSProperties;
|
|
58
65
|
} {
|
|
59
|
-
|
|
60
|
-
if (
|
|
61
|
-
return { bgClass: "", bgStyle: { background:
|
|
66
|
+
const resolved = resolveSlideBackground(bg, designSystem);
|
|
67
|
+
if (resolved.startsWith("bg-")) return { bgClass: resolved };
|
|
68
|
+
return { bgClass: "", bgStyle: { background: resolved } };
|
|
62
69
|
}
|
|
63
70
|
|
|
64
71
|
/**
|
|
@@ -185,6 +192,7 @@ export function shouldApplySlideContentSync({
|
|
|
185
192
|
|
|
186
193
|
export function SlideInlineEditor({
|
|
187
194
|
slide,
|
|
195
|
+
designSystem,
|
|
188
196
|
onContentChange,
|
|
189
197
|
onExitEdit,
|
|
190
198
|
contentUpdatedAt,
|
|
@@ -195,7 +203,25 @@ export function SlideInlineEditor({
|
|
|
195
203
|
onComment,
|
|
196
204
|
}: SlideInlineEditorProps) {
|
|
197
205
|
const t = useT();
|
|
198
|
-
const { bgClass, bgStyle } = resolveBackground(
|
|
206
|
+
const { bgClass, bgStyle } = resolveBackground(
|
|
207
|
+
slide.background,
|
|
208
|
+
designSystem,
|
|
209
|
+
);
|
|
210
|
+
const designSystemStyle = designSystem
|
|
211
|
+
? ({
|
|
212
|
+
"--ds-bg": bgClass
|
|
213
|
+
? "transparent"
|
|
214
|
+
: (bgStyle?.background ?? "transparent"),
|
|
215
|
+
"--ds-text":
|
|
216
|
+
sanitizeCssValue(designSystem.colors.text) ??
|
|
217
|
+
"hsl(var(--foreground))",
|
|
218
|
+
"--ds-text-muted":
|
|
219
|
+
sanitizeCssValue(designSystem.colors.textMuted) ??
|
|
220
|
+
"hsl(var(--muted-foreground))",
|
|
221
|
+
"--ds-heading-font": designSystem.typography.headingFont,
|
|
222
|
+
"--ds-body-font": designSystem.typography.bodyFont,
|
|
223
|
+
} as React.CSSProperties & Record<string, string>)
|
|
224
|
+
: {};
|
|
199
225
|
const saveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
200
226
|
// Guard flag: prevents the seeding setContent from triggering onContentChange
|
|
201
227
|
const isSettingContent = useRef(false);
|
|
@@ -452,7 +478,7 @@ export function SlideInlineEditor({
|
|
|
452
478
|
return (
|
|
453
479
|
<div
|
|
454
480
|
className={`w-full aspect-video rounded-lg overflow-hidden relative shadow-2xl shadow-black/40 ring-2 ring-[#609FF8] ${bgClass}`}
|
|
455
|
-
style={bgStyle}
|
|
481
|
+
style={{ ...bgStyle, ...designSystemStyle }}
|
|
456
482
|
>
|
|
457
483
|
{/* Scale the editor canvas to 960x540 just like SlideRenderer */}
|
|
458
484
|
<div
|
|
@@ -463,7 +489,11 @@ export function SlideInlineEditor({
|
|
|
463
489
|
transform: "scale(var(--slide-scale, 0.25))",
|
|
464
490
|
}}
|
|
465
491
|
>
|
|
466
|
-
<SlideEditorCanvas
|
|
492
|
+
<SlideEditorCanvas
|
|
493
|
+
editor={editor}
|
|
494
|
+
slide={slide}
|
|
495
|
+
designSystem={designSystem}
|
|
496
|
+
/>
|
|
467
497
|
</div>
|
|
468
498
|
{/* ScaleHelper mirrors SlideRenderer's ScaleHelper */}
|
|
469
499
|
<ScaleHelper targetWidth={960} />
|
|
@@ -494,27 +524,31 @@ export function SlideInlineEditor({
|
|
|
494
524
|
function SlideEditorCanvas({
|
|
495
525
|
editor,
|
|
496
526
|
slide,
|
|
527
|
+
designSystem,
|
|
497
528
|
}: {
|
|
498
529
|
editor: ReturnType<typeof useEditor>;
|
|
499
530
|
slide: Slide;
|
|
531
|
+
designSystem?: DesignSystemData;
|
|
500
532
|
}) {
|
|
501
533
|
const layoutPadding: Record<string, string> = {
|
|
502
|
-
title: "px-[
|
|
503
|
-
content: "px-[
|
|
504
|
-
"two-column": "px-[
|
|
505
|
-
section: "px-[
|
|
506
|
-
statement: "px-[
|
|
507
|
-
image: "px-[80px] py-[
|
|
534
|
+
title: "px-[80px] py-[64px]", // i18n-ignore Tailwind class list
|
|
535
|
+
content: "px-[80px] py-[64px]", // i18n-ignore Tailwind class list
|
|
536
|
+
"two-column": "px-[80px] py-[64px]",
|
|
537
|
+
section: "px-[80px] py-[64px]", // i18n-ignore Tailwind class list
|
|
538
|
+
statement: "px-[80px] py-[64px]", // i18n-ignore Tailwind class list
|
|
539
|
+
image: "px-[80px] py-[64px]",
|
|
508
540
|
"full-image": "p-0",
|
|
509
541
|
blank: "p-8",
|
|
510
542
|
};
|
|
511
543
|
|
|
512
|
-
const padding = layoutPadding[slide.layout] ?? "px-[
|
|
544
|
+
const padding = layoutPadding[slide.layout] ?? "px-[80px] py-[64px]"; // i18n-ignore Tailwind class list
|
|
513
545
|
|
|
514
546
|
return (
|
|
515
547
|
<div
|
|
516
548
|
className={`w-[960px] h-[540px] relative flex flex-col justify-center ${padding}`}
|
|
517
|
-
style={{
|
|
549
|
+
style={{
|
|
550
|
+
fontFamily: designSystem?.typography.bodyFont ?? "Inter, sans-serif",
|
|
551
|
+
}}
|
|
518
552
|
>
|
|
519
553
|
<EditorContent
|
|
520
554
|
editor={editor}
|
|
@@ -326,7 +326,8 @@ button[title="Open agent sidebar"] {
|
|
|
326
326
|
|
|
327
327
|
/* Slide content styling */
|
|
328
328
|
.slide-content {
|
|
329
|
-
font-family: "
|
|
329
|
+
font-family: var(--ds-body-font, "Inter", sans-serif);
|
|
330
|
+
color: var(--ds-text, #1f2933);
|
|
330
331
|
}
|
|
331
332
|
|
|
332
333
|
/* Per-element inline text editing — highlight the text layer that is
|
|
@@ -352,27 +353,27 @@ button[title="Open agent sidebar"] {
|
|
|
352
353
|
}
|
|
353
354
|
.slide-content h1 {
|
|
354
355
|
@apply text-5xl font-bold mb-6 leading-tight tracking-tight;
|
|
355
|
-
color: #
|
|
356
|
+
color: var(--ds-text, #1f2933);
|
|
356
357
|
}
|
|
357
358
|
.slide-content h2 {
|
|
358
359
|
@apply text-3xl font-semibold mb-4 leading-snug tracking-tight;
|
|
359
|
-
color: #
|
|
360
|
+
color: var(--ds-text, #1f2933);
|
|
360
361
|
}
|
|
361
362
|
.slide-content h3 {
|
|
362
363
|
@apply text-2xl font-medium mb-3;
|
|
363
|
-
color: #
|
|
364
|
+
color: var(--ds-text, #1f2933);
|
|
364
365
|
}
|
|
365
366
|
.slide-content p {
|
|
366
367
|
@apply text-xl leading-relaxed mb-4;
|
|
367
|
-
color:
|
|
368
|
+
color: var(--ds-text-muted, #667085);
|
|
368
369
|
}
|
|
369
370
|
.slide-content ul {
|
|
370
371
|
@apply text-lg space-y-3 list-disc list-inside;
|
|
371
|
-
color:
|
|
372
|
+
color: var(--ds-text-muted, #667085);
|
|
372
373
|
}
|
|
373
374
|
.slide-content ol {
|
|
374
375
|
@apply text-lg space-y-3 list-decimal list-inside;
|
|
375
|
-
color:
|
|
376
|
+
color: var(--ds-text-muted, #667085);
|
|
376
377
|
}
|
|
377
378
|
.slide-content code {
|
|
378
379
|
@apply bg-white/10 px-2 py-0.5 rounded text-base font-mono;
|
|
@@ -390,7 +391,7 @@ button[title="Open agent sidebar"] {
|
|
|
390
391
|
}
|
|
391
392
|
.slide-content strong {
|
|
392
393
|
@apply font-bold;
|
|
393
|
-
color: #
|
|
394
|
+
color: var(--ds-text, #1f2933);
|
|
394
395
|
}
|
|
395
396
|
.slide-content em {
|
|
396
397
|
@apply italic;
|
|
@@ -415,18 +416,18 @@ button[title="Open agent sidebar"] {
|
|
|
415
416
|
}
|
|
416
417
|
.slide-content td {
|
|
417
418
|
@apply py-3 text-base;
|
|
418
|
-
color:
|
|
419
|
+
color: var(--ds-text-muted, #667085);
|
|
419
420
|
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
|
420
421
|
}
|
|
421
422
|
.slide-content td:first-child {
|
|
422
423
|
@apply font-semibold;
|
|
423
|
-
color: #
|
|
424
|
+
color: var(--ds-text, #1f2933);
|
|
424
425
|
}
|
|
425
426
|
|
|
426
427
|
/* Builder brand hr styling */
|
|
427
428
|
.slide-content hr {
|
|
428
429
|
@apply my-4;
|
|
429
|
-
border-color:
|
|
430
|
+
border-color: var(--ds-accent, #2457d6);
|
|
430
431
|
}
|
|
431
432
|
|
|
432
433
|
/* ─── Slide Styles ─── */
|
|
@@ -438,13 +439,20 @@ button[title="Open agent sidebar"] {
|
|
|
438
439
|
height: 100%;
|
|
439
440
|
display: flex;
|
|
440
441
|
flex-direction: column;
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
442
|
+
padding: 64px 80px;
|
|
443
|
+
color: var(--ds-text, #1f2933);
|
|
444
|
+
background: var(--ds-bg, #f5f2ea);
|
|
445
|
+
font-family: var(--ds-body-font, "Inter", sans-serif);
|
|
444
446
|
box-sizing: border-box;
|
|
445
447
|
overflow: hidden;
|
|
446
448
|
}
|
|
447
449
|
|
|
450
|
+
/* Imported source slides use absolute source-canvas coordinates. */
|
|
451
|
+
.fmd-slide[data-imported-pptx="true"],
|
|
452
|
+
.fmd-slide[data-imported-pdf="true"] {
|
|
453
|
+
padding: 0;
|
|
454
|
+
}
|
|
455
|
+
|
|
448
456
|
/* Semantic slide markup is persisted by the agent. Keep the classes useful
|
|
449
457
|
when a later edit omits inline styles, while leaving explicit inline values
|
|
450
458
|
authoritative through the normal CSS cascade. */
|
|
@@ -452,7 +460,7 @@ button[title="Open agent sidebar"] {
|
|
|
452
460
|
justify-content: center;
|
|
453
461
|
align-items: flex-start;
|
|
454
462
|
gap: 24px;
|
|
455
|
-
padding: 80px
|
|
463
|
+
padding: 64px 80px;
|
|
456
464
|
}
|
|
457
465
|
|
|
458
466
|
.fmd-slide.fmd-slide--content,
|
|
@@ -477,11 +485,8 @@ button[title="Open agent sidebar"] {
|
|
|
477
485
|
.fmd-slide.fmd-slide--two-column h2,
|
|
478
486
|
.fmd-slide.fmd-slide--statement h1,
|
|
479
487
|
.fmd-slide.fmd-slide--statement h2 {
|
|
480
|
-
color: var(--ds-text, #
|
|
481
|
-
font-family: var(
|
|
482
|
-
--ds-heading-font,
|
|
483
|
-
var(--ds-body-font, "Poppins", sans-serif)
|
|
484
|
-
);
|
|
488
|
+
color: var(--ds-text, #1f2933);
|
|
489
|
+
font-family: var(--ds-heading-font, var(--ds-body-font, "Inter", sans-serif));
|
|
485
490
|
font-weight: 700;
|
|
486
491
|
letter-spacing: -0.03em;
|
|
487
492
|
}
|
|
@@ -511,7 +516,7 @@ button[title="Open agent sidebar"] {
|
|
|
511
516
|
|
|
512
517
|
.fmd-slide .fmd-subtitle,
|
|
513
518
|
.fmd-slide .fmd-muted {
|
|
514
|
-
color: var(--ds-text-muted,
|
|
519
|
+
color: var(--ds-text-muted, #667085);
|
|
515
520
|
}
|
|
516
521
|
|
|
517
522
|
.fmd-slide .fmd-subtitle {
|
|
@@ -536,7 +541,7 @@ button[title="Open agent sidebar"] {
|
|
|
536
541
|
|
|
537
542
|
.fmd-slide .fmd-accent,
|
|
538
543
|
.fmd-slide .fmd-cyan {
|
|
539
|
-
color: var(--ds-accent, #
|
|
544
|
+
color: var(--ds-accent, #2457d6);
|
|
540
545
|
}
|
|
541
546
|
|
|
542
547
|
.fmd-autofit-scale {
|
|
@@ -4,27 +4,31 @@ import {
|
|
|
4
4
|
normalizeReferenceUrls,
|
|
5
5
|
type DesignSystemData,
|
|
6
6
|
} from "../../shared/api";
|
|
7
|
+
import { DEFAULT_SLIDE_BACKGROUND } from "../../shared/slide-background";
|
|
7
8
|
|
|
8
9
|
const DEFAULT_DESIGN_SYSTEM: DesignSystemData = {
|
|
9
10
|
colors: {
|
|
10
|
-
primary: "#
|
|
11
|
-
secondary: "#
|
|
12
|
-
accent: "#
|
|
13
|
-
background:
|
|
14
|
-
surface: "#
|
|
15
|
-
text: "#
|
|
16
|
-
textMuted: "
|
|
11
|
+
primary: "#2457D6", // guard:allow-raw-color - default slide design-system palette
|
|
12
|
+
secondary: "#C85C3A", // guard:allow-raw-color - default slide design-system palette
|
|
13
|
+
accent: "#2457D6", // guard:allow-raw-color - default slide design-system palette
|
|
14
|
+
background: DEFAULT_SLIDE_BACKGROUND,
|
|
15
|
+
surface: "#FFFFFF", // guard:allow-raw-color - default slide design-system palette
|
|
16
|
+
text: "#1F2933", // guard:allow-raw-color - default slide design-system palette
|
|
17
|
+
textMuted: "#667085", // guard:allow-raw-color - default slide design-system palette
|
|
17
18
|
},
|
|
18
19
|
typography: {
|
|
19
|
-
headingFont: "
|
|
20
|
-
bodyFont: "
|
|
21
|
-
headingWeight: "
|
|
22
|
-
bodyWeight: "
|
|
23
|
-
headingSizes: { h1: "
|
|
20
|
+
headingFont: "Inter",
|
|
21
|
+
bodyFont: "Inter",
|
|
22
|
+
headingWeight: "750",
|
|
23
|
+
bodyWeight: "450",
|
|
24
|
+
headingSizes: { h1: "56px", h2: "34px", h3: "24px" },
|
|
25
|
+
},
|
|
26
|
+
spacing: { slidePadding: "64px 80px", elementGap: "18px" },
|
|
27
|
+
borders: { radius: "14px", accentWidth: "3px" },
|
|
28
|
+
slideDefaults: {
|
|
29
|
+
background: DEFAULT_SLIDE_BACKGROUND,
|
|
30
|
+
labelStyle: "capitalize",
|
|
24
31
|
},
|
|
25
|
-
spacing: { slidePadding: "80px 110px", elementGap: "20px" },
|
|
26
|
-
borders: { radius: "12px", accentWidth: "4px" },
|
|
27
|
-
slideDefaults: { background: "#000000", labelStyle: "uppercase" },
|
|
28
32
|
logos: [],
|
|
29
33
|
};
|
|
30
34
|
|
|
@@ -429,7 +429,7 @@ export async function startDeckGeneration({
|
|
|
429
429
|
"Design system selection:",
|
|
430
430
|
"- No design system was selected in the picker.",
|
|
431
431
|
"- Before generating a bare or on-brand deck, call `get-workspace-defaults`. If it returns a usable design system, patch this deck with that designSystemId, call `get-design-system`, and follow its exact tokens, assets, and custom instructions.",
|
|
432
|
-
"- If no workspace default exists, use
|
|
432
|
+
"- If no workspace default exists, use a light warm-neutral canvas, dark ink text, Inter or a close sans-serif, 64px by 80px minimum padding, strong title/body scale contrast, and one restrained blue or coral accent. Never default to a black canvas with white text or omit the padded fmd-slide wrapper.",
|
|
433
433
|
].join("\n");
|
|
434
434
|
const referenceSource = referenceSelection.referenceSource;
|
|
435
435
|
const referenceSourceContext = referenceSource
|
|
@@ -491,7 +491,7 @@ export async function startDeckGeneration({
|
|
|
491
491
|
"The original brief and uploaded/reference handles are persisted on the deck as generationContext. On every continuation or follow-up, call get-deck first and treat that context as the canonical brief. Continue the original slide sequence from the current slide count; do not replace it with a fresh topic inferred only from the follow-up message.",
|
|
492
492
|
"An explicit theme or brand instruction in the original brief overrides the background, palette, and styling of an uploaded/reference image or source page. Preserve source content and imagery, but do not copy a white wireframe background when the requested theme is dark.",
|
|
493
493
|
"Do not report completion until the persisted generationContext targetSlideCount is reached, or, for source-preserving mode, get-deck compact=true reports sourceCoverage.complete=true for the ordered source manifest. If the current deck is short, finish the missing requested slides before adding unrelated content.",
|
|
494
|
-
"Every slide is rendered into a fixed native canvas (default 16:9 is 960x540 CSS pixels, with
|
|
494
|
+
"Every slide is rendered into a fixed native canvas (default 16:9 is 960x540 CSS pixels, with 800x412px available inside standard 64px 80px padding). Keep the main content within that fit budget; split dense source material across more slides instead of packing it tightly. Never use zoom, transform: scale(), clipping, or scroll overflow to hide content overflow, and keep body text at least 16px.",
|
|
495
495
|
"When no reference deck or hydrated design system is available, use a restrained, content-first visual language. Do not invent colorful cards, boxes, or decorative rectangles behind or over text; add a colored shape only when it has a clear semantic role and leaves the text unobscured. Prefer typography, spacing, alignment, and one restrained accent.",
|
|
496
496
|
"Each slide's --content must be full HTML. Slide HTML templates are in your AGENTS.md.",
|
|
497
497
|
"Do NOT use create-deck (the deck already exists). Do NOT call db-schema, the resources tool, or search-files.",
|
|
@@ -17,7 +17,7 @@ export function normalizeSlidePadding(html: string): string {
|
|
|
17
17
|
const style = styleMatch[2];
|
|
18
18
|
if (/(?:^|;)\s*padding\s*:/i.test(style)) return html;
|
|
19
19
|
|
|
20
|
-
const nextStyle = `padding: 80px
|
|
20
|
+
const nextStyle = `padding: 64px 80px;${
|
|
21
21
|
style.startsWith(" ") ? "" : " "
|
|
22
22
|
}${style}`;
|
|
23
23
|
const nextStyleAttribute = styleMatch[0].replace(style, nextStyle);
|
|
@@ -36,7 +36,7 @@ export function normalizeSlidePadding(html: string): string {
|
|
|
36
36
|
const classEnd = classMatch.index + classMatch[0].length;
|
|
37
37
|
const nextOpeningTag =
|
|
38
38
|
openingTag.slice(0, classEnd) +
|
|
39
|
-
' style="padding: 80px
|
|
39
|
+
' style="padding: 64px 80px;"' +
|
|
40
40
|
openingTag.slice(classEnd);
|
|
41
41
|
|
|
42
42
|
return (
|
|
@@ -953,7 +953,7 @@ export default function Index() {
|
|
|
953
953
|
"Design system selection:",
|
|
954
954
|
"- No design system was selected in the picker.",
|
|
955
955
|
"- Before generating a bare or on-brand deck, call `get-workspace-defaults`. If it returns a usable design system, patch this deck with that designSystemId, call `get-design-system`, and follow its exact tokens, assets, and custom instructions.",
|
|
956
|
-
"- If no workspace default exists,
|
|
956
|
+
"- If no workspace default exists, use a light warm-neutral canvas, dark ink text, Inter or a close sans-serif, 64px by 80px minimum padding, strong title/body scale contrast, and one restrained blue or coral accent. Never default to a black canvas with white text or omit the padded fmd-slide wrapper.",
|
|
957
957
|
].join("\n");
|
|
958
958
|
const referenceSource = referenceSelection.referenceSource;
|
|
959
959
|
const referenceSourceContext = referenceSource
|
|
@@ -1019,7 +1019,7 @@ export default function Index() {
|
|
|
1019
1019
|
"The original brief and uploaded/reference handles are persisted on the deck as generationContext. On every continuation or follow-up, call get-deck first and treat that context as the canonical brief. Continue the original slide sequence from the current slide count; do not replace it with a fresh topic inferred only from the follow-up message.",
|
|
1020
1020
|
"An explicit theme or brand instruction in the original brief overrides the background, palette, and styling of an uploaded/reference image or source page. Preserve source content and imagery, but do not copy a white wireframe background when the requested theme is dark.",
|
|
1021
1021
|
"Do not report completion until the persisted generationContext targetSlideCount is reached, or, for source-preserving mode, get-deck compact=true reports sourceCoverage.complete=true for the ordered source manifest. If the current deck is short, finish the missing requested slides before adding unrelated content.",
|
|
1022
|
-
"Every slide is rendered into a fixed native canvas (default 16:9 is 960x540 CSS pixels, with
|
|
1022
|
+
"Every slide is rendered into a fixed native canvas (default 16:9 is 960x540 CSS pixels, with 800x412px available inside standard 64px 80px padding). Keep the main content within that fit budget; split dense source material across more slides instead of packing it tightly. Never use zoom, transform: scale(), clipping, or scroll overflow to hide content overflow, and keep body text at least 16px.",
|
|
1023
1023
|
"When no reference deck or hydrated design system is available, use a restrained, content-first visual language. Do not invent colorful cards, boxes, or decorative rectangles behind or over text; add a colored shape only when it has a clear semantic role and leaves the text unobscured. Prefer typography, spacing, alignment, and one restrained accent.",
|
|
1024
1024
|
"Each slide's --content must be full HTML. Slide HTML templates are in your AGENTS.md.",
|
|
1025
1025
|
"Do NOT use create-deck (the deck already exists). Do NOT call db-schema, the resources tool, or search-files.",
|
|
@@ -259,7 +259,7 @@ When the active Slides editor is already showing the deck you just changed, do n
|
|
|
259
259
|
|
|
260
260
|
For source-faithful PDF slides, keep whatever the import produced — positioned text boxes and images for a page that carried them, the page image for one that did not — and style around it with restrained design-system chrome such as a frame, edge treatment, caption, or safe overlay; never replace an imported slide with a retyped approximation of its text. For PPTX slides, preserve the imported positioned HTML and every uploaded source image. The patch-deck and update-slide actions enforce these preservation rules by default; pass preserveSource=false only when the user explicitly requests a rewrite of that slide.
|
|
261
261
|
|
|
262
|
-
For new decks, resolve precedence in this order: an explicit designSystemId or exact-title designSystem wins, then the caller's personal default, then the workspace default; create-deck applies this itself. Call get-design-system once before the first slide you author, then reuse it. For an existing deck, get-deck's designSystem and deckStyle are the source of truth. For an unlinked deck where the user asks for on-brand styling, call get-workspace-defaults, link its usable design system with patch-deck, then call get-design-system once. Do not improvise a generic Builder-like palette when configured Builder.io design-system context is available.
|
|
262
|
+
For new decks, resolve precedence in this order: an explicit designSystemId or exact-title designSystem wins, then the caller's personal default, then the workspace default; create-deck applies this itself. Call get-design-system once before the first slide you author, then reuse it. For an existing deck, get-deck's designSystem and deckStyle are the source of truth. For an unlinked deck where the user asks for on-brand styling, call get-workspace-defaults, link its usable design system with patch-deck, then call get-design-system once. Do not improvise a generic Builder-like palette when configured Builder.io design-system context is available. When no design system is available, use the Slides fallback direction: a light warm-neutral canvas, dark ink text, Inter or a close sans-serif, generous 64px by 80px minimum padding, strong title/body scale contrast, and one restrained blue or coral accent. Every slide needs intentional composition - for example a labeled title block, a two-column split, a metric treatment, a rule, a callout, a visual placeholder, or a simple diagram - not an unstyled text dump. Never use a black background with white text as the generic fallback, never omit the padded fmd-slide wrapper, and never let body copy touch the canvas edge.
|
|
263
263
|
When adding slides to an existing deck, first read get-deck and match the established visual treatment - background, foreground, typography, spacing, and component language - unless the user explicitly asks to change the theme. Never default continuation slides to a new white or dark theme.
|
|
264
264
|
|
|
265
265
|
Layout-fit workflow is strict. When the user asks to fix overflow, first call view-screen and inspect the deck-wide layout-fit section. If it says measurements are unknown, do not claim the deck fits. Call get-layout-overflows when you need the structured per-slide results. Read each affected slide with get-deck slideId=<id> (full HTML is returned for a targeted read), then make one bounded structural repair pass with one patch-slide operation per affected slide in a single patch-deck call. Writes return before browser measurement, so continue independent edits while layoutFit.status=pending. At the verification point, call get-layout-overflows once and use only measurements whose contentHash and layoutFitRevision match the current persisted slides. Wait for the repair action result and verify the persisted HTML with get-deck slideId=<id> compact=true before saying it is fixed. If a fresh measurement still reports overflow, make at most one focused follow-up repair based on that measurement; never loop, repeatedly re-measure, or claim success after a chat response alone.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export const DEFAULT_SLIDE_BACKGROUND = "#F5F2EA"; // guard:allow-raw-color - default slide canvas fallback
|
|
2
|
+
|
|
1
3
|
// `slide.background` holds either a raw CSS value or a Tailwind arbitrary
|
|
2
4
|
// class (`bg-[...]`), which SlideRenderer applies as a class rather than
|
|
3
5
|
// an inline style. Callers that only speak CSS colors unwrap the arbitrary
|
|
@@ -6,9 +8,23 @@
|
|
|
6
8
|
export function backgroundCssValue(
|
|
7
9
|
background: string | undefined,
|
|
8
10
|
): string | null {
|
|
9
|
-
|
|
10
|
-
if (!background) return "#000000";
|
|
11
|
+
if (!background) return DEFAULT_SLIDE_BACKGROUND;
|
|
11
12
|
const arbitrary = background.match(/^bg-\[(.+)\]$/);
|
|
12
13
|
if (arbitrary) return arbitrary[1].replace(/_/g, " ");
|
|
13
14
|
return background.startsWith("bg-") ? null : background;
|
|
14
15
|
}
|
|
16
|
+
|
|
17
|
+
export function resolveSlideBackground(
|
|
18
|
+
background: string | undefined,
|
|
19
|
+
designSystem?: {
|
|
20
|
+
slideDefaults?: { background?: string };
|
|
21
|
+
colors?: { background?: string };
|
|
22
|
+
},
|
|
23
|
+
): string {
|
|
24
|
+
return (
|
|
25
|
+
background?.trim() ||
|
|
26
|
+
designSystem?.slideDefaults?.background?.trim() ||
|
|
27
|
+
designSystem?.colors?.background?.trim() ||
|
|
28
|
+
DEFAULT_SLIDE_BACKGROUND
|
|
29
|
+
);
|
|
30
|
+
}
|
package/dist/cli/index.js
CHANGED
|
@@ -19,6 +19,23 @@ try {
|
|
|
19
19
|
_version = pkg.version;
|
|
20
20
|
}
|
|
21
21
|
catch { }
|
|
22
|
+
// Fail fast on unsupported Node versions. The package engine is only
|
|
23
|
+
// advisory — npx/pnpm merely warn — so without this an older Node first fails
|
|
24
|
+
// deep inside a scaffold dynamic import with a cryptic ERR_MODULE / syntax
|
|
25
|
+
// error that `handleScaffoldImportError` misreports as a corrupt npx cache.
|
|
26
|
+
const REQUIRED_NODE_MAJOR = 22;
|
|
27
|
+
const REQUIRED_NODE_MINOR = 22;
|
|
28
|
+
const _nodeVersion = process.versions.node;
|
|
29
|
+
const _nodeIsStable = /^\d+\.\d+\.\d+$/.test(_nodeVersion);
|
|
30
|
+
const [_nodeMajor, _nodeMinor] = _nodeVersion.split(".").map(Number);
|
|
31
|
+
const _unsupportedNode = !_nodeIsStable ||
|
|
32
|
+
_nodeMajor < REQUIRED_NODE_MAJOR ||
|
|
33
|
+
(_nodeMajor === REQUIRED_NODE_MAJOR && _nodeMinor < REQUIRED_NODE_MINOR);
|
|
34
|
+
if (_unsupportedNode) {
|
|
35
|
+
console.error(`agent-native requires Node.js ${REQUIRED_NODE_MAJOR}.${REQUIRED_NODE_MINOR}.0 or newer, but you're on Node ${process.versions.node}.\n` +
|
|
36
|
+
`Upgrade Node (https://nodejs.org) and re-run. With nvm: \`nvm install ${REQUIRED_NODE_MAJOR}\`.`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
22
39
|
/**
|
|
23
40
|
* Build a redacted "command" tag from process.argv. Strips the value that
|
|
24
41
|
* follows any --token / --key / --secret / --password / --api-key flag so
|
|
@@ -4,7 +4,6 @@ import { IconApps, IconArrowUpRight, IconBrain, IconBrandJira, IconBriefcase, Ic
|
|
|
4
4
|
import { useState } from "react";
|
|
5
5
|
import { Link, useNavigate } from "react-router";
|
|
6
6
|
import { setBrowserDemoModeEnabled } from "../../demo/browser-state.js";
|
|
7
|
-
import { canManageOrg } from "../../org/permissions.js";
|
|
8
7
|
import { shouldOfferWorkspace } from "../../org/workspace-url.js";
|
|
9
8
|
import { useT } from "../i18n.js";
|
|
10
9
|
import { signOut } from "../sign-out.js";
|
|
@@ -77,33 +76,30 @@ function AppMenuLink({ app, onNavigate, }) {
|
|
|
77
76
|
(app.isDispatch ? "Workspace hub" : `${app.name} workspace`);
|
|
78
77
|
return (_jsxs("a", { href: app.href, onClick: onNavigate, className: "flex items-center gap-2 rounded-sm px-2.5 py-2 text-xs outline-none hover:bg-accent focus:bg-accent", children: [_jsx("span", { className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground", children: _jsx(Icon, { className: "h-3.5 w-3.5" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium text-foreground", children: app.name }), _jsx("span", { className: "block truncate text-[11px] text-muted-foreground", title: description, children: description })] }), _jsx(IconArrowUpRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" })] }));
|
|
79
78
|
}
|
|
80
|
-
function AppsSubmenu({ apps, isLoading, dispatchHref, dispatchAllAppsHref,
|
|
79
|
+
function AppsSubmenu({ apps, isLoading, isWorkspace, dispatchHref, dispatchAllAppsHref, currentAppId, onNavigate, }) {
|
|
81
80
|
const appsForMenu = currentAppId
|
|
82
81
|
? apps.filter((app) => app.id !== currentAppId)
|
|
83
82
|
: apps;
|
|
84
|
-
const
|
|
85
|
-
? appsForMenu
|
|
86
|
-
: appsForMenu.filter((app) => !app.isDispatch);
|
|
87
|
-
const { links, overflowCount } = visibleOrgAppLinks(accessibleAppsForMenu);
|
|
83
|
+
const { links, overflowCount } = visibleOrgAppLinks(appsForMenu);
|
|
88
84
|
const visibleDispatchApp = links.find((app) => app.isDispatch);
|
|
89
|
-
const
|
|
85
|
+
const fallbackDispatchApp = !isWorkspace || isLoading
|
|
86
|
+
? {
|
|
87
|
+
id: "dispatch",
|
|
88
|
+
name: "Dispatch",
|
|
89
|
+
href: dispatchHref,
|
|
90
|
+
isDispatch: true,
|
|
91
|
+
status: "ready",
|
|
92
|
+
}
|
|
93
|
+
: null;
|
|
94
|
+
const dispatchApp = currentAppId === "dispatch"
|
|
90
95
|
? null
|
|
91
|
-
: (visibleDispatchApp ??
|
|
92
|
-
{
|
|
93
|
-
id: "dispatch",
|
|
94
|
-
name: "Dispatch",
|
|
95
|
-
href: dispatchHref,
|
|
96
|
-
isDispatch: true,
|
|
97
|
-
status: "ready",
|
|
98
|
-
});
|
|
96
|
+
: (visibleDispatchApp ?? fallbackDispatchApp);
|
|
99
97
|
const visibleNonDispatch = links
|
|
100
98
|
.filter((app) => !app.isDispatch)
|
|
101
99
|
.slice(0, dispatchApp ? undefined : ORG_SWITCHER_MAX_APP_LINKS);
|
|
102
100
|
const shownCount = (dispatchApp ? 1 : 0) + visibleNonDispatch.length;
|
|
103
|
-
const remainingCount =
|
|
104
|
-
|
|
105
|
-
: 0;
|
|
106
|
-
return (_jsxs(PopoverPrimitive.Root, { children: [_jsx(PopoverPrimitive.Trigger, { asChild: true, children: _jsxs("button", { type: "button", className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconApps, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-start", children: "Apps" }), _jsx("span", { className: "text-[11px] text-muted-foreground", children: isLoading ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : (accessibleAppsForMenu.length) }), _jsx(IconChevronRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground rtl:-scale-x-100" })] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsxs(PopoverPrimitive.Content, { side: "right", align: "start", sideOffset: 8, collisionPadding: 12, className: APP_SUBMENU_CONTENT_CLASS, children: [dispatchApp && (_jsx(AppMenuLink, { app: dispatchApp, onNavigate: onNavigate })), dispatchApp && visibleNonDispatch.length > 0 && (_jsx("div", { className: "my-1 h-px bg-border" })), visibleNonDispatch.map((app) => (_jsx(AppMenuLink, { app: app, onNavigate: onNavigate }, app.id))), remainingCount > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "my-1 h-px bg-border" }), _jsxs("a", { href: dispatchAllAppsHref, onClick: onNavigate, className: "flex items-center gap-2 rounded-sm px-2.5 py-1.5 text-xs text-foreground outline-none hover:bg-accent focus:bg-accent", children: [_jsx(IconApps, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1", children: `View ${remainingCount} more in Dispatch` }), _jsx(IconArrowUpRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" })] })] }))] }) })] }));
|
|
101
|
+
const remainingCount = Math.max(overflowCount, appsForMenu.length - shownCount);
|
|
102
|
+
return (_jsxs(PopoverPrimitive.Root, { children: [_jsx(PopoverPrimitive.Trigger, { asChild: true, children: _jsxs("button", { type: "button", className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconApps, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-start", children: "Apps" }), _jsx("span", { className: "text-[11px] text-muted-foreground", children: isLoading ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : (appsForMenu.length) }), _jsx(IconChevronRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground rtl:-scale-x-100" })] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsxs(PopoverPrimitive.Content, { side: "right", align: "start", sideOffset: 8, collisionPadding: 12, className: APP_SUBMENU_CONTENT_CLASS, children: [dispatchApp && (_jsx(AppMenuLink, { app: dispatchApp, onNavigate: onNavigate })), dispatchApp && visibleNonDispatch.length > 0 && (_jsx("div", { className: "my-1 h-px bg-border" })), visibleNonDispatch.map((app) => (_jsx(AppMenuLink, { app: app, onNavigate: onNavigate }, app.id))), remainingCount > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "my-1 h-px bg-border" }), _jsxs("a", { href: dispatchAllAppsHref, onClick: onNavigate, className: "flex items-center gap-2 rounded-sm px-2.5 py-1.5 text-xs text-foreground outline-none hover:bg-accent focus:bg-accent", children: [_jsx(IconApps, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1", children: `View ${remainingCount} more in Dispatch` }), _jsx(IconArrowUpRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" })] })] }))] }) })] }));
|
|
107
103
|
}
|
|
108
104
|
function ReservedOrgSwitcherSpace({ className }) {
|
|
109
105
|
return _jsx("div", { "aria-hidden": "true", className: `h-8 ${className ?? ""}` });
|
|
@@ -167,7 +163,6 @@ export function OrgSwitcher({ className, hideWhenSingle, reserveSpace, compact,
|
|
|
167
163
|
return reserveSpace ? (_jsx(ReservedOrgSwitcherSpace, { className: className })) : null;
|
|
168
164
|
}
|
|
169
165
|
const canInvite = !!org.orgId && (org.role === "owner" || org.role === "admin");
|
|
170
|
-
const canAccessDispatch = !org.orgId || canManageOrg(org.role);
|
|
171
166
|
const personalLabel = session?.name || personalLabelFromEmail(org.email);
|
|
172
167
|
const inOrg = !!org.orgId;
|
|
173
168
|
const buttonLabel = org.orgName ?? "Personal";
|
|
@@ -239,7 +234,7 @@ export function OrgSwitcher({ className, hideWhenSingle, reserveSpace, compact,
|
|
|
239
234
|
// org's name and looks like a create dialog for the new org.
|
|
240
235
|
setNewName("");
|
|
241
236
|
setMode("create");
|
|
242
|
-
}, className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconPlus, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-start", children: "Create organization" })] }), _jsx("div", { className: "my-1 h-px bg-border" }), _jsx("div", { className: SECTION_LABEL_CLASS, children: t("settings.workspaceTitle") }), _jsx(AppsSubmenu, { apps: appLinks.apps, isLoading: appLinks.isLoading, dispatchHref: appLinks.dispatchHref, dispatchAllAppsHref: appLinks.dispatchAllAppsHref,
|
|
237
|
+
}, className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconPlus, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-start", children: "Create organization" })] }), _jsx("div", { className: "my-1 h-px bg-border" }), _jsx("div", { className: SECTION_LABEL_CLASS, children: t("settings.workspaceTitle") }), _jsx(AppsSubmenu, { apps: appLinks.apps, isLoading: appLinks.isLoading, isWorkspace: appLinks.isWorkspace, dispatchHref: appLinks.dispatchHref, dispatchAllAppsHref: appLinks.dispatchAllAppsHref, currentAppId: currentAppId, onNavigate: () => setOpen(false) }), (profilePath || agentPath) && (_jsxs(_Fragment, { children: [_jsx("div", { className: "my-1 h-px bg-border" }), _jsx("div", { className: SECTION_LABEL_CLASS, children: t("settings.profileTitle") }), profilePath && (_jsxs("button", { type: "button", onClick: () => {
|
|
243
238
|
setOpen(false);
|
|
244
239
|
void navigate(profilePath);
|
|
245
240
|
}, className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconUserCircle, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-start", children: t("settings.profileMenuItem") })] })), agentPath && (_jsxs("button", { type: "button", onClick: () => {
|
|
@@ -62,11 +62,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
|
|
|
62
62
|
error: string;
|
|
63
63
|
states?: undefined;
|
|
64
64
|
} | {
|
|
65
|
+
error?: undefined;
|
|
65
66
|
states: {
|
|
66
67
|
clientId: number;
|
|
67
68
|
state: string;
|
|
68
69
|
}[];
|
|
69
|
-
error?: undefined;
|
|
70
70
|
}>>;
|
|
71
71
|
/**
|
|
72
72
|
* GET /_agent-native/collab/:docId/users
|
|
@@ -77,9 +77,9 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
|
|
|
77
77
|
error: string;
|
|
78
78
|
users?: undefined;
|
|
79
79
|
} | {
|
|
80
|
+
error?: undefined;
|
|
80
81
|
users: {
|
|
81
82
|
clientId: number;
|
|
82
83
|
lastSeen: number;
|
|
83
84
|
}[];
|
|
84
|
-
error?: undefined;
|
|
85
85
|
}>>;
|
package/dist/collab/routes.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
|
|
|
26
26
|
* Body: { update: string (base64), requestSource?: string }
|
|
27
27
|
*/
|
|
28
28
|
export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
29
|
-
ok?: undefined;
|
|
30
29
|
error: string;
|
|
30
|
+
ok?: undefined;
|
|
31
31
|
} | {
|
|
32
32
|
error?: undefined;
|
|
33
33
|
ok: boolean;
|
|
@@ -3,25 +3,25 @@ declare const _default: import("../../action.js").ActionDefinition<{
|
|
|
3
3
|
url?: string;
|
|
4
4
|
filename?: string;
|
|
5
5
|
}, {
|
|
6
|
-
id?: undefined;
|
|
7
6
|
error: string;
|
|
8
7
|
configured?: undefined;
|
|
9
8
|
connectPath?: undefined;
|
|
10
9
|
url?: undefined;
|
|
10
|
+
id?: undefined;
|
|
11
11
|
provider?: undefined;
|
|
12
12
|
} | {
|
|
13
|
-
id?: undefined;
|
|
14
13
|
error: string;
|
|
15
14
|
configured: boolean;
|
|
16
15
|
connectPath: string;
|
|
17
16
|
url?: undefined;
|
|
17
|
+
id?: undefined;
|
|
18
18
|
provider?: undefined;
|
|
19
19
|
} | {
|
|
20
|
-
error?: undefined;
|
|
21
20
|
configured?: undefined;
|
|
22
21
|
connectPath?: undefined;
|
|
23
22
|
url: string;
|
|
24
23
|
id: string;
|
|
25
24
|
provider: string;
|
|
25
|
+
error?: undefined;
|
|
26
26
|
}>;
|
|
27
27
|
export default _default;
|
|
@@ -55,13 +55,13 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
|
|
|
55
55
|
} | {
|
|
56
56
|
summary?: undefined;
|
|
57
57
|
spans?: undefined;
|
|
58
|
-
id?: undefined;
|
|
59
58
|
error: any;
|
|
59
|
+
id?: undefined;
|
|
60
60
|
ok?: undefined;
|
|
61
61
|
} | {
|
|
62
62
|
summary?: undefined;
|
|
63
63
|
spans?: undefined;
|
|
64
|
+
ok: boolean;
|
|
64
65
|
id?: undefined;
|
|
65
66
|
error?: undefined;
|
|
66
|
-
ok: boolean;
|
|
67
67
|
}>>;
|
package/dist/org/federation.d.ts
CHANGED
|
@@ -46,7 +46,7 @@ export declare function revokeFederatedOrganizationMember(event: H3Event, input:
|
|
|
46
46
|
* are copied state, so a successful authority response can remove or retag
|
|
47
47
|
* them while an unavailable authority fails closed.
|
|
48
48
|
*/
|
|
49
|
-
export declare function validateFederatedOrganizationMembership(event: H3Event, input: {
|
|
49
|
+
export declare function validateFederatedOrganizationMembership(event: H3Event | undefined, input: {
|
|
50
50
|
orgId: string;
|
|
51
51
|
email: string;
|
|
52
52
|
}): Promise<FederatedMembershipValidation>;
|