@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.
Files changed (2) hide show
  1. package/dist/arbor.js +33 -21
  2. 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("secrets_org_name_uq").on(t.orgId, t.name),
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 and 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.",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.16.4",
3
+ "version": "0.17.0",
4
4
  "description": "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
5
5
  "keywords": [
6
6
  "agents",