@lambdacurry/arbor 0.16.4 → 0.17.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.
- package/dist/arbor.js +33 -21
- package/package.json +1 -1
package/dist/arbor.js
CHANGED
|
@@ -1880,6 +1880,8 @@ var secrets = sqliteTable("secrets", {
|
|
|
1880
1880
|
orgId: text("org_id").notNull().references(() => orgs.id),
|
|
1881
1881
|
name: text("name").notNull(),
|
|
1882
1882
|
description: text("description").notNull().default(""),
|
|
1883
|
+
ownerType: text("owner_type").$type().notNull().default("organization"),
|
|
1884
|
+
ownerId: text("owner_id"),
|
|
1883
1885
|
lifecycle: text("lifecycle").$type().notNull().default("active"),
|
|
1884
1886
|
currentVersionId: text("current_version_id"),
|
|
1885
1887
|
currentVersion: integer("current_version").notNull().default(0),
|
|
@@ -1889,7 +1891,9 @@ var secrets = sqliteTable("secrets", {
|
|
|
1889
1891
|
createdAt: ts("created_at").notNull(),
|
|
1890
1892
|
revokedAt: ts("revoked_at")
|
|
1891
1893
|
}, (t) => ({
|
|
1892
|
-
orgNameUq: uniqueIndex("
|
|
1894
|
+
orgNameUq: uniqueIndex("secrets_org_owner_name_uq").on(t.orgId, t.name).where(sql`${t.ownerType} = 'organization'`),
|
|
1895
|
+
profileNameUq: uniqueIndex("secrets_profile_name_uq").on(t.orgId, t.ownerId, t.name).where(sql`${t.ownerType} = 'profile'`),
|
|
1896
|
+
ownerIdx: index("secrets_owner_idx").on(t.orgId, t.ownerType, t.ownerId),
|
|
1893
1897
|
orgLifecycleIdx: index("secrets_org_lifecycle_idx").on(t.orgId, t.lifecycle, t.createdAt)
|
|
1894
1898
|
}));
|
|
1895
1899
|
var secretVersions = sqliteTable("secret_versions", {
|
|
@@ -2183,6 +2187,24 @@ var EMOJI_RE = new RegExp("^\\p{RGI_Emoji}$", "v");
|
|
|
2183
2187
|
var BASE_MS = Date.parse("2026-07-20T15:00:00.000Z");
|
|
2184
2188
|
// ../core/src/ops/agent-pairing.ts
|
|
2185
2189
|
var PAIRING_TTL_MS = 15 * 60 * 1000;
|
|
2190
|
+
// ../core/src/ops/secret.ts
|
|
2191
|
+
var SECRET_PERMISSIONS = [
|
|
2192
|
+
"create",
|
|
2193
|
+
"metadata:read",
|
|
2194
|
+
"value:write",
|
|
2195
|
+
"rotate",
|
|
2196
|
+
"bind",
|
|
2197
|
+
"unbind",
|
|
2198
|
+
"revoke",
|
|
2199
|
+
"delete",
|
|
2200
|
+
"plaintext:read"
|
|
2201
|
+
];
|
|
2202
|
+
var SECRET_ADMIN_PERMISSIONS = SECRET_PERMISSIONS.filter((permission) => permission !== "create" && permission !== "plaintext:read");
|
|
2203
|
+
var ORG_ADMIN_CONTAINMENT_PERMISSIONS = new Set([
|
|
2204
|
+
"metadata:read",
|
|
2205
|
+
"unbind",
|
|
2206
|
+
"revoke"
|
|
2207
|
+
]);
|
|
2186
2208
|
// ../core/src/ops/preview.ts
|
|
2187
2209
|
var PREVIEW_ENTRY_MIME = "text/html; charset=utf-8";
|
|
2188
2210
|
var PREVIEW_MAX_BYTES = 2 * 1024 * 1024;
|
|
@@ -2203,20 +2225,6 @@ var PREVIEW_MIME_TYPES = new Set([
|
|
|
2203
2225
|
"font/woff",
|
|
2204
2226
|
"font/woff2"
|
|
2205
2227
|
]);
|
|
2206
|
-
// ../core/src/ops/secret.ts
|
|
2207
|
-
var SECRET_PERMISSIONS = [
|
|
2208
|
-
"create",
|
|
2209
|
-
"metadata:read",
|
|
2210
|
-
"value:write",
|
|
2211
|
-
"rotate",
|
|
2212
|
-
"bind",
|
|
2213
|
-
"unbind",
|
|
2214
|
-
"revoke",
|
|
2215
|
-
"delete",
|
|
2216
|
-
"plaintext:read"
|
|
2217
|
-
];
|
|
2218
|
-
var SECRET_ADMIN_PERMISSIONS = SECRET_PERMISSIONS.filter((permission) => permission !== "create" && permission !== "plaintext:read");
|
|
2219
|
-
|
|
2220
2228
|
// ../core/src/ops/app.ts
|
|
2221
2229
|
var APP_MAX_MODULE_BYTES = 10 * 1024 * 1024;
|
|
2222
2230
|
var APP_MAX_ASSET_BYTES = 25 * 1024 * 1024;
|
|
@@ -19317,7 +19325,7 @@ var ACTION_DEFINITIONS = [
|
|
|
19317
19325
|
{
|
|
19318
19326
|
name: "secrets",
|
|
19319
19327
|
title: "Manage encrypted Secrets",
|
|
19320
|
-
description: "Create, authorize, version, rotate, bind, and revoke first-class Arbor Secrets without revealing plaintext. set and rotate never echo submitted values; bind exposes the current version only to the named App runtime binding, while identity administration and runtime consumption remain separate. Plaintext reveal is not shipped in v1.",
|
|
19328
|
+
description: "Create, authorize, version, rotate, bind, and revoke first-class Arbor Secrets without revealing plaintext. set and rotate never echo submitted values; bind exposes the current version only to the named App runtime binding, while identity administration and runtime consumption remain separate. A Secret is owned by the Organization or by one Profile; ownership carries administration authority and never implies runtime access, which always needs an explicit grant or binding. Deactivating an owning Profile revokes what it owns, so bound App workloads fail closed. Plaintext reveal is not shipped in v1.",
|
|
19321
19329
|
inputSchema: {
|
|
19322
19330
|
verb: exports_external.enum([
|
|
19323
19331
|
"list",
|
|
@@ -19334,6 +19342,8 @@ var ACTION_DEFINITIONS = [
|
|
|
19334
19342
|
secretId: exports_external.string().optional().describe("Secret id; omit only when granting/revoking org-scoped create permission"),
|
|
19335
19343
|
name: exports_external.string().optional().describe("create: lowercase Secret name"),
|
|
19336
19344
|
description: exports_external.string().max(500).optional().describe("create: non-sensitive purpose"),
|
|
19345
|
+
owner: exports_external.enum(["organization", "profile"]).optional().describe("create: who owns the Secret (default organization). profile keeps administration with one identity; names are unique per owner"),
|
|
19346
|
+
ownerProfileId: exports_external.string().optional().describe("create + owner=profile: the owning identity, defaulting to you; assigning another Profile is an Org owner/admin action"),
|
|
19337
19347
|
value: exports_external.string().min(1).optional().describe("set/rotate: plaintext submitted once and never returned or recorded"),
|
|
19338
19348
|
profileId: exports_external.string().optional().describe("grant/revoke_grant: authorized human or agent"),
|
|
19339
19349
|
permissions: exports_external.array(exports_external.enum([
|
|
@@ -19387,10 +19397,12 @@ var ACTION_DEFINITIONS = [
|
|
|
19387
19397
|
{
|
|
19388
19398
|
name: "secret_create",
|
|
19389
19399
|
title: "Create a Secret",
|
|
19390
|
-
description: "Create first-class Secret metadata without material; an Org owner/admin or identity with org-scoped create permission may do this. Follow with secret_set to write its first encrypted version.",
|
|
19400
|
+
description: "Create first-class Secret metadata without material; an Org owner/admin or identity with org-scoped create permission may do this. Owner defaults to the Organization; owner=profile keeps administration with one identity, and an Org owner/admin then holds only metadata read, unbind, and revoke over it. Ownership never grants runtime access. Follow with secret_set to write its first encrypted version.",
|
|
19391
19401
|
inputSchema: {
|
|
19392
|
-
name: exports_external.string().min(1).max(63).describe("lowercase stable name"),
|
|
19393
|
-
description: exports_external.string().max(500).optional().describe("non-sensitive purpose")
|
|
19402
|
+
name: exports_external.string().min(1).max(63).describe("lowercase stable name, unique per owner"),
|
|
19403
|
+
description: exports_external.string().max(500).optional().describe("non-sensitive purpose"),
|
|
19404
|
+
owner: exports_external.enum(["organization", "profile"]).optional().describe("who owns it (default organization); deactivating a profile owner revokes what it owns"),
|
|
19405
|
+
ownerProfileId: exports_external.string().optional().describe("owner=profile: the owning identity, defaulting to you; assigning another Profile is an Org owner/admin action")
|
|
19394
19406
|
},
|
|
19395
19407
|
surfaces: ["cli"],
|
|
19396
19408
|
toolset: "apps",
|
|
@@ -19423,7 +19435,7 @@ var ACTION_DEFINITIONS = [
|
|
|
19423
19435
|
{
|
|
19424
19436
|
name: "secret_grant",
|
|
19425
19437
|
title: "Grant Secret access",
|
|
19426
|
-
description: "Replace one human or agent's explicit Secret permissions; omit secretId only to grant org-scoped create. Plaintext-read is reserved for a future dedicated reveal path and this command rejects it; runtime App consumption is controlled by bindings, not this identity grant.",
|
|
19438
|
+
description: "Replace one human or agent's explicit Secret permissions; omit secretId only to grant org-scoped create. An Organization-owned Secret is administered by an Org owner/admin or its creator; a profile-owned Secret is administered only by its owner, so no one else can grant themselves access to it. Plaintext-read is reserved for a future dedicated reveal path and this command rejects it; runtime App consumption is controlled by bindings, not this identity grant.",
|
|
19427
19439
|
inputSchema: {
|
|
19428
19440
|
secretId: exports_external.string().optional().describe("Secret scope; omit only for org-scoped create permission"),
|
|
19429
19441
|
profileId: exports_external.string().describe("authorized human or agent profile"),
|
|
@@ -19458,7 +19470,7 @@ var ACTION_DEFINITIONS = [
|
|
|
19458
19470
|
{
|
|
19459
19471
|
name: "secret_bind",
|
|
19460
19472
|
title: "Bind a Secret to an App",
|
|
19461
|
-
description: "Authorize one App workload to consume the active Secret version through a provider-native Dynamic Worker env binding. The actor needs Secret bind authority
|
|
19473
|
+
description: "Authorize one App workload to consume the active Secret version through a provider-native Dynamic Worker env binding. The actor needs Secret bind authority — ownership of a profile-owned Secret, or an explicit bind grant — plus access to the App's Space. Binding permission never grants plaintext read to the acting identity, and no material enters bundles, deployments, receipts, or Events; it does put the value in reach of that App's code, so bind your own Secret only into an App whose deployers you trust.",
|
|
19462
19474
|
inputSchema: {
|
|
19463
19475
|
secretId: exports_external.string().describe("active Secret with a value, sec_…"),
|
|
19464
19476
|
appId: exports_external.string().describe("target App, app_…"),
|
package/package.json
CHANGED