@agent-native/core 0.136.4 → 0.137.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.
Files changed (170) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/clips/.agents/skills/recording/SKILL.md +53 -0
  3. package/corpus/templates/clips/actions/import-loom-recording.ts +7 -0
  4. package/corpus/templates/clips/actions/lib/loom-import-job.ts +24 -4
  5. package/corpus/templates/clips/app/components/import-menu.tsx +109 -0
  6. package/corpus/templates/clips/app/components/library/library-grid.tsx +8 -18
  7. package/corpus/templates/clips/app/components/library/library-layout.tsx +14 -50
  8. package/corpus/templates/clips/app/components/library/sort-menu.tsx +20 -6
  9. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +10 -34
  10. package/corpus/templates/clips/app/routes/_app.library._index.tsx +0 -2
  11. package/corpus/templates/clips/changelog/2026-08-03-restart-during-a-recording-now-immediately-starts-a-fresh-ta.md +6 -0
  12. package/corpus/templates/clips/changelog/2026-08-04-cleaner-library-controls-with-an-icon-only-sort-button.md +6 -0
  13. package/corpus/templates/clips/changelog/2026-08-04-upload-and-loom-imports-now-live-under-one-import-menu.md +6 -0
  14. package/corpus/templates/clips/desktop/src/app.tsx +81 -30
  15. package/corpus/templates/clips/desktop/src/lib/recorder.ts +436 -158
  16. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +14 -1
  17. package/corpus/templates/clips/server/plugins/auth.ts +9 -0
  18. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +13 -0
  19. package/corpus/templates/content/actions/_database-utils.ts +6 -0
  20. package/corpus/templates/content/actions/bind-content-database-source-field.ts +273 -97
  21. package/corpus/templates/content/actions/change-content-database-source-role.ts +65 -29
  22. package/corpus/templates/content/actions/configure-document-property.ts +113 -32
  23. package/corpus/templates/content/actions/delete-content-database.ts +5 -7
  24. package/corpus/templates/content/actions/delete-document-property.ts +109 -62
  25. package/corpus/templates/content/actions/delete-document.ts +178 -36
  26. package/corpus/templates/content/actions/duplicate-database-item.ts +27 -0
  27. package/corpus/templates/content/actions/duplicate-database-items.ts +31 -1
  28. package/corpus/templates/content/actions/permanently-delete-document.ts +4 -6
  29. package/corpus/templates/content/actions/remove-database-items.ts +13 -0
  30. package/corpus/templates/content/actions/set-document-property.ts +69 -1
  31. package/corpus/templates/content/actions/upsert-database-item-by-key.ts +814 -0
  32. package/corpus/templates/content/parity/matrix.md +1 -1
  33. package/corpus/templates/content/parity/matrix.ts +1 -0
  34. package/corpus/templates/content/server/db/schema.ts +27 -0
  35. package/corpus/templates/content/server/plugins/db.ts +24 -0
  36. package/corpus/templates/design/app/components/design/BreakpointBar.tsx +122 -114
  37. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +2 -2
  38. package/corpus/templates/design/app/components/design/EditPanel.tsx +68 -34
  39. package/corpus/templates/design/app/components/design/KeyboardShortcutsPanel.tsx +78 -4
  40. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +8 -0
  41. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +5 -2
  42. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +10 -9
  43. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +31 -69
  44. package/corpus/templates/design/app/components/design/inspector/design-icons.tsx +80 -106
  45. package/corpus/templates/design/app/components/design/multi-screen/types.ts +4 -0
  46. package/corpus/templates/design/app/hooks/use-editor-preferences.ts +75 -0
  47. package/corpus/templates/design/app/i18n-data.ts +8 -0
  48. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +61 -0
  49. package/corpus/templates/design/app/pages/design-editor/editor-preferences.ts +98 -0
  50. package/corpus/templates/design/app/pages/design-editor/nudge-intent.ts +491 -0
  51. package/corpus/templates/design/app/pages/design-editor/paste-placement.ts +133 -0
  52. package/corpus/templates/design/app/pages/design-editor/png-export-render.ts +8 -0
  53. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -12
  54. package/corpus/templates/design/changelog/2026-08-03-arrow-keys-now-reorder-a-layer-inside-an-auto-layout-frame.md +6 -0
  55. package/corpus/templates/design/changelog/2026-08-03-auto-layout-flow-icons-show-the-direction-at-a-glance-instea.md +6 -0
  56. package/corpus/templates/design/changelog/2026-08-03-auto-layout-icons-share-one-outlined-square-style-so-flow-ga.md +6 -0
  57. package/corpus/templates/design/changelog/2026-08-03-export-has-a-named-preview-section-you-can-expand-replacing-.md +6 -0
  58. package/corpus/templates/design/changelog/2026-08-03-export-preview-shows-the-selected-element-instead-of-the-who.md +6 -0
  59. package/corpus/templates/design/changelog/2026-08-03-inspector-sections-show-an-expand-indicator-so-it-is-clear-w.md +6 -0
  60. package/corpus/templates/design/changelog/2026-08-03-paste-lands-inside-a-selected-frame-instead-of-beside-it.md +6 -0
  61. package/corpus/templates/design/changelog/2026-08-03-the-add-breakpoint-button-sits-outside-the-breakpoint-select.md +6 -0
  62. package/corpus/templates/design/changelog/2026-08-03-the-agent-s-follow-up-questions-keep-space-below-the-continu.md +6 -0
  63. package/corpus/templates/design/changelog/2026-08-03-the-agent-s-follow-up-questions-share-the-chat-panel-s-backg.md +6 -0
  64. package/corpus/templates/design/changelog/2026-08-03-the-export-panel-no-longer-stacks-a-duplicate-export-block-o.md +6 -0
  65. package/corpus/templates/design/changelog/2026-08-03-the-text-tool-uses-a-t-icon-matching-the-letter-it-inserts.md +6 -0
  66. package/corpus/templates/factory/.env.example +17 -0
  67. package/corpus/templates/factory/AGENTS.md +27 -17
  68. package/corpus/templates/factory/README.md +19 -9
  69. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +90 -0
  70. package/corpus/templates/factory/actions/get-triage-config.ts +14 -3
  71. package/corpus/templates/factory/actions/govern-agent-native-pull-request.ts +386 -0
  72. package/corpus/templates/factory/actions/list-factory-automations.ts +53 -0
  73. package/corpus/templates/factory/actions/list-triage-items.ts +7 -2
  74. package/corpus/templates/factory/actions/poll-github-sources.ts +203 -0
  75. package/corpus/templates/factory/actions/poll-sentry-errors.ts +161 -0
  76. package/corpus/templates/factory/actions/poll-slack-channel.ts +4 -2
  77. package/corpus/templates/factory/actions/run-factory-automation.ts +42 -0
  78. package/corpus/templates/factory/actions/save-factory-automation.ts +69 -0
  79. package/corpus/templates/factory/actions/save-triage-config.ts +28 -2
  80. package/corpus/templates/factory/actions/start-builder-for-item.ts +411 -0
  81. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +14 -3
  82. package/corpus/templates/factory/app/components/ui/checkbox.tsx +1 -0
  83. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +7 -0
  84. package/corpus/templates/factory/app/i18n/en-US.ts +35 -1
  85. package/corpus/templates/factory/app/routes/factory.tsx +462 -9
  86. package/corpus/templates/factory/changelog/2026-08-04-added-organization-owned-factory-automations-for-slack-bug-t.md +6 -0
  87. package/corpus/templates/factory/changelog/2026-08-04-automation-editor-controls-and-model-picker.md +6 -0
  88. package/corpus/templates/factory/netlify.toml +2 -2
  89. package/corpus/templates/factory/server/connectors/credentials.ts +6 -5
  90. package/corpus/templates/factory/server/connectors/slack.ts +133 -5
  91. package/corpus/templates/factory/server/db/schema.ts +6 -0
  92. package/corpus/templates/factory/server/lib/require-factory-automation.ts +65 -0
  93. package/corpus/templates/factory/server/plugins/agent-chat.ts +29 -11
  94. package/corpus/templates/factory/server/plugins/auth.ts +1 -0
  95. package/corpus/templates/factory/server/plugins/factory-migrations.ts +12 -0
  96. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +218 -67
  97. package/corpus/templates/factory/server/triage/builder-executor.ts +4 -0
  98. package/corpus/templates/factory/server/triage/contracts.ts +14 -1
  99. package/corpus/templates/factory/server/triage/github-client.ts +404 -0
  100. package/corpus/templates/factory/server/triage/metadata.ts +44 -0
  101. package/corpus/templates/factory/server/triage/pr-babysit.ts +5 -5
  102. package/corpus/templates/factory/server/triage/pr-policy.ts +144 -0
  103. package/corpus/templates/factory/server/triage/sentry-client.ts +180 -0
  104. package/corpus/templates/factory/server/triage/slack-client.ts +43 -0
  105. package/corpus/templates/factory/server/triage/slack-poller.ts +9 -2
  106. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +27 -0
  107. package/corpus/templates/plan/.agents/skills/visual-plan/references/canvas.md +14 -4
  108. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -0
  109. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -0
  110. package/corpus/templates/plan/actions/create-plan-design.ts +8 -6
  111. package/corpus/templates/plan/actions/create-prototype-plan.ts +8 -6
  112. package/corpus/templates/plan/actions/create-ui-plan.ts +7 -7
  113. package/corpus/templates/plan/actions/get-plan-blocks.ts +7 -1
  114. package/corpus/templates/plan/actions/validate-plan-input.ts +39 -0
  115. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +167 -11
  116. package/corpus/templates/plan/app/i18n/en-US.ts +1 -0
  117. package/corpus/templates/plan/changelog/2026-08-04-canvas-zoom-controls-now-explain-the-command-ctrl-plus-scrol.md +6 -0
  118. package/corpus/templates/plan/changelog/2026-08-04-pinch-to-zoom-is-now-supported-on-touchscreens-in-visual-pla.md +6 -0
  119. package/corpus/templates/plan/shared/plan-content.ts +17 -2
  120. package/dist/cli/skills-content/canvas.d.ts +3 -3
  121. package/dist/cli/skills-content/canvas.js +16 -5
  122. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  123. package/dist/cli/skills-content/visual-plan-skill.js +27 -0
  124. package/dist/cli/skills-content/wireframe.d.ts +2 -2
  125. package/dist/cli/skills-content/wireframe.js +7 -0
  126. package/dist/client/AgentPanel.js +23 -8
  127. package/dist/client/api-path.d.ts +6 -0
  128. package/dist/client/api-path.js +55 -0
  129. package/dist/client/onboarding/FirstRunOnboarding.d.ts +3 -0
  130. package/dist/client/onboarding/FirstRunOnboarding.js +93 -0
  131. package/dist/client/onboarding/first-run-enabled.d.ts +2 -0
  132. package/dist/client/onboarding/first-run-enabled.js +9 -0
  133. package/dist/client/onboarding/index.d.ts +2 -1
  134. package/dist/client/onboarding/index.js +1 -0
  135. package/dist/client/onboarding/use-onboarding.d.ts +6 -1
  136. package/dist/client/onboarding/use-onboarding.js +32 -1
  137. package/dist/client/route-state.js +10 -0
  138. package/dist/client/settings/SecretsSection.js +32 -8
  139. package/dist/collab/struct-routes.d.ts +1 -1
  140. package/dist/connections/catalog.d.ts +4 -4
  141. package/dist/connections/catalog.js +3 -3
  142. package/dist/db/index.d.ts +1 -1
  143. package/dist/db/index.js +1 -1
  144. package/dist/localization/default-messages.d.ts +5 -0
  145. package/dist/localization/default-messages.js +5 -0
  146. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  147. package/dist/observability/routes.d.ts +3 -3
  148. package/dist/onboarding/app-profile.d.ts +4 -0
  149. package/dist/onboarding/app-profile.js +378 -0
  150. package/dist/onboarding/index.d.ts +2 -1
  151. package/dist/onboarding/index.js +1 -0
  152. package/dist/onboarding/plugin.d.ts +2 -0
  153. package/dist/onboarding/plugin.js +21 -1
  154. package/dist/onboarding/types.d.ts +19 -0
  155. package/dist/progress/routes.d.ts +1 -1
  156. package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
  157. package/dist/provider-api/actions/provider-api.d.ts +12 -12
  158. package/dist/secrets/routes.d.ts +2 -2
  159. package/dist/secrets/routes.js +41 -17
  160. package/dist/server/auth.js +21 -1
  161. package/dist/server/better-auth-instance.d.ts +3 -2
  162. package/dist/server/better-auth-instance.js +9 -7
  163. package/dist/server/email-markdown.js +3 -8
  164. package/dist/server/transcribe-voice.d.ts +1 -1
  165. package/dist/shared/first-run-onboarding.d.ts +3 -0
  166. package/dist/shared/first-run-onboarding.js +3 -0
  167. package/dist/triggers/index.d.ts +3 -0
  168. package/dist/triggers/index.js +5 -0
  169. package/docs/content/cross-app-sso.mdx +26 -0
  170. package/package.json +1 -1
