@lambdacurry/arbor 0.13.9 → 0.14.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 +68 -7
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -1810,6 +1810,9 @@ var appBundles = sqliteTable("app_bundles", {
1810
1810
  modules: text("modules", { mode: "json" }).$type().notNull(),
1811
1811
  staticAssets: text("static_assets", { mode: "json" }).$type().notNull(),
1812
1812
  buildProvenance: text("build_provenance", { mode: "json" }).$type(),
1813
+ sourceProvenance: text("source_provenance", {
1814
+ mode: "json"
1815
+ }).$type(),
1813
1816
  runtimeEntrypoint: text("runtime_entrypoint").$type().notNull(),
1814
1817
  capabilityRequirements: text("capability_requirements", { mode: "json" }).$type().notNull().default([]),
1815
1818
  stateSchemaVersion: integer("state_schema_version").notNull().default(0),
@@ -1835,6 +1838,7 @@ var apps = sqliteTable("apps", {
1835
1838
  orgId: text("org_id").notNull().references(() => orgs.id),
1836
1839
  spaceId: text("space_id").notNull().references(() => spaces.id),
1837
1840
  title: text("title").notNull(),
1841
+ description: text("description").notNull().default(""),
1838
1842
  slug: text("slug").notNull(),
1839
1843
  lifecycle: text("lifecycle").$type().notNull().default("active"),
1840
1844
  access: text("access").$type().notNull(),
@@ -16534,6 +16538,29 @@ var checkpoint = exports_external.looseObject({
16534
16538
  backup: exports_external.string(),
16535
16539
  published: jsonObject
16536
16540
  });
16541
+ var computerProfile = exports_external.looseObject({
16542
+ id: exports_external.string(),
16543
+ version: exports_external.number(),
16544
+ shell: exports_external.string(),
16545
+ runtimes: exports_external.looseObject({ bun: exports_external.string() }),
16546
+ tools: exports_external.array(exports_external.string()),
16547
+ recommendedEditingPrimitive: exports_external.string()
16548
+ });
16549
+ var appBundleSourceProvenance = exports_external.looseObject({
16550
+ entryPath: exports_external.string(),
16551
+ artifactVersionSha256: exports_external.string(),
16552
+ entryPathSha256: exports_external.string(),
16553
+ git: exports_external.looseObject({
16554
+ repositoryRoot: exports_external.string(),
16555
+ head: exports_external.string().nullable(),
16556
+ branch: exports_external.string().nullable(),
16557
+ dirty: exports_external.boolean(),
16558
+ trackedChanges: exports_external.number().int().min(0),
16559
+ untrackedFiles: exports_external.number().int().min(0),
16560
+ entryPathTracked: exports_external.boolean()
16561
+ }).nullable(),
16562
+ warnings: exports_external.array(exports_external.string())
16563
+ });
16537
16564
  var profile2 = exports_external.looseObject({
16538
16565
  id,
16539
16566
  kind: exports_external.string(),
@@ -16720,6 +16747,10 @@ var paged = (key, item) => exports_external.looseObject({
16720
16747
  nextCursor: exports_external.string().optional()
16721
16748
  });
16722
16749
  var MCP_OUTPUT_SCHEMAS = {
16750
+ server_info: exports_external.looseObject({
16751
+ serverVersion: exports_external.string(),
16752
+ deployment: exports_external.looseObject({ id: exports_external.string(), sourceRevision: exports_external.string().nullable(), deployedAt: timestamp }).nullable()
16753
+ }),
16723
16754
  recall: exports_external.object({ result: exports_external.array(recallHit) }),
16724
16755
  contribute: exports_external.looseObject({
16725
16756
  contributionId: id,
@@ -17011,6 +17042,7 @@ var MCP_OUTPUT_SCHEMAS = {
17011
17042
  computerId: id,
17012
17043
  computerSessionId: id,
17013
17044
  backend: exports_external.enum(["worker-shell", "container"]),
17045
+ profile: computerProfile.nullable(),
17014
17046
  startingSnapshot: snapshot.nullable(),
17015
17047
  materialized: checkpoint.nullable(),
17016
17048
  runtime: jsonObject
@@ -17020,13 +17052,15 @@ var MCP_OUTPUT_SCHEMAS = {
17020
17052
  stderr: exports_external.string().optional(),
17021
17053
  exitCode: exports_external.number().optional(),
17022
17054
  jobId: exports_external.string().optional(),
17023
- status: exports_external.string().optional()
17055
+ status: exports_external.string().optional(),
17056
+ strict: exports_external.boolean()
17024
17057
  }),
17025
17058
  computer_status: exports_external.looseObject({
17026
17059
  ok: exports_external.boolean().optional(),
17027
17060
  status: exports_external.string().optional(),
17028
17061
  backend: exports_external.string().optional(),
17029
- processes: exports_external.array(jsonObject).optional()
17062
+ processes: exports_external.array(jsonObject).optional(),
17063
+ profile: computerProfile.nullable()
17030
17064
  }),
17031
17065
  computer_verify: exports_external.looseObject({
17032
17066
  passed: exports_external.literal(true),
@@ -17125,6 +17159,8 @@ var MCP_OUTPUT_SCHEMAS = {
17125
17159
  assetCount: exports_external.number().optional(),
17126
17160
  byteCount: exports_external.number().optional(),
17127
17161
  buildProvenance: jsonObject,
17162
+ sourceProvenance: appBundleSourceProvenance.nullable(),
17163
+ warnings: exports_external.array(exports_external.string()),
17128
17164
  replayed: exports_external.boolean()
17129
17165
  }),
17130
17166
  computer_stop: exports_external.looseObject({ checkpoint, stopped: jsonObject })
@@ -17183,6 +17219,7 @@ var idempotentOpenWorld = {
17183
17219
  openWorldHint: true
17184
17220
  };
17185
17221
  var MCP_TOOL_ANNOTATIONS = {
17222
+ server_info: readOnly,
17186
17223
  recall: readOnly,
17187
17224
  contribute: additive,
17188
17225
  edit: additive,
@@ -17319,6 +17356,15 @@ var PAGINATION_INPUT = {
17319
17356
  cursor: exports_external.string().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)")
17320
17357
  };
17321
17358
  var ACTION_DEFINITIONS = [
17359
+ {
17360
+ name: "server_info",
17361
+ title: "Inspect Arbor server version",
17362
+ description: "READ ONLY: Return the Arbor release version and current Cloudflare deployment identity so a client can distinguish a fresh server from a cached tool catalog. This cannot modify Arbor, Computer, App, access, or durable state.",
17363
+ inputSchema: {},
17364
+ surfaces: ["mcp", "cli", "computer-mcp", "computer-cli"],
17365
+ toolset: "structure",
17366
+ run: forward("server.info")
17367
+ },
17322
17368
  {
17323
17369
  name: "github_repositories",
17324
17370
  title: "List installed GitHub repositories",
@@ -17588,7 +17634,7 @@ var ACTION_DEFINITIONS = [
17588
17634
  {
17589
17635
  name: "computer_open",
17590
17636
  title: "Open a Thread computer",
17591
- description: "Open or resume this Thread's project environment for filesystem or command work. Returns computerSessionId; pass it unchanged to later Computer tools and to Contributions or responses produced from the work.",
17637
+ description: "Open or resume this Thread's project environment for filesystem or command work. Returns computerSessionId and, when a declared container profile is selected, its guaranteed shell/runtimes/tools/editing primitive; pass the session id unchanged to later Computer tools and to Contributions or responses produced from the work.",
17592
17638
  inputSchema: {
17593
17639
  threadId: exports_external.string().describe("the Arbor Thread whose stable computer to open, thr_…"),
17594
17640
  vcpus: exports_external.number().int().min(1).max(4).optional().describe("optional container vCPU request"),
@@ -17601,13 +17647,14 @@ var ACTION_DEFINITIONS = [
17601
17647
  {
17602
17648
  name: "computer_exec",
17603
17649
  title: "Run a command",
17604
- description: "Run a bounded command in an opened Thread computer, normally from /workspace. Use background only for the container backend; worker-shell deliberately serializes mutations and rejects long-lived processes.",
17650
+ description: "Run one bounded logical operation in an opened Thread computer, normally from /workspace. Strict Bash semantics are ON by default: an early command failure or failed pipeline makes the execution nonzero, while explicit handling such as `cmd || fallback` still works. Set strict=false only for an intentional best-effort script. Use background only for the container backend; worker-shell deliberately serializes mutations and rejects long-lived processes.",
17605
17651
  inputSchema: {
17606
17652
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
17607
17653
  command: exports_external.string().min(1).describe("the shell command to run"),
17608
17654
  cwd: exports_external.string().optional().describe("working directory under /workspace"),
17609
17655
  timeout: exports_external.number().int().min(1000).max(1800000).optional().describe("timeout in milliseconds, from 1,000 through 1,800,000"),
17610
- background: exports_external.boolean().optional().describe("start a container process and return its pid")
17656
+ background: exports_external.boolean().optional().describe("start a container process and return its pid"),
17657
+ strict: exports_external.boolean().optional().describe("fail on the first unhandled command or pipeline failure; defaults to true, set false only for intentional best-effort execution")
17611
17658
  },
17612
17659
  surfaces: ["computer-mcp", "computer-cli"],
17613
17660
  toolset: "loop",
@@ -17616,7 +17663,7 @@ var ACTION_DEFINITIONS = [
17616
17663
  {
17617
17664
  name: "computer_status",
17618
17665
  title: "Inspect a computer",
17619
- description: "Read live Currybox process and runtime status for an opened computer. This is ephemeral provider state; use get_computer on the Arbor surface for durable config and snapshot lineage.",
17666
+ description: "READ ONLY: Read live Currybox process/runtime status and the declared container profile contract for an opened computer. This cannot modify files, processes, checkpoints, or Thread state; use get_computer on the Arbor surface for durable config and snapshot lineage.",
17620
17667
  inputSchema: {
17621
17668
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
17622
17669
  },
@@ -17775,7 +17822,7 @@ var ACTION_DEFINITIONS = [
17775
17822
  {
17776
17823
  name: "computer_publish_app_bundle",
17777
17824
  title: "Publish an immutable AppBundle",
17778
- description: "After a Bun container build is green, freeze one Worker entry module plus optional static assets from this Thread computer into a content-addressed AppBundle sourced from an ArtifactVersion. Use the returned bundleId with app_deploy; uploads complete and verify before Arbor publishes the bundle manifest, and retries require the same idempotencyKey.",
17825
+ description: "After a Bun container build is green, verify that entryPath bytes exactly match the referenced ArtifactVersion, capture source hashes plus Git/workspace provenance, then freeze the Worker module and optional static assets into a content-addressed AppBundle. A mismatch is rejected; dirty or untracked source is allowed but returned as an explicit warning. Use the returned bundleId with app_deploy; retries require the same idempotencyKey.",
17779
17826
  inputSchema: {
17780
17827
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
17781
17828
  artifactVersionId: exports_external.string().describe("the source ArtifactVersion, artv_…"),
@@ -18834,6 +18881,7 @@ var ACTION_DEFINITIONS = [
18834
18881
  inputSchema: {
18835
18882
  spaceId: exports_external.string().describe("owning Space, spc_…"),
18836
18883
  title: exports_external.string().min(1).max(160).describe("short factual App title"),
18884
+ description: exports_external.string().min(1).max(200).describe("one line of what this App is for, read by whoever is deciding whether to open it — not a changelog and not the source Artifact's summary"),
18837
18885
  slug: exports_external.string().min(1).max(59).describe("stable DNS label used by app-<slug>.arborthreads.dev"),
18838
18886
  access: exports_external.enum(["space", "public"]).describe("space requires membership; public is anonymous at the gateway"),
18839
18887
  discovery: exports_external.enum(["unlisted", "listed"]).nullable().optional().describe("public Apps only; default unlisted"),
@@ -18935,6 +18983,19 @@ var ACTION_DEFINITIONS = [
18935
18983
  toolset: "apps",
18936
18984
  run: forward("app.rollback")
18937
18985
  },
18986
+ {
18987
+ name: "app_update",
18988
+ title: "Edit an App's title or description",
18989
+ description: "Change the human-facing metadata a reader sees before opening an App. The description is the one line that answers 'what is this for'; keep it factual and current, because the directory and the App page both lead with it. Slug is deliberately not editable — the URL is the App's stable identity. Access, lifecycle, release, and state each have their own operation.",
18990
+ inputSchema: {
18991
+ appId: exports_external.string().describe("target App, app_…"),
18992
+ title: exports_external.string().min(1).max(160).optional().describe("short factual App title"),
18993
+ description: exports_external.string().min(1).max(200).optional().describe("one line of what this App is for")
18994
+ },
18995
+ surfaces: ["cli"],
18996
+ toolset: "apps",
18997
+ run: forward("app.update")
18998
+ },
18938
18999
  {
18939
19000
  name: "app_set_access",
18940
19001
  title: "Change App access",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.13.9",
3
+ "version": "0.14.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",