@lambdacurry/arbor 0.24.27 → 0.24.28

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 +76 -11
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -8544,12 +8544,22 @@ var topics = sqliteTable("topics", {
8544
8544
  guidance: text("guidance", { mode: "json" }).$type().notNull().default([]),
8545
8545
  contributionLanes: text("contribution_lanes", { mode: "json" }).$type().notNull().default([]),
8546
8546
  workflowId: text("workflow_id"),
8547
+ visibility: text("visibility").$type().notNull().default("open"),
8548
+ ownerProfileId: text("owner_profile_id").references(() => profiles.id),
8547
8549
  archivedAt: ts("archived_at"),
8548
8550
  createdAt: ts("created_at").notNull()
8549
8551
  }, (t) => ({
8550
8552
  spaceIdx: index("topics_space_idx").on(t.spaceId),
8551
8553
  workflowIdx: index("topics_workflow_idx").on(t.workflowId)
8552
8554
  }));
8555
+ var topicMemberships = sqliteTable("topic_memberships", {
8556
+ topicId: text("topic_id").notNull().references(() => topics.id, { onDelete: "cascade" }),
8557
+ profileId: text("profile_id").notNull().references(() => profiles.id, { onDelete: "cascade" }),
8558
+ createdAt: ts("created_at").notNull()
8559
+ }, (t) => ({
8560
+ pk: primaryKey({ columns: [t.topicId, t.profileId] }),
8561
+ profileIdx: index("topic_memberships_profile_idx").on(t.profileId)
8562
+ }));
8553
8563
  var initiatives = sqliteTable("initiatives", {
8554
8564
  id: text("id").primaryKey(),
8555
8565
  orgId: text("org_id").notNull().references(() => orgs.id),
@@ -11374,7 +11384,8 @@ function buildOutputSchemas() {
11374
11384
  id,
11375
11385
  title: string2().optional(),
11376
11386
  purpose: nullableString.optional(),
11377
- workflowId: nullableString.optional()
11387
+ workflowId: nullableString.optional(),
11388
+ visibility: _enum(["open", "private"]).optional()
11378
11389
  }),
11379
11390
  create_thread: looseObject({ threadId: id, url: string2().optional() }),
11380
11391
  thread_update: looseObject({
@@ -11696,6 +11707,11 @@ function buildOutputSchemas() {
11696
11707
  goal_delete: looseObject({ ok: boolean2() }),
11697
11708
  membership: looseObject({
11698
11709
  spaceId: id.optional(),
11710
+ topicId: id.optional(),
11711
+ visibility: _enum(["open", "private"]).optional(),
11712
+ members: array(jsonObject).optional(),
11713
+ added: array(string2()).optional(),
11714
+ removed: string2().optional(),
11699
11715
  profileId: id.optional(),
11700
11716
  role: string2().optional(),
11701
11717
  left: boolean2().optional(),
@@ -14056,7 +14072,8 @@ var ACTION_DEFINITIONS = [
14056
14072
  spaceId: string2().describe("the space to create the topic in, spc_…"),
14057
14073
  title: string2().min(1).describe("the topic's name — an area of work, not a question"),
14058
14074
  purpose: string2().optional().describe("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"),
14059
- workflow: string2().optional().describe("a workflow id from `space_get.workflows` (pick by summary) — a built-in such as `queue` or a catalog `wfl_…`; must already be attached to this Space")
14075
+ workflow: string2().optional().describe("a workflow id from `space_get.workflows` (pick by summary) — a built-in such as `queue` or a catalog `wfl_…`; must already be attached to this Space"),
14076
+ visibility: _enum(["open", "private"]).optional().describe("`open` (default): every Space member sees it. `private`: only its roster plus the Space's admins and the org's owner/admins — creating one takes Space admin; you start on the roster")
14060
14077
  },
14061
14078
  surfaces: ["mcp", "cli"],
14062
14079
  toolset: "structure",
@@ -14071,12 +14088,48 @@ var ACTION_DEFINITIONS = [
14071
14088
  title: string2().min(1).optional().describe("a new title — an area of work, not a question"),
14072
14089
  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"),
14073
14090
  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")
14091
+ 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"),
14092
+ visibility: _enum(["open", "private"]).optional().describe("Space admin only: `private` limits the Topic (its threads, contributions, artifacts) to its roster plus Space/org admins; `open` shows it to every Space member again")
14075
14093
  },
14076
14094
  surfaces: ["mcp", "cli"],
14077
14095
  toolset: "spaces",
14078
14096
  run: forward("topic.setConfig")
14079
14097
  },
14098
+ {
14099
+ name: "topic_members",
14100
+ title: "List a topic's members",
14101
+ description: "List a Topic's roster — who can see a PRIVATE Topic besides the Space's admins and the org's owner/admins (who always can). An open Topic is visible to every Space member; its roster is kept for when it is made private.",
14102
+ inputSchema: {
14103
+ topicId: string2().describe("the topic, top_…")
14104
+ },
14105
+ surfaces: ["cli"],
14106
+ toolset: "spaces",
14107
+ run: forward("topic.members")
14108
+ },
14109
+ {
14110
+ name: "add_to_topic",
14111
+ title: "Add members to a topic",
14112
+ description: "Space admin only: admit Space members to a private Topic's roster so they can see its threads, contributions, and artifacts. Each profile must already be a member of the Topic's Space (add them to the Space first).",
14113
+ inputSchema: {
14114
+ topicId: string2().describe("the topic, top_…"),
14115
+ profileIds: array(string2()).min(1).max(20).describe("profile ids to admit, prof_… (Space members only; at most 20)")
14116
+ },
14117
+ surfaces: ["cli"],
14118
+ toolset: "spaces",
14119
+ run: forward("topic.addMembers")
14120
+ },
14121
+ {
14122
+ name: "remove_from_topic",
14123
+ title: "Remove a member from a topic",
14124
+ description: "Space admin only: take a profile off a Topic's roster. While the Topic is private they stop seeing it, unless they administer the Space or the org.",
14125
+ inputSchema: {
14126
+ topicId: string2().describe("the topic, top_…"),
14127
+ profileId: string2().describe("the profile to remove, prof_…")
14128
+ },
14129
+ surfaces: ["cli"],
14130
+ toolset: "spaces",
14131
+ run: forward("topic.removeMember")
14132
+ },
14080
14133
  {
14081
14134
  name: "set_topic_guidance",
14082
14135
  title: "Set a topic's guidance",
@@ -15795,13 +15848,22 @@ var ACTION_DEFINITIONS = [
15795
15848
  },
15796
15849
  {
15797
15850
  name: "membership",
15798
- title: "Space membership moves",
15799
- description: "Join an open Space, add one member or several (add_members), or accept one invitation. Leaving is isolated in space_leave; read available Spaces with space_list_open and pending invitations with space_invitation_list.",
15851
+ title: "Space and Topic membership moves",
15852
+ description: "Join an open Space, add members, or accept an invitation; on a private Topic read its roster (topic_members) or, as a Space admin, add or remove members (topic_add, topic_remove). Leave via space_leave; list with space_list_open or space_invitation_list.",
15800
15853
  inputSchema: {
15801
- verb: _enum(["join", "add_member", "add_members", "accept_invite"]).describe("which membership move to make"),
15854
+ verb: _enum([
15855
+ "join",
15856
+ "add_member",
15857
+ "add_members",
15858
+ "accept_invite",
15859
+ "topic_members",
15860
+ "topic_add",
15861
+ "topic_remove"
15862
+ ]).describe("which membership move to make"),
15802
15863
  spaceId: string2().optional().describe("join/add_member/add_members: the Space, spc_…"),
15803
- profileId: string2().optional().describe("add_member: who to add, prof_…"),
15804
- profileIds: array(string2()).optional().describe("add_members: who to add, prof_… — agents join directly, people are invited"),
15864
+ topicId: string2().optional().describe("topic_members/topic_add/topic_remove: the Topic, top_…"),
15865
+ profileId: string2().optional().describe("add_member/topic_remove: who, prof_…"),
15866
+ profileIds: array(string2()).optional().describe("add_members: who to add — agents join directly, people are invited; topic_add: Space members to admit (at most 20), prof_…"),
15805
15867
  invitationId: string2().optional().describe("accept_invite: the invitation, sinv_…")
15806
15868
  },
15807
15869
  surfaces: ["mcp"],
@@ -15810,7 +15872,10 @@ var ACTION_DEFINITIONS = [
15810
15872
  join: "space.join",
15811
15873
  add_member: "space.addMember",
15812
15874
  add_members: "space.addMembers",
15813
- accept_invite: "space.acceptInvite"
15875
+ accept_invite: "space.acceptInvite",
15876
+ topic_members: "topic.members",
15877
+ topic_add: "topic.addMembers",
15878
+ topic_remove: "topic.removeMember"
15814
15879
  })
15815
15880
  },
15816
15881
  {
@@ -16669,7 +16734,7 @@ var ACTIONS = ACTION_DEFINITIONS.map((action) => {
16669
16734
  });
16670
16735
 
16671
16736
  // ../actions/src/retention-entry.ts
16672
- var ARBOR_VERSION = "0.24.27";
16737
+ var ARBOR_VERSION = "0.24.28";
16673
16738
  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");
16674
16739
  var retainSourceSchema = boolean2().optional().describe("edit: in checkpoint mode, retain this newly minted content revision's source");
16675
16740
  var checkpointSchema = boolean2().optional().describe("edit: retain the exact current version source without incrementing content version");
@@ -17077,7 +17142,7 @@ function dispositionFilename(value) {
17077
17142
  // package.json
17078
17143
  var package_default = {
17079
17144
  name: "@lambdacurry/arbor",
17080
- version: "0.24.27",
17145
+ version: "0.24.28",
17081
17146
  description: "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
17082
17147
  keywords: [
17083
17148
  "agents",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.24.27",
3
+ "version": "0.24.28",
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",