@lambdacurry/arbor 0.16.4 → 0.17.1

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 +37 -25
  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;
@@ -17959,7 +17967,7 @@ var ACTION_DEFINITIONS = [
17959
17967
  description: "Replace your organization's sparse computer-default layer without allocating runtime state. Omitted/null values fall back to provider defaults; Space, Topic, and Thread layers may override individual fields.",
17960
17968
  inputSchema: {
17961
17969
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("default execution tier, or null to use worker-shell"),
17962
- containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, Node 26.5.1, and pnpm 10.33.0, or null to clear"),
17970
+ containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, bunx, Node 26.5.1, pnpm 10.33.0, and ripgrep (rg), or null to clear"),
17963
17971
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize, or null to clear"),
17964
17972
  repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits")
17965
17973
  },
@@ -17974,7 +17982,7 @@ var ACTION_DEFINITIONS = [
17974
17982
  inputSchema: {
17975
17983
  spaceId: exports_external.string().describe("the Space, spc_…"),
17976
17984
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
17977
- containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, Node 26.5.1, and pnpm 10.33.0, or null to clear inherited profile"),
17985
+ containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, bunx, Node 26.5.1, pnpm 10.33.0, and ripgrep (rg), or null to clear inherited profile"),
17978
17986
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize, or null to clear"),
17979
17987
  repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits")
17980
17988
  },
@@ -17989,7 +17997,7 @@ var ACTION_DEFINITIONS = [
17989
17997
  inputSchema: {
17990
17998
  topicId: exports_external.string().describe("the Topic, top_…"),
17991
17999
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
17992
- containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, Node 26.5.1, and pnpm 10.33.0, or null to clear inherited profile"),
18000
+ containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, bunx, Node 26.5.1, pnpm 10.33.0, and ripgrep (rg), or null to clear inherited profile"),
17993
18001
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
17994
18002
  repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits")
17995
18003
  },
@@ -18004,7 +18012,7 @@ var ACTION_DEFINITIONS = [
18004
18012
  inputSchema: {
18005
18013
  threadId: exports_external.string().describe("the Thread, thr_…"),
18006
18014
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
18007
- containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, Node 26.5.1, and pnpm 10.33.0, or null to clear inherited profile"),
18015
+ containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, Bun 1.3.3, bunx, Node 26.5.1, pnpm 10.33.0, and ripgrep (rg), or null to clear inherited profile"),
18008
18016
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
18009
18017
  repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits")
18010
18018
  },
@@ -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.1",
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",