@lambdacurry/arbor 0.21.8 → 0.21.9

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 +83 -5
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -17864,6 +17864,7 @@ var MCP_OUTPUT_SCHEMAS = {
17864
17864
  }),
17865
17865
  admin_feedback_capability: jsonObject,
17866
17866
  admin_feedback_evidence: jsonObject,
17867
+ admin_feedback: jsonObject,
17867
17868
  admin_feedback_topic: jsonObject,
17868
17869
  admin_feedback_thread: jsonObject,
17869
17870
  admin_feedback_publish: jsonObject,
@@ -18770,6 +18771,7 @@ var MCP_TOOL_ANNOTATIONS = {
18770
18771
  feedback_status: readOnly,
18771
18772
  admin_feedback_capability: destructiveIdempotent,
18772
18773
  admin_feedback_evidence: destructive,
18774
+ admin_feedback: destructive,
18773
18775
  admin_feedback_topic: destructive,
18774
18776
  admin_feedback_thread: destructive,
18775
18777
  admin_feedback_publish: additive,
@@ -18938,6 +18940,49 @@ function dispatch(map2, reshape) {
18938
18940
  return ex.call(op, reshape && verb ? reshape(verb, rest) : rest);
18939
18941
  };
18940
18942
  }
18943
+ var ADMIN_FEEDBACK_VERBS = [
18944
+ "publish",
18945
+ "merge",
18946
+ "transition",
18947
+ "edit",
18948
+ "curate",
18949
+ "topic",
18950
+ "create",
18951
+ "update",
18952
+ "move",
18953
+ "archive",
18954
+ "restore"
18955
+ ];
18956
+ var ADMIN_FEEDBACK_THREAD_VERBS = new Set([
18957
+ "create",
18958
+ "update",
18959
+ "move",
18960
+ "transition",
18961
+ "archive",
18962
+ "restore",
18963
+ "merge"
18964
+ ]);
18965
+ var ADMIN_FEEDBACK_VERB_HELP = ADMIN_FEEDBACK_VERBS.join(" | ");
18966
+ function runAdminFeedback(ex, input) {
18967
+ const { verb, ...rest } = input;
18968
+ if (verb === "curate") {
18969
+ if (rest.curate === "delete")
18970
+ return ex.call("feedback_admin.remove", rest);
18971
+ if (rest.curate === "restore")
18972
+ return ex.call("feedback_admin.restore", rest);
18973
+ return Promise.reject(new Error('curate requires curate "delete" or "restore"'));
18974
+ }
18975
+ if (verb && ADMIN_FEEDBACK_THREAD_VERBS.has(verb)) {
18976
+ return ex.call("feedback_admin.thread", { ...rest, action: verb });
18977
+ }
18978
+ if (verb === "publish")
18979
+ return ex.call("feedback_admin.publish", rest);
18980
+ if (verb === "edit")
18981
+ return ex.call("feedback_admin.edit", rest);
18982
+ if (verb === "topic")
18983
+ return ex.call("feedback_admin.topic", rest);
18984
+ return Promise.reject(new Error(`unknown verb "${verb ?? ""}" — expected one of: ${ADMIN_FEEDBACK_VERB_HELP}`));
18985
+ }
18941
18986
  var NOTIFICATION_TRIAGE_DESCRIPTION = "READ ONLY: List your awareness feed newest first with unseen count and derived triage class: `settled-context` = settled Thread context; `owed-by-me` = an open request pointing to `inbox`; `judgment-available` = live engagement inviting judgment; `closed-loop` = your request completed; `room-motion` = ambient activity. Notifications are FYI, not a second obligation surface: `inbox` alone contains work owed by you; this cannot mark notifications read or modify inbox obligations.";
18942
18987
  var PAGINATION_INPUT = {
18943
18988
  limit: exports_external.number().int().min(1).optional().describe("max items to return — enables pagination"),
@@ -19129,6 +19174,36 @@ var ACTION_DEFINITIONS = [
19129
19174
  status: "feedback_admin.status"
19130
19175
  })
19131
19176
  },
