@lambdacurry/arbor 0.22.36 → 0.22.38

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 +60 -10
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // package.json
3
3
  var package_default = {
4
4
  name: "@lambdacurry/arbor",
5
- version: "0.22.36",
5
+ version: "0.22.38",
6
6
  description: "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
7
7
  keywords: [
8
8
  "agents",
@@ -4933,6 +4933,41 @@ var CONTRIBUTION_TYPES = [
4933
4933
  "decision"
4934
4934
  ];
4935
4935
  var STAMP_FACETS = ["quality", "impact", "fit", "originality"];
4936
+ var ARTIFACT_TYPES = [
4937
+ "markdown",
4938
+ "concept",
4939
+ "decision",
4940
+ "research-brief",
4941
+ "summary",
4942
+ "plan",
4943
+ "json",
4944
+ "yaml",
4945
+ "schema",
4946
+ "table",
4947
+ "rubric",
4948
+ "profile-snapshot",
4949
+ "image",
4950
+ "diagram",
4951
+ "mockup",
4952
+ "canvas",
4953
+ "html-bundle",
4954
+ "dashboard",
4955
+ "prototype",
4956
+ "audio",
4957
+ "video",
4958
+ "transcript",
4959
+ "diff",
4960
+ "pr-reference",
4961
+ "script",
4962
+ "api-spec",
4963
+ "test-plan",
4964
+ "prompt",
4965
+ "tool-spec",
4966
+ "workflow",
4967
+ "routing-rule",
4968
+ "eval-rubric",
4969
+ "external-reference"
4970
+ ];
4936
4971
  // ../core/src/feedback/constants.ts
4937
4972
  var ARBOR_FEEDBACK_TYPES = [
4938
4973
  "comment",
@@ -8865,6 +8900,22 @@ var MCP_OUTPUT_SCHEMAS = {
8865
8900
  lineCount: number2().int().nonnegative(),
8866
8901
  byteLength: number2().int().nonnegative(),
8867
8902
  outline: array(object({ title: string2(), startLine: number2().int().min(1) })),
8903
+ sourceMetrics: _enum(["not-loaded-file", "file-text-projection"]).optional(),
8904
+ file: object({
8905
+ mimeType: string2().nullable(),
8906
+ editableSource: literal(false),
8907
+ textProjection: object({
8908
+ status: _enum(["available", "probe", "unavailable"]),
8909
+ reason: _enum([
8910
+ "trusted-text-mime",
8911
+ "unknown-mime",
8912
+ "validated-utf8",
8913
+ "unsupported-mime",
8914
+ "not-stored-blob"
8915
+ ]),
8916
+ nextAction: string2()
8917
+ })
8918
+ }).optional(),
8868
8919
  source: string2().optional(),
8869
8920
  startLine: number2().int().min(0).optional(),
8870
8921
  endLine: number2().int().min(0).optional(),
@@ -10162,6 +10213,7 @@ var TLDRAW_EXEC_OPERATIONS_SCHEMA = array(TLDRAW_EXEC_OPERATION_SCHEMA).min(1).m
10162
10213
  });
10163
10214
  }).describe("preferred declarative edits, applied in order; mutually exclusive with code");
10164
10215
  // ../actions/src/index.ts
10216
+ var ARTIFACT_TYPE_DESCRIPTION = `semantic type (one of: ${ARTIFACT_TYPES.join(", ")})`;
10165
10217
  var ARBOR_FEEDBACK_INPUT_TYPES = [...ARBOR_FEEDBACK_TYPES, "friction"];
