@lambdacurry/arbor 0.6.1 → 0.6.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 +239 -33
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -16022,6 +16022,15 @@ Run \`arbor help\` (or read the MCP tool list) for the exact command/flags — t
16022
16022
  function forward(operation) {
16023
16023
  return (ex, input) => ex.call(operation, input);
16024
16024
  }
16025
+ function dispatch(map2) {
16026
+ return (ex, input) => {
16027
+ const { verb, ...rest } = input;
16028
+ const op = verb ? map2[verb] : undefined;
16029
+ if (!op)
16030
+ return Promise.reject(new Error(`unknown verb "${verb ?? ""}" — expected one of: ${Object.keys(map2).join(" | ")}`));
16031
+ return ex.call(op, rest);
16032
+ };
16033
+ }
16025
16034
  var PAGINATION_INPUT = {
16026
16035
  limit: exports_external.number().int().min(1).optional().describe("max items to return — enables pagination"),
16027
16036
  cursor: exports_external.string().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)")
@@ -16040,6 +16049,7 @@ var ACTIONS = [
16040
16049
  includeHistorical: exports_external.boolean().optional().describe("include superseded/archived knowledge (default false)")
16041
16050
  },
16042
16051
  surfaces: ["mcp", "cli"],
16052
+ tier: "core",
16043
16053
  run: forward("knowledge.recall")
16044
16054
  },
16045
16055
  {
@@ -16060,6 +16070,7 @@ var ACTIONS = [
16060
16070
  links: exports_external.array(exports_external.object({ rel: exports_external.enum(CONTRIBUTION_LINK_RELS), targetId: exports_external.string() })).optional().describe("internal typed links: { rel, targetId } (same-space). External refs go IN THE BODY as URLs.")
16061
16071
  },
16062
16072
  surfaces: ["mcp", "cli"],
16073
+ tier: "core",
16063
16074
  run: forward("contribution.add")
16064
16075
  },
16065
16076
  {
@@ -16072,12 +16083,13 @@ var ACTIONS = [
16072
16083
  summary: exports_external.string().max(300).optional().describe("optional ≤300-char gist — omit to leave unchanged, empty string to clear")
16073
16084
  },
16074
16085
  surfaces: ["mcp", "cli"],
16086
+ tier: "core",
16075
16087
  run: forward("contribution.update")
16076
16088
  },
16077
16089
  {
16078
16090
  name: "stamp",
16079
16091
  title: "Stamp (review) a contribution",
16080
- description: "Vouch for or push back on someone else's contribution — neutral (omit facet+polarity) or signed (a facet + ▲/▽). Use this to register quality judgment with a 'why'; you cannot stamp your own, and re-stamping updates yours in place. A STAMP is also how you respond to a review request (AD-130): if `inbox`/a thread's open request tells you to stamp a contribution, do it here. The note is a MARKDOWN body (AD-143) — be as substantive as the review needs; you can @-mention people and reference other work with [[con_…]].",
16092
+ description: "Vouch for or push back on someone ELSE's contribution — neutral, or a facet + ▲/▽ with a why (markdown note; you can't stamp your own; re-stamping updates yours in place). A stamp is also HOW you answer a review request (AD-130)",
16081
16093
  inputSchema: {
16082
16094
  contributionId: exports_external.string().describe("the contribution id, e.g. con_…"),
16083
16095
  facetKey: exports_external.enum(STAMP_FACETS).optional().describe("quality|impact|fit|originality (omit for a neutral stamp)"),
@@ -16090,6 +16102,7 @@ var ACTIONS = [
16090
16102
  })).optional().describe("inline @-mentions in the note; person mentions notify")
16091
16103
  },
16092
16104
  surfaces: ["mcp", "cli"],
16105
+ tier: "core",
16093
16106
  run: forward("review.add")
16094
16107
  },
16095
16108
  {
@@ -16102,6 +16115,7 @@ var ACTIONS = [
16102
16115
  emoji: exports_external.string().min(1)
16103
16116
  },
16104
16117
  surfaces: ["mcp", "cli"],
16118
+ tier: "extended",
16105
16119
  run: forward("reaction.toggle")
16106
16120
  },
16107
16121
  {
@@ -16114,6 +16128,7 @@ var ACTIONS = [
16114
16128
  purpose: exports_external.string().optional().describe("one line on what belongs here")
16115
16129
  },
16116
16130
  surfaces: ["mcp", "cli"],
16131
+ tier: "extended",
16117
16132
  run: forward("topic.create")
16118
16133
  },
16119
16134
  {
@@ -16124,7 +16139,8 @@ var ACTIONS = [
16124
16139
  topicId: exports_external.string().describe("the topic, top_…"),
16125
16140
  guidance: exports_external.array(exports_external.string()).describe("the full guidance list — replaces the existing one; [] clears it")
16126
16141
  },
16127
- surfaces: ["mcp", "cli"],
16142
+ surfaces: ["cli"],
16143
+ tier: "extended",
16128
16144
  run: forward("topic.update")
16129
16145
  },
16130
16146
  {
@@ -16138,6 +16154,7 @@ var ACTIONS = [
16138
16154
  objective: exports_external.string().min(1).describe("what settled/done looks like for this thread")
16139
16155
  },
16140
16156
  surfaces: ["mcp", "cli"],
16157
+ tier: "core",
16141
16158
  run: forward("thread.create")
16142
16159
  },
16143
16160
  {
@@ -16148,19 +16165,21 @@ var ACTIONS = [
16148
16165
  threadId: exports_external.string().describe("the thread, thr_…"),
16149
16166
  waysToHelp: exports_external.array(exports_external.string()).describe("the full ways-to-help list — replaces the existing one; [] clears it")
16150
16167
  },
16151
- surfaces: ["mcp", "cli"],
16168
+ surfaces: ["cli"],
16169
+ tier: "extended",
16152
16170
  run: forward("thread.update")
16153
16171
  },
16154
16172
  {
16155
16173
  name: "transition_thread",
16156
16174
  title: "Move a thread's lifecycle",
16157
- description: "Move a thread along its deliberate lifecycle (AD-068/159). The two CLOSED states are about the WORK, not curation: `resolved` = the deliberation reached its conclusion (done) — use this to close a thread you've settled; `archived` = retire/shelve it (e.g. opened in the wrong place archive it, then open a fresh one where it belongs). Both drop out of normal recall and stay recoverable to `active`. You can also flag it `stuck`/`needs-review` while it's open. NOTE: a standout OUTPUT gets promoted (a \uD83C\uDF96️ contribution/artifact via `promote_contribution`) the THREAD just resolves; don't look for a 'promote thread'. Illegal jumps are rejected.",
16175
+ description: "Move a thread along its lifecycle (AD-068/159): `resolved` = the deliberation reached its conclusion; `archived` = retired / wrong place (both recoverable to `active`); `stuck`/`needs-review` flag an open thread. Threads RESOLVE standout outputs get promoted via `curation`; there is no promote-thread. Illegal jumps are rejected",
16158
16176
  inputSchema: {
16159
16177
  threadId: exports_external.string().describe("the thread to move, thr_…"),
16160
16178
  to: exports_external.string().describe("target status: active|needs-review|stuck|resolved|archived"),
16161
16179
  reason: exports_external.string().optional().describe("optional one-line why, recorded on the event")
16162
16180
  },
16163
16181
  surfaces: ["mcp", "cli"],
16182
+ tier: "core",
16164
16183
  run: forward("thread.transition")
16165
16184
  },
16166
16185
  {
@@ -16175,7 +16194,8 @@ var ACTIONS = [
16175
16194
  sourceThreadId: exports_external.string().optional(),
16176
16195
  sourceContributionIds: exports_external.array(exports_external.string()).optional()
16177
16196
  },
16178
- surfaces: ["mcp", "cli"],
16197
+ surfaces: ["cli"],
16198
+ tier: "extended",
16179
16199
  run: forward("artifact.create")
16180
16200
  },
16181
16201
  {
@@ -16187,7 +16207,8 @@ var ACTIONS = [
16187
16207
  to: exports_external.string().describe("target status: active|promoted|needs-review|superseded|deprecated|archived|deleted"),
16188
16208
  reason: exports_external.string().optional()
16189
16209
  },
16190
- surfaces: ["mcp", "cli"],
16210
+ surfaces: ["cli"],
16211
+ tier: "extended",
16191
16212
  run: forward("artifact.transition")
16192
16213
  },
16193
16214
  {
@@ -16198,7 +16219,8 @@ var ACTIONS = [
16198
16219
  attachmentId: exports_external.string().describe("the uploaded attachment, att_…"),
16199
16220
  sourceContributionId: exports_external.string().describe("the contribution it's produced by, con_… (must share the attachment's thread)")
16200
16221
  },
16201
- surfaces: ["mcp", "cli"],
16222
+ surfaces: ["cli"],
16223
+ tier: "extended",
16202
16224
  run: forward("attachment.promote")
16203
16225
  },
16204
16226
  {
@@ -16208,7 +16230,8 @@ var ACTIONS = [
16208
16230
  inputSchema: {
16209
16231
  contributionId: exports_external.string().describe("the contribution to promote, con_… (its thread + author are derived)")
16210
16232
  },
16211
- surfaces: ["mcp", "cli"],
16233
+ surfaces: ["cli"],
16234
+ tier: "extended",
16212
16235
  run: forward("contribution.promote")
16213
16236
  },
16214
16237
  {
@@ -16218,7 +16241,8 @@ var ACTIONS = [
16218
16241
  inputSchema: {
16219
16242
  contributionId: exports_external.string().describe("the standout contribution to demote, con_…")
16220
16243
  },
16221
- surfaces: ["mcp", "cli"],
16244
+ surfaces: ["cli"],
16245
+ tier: "extended",
16222
16246
  run: forward("contribution.demote")
16223
16247
  },
16224
16248
  {
@@ -16228,7 +16252,8 @@ var ACTIONS = [
16228
16252
  inputSchema: {
16229
16253
  contributionId: exports_external.string().describe("the contribution to remove, con_…")
16230
16254
  },
16231
- surfaces: ["mcp", "cli"],
16255
+ surfaces: ["cli"],
16256
+ tier: "extended",
16232
16257
  run: forward("contribution.delete")
16233
16258
  },
16234
16259
  {
@@ -16238,13 +16263,14 @@ var ACTIONS = [
16238
16263
  inputSchema: {
16239
16264
  contributionId: exports_external.string().describe("the removed contribution to restore, con_…")
16240
16265
  },
16241
- surfaces: ["mcp", "cli"],
16266
+ surfaces: ["cli"],
16267
+ tier: "extended",
16242
16268
  run: forward("contribution.restore")
16243
16269
  },
16244
16270
  {
16245
16271
  name: "request",
16246
16272
  title: "Request a contribution or review",
16247
- description: "Request input on a thread (AD-161). Two kinds, picked by `aboutContributionId`: OMIT it to request a CONTRIBUTION — new input on the thread (evidence, a proposal, a counter-argument, OR a decision/approval you need from someone), met by someone's `respond` contribution. PASS it to request a REVIEW of that specific contribution, met ONLY by a `stamp` on it. So when you want a prose answer or a yes/no decision, raise a CONTRIBUTION request (omit `aboutContributionId`) — do NOT wrap a decision as a review, because a review can only be answered by stamping, not by replying. Either way, name targets (an inbox item each) or leave it open (the thread board); completion is software-computed from their responses (first | quorum(n) | all-targets | deadline | explicit). Every request expires (default 14 days if you omit `expiresAt`), so nothing hangs forever.",
16273
+ description: "Request input on a thread (AD-161). OMIT `aboutContributionId` to ask for a CONTRIBUTION — evidence, a proposal, or a decision you need answered via `respond`. PASS it to ask for a REVIEW of that contribution answered ONLY by a `stamp`, so never wrap a decision as a review. Name targets (an inbox item each) or leave it open; completion is software-computed (first | quorum | all-targets | deadline | explicit); every request expires (default 14 days)",
16248
16274
  inputSchema: {
16249
16275
  threadId: exports_external.string().describe("the thread the request is in, thr_…"),
16250
16276
  requestedAction: exports_external.string().optional().describe("a one-line 'what you're requesting'"),
@@ -16255,6 +16281,7 @@ var ACTIONS = [
16255
16281
  expiresAt: exports_external.string().optional().describe("ISO-8601 deadline (default: 14 days from creation, AD-167)")
16256
16282
  },
16257
16283
  surfaces: ["mcp", "cli"],
16284
+ tier: "core",
16258
16285
  run: forward("request.create")
16259
16286
  },
16260
16287
  {
@@ -16268,6 +16295,7 @@ var ACTIONS = [
16268
16295
  confidence: exports_external.number().int().min(0).max(100).optional()
16269
16296
  },
16270
16297
  surfaces: ["mcp", "cli"],
16298
+ tier: "core",
16271
16299
  run: forward("request.respond")
16272
16300
  },
16273
16301
  {
@@ -16279,6 +16307,7 @@ var ACTIONS = [
16279
16307
  contributionId: exports_external.string().describe("the existing contribution that responds to it, con_…")
16280
16308
  },
16281
16309
  surfaces: ["mcp", "cli"],
16310
+ tier: "core",
16282
16311
  run: forward("request.bind")
16283
16312
  },
16284
16313
  {
@@ -16289,6 +16318,7 @@ var ACTIONS = [
16289
16318
  requestId: exports_external.string().describe("the open request to cancel, req_…")
16290
16319
  },
16291
16320
  surfaces: ["mcp", "cli"],
16321
+ tier: "core",
16292
16322
  run: forward("request.cancel")
16293
16323
  },
16294
16324
  {
@@ -16300,6 +16330,7 @@ var ACTIONS = [
16300
16330
  ...PAGINATION_INPUT
16301
16331
  },
16302
16332
  surfaces: ["mcp", "cli"],
16333
+ tier: "core",
16303
16334
  run: forward("inbox.list")
16304
16335
  },
16305
16336
  {
@@ -16310,14 +16341,16 @@ var ACTIONS = [
16310
16341
  inboxItemId: exports_external.string().describe("the inbox item to dismiss, inb_…")
16311
16342
  },
16312
16343
  surfaces: ["mcp", "cli"],
16344
+ tier: "core",
16313
16345
  run: forward("inbox.dismiss")
16314
16346
  },
16315
16347
  {
16316
16348
  name: "notifications",
16317
16349
  title: "List your notifications",
16318
- description: "List the awareness feed of activity involving you — stamps on your work, replies in your threads, @-mentions, and your completed requests — newest first, with an unseen count. This is FYI (no response owed); use `inbox` for what's actually asked of you.",
16350
+ description: "List the awareness feed of activity involving you — stamps on your work, replies in your threads, @-mentions, and your completed requests — newest first, with an unseen count. Each item carries a triage `class` (AD-182) derived from thread state: `settled-context` (thread resolved — durable context, never live work), `owed-by-me` (an open ask targets you — go to `inbox`, this row is just a pointer), `judgment-available` (your work was engaged in a live thread — an invitation, not an obligation), `closed-loop` (your ask completed), `room-motion` (ambient activity, safely skippable). This is FYI (no response owed); `inbox` remains the only obligation surface.",
16319
16351
  inputSchema: { ...PAGINATION_INPUT },
16320
- surfaces: ["mcp", "cli"],
16352
+ surfaces: ["cli"],
16353
+ tier: "extended",
16321
16354
  run: forward("notification.list")
16322
16355
  },
16323
16356
  {
@@ -16327,7 +16360,8 @@ var ACTIONS = [
16327
16360
  inputSchema: {
16328
16361
  notificationId: exports_external.string().describe("the notification id, ntf_…")
16329
16362
  },
16330
- surfaces: ["mcp", "cli"],
16363
+ surfaces: ["cli"],
16364
+ tier: "extended",
16331
16365
  run: forward("notification.markRead")
16332
16366
  },
16333
16367
  {
@@ -16335,7 +16369,8 @@ var ACTIONS = [
16335
16369
  title: "Mark all notifications read",
16336
16370
  description: "Mark every unread notification in your feed read in one call; returns how many were cleared. Reach for this to zero out your awareness feed after a catch-up.",
16337
16371
  inputSchema: {},
16338
- surfaces: ["mcp", "cli"],
16372
+ surfaces: ["cli"],
16373
+ tier: "extended",
16339
16374
  run: forward("notification.markAllRead")
16340
16375
  },
16341
16376
  {
@@ -16344,6 +16379,7 @@ var ACTIONS = [
16344
16379
  description: "Return your own Arbor identity (profile + source client) as resolved from your credential. Reach for this to confirm which profile and org you're acting as before you write.",
16345
16380
  inputSchema: {},
16346
16381
  surfaces: ["mcp", "cli"],
16382
+ tier: "core",
16347
16383
  run: forward("me.get")
16348
16384
  },
16349
16385
  {
@@ -16357,6 +16393,7 @@ var ACTIONS = [
16357
16393
  capabilities: exports_external.array(exports_external.string()).optional().describe("free-form skill tags (≤20, each ≤60 chars) for what you can do — e.g. ['market-research','data-viz']; how teammates route work to you. An empty array clears them.")
16358
16394
  },
16359
16395
  surfaces: ["mcp", "cli"],
16396
+ tier: "extended",
16360
16397
  run: forward("me.update")
16361
16398
  },
16362
16399
  {
@@ -16368,7 +16405,8 @@ var ACTIONS = [
16368
16405
  charter: exports_external.string().describe("how they operate in this space; empty string clears it"),
16369
16406
  profileId: exports_external.string().optional().describe("admin override — set THIS member's charter instead of your own (org owner/admin only)")
16370
16407
  },
16371
- surfaces: ["mcp", "cli"],
16408
+ surfaces: ["cli"],
16409
+ tier: "extended",
16372
16410
  run: forward("space.setCharter")
16373
16411
  },
16374
16412
  {
@@ -16381,18 +16419,20 @@ var ACTIONS = [
16381
16419
  contribCursor: exports_external.string().optional().describe("continuation cursor from a previous page's contributionPage.nextCursor")
16382
16420
  },
16383
16421
  surfaces: ["mcp", "cli"],
16422
+ tier: "core",
16384
16423
  run: forward("thread.get")
16385
16424
  },
16386
16425
  {
16387
16426
  name: "tree",
16388
16427
  title: "Navigate the workspace tree",
16389
- description: "Map the workspace — a GLANCEABLE structure map, not a full dump. By default (depth `topics`) you get your accessible spaces (purpose, governance stage) their topics, plus a LIGHT roster (who's in each space by name/kind/role). Go DEEPER with the targeted reads, not by inflating the tree: `space_get` for a space's full roster + capabilities + charters, `topic_get` for a topic's threads, `thread_get` for a thread's contributions. Depths: `spaces` (just the spaces lightest), `topics` (default spaces + topics + light roster), `threads` (also expands each topic's threads with contribution counts). Scope with space or topic to map just that subtree.",
16428
+ description: 'Map the workspace — a GLANCEABLE structure map, not a dump. Depths: `spaces` | `topics` (default: spaces → topics + light roster) | `threads` (adds each topic\'s threads with status + open-request counts; `openRequestsForYou` answers "does this space need me?"AD-182). Scope with space/topic; drill down with space_get/topic_get/thread_get instead of inflating the tree',
16390
16429
  inputSchema: {
16391
16430
  space: exports_external.string().optional().describe("scope to one space id (spc_…)"),
16392
16431
  topic: exports_external.string().optional().describe("scope to one topic id (top_…)"),
16393
16432
  depth: exports_external.enum(["spaces", "topics", "threads"]).optional().describe("how deep to expand: spaces (just spaces) | topics (default: + topics + light roster) | threads (+ each topic's threads). For one topic's threads or one thread's contributions, prefer topic_get / thread_get.")
16394
16433
  },
16395
16434
  surfaces: ["mcp", "cli"],
16435
+ tier: "core",
16396
16436
  run: forward("navigation.tree")
16397
16437
  },
16398
16438
  {
@@ -16401,6 +16441,7 @@ var ACTIONS = [
16401
16441
  description: "List everyone in your org — humans and agents — with their profile id, identity, role, and self-declared capabilities. Reach for this to find WHO to route work to: the profile id to @-mention in a contribution, or to target a `request` at a specific person (e.g. request a review from Meg). Read-only.",
16402
16442
  inputSchema: {},
16403
16443
  surfaces: ["mcp", "cli"],
16444
+ tier: "core",
16404
16445
  run: forward("org.members")
16405
16446
  },
16406
16447
  {
@@ -16410,7 +16451,8 @@ var ACTIONS = [
16410
16451
  inputSchema: {
16411
16452
  spaceId: exports_external.string().describe("the space id to join, e.g. spc_…")
16412
16453
  },
16413
- surfaces: ["mcp", "cli"],
16454
+ surfaces: ["cli"],
16455
+ tier: "extended",
16414
16456
  run: forward("space.join")
16415
16457
  },
16416
16458
  {
@@ -16420,7 +16462,8 @@ var ACTIONS = [
16420
16462
  inputSchema: {
16421
16463
  spaceId: exports_external.string().describe("the space id to leave, e.g. spc_…")
16422
16464
  },
16423
- surfaces: ["mcp", "cli"],
16465
+ surfaces: ["cli"],
16466
+ tier: "extended",
16424
16467
  run: forward("space.leave")
16425
16468
  },
16426
16469
  {
@@ -16431,7 +16474,8 @@ var ACTIONS = [
16431
16474
  spaceId: exports_external.string().describe("the space id to add into, e.g. spc_…"),
16432
16475
  profileId: exports_external.string().describe("the profile id to add, e.g. prof_… (agent → granted, human → invited)")
16433
16476
  },
16434
- surfaces: ["mcp", "cli"],
16477
+ surfaces: ["cli"],
16478
+ tier: "extended",
16435
16479
  run: forward("space.addMember")
16436
16480
  },
16437
16481
  {
@@ -16441,7 +16485,8 @@ var ACTIONS = [
16441
16485
  inputSchema: {
16442
16486
  invitationId: exports_external.string().describe("the space invitation id, e.g. sinv_…")
16443
16487
  },
16444
- surfaces: ["mcp", "cli"],
16488
+ surfaces: ["cli"],
16489
+ tier: "extended",
16445
16490
  run: forward("space.acceptInvite")
16446
16491
  },
16447
16492
  {
@@ -16449,7 +16494,8 @@ var ACTIONS = [
16449
16494
  title: "List open spaces",
16450
16495
  description: "Discover the OPEN spaces in your org you could join. Each is flagged with whether you're already a member; private spaces are never listed.",
16451
16496
  inputSchema: { ...PAGINATION_INPUT },
16452
- surfaces: ["mcp", "cli"],
16497
+ surfaces: ["cli"],
16498
+ tier: "extended",
16453
16499
  run: forward("space.listOpen")
16454
16500
  },
16455
16501
  {
@@ -16457,7 +16503,8 @@ var ACTIONS = [
16457
16503
  title: "List my space invitations",
16458
16504
  description: "List your pending space invitations to accept. Reach for this to find an invite, then `accept_space_invite` it.",
16459
16505
  inputSchema: { ...PAGINATION_INPUT },
16460
- surfaces: ["mcp", "cli"],
16506
+ surfaces: ["cli"],
16507
+ tier: "extended",
16461
16508
  run: forward("space.invites")
16462
16509
  },
16463
16510
  {
@@ -16470,7 +16517,8 @@ var ACTIONS = [
16470
16517
  purpose: exports_external.string().optional().describe("one or two lines on what reaching it means"),
16471
16518
  threadIds: exports_external.array(exports_external.string()).optional().describe("optional threads IN THIS SPACE to link at creation (others are ignored)")
16472
16519
  },
16473
- surfaces: ["mcp", "cli"],
16520
+ surfaces: ["cli"],
16521
+ tier: "extended",
16474
16522
  run: forward("initiative.create")
16475
16523
  },
16476
16524
  {
@@ -16481,7 +16529,8 @@ var ACTIONS = [
16481
16529
  initiativeId: exports_external.string().describe("the goal to attach, ini_…"),
16482
16530
  spaceId: exports_external.string().describe("the space to surface it in, spc_… (you must be a member)")
16483
16531
  },
16484
- surfaces: ["mcp", "cli"],
16532
+ surfaces: ["cli"],
16533
+ tier: "extended",
16485
16534
  run: forward("initiative.attachSpace")
16486
16535
  },
16487
16536
  {
@@ -16492,7 +16541,8 @@ var ACTIONS = [
16492
16541
  initiativeId: exports_external.string().describe("the goal to detach, ini_…"),
16493
16542
  spaceId: exports_external.string().describe("the space to stop surfacing it in, spc_…")
16494
16543
  },
16495
- surfaces: ["mcp", "cli"],
16544
+ surfaces: ["cli"],
16545
+ tier: "extended",
16496
16546
  run: forward("initiative.detachSpace")
16497
16547
  },
16498
16548
  {
@@ -16503,7 +16553,8 @@ var ACTIONS = [
16503
16553
  threadId: exports_external.string().describe("the contributing thread, thr_…"),
16504
16554
  initiativeId: exports_external.string().describe("the goal it serves, ini_…")
16505
16555
  },
16506
- surfaces: ["mcp", "cli"],
16556
+ surfaces: ["cli"],
16557
+ tier: "extended",
16507
16558
  run: forward("initiative.linkThread")
16508
16559
  },
16509
16560
  {
@@ -16514,7 +16565,8 @@ var ACTIONS = [
16514
16565
  threadId: exports_external.string().describe("the thread to unlink, thr_…"),
16515
16566
  initiativeId: exports_external.string().describe("the goal to unlink it from, ini_…")
16516
16567
  },
16517
- surfaces: ["mcp", "cli"],
16568
+ surfaces: ["cli"],
16569
+ tier: "extended",
16518
16570
  run: forward("initiative.unlinkThread")
16519
16571
  },
16520
16572
  {
@@ -16524,7 +16576,8 @@ var ACTIONS = [
16524
16576
  inputSchema: {
16525
16577
  threadId: exports_external.string().describe("the thread to read goals for, thr_…")
16526
16578
  },
16527
- surfaces: ["mcp", "cli"],
16579
+ surfaces: ["cli"],
16580
+ tier: "extended",
16528
16581
  run: forward("initiative.forThread")
16529
16582
  },
16530
16583
  {
@@ -16536,7 +16589,8 @@ var ACTIONS = [
16536
16589
  title: exports_external.string().min(1).optional().describe("a new name — an outcome, not a task"),
16537
16590
  purpose: exports_external.string().optional().describe("a new one-or-two-line purpose")
16538
16591
  },
16539
- surfaces: ["mcp", "cli"],
16592
+ surfaces: ["cli"],
16593
+ tier: "extended",
16540
16594
  run: forward("initiative.update")
16541
16595
  },
16542
16596
  {
@@ -16547,7 +16601,8 @@ var ACTIONS = [
16547
16601
  id: exports_external.string().describe("the goal, ini_…"),
16548
16602
  status: exports_external.enum(["active", "paused", "completed", "archived"]).describe("the new lifecycle state")
16549
16603
  },
16550
- surfaces: ["mcp", "cli"],
16604
+ surfaces: ["cli"],
16605
+ tier: "extended",
16551
16606
  run: forward("initiative.setStatus")
16552
16607
  },
16553
16608
  {
@@ -16557,7 +16612,8 @@ var ACTIONS = [
16557
16612
  inputSchema: {
16558
16613
  id: exports_external.string().describe("the goal to delete, ini_…")
16559
16614
  },
16560
- surfaces: ["mcp", "cli"],
16615
+ surfaces: ["cli"],
16616
+ tier: "extended",
16561
16617
  run: forward("initiative.delete")
16562
16618
  },
16563
16619
  {
@@ -16571,6 +16627,7 @@ var ACTIONS = [
16571
16627
  memberProfileIds: exports_external.array(exports_external.string()).optional().describe("org profile ids to seed as members — agents added directly, humans get a pending invite")
16572
16628
  },
16573
16629
  surfaces: ["mcp", "cli"],
16630
+ tier: "extended",
16574
16631
  run: forward("space.create")
16575
16632
  },
16576
16633
  {
@@ -16581,6 +16638,7 @@ var ACTIONS = [
16581
16638
  displayName: exports_external.string().min(1).describe("the agent's display name")
16582
16639
  },
16583
16640
  surfaces: ["cli"],
16641
+ tier: "extended",
16584
16642
  run: forward("agent.register")
16585
16643
  },
16586
16644
  {
@@ -16593,6 +16651,7 @@ var ACTIONS = [
16593
16651
  orgRole: exports_external.enum(["member", "admin"]).optional().describe("org role (default member)")
16594
16652
  },
16595
16653
  surfaces: ["cli"],
16654
+ tier: "extended",
16596
16655
  run: forward("human.invite")
16597
16656
  },
16598
16657
  {
@@ -16603,6 +16662,7 @@ var ACTIONS = [
16603
16662
  spaceId: exports_external.string().min(1).describe("the space id")
16604
16663
  },
16605
16664
  surfaces: ["mcp", "cli"],
16665
+ tier: "core",
16606
16666
  run: forward("space.get")
16607
16667
  },
16608
16668
  {
@@ -16613,6 +16673,7 @@ var ACTIONS = [
16613
16673
  topicId: exports_external.string().min(1).describe("the topic id")
16614
16674
  },
16615
16675
  surfaces: ["mcp", "cli"],
16676
+ tier: "core",
16616
16677
  run: forward("topic.get")
16617
16678
  },
16618
16679
  {
@@ -16621,6 +16682,7 @@ var ACTIONS = [
16621
16682
  description: "Platform-operator only: list EVERY org on the instance with member + space counts. The entry point for cross-org oversight — start here, then dive into one with `admin org`.",
16622
16683
  inputSchema: { ...PAGINATION_INPUT },
16623
16684
  surfaces: ["cli"],
16685
+ tier: "extended",
16624
16686
  run: forward("admin.listOrgs")
16625
16687
  },
16626
16688
  {
@@ -16631,6 +16693,7 @@ var ACTIONS = [
16631
16693
  orgId: exports_external.string().min(1).describe("the org id, e.g. org_…")
16632
16694
  },
16633
16695
  surfaces: ["cli"],
16696
+ tier: "extended",
16634
16697
  run: forward("admin.getOrg")
16635
16698
  },
16636
16699
  {
@@ -16641,6 +16704,7 @@ var ACTIONS = [
16641
16704
  spaceId: exports_external.string().min(1).describe("the space id, e.g. spc_…")
16642
16705
  },
16643
16706
  surfaces: ["cli"],
16707
+ tier: "extended",
16644
16708
  run: forward("admin.getSpace")
16645
16709
  },
16646
16710
  {
@@ -16651,6 +16715,7 @@ var ACTIONS = [
16651
16715
  topicId: exports_external.string().min(1).describe("the topic id, e.g. top_…")
16652
16716
  },
16653
16717
  surfaces: ["cli"],
16718
+ tier: "extended",
16654
16719
  run: forward("admin.getTopic")
16655
16720
  },
16656
16721
  {
@@ -16661,7 +16726,148 @@ var ACTIONS = [
16661
16726
  threadId: exports_external.string().min(1).describe("the thread id, e.g. thr_…")
16662
16727
  },
16663
16728
  surfaces: ["cli"],
16729
+ tier: "extended",
16664
16730
  run: forward("admin.getThread")
16731
+ },
16732
+ {
16733
+ name: "goal",
16734
+ title: "Work with goals",
16735
+ description: "GOALS (initiatives) — the wide 'why' threads serve toward (AD-146/180). verb=create (spaceId+title, optional purpose/threadIds — the creating space becomes its HOME), list (threadId — the goals that thread's space offers), update (id + title/purpose), set_status (id+status: active|paused|completed|archived — completed = reached, archived = retired from pick lists), delete (id), link_thread/unlink_thread (threadId+initiativeId), attach_space/detach_space (initiativeId+spaceId — surface a goal in MORE spaces).",
16736
+ inputSchema: {
16737
+ verb: exports_external.enum([
16738
+ "create",
16739
+ "list",
16740
+ "update",
16741
+ "set_status",
16742
+ "delete",
16743
+ "link_thread",
16744
+ "unlink_thread",
16745
+ "attach_space",
16746
+ "detach_space"
16747
+ ]).describe("which goal move to make"),
16748
+ spaceId: exports_external.string().optional().describe("create: HOME space · attach/detach_space: the target space, spc_…"),
16749
+ title: exports_external.string().optional().describe("create/update: the goal's name — an outcome, not a task"),
16750
+ purpose: exports_external.string().optional().describe("create/update: one or two lines on what reaching it means"),
16751
+ threadIds: exports_external.array(exports_external.string()).optional().describe("create: threads to link at birth"),
16752
+ id: exports_external.string().optional().describe("update/set_status/delete: the goal, ini_…"),
16753
+ status: exports_external.enum(["active", "paused", "completed", "archived"]).optional().describe("set_status: the new lifecycle state"),
16754
+ threadId: exports_external.string().optional().describe("list/link_thread/unlink_thread: the thread, thr_…"),
16755
+ initiativeId: exports_external.string().optional().describe("link/unlink/attach/detach: the goal, ini_…")
16756
+ },
16757
+ surfaces: ["mcp"],
16758
+ tier: "extended",
16759
+ run: dispatch({
16760
+ create: "initiative.create",
16761
+ list: "initiative.forThread",
16762
+ update: "initiative.update",
16763
+ set_status: "initiative.setStatus",
16764
+ delete: "initiative.delete",
16765
+ link_thread: "initiative.linkThread",
16766
+ unlink_thread: "initiative.unlinkThread",
16767
+ attach_space: "initiative.attachSpace",
16768
+ detach_space: "initiative.detachSpace"
16769
+ })
16770
+ },
16771
+ {
16772
+ name: "membership",
16773
+ title: "Space membership moves",
16774
+ description: "Your space membership, in one tool. verb=join (an open space), leave, add_member (spaceId+profileId — an agent is added directly, a human gets an invite to accept, AD-177), accept_invite (invitationId), my_invites (your pending invites), list_open (spaces anyone in the org may join).",
16775
+ inputSchema: {
16776
+ verb: exports_external.enum(["join", "leave", "add_member", "accept_invite", "my_invites", "list_open"]).describe("which membership move to make"),
16777
+ spaceId: exports_external.string().optional().describe("join/leave/add_member: the space, spc_…"),
16778
+ profileId: exports_external.string().optional().describe("add_member: who to add, prof_…"),
16779
+ invitationId: exports_external.string().optional().describe("accept_invite: the invitation, sinv_…")
16780
+ },
16781
+ surfaces: ["mcp"],
16782
+ tier: "extended",
16783
+ run: dispatch({
16784
+ join: "space.join",
16785
+ leave: "space.leave",
16786
+ add_member: "space.addMember",
16787
+ accept_invite: "space.acceptInvite",
16788
+ my_invites: "space.invites",
16789
+ list_open: "space.listOpen"
16790
+ })
16791
+ },
16792
+ {
16793
+ name: "notification",
16794
+ title: "Your awareness feed",
16795
+ description: "Awareness, never obligation (`inbox` is the only obligation surface). verb=list: activity involving you, newest first, each item carrying a triage `class` (AD-182): settled-context (thread resolved — context, not work) | owed-by-me (an open ask targets you — this row is a POINTER to inbox) | judgment-available (your work engaged in a live thread — an invitation) | closed-loop (your ask completed) | room-motion (safely skippable). verb=read (notificationId) clears one row; verb=read_all clears the feed.",
16796
+ inputSchema: {
16797
+ verb: exports_external.enum(["list", "read", "read_all"]).describe("list the feed, or clear one/all"),
16798
+ notificationId: exports_external.string().optional().describe("read: the notification, ntf_…"),
16799
+ ...PAGINATION_INPUT
16800
+ },
16801
+ surfaces: ["mcp"],
16802
+ tier: "core",
16803
+ run: dispatch({
16804
+ list: "notification.list",
16805
+ read: "notification.markRead",
16806
+ read_all: "notification.markAllRead"
16807
+ })
16808
+ },
16809
+ {
16810
+ name: "curation",
16811
+ title: "Curate the record",
16812
+ description: "Curation moves on a contribution (all take contributionId). verb=promote (mark it a \uD83C\uDF96️ standout — sparingly: promotion is curation, not applause, AD-140), demote (remove the mark), delete (soft-remove), restore (bring a removed one back).",
16813
+ inputSchema: {
16814
+ verb: exports_external.enum(["promote", "demote", "delete", "restore"]).describe("which curation move"),
16815
+ contributionId: exports_external.string().describe("the contribution, con_…")
16816
+ },
16817
+ surfaces: ["mcp"],
16818
+ tier: "extended",
16819
+ run: dispatch({
16820
+ promote: "contribution.promote",
16821
+ demote: "contribution.demote",
16822
+ delete: "contribution.delete",
16823
+ restore: "contribution.restore"
16824
+ })
16825
+ },
16826
+ {
16827
+ name: "artifact",
16828
+ title: "Durable artifacts",
16829
+ description: "Durable, lifecycle-managed artifacts. verb=create (title+contentRef, optional summary/sourceThreadId/sourceContributionIds), transition (artifactId + to: active|promoted|needs-review|superseded|deprecated|archived|deleted — the state machine guards jumps and retrieval tier follows), promote_attachment (attachmentId — lift an uploaded file into an artifact).",
16830
+ inputSchema: {
16831
+ verb: exports_external.enum(["create", "transition", "promote_attachment"]).describe("which artifact move"),
16832
+ title: exports_external.string().optional().describe("create: the artifact's title"),
16833
+ contentRef: exports_external.string().optional().describe("create: where the content lives, e.g. inline://… or a URL"),
16834
+ summary: exports_external.string().optional().describe("create: a short summary"),
16835
+ sourceThreadId: exports_external.string().optional().describe("create: the thread it came from"),
16836
+ sourceContributionIds: exports_external.array(exports_external.string()).optional().describe("create: contributions it distills"),
16837
+ artifactId: exports_external.string().optional().describe("transition: the artifact, art_…"),
16838
+ to: exports_external.string().optional().describe("transition: the target status"),
16839
+ reason: exports_external.string().optional().describe("transition: why"),
16840
+ attachmentId: exports_external.string().optional().describe("promote_attachment: the upload, att_…")
16841
+ },
16842
+ surfaces: ["mcp"],
16843
+ tier: "extended",
16844
+ run: dispatch({
16845
+ create: "artifact.create",
16846
+ transition: "artifact.transition",
16847
+ promote_attachment: "attachment.promote"
16848
+ })
16849
+ },
16850
+ {
16851
+ name: "charter",
16852
+ title: "Set the guidance surfaces",
16853
+ description: "The guidance you WRITE (read back via space_get/topic_get/thread_get). verb=space_charter (spaceId+charter — how YOU operate in this space, AD-152; org admins may pass profileId to bootstrap another member's), topic_guidance (topicId+guidance[] — the topic's soft norms, replaces the list, [] clears), ways_to_help (threadId+waysToHelp[] — a thread's curated pitch-in list; guidance, never obligation — obligations are `request`).",
16854
+ inputSchema: {
16855
+ verb: exports_external.enum(["space_charter", "topic_guidance", "ways_to_help"]).describe("which guidance surface to set"),
16856
+ spaceId: exports_external.string().optional().describe("space_charter: the space, spc_…"),
16857
+ charter: exports_external.string().optional().describe("space_charter: the text; empty string clears"),
16858
+ profileId: exports_external.string().optional().describe("space_charter admin override: whose charter"),
16859
+ topicId: exports_external.string().optional().describe("topic_guidance: the topic, top_…"),
16860
+ guidance: exports_external.array(exports_external.string()).optional().describe("topic_guidance: full list, replaces; [] clears"),
16861
+ threadId: exports_external.string().optional().describe("ways_to_help: the thread, thr_…"),
16862
+ waysToHelp: exports_external.array(exports_external.string()).optional().describe("ways_to_help: full list, replaces; [] clears")
16863
+ },
16864
+ surfaces: ["mcp"],
16865
+ tier: "extended",
16866
+ run: dispatch({
16867
+ space_charter: "space.setCharter",
16868
+ topic_guidance: "topic.update",
16869
+ ways_to_help: "thread.update"
16870
+ })
16665
16871
  }
16666
16872
  ];
16667
16873
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.6.1",
3
+ "version": "0.6.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",