@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.
Files changed (167) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  3. package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +21 -0
  4. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +40 -1
  5. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  6. package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +21 -0
  7. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  8. package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +21 -0
  9. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  10. package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +21 -0
  11. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
  12. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  13. package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +21 -0
  14. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  15. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +7 -7
  16. package/corpus/templates/clips/actions/approve-recording-access-request.ts +147 -0
  17. package/corpus/templates/clips/actions/request-recording-access.ts +121 -23
  18. package/corpus/templates/clips/actions/view-screen.ts +1 -1
  19. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +34 -53
  20. package/corpus/templates/clips/app/components/player/request-access-dialog.tsx +104 -0
  21. package/corpus/templates/clips/app/components/player/share-dialog.tsx +36 -45
  22. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -6
  23. package/corpus/templates/clips/app/i18n/en-US.ts +26 -1
  24. package/corpus/templates/clips/app/lib/public-meeting.ts +1 -1
  25. package/corpus/templates/clips/app/routes/access-request.approve.tsx +250 -0
  26. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -32
  27. package/corpus/templates/clips/app/routes/share.$shareId.tsx +123 -37
  28. package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +41 -1
  29. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +1 -0
  30. package/corpus/templates/clips/server/lib/emails.ts +40 -11
  31. package/corpus/templates/clips/shared/recording-link.ts +32 -1
  32. package/corpus/templates/clips/shared/share-attribution.ts +13 -0
  33. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  34. package/corpus/templates/content/.agents/skills/sharing/SKILL.md +21 -0
  35. package/corpus/templates/content/actions/add-database-item.ts +9 -0
  36. package/corpus/templates/content/actions/describe-content-database.ts +92 -0
  37. package/corpus/templates/content/actions/list-content-databases.ts +213 -72
  38. package/corpus/templates/content/actions/set-document-property.ts +9 -0
  39. package/corpus/templates/content/actions/submit-content-database-form.ts +9 -0
  40. package/corpus/templates/content/actions/update-document.ts +9 -0
  41. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +22 -10
  42. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +2 -1
  43. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +245 -9
  44. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +192 -134
  45. package/corpus/templates/content/app/components/editor/database/settings.tsx +7 -0
  46. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +61 -45
  47. package/corpus/templates/content/app/components/editor/extensions/ImageNode.ts +6 -0
  48. package/corpus/templates/content/app/components/editor/image-upload.ts +137 -5
  49. package/corpus/templates/content/app/global.css +8 -0
  50. package/corpus/templates/content/app/hooks/use-content-database.ts +91 -11
  51. package/corpus/templates/content/changelog/2026-08-12-image-uploads-now-confirm-the-image-can-be-displayed-before-.md +6 -0
  52. package/corpus/templates/content/changelog/2026-08-14-images-fill-the-page-width-by-default-and-remain-visible-whe.md +6 -0
  53. package/corpus/templates/content/changelog/2026-08-14-images-inserted-from-the-slash-command-stay-saved-after-uplo.md +6 -0
  54. package/corpus/templates/content/changelog/2026-08-14-svg-files-can-be-selected-reliably-from-the-image-picker.md +6 -0
  55. package/corpus/templates/content/parity/matrix.md +1 -1
  56. package/corpus/templates/content/parity/matrix.ts +7 -1
  57. package/corpus/templates/content/server/plugins/agent-chat.ts +3 -0
  58. package/corpus/templates/content/shared/api.ts +9 -0
  59. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  60. package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +21 -0
  61. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  62. package/corpus/templates/design/.agents/skills/sharing/SKILL.md +21 -0
  63. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  64. package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +21 -0
  65. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  66. package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +21 -0
  67. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  68. package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +21 -0
  69. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  70. package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +21 -0
  71. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  72. package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +21 -0
  73. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +6 -1
  74. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  75. package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +21 -0
  76. package/corpus/templates/plan/app/pages/PlansPage.tsx +25 -30
  77. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  78. package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +21 -0
  79. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +2 -1
  80. package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +124 -180
  81. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +1 -0
  82. package/corpus/templates/slides/app/global.css +99 -3
  83. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  84. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  85. package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +21 -0
  86. package/dist/chat-threads/schema.d.ts +1 -1
  87. package/dist/cli/code-agent-executor.js +318 -0
  88. package/dist/client/AgentPanel.d.ts +13 -1
  89. package/dist/client/AgentPanel.js +41 -3
  90. package/dist/client/AssistantChat.d.ts +9 -1
  91. package/dist/client/AssistantChat.js +26 -13
  92. package/dist/client/MultiTabAssistantChat.js +18 -5
  93. package/dist/client/agent-chat.d.ts +8 -0
  94. package/dist/client/agent-chat.js +15 -0
  95. package/dist/client/app-chat-sidebar.d.ts +23 -0
  96. package/dist/client/app-chat-sidebar.js +53 -0
  97. package/dist/client/app-providers.js +31 -2
  98. package/dist/client/frame-protocol.d.ts +20 -2
  99. package/dist/client/hooks/index.d.ts +1 -0
  100. package/dist/client/hooks/index.js +1 -0
  101. package/dist/client/sharing/AgentShareSection.d.ts +8 -0
  102. package/dist/client/sharing/AgentShareSection.js +50 -0
  103. package/dist/client/sharing/ShareButton.js +2 -1
  104. package/dist/client/sharing/ShareDialog.d.ts +2 -2
  105. package/dist/client/sharing/ShareDialog.js +21 -29
  106. package/dist/client/sharing/index.d.ts +1 -0
  107. package/dist/client/sharing/index.js +1 -0
  108. package/dist/client/sharing/useShareButtonController.d.ts +1 -0
  109. package/dist/client/sharing/useShareDialogController.d.ts +3 -0
  110. package/dist/client/sharing/useShareDialogController.js +2 -1
  111. package/dist/client/theme.d.ts +21 -0
  112. package/dist/client/theme.js +60 -0
  113. package/dist/client/ui/index.d.ts +1 -1
  114. package/dist/client/ui/index.js +1 -1
  115. package/dist/client/use-session.js +23 -0
  116. package/dist/collab/awareness.d.ts +2 -2
  117. package/dist/collab/routes.d.ts +1 -1
  118. package/dist/collab/struct-routes.d.ts +1 -1
  119. package/dist/dashboard-storage/schema.d.ts +1 -1
  120. package/dist/data-programs/schema.d.ts +1 -1
  121. package/dist/extensions/schema.d.ts +1 -1
  122. package/dist/localization/core-messages/ar-SA.js +6 -0
  123. package/dist/localization/core-messages/de-DE.js +6 -0
  124. package/dist/localization/core-messages/en-US.d.ts +6 -0
  125. package/dist/localization/core-messages/en-US.js +6 -0
  126. package/dist/localization/core-messages/es-ES.js +6 -0
  127. package/dist/localization/core-messages/fr-FR.js +6 -0
  128. package/dist/localization/core-messages/hi-IN.js +6 -0
  129. package/dist/localization/core-messages/ja-JP.js +6 -0
  130. package/dist/localization/core-messages/ko-KR.js +6 -0
  131. package/dist/localization/core-messages/pt-BR.js +6 -0
  132. package/dist/localization/core-messages/zh-CN.js +6 -0
  133. package/dist/localization/core-messages/zh-TW.js +6 -0
  134. package/dist/localization/core-messages.d.ts +6 -0
  135. package/dist/localization/default-messages.d.ts +1 -0
  136. package/dist/localization/default-messages.js +1 -0
  137. package/dist/notifications/routes.d.ts +3 -3
  138. package/dist/observability/routes.d.ts +5 -5
  139. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  140. package/dist/provider-api/actions/provider-api.d.ts +14 -14
  141. package/dist/secrets/routes.d.ts +9 -9
  142. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  143. package/dist/server/auth.js +8 -5
  144. package/dist/server/identity-sso-store.d.ts +6 -1
  145. package/dist/server/identity-sso-store.js +57 -14
  146. package/dist/server/identity-sso.d.ts +7 -8
  147. package/dist/server/identity-sso.js +15 -12
  148. package/dist/sharing/actions/list-resource-shares.d.ts +2 -0
  149. package/dist/sharing/actions/list-resource-shares.js +1 -0
  150. package/dist/sharing/schema.d.ts +1 -1
  151. package/dist/sharing/schema.js +4 -1
  152. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  153. package/dist/templates/chat/.agents/skills/sharing/SKILL.md +21 -0
  154. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  155. package/dist/templates/default/.agents/skills/sharing/SKILL.md +21 -0
  156. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  157. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  158. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +21 -0
  159. package/docs/content/cross-app-sso.mdx +24 -17
  160. package/package.json +3 -3
  161. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  162. package/src/templates/chat/.agents/skills/sharing/SKILL.md +21 -0
  163. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  164. package/src/templates/default/.agents/skills/sharing/SKILL.md +21 -0
  165. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  166. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +5 -0
  167. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +21 -0