10166
10218
  var CONTRIBUTION_ADD_LINK_RELS = [
10167
10219
  "cites",
@@ -10301,9 +10353,9 @@ var ARTIFACT_GET_INPUT = {
10301
10353
  startLine: number2().int().min(1).optional().describe("1-indexed source window start; omit with heading for a section window"),
10302
10354
  limit: number2().int().min(1).max(ARTIFACT_SOURCE_WINDOW_MAX).optional().describe(`source window size when startLine or heading is set (default ${ARTIFACT_SOURCE_WINDOW_DEFAULT}, max ${ARTIFACT_SOURCE_WINDOW_MAX}). This is not a list page size`),
10303
10355
  heading: string2().min(1).optional().describe("first ##/### title that matches exactly, else the first prefix match"),
10304
- all: boolean2().optional().describe("explicit complete source. Cannot combine with startLine, heading, or limit; prefer a window unless you need every line")
10356
+ all: boolean2().optional().describe("explicit complete editable source. File Artifacts stay bounded and require startLine + limit. Cannot combine with startLine, heading, or limit")
10305
10357
  };
10306
- var ARTIFACT_GET_DESCRIPTION = `Read an Artifact as a compact card (id, title, kind, version, lineCount, byteLength, ##/### outline with startLine) so a plan can be oriented without loading source; pass startLine+limit (default ${ARTIFACT_SOURCE_WINDOW_DEFAULT}, max ${ARTIFACT_SOURCE_WINDOW_MAX}) or heading (first ##/### exact or prefix) for a source window, or all=true/--all for the full source. Pass version for an older snapshot; this read cannot edit content, bind a surface, change lifecycle, or delete.`;
10358
+ var ARTIFACT_GET_DESCRIPTION = `Read an Artifact as a compact card without loading its body. Editable text Artifacts report source line/byte counts and ##/### outline; use startLine+limit (default ${ARTIFACT_SOURCE_WINDOW_DEFAULT}, max ${ARTIFACT_SOURCE_WINDOW_MAX}), heading, or explicit all=true/--all. File Artifacts remain files and non-editable: their card reports stored MIME, whether bounded UTF-8 text projection is available/probeable, and the next action. For text-like files use startLine+limit and continue with nextLine; all=true and heading stay unavailable for files. Binary/unsupported files remain valid and should be inspected through the Artifact URL/download/media surface. Pass version only for editable historical snapshots; this read cannot edit content, bind a surface, change lifecycle, or delete.`;
10307
10359
  var PAGINATION_INPUT = {
10308
10360
  limit: number2().int().min(1).optional().describe(`max items to return. MCP/CLI/API default to ${EXTERNAL_DEFAULT_PAGE_SIZE} and return nextCursor when more remain; pass all=true/--all for the complete list. In-process web omit is still a compatibility full read`),
10309
10361
  cursor: string2().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)"),
@@ -11318,7 +11370,7 @@ var ACTION_DEFINITIONS = [
11318
11370
  title: "Create an artifact",
11319
11371
  description: "Promote durable output — a decision, summary, plan, or research brief — into a first-class artifact you own. Give it a concise summary of what the Artifact is or accomplishes; this is the skim and retrieval description, not a repeat of its title. Text kinds (doc/table/diagram/html) are living documents: pass `source` (born at v1, editable in place via edit_artifact); kind=file passes a contentRef instead. The artifact is AUTOMATICALLY listed on its source thread (no link post needed). When it came from a Thread Computer, pass its producing computerSessionId when available so the artifact cites the reproducible session. Reach for this when a thread has produced something worth retaining and citing beyond the conversation — especially a table or doc the team will UPDATE, which beats pasting it into a prose contribution.",
11320
11372
  inputSchema: {
11321
- type: string2().describe("semantic type, e.g. decision|summary|plan|markdown|table|research-brief"),
11373
+ type: _enum(ARTIFACT_TYPES).describe(ARTIFACT_TYPE_DESCRIPTION),
11322
11374
  kind: _enum(["doc", "table", "diagram", "html", "file"]).optional().describe("structural kind (default file). doc/table/diagram/html are editable, versioned text"),
11323
11375
  title: string2().min(1),
11324
11376
  source: string2().optional().describe("text kinds: the initial content (v1)"),
@@ -12271,7 +12323,7 @@ var ACTION_DEFINITIONS = [
12271
12323
  verb: _enum(["create", "edit", "set_live_preview", "set_snapshot", "promote_attachment"]).describe("which artifact move"),
12272
12324
  title: string2().optional().describe("create: the artifact's title"),
12273
12325
  kind: _enum(["doc", "table", "diagram", "html", "file"]).optional().describe("create: structural kind (default file). doc/table/diagram/html are editable text"),
12274
- type: string2().optional().describe("create: semantic type, e.g. decision|summary|plan|markdown|table|research-brief"),
12326
+ type: _enum(ARTIFACT_TYPES).optional().describe(`create: ${ARTIFACT_TYPE_DESCRIPTION}`),
12275
12327
  source: string2().optional().describe("create (text kinds): the initial content · edit verb=replace: the full new content"),
12276
12328
  contentRef: string2().optional().describe("create (kind=file): where the content lives, e.g. inline://… or a URL"),
12277
12329
  editPolicy: _enum(["owner", "members", "anyone"]).optional().describe("create: who may edit (default members)"),
@@ -12973,6 +13025,7 @@ var ACTIONS = ACTION_DEFINITIONS.map((action) => {
12973
13025
  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");
12974
13026
  var retainSourceSchema = boolean2().optional().describe("edit: in checkpoint mode, retain this newly minted content revision's source");
12975
13027
  var checkpointSchema = boolean2().optional().describe("edit: retain the exact current version source without incrementing content version");
13028
+ var ARTIFACT_GET_PUBLIC_DESCRIPTION = "Read one Artifact as a compact card without loading its body; editable text supports its outline plus bounded startLine+limit or heading windows and explicit all=true; File Artifacts remain files and report whether bounded UTF-8 text projection is available. For text-like files use startLine+limit and nextLine; all=true and heading stay unavailable for files, binary/unsupported files use the Artifact URL/download/media surface, and editable historical reads retain exact artifactVersionId.";
12976
13029
  function artifactEditInput(input) {
12977
13030
  const patches = Array.isArray(input.patches);
12978
13031
  const hasSource = typeof input.source === "string";
@@ -13025,11 +13078,8 @@ function retentionAction(action) {
13025
13078
  run: (ex, input) => ex.call("artifact.edit", artifactEditInput(input))
13026
13079
  };
13027
13080
  }
13028
- if (action.name === "artifact_get") {
13029
- return {
13030
- ...action,
13031
- description: "Read one Artifact. Text responses project artifactVersionId for the exact version represented by the response, including --version historical reads, so the returned artv_ can be passed directly to computer_publish_app_bundle."
13032
- };
13081
+ if (action.name === "get_artifact" || action.name === "artifact_get") {
13082
+ return { ...action, description: ARTIFACT_GET_PUBLIC_DESCRIPTION };
13033
13083
  }
13034
13084
  if (action.name === "artifact") {
13035
13085
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.22.36",
3
+ "version": "0.22.38",
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",