@@ -88,6 +88,33 @@ export default defineAction({
88
88
  .where(eq(schema.documentShares.resourceId, row.database.documentId));
89
89
 
90
90
  await db.transaction(async (tx) => {
91
+ const [lockedDatabase] = await tx
92
+ .update(schema.contentDatabases)
93
+ .set({ updatedAt: sql`${schema.contentDatabases.updatedAt}` })
94
+ .where(
95
+ and(
96
+ eq(schema.contentDatabases.id, row.database.id),
97
+ eq(schema.contentDatabases.ownerEmail, row.database.ownerEmail),
98
+ isNull(schema.contentDatabases.deletedAt),
99
+ ),
100
+ )
101
+ .returning({ id: schema.contentDatabases.id });
102
+ if (!lockedDatabase) throw new Error("Database is no longer active.");
103
+ const [claimedSource] = await tx
104
+ .select({ id: schema.contentDatabaseItemKeyClaims.id })
105
+ .from(schema.contentDatabaseItemKeyClaims)
106
+ .where(
107
+ and(
108
+ eq(schema.contentDatabaseItemKeyClaims.databaseId, row.database.id),
109
+ eq(schema.contentDatabaseItemKeyClaims.documentId, row.document.id),
110
+ ),
111
+ )
112
+ .limit(1);
113
+ if (claimedSource) {
114
+ throw new Error(
115
+ "Rows with active stable-key claims cannot be duplicated.",
116
+ );
117
+ }
91
118
  await tx
92
119
  .update(schema.contentDatabaseItems)
93
120
  .set({
@@ -2,7 +2,7 @@ import { defineAction } from "@agent-native/core";
2
2
  import { writeAppState } from "@agent-native/core/application-state";
3
3
  import { getRequestUserEmail } from "@agent-native/core/server/request-context";
4
4
  import { assertAccess } from "@agent-native/core/sharing";
5
- import { and, eq, gte, inArray, sql } from "drizzle-orm";
5
+ import { and, eq, gte, inArray, isNull, sql } from "drizzle-orm";
6
6
 
7
7
  import { getDb, schema } from "../server/db/index.js";
8
8
  import { ensureDocumentsFilesMembership } from "./_content-files.js";
@@ -86,6 +86,36 @@ export default defineAction({
86
86
  }));
87
87
 
88
88
  await db.transaction(async (tx) => {
89
+ const [lockedDatabase] = await tx
90
+ .update(schema.contentDatabases)
91
+ .set({ updatedAt: sql`${schema.contentDatabases.updatedAt}` })
92
+ .where(
93
+ and(
94
+ eq(schema.contentDatabases.id, database.id),
95
+ eq(schema.contentDatabases.ownerEmail, database.ownerEmail),
96
+ isNull(schema.contentDatabases.deletedAt),
97
+ ),
98
+ )
99
+ .returning({ id: schema.contentDatabases.id });
100
+ if (!lockedDatabase) throw new Error("Database is no longer active.");
101
+ const [claimedSource] = await tx
102
+ .select({ id: schema.contentDatabaseItemKeyClaims.id })
103
+ .from(schema.contentDatabaseItemKeyClaims)
104
+ .where(
105
+ and(
106
+ eq(schema.contentDatabaseItemKeyClaims.databaseId, database.id),
107
+ inArray(
108
+ schema.contentDatabaseItemKeyClaims.documentId,
109
+ sourceDocumentIds,
110
+ ),
111
+ ),
112
+ )
113
+ .limit(1);
114
+ if (claimedSource) {
115
+ throw new Error(
116
+ "Rows with active stable-key claims cannot be duplicated.",
117
+ );
118
+ }
89
119
  await tx
90
120
  .update(schema.contentDatabaseItems)
91
121
  .set({
@@ -15,12 +15,10 @@ export default defineAction({
15
15
  run: async ({ id }) => {
16
16
  const access = await assertAccess("document", id, "admin");
17
17
  const db = getDb();
18
- const deleted = await db.transaction((tx) =>
19
- deleteTrashedDocumentSubtree(
20
- tx as unknown as ReturnType<typeof getDb>,
21
- id,
22
- access.resource.ownerEmail as string,
23
- ),
18
+ const deleted = await deleteTrashedDocumentSubtree(
19
+ db,
20
+ id,
21
+ access.resource.ownerEmail as string,
24
22
  );
25
23
  await writeAppState("refresh-signal", { ts: Date.now() });
26
24
  return { success: true, deleted: deleted.length };
@@ -145,6 +145,19 @@ export default defineAction({
145
145
  ),
146
146
  );
147
147
  }
148
+ if (removedItemIds.length > 0) {
149
+ await tx
150
+ .delete(schema.contentDatabaseItemKeyClaims)
151
+ .where(
152
+ and(
153
+ eq(schema.contentDatabaseItemKeyClaims.databaseId, database.id),
154
+ inArray(
155
+ schema.contentDatabaseItemKeyClaims.itemId,
156
+ removedItemIds,
157
+ ),
158
+ ),
159
+ );
160
+ }
148
161
  if (removedItemIds.length > 0) {
149
162
  await tx
150
163
  .delete(schema.contentDatabaseItems)
@@ -1,6 +1,6 @@
1
1
  import { defineAction } from "@agent-native/core";
2
2
  import { assertAccess } from "@agent-native/core/sharing";
3
- import { and, eq } from "drizzle-orm";
3
+ import { and, eq, isNull, ne, sql } from "drizzle-orm";
4
4
  import { z } from "zod";
5
5
 
6
6
  import { getDb, schema } from "../server/db/index.js";
@@ -130,7 +130,65 @@ export default defineAction({
130
130
 
131
131
  const valueJson = normalizedValueJson(type, value);
132
132
  await db.transaction(async (tx) => {
133
+ const [lockedDatabase] = await tx
134
+ .update(schema.contentDatabases)
135
+ .set({ updatedAt: sql`${schema.contentDatabases.updatedAt}` })
136
+ .where(
137
+ and(
138
+ eq(schema.contentDatabases.id, database.id),
139
+ eq(schema.contentDatabases.documentId, database.documentId),
140
+ eq(schema.contentDatabases.ownerEmail, database.ownerEmail),
141
+ isNull(schema.contentDatabases.deletedAt),
142
+ ),
143
+ )
144
+ .returning({ id: schema.contentDatabases.id });
145
+ if (!lockedDatabase) throw new Error("Database is no longer active.");
146
+ const [lockedDefinition] = await tx
147
+ .update(schema.documentPropertyDefinitions)
148
+ .set({
149
+ updatedAt: sql`${schema.documentPropertyDefinitions.updatedAt}`,
150
+ })
151
+ .where(
152
+ and(
153
+ eq(schema.documentPropertyDefinitions.id, propertyId),
154
+ eq(schema.documentPropertyDefinitions.databaseId, database.id),
155
+ eq(
156
+ schema.documentPropertyDefinitions.ownerEmail,
157
+ database.ownerEmail,
158
+ ),
159
+ ),
160
+ )
161
+ .returning({
162
+ type: schema.documentPropertyDefinitions.type,
163
+ systemRole: schema.documentPropertyDefinitions.systemRole,
164
+ });
165
+ if (
166
+ !lockedDefinition ||
167
+ lockedDefinition.type !== definition.type ||
168
+ lockedDefinition.systemRole
169
+ ) {
170
+ throw new Error(
171
+ `Property "${propertyId}" changed or was deleted before its value could be written.`,
172
+ );
173
+ }
133
174
  await lockDatabaseMemberships(tx, [membership.id]);
175
+ const [conflictingClaim] = await tx
176
+ .select({ id: schema.contentDatabaseItemKeyClaims.id })
177
+ .from(schema.contentDatabaseItemKeyClaims)
178
+ .where(
179
+ and(
180
+ eq(schema.contentDatabaseItemKeyClaims.databaseId, database.id),
181
+ eq(schema.contentDatabaseItemKeyClaims.propertyId, propertyId),
182
+ eq(schema.contentDatabaseItemKeyClaims.keyValueJson, valueJson),
183
+ ne(schema.contentDatabaseItemKeyClaims.documentId, documentId),
184
+ ),
185
+ )
186
+ .limit(1);
187
+ if (conflictingClaim) {
188
+ throw new Error(
189
+ "This value is already claimed as another row's stable key.",
190
+ );
191
+ }
134
192
  const [existing] = await tx
135
193
  .select({ id: schema.documentPropertyValues.id })
136
194
  .from(schema.documentPropertyValues)
@@ -156,6 +214,16 @@ export default defineAction({
156
214
  updatedAt: now,
157
215
  });
158
216
  }
217
+ await tx
218
+ .delete(schema.contentDatabaseItemKeyClaims)
219
+ .where(
220
+ and(
221
+ eq(schema.contentDatabaseItemKeyClaims.databaseId, database.id),
222
+ eq(schema.contentDatabaseItemKeyClaims.propertyId, propertyId),
223
+ eq(schema.contentDatabaseItemKeyClaims.documentId, documentId),
224
+ ne(schema.contentDatabaseItemKeyClaims.keyValueJson, valueJson),
225
+ ),
226
+ );
159
227
  });
160
228
 
161
229
  return {