@@ -699,6 +699,7 @@ const messages = {
699
699
  embedUrl: "Embed URL",
700
700
  embedCode: "Embed code",
701
701
  copy: "Copy",
702
+ copied: "Copied",
702
703
  role: "Role",
703
704
  private: "Private",
704
705
  privateDescription: "Only people with access can view",
@@ -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
- provider?: undefined;
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
- providers?: undefined;
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
- count?: undefined;
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
- provider?: undefined;
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
- count?: undefined;
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
- count?: undefined;
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
- count?: undefined;
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
- count?: undefined;
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;
@@ -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 {};
@@ -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, isIdentitySsoEnabled, } from "./identity-sso-store.js";
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 this is the packaged SSO Canary on a
1713
- // canonical app origin. Keeping the bypass exact lets that request-scoped
1714
- // decision happen without exposing any other identity subpath.
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
- (isIdentitySsoEnabled() || isDesktopCanaryIdentityRequest)) {
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 when the direct web federation env is unset.
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 (!raw)
57
- return undefined;
58
- try {
59
- const u = new URL(raw);
60
- if (u.protocol !== "https:" &&
61
- !(u.protocol === "http:" && LOCALHOST_HOSTS.has(u.hostname))) {
62
- return undefined;
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
- if (u.username || u.password || u.search || u.hash)
92
+ catch (error) {
93
+ void error;
65
94
  return undefined;
66
- return `${u.protocol}//${u.host}${u.pathname}`.replace(/\/+$/, "");
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 when the direct web federation env is unset.
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 remains opt-in through
11
- * `AGENT_NATIVE_IDENTITY_HUB_URL`. The packaged Desktop Canary may use the
12
- * canonical Dispatch authority on canonical app origins, as established by
13
- * the merged feature-flagged Desktop work. This module does not change the
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
- * The packaged Desktop SSO Canary may use Dispatch without each canonical app
26
- * deploying the direct-web hub env. Ordinary browsers and self-hosted apps
27
- * remain strictly env-gated.
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 remains opt-in through
11
- * `AGENT_NATIVE_IDENTITY_HUB_URL`. The packaged Desktop Canary may use the
12
- * canonical Dispatch authority on canonical app origins, as established by
13
- * the merged feature-flagged Desktop work. This module does not change the
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
- * The packaged Desktop SSO Canary may use Dispatch without each canonical app
157
- * deploying the direct-web hub env. Ordinary browsers and self-hosted apps
158
- * remain strictly env-gated.
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 = getIdentityHubUrl();
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 DESKTOP_IDENTITY_HUB_URL;
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,
@@ -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: false;
163
+ hasDefault: true;
164
164
  isPrimaryKey: false;
165
165
  isAutoincrement: false;
166
166
  hasRuntimeDefault: false;
@@ -73,7 +73,10 @@ export function createSharesTable(tableName) {
73
73
  })
74
74
  .notNull()
75
75
  .default("viewer"),
76
- createdBy: text("created_by").notNull(),
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