@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,275 @@
1
+ /**
2
+ * H3 event handlers for the framework secrets registry.
3
+ *
4
+ * Mounted under `/_agent-native/secrets/*` by `core-routes-plugin`.
5
+ *
6
+ * NEVER return a secret's plain-text value from any of these handlers.
7
+ */
8
+ import { defineEventHandler, getMethod, setResponseStatus, } from "h3";
9
+ import { readBody } from "../server/h3-helpers.js";
10
+ import { getSession } from "../server/auth.js";
11
+ import { getOrgContext } from "../org/context.js";
12
+ import { hasOAuthTokens } from "../oauth-tokens/store.js";
13
+ import { listRequiredSecrets, getRequiredSecret, } from "./register.js";
14
+ import { writeAppSecret, deleteAppSecret, getAppSecretMeta, readAppSecret, } from "./storage.js";
15
+ /** Resolve the scopeId for a given scope, given the current session. */
16
+ async function resolveScopeId(event, scope, override) {
17
+ if (override && typeof override === "string" && override.trim()) {
18
+ return { scopeId: override.trim() };
19
+ }
20
+ if (scope === "user") {
21
+ const session = await getSession(event).catch(() => null);
22
+ if (!session?.email) {
23
+ return { scopeId: null, reason: "Authentication required" };
24
+ }
25
+ return { scopeId: session.email };
26
+ }
27
+ // workspace
28
+ const ctx = await getOrgContext(event).catch(() => null);
29
+ if (ctx?.orgId)
30
+ return { scopeId: ctx.orgId };
31
+ // Fall back to session email in solo/dev mode so secrets still work without
32
+ // an active organisation.
33
+ const session = await getSession(event).catch(() => null);
34
+ if (session?.email)
35
+ return { scopeId: `solo:${session.email}` };
36
+ return { scopeId: null, reason: "No workspace or session context" };
37
+ }
38
+ /** GET /_agent-native/secrets — list registered secrets with status. */
39
+ export function createListSecretsHandler() {
40
+ return defineEventHandler(async (event) => {
41
+ if (getMethod(event) !== "GET") {
42
+ setResponseStatus(event, 405);
43
+ return { error: "Method not allowed" };
44
+ }
45
+ const secrets = listRequiredSecrets();
46
+ const payload = [];
47
+ for (const secret of secrets) {
48
+ const base = {
49
+ key: secret.key,
50
+ label: secret.label,
51
+ description: secret.description,
52
+ docsUrl: secret.docsUrl,
53
+ scope: secret.scope,
54
+ kind: secret.kind,
55
+ required: !!secret.required,
56
+ status: "unset",
57
+ };
58
+ if (secret.kind === "oauth") {
59
+ base.oauthProvider = secret.oauthProvider;
60
+ base.oauthConnectUrl = secret.oauthConnectUrl;
61
+ if (secret.oauthProvider) {
62
+ try {
63
+ const has = await hasOAuthTokens(secret.oauthProvider);
64
+ base.status = has ? "set" : "unset";
65
+ }
66
+ catch {
67
+ base.status = "unset";
68
+ }
69
+ }
70
+ payload.push(base);
71
+ continue;
72
+ }
73
+ // api-key: look up the stored row in app_secrets.
74
+ const { scopeId } = await resolveScopeId(event, secret.scope);
75
+ if (!scopeId) {
76
+ payload.push(base);
77
+ continue;
78
+ }
79
+ const meta = await getAppSecretMeta({
80
+ key: secret.key,
81
+ scope: secret.scope,
82
+ scopeId,
83
+ }).catch(() => null);
84
+ if (meta) {
85
+ base.status = "set";
86
+ base.last4 = meta.last4;
87
+ base.updatedAt = meta.updatedAt;
88
+ }
89
+ payload.push(base);
90
+ }
91
+ return payload;
92
+ });
93
+ }
94
+ /** POST /_agent-native/secrets/:key — write a secret. */
95
+ export function createWriteSecretHandler() {
96
+ return defineEventHandler(async (event) => {
97
+ const method = getMethod(event);
98
+ const key = extractKeyFromEvent(event);
99
+ if (!key) {
100
+ setResponseStatus(event, 400);
101
+ return { error: "Secret key required" };
102
+ }
103
+ const secret = getRequiredSecret(key);
104
+ if (!secret) {
105
+ setResponseStatus(event, 404);
106
+ return { error: `Secret "${key}" is not registered` };
107
+ }
108
+ if (method === "POST" || method === "PUT") {
109
+ return handleWrite(event, secret);
110
+ }
111
+ if (method === "DELETE") {
112
+ return handleDelete(event, secret);
113
+ }
114
+ setResponseStatus(event, 405);
115
+ return { error: "Method not allowed" };
116
+ });
117
+ }
118
+ async function handleWrite(event, secret) {
119
+ if (secret.kind === "oauth") {
120
+ setResponseStatus(event, 400);
121
+ return {
122
+ error: `"${secret.key}" is an OAuth-kind secret — connect via ${secret.oauthConnectUrl ?? "the OAuth flow"} instead`,
123
+ };
124
+ }
125
+ const body = (await readBody(event).catch(() => ({})));
126
+ const value = typeof body.value === "string" ? body.value.trim() : "";
127
+ if (!value) {
128
+ setResponseStatus(event, 400);
129
+ return { error: "value is required" };
130
+ }
131
+ const scope = typeof body.scope === "string" &&
132
+ (body.scope === "user" || body.scope === "workspace")
133
+ ? body.scope
134
+ : secret.scope;
135
+ const { scopeId, reason } = await resolveScopeId(event, scope, typeof body.scopeId === "string" ? body.scopeId : undefined);
136
+ if (!scopeId) {
137
+ setResponseStatus(event, 401);
138
+ return { error: reason ?? "Unable to resolve scope" };
139
+ }
140
+ // Run validator if registered — return the validator's error on failure.
141
+ if (secret.validator) {
142
+ try {
143
+ const result = await secret.validator(value);
144
+ const ok = typeof result === "boolean" ? result : result?.ok === true;
145
+ if (!ok) {
146
+ setResponseStatus(event, 400);
147
+ const err = typeof result === "object" && result && result.error
148
+ ? String(result.error)
149
+ : "Validator rejected the value";
150
+ return { error: err };
151
+ }
152
+ }
153
+ catch (err) {
154
+ setResponseStatus(event, 400);
155
+ return {
156
+ error: err instanceof Error
157
+ ? `Validator threw: ${err.message}`
158
+ : "Validator threw",
159
+ };
160
+ }
161
+ }
162
+ try {
163
+ await writeAppSecret({ key: secret.key, value, scope, scopeId });
164
+ }
165
+ catch (err) {
166
+ // Scrub: never surface the value in any error path.
167
+ setResponseStatus(event, 500);
168
+ return {
169
+ error: err instanceof Error
170
+ ? `Failed to save secret: ${err.message}`
171
+ : "Failed to save secret",
172
+ };
173
+ }
174
+ return { ok: true, status: "set" };
175
+ }
176
+ async function handleDelete(event, secret) {
177
+ if (secret.kind === "oauth") {
178
+ setResponseStatus(event, 400);
179
+ return {
180
+ error: `"${secret.key}" is an OAuth-kind secret — disconnect via the OAuth flow instead`,
181
+ };
182
+ }
183
+ const { scopeId, reason } = await resolveScopeId(event, secret.scope);
184
+ if (!scopeId) {
185
+ setResponseStatus(event, 401);
186
+ return { error: reason ?? "Unable to resolve scope" };
187
+ }
188
+ const removed = await deleteAppSecret({
189
+ key: secret.key,
190
+ scope: secret.scope,
191
+ scopeId,
192
+ });
193
+ return { ok: true, removed };
194
+ }
195
+ /**
196
+ * POST /_agent-native/secrets/:key/test — re-run the validator against the
197
+ * current stored value without changing anything. Useful for the "Test" button.
198
+ */
199
+ export function createTestSecretHandler() {
200
+ return defineEventHandler(async (event) => {
201
+ if (getMethod(event) !== "POST") {
202
+ setResponseStatus(event, 405);
203
+ return { error: "Method not allowed" };
204
+ }
205
+ const key = extractKeyFromEvent(event, { suffix: "/test" });
206
+ if (!key) {
207
+ setResponseStatus(event, 400);
208
+ return { error: "Secret key required" };
209
+ }
210
+ const secret = getRequiredSecret(key);
211
+ if (!secret) {
212
+ setResponseStatus(event, 404);
213
+ return { error: `Secret "${key}" is not registered` };
214
+ }
215
+ if (secret.kind === "oauth") {
216
+ // For OAuth we just report whether tokens exist.
217
+ const has = secret.oauthProvider
218
+ ? await hasOAuthTokens(secret.oauthProvider).catch(() => false)
219
+ : false;
220
+ return { ok: has };
221
+ }
222
+ if (!secret.validator) {
223
+ return { ok: true, note: "No validator registered" };
224
+ }
225
+ const { scopeId } = await resolveScopeId(event, secret.scope);
226
+ if (!scopeId) {
227
+ setResponseStatus(event, 401);
228
+ return { error: "Unable to resolve scope" };
229
+ }
230
+ const stored = await readAppSecret({
231
+ key: secret.key,
232
+ scope: secret.scope,
233
+ scopeId,
234
+ });
235
+ if (!stored) {
236
+ setResponseStatus(event, 404);
237
+ return { error: "No value stored" };
238
+ }
239
+ try {
240
+ const result = await secret.validator(stored.value);
241
+ const ok = typeof result === "boolean" ? result : result?.ok === true;
242
+ if (!ok) {
243
+ const err = typeof result === "object" && result && result.error
244
+ ? String(result.error)
245
+ : "Validator rejected the value";
246
+ return { ok: false, error: err };
247
+ }
248
+ return { ok: true };
249
+ }
250
+ catch (err) {
251
+ return {
252
+ ok: false,
253
+ error: err instanceof Error
254
+ ? `Validator threw: ${err.message}`
255
+ : "Validator threw",
256
+ };
257
+ }
258
+ });
259
+ }
260
+ /** Extract the key from `/:key` or `/:key/test` after the `/secrets` prefix strip. */
261
+ function extractKeyFromEvent(event, opts = {}) {
262
+ const pathname = (event.url?.pathname || "")
263
+ .replace(/^\/+/, "")
264
+ .replace(/\/+$/, "");
265
+ if (!pathname)
266
+ return null;
267
+ const parts = pathname.split("/");
268
+ if (opts.suffix === "/test") {
269
+ if (parts.length < 2 || parts[parts.length - 1] !== "test")
270
+ return null;
271
+ return parts[0];
272
+ }
273
+ return parts[0];
274
+ }
275
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/secrets/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Drizzle schema for the framework secrets registry.
3
+ *
4
+ * The `app_secrets` table stores API keys and service credentials that
5
+ * templates register via `registerRequiredSecret()`. Values are always
6
+ * stored encrypted at rest — see `storage.ts` for the crypto layer.
7
+ *
8
+ * Rows are scoped either to a user (by email) or a workspace / organization
9
+ * (by orgId). OAuth-kind secrets never create a row here — they surface via
10
+ * `@agent-native/core/oauth-tokens` instead.
11
+ */
12
+ export declare const appSecrets: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
13
+ name: "app_secrets";
14
+ schema: undefined;
15
+ columns: {
16
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
17
+ name: "id";
18
+ tableName: "app_secrets";
19
+ dataType: "string";
20
+ columnType: "SQLiteText";
21
+ data: string;
22
+ driverParam: string;
23
+ notNull: true;
24
+ hasDefault: false;
25
+ isPrimaryKey: true;
26
+ isAutoincrement: false;
27
+ hasRuntimeDefault: false;
28
+ enumValues: [string, ...string[]];
29
+ baseColumn: never;
30
+ identity: undefined;
31
+ generated: undefined;
32
+ }, {}, {
33
+ length: number;
34
+ }>;
35
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
36
+ name: "scope";
37
+ tableName: "app_secrets";
38
+ dataType: "string";
39
+ columnType: "SQLiteText";
40
+ data: string;
41
+ driverParam: string;
42
+ notNull: true;
43
+ hasDefault: false;
44
+ isPrimaryKey: false;
45
+ isAutoincrement: false;
46
+ hasRuntimeDefault: false;
47
+ enumValues: [string, ...string[]];
48
+ baseColumn: never;
49
+ identity: undefined;
50
+ generated: undefined;
51
+ }, {}, {
52
+ length: number;
53
+ }>;
54
+ scopeId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
55
+ name: "scope_id";
56
+ tableName: "app_secrets";
57
+ dataType: "string";
58
+ columnType: "SQLiteText";
59
+ data: string;
60
+ driverParam: string;
61
+ notNull: true;
62
+ hasDefault: false;
63
+ isPrimaryKey: false;
64
+ isAutoincrement: false;
65
+ hasRuntimeDefault: false;
66
+ enumValues: [string, ...string[]];
67
+ baseColumn: never;
68
+ identity: undefined;
69
+ generated: undefined;
70
+ }, {}, {
71
+ length: number;
72
+ }>;
73
+ key: import("drizzle-orm/sqlite-core").SQLiteColumn<{
74
+ name: "key";
75
+ tableName: "app_secrets";
76
+ dataType: "string";
77
+ columnType: "SQLiteText";
78
+ data: string;
79
+ driverParam: string;
80
+ notNull: true;
81
+ hasDefault: false;
82
+ isPrimaryKey: false;
83
+ isAutoincrement: false;
84
+ hasRuntimeDefault: false;
85
+ enumValues: [string, ...string[]];
86
+ baseColumn: never;
87
+ identity: undefined;
88
+ generated: undefined;
89
+ }, {}, {
90
+ length: number;
91
+ }>;
92
+ encryptedValue: import("drizzle-orm/sqlite-core").SQLiteColumn<{
93
+ name: "encrypted_value";
94
+ tableName: "app_secrets";
95
+ dataType: "string";
96
+ columnType: "SQLiteText";
97
+ data: string;
98
+ driverParam: string;
99
+ notNull: true;
100
+ hasDefault: false;
101
+ isPrimaryKey: false;
102
+ isAutoincrement: false;
103
+ hasRuntimeDefault: false;
104
+ enumValues: [string, ...string[]];
105
+ baseColumn: never;
106
+ identity: undefined;
107
+ generated: undefined;
108
+ }, {}, {
109
+ length: number;
110
+ }>;
111
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
112
+ name: "created_at";
113
+ tableName: "app_secrets";
114
+ dataType: "number";
115
+ columnType: "SQLiteInteger";
116
+ data: number;
117
+ driverParam: number;
118
+ notNull: true;
119
+ hasDefault: false;
120
+ isPrimaryKey: false;
121
+ isAutoincrement: false;
122
+ hasRuntimeDefault: false;
123
+ enumValues: undefined;
124
+ baseColumn: never;
125
+ identity: undefined;
126
+ generated: undefined;
127
+ }, {}, {}>;
128
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
129
+ name: "updated_at";
130
+ tableName: "app_secrets";
131
+ dataType: "number";
132
+ columnType: "SQLiteInteger";
133
+ data: number;
134
+ driverParam: number;
135
+ notNull: true;
136
+ hasDefault: false;
137
+ isPrimaryKey: false;
138
+ isAutoincrement: false;
139
+ hasRuntimeDefault: false;
140
+ enumValues: undefined;
141
+ baseColumn: never;
142
+ identity: undefined;
143
+ generated: undefined;
144
+ }, {}, {}>;
145
+ };
146
+ dialect: "sqlite";
147
+ }>;
148
+ /**
149
+ * Raw SQL for creating the app_secrets table. Used by the on-demand
150
+ * `ensureTable()` path in `storage.ts` and by any template-level migration
151
+ * that wants to create the table up-front.
152
+ */
153
+ export declare const APP_SECRETS_CREATE_SQL = "CREATE TABLE IF NOT EXISTS app_secrets (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_id TEXT NOT NULL,\n key TEXT NOT NULL,\n encrypted_value TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n UNIQUE(scope, scope_id, key)\n)";
154
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/secrets/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYrB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mRASjC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Drizzle schema for the framework secrets registry.
3
+ *
4
+ * The `app_secrets` table stores API keys and service credentials that
5
+ * templates register via `registerRequiredSecret()`. Values are always
6
+ * stored encrypted at rest — see `storage.ts` for the crypto layer.
7
+ *
8
+ * Rows are scoped either to a user (by email) or a workspace / organization
9
+ * (by orgId). OAuth-kind secrets never create a row here — they surface via
10
+ * `@agent-native/core/oauth-tokens` instead.
11
+ */
12
+ import { table, text, integer } from "../db/schema.js";
13
+ export const appSecrets = table("app_secrets", {
14
+ id: text("id").primaryKey(),
15
+ /** "user" or "workspace" — who the secret is scoped to. */
16
+ scope: text("scope").notNull(),
17
+ /** Session email for user-scope, orgId for workspace-scope. */
18
+ scopeId: text("scope_id").notNull(),
19
+ /** The registered secret key (e.g. "OPENAI_API_KEY"). */
20
+ key: text("key").notNull(),
21
+ /** Encrypted value — never return this through any API. */
22
+ encryptedValue: text("encrypted_value").notNull(),
23
+ createdAt: integer("created_at").notNull(),
24
+ updatedAt: integer("updated_at").notNull(),
25
+ });
26
+ /**
27
+ * Raw SQL for creating the app_secrets table. Used by the on-demand
28
+ * `ensureTable()` path in `storage.ts` and by any template-level migration
29
+ * that wants to create the table up-front.
30
+ */
31
+ export const APP_SECRETS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS app_secrets (
32
+ id TEXT PRIMARY KEY,
33
+ scope TEXT NOT NULL,
34
+ scope_id TEXT NOT NULL,
35
+ key TEXT NOT NULL,
36
+ encrypted_value TEXT NOT NULL,
37
+ created_at INTEGER NOT NULL,
38
+ updated_at INTEGER NOT NULL,
39
+ UNIQUE(scope, scope_id, key)
40
+ )`;
41
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/secrets/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,EAAE;IAC7C,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,2DAA2D;IAC3D,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAC9B,+DAA+D;IAC/D,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACnC,yDAAyD;IACzD,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,2DAA2D;IAC3D,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;IACjD,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC1C,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC3C,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;EASpC,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Storage layer for the framework secrets registry.
3
+ *
4
+ * Values are encrypted at rest with AES-256-GCM. The encryption key is
5
+ * derived from `SECRETS_ENCRYPTION_KEY` (preferred) or the existing
6
+ * `BETTER_AUTH_SECRET` env var (fallback so templates don't need a second
7
+ * secret during development). If neither is set in production we fall back
8
+ * to a machine-local key derived from the cwd — the secret is still only
9
+ * readable on this machine, but consider setting `SECRETS_ENCRYPTION_KEY`
10
+ * for a stable, rotatable key.
11
+ *
12
+ * Secret values are NEVER logged and NEVER returned from any route handler.
13
+ */
14
+ import type { SecretScope } from "./register.js";
15
+ /**
16
+ * Return the last 4 characters of a secret, with any leading characters
17
+ * masked. Used to show a preview without leaking the value.
18
+ */
19
+ export declare function last4(value: string): string;
20
+ export interface SecretRef {
21
+ key: string;
22
+ scope: SecretScope;
23
+ scopeId: string;
24
+ }
25
+ export interface WriteSecretArgs extends SecretRef {
26
+ value: string;
27
+ }
28
+ /**
29
+ * Write (insert or update) a secret. The value is encrypted before being
30
+ * stored — the caller's plaintext is never persisted. Returns the new
31
+ * record's id.
32
+ */
33
+ export declare function writeAppSecret(args: WriteSecretArgs): Promise<string>;
34
+ export interface ReadSecretResult {
35
+ value: string;
36
+ last4: string;
37
+ updatedAt: number;
38
+ }
39
+ /**
40
+ * Read a secret's plaintext value. Returns null when not found. The caller
41
+ * is responsible for never logging the returned value.
42
+ */
43
+ export declare function readAppSecret(ref: SecretRef): Promise<ReadSecretResult | null>;
44
+ /**
45
+ * Return just the metadata for a secret (no value). Used by the list route so
46
+ * the UI can show the "Set" pill and last-4 without the decrypted value going
47
+ * over the wire.
48
+ */
49
+ export declare function getAppSecretMeta(ref: SecretRef): Promise<{
50
+ last4: string;
51
+ updatedAt: number;
52
+ } | null>;
53
+ export declare function deleteAppSecret(ref: SecretRef): Promise<boolean>;
54
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/secrets/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA0FjD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3C;AAMD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC3E;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAqBlC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,SAAS,GACb,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAItD;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAStE"}