@agent-native/core 0.7.2 → 0.7.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 (153) hide show
  1. package/dist/client/FeedbackButton.d.ts +3 -1
  2. package/dist/client/FeedbackButton.d.ts.map +1 -1
  3. package/dist/client/FeedbackButton.js +115 -40
  4. package/dist/client/FeedbackButton.js.map +1 -1
  5. package/dist/client/index.d.ts +1 -0
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/index.js +1 -0
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/settings/SecretsSection.d.ts +12 -0
  10. package/dist/client/settings/SecretsSection.d.ts.map +1 -0
  11. package/dist/client/settings/SecretsSection.js +148 -0
  12. package/dist/client/settings/SecretsSection.js.map +1 -0
  13. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  14. package/dist/client/settings/SettingsPanel.js +100 -2
  15. package/dist/client/settings/SettingsPanel.js.map +1 -1
  16. package/dist/client/settings/index.d.ts +1 -0
  17. package/dist/client/settings/index.d.ts.map +1 -1
  18. package/dist/client/settings/index.js +1 -0
  19. package/dist/client/settings/index.js.map +1 -1
  20. package/dist/client/sharing/ShareButton.d.ts +14 -0
  21. package/dist/client/sharing/ShareButton.d.ts.map +1 -0
  22. package/dist/client/sharing/ShareButton.js +43 -0
  23. package/dist/client/sharing/ShareButton.js.map +1 -0
  24. package/dist/client/sharing/ShareDialog.d.ts +15 -0
  25. package/dist/client/sharing/ShareDialog.d.ts.map +1 -0
  26. package/dist/client/sharing/ShareDialog.js +209 -0
  27. package/dist/client/sharing/ShareDialog.js.map +1 -0
  28. package/dist/client/sharing/VisibilityBadge.d.ts +11 -0
  29. package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -0
  30. package/dist/client/sharing/VisibilityBadge.js +20 -0
  31. package/dist/client/sharing/VisibilityBadge.js.map +1 -0
  32. package/dist/client/sharing/index.d.ts +4 -0
  33. package/dist/client/sharing/index.d.ts.map +1 -0
  34. package/dist/client/sharing/index.js +4 -0
  35. package/dist/client/sharing/index.js.map +1 -0
  36. package/dist/client/use-action.d.ts.map +1 -1
  37. package/dist/client/use-action.js +7 -2
  38. package/dist/client/use-action.js.map +1 -1
  39. package/dist/db/schema.d.ts +1 -0
  40. package/dist/db/schema.d.ts.map +1 -1
  41. package/dist/db/schema.js +4 -0
  42. package/dist/db/schema.js.map +1 -1
  43. package/dist/deploy/build.js +22 -3
  44. package/dist/deploy/build.js.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +4 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/onboarding/default-steps.d.ts.map +1 -1
  50. package/dist/onboarding/default-steps.js +5 -0
  51. package/dist/onboarding/default-steps.js.map +1 -1
  52. package/dist/org/accept-pending.d.ts +22 -0
  53. package/dist/org/accept-pending.d.ts.map +1 -0
  54. package/dist/org/accept-pending.js +75 -0
  55. package/dist/org/accept-pending.js.map +1 -0
  56. package/dist/org/handlers.d.ts +2 -0
  57. package/dist/org/handlers.d.ts.map +1 -1
  58. package/dist/org/handlers.js +52 -1
  59. package/dist/org/handlers.js.map +1 -1
  60. package/dist/org/index.d.ts +2 -0
  61. package/dist/org/index.d.ts.map +1 -1
  62. package/dist/org/index.js +1 -0
  63. package/dist/org/index.js.map +1 -1
  64. package/dist/secrets/index.d.ts +15 -0
  65. package/dist/secrets/index.d.ts.map +1 -0
  66. package/dist/secrets/index.js +15 -0
  67. package/dist/secrets/index.js.map +1 -0
  68. package/dist/secrets/onboarding.d.ts +18 -0
  69. package/dist/secrets/onboarding.d.ts.map +1 -0
  70. package/dist/secrets/onboarding.js +87 -0
  71. package/dist/secrets/onboarding.js.map +1 -0
  72. package/dist/secrets/register.d.ts +63 -0
  73. package/dist/secrets/register.d.ts.map +1 -0
  74. package/dist/secrets/register.js +55 -0
  75. package/dist/secrets/register.js.map +1 -0
  76. package/dist/secrets/routes.d.ts +67 -0
  77. package/dist/secrets/routes.d.ts.map +1 -0
  78. package/dist/secrets/routes.js +275 -0
  79. package/dist/secrets/routes.js.map +1 -0
  80. package/dist/secrets/schema.d.ts +154 -0
  81. package/dist/secrets/schema.d.ts.map +1 -0
  82. package/dist/secrets/schema.js +41 -0
  83. package/dist/secrets/schema.js.map +1 -0
  84. package/dist/secrets/storage.d.ts +54 -0
  85. package/dist/secrets/storage.d.ts.map +1 -0
  86. package/dist/secrets/storage.js +181 -0
  87. package/dist/secrets/storage.js.map +1 -0
  88. package/dist/server/action-discovery.d.ts +18 -0
  89. package/dist/server/action-discovery.d.ts.map +1 -1
  90. package/dist/server/action-discovery.js +95 -0
  91. package/dist/server/action-discovery.js.map +1 -1
  92. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  93. package/dist/server/agent-chat-plugin.js +12 -0
  94. package/dist/server/agent-chat-plugin.js.map +1 -1
  95. package/dist/server/app-name.d.ts +13 -0
  96. package/dist/server/app-name.d.ts.map +1 -0
  97. package/dist/server/app-name.js +41 -0
  98. package/dist/server/app-name.js.map +1 -0
  99. package/dist/server/app-url.d.ts +24 -0
  100. package/dist/server/app-url.d.ts.map +1 -0
  101. package/dist/server/app-url.js +68 -0
  102. package/dist/server/app-url.js.map +1 -0
  103. package/dist/server/better-auth-instance.d.ts.map +1 -1
  104. package/dist/server/better-auth-instance.js +38 -9
  105. package/dist/server/better-auth-instance.js.map +1 -1
  106. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  107. package/dist/server/core-routes-plugin.js +29 -0
  108. package/dist/server/core-routes-plugin.js.map +1 -1
  109. package/dist/server/email-template.d.ts +51 -0
  110. package/dist/server/email-template.d.ts.map +1 -0
  111. package/dist/server/email-template.js +146 -0
  112. package/dist/server/email-template.js.map +1 -0
  113. package/dist/server/index.d.ts +5 -1
  114. package/dist/server/index.d.ts.map +1 -1
  115. package/dist/server/index.js +5 -1
  116. package/dist/server/index.js.map +1 -1
  117. package/dist/sharing/access.d.ts +56 -0
  118. package/dist/sharing/access.d.ts.map +1 -0
  119. package/dist/sharing/access.js +149 -0
  120. package/dist/sharing/access.js.map +1 -0
  121. package/dist/sharing/actions/list-resource-shares.d.ts +3 -0
  122. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -0
  123. package/dist/sharing/actions/list-resource-shares.js +38 -0
  124. package/dist/sharing/actions/list-resource-shares.js.map +1 -0
  125. package/dist/sharing/actions/set-resource-visibility.d.ts +3 -0
  126. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -0
  127. package/dist/sharing/actions/set-resource-visibility.js +24 -0
  128. package/dist/sharing/actions/set-resource-visibility.js.map +1 -0
  129. package/dist/sharing/actions/share-resource.d.ts +3 -0
  130. package/dist/sharing/actions/share-resource.d.ts.map +1 -0
  131. package/dist/sharing/actions/share-resource.js +64 -0
  132. package/dist/sharing/actions/share-resource.js.map +1 -0
  133. package/dist/sharing/actions/unshare-resource.d.ts +3 -0
  134. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -0
  135. package/dist/sharing/actions/unshare-resource.js +24 -0
  136. package/dist/sharing/actions/unshare-resource.js.map +1 -0
  137. package/dist/sharing/index.d.ts +11 -0
  138. package/dist/sharing/index.d.ts.map +1 -0
  139. package/dist/sharing/index.js +11 -0
  140. package/dist/sharing/index.js.map +1 -0
  141. package/dist/sharing/registry.d.ts +44 -0
  142. package/dist/sharing/registry.d.ts.map +1 -0
  143. package/dist/sharing/registry.js +54 -0
  144. package/dist/sharing/registry.js.map +1 -0
  145. package/dist/sharing/schema.d.ts +202 -0
  146. package/dist/sharing/schema.d.ts.map +1 -0
  147. package/dist/sharing/schema.js +88 -0
  148. package/dist/sharing/schema.js.map +1 -0
  149. package/dist/vite/action-types-plugin.d.ts +5 -0
  150. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  151. package/dist/vite/action-types-plugin.js +129 -28
  152. package/dist/vite/action-types-plugin.js.map +1 -1
  153. package/package.json +12 -4
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Access-control helpers for shareable resources.
3
+ *
4
+ * The access model combines:
5
+ * 1. Direct ownership — `owner_email = currentUser`.
6
+ * 2. Visibility — `'private' | 'org' | 'public'`. `org` grants read to anyone
7
+ * in the same org; `public` grants read to any authenticated user.
8
+ * 3. Share rows — per-user or per-org grants in the `{type}_shares` table
9
+ * with a role (`viewer | editor | admin`).
10
+ *
11
+ * Use `applyAccessFilter()` on list/read queries to filter rows the current
12
+ * user can see. Use `assertAccess()` at the top of write actions to reject
13
+ * callers who lack the required role.
14
+ */
15
+ import { and, eq, or, sql } from "drizzle-orm";
16
+ import { getRequestUserEmail, getRequestOrgId, } from "../server/request-context.js";
17
+ import { requireShareableResource, } from "./registry.js";
18
+ import { ROLE_RANK } from "./schema.js";
19
+ export class ForbiddenError extends Error {
20
+ statusCode = 403;
21
+ constructor(message = "Forbidden") {
22
+ super(message);
23
+ this.name = "ForbiddenError";
24
+ }
25
+ }
26
+ /** Current request's access context. Pulls from request-context ALS. */
27
+ export function currentAccess() {
28
+ return {
29
+ userEmail: getRequestUserEmail(),
30
+ orgId: getRequestOrgId(),
31
+ };
32
+ }
33
+ /**
34
+ * Build a Drizzle `WHERE` clause that admits rows the current user can see.
35
+ * Pass the ownable resource table and its shares table; optional min role
36
+ * (defaults to 'viewer') gates which share rows count.
37
+ *
38
+ * Example:
39
+ *
40
+ * const rows = await db
41
+ * .select()
42
+ * .from(schema.documents)
43
+ * .where(accessFilter(schema.documents, schema.documentShares));
44
+ */
45
+ export function accessFilter(resourceTable, sharesTable, ctx = currentAccess(), minRole = "viewer") {
46
+ const { userEmail, orgId } = ctx;
47
+ const clauses = [];
48
+ if (userEmail) {
49
+ clauses.push(eq(resourceTable.ownerEmail, userEmail));
50
+ }
51
+ clauses.push(eq(resourceTable.visibility, "public"));
52
+ if (orgId) {
53
+ clauses.push(and(eq(resourceTable.visibility, "org"), eq(resourceTable.orgId, orgId)));
54
+ }
55
+ if (userEmail) {
56
+ clauses.push(sql `exists (select 1 from ${sharesTable}
57
+ where ${sharesTable.resourceId} = ${resourceTable.id}
58
+ and ${sharesTable.principalType} = 'user'
59
+ and ${sharesTable.principalId} = ${userEmail}
60
+ and ${minRoleSql(minRole)})`);
61
+ }
62
+ if (orgId) {
63
+ clauses.push(sql `exists (select 1 from ${sharesTable}
64
+ where ${sharesTable.resourceId} = ${resourceTable.id}
65
+ and ${sharesTable.principalType} = 'org'
66
+ and ${sharesTable.principalId} = ${orgId}
67
+ and ${minRoleSql(minRole)})`);
68
+ }
69
+ // If there's no user and no org (fully anonymous), only public resources.
70
+ return or(...clauses) ?? eq(resourceTable.visibility, "public");
71
+ }
72
+ function minRoleSql(minRole) {
73
+ if (minRole === "viewer") {
74
+ // any role satisfies viewer
75
+ return sql `1=1`;
76
+ }
77
+ if (minRole === "editor") {
78
+ return sql `role in ('editor','admin')`;
79
+ }
80
+ return sql `role = 'admin'`;
81
+ }
82
+ /**
83
+ * Return the effective role the current user has on a specific resource, or
84
+ * null if they have no access. Loads the resource and relevant share rows.
85
+ */
86
+ export async function resolveAccess(resourceType, resourceId, ctx = currentAccess()) {
87
+ const reg = requireShareableResource(resourceType);
88
+ const db = reg.getDb();
89
+ const [resource] = await db
90
+ .select()
91
+ .from(reg.resourceTable)
92
+ .where(eq(reg.resourceTable.id, resourceId));
93
+ if (!resource)
94
+ return null;
95
+ const { userEmail, orgId } = ctx;
96
+ if (userEmail && resource.ownerEmail === userEmail) {
97
+ return { role: "owner", resource };
98
+ }
99
+ if (resource.visibility === "public") {
100
+ // No share row needed; default viewer unless upgraded below.
101
+ const role = await highestShareRole(reg, resourceId, ctx);
102
+ return { role: role ?? "viewer", resource };
103
+ }
104
+ if (resource.visibility === "org" && orgId && resource.orgId === orgId) {
105
+ const role = await highestShareRole(reg, resourceId, ctx);
106
+ return { role: role ?? "viewer", resource };
107
+ }
108
+ const role = await highestShareRole(reg, resourceId, ctx);
109
+ if (role)
110
+ return { role, resource };
111
+ return null;
112
+ }
113
+ async function highestShareRole(reg, resourceId, ctx) {
114
+ const { userEmail, orgId } = ctx;
115
+ if (!userEmail && !orgId)
116
+ return null;
117
+ const db = reg.getDb();
118
+ const rows = await db
119
+ .select()
120
+ .from(reg.sharesTable)
121
+ .where(eq(reg.sharesTable.resourceId, resourceId));
122
+ let best = null;
123
+ for (const r of rows) {
124
+ const matches = (r.principalType === "user" &&
125
+ userEmail &&
126
+ r.principalId === userEmail) ||
127
+ (r.principalType === "org" && orgId && r.principalId === orgId);
128
+ if (!matches)
129
+ continue;
130
+ if (!best || ROLE_RANK[r.role] > ROLE_RANK[best])
131
+ best = r.role;
132
+ }
133
+ return best;
134
+ }
135
+ /**
136
+ * Throw ForbiddenError if the current user can't act on this resource with at
137
+ * least the given role. Used at the top of update/delete actions.
138
+ */
139
+ export async function assertAccess(resourceType, resourceId, minRole = "viewer", ctx = currentAccess()) {
140
+ const access = await resolveAccess(resourceType, resourceId, ctx);
141
+ if (!access) {
142
+ throw new ForbiddenError(`No access to ${resourceType} ${resourceId}`);
143
+ }
144
+ if (ROLE_RANK[access.role] < ROLE_RANK[minRole]) {
145
+ throw new ForbiddenError(`Requires ${minRole} role on ${resourceType} ${resourceId} (have ${access.role})`);
146
+ }
147
+ return access;
148
+ }
149
+ //# sourceMappingURL=access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/sharing/access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,GAEzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AAExD,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,UAAU,GAAG,GAAG,CAAC;IACjB,YAAY,OAAO,GAAG,WAAW;QAC/B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAOD,wEAAwE;AACxE,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,SAAS,EAAE,mBAAmB,EAAE;QAChC,KAAK,EAAE,eAAe,EAAE;KACzB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,aAAkB,EAClB,WAAgB,EAChB,MAAqB,aAAa,EAAE,EACpC,UAAqB,QAAQ;IAE7B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACjC,MAAM,OAAO,GAAU,EAAE,CAAC;IAE1B,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CACV,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAE,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CACV,GAAG,CAAA,yBAAyB,WAAW;0BACnB,WAAW,CAAC,UAAU,MAAM,aAAa,CAAC,EAAE;0BAC5C,WAAW,CAAC,aAAa;0BACzB,WAAW,CAAC,WAAW,MAAM,SAAS;0BACtC,UAAU,CAAC,OAAO,CAAC,GAAG,CAC3C,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CACV,GAAG,CAAA,yBAAyB,WAAW;0BACnB,WAAW,CAAC,UAAU,MAAM,aAAa,CAAC,EAAE;0BAC5C,WAAW,CAAC,aAAa;0BACzB,WAAW,CAAC,WAAW,MAAM,KAAK;0BAClC,UAAU,CAAC,OAAO,CAAC,GAAG,CAC3C,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU,CAAC,OAAkB;IACpC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,4BAA4B;QAC5B,OAAO,GAAG,CAAA,KAAK,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,GAAG,CAAA,4BAA4B,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAA,gBAAgB,CAAC;AAC7B,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAoB,EACpB,UAAkB,EAClB,MAAqB,aAAa,EAAE;IAEpC,MAAM,GAAG,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;IAE9B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE;SACxB,MAAM,EAAE;SACR,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;SACvB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAEjC,IAAI,SAAS,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACrC,6DAA6D;QAC7D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,GAAkC,EAClC,UAAkB,EAClB,GAAkB;IAElB,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACjC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,EAAE;SACR,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;SACrB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACrD,IAAI,IAAI,GAAqB,IAAI,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,IAId,EAAE,CAAC;QACH,MAAM,OAAO,GACX,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM;YACzB,SAAS;YACT,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;YAC9B,CAAC,CAAC,CAAC,aAAa,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,UAAkB,EAClB,UAA+B,QAAQ,EACvC,MAAqB,aAAa,EAAE;IAEpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,cAAc,CAAC,gBAAgB,YAAY,IAAI,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,cAAc,CACtB,YAAY,OAAO,YAAY,YAAY,IAAI,UAAU,UAAU,MAAM,CAAC,IAAI,GAAG,CAClF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=list-resource-shares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-resource-shares.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/list-resource-shares.ts"],"names":[],"mappings":";AAMA,wBAiCG"}
@@ -0,0 +1,38 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { z } from "zod";
3
+ import { defineAction } from "../../action.js";
4
+ import { resolveAccess } from "../access.js";
5
+ import { requireShareableResource } from "../registry.js";
6
+ export default defineAction({
7
+ description: "List the current visibility and share grants on a shareable resource. Any read access is sufficient.",
8
+ schema: z.object({
9
+ resourceType: z.string(),
10
+ resourceId: z.string(),
11
+ }),
12
+ http: { method: "GET" },
13
+ run: async (args) => {
14
+ const reg = requireShareableResource(args.resourceType);
15
+ const access = await resolveAccess(args.resourceType, args.resourceId);
16
+ if (!access)
17
+ return { ownerEmail: null, visibility: null, shares: [] };
18
+ const db = reg.getDb();
19
+ const shares = await db
20
+ .select()
21
+ .from(reg.sharesTable)
22
+ .where(eq(reg.sharesTable.resourceId, args.resourceId));
23
+ return {
24
+ ownerEmail: access.resource.ownerEmail ?? null,
25
+ orgId: access.resource.orgId ?? null,
26
+ visibility: access.resource.visibility ?? "private",
27
+ role: access.role,
28
+ shares: shares.map((s) => ({
29
+ id: s.id,
30
+ principalType: s.principalType,
31
+ principalId: s.principalId,
32
+ role: s.role,
33
+ createdAt: s.createdAt,
34
+ })),
35
+ };
36
+ },
37
+ });
38
+ //# sourceMappingURL=list-resource-shares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-resource-shares.js","sourceRoot":"","sources":["../../../src/sharing/actions/list-resource-shares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,sGAAsG;IACxG,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;IACF,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAEvE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,EAAE;aACpB,MAAM,EAAE;aACR,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1D,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI;YAC9C,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI;YACpC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS;YACnD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=set-resource-visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-resource-visibility.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/set-resource-visibility.ts"],"names":[],"mappings":";AAMA,wBAkBG"}
@@ -0,0 +1,24 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { z } from "zod";
3
+ import { defineAction } from "../../action.js";
4
+ import { assertAccess } from "../access.js";
5
+ import { requireShareableResource } from "../registry.js";
6
+ export default defineAction({
7
+ description: "Change the coarse visibility of a shareable resource: 'private' | 'org' | 'public'. Owner or admin role required.",
8
+ schema: z.object({
9
+ resourceType: z.string(),
10
+ resourceId: z.string(),
11
+ visibility: z.enum(["private", "org", "public"]),
12
+ }),
13
+ run: async (args) => {
14
+ const reg = requireShareableResource(args.resourceType);
15
+ await assertAccess(args.resourceType, args.resourceId, "admin");
16
+ const db = reg.getDb();
17
+ await db
18
+ .update(reg.resourceTable)
19
+ .set({ visibility: args.visibility })
20
+ .where(eq(reg.resourceTable.id, args.resourceId));
21
+ return { ok: true, visibility: args.visibility };
22
+ },
23
+ });
24
+ //# sourceMappingURL=set-resource-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-resource-visibility.js","sourceRoot":"","sources":["../../../src/sharing/actions/set-resource-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,mHAAmH;IACrH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;KACjD,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;QAC9B,MAAM,EAAE;aACL,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;aACzB,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aACpC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACnD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=share-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-resource.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/share-resource.ts"],"names":[],"mappings":";AAgBA,wBAyDG"}
@@ -0,0 +1,64 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { z } from "zod";
3
+ import { defineAction } from "../../action.js";
4
+ import { getRequestUserEmail } from "../../server/request-context.js";
5
+ import { assertAccess, ForbiddenError } from "../access.js";
6
+ import { requireShareableResource } from "../registry.js";
7
+ function nanoid(size = 12) {
8
+ const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
9
+ let id = "";
10
+ const bytes = crypto.getRandomValues(new Uint8Array(size));
11
+ for (const byte of bytes)
12
+ id += chars[byte % chars.length];
13
+ return id;
14
+ }
15
+ export default defineAction({
16
+ description: "Grant a user or org access to a shareable resource. Owner or admin role required.",
17
+ schema: z.object({
18
+ resourceType: z
19
+ .string()
20
+ .describe("Registered resource type, e.g. 'document', 'form'."),
21
+ resourceId: z.string().describe("Id of the resource to share."),
22
+ principalType: z
23
+ .enum(["user", "org"])
24
+ .describe("'user' for an individual, 'org' for a whole organization."),
25
+ principalId: z
26
+ .string()
27
+ .describe("Email (user) or org id (org) of the principal."),
28
+ role: z
29
+ .enum(["viewer", "editor", "admin"])
30
+ .default("viewer")
31
+ .describe("Role to grant."),
32
+ }),
33
+ run: async (args) => {
34
+ const reg = requireShareableResource(args.resourceType);
35
+ await assertAccess(args.resourceType, args.resourceId, "admin");
36
+ const actor = getRequestUserEmail();
37
+ if (!actor)
38
+ throw new ForbiddenError("Not signed in");
39
+ const db = reg.getDb();
40
+ const [existing] = await db
41
+ .select()
42
+ .from(reg.sharesTable)
43
+ .where(and(eq(reg.sharesTable.resourceId, args.resourceId), eq(reg.sharesTable.principalType, args.principalType), eq(reg.sharesTable.principalId, args.principalId)));
44
+ if (existing) {
45
+ await db
46
+ .update(reg.sharesTable)
47
+ .set({ role: args.role })
48
+ .where(eq(reg.sharesTable.id, existing.id));
49
+ return { id: existing.id, updated: true };
50
+ }
51
+ const id = nanoid();
52
+ await db.insert(reg.sharesTable).values({
53
+ id,
54
+ resourceId: args.resourceId,
55
+ principalType: args.principalType,
56
+ principalId: args.principalId,
57
+ role: args.role,
58
+ createdBy: actor,
59
+ createdAt: new Date().toISOString(),
60
+ });
61
+ return { id, updated: false };
62
+ },
63
+ });
64
+ //# sourceMappingURL=share-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-resource.js","sourceRoot":"","sources":["../../../src/sharing/actions/share-resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=unshare-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unshare-resource.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/unshare-resource.ts"],"names":[],"mappings":";AAMA,wBAwBG"}
@@ -0,0 +1,24 @@
1
+ import { and, eq } from "drizzle-orm";
2
+ import { z } from "zod";
3
+ import { defineAction } from "../../action.js";
4
+ import { assertAccess } from "../access.js";
5
+ import { requireShareableResource } from "../registry.js";
6
+ export default defineAction({
7
+ description: "Revoke a previously granted share. Owner or admin role required.",
8
+ schema: z.object({
9
+ resourceType: z.string(),
10
+ resourceId: z.string(),
11
+ principalType: z.enum(["user", "org"]),
12
+ principalId: z.string(),
13
+ }),
14
+ run: async (args) => {
15
+ const reg = requireShareableResource(args.resourceType);
16
+ await assertAccess(args.resourceType, args.resourceId, "admin");
17
+ const db = reg.getDb();
18
+ await db
19
+ .delete(reg.sharesTable)
20
+ .where(and(eq(reg.sharesTable.resourceId, args.resourceId), eq(reg.sharesTable.principalType, args.principalType), eq(reg.sharesTable.principalId, args.principalId)));
21
+ return { ok: true };
22
+ },
23
+ });
24
+ //# sourceMappingURL=unshare-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unshare-resource.js","sourceRoot":"","sources":["../../../src/sharing/actions/unshare-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,kEAAkE;IACpE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACxB,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;QAC9B,MAAM,EAAE;aACL,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;aACvB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,EAC/C,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,EACrD,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAClD,CACF,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Framework-level sharing / privacy primitive.
3
+ *
4
+ * Templates make their resource tables ownable and register them here so the
5
+ * shared share actions and UI work end-to-end. See
6
+ * `.agents/skills/sharing/SKILL.md` for the full pattern.
7
+ */
8
+ export { ownableColumns, createSharesTable, roleSatisfies, ROLE_RANK, type Visibility, type ShareRole, type PrincipalType, } from "./schema.js";
9
+ export { registerShareableResource, getShareableResource, requireShareableResource, listShareableResources, type ShareableResourceRegistration, } from "./registry.js";
10
+ export { accessFilter, resolveAccess, assertAccess, currentAccess, ForbiddenError, type AccessContext, type ResolvedAccess, } from "./access.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sharing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,6BAA6B,GACnC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Framework-level sharing / privacy primitive.
3
+ *
4
+ * Templates make their resource tables ownable and register them here so the
5
+ * shared share actions and UI work end-to-end. See
6
+ * `.agents/skills/sharing/SKILL.md` for the full pattern.
7
+ */
8
+ export { ownableColumns, createSharesTable, roleSatisfies, ROLE_RANK, } from "./schema.js";
9
+ export { registerShareableResource, getShareableResource, requireShareableResource, listShareableResources, } from "./registry.js";
10
+ export { accessFilter, resolveAccess, assertAccess, currentAccess, ForbiddenError, } from "./access.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sharing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,SAAS,GAIV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,GAGf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Registry of shareable resources.
3
+ *
4
+ * Each template registers its ownable resource(s) once on module load so the
5
+ * framework-level share actions (`share-resource`, `list-resource-shares`,
6
+ * etc.) can dispatch to the correct tables.
7
+ *
8
+ * import { registerShareableResource } from "@agent-native/core/sharing";
9
+ * import * as schema from "./schema.js";
10
+ *
11
+ * registerShareableResource({
12
+ * type: "document",
13
+ * resourceTable: schema.documents,
14
+ * sharesTable: schema.documentShares,
15
+ * displayName: "Document",
16
+ * titleColumn: "title",
17
+ * });
18
+ */
19
+ export interface ShareableResourceRegistration {
20
+ /** Stable identifier used across actions, UI, and analytics. e.g. "document". */
21
+ type: string;
22
+ /** Drizzle table for the parent resource (must have ownableColumns()). */
23
+ resourceTable: any;
24
+ /** Drizzle table produced by createSharesTable(). */
25
+ sharesTable: any;
26
+ /** Human-readable singular label shown in the share dialog. */
27
+ displayName: string;
28
+ /**
29
+ * Column on the resource table that holds a human-readable title for
30
+ * display in the share UI. Default: "title".
31
+ */
32
+ titleColumn?: string;
33
+ /**
34
+ * Drizzle DB accessor from the template's server/db/index.ts. Required —
35
+ * the framework-level share actions and access helpers call this to reach
36
+ * the right DB instance (schema is template-specific).
37
+ */
38
+ getDb: () => any;
39
+ }
40
+ export declare function registerShareableResource(entry: ShareableResourceRegistration): void;
41
+ export declare function getShareableResource(type: string): ShareableResourceRegistration | undefined;
42
+ export declare function requireShareableResource(type: string): ShareableResourceRegistration;
43
+ export declare function listShareableResources(): ShareableResourceRegistration[];
44
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/sharing/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,6BAA6B;IAC5C,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,aAAa,EAAE,GAAG,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,GAAG,CAAC;IACjB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,CAAC;CAClB;AAuBD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,6BAA6B,GACnC,IAAI,CAEN;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GACX,6BAA6B,GAAG,SAAS,CAE3C;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GACX,6BAA6B,CAS/B;AAED,wBAAgB,sBAAsB,IAAI,6BAA6B,EAAE,CAExE"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Registry of shareable resources.
3
+ *
4
+ * Each template registers its ownable resource(s) once on module load so the
5
+ * framework-level share actions (`share-resource`, `list-resource-shares`,
6
+ * etc.) can dispatch to the correct tables.
7
+ *
8
+ * import { registerShareableResource } from "@agent-native/core/sharing";
9
+ * import * as schema from "./schema.js";
10
+ *
11
+ * registerShareableResource({
12
+ * type: "document",
13
+ * resourceTable: schema.documents,
14
+ * sharesTable: schema.documentShares,
15
+ * displayName: "Document",
16
+ * titleColumn: "title",
17
+ * });
18
+ */
19
+ // Stash the registry on globalThis so it survives SSR bundle duplication.
20
+ // Vite SSR's `noExternal: /^(?!node:)/` policy means @agent-native/core gets
21
+ // inlined into every server bundle that imports it — and each bundle gets its
22
+ // own module-level state. A plain `new Map()` here would create one Map per
23
+ // bundle, so the template's `registerShareableResource()` (called from the
24
+ // Nitro plugin graph) wouldn't be visible to the framework's auto-mounted
25
+ // share-resource action (loaded via `import("../sharing/actions/...js")` in a
26
+ // different module instance). Using globalThis collapses them back to one Map.
27
+ const REGISTRY_KEY = "__agentNativeShareableResources__";
28
+ const globalRegistry = globalThis;
29
+ function getRegistry() {
30
+ let r = globalRegistry[REGISTRY_KEY];
31
+ if (!r) {
32
+ r = new Map();
33
+ globalRegistry[REGISTRY_KEY] = r;
34
+ }
35
+ return r;
36
+ }
37
+ export function registerShareableResource(entry) {
38
+ getRegistry().set(entry.type, entry);
39
+ }
40
+ export function getShareableResource(type) {
41
+ return getRegistry().get(type);
42
+ }
43
+ export function requireShareableResource(type) {
44
+ const reg = getRegistry();
45
+ const entry = reg.get(type);
46
+ if (!entry) {
47
+ throw new Error(`Unknown shareable resource type: "${type}". Did you forget registerShareableResource()?`);
48
+ }
49
+ return entry;
50
+ }
51
+ export function listShareableResources() {
52
+ return Array.from(getRegistry().values());
53
+ }
54
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sharing/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAwBH,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,MAAM,YAAY,GAAG,mCAAmC,CAAC;AAEzD,MAAM,cAAc,GAClB,UAAiB,CAAC;AACpB,SAAS,WAAW;IAClB,IAAI,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,GAAG,EAAyC,CAAC;QACrD,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAoC;IAEpC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY;IAEZ,OAAO,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAY;IAEZ,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,gDAAgD,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC"}