19177
+ {
19178
+ name: "admin_feedback",
19179
+ title: "Moderate shared Arbor Feedback",
19180
+ description: "After a ship, recall matching Feedback, merge duplicates, publish the outcome, and transition the canonical Thread to resolved. Moderators only: this cannot file reports or expose receipt metadata.",
19181
+ inputSchema: {
19182
+ verb: exports_external.enum(ADMIN_FEEDBACK_VERBS).describe("close loop: publish, merge, transition; also edit, curate, topic, and thread lifecycle"),
19183
+ threadId: exports_external.string().optional().describe("publish / update / move / transition / archive / restore: Thread id"),
19184
+ type: exports_external.enum(CONTRIBUTION_TYPES).optional().describe("publish/edit: shared contribution type, including maintainer decision"),
19185
+ body: exports_external.string().min(1).optional().describe("publish: follow-on body · edit: replacement body"),
19186
+ summary: exports_external.string().max(500).nullable().optional().describe("publish/edit: gist; edit null/empty clears"),
19187
+ confidence: exports_external.number().int().min(0).max(100).optional().describe("publish: 0–100 confidence"),
19188
+ idempotencyKey: exports_external.string().min(1).max(200).optional().describe("publish: stable retry key"),
19189
+ feedbackId: exports_external.string().optional().describe("publish: optional receipt id; additionally requires review_private"),
19190
+ contributionId: exports_external.string().optional().describe("edit/curate: shared contribution id"),
19191
+ curate: exports_external.enum(["delete", "restore"]).optional().describe("curate: delete or restore a shared contribution"),
19192
+ action: exports_external.enum(["create", "update", "archive", "restore"]).optional().describe("topic: create, update, archive, or restore"),
19193
+ topicId: exports_external.string().optional().describe("topic / create / move / update: Feedback Topic id"),
19194
+ title: exports_external.string().min(1).optional().describe("topic/create/update: title"),
19195
+ purpose: exports_external.string().optional().describe("topic: purpose"),
19196
+ sourceThreadId: exports_external.string().optional().describe("merge: duplicate source Thread id"),
19197
+ targetThreadId: exports_external.string().optional().describe("merge: canonical destination Thread id"),
19198
+ objective: exports_external.string().min(1).optional().describe("create/update: Thread objective"),
19199
+ status: exports_external.enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).optional().describe("transition/update: target Thread status"),
19200
+ reason: exports_external.string().optional().describe("merge: concise auditable rationale")
19201
+ },
19202
+ surfaces: ["mcp"],
19203
+ toolset: "admin",
19204
+ requiresCapability: "moderate",
19205
+ run: runAdminFeedback
19206
+ },
19132
19207
  {
19133
19208
  name: "admin_feedback_topic",
19134
19209
  title: "Maintain shared Feedback Topics",
@@ -19139,7 +19214,7 @@ var ACTION_DEFINITIONS = [
19139
19214
  title: exports_external.string().min(1).optional().describe("create/update: Topic title"),
19140
19215
  purpose: exports_external.string().optional().describe("create/update: Topic purpose")
19141
19216
  },
19142
- surfaces: ["mcp", "cli"],
19217
+ surfaces: ["cli"],
19143
19218
  toolset: "admin",
19144
19219
  run: forward("feedback_admin.topic")
19145
19220
  },
@@ -19158,7 +19233,7 @@ var ACTION_DEFINITIONS = [
19158
19233
  status: exports_external.enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).optional().describe("transition/update: target Thread status"),
19159
19234
  reason: exports_external.string().optional().describe("merge: concise auditable rationale")
19160
19235
  },
19161
- surfaces: ["mcp", "cli"],
19236
+ surfaces: ["cli"],
19162
19237
  toolset: "admin",
19163
19238
  run: forward("feedback_admin.thread")
19164
19239
  },
@@ -19175,7 +19250,7 @@ var ACTION_DEFINITIONS = [
19175
19250
  idempotencyKey: exports_external.string().min(1).max(200).optional(),
19176
19251
  feedbackId: exports_external.string().optional().describe("optional receipt id; additionally requires review_private")
19177
19252
  },
19178
- surfaces: ["mcp", "cli"],
19253
+ surfaces: ["cli"],
19179
19254
  toolset: "admin",
19180
19255
  run: forward("feedback_admin.publish")
19181
19256
  },
@@ -19189,7 +19264,7 @@ var ACTION_DEFINITIONS = [
19189
19264
  summary: exports_external.string().max(500).nullable().optional().describe("replacement gist; null/empty clears"),
19190
19265
  type: exports_external.enum(CONTRIBUTION_TYPES).optional().describe("replacement shared contribution type")
19191
19266
  },
19192
- surfaces: ["mcp", "cli"],
19267
+ surfaces: ["cli"],
19193
19268
  toolset: "admin",
19194
19269
  run: forward("feedback_admin.edit")
19195
19270
  },
@@ -19201,7 +19276,7 @@ var ACTION_DEFINITIONS = [
19201
19276
  verb: exports_external.enum(["delete", "restore"]),
19202
19277
  contributionId: exports_external.string().describe("shared Feedback contribution id")
19203
19278
  },
19204
- surfaces: ["mcp", "cli"],
19279
+ surfaces: ["cli"],
19205
19280
  toolset: "admin",
19206
19281
  run: dispatch({ delete: "feedback_admin.remove", restore: "feedback_admin.restore" })
19207
19282
  },
@@ -21249,6 +21324,9 @@ var ACTION_DEFINITIONS = [
21249
21324
  }
21250
21325
  ];
21251
21326
  var ACTIONS = ACTION_DEFINITIONS.map((action) => {
21327
+ if (action.requiresCapability && !action.surfaces.includes("mcp")) {
21328
+ throw new Error(`${action.name}: requiresCapability is an MCP catalog gate`);
21329
+ }
21252
21330
  if (!action.surfaces.some((surface) => surface === "mcp" || surface === "computer-mcp")) {
21253
21331
  return action;
21254
21332
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.21.8",
3
+ "version": "0.21.9",
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",