@agent-native/core 0.164.11 → 0.164.12

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 (65) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +84 -0
  3. package/corpus/templates/calendar/AGENTS.md +5 -0
  4. package/corpus/templates/calendar/actions/delete-event.ts +1 -1
  5. package/corpus/templates/calendar/actions/delete-events.ts +508 -0
  6. package/corpus/templates/calendar/actions/event-action-helpers.ts +1 -1
  7. package/corpus/templates/calendar/actions/list-events.ts +53 -0
  8. package/corpus/templates/calendar/changelog/2026-08-18-the-agent-can-now-remove-many-meetings-at-once-such-as-every.md +6 -0
  9. package/corpus/templates/calendar/server/lib/event-weekday.ts +112 -0
  10. package/corpus/templates/factory/AGENTS.md +2 -1
  11. package/corpus/templates/factory/actions/get-factory-graph-version.ts +69 -0
  12. package/corpus/templates/factory/actions/list-factory-graph-versions.ts +82 -0
  13. package/corpus/templates/factory/actions/restore-factory-graph-version.ts +163 -0
  14. package/corpus/templates/factory/actions/save-factory-graph.ts +93 -60
  15. package/corpus/templates/factory/app/components/factory/FactoryHistoryView.tsx +709 -0
  16. package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +62 -2
  17. package/corpus/templates/factory/app/components/ui/alert-dialog.tsx +1 -0
  18. package/corpus/templates/factory/app/i18n/en-US.ts +43 -0
  19. package/corpus/templates/factory/app/routes/factory.tsx +115 -15
  20. package/corpus/templates/factory/server/plugins/agent-chat.ts +3 -1
  21. package/dist/collab/awareness.d.ts +2 -2
  22. package/dist/collab/struct-routes.d.ts +1 -1
  23. package/dist/notifications/routes.d.ts +3 -3
  24. package/dist/observability/routes.d.ts +3 -3
  25. package/dist/progress/routes.d.ts +1 -1
  26. package/dist/secrets/routes.d.ts +9 -9
  27. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  28. package/dist/server/realtime-token.d.ts +1 -1
  29. package/docs/content/actions-access-control.mdx +136 -2
  30. package/docs/content/actions-agent-tools.mdx +101 -0
  31. package/docs/content/actions-defining.mdx +2 -2
  32. package/docs/content/audit-log.mdx +1 -1
  33. package/docs/content/authentication.mdx +1 -1
  34. package/docs/content/cloudflare.mdx +43 -0
  35. package/docs/content/creating-templates.mdx +1 -1
  36. package/docs/content/deploy-an-app.mdx +109 -0
  37. package/docs/content/deployment-environment-variables.mdx +101 -0
  38. package/docs/content/deployment.mdx +125 -792
  39. package/docs/content/docs-components.mdx +2 -2
  40. package/docs/content/environment-variables.mdx +41 -41
  41. package/docs/content/file-uploads.mdx +74 -40
  42. package/docs/content/harness-agents.mdx +2 -2
  43. package/docs/content/internationalization.mdx +61 -65
  44. package/docs/content/key-concepts.mdx +3 -3
  45. package/docs/content/multi-app-workspace.mdx +2 -2
  46. package/docs/content/netlify.mdx +47 -0
  47. package/docs/content/node-docker.mdx +138 -0
  48. package/docs/content/organizations-teams-permissions.mdx +5 -5
  49. package/docs/content/other-platforms.mdx +27 -0
  50. package/docs/content/ssr-caching.mdx +45 -0
  51. package/docs/content/template-assets-developers.mdx +2 -2
  52. package/docs/content/template-chat-developers.mdx +2 -2
  53. package/docs/content/template-content-developers.mdx +2 -2
  54. package/docs/content/{local-file-mode.mdx → template-content-local-files.mdx} +2 -1
  55. package/docs/content/template-content-sync.mdx +2 -2
  56. package/docs/content/toolkit-agent-ux.mdx +1 -1
  57. package/docs/content/toolkit-resources.mdx +2 -2
  58. package/docs/content/updating-ui-in-production.mdx +35 -0
  59. package/docs/content/vercel.mdx +38 -0
  60. package/docs/content/what-is-agent-native.mdx +1 -1
  61. package/docs/content/workspace-deployment.mdx +350 -0
  62. package/package.json +1 -1
  63. package/docs/content/agents.mdx +0 -9
  64. package/docs/content/database.mdx +0 -317
  65. package/docs/content/human-approval.mdx +0 -156
@@ -12,10 +12,7 @@ import {
12
12
  factoryGraphSchema,
13
13
  normalizeFactoryGraph,
14
14
  } from "../server/factory-graph/contracts.js";
