@lambdacurry/arbor 0.13.1 → 0.13.3

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 +31 -13
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -1809,6 +1809,7 @@ var appBundles = sqliteTable("app_bundles", {
1809
1809
  mainModule: text("main_module").notNull(),
1810
1810
  modules: text("modules", { mode: "json" }).$type().notNull(),
1811
1811
  staticAssets: text("static_assets", { mode: "json" }).$type().notNull(),
1812
+ buildProvenance: text("build_provenance", { mode: "json" }).$type(),
1812
1813
  runtimeEntrypoint: text("runtime_entrypoint").$type().notNull(),
1813
1814
  capabilityRequirements: text("capability_requirements", { mode: "json" }).$type().notNull().default([]),
1814
1815
  stateSchemaVersion: integer("state_schema_version").notNull().default(0),
@@ -1839,14 +1840,17 @@ var apps = sqliteTable("apps", {
1839
1840
  access: text("access").$type().notNull(),
1840
1841
  discovery: text("discovery").$type(),
1841
1842
  activeDeploymentId: text("active_deployment_id"),
1843
+ pendingActivationDeploymentId: text("pending_activation_deployment_id"),
1842
1844
  runtimeProvider: text("runtime_provider").$type().notNull(),
1843
1845
  runtimeHealth: text("runtime_health").$type().notNull().default("unknown"),
1844
1846
  runtimeHealthUpdatedAt: ts("runtime_health_updated_at"),
1845
1847
  stateMode: text("state_mode").$type().notNull(),
1846
1848
  stateIdentity: text("state_identity").notNull(),
1847
1849
  stateGeneration: integer("state_generation").notNull().default(0),
1850
+ pendingStateResetId: text("pending_state_reset_id"),
1848
1851
  currentStateSchemaVersion: integer("current_state_schema_version").notNull().default(0),
1849
1852
  deploymentRevision: integer("deployment_revision").notNull().default(0),
1853
+ metadataRevision: integer("metadata_revision").notNull().default(0),
1850
1854
  createdByProfileId: text("created_by_profile_id").notNull().references(() => profiles.id),
1851
1855
  createdExecutionContextId: text("created_execution_context_id").notNull().references(() => executionContexts.id),
1852
1856
  createdAt: ts("created_at").notNull(),
@@ -1889,9 +1893,15 @@ var appStateResets = sqliteTable("app_state_resets", {
1889
1893
  resetByProfileId: text("reset_by_profile_id").notNull().references(() => profiles.id),
1890
1894
  resetExecutionContextId: text("reset_execution_context_id").notNull().references(() => executionContexts.id),
1891
1895
  providerReceipt: text("provider_receipt", { mode: "json" }).$type().notNull(),
1892
- createdAt: ts("created_at").notNull()
1896
+ status: text("status").$type().notNull().default("completed"),
1897
+ activeDeploymentId: text("active_deployment_id"),
1898
+ deploymentRevision: integer("deployment_revision"),
1899
+ targetStateSchemaVersion: integer("target_state_schema_version"),
1900
+ createdAt: ts("created_at").notNull(),
1901
+ completedAt: ts("completed_at")
1893
1902
  }, (t) => ({
1894
1903
  idempotencyUq: uniqueIndex("app_state_resets_idempotency_uq").on(t.appId, t.resetByProfileId, t.idempotencyKey),
1904
+ generationUq: uniqueIndex("app_state_resets_generation_uq").on(t.appId, t.fromGeneration),
1895
1905
  appIdx: index("app_state_resets_app_idx").on(t.appId, t.createdAt)
1896
1906
  }));
1897
1907
  var appViewerGrantUses = sqliteTable("app_viewer_grant_uses", {
@@ -1948,7 +1958,7 @@ var events = sqliteTable("events", {
1948
1958
  payload: text("payload", { mode: "json" }).$type().notNull().default({}),
1949
1959
  createdAt: ts("created_at").notNull()
1950
1960
  }, (t) => ({
1951
- objectIdx: index("events_object_idx").on(t.objectType, t.objectId),
1961
+ objectIdx: index("events_object_idx").on(t.objectType, t.objectId, t.createdAt),
1952
1962
  createdIdx: index("events_created_idx").on(t.createdAt)
1953
1963
  }));
1954
1964
  var notifications = sqliteTable("notifications", {
@@ -17823,7 +17833,7 @@ var ACTIONS = [
17823
17833
  {
17824
17834
  name: "apps",
17825
17835
  title: "List visible Apps",
17826
- description: "List Apps available to you: every App in your Spaces plus listed public Apps across the organization. Lifecycle and runtime health are separate fields; unlisted public Apps appear only to their owning Space.",
17836
+ description: "List Apps available to you: every App in your Spaces plus active listed public Apps across the organization. Lifecycle and last activation health are separate fields; unlisted public and archived Apps appear only to actors authorized for their owning Space.",
17827
17837
  inputSchema: {
17828
17838
  includeArchived: exports_external.boolean().optional().describe("include archived Apps you are authorized to inspect")
17829
17839
  },
@@ -17834,7 +17844,7 @@ var ACTIONS = [
17834
17844
  {
17835
17845
  name: "apps",
17836
17846
  title: "Publish and manage Apps",
17837
- description: "Manage stable Arbor Apps through one guarded lifecycle (AD-248). verb=list shows Apps visible across your Spaces; get reads the current active release, state generation, and history; create mints the Space-owned identity; deploy health-checks an immutable AppBundle without moving the URL; deployment inspects one candidate; activate and rollback health-check then compare-and-swap the active release; set_access changes Space/public and public discovery immediately; reset_state is the only durable SQLite deletion; archive stops serving but retains history. Read with get immediately before activate, rollback, access, or reset so expectedActiveDeploymentId/expectedGeneration are current; start public Apps as public+unlisted+none and private stateful Apps as space+durable.",
17847
+ description: "Manage stable Arbor Apps through one guarded lifecycle (AD-248/249). verb=list shows Apps across the actor's Spaces plus active listed public Apps across the organization; get reads the active release, pending control intent, state generation, and history; create mints the Space-owned identity; deploy health-checks an immutable AppBundle without moving the URL; deployment inspects one candidate; activate and rollback reserve an attributed intent before provider health and compare-and-swap completion; set_access changes Space/public and public discovery immediately; reset_state is the only durable SQLite deletion and resumes partial failure with the same idempotency key; archive stops serving but retains history. Read with get immediately before activate, rollback, access, or reset. Public Apps must be public+(unlisted|listed)+none; durable Apps are space+durable.",
17838
17848
  inputSchema: {
17839
17849
  verb: exports_external.enum([
17840
17850
  "list",
@@ -17855,7 +17865,7 @@ var ACTIONS = [
17855
17865
  slug: exports_external.string().min(1).max(59).optional().describe("create: stable label in app-<slug>.arborthreads.dev"),
17856
17866
  access: exports_external.enum(["space", "public"]).optional().describe("create/set_access: gateway access"),
17857
17867
  discovery: exports_external.enum(["unlisted", "listed"]).nullable().optional().describe("create/set_access: public discovery; Space Apps use null"),
17858
- stateMode: exports_external.enum(["none", "durable"]).optional().describe("create: none or isolated durable SQLite"),
17868
+ stateMode: exports_external.enum(["none", "durable"]).optional().describe("create: none or Space-only isolated durable SQLite"),
17859
17869
  bundleId: exports_external.string().optional().describe("deploy: verified immutable AppBundle, bnd_…"),
17860
17870
  deploymentId: exports_external.string().optional().describe("deployment/activate/rollback: deployment, dep_…"),
17861
17871
  expectedActiveDeploymentId: exports_external.string().nullable().optional().describe("activate/rollback: active deployment just read; null only for first activation"),
@@ -17880,7 +17890,7 @@ var ACTIONS = [
17880
17890
  {
17881
17891
  name: "app_get",
17882
17892
  title: "Read an App",
17883
- description: "Inspect one App's stable URL, active release, source AppBundle, deployment timeline, runtime health, state identity/generation, and reset history. Read this before deployment, rollback, access, or state changes so your compare-and-swap inputs are current.",
17893
+ description: "Inspect one App's stable URL, active release, pending control intent, source AppBundle, attributed deployment timeline, last activation health, state identity/generation, and reset history. Read this before deployment, rollback, access, or state changes so compare-and-swap inputs are current.",
17884
17894
  inputSchema: { appId: exports_external.string().describe("the App, app_…") },
17885
17895
  surfaces: ["cli"],
17886
17896
  toolset: "apps",
@@ -17889,14 +17899,14 @@ var ACTIONS = [
17889
17899
  {
17890
17900
  name: "app_create",
17891
17901
  title: "Create an App",
17892
- description: "Create a stable first-class App identity in a Space before deploying code. Start small public Apps as public+unlisted+none; use space+durable only when the App needs membership authorization and isolated SQLite state.",
17902
+ description: "Create a stable first-class App identity in a Space before deploying code. Public Apps are stateless and start public+unlisted+none; durable Apps are always space+durable with membership authorization and isolated SQLite state.",
17893
17903
  inputSchema: {
17894
17904
  spaceId: exports_external.string().describe("owning Space, spc_…"),
17895
17905
  title: exports_external.string().min(1).max(160).describe("short factual App title"),
17896
17906
  slug: exports_external.string().min(1).max(59).describe("stable DNS label used by app-<slug>.arborthreads.dev"),
17897
17907
  access: exports_external.enum(["space", "public"]).describe("space requires membership; public is anonymous at the gateway"),
17898
17908
  discovery: exports_external.enum(["unlisted", "listed"]).nullable().optional().describe("public Apps only; default unlisted"),
17899
- stateMode: exports_external.enum(["none", "durable"]).describe("durable allocates isolated facet SQLite; deployment never resets it")
17909
+ stateMode: exports_external.enum(["none", "durable"]).describe("durable allocates Space-only isolated facet SQLite; deployment never resets it")
17900
17910
  },
17901
17911
  surfaces: ["cli"],
17902
17912
  toolset: "apps",
@@ -17930,7 +17940,7 @@ var ACTIONS = [
17930
17940
  {
17931
17941
  name: "app_activate",
17932
17942
  title: "Activate a verified deployment",
17933
- description: "Atomically advance an App's stable URL to a verified candidate after a fresh health check. Pass the active deployment id you just read (or null for the first release); a concurrent change is rejected instead of overwriting it.",
17943
+ description: "Reserve an attributed activation intent, health-check the verified candidate, then atomically advance the stable URL. Pass the active deployment id just read (or null for the first release). A retry resumes the same pending release; a conflicting control change is rejected.",
17934
17944
  inputSchema: {
17935
17945
  appId: exports_external.string().describe("target App, app_…"),
17936
17946
  deploymentId: exports_external.string().describe("verified candidate, dep_…"),
@@ -17956,7 +17966,7 @@ var ACTIONS = [
17956
17966
  {
17957
17967
  name: "app_set_access",
17958
17968
  title: "Change App access",
17959
- description: "Change the gateway policy immediately and record who changed it: space requires a current Space member, while public permits anonymous requests and may be unlisted or listed. This does not redeploy code or pass an Arbor identity into App code.",
17969
+ description: "Change the gateway policy immediately and record who changed it: space requires a current Space member, while public permits anonymous requests and may be unlisted or listed. Durable Apps cannot become public. This does not redeploy code or pass an Arbor identity into App code.",
17960
17970
  inputSchema: {
17961
17971
  appId: exports_external.string().describe("target App, app_…"),
17962
17972
  access: exports_external.enum(["space", "public"]).describe("new gateway access"),
@@ -17969,7 +17979,7 @@ var ACTIONS = [
17969
17979
  {
17970
17980
  name: "app_reset_state",
17971
17981
  title: "Reset durable App state",
17972
- description: "Permanently delete one durable App facet's isolated SQLite database as an explicit operation; deploying or rolling back never does this. Read app_get first, pass its expectedGeneration, and use a stable idempotencyKey so retries do not delete a later generation.",
17982
+ description: "Permanently delete one durable App facet's isolated SQLite database as an explicit attributed transition; deploying or rolling back never does this. Read app_get first, pass its expectedGeneration, and keep the same idempotencyKey across retries. A provider interruption leaves a visible pending intent that the same call resumes; do not change release or archive while pending.",
17973
17983
  inputSchema: {
17974
17984
  appId: exports_external.string().describe("durable App, app_…"),
17975
17985
  expectedGeneration: exports_external.number().int().min(0).describe("state generation from app_get"),
@@ -18332,18 +18342,21 @@ function zodType(node) {
18332
18342
  function unwrapForCli(node) {
18333
18343
  let inner = node;
18334
18344
  let optional2 = false;
18345
+ let nullable2 = false;
18335
18346
  for (;; ) {
18336
18347
  const type = zodType(inner);
18337
18348
  if (type !== "optional" && type !== "nullable")
18338
18349
  break;
18339
18350
  if (type === "optional")
18340
18351
  optional2 = true;
18352
+ if (type === "nullable")
18353
+ nullable2 = true;
18341
18354
  const unwrapped = inner.unwrap?.();
18342
18355
  if (!unwrapped)
18343
18356
  break;
18344
18357
  inner = unwrapped;
18345
18358
  }
18346
- return { inner, optional: optional2 };
18359
+ return { inner, optional: optional2, nullable: nullable2 };
18347
18360
  }
18348
18361
  function description(node) {
18349
18362
  return node.description;
@@ -18384,12 +18397,13 @@ function primaryPositionalField(inputSchema) {
18384
18397
  }
18385
18398
  function flagsForSchema(inputSchema) {
18386
18399
  return Object.entries(inputSchema).map(([field, raw]) => {
18387
- const { inner, optional: optional2 } = unwrapForCli(raw);
18400
+ const { inner, optional: optional2, nullable: nullable2 } = unwrapForCli(raw);
18388
18401
  return {
18389
18402
  field,
18390
18403
  flag: kebab(field),
18391
18404
  kind: kindOf(inner),
18392
18405
  required: !optional2,
18406
+ nullable: nullable2,
18393
18407
  description: description(inner) ?? description(raw),
18394
18408
  literal: isProseList(inner)
18395
18409
  };
@@ -18428,6 +18442,10 @@ function buildInput(inputSchema, flags, command) {
18428
18442
  field: spec.field
18429
18443
  });
18430
18444
  }
18445
+ if (spec.nullable && lastValue(raw) === "null") {
18446
+ input[spec.field] = null;
18447
+ continue;
18448
+ }
18431
18449
  switch (spec.kind) {
18432
18450
  case "number": {
18433
18451
  const n = Number(lastValue(raw));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.13.1",
3
+ "version": "0.13.3",
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",