@agent-native/core 0.157.2 → 0.157.4
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/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +40 -1
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +7 -7
- package/corpus/templates/clips/actions/approve-recording-access-request.ts +147 -0
- package/corpus/templates/clips/actions/request-recording-access.ts +121 -23
- package/corpus/templates/clips/actions/view-screen.ts +1 -1
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +34 -53
- package/corpus/templates/clips/app/components/player/request-access-dialog.tsx +104 -0
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +36 -45
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +26 -1
- package/corpus/templates/clips/app/lib/public-meeting.ts +1 -1
- package/corpus/templates/clips/app/routes/access-request.approve.tsx +250 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -32
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +123 -37
- package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +41 -1
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +1 -0
- package/corpus/templates/clips/server/lib/emails.ts +40 -11
- package/corpus/templates/clips/shared/recording-link.ts +32 -1
- package/corpus/templates/clips/shared/share-attribution.ts +13 -0
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/content/actions/add-database-item.ts +9 -0
- package/corpus/templates/content/actions/describe-content-database.ts +92 -0
- package/corpus/templates/content/actions/list-content-databases.ts +213 -72
- package/corpus/templates/content/actions/set-document-property.ts +9 -0
- package/corpus/templates/content/actions/submit-content-database-form.ts +9 -0
- package/corpus/templates/content/actions/update-document.ts +9 -0
- package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +22 -10
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +2 -1
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +245 -9
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +192 -134
- package/corpus/templates/content/app/components/editor/database/settings.tsx +7 -0
- package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +61 -45
- package/corpus/templates/content/app/components/editor/extensions/ImageNode.ts +6 -0
- package/corpus/templates/content/app/components/editor/image-upload.ts +137 -5
- package/corpus/templates/content/app/global.css +8 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +91 -11
- package/corpus/templates/content/changelog/2026-08-12-image-uploads-now-confirm-the-image-can-be-displayed-before-.md +6 -0
- package/corpus/templates/content/changelog/2026-08-14-images-fill-the-page-width-by-default-and-remain-visible-whe.md +6 -0
- package/corpus/templates/content/changelog/2026-08-14-images-inserted-from-the-slash-command-stay-saved-after-uplo.md +6 -0
- package/corpus/templates/content/changelog/2026-08-14-svg-files-can-be-selected-reliably-from-the-image-picker.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +7 -1
- package/corpus/templates/content/server/plugins/agent-chat.ts +3 -0
- package/corpus/templates/content/shared/api.ts +9 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/design/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +6 -1
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +25 -30
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +21 -0
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +2 -1
- package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +124 -180
- package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +1 -0
- package/corpus/templates/slides/app/global.css +99 -3
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +21 -0
- package/dist/chat-threads/schema.d.ts +1 -1
- package/dist/cli/code-agent-executor.js +318 -0
- package/dist/client/AgentPanel.d.ts +13 -1
- package/dist/client/AgentPanel.js +41 -3
- package/dist/client/AssistantChat.d.ts +9 -1
- package/dist/client/AssistantChat.js +26 -13
- package/dist/client/MultiTabAssistantChat.js +18 -5
- package/dist/client/agent-chat.d.ts +8 -0
- package/dist/client/agent-chat.js +15 -0
- package/dist/client/app-chat-sidebar.d.ts +23 -0
- package/dist/client/app-chat-sidebar.js +53 -0
- package/dist/client/app-providers.js +31 -2
- package/dist/client/frame-protocol.d.ts +20 -2
- package/dist/client/hooks/index.d.ts +1 -0
- package/dist/client/hooks/index.js +1 -0
- package/dist/client/sharing/AgentShareSection.d.ts +8 -0
- package/dist/client/sharing/AgentShareSection.js +50 -0
- package/dist/client/sharing/ShareButton.js +2 -1
- package/dist/client/sharing/ShareDialog.d.ts +2 -2
- package/dist/client/sharing/ShareDialog.js +21 -29
- package/dist/client/sharing/index.d.ts +1 -0
- package/dist/client/sharing/index.js +1 -0
- package/dist/client/sharing/useShareButtonController.d.ts +1 -0
- package/dist/client/sharing/useShareDialogController.d.ts +3 -0
- package/dist/client/sharing/useShareDialogController.js +2 -1
- package/dist/client/theme.d.ts +21 -0
- package/dist/client/theme.js +60 -0
- package/dist/client/ui/index.d.ts +1 -1
- package/dist/client/ui/index.js +1 -1
- package/dist/client/use-session.js +23 -0
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/dashboard-storage/schema.d.ts +1 -1
- package/dist/data-programs/schema.d.ts +1 -1
- package/dist/extensions/schema.d.ts +1 -1
- package/dist/localization/core-messages/ar-SA.js +6 -0
- package/dist/localization/core-messages/de-DE.js +6 -0
- package/dist/localization/core-messages/en-US.d.ts +6 -0
- package/dist/localization/core-messages/en-US.js +6 -0
- package/dist/localization/core-messages/es-ES.js +6 -0
- package/dist/localization/core-messages/fr-FR.js +6 -0
- package/dist/localization/core-messages/hi-IN.js +6 -0
- package/dist/localization/core-messages/ja-JP.js +6 -0
- package/dist/localization/core-messages/ko-KR.js +6 -0
- package/dist/localization/core-messages/pt-BR.js +6 -0
- package/dist/localization/core-messages/zh-CN.js +6 -0
- package/dist/localization/core-messages/zh-TW.js +6 -0
- package/dist/localization/core-messages.d.ts +6 -0
- package/dist/localization/default-messages.d.ts +1 -0
- package/dist/localization/default-messages.js +1 -0
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
- package/dist/provider-api/actions/provider-api.d.ts +14 -14
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.js +8 -5
- package/dist/server/identity-sso-store.d.ts +6 -1
- package/dist/server/identity-sso-store.js +57 -14
- package/dist/server/identity-sso.d.ts +7 -8
- package/dist/server/identity-sso.js +15 -12
- package/dist/sharing/actions/list-resource-shares.d.ts +2 -0
- package/dist/sharing/actions/list-resource-shares.js +1 -0
- package/dist/sharing/schema.d.ts +1 -1
- package/dist/sharing/schema.js +4 -1
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/chat/.agents/skills/sharing/SKILL.md +21 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/default/.agents/skills/sharing/SKILL.md +21 -0
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +21 -0
- package/docs/content/cross-app-sso.mdx +24 -17
- package/package.json +3 -3
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/chat/.agents/skills/sharing/SKILL.md +21 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/default/.agents/skills/sharing/SKILL.md +21 -0
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
- package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +21 -0
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
* DELETE /_agent-native/notifications/:id — delete
|
|
12
12
|
*/
|
|
13
13
|
export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
|
|
14
|
-
error?: undefined;
|
|
15
14
|
count: number;
|
|
16
15
|
updated?: undefined;
|
|
16
|
+
error?: undefined;
|
|
17
17
|
ok?: undefined;
|
|
18
18
|
} | {
|
|
19
|
-
error?: undefined;
|
|
20
19
|
count?: undefined;
|
|
21
20
|
updated: number;
|
|
21
|
+
error?: undefined;
|
|
22
22
|
ok?: undefined;
|
|
23
23
|
} | {
|
|
24
24
|
count?: undefined;
|
|
@@ -26,8 +26,8 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
|
|
|
26
26
|
error: string;
|
|
27
27
|
ok?: undefined;
|
|
28
28
|
} | {
|
|
29
|
-
error?: undefined;
|
|
30
29
|
count?: undefined;
|
|
31
30
|
updated?: undefined;
|
|
31
|
+
error?: undefined;
|
|
32
32
|
ok: boolean;
|
|
33
33
|
}>>;
|
|
@@ -41,27 +41,27 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
|
|
|
41
41
|
thumbsUpRate: number;
|
|
42
42
|
avgEvalScore: number;
|
|
43
43
|
} | {
|
|
44
|
-
error?: undefined;
|
|
45
|
-
ok?: undefined;
|
|
46
44
|
summary: import("./types.js").TraceSummary;
|
|
47
45
|
spans: import("./types.js").TraceSpan[];
|
|
48
46
|
id?: undefined;
|
|
49
|
-
} | {
|
|
50
47
|
error?: undefined;
|
|
51
48
|
ok?: undefined;
|
|
49
|
+
} | {
|
|
52
50
|
summary?: undefined;
|
|
53
51
|
spans?: undefined;
|
|
54
52
|
id: string;
|
|
55
|
-
|
|
53
|
+
error?: undefined;
|
|
56
54
|
ok?: undefined;
|
|
55
|
+
} | {
|
|
57
56
|
summary?: undefined;
|
|
58
57
|
spans?: undefined;
|
|
59
58
|
id?: undefined;
|
|
60
59
|
error: any;
|
|
60
|
+
ok?: undefined;
|
|
61
61
|
} | {
|
|
62
|
-
error?: undefined;
|
|
63
62
|
summary?: undefined;
|
|
64
63
|
spans?: undefined;
|
|
65
64
|
id?: undefined;
|
|
65
|
+
error?: undefined;
|
|
66
66
|
ok: boolean;
|
|
67
67
|
}>>;
|
|
@@ -75,9 +75,9 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
|
|
|
75
75
|
user: "user";
|
|
76
76
|
}>>;
|
|
77
77
|
}, z.core.$strip>>, {
|
|
78
|
-
deleted?: undefined;
|
|
79
78
|
id?: undefined;
|
|
80
|
-
|
|
79
|
+
message?: undefined;
|
|
80
|
+
deleted?: undefined;
|
|
81
81
|
providers: {
|
|
82
82
|
id: string;
|
|
83
83
|
label: string;
|
|
@@ -88,45 +88,45 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
|
|
|
88
88
|
updatedAt: number;
|
|
89
89
|
}[];
|
|
90
90
|
count: number;
|
|
91
|
+
provider?: undefined;
|
|
91
92
|
found?: undefined;
|
|
92
93
|
registered?: undefined;
|
|
93
94
|
label?: undefined;
|
|
94
|
-
message?: undefined;
|
|
95
95
|
} | {
|
|
96
|
-
deleted?: undefined;
|
|
97
96
|
id?: undefined;
|
|
98
|
-
|
|
97
|
+
message?: undefined;
|
|
99
98
|
count?: undefined;
|
|
99
|
+
deleted?: undefined;
|
|
100
|
+
providers?: undefined;
|
|
100
101
|
found: boolean;
|
|
101
102
|
provider: import("../custom-registry.js").CustomProviderConfig;
|
|
102
103
|
registered?: undefined;
|
|
103
104
|
label?: undefined;
|
|
104
|
-
message?: undefined;
|
|
105
105
|
} | {
|
|
106
|
+
message?: undefined;
|
|
107
|
+
count?: undefined;
|
|
106
108
|
deleted?: undefined;
|
|
107
|
-
provider?: undefined;
|
|
108
109
|
providers?: undefined;
|
|
109
|
-
|
|
110
|
+
provider?: undefined;
|
|
110
111
|
found: boolean;
|
|
111
112
|
id: string;
|
|
112
113
|
registered?: undefined;
|
|
113
114
|
label?: undefined;
|
|
114
|
-
message?: undefined;
|
|
115
115
|
} | {
|
|
116
|
-
|
|
117
|
-
providers?: undefined;
|
|
116
|
+
message?: undefined;
|
|
118
117
|
count?: undefined;
|
|
118
|
+
providers?: undefined;
|
|
119
|
+
provider?: undefined;
|
|
119
120
|
found?: undefined;
|
|
120
121
|
deleted: boolean;
|
|
121
122
|
id: string;
|
|
122
123
|
registered?: undefined;
|
|
123
124
|
label?: undefined;
|
|
124
|
-
message?: undefined;
|
|
125
125
|
} | {
|
|
126
|
+
count?: undefined;
|
|
126
127
|
deleted?: undefined;
|
|
127
|
-
provider?: undefined;
|
|
128
128
|
providers?: undefined;
|
|
129
|
-
|
|
129
|
+
provider?: undefined;
|
|
130
130
|
found?: undefined;
|
|
131
131
|
registered: boolean;
|
|
132
132
|
id: string;
|
|
@@ -311,9 +311,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
|
|
|
311
311
|
notes?: string | undefined;
|
|
312
312
|
scope?: "org" | "user" | undefined;
|
|
313
313
|
}, {
|
|
314
|
-
id?: undefined;
|
|
315
|
-
message?: undefined;
|
|
316
314
|
deleted?: undefined;
|
|
315
|
+
id?: undefined;
|
|
316
|
+
provider?: undefined;
|
|
317
317
|
providers: {
|
|
318
318
|
id: string;
|
|
319
319
|
label: string;
|
|
@@ -324,45 +324,45 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
|
|
|
324
324
|
updatedAt: number;
|
|
325
325
|
}[];
|
|
326
326
|
count: number;
|
|
327
|
-
provider?: undefined;
|
|
328
327
|
found?: undefined;
|
|
329
328
|
registered?: undefined;
|
|
330
329
|
label?: undefined;
|
|
331
|
-
} | {
|
|
332
|
-
id?: undefined;
|
|
333
330
|
message?: undefined;
|
|
334
|
-
|
|
331
|
+
} | {
|
|
335
332
|
deleted?: undefined;
|
|
333
|
+
id?: undefined;
|
|
336
334
|
providers?: undefined;
|
|
335
|
+
count?: undefined;
|
|
337
336
|
found: boolean;
|
|
338
337
|
provider: import("../custom-registry.js").CustomProviderConfig;
|
|
339
338
|
registered?: undefined;
|
|
340
339
|
label?: undefined;
|
|
341
|
-
} | {
|
|
342
340
|
message?: undefined;
|
|
343
|
-
|
|
341
|
+
} | {
|
|
344
342
|
deleted?: undefined;
|
|
345
|
-
providers?: undefined;
|
|
346
343
|
provider?: undefined;
|
|
344
|
+
providers?: undefined;
|
|
345
|
+
count?: undefined;
|
|
347
346
|
found: boolean;
|
|
348
347
|
id: string;
|
|
349
348
|
registered?: undefined;
|
|
350
349
|
label?: undefined;
|
|
351
|
-
} | {
|
|
352
350
|
message?: undefined;
|
|
353
|
-
|
|
354
|
-
providers?: undefined;
|
|
351
|
+
} | {
|
|
355
352
|
provider?: undefined;
|
|
353
|
+
providers?: undefined;
|
|
354
|
+
count?: undefined;
|
|
356
355
|
found?: undefined;
|
|
357
356
|
deleted: boolean;
|
|
358
357
|
id: string;
|
|
359
358
|
registered?: undefined;
|
|
360
359
|
label?: undefined;
|
|
360
|
+
message?: undefined;
|
|
361
361
|
} | {
|
|
362
|
-
count?: undefined;
|
|
363
362
|
deleted?: undefined;
|
|
364
|
-
providers?: undefined;
|
|
365
363
|
provider?: undefined;
|
|
364
|
+
providers?: undefined;
|
|
365
|
+
count?: undefined;
|
|
366
366
|
found?: undefined;
|
|
367
367
|
registered: boolean;
|
|
368
368
|
id: string;
|
package/dist/secrets/routes.d.ts
CHANGED
|
@@ -34,37 +34,37 @@ export declare function createListSecretsHandler(): import("h3").EventHandlerWit
|
|
|
34
34
|
/** POST /_agent-native/secrets/:key — write a secret. */
|
|
35
35
|
export declare function createWriteSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
36
36
|
error: string;
|
|
37
|
-
ok?: undefined;
|
|
38
37
|
status?: undefined;
|
|
38
|
+
ok?: undefined;
|
|
39
39
|
} | {
|
|
40
|
-
error?: undefined;
|
|
41
40
|
ok: boolean;
|
|
42
41
|
status: string;
|
|
42
|
+
error?: undefined;
|
|
43
43
|
} | {
|
|
44
|
-
ok?: undefined;
|
|
45
44
|
error: string;
|
|
46
45
|
removed?: undefined;
|
|
46
|
+
ok?: undefined;
|
|
47
47
|
} | {
|
|
48
|
-
error?: undefined;
|
|
49
48
|
ok: boolean;
|
|
50
49
|
removed: boolean;
|
|
50
|
+
error?: undefined;
|
|
51
51
|
}>>;
|
|
52
52
|
/**
|
|
53
53
|
* POST /_agent-native/secrets/:key/test — validate an optional candidate value
|
|
54
54
|
* or the current stored value without changing anything.
|
|
55
55
|
*/
|
|
56
56
|
export declare function createTestSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
57
|
-
ok?: undefined;
|
|
58
57
|
error: string;
|
|
59
58
|
note?: undefined;
|
|
59
|
+
ok?: undefined;
|
|
60
60
|
} | {
|
|
61
|
-
error?: undefined;
|
|
62
61
|
ok: boolean;
|
|
63
62
|
note?: undefined;
|
|
64
|
-
} | {
|
|
65
63
|
error?: undefined;
|
|
64
|
+
} | {
|
|
66
65
|
ok: boolean;
|
|
67
66
|
note: string;
|
|
67
|
+
error?: undefined;
|
|
68
68
|
} | {
|
|
69
69
|
note?: undefined;
|
|
70
70
|
ok: boolean;
|
|
@@ -95,11 +95,11 @@ export interface AdHocSecretPayload {
|
|
|
95
95
|
export declare function createAdHocSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<AdHocSecretPayload[] | {
|
|
96
96
|
error: string;
|
|
97
97
|
} | {
|
|
98
|
-
error?: undefined;
|
|
99
98
|
ok: boolean;
|
|
100
99
|
key: string;
|
|
101
|
-
} | {
|
|
102
100
|
error?: undefined;
|
|
101
|
+
} | {
|
|
103
102
|
ok: boolean;
|
|
104
103
|
removed: boolean;
|
|
104
|
+
error?: undefined;
|
|
105
105
|
}>>;
|
|
@@ -27,10 +27,10 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
|
|
|
27
27
|
export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
28
28
|
error: any;
|
|
29
29
|
} | {
|
|
30
|
-
error?: undefined;
|
|
31
30
|
ok: boolean;
|
|
32
31
|
key: string;
|
|
33
32
|
baseUrlKey?: string;
|
|
34
33
|
scope: AgentEngineApiKeyScope;
|
|
34
|
+
error?: undefined;
|
|
35
35
|
}>>;
|
|
36
36
|
export {};
|
package/dist/server/auth.js
CHANGED
|
@@ -65,7 +65,7 @@ import { getAllowedCorsOrigin, readCorsAllowedOrigins, } from "./cors-origins.js
|
|
|
65
65
|
import { readDesktopSso, writeDesktopSso, clearDesktopSso, } from "./desktop-sso.js";
|
|
66
66
|
import { resolveGoogleSignInCredentials } from "./google-oauth-credentials.js";
|
|
67
67
|
import { isElectron as isElectronRequest, getAppBasePath, getAppUrl, getOrigin, encodeOAuthState, decodeOAuthState, createOAuthSession, oauthCallbackResponse, oauthDesktopExchangePage, oauthErrorPage, resolveOAuthRedirectUri, isAllowedOAuthRedirectUri, } from "./google-oauth.js";
|
|
68
|
-
import { isCanonicalAgentNativeAppRequest, isDesktopSsoCanaryUserAgent,
|
|
68
|
+
import { isCanonicalAgentNativeAppRequest, isCanonicalIdentitySsoClientRequest, isDesktopSsoCanaryUserAgent, isIdentitySsoExplicitlyEnabled, } from "./identity-sso-store.js";
|
|
69
69
|
import { ensureCanonicalUserForLegacySession } from "./legacy-auth-migration.js";
|
|
70
70
|
import { encodeMagicLinkSignupAttribution, MAGIC_LINK_ATTRIBUTION_PARAM, } from "./magic-link-attribution.js";
|
|
71
71
|
import { safeOAuthReturnUrl } from "./oauth-return-url.js";
|
|
@@ -1709,15 +1709,18 @@ function createAuthGuardFn() {
|
|
|
1709
1709
|
// 401-for-/_agent-native/*: they resolve / mint the browser session
|
|
1710
1710
|
// themselves and verify a signature-bound, single-use, CSRF-stated
|
|
1711
1711
|
// hub token — not a cookie. The handler fails closed with 404 unless
|
|
1712
|
-
// direct web SSO is configured or
|
|
1713
|
-
//
|
|
1714
|
-
//
|
|
1712
|
+
// direct web SSO is configured or the request is from an exact canonical
|
|
1713
|
+
// hosted app origin. Keeping the bypass exact avoids exposing any other
|
|
1714
|
+
// identity subpath.
|
|
1715
1715
|
const isIdentitySsoEntryPath = p === "/_agent-native/identity/login" ||
|
|
1716
1716
|
p === "/_agent-native/identity/callback";
|
|
1717
1717
|
const isDesktopCanaryIdentityRequest = isDesktopSsoCanaryUserAgent(getHeader(event, "user-agent")) &&
|
|
1718
1718
|
isCanonicalAgentNativeAppRequest(getHeader(event, "host"), getHeader(event, "x-forwarded-proto"));
|
|
1719
|
+
const isCanonicalHostedIdentityRequest = isCanonicalIdentitySsoClientRequest(getHeader(event, "host"), getHeader(event, "x-forwarded-proto"));
|
|
1719
1720
|
if (isIdentitySsoEntryPath &&
|
|
1720
|
-
(
|
|
1721
|
+
(isIdentitySsoExplicitlyEnabled() ||
|
|
1722
|
+
isDesktopCanaryIdentityRequest ||
|
|
1723
|
+
isCanonicalHostedIdentityRequest)) {
|
|
1721
1724
|
return;
|
|
1722
1725
|
}
|
|
1723
1726
|
// Internal processor endpoint for the A2A async-mode fanout. Mirrors the
|
|
@@ -15,17 +15,22 @@
|
|
|
15
15
|
* development may initialize these tables lazily; production release
|
|
16
16
|
* migrations own their creation before serverless requests are served.
|
|
17
17
|
*/
|
|
18
|
+
export declare const CANONICAL_IDENTITY_SSO_HUB_URL = "https://dispatch.agent-native.com";
|
|
18
19
|
export declare const SSO_STATE_TTL_MS: number;
|
|
19
20
|
export declare const SSO_LOGIN_MAX = 60;
|
|
20
21
|
export declare const SSO_LOGIN_WINDOW_MS = 60000;
|
|
21
22
|
export declare function getIdentityHubUrl(): string | undefined;
|
|
23
|
+
export declare function isIdentitySsoExplicitlyEnabled(): boolean;
|
|
22
24
|
export declare function isIdentitySsoEnabled(): boolean;
|
|
23
25
|
export declare function isDesktopSsoCanaryUserAgent(userAgent: string | undefined): boolean;
|
|
24
26
|
export declare function isCanonicalAgentNativeAppOrigin(origin: string | undefined): boolean;
|
|
27
|
+
export declare function isCanonicalIdentitySsoClientOrigin(origin: string | undefined): boolean;
|
|
25
28
|
export declare function isCanonicalAgentNativeAppRequest(host: string | undefined, forwardedProtocol: string | undefined): boolean;
|
|
29
|
+
export declare function isCanonicalIdentitySsoClientRequest(host: string | undefined, forwardedProtocol: string | undefined): boolean;
|
|
26
30
|
/**
|
|
27
31
|
* The conditional login entry is the only browser UI this feature adds. It
|
|
28
|
-
* stays byte-for-byte absent
|
|
32
|
+
* stays byte-for-byte absent on self-hosted apps; canonical hosted clients
|
|
33
|
+
* use their exact registered origin as the implicit opt-in.
|
|
29
34
|
*/
|
|
30
35
|
export declare function identitySsoLoginButtonHtml(): string;
|
|
31
36
|
export interface CreateSsoStateInput {
|
|
@@ -20,6 +20,7 @@ import { getDbExec, intType, isConnectionError, isPostgres, isProductionServerle
|
|
|
20
20
|
import { ensureTableExists } from "../db/ddl-guard.js";
|
|
21
21
|
let _initPromise;
|
|
22
22
|
const DESKTOP_SSO_CANARY_USER_AGENT = /AgentNativeDesktopSsoCanary\//i;
|
|
23
|
+
export const CANONICAL_IDENTITY_SSO_HUB_URL = "https://dispatch.agent-native.com";
|
|
23
24
|
const CANONICAL_IDENTITY_SSO_APP_ORIGINS = new Set([
|
|
24
25
|
"https://analytics.agent-native.com",
|
|
25
26
|
"https://assets.agent-native.com",
|
|
@@ -47,28 +48,61 @@ const CLIENT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
|
|
|
47
48
|
const CODE_CHALLENGE_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
48
49
|
const CONTROL_CHARS = /[\u0000-\u001f\u007f]/;
|
|
49
50
|
const LOCALHOST_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
51
|
+
const CANONICAL_IDENTITY_SSO_CLIENT_ORIGINS = new Set([...CANONICAL_IDENTITY_SSO_APP_ORIGINS].filter((origin) => origin !== CANONICAL_IDENTITY_SSO_HUB_URL));
|
|
50
52
|
// ---------------------------------------------------------------------------
|
|
51
53
|
// Feature switch — this module is intentionally dependency-light because the
|
|
52
54
|
// auth guard and the route handler both import the same pure switch.
|
|
53
55
|
// ---------------------------------------------------------------------------
|
|
56
|
+
function configuredAppOrigin() {
|
|
57
|
+
for (const raw of [
|
|
58
|
+
process.env.APP_URL,
|
|
59
|
+
process.env.BETTER_AUTH_URL,
|
|
60
|
+
process.env.VITE_APP_URL,
|
|
61
|
+
process.env.VITE_BETTER_AUTH_URL,
|
|
62
|
+
process.env.URL,
|
|
63
|
+
process.env.DEPLOY_PRIME_URL,
|
|
64
|
+
process.env.DEPLOY_URL,
|
|
65
|
+
]) {
|
|
66
|
+
const value = raw?.trim();
|
|
67
|
+
if (!value)
|
|
68
|
+
continue;
|
|
69
|
+
try {
|
|
70
|
+
const url = new URL(value);
|
|
71
|
+
return `${url.protocol}//${url.host}${url.pathname}`.replace(/\/+$/, "");
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
void error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
54
79
|
export function getIdentityHubUrl() {
|
|
55
80
|
const raw = process.env.AGENT_NATIVE_IDENTITY_HUB_URL?.trim();
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
81
|
+
if (raw) {
|
|
82
|
+
try {
|
|
83
|
+
const u = new URL(raw);
|
|
84
|
+
if (u.protocol !== "https:" &&
|
|
85
|
+
!(u.protocol === "http:" && LOCALHOST_HOSTS.has(u.hostname))) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
if (u.username || u.password || u.search || u.hash)
|
|
89
|
+
return undefined;
|
|
90
|
+
return `${u.protocol}//${u.host}${u.pathname}`.replace(/\/+$/, "");
|
|
63
91
|
}
|
|
64
|
-
|
|
92
|
+
catch (error) {
|
|
93
|
+
void error;
|
|
65
94
|
return undefined;
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
void error;
|
|
70
|
-
return undefined;
|
|
95
|
+
}
|
|
71
96
|
}
|
|
97
|
+
// Canonical hosted apps are all registered with Dispatch already. Keep
|
|
98
|
+
// self-hosted deployments opt-in, and never make Dispatch federate to itself.
|
|
99
|
+
const appOrigin = configuredAppOrigin();
|
|
100
|
+
return isCanonicalIdentitySsoClientOrigin(appOrigin)
|
|
101
|
+
? CANONICAL_IDENTITY_SSO_HUB_URL
|
|
102
|
+
: undefined;
|
|
103
|
+
}
|
|
104
|
+
export function isIdentitySsoExplicitlyEnabled() {
|
|
105
|
+
return Boolean(process.env.AGENT_NATIVE_IDENTITY_HUB_URL?.trim() && getIdentityHubUrl());
|
|
72
106
|
}
|
|
73
107
|
export function isIdentitySsoEnabled() {
|
|
74
108
|
return !!getIdentityHubUrl();
|
|
@@ -94,14 +128,23 @@ export function isCanonicalAgentNativeAppOrigin(origin) {
|
|
|
94
128
|
return false;
|
|
95
129
|
}
|
|
96
130
|
}
|
|
131
|
+
export function isCanonicalIdentitySsoClientOrigin(origin) {
|
|
132
|
+
return Boolean(origin && CANONICAL_IDENTITY_SSO_CLIENT_ORIGINS.has(origin));
|
|
133
|
+
}
|
|
97
134
|
export function isCanonicalAgentNativeAppRequest(host, forwardedProtocol) {
|
|
98
135
|
if (!host || forwardedProtocol !== "https")
|
|
99
136
|
return false;
|
|
100
137
|
return isCanonicalAgentNativeAppOrigin(`https://${host}`);
|
|
101
138
|
}
|
|
139
|
+
export function isCanonicalIdentitySsoClientRequest(host, forwardedProtocol) {
|
|
140
|
+
if (!host || forwardedProtocol !== "https")
|
|
141
|
+
return false;
|
|
142
|
+
return isCanonicalIdentitySsoClientOrigin(`https://${host}`);
|
|
143
|
+
}
|
|
102
144
|
/**
|
|
103
145
|
* The conditional login entry is the only browser UI this feature adds. It
|
|
104
|
-
* stays byte-for-byte absent
|
|
146
|
+
* stays byte-for-byte absent on self-hosted apps; canonical hosted clients
|
|
147
|
+
* use their exact registered origin as the implicit opt-in.
|
|
105
148
|
*/
|
|
106
149
|
export function identitySsoLoginButtonHtml() {
|
|
107
150
|
if (!isIdentitySsoEnabled())
|
|
@@ -7,11 +7,10 @@
|
|
|
7
7
|
* callback-scoped cookie and redeems the code server-to-server. Only that
|
|
8
8
|
* server-to-server response may contain the signed identity assertion.
|
|
9
9
|
*
|
|
10
|
-
* Direct browser federation
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* Desktop implementation or any ordinary auth surface.
|
|
10
|
+
* Direct browser federation uses the canonical Dispatch authority for exact
|
|
11
|
+
* first-party hosted app origins and remains opt-in through
|
|
12
|
+
* `AGENT_NATIVE_IDENTITY_HUB_URL` for self-hosted deployments. The packaged
|
|
13
|
+
* Desktop Canary follows the same canonical-origin boundary.
|
|
15
14
|
*/
|
|
16
15
|
import type { H3Event } from "h3";
|
|
17
16
|
import { getIdentityHubUrl, identitySsoLoginButtonHtml, isIdentitySsoEnabled } from "./identity-sso-store.js";
|
|
@@ -22,9 +21,9 @@ export declare const IDENTITY_SSO_DESKTOP_COMPLETE_PATH = "/_agent-native/identi
|
|
|
22
21
|
export declare const IDENTITY_SSO_CALLBACK_PATH = "/_agent-native/identity/callback";
|
|
23
22
|
export declare const IDENTITY_SSO_TOKEN_PATH = "/_agent-native/identity/token";
|
|
24
23
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* Canonical hosted apps may use Dispatch without per-app hub configuration.
|
|
25
|
+
* Self-hosted apps remain strictly env-gated. The exact-origin check is kept
|
|
26
|
+
* request-scoped so a missing deployment URL cannot broaden the trust set.
|
|
28
27
|
*/
|
|
29
28
|
export declare function resolveIdentityHubUrl(event: H3Event): string | undefined;
|
|
30
29
|
export declare function handleIdentitySso(event: H3Event, subpath: string): Promise<Response>;
|
|
@@ -7,11 +7,10 @@
|
|
|
7
7
|
* callback-scoped cookie and redeems the code server-to-server. Only that
|
|
8
8
|
* server-to-server response may contain the signed identity assertion.
|
|
9
9
|
*
|
|
10
|
-
* Direct browser federation
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* Desktop implementation or any ordinary auth surface.
|
|
10
|
+
* Direct browser federation uses the canonical Dispatch authority for exact
|
|
11
|
+
* first-party hosted app origins and remains opt-in through
|
|
12
|
+
* `AGENT_NATIVE_IDENTITY_HUB_URL` for self-hosted deployments. The packaged
|
|
13
|
+
* Desktop Canary follows the same canonical-origin boundary.
|
|
15
14
|
*/
|
|
16
15
|
import { createHash, randomBytes } from "node:crypto";
|
|
17
16
|
import { deleteCookie, getCookie, getHeader, getMethod, setCookie } from "h3";
|
|
@@ -22,7 +21,7 @@ import { getAppName } from "./app-name.js";
|
|
|
22
21
|
import { getSession, isExpectedAuthFailure, safeReturnPath } from "./auth.js";
|
|
23
22
|
import { getBetterAuth, getBetterAuthInternalAdapter, } from "./better-auth-instance.js";
|
|
24
23
|
import { createOAuthSession, getOrigin } from "./google-oauth.js";
|
|
25
|
-
import { consumeSsoState, createSsoState, getIdentityHubUrl, identitySsoLoginButtonHtml, isCanonicalAgentNativeAppRequest, isDesktopSsoCanaryUserAgent, isIdentitySsoEnabled, isJtiReplayed, SSO_STATE_TTL_MS, } from "./identity-sso-store.js";
|
|
24
|
+
import { consumeSsoState, createSsoState, CANONICAL_IDENTITY_SSO_HUB_URL, getIdentityHubUrl, identitySsoLoginButtonHtml, isCanonicalAgentNativeAppRequest, isCanonicalIdentitySsoClientRequest, isDesktopSsoCanaryUserAgent, isIdentitySsoExplicitlyEnabled, isIdentitySsoEnabled, isJtiReplayed, SSO_STATE_TTL_MS, } from "./identity-sso-store.js";
|
|
26
25
|
export { getIdentityHubUrl, identitySsoLoginButtonHtml, isIdentitySsoEnabled };
|
|
27
26
|
export const IDENTITY_SSO_PROVIDER_ID = "agent-native";
|
|
28
27
|
export const IDENTITY_SSO_SCOPE = "identity";
|
|
@@ -33,7 +32,6 @@ const DESKTOP_COMPLETION_NONCE = /^[A-Za-z0-9_-]{32,128}$/;
|
|
|
33
32
|
const STATE_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
34
33
|
const CODE = /^[A-Za-z0-9_-]{43}$/;
|
|
35
34
|
const CODE_VERIFIER = /^[A-Za-z0-9._~-]{43,128}$/;
|
|
36
|
-
const DESKTOP_IDENTITY_HUB_URL = "https://dispatch.agent-native.com";
|
|
37
35
|
const SSO_VERIFIER_COOKIE_PREFIX = "agent_native_sso_verifier_";
|
|
38
36
|
const MAX_ASSERTION_AGE_SECONDS = 5 * 60;
|
|
39
37
|
const LOCALHOST_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
@@ -153,14 +151,19 @@ function resolveClientBinding(event, hub) {
|
|
|
153
151
|
return { appId, clientId, redirectUri, authority };
|
|
154
152
|
}
|
|
155
153
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
154
|
+
* Canonical hosted apps may use Dispatch without per-app hub configuration.
|
|
155
|
+
* Self-hosted apps remain strictly env-gated. The exact-origin check is kept
|
|
156
|
+
* request-scoped so a missing deployment URL cannot broaden the trust set.
|
|
159
157
|
*/
|
|
160
158
|
export function resolveIdentityHubUrl(event) {
|
|
161
|
-
const configured =
|
|
159
|
+
const configured = isIdentitySsoExplicitlyEnabled()
|
|
160
|
+
? getIdentityHubUrl()
|
|
161
|
+
: undefined;
|
|
162
162
|
if (configured)
|
|
163
163
|
return configured;
|
|
164
|
+
if (isCanonicalIdentitySsoClientRequest(getHeader(event, "host"), getHeader(event, "x-forwarded-proto"))) {
|
|
165
|
+
return CANONICAL_IDENTITY_SSO_HUB_URL;
|
|
166
|
+
}
|
|
164
167
|
if (!isDesktopSsoCanaryUserAgent(getHeader(event, "user-agent"))) {
|
|
165
168
|
return undefined;
|
|
166
169
|
}
|
|
@@ -168,7 +171,7 @@ export function resolveIdentityHubUrl(event) {
|
|
|
168
171
|
if (!isCanonicalAgentNativeAppRequest(getHeader(event, "host"), getHeader(event, "x-forwarded-proto"))) {
|
|
169
172
|
return undefined;
|
|
170
173
|
}
|
|
171
|
-
return
|
|
174
|
+
return CANONICAL_IDENTITY_SSO_HUB_URL;
|
|
172
175
|
}
|
|
173
176
|
catch (error) {
|
|
174
177
|
void error;
|
|
@@ -11,11 +11,13 @@ declare const _default: import("../../action.js").ActionDefinition<{
|
|
|
11
11
|
};
|
|
12
12
|
orgId?: undefined;
|
|
13
13
|
role?: undefined;
|
|
14
|
+
agentReadable?: undefined;
|
|
14
15
|
} | {
|
|
15
16
|
ownerEmail: string;
|
|
16
17
|
orgId: string;
|
|
17
18
|
visibility: import("../schema.js").Visibility;
|
|
18
19
|
role: "owner" | import("../schema.js").ShareRole;
|
|
20
|
+
agentReadable: boolean;
|
|
19
21
|
shares: any;
|
|
20
22
|
policy: {
|
|
21
23
|
allowPublic: boolean;
|
|
@@ -60,6 +60,7 @@ export default defineAction({
|
|
|
60
60
|
orgId: access.resource.orgId ?? null,
|
|
61
61
|
visibility: access.resource.visibility ?? "private",
|
|
62
62
|
role: access.role,
|
|
63
|
+
agentReadable: Boolean(reg.agentReadable),
|
|
63
64
|
shares: shares.map((s) => ({
|
|
64
65
|
id: s.id,
|
|
65
66
|
principalType: s.principalType,
|
package/dist/sharing/schema.d.ts
CHANGED
|
@@ -160,7 +160,7 @@ export declare function createSharesTable(tableName: string): import("drizzle-or
|
|
|
160
160
|
data: string;
|
|
161
161
|
driverParam: string;
|
|
162
162
|
notNull: true;
|
|
163
|
-
hasDefault:
|
|
163
|
+
hasDefault: true;
|
|
164
164
|
isPrimaryKey: false;
|
|
165
165
|
isAutoincrement: false;
|
|
166
166
|
hasRuntimeDefault: false;
|
package/dist/sharing/schema.js
CHANGED
|
@@ -73,7 +73,10 @@ export function createSharesTable(tableName) {
|
|
|
73
73
|
})
|
|
74
74
|
.notNull()
|
|
75
75
|
.default("viewer"),
|
|
76
|
-
|
|
76
|
+
// Older app databases may already contain share rows from before this
|
|
77
|
+
// audit field existed. A literal default lets additive schema repair add
|
|
78
|
+
// the column without inventing an actor for those historical rows.
|
|
79
|
+
createdBy: text("created_by").notNull().default(""),
|
|
77
80
|
createdAt: text("created_at").notNull().default(now()),
|
|
78
81
|
});
|
|
79
82
|
}
|
|
@@ -182,6 +182,11 @@ in the moment of agent use.
|
|
|
182
182
|
five-item sidebar preview and a footer row with New chat followed by an
|
|
183
183
|
ellipsis disclosure up to fifteen. Apps inject routing, labels, and domain
|
|
184
184
|
actions.
|
|
185
|
+
- **Data grid kit**: provider-agnostic spreadsheet mechanics belong in
|
|
186
|
+
`@agent-native/toolkit/data-grid`. Apps provide rows, typed columns, editor
|
|
187
|
+
slots, selection and width state, persistence callbacks, and product-level
|
|
188
|
+
row/body slots. Keep database models, access checks, grouping, drag/drop,
|
|
189
|
+
and domain actions in the app adapter.
|
|
185
190
|
- **Agent page kit**: the full-page `/agent` surface (`AgentTabsPage` from
|
|
186
191
|
`@agent-native/core/client`) with Context, Files, Connections, Jobs, and
|
|
187
192
|
Access tabs plus a Personal/Organization scope toggle. The canonical home
|
|
@@ -184,6 +184,27 @@ import { ShareButton } from "@agent-native/core/client/sharing";
|
|
|
184
184
|
|
|
185
185
|
For list views, show `<VisibilityBadge visibility={row.visibility} />` next to each resource.
|
|
186
186
|
|
|
187
|
+
## Standard share surface
|
|
188
|
+
|
|
189
|
+
All app share popovers should use the same compact surface contract:
|
|
190
|
+
|
|
191
|
+
- Use the text-only `ShareTrigger` from `@agent-native/toolkit/sharing`.
|
|
192
|
+
- Render ordinary links with `ShareCopyRow`, which exposes a Copy action without
|
|
193
|
+
printing the raw URL.
|
|
194
|
+
- Keep general access and individual people access in the standard Core sharing
|
|
195
|
+
flow. The people flow supports email invites, roles, notifications, and
|
|
196
|
+
removal through the shared share actions.
|
|
197
|
+
- Add `ShareAgentsSection` only when the resource has a real agent-readable
|
|
198
|
+
link or prompt. Keep it collapsed by default and supply domain-specific
|
|
199
|
+
content through the shared section shell.
|
|
200
|
+
- App-specific tabs or controls may remain when they represent a real domain
|
|
201
|
+
action (for example, an embed-code editor), but they should retain the same
|
|
202
|
+
trigger, copy-row, access, and spacing language.
|
|
203
|
+
|
|
204
|
+
`ShareDisclosureSection` is the toolkit-owned shell for optional expandable
|
|
205
|
+
share details; use its `ShareAgentsSection` or `SharePeopleSection` wrappers
|
|
206
|
+
instead of creating another collapsible share panel in a template.
|
|
207
|
+
|
|
187
208
|
## Actions available everywhere
|
|
188
209
|
|
|
189
210
|
The framework auto-mounts these actions in every template — no per-template boilerplate:
|
|
@@ -182,6 +182,11 @@ in the moment of agent use.
|
|
|
182
182
|
five-item sidebar preview and a footer row with New chat followed by an
|
|
183
183
|
ellipsis disclosure up to fifteen. Apps inject routing, labels, and domain
|
|
184
184
|
actions.
|
|
185
|
+
- **Data grid kit**: provider-agnostic spreadsheet mechanics belong in
|
|
186
|
+
`@agent-native/toolkit/data-grid`. Apps provide rows, typed columns, editor
|
|
187
|
+
slots, selection and width state, persistence callbacks, and product-level
|
|
188
|
+
row/body slots. Keep database models, access checks, grouping, drag/drop,
|
|
189
|
+
and domain actions in the app adapter.
|
|
185
190
|
- **Agent page kit**: the full-page `/agent` surface (`AgentTabsPage` from
|
|
186
191
|
`@agent-native/core/client`) with Context, Files, Connections, Jobs, and
|
|
187
192
|
Access tabs plus a Personal/Organization scope toggle. The canonical home
|