15
- import {
16
- DEFAULT_FACTORY_ID,
17
- readFactoryDefinition,
18
- } from "../server/factory-graph/store.js";
15
+ import { DEFAULT_FACTORY_ID } from "../server/factory-graph/store.js";
19
16
  import {
20
17
  requireWorkspaceMember,
21
18
  workspaceMemberIdentityFromContext,
@@ -24,7 +21,7 @@ import { stableId } from "../server/triage/ids.js";
24
21
 
25
22
  export default defineAction({
26
23
  description:
27
- "Create or update a Factory's versioned visual graph. Use source=ai for an agent-proposed graph and source=manual for a direct editor save. This changes configuration only; it never starts provider work.",
24
+ "Create or update a Factory's versioned visual graph. Pass expectedGraphVersion from the graph you inspected so stale edits are rejected. Use source=ai for an agent-proposed graph and source=manual for a direct editor save. This changes configuration only; it never starts provider work.",
28
25
  schema: z.object({
29
26
  factoryId: z
30
27
  .string()
@@ -38,6 +35,7 @@ export default defineAction({
38
35
  prompt: z.string().trim().max(10_000).default(""),
39
36
  source: z.enum(["manual", "ai", "seed"]).default("manual"),
40
37
  changeSummary: z.string().trim().max(500).default(""),
38
+ expectedGraphVersion: z.coerce.number().int().nonnegative(),
41
39
  graph: factoryGraphSchema,
42
40
  }),
43
41
  link: ({ result }) => ({
@@ -49,81 +47,116 @@ export default defineAction({
49
47
  label: `Open ${result.name} in Factory`,
50
48
  }),
51
49
  run: async (
52
- { factoryId, name, description, prompt, source, changeSummary, graph },
50
+ {
51
+ factoryId,
52
+ name,
53
+ description,
54
+ prompt,
55
+ source,
56
+ changeSummary,
57
+ expectedGraphVersion,
58
+ graph,
59
+ },
53
60
  context,
54
61
  ) => {
55
62
  const { userEmail, orgId } = await requireWorkspaceMember(
56
63
  workspaceMemberIdentityFromContext(context),
57
64
  );
58
65
  const db = getDb();
59
- const existing = await readFactoryDefinition(orgId, factoryId);
60
- const nextVersion = (existing?.graphVersion ?? 0) + 1;
61
- const normalizedGraph = normalizeFactoryGraph({
62
- ...graph,
63
- version: nextVersion,
64
- name,
65
- description,
66
- });
67
- const now = new Date().toISOString();
68
- const versionId = stableId(
69
- "factory-graph",
70
- orgId,
71
- factoryId,
72
- String(nextVersion),
73
- );
74
66
 
75
- await db.insert(factoryGraphVersions).values({
76
- id: versionId,
77
- factoryId,
78
- version: nextVersion,
79
- graphJson: JSON.stringify(normalizedGraph),
80
- source,
81
- changeSummary,
82
- createdAt: now,
83
- createdBy: userEmail,
84
- ownerEmail: userEmail,
85
- orgId,
86
- });
67
+ return db.transaction(async (tx) => {
68
+ const existing = (
69
+ await tx
70
+ .select()
71
+ .from(factoryDefinitions)
72
+ .where(
73
+ and(
74
+ eq(factoryDefinitions.id, factoryId),
75
+ eq(factoryDefinitions.orgId, orgId),
76
+ ),
77
+ )
78
+ .limit(1)
79
+ )[0];
80
+ if ((existing?.graphVersion ?? 0) !== expectedGraphVersion) {
81
+ throw new Error(
82
+ "Factory changed while saving. Refresh the Factory and try again.",
83
+ );
84
+ }
85
+ const nextVersion = (existing?.graphVersion ?? 0) + 1;
86
+ const normalizedGraph = normalizeFactoryGraph({
87
+ ...graph,
88
+ version: nextVersion,
89
+ name,
90
+ description,
91
+ });
92
+ const now = new Date().toISOString();
93
+ const versionId = stableId(
94
+ "factory-graph",
95
+ orgId,
96
+ factoryId,
97
+ String(nextVersion),
98
+ );
87
99
 
88
- if (existing) {
89
- await db
90
- .update(factoryDefinitions)
91
- .set({
100
+ if (existing) {
101
+ const updated = await tx
102
+ .update(factoryDefinitions)
103
+ .set({
104
+ name,
105
+ description,
106
+ prompt,
107
+ graphVersion: nextVersion,
108
+ graphJson: JSON.stringify(normalizedGraph),
109
+ updatedAt: now,
110
+ ownerEmail: userEmail,
111
+ })
112
+ .where(
113
+ and(
114
+ eq(factoryDefinitions.id, factoryId),
115
+ eq(factoryDefinitions.orgId, orgId),
116
+ eq(factoryDefinitions.graphVersion, expectedGraphVersion),
117
+ ),
118
+ )
119
+ .returning({ id: factoryDefinitions.id });
120
+ if (updated.length === 0) {
121
+ throw new Error(
122
+ "Factory changed while saving. Refresh the Factory and try again.",
123
+ );
124
+ }
125
+ } else {
126
+ await tx.insert(factoryDefinitions).values({
127
+ id: factoryId,
92
128
  name,
93
129
  description,
94
130
  prompt,
95
131
  graphVersion: nextVersion,
96
132
  graphJson: JSON.stringify(normalizedGraph),
133
+ createdAt: now,
97
134
  updatedAt: now,
98
135
  ownerEmail: userEmail,
99
- })
100
- .where(
101
- and(
102
- eq(factoryDefinitions.id, factoryId),
103
- eq(factoryDefinitions.orgId, orgId),
104
- ),
105
- );
106
- } else {
107
- await db.insert(factoryDefinitions).values({
108
- id: factoryId,
109
- name,
110
- description,
111
- prompt,
112
- graphVersion: nextVersion,
136
+ orgId,
137
+ });
138
+ }
139
+
140
+ await tx.insert(factoryGraphVersions).values({
141
+ id: versionId,
142
+ factoryId,
143
+ version: nextVersion,
113
144
  graphJson: JSON.stringify(normalizedGraph),
145
+ source,
146
+ changeSummary,
114
147
  createdAt: now,
115
- updatedAt: now,
148
+ createdBy: userEmail,
116
149
  ownerEmail: userEmail,
117
150
  orgId,
118
151
  });
119
- }
120
152
 
121
- return {
122
- ok: true,
123
- factoryId,
124
- name,
125
- graphVersion: nextVersion,
126
- source,
127
- };
153
+ return {
154
+ ok: true,
155
+ factoryId,
156
+ name,
157
+ graphVersion: nextVersion,
158
+ source,
159
+ };
160
+ });
128
161
  },
129
162
  });