@lambdacurry/arbor 0.24.25 → 0.24.27

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 +70 -7
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -8666,6 +8666,29 @@ var githubUserAuthorizations = sqliteTable("github_user_authorizations", {
8666
8666
  githubUserIdx: index("github_user_authorizations_github_user_idx").on(t.githubUserId, t.status),
8667
8667
  orgIdx: index("github_user_authorizations_org_idx").on(t.orgId, t.status)
8668
8668
  }));
8669
+ var githubAgentConnections = sqliteTable("github_agent_connections", {
8670
+ id: text("id").primaryKey(),
8671
+ profileId: text("profile_id").notNull().references(() => profiles.id),
8672
+ orgId: text("org_id").notNull().references(() => orgs.id),
8673
+ status: text("status").$type().notNull().default("active"),
8674
+ access: text("access").$type().notNull().default("read"),
8675
+ app: text("app").$type().notNull().default("arbor"),
8676
+ repositories: text("repositories", { mode: "json" }).$type().notNull().default([]),
8677
+ githubAppId: text("github_app_id"),
8678
+ githubInstallationId: text("github_installation_id"),
8679
+ privateKeySecretId: text("private_key_secret_id").references(() => secrets.id),
8680
+ githubAppSlug: text("github_app_slug"),
8681
+ githubAccountLogin: text("github_account_login"),
8682
+ createdByProfileId: text("created_by_profile_id").notNull().references(() => profiles.id),
8683
+ updatedByProfileId: text("updated_by_profile_id").notNull().references(() => profiles.id),
8684
+ createdExecutionContextId: text("created_execution_context_id").notNull().references(() => executionContexts.id),
8685
+ updatedExecutionContextId: text("updated_execution_context_id").notNull().references(() => executionContexts.id),
8686
+ createdAt: ts("created_at").notNull(),
8687
+ updatedAt: ts("updated_at").notNull()
8688
+ }, (t) => ({
8689
+ profileIdx: uniqueIndex("github_agent_connections_profile_idx").on(t.profileId),
8690
+ orgIdx: index("github_agent_connections_org_idx").on(t.orgId, t.status)
8691
+ }));
8669
8692
  var githubRepositories = sqliteTable("github_repositories", {
8670
8693
  id: text("id").primaryKey(),
8671
8694
  installationId: text("installation_id").notNull().references(() => githubInstallations.id),
@@ -9460,6 +9483,7 @@ var secrets = sqliteTable("secrets", {
9460
9483
  ownerType: text("owner_type").$type().notNull().default("organization"),
9461
9484
  ownerId: text("owner_id"),
9462
9485
  lifecycle: text("lifecycle").$type().notNull().default("active"),
9486
+ reservedFor: text("reserved_for").$type(),
9463
9487
  currentVersionId: text("current_version_id"),
9464
9488
  currentVersion: integer2("current_version").notNull().default(0),
9465
9489
  metadataRevision: integer2("metadata_revision").notNull().default(0),
@@ -10322,8 +10346,6 @@ var recallFts = sqliteTable("recall_fts", {
10322
10346
  // ../core/src/ops/quick-search.ts
10323
10347
  var QUICK_EXPAND_LIMIT = 20;
10324
10348
  var QUICK_CANDIDATE_LIMIT = QUICK_EXPAND_LIMIT + 2;
10325
- // ../core/src/ops/computer-checkpoint-operations.ts
10326
- var CHECKPOINT_OPERATION_TTL_SECONDS = 7 * 24 * 60 * 60;
10327
10349
  // ../core/src/ops/package-cache.ts
10328
10350
  var PACKAGE_CACHE_PENDING_TTL_MS = 15 * 60 * 1000;
10329
10351
  var PACKAGE_CACHE_FINAL_TTL_MS = 30 * 24 * 60 * 60 * 1000;
@@ -11454,6 +11476,16 @@ function buildOutputSchemas() {
11454
11476
  connected: boolean2(),
11455
11477
  inheritedBySiblingThreads: boolean2()
11456
11478
  }),
11479
+ github_agent_connection: looseObject({
11480
+ agentProfileId: id,
11481
+ connected: boolean2(),
11482
+ access: _enum(["read", "review", "write"]).nullable(),
11483
+ app: looseObject({ kind: _enum(["arbor", "custom"]) }).nullable().describe("the signing App; custom adds its id, installation, slug, account, and key Secret id"),
11484
+ githubActor: string2().nullable().describe("the GitHub bot account pushes and pull requests show, e.g. currybot[bot]"),
11485
+ repositories: array(looseObject({ githubRepositoryId: string2(), fullName: string2() })).describe("the admin allowlist; empty when not connected"),
11486
+ connectedAt: timestamp.nullable(),
11487
+ updatedAt: timestamp.nullable()
11488
+ }),
11457
11489
  transition_thread: looseObject({ status: string2() }),
11458
11490
  request: looseObject({
11459
11491
  requestId: id,
@@ -13058,6 +13090,7 @@ var MCP_TOOL_ANNOTATIONS = {
13058
13090
  github_repositories: readOnly,
13059
13091
  github_refresh_installation: openWorld,
13060
13092
  github_connect_repository: idempotent,
13093
+ github_agent_connection: readOnly,
13061
13094
  computer_reprovision: destructiveIdempotent,
13062
13095
  computer_run_start: idempotent,
13063
13096
  computer_run_suspend: idempotent,
@@ -13438,7 +13471,7 @@ var COMPUTER_ORIENTATION_SECTIONS = [
13438
13471
  },
13439
13472
  {
13440
13473
  brief: "5. Git and gh run through `computer_exec` once authorized; fetch before trusting remote state.",
13441
- full: `5. GIT AND GITHUB ARE ORDINARY COMMANDS AFTER AUTHORIZATION. Clone, fetch, pull, push, and gh run through computer_exec using a connected human's just-in-time ambient GitHub identity. Credentials never enter argv, workspace files, Git config, checkpoints, Events, logs, or receipts. A restored Computer deliberately keeps the checkout age of its snapshot, so fetch/pull before trusting remote state.`
13474
+ full: `5. GIT AND GITHUB ARE ORDINARY COMMANDS AFTER AUTHORIZATION. Clone, fetch, pull, push, and gh run through computer_exec using just-in-time ambient GitHub credentials: a connected human's own GitHub identity, or for an agent an admin connected (github_agent_connection), a one-hour App token for repositories on the admin's allowlist that the Computer declares and the Thread connects — connecting another repository yourself adds nothing to it. Credentials never enter argv, workspace files, Git config, checkpoints, Events, logs, or receipts. A restored Computer deliberately keeps the checkout age of its snapshot, so fetch/pull before trusting remote state.`
13442
13475
  },
13443
13476
  {
13444
13477
  brief: "6. `computer_verify` captures a URL, `computer_publish_preview` keeps static output, `computer_export` saves files to the Thread.",
@@ -13678,6 +13711,35 @@ var ACTION_DEFINITIONS = [
13678
13711
  toolset: "admin",
13679
13712
  run: forward("github.user_disconnect")
13680
13713
  },
13714
+ {
13715
+ name: "github_agent_connection",
13716
+ title: "Show an agent's GitHub connection",
13717
+ description: "Show whether an agent profile is connected to GitHub for its own Git work — access, signing App (Arbor's or an existing custom App), and githubActor, the bot account its pushes and pull requests show. An agent reads its own; its manager and org admins may read any, and no key or token is ever returned.",
13718
+ inputSchema: {
13719
+ agentProfileId: string2().optional().describe("the agent, prof_…; an agent may omit it to read its own")
13720
+ },
13721
+ surfaces: ["computer-mcp", "cli"],
13722
+ toolset: "projects",
13723
+ run: forward("github.agent_connection_status")
13724
+ },
13725
+ {
13726
+ name: "github_set_agent_connection",
13727
+ title: "Connect an agent to GitHub",
13728
+ description: "Org owner/admin only, from a web or CLI session (never a personal access token): connect, re-scope, or disconnect one agent profile's GitHub work. app=arbor signs with Arbor's GitHub App. app=custom keeps an App the agent already uses (for example a bot App): pass githubAppId, githubInstallationId, and privateKeySecretId — an organization-owned Arbor Secret that a human created and set with that App's private key (secret_set --value-file), never granted to an agent and never bound to an App. Arbor confirms the installation with GitHub, then reserves that Secret permanently for signing. Each Computer call then mints a one-hour token for repositories on this allowlist that the Computer declares and the Thread connects, at the chosen access; disconnecting stops renewal at the next call.",
13729
+ inputSchema: {
13730
+ agentProfileId: string2().describe("the agent profile, prof_…"),
13731
+ connected: boolean2().describe("true to connect or re-scope; false to disconnect"),
13732
+ access: _enum(["read", "review", "write"]).optional().describe("connect: read; review (PR reviews and comments, no push — Pull requests write also lets it approve, dismiss, or close PRs; branch rules decide what an approval counts for); or write (push and PRs). A read Run always caps at read"),
13733
+ app: _enum(["arbor", "custom"]).optional().describe("connect: which GitHub App signs; omitted means arbor, except that an agent already on a custom App must name it, so a re-scope never swaps its bot identity"),
13734
+ githubAppId: string2().optional().describe("app=custom: the existing App's numeric id"),
13735
+ githubInstallationId: string2().optional().describe("app=custom: that App's installation id on the repositories' account"),
13736
+ privateKeySecretId: string2().optional().describe("app=custom: the org-owned Secret holding the App's private key, sec_…"),
13737
+ repositories: array(string2()).optional().describe("connect: the admin allowlist — installed repository ids (ghr_…), owner/name, or GitHub URLs; a token only ever reaches these")
13738
+ },
13739
+ surfaces: ["cli"],
13740
+ toolset: "admin",
13741
+ run: forward("github.agent_connection_set")
13742
+ },
13681
13743
  {
13682
13744
  name: "recall",
13683
13745
  title: "Recall existing knowledge",
@@ -14003,12 +14065,13 @@ var ACTION_DEFINITIONS = [
14003
14065
  {
14004
14066
  name: "topic_update",
14005
14067
  title: "Edit a topic's title or purpose",
14006
- description: "Edit a Topic's title or purpose facts, or select `--workflow` from `space_get.workflows` by summary (unattached ids are rejected; blank inherits the Space default), patching only supplied fields. Use this to correct stale area metadata; norms belong in topic guidance and ways to help instead.",
14068
+ description: "Edit a Topic's title, purpose, or `--workflow` (pick from `space_get.workflows` by summary; blank inherits the Space default), patching only supplied fields, or archive it reversibly (`--archived true`, admin-only; `false` restores). Norms belong in topic guidance and ways to help, not here.",
14007
14069
  inputSchema: {
14008
14070
  topicId: string2().describe("the topic to edit, top_…"),
14009
14071
  title: string2().min(1).optional().describe("a new title — an area of work, not a question"),
14010
14072
  purpose: string2().optional().describe("a new purpose — what this Topic accomplishes and what belongs here, leading with its primary role (Direction, Delivery, Operations, Intake, Coordination, or Learning); name an external or split source of truth or a handoff boundary only when it materially matters"),
14011
- workflow: string2().nullable().optional().describe("a workflow id from `space_get.workflows` (pick by summary) — a built-in such as `queue` or a catalog `wfl_…`; must be attached to the Space; blank or null inherits the Space default")
14073
+ workflow: string2().nullable().optional().describe("a workflow id from `space_get.workflows` (pick by summary) — a built-in such as `queue` or a catalog `wfl_…`; must be attached to the Space; blank or null inherits the Space default"),
14074
+ archived: boolean2().optional().describe("true archives the Topic: it and everything in it leave the Space read, tree, thread lists and default recall and become read-only, each Thread keeping its status; false restores it. Org owner/admin or Space admin only, as the only change; refused while a Run in it is active")
14012
14075
  },
14013
14076
  surfaces: ["mcp", "cli"],
14014
14077
  toolset: "spaces",
@@ -16606,7 +16669,7 @@ var ACTIONS = ACTION_DEFINITIONS.map((action) => {
16606
16669
  });
16607
16670
 
16608
16671
  // ../actions/src/retention-entry.ts
16609
- var ARBOR_VERSION = "0.24.25";
16672
+ var ARBOR_VERSION = "0.24.27";
16610
16673
  var historyPolicySchema = _enum(["full", "checkpoint"]).optional().describe("text Artifacts: future history retention policy; full retains every source snapshot, checkpoint keeps metadata for every revision and source only when explicitly retained");
16611
16674
  var retainSourceSchema = boolean2().optional().describe("edit: in checkpoint mode, retain this newly minted content revision's source");
16612
16675
  var checkpointSchema = boolean2().optional().describe("edit: retain the exact current version source without incrementing content version");
@@ -17014,7 +17077,7 @@ function dispositionFilename(value) {
17014
17077
  // package.json
17015
17078
  var package_default = {
17016
17079
  name: "@lambdacurry/arbor",
17017
- version: "0.24.25",
17080
+ version: "0.24.27",
17018
17081
  description: "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
17019
17082
  keywords: [
17020
17083
  "agents",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.24.25",
3
+ "version": "0.24.27